mirror of
https://github.com/WarmUpTill/SceneSwitcher.git
synced 2026-09-07 09:05:57 -05:00
Compare commits
85 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
20488afdd1 | ||
|
|
d9d387ad47 | ||
|
|
0736d673e1 | ||
|
|
34151e4bc6 | ||
|
|
1346c19bec | ||
|
|
be6bc48231 | ||
|
|
79a8ad57af | ||
|
|
daeb9275a3 | ||
|
|
73b542a4db | ||
|
|
e3471066e9 | ||
|
|
ec41c06b4d | ||
|
|
201e45d058 | ||
|
|
b17aa30432 | ||
|
|
93703c80bc | ||
|
|
d7951a7179 | ||
|
|
d42a3b584a | ||
|
|
becd1bd02a | ||
|
|
30422aecf3 | ||
|
|
c567e6ef7f | ||
|
|
1ca61f3ed4 | ||
|
|
1affe9dce3 | ||
|
|
406e3c1855 | ||
|
|
c05dd40c4c | ||
|
|
9a86ecac42 | ||
|
|
721a786e79 | ||
|
|
32d29875ed | ||
|
|
0e5f56b562 | ||
|
|
5490fabf92 | ||
|
|
5e3ab19940 | ||
|
|
1c94a1ab44 | ||
|
|
34baa56134 | ||
|
|
5ce4171773 | ||
|
|
c281c6db83 | ||
|
|
c43439ee64 | ||
|
|
a84731b8fe | ||
|
|
61fbff5821 | ||
|
|
1381654fed | ||
|
|
9805601c07 | ||
|
|
fcf57ee031 | ||
|
|
ba3e87a761 | ||
|
|
3dd3f576c3 | ||
|
|
7403a18e96 | ||
|
|
56494480ba | ||
|
|
cdc5d16e95 | ||
|
|
27aed79305 | ||
|
|
7ec95e33eb | ||
|
|
98260b25a1 | ||
|
|
45b37de9f7 | ||
|
|
027a3e9074 | ||
|
|
cab50e0922 | ||
|
|
88514e209d | ||
|
|
4ed7f13b72 | ||
|
|
0fb11ac274 | ||
|
|
942933290a | ||
|
|
f13beaead2 | ||
|
|
13dba6527d | ||
|
|
b78a6510a9 | ||
|
|
6c22f438b6 | ||
|
|
347abe6c84 | ||
|
|
230863adda | ||
|
|
f59478fac7 | ||
|
|
8adac79cd8 | ||
|
|
ea93c44db7 | ||
|
|
9e20b341d8 | ||
|
|
232cbb06f6 | ||
|
|
e9d57a0f4a | ||
|
|
9633a61a65 | ||
|
|
0643b250e1 | ||
|
|
b52738881f | ||
|
|
470d5ba3d7 | ||
|
|
8326e72047 | ||
|
|
12ab4d8cf9 | ||
|
|
295ec9eb81 | ||
|
|
4c5dbd4b7c | ||
|
|
5568f92ad0 | ||
|
|
7c4c0056ce | ||
|
|
d2b4b1cc07 | ||
|
|
a3ca22d238 | ||
|
|
c73542a3cc | ||
|
|
70bbc7cdac | ||
|
|
d892298995 | ||
|
|
0fe31432be | ||
|
|
aaa0113ccb | ||
|
|
b908954b46 | ||
|
|
b0eede8a85 |
2
.github/ISSUE_TEMPLATE/feature_request.yaml
vendored
2
.github/ISSUE_TEMPLATE/feature_request.yaml
vendored
@@ -2,7 +2,7 @@
|
|||||||
# https://github.com/obsproject/.github/tree/master/.github/ISSUE_TEMPLATE
|
# https://github.com/obsproject/.github/tree/master/.github/ISSUE_TEMPLATE
|
||||||
|
|
||||||
name: Feature request
|
name: Feature request
|
||||||
description: Suggest an idea for this projectReport a bug or crash
|
description: Suggest an idea for this project
|
||||||
body:
|
body:
|
||||||
- type: markdown
|
- type: markdown
|
||||||
id: md_welcome
|
id: md_welcome
|
||||||
|
|||||||
2
.github/scripts/.Aptfile
vendored
2
.github/scripts/.Aptfile
vendored
@@ -11,3 +11,5 @@ package 'libopencv-dev'
|
|||||||
package 'libtesseract-dev'
|
package 'libtesseract-dev'
|
||||||
package 'libproc2-dev'
|
package 'libproc2-dev'
|
||||||
package 'libusb-1.0-0-dev'
|
package 'libusb-1.0-0-dev'
|
||||||
|
package 'libpaho-mqttpp-dev'
|
||||||
|
package 'libpaho-mqtt-dev'
|
||||||
27
.github/scripts/.build-deps.zsh
vendored
27
.github/scripts/.build-deps.zsh
vendored
@@ -478,6 +478,33 @@ Usage: %B${functrace[1]%:*}%b <option> [<options>]
|
|||||||
unset MACOSX_DEPLOYMENT_TARGET
|
unset MACOSX_DEPLOYMENT_TARGET
|
||||||
|
|
||||||
popd
|
popd
|
||||||
|
|
||||||
|
local mqtt_dir="${project_root}/deps/paho.mqtt.cpp"
|
||||||
|
local mqtt_build_dir="${mqtt_dir}/build_${target##*-}"
|
||||||
|
|
||||||
|
local -a mqtt_cmake_args=(
|
||||||
|
-DCMAKE_BUILD_TYPE=Release
|
||||||
|
-DCMAKE_OSX_ARCHITECTURES=${${target##*-}//universal/x86_64;arm64}
|
||||||
|
-DCMAKE_OSX_DEPLOYMENT_TARGET=${DEPLOYMENT_TARGET:-10.15}
|
||||||
|
-DCMAKE_PREFIX_PATH="${advss_dep_path};${_plugin_deps}"
|
||||||
|
-DCMAKE_INSTALL_PREFIX="${advss_dep_path}"
|
||||||
|
-DPAHO_BUILD_SHARED=OFF
|
||||||
|
-DPAHO_BUILD_STATIC=ON
|
||||||
|
-DPAHO_WITH_MQTT_C=ON
|
||||||
|
-DOPENSSL_ROOT_DIR="${advss_dep_path}"
|
||||||
|
-DPAHO_WITH_SSL=OFF # TODO: figure out linking issues with openssl
|
||||||
|
)
|
||||||
|
|
||||||
|
pushd ${mqtt_dir}
|
||||||
|
log_info "Configure paho.mqtt.cpp ..."
|
||||||
|
cmake -S . -B ${mqtt_build_dir} ${mqtt_cmake_args}
|
||||||
|
|
||||||
|
log_info "Building paho.mqtt.cpp ..."
|
||||||
|
cmake --build ${mqtt_build_dir} --config Release
|
||||||
|
|
||||||
|
log_info "Installing paho.mqtt.cpp ..."
|
||||||
|
cmake --install ${mqtt_build_dir} --prefix "${advss_dep_path}" --config Release
|
||||||
|
popd
|
||||||
;;
|
;;
|
||||||
linux)
|
linux)
|
||||||
# Nothing to do for now
|
# Nothing to do for now
|
||||||
|
|||||||
31
.github/scripts/Build-Deps-Windows.ps1
vendored
31
.github/scripts/Build-Deps-Windows.ps1
vendored
@@ -219,6 +219,37 @@ function Build {
|
|||||||
} else {
|
} else {
|
||||||
Log-Information "Failed to locate msbuild.exe - skipping libusb build"
|
Log-Information "Failed to locate msbuild.exe - skipping libusb build"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Push-Location -Stack BuildMqttTemp
|
||||||
|
Ensure-Location $ProjectRoot
|
||||||
|
|
||||||
|
$MqttPath = "${ProjectRoot}/deps/paho.mqtt.cpp"
|
||||||
|
$MqttBuildPath = "${MqttPath}/build"
|
||||||
|
|
||||||
|
# Explicitly disable PkgConfig and tiff as it will lead build errors
|
||||||
|
$MqttCmakeArgs = @(
|
||||||
|
"-DCMAKE_BUILD_TYPE=${Configuration}"
|
||||||
|
"-DCMAKE_PREFIX_PATH:PATH=${OBSDepPath}"
|
||||||
|
"-DCMAKE_INSTALL_PREFIX:PATH=${ADVSSDepPath}"
|
||||||
|
"-DPAHO_WITH_MQTT_C=ON"
|
||||||
|
)
|
||||||
|
|
||||||
|
Log-Information "Configuring paho.mqtt.cpp..."
|
||||||
|
Invoke-External cmake -S ${MqttPath} -B ${MqttBuildPath} @MqttCmakeArgs
|
||||||
|
|
||||||
|
$MqttCmakeArgs = @(
|
||||||
|
'--config', "${Configuration}"
|
||||||
|
)
|
||||||
|
|
||||||
|
if ( $VerbosePreference -eq 'Continue' ) {
|
||||||
|
$MqttCmakeArgs += ('--verbose')
|
||||||
|
}
|
||||||
|
|
||||||
|
Log-Information "Building paho.mqtt.cpp..."
|
||||||
|
Invoke-External cmake --build "${MqttBuildPath}" @MqttCmakeArgs
|
||||||
|
|
||||||
|
Log-Information "Install paho.mqtt.cpp..."
|
||||||
|
Invoke-External cmake --install "${MqttBuildPath}" --prefix "${ADVSSDepPath}" @MqttCmakeArgs
|
||||||
}
|
}
|
||||||
|
|
||||||
Build
|
Build
|
||||||
|
|||||||
5
.github/workflows/build-project.yaml
vendored
5
.github/workflows/build-project.yaml
vendored
@@ -210,6 +210,11 @@ jobs:
|
|||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-ccache-x86_64-
|
${{ runner.os }}-ccache-x86_64-
|
||||||
|
|
||||||
|
- name: Set up CMake 🏗️
|
||||||
|
uses: jwlawson/actions-setup-cmake@v1.13
|
||||||
|
with:
|
||||||
|
cmake-version: '3.24.x'
|
||||||
|
|
||||||
- name: Set up Homebrew 🍺
|
- name: Set up Homebrew 🍺
|
||||||
uses: Homebrew/actions/setup-homebrew@master
|
uses: Homebrew/actions/setup-homebrew@master
|
||||||
|
|
||||||
|
|||||||
9
.gitmodules
vendored
9
.gitmodules
vendored
@@ -28,3 +28,12 @@
|
|||||||
[submodule "deps/libusb"]
|
[submodule "deps/libusb"]
|
||||||
path = deps/libusb
|
path = deps/libusb
|
||||||
url = https://github.com/libusb/libusb.git
|
url = https://github.com/libusb/libusb.git
|
||||||
|
[submodule "deps/date"]
|
||||||
|
path = deps/date
|
||||||
|
url = https://github.com/HowardHinnant/date.git
|
||||||
|
[submodule "deps/jsoncons"]
|
||||||
|
path = deps/jsoncons
|
||||||
|
url = https://github.com/danielaparker/jsoncons.git
|
||||||
|
[submodule "deps/paho.mqtt.cpp"]
|
||||||
|
path = deps/paho.mqtt.cpp
|
||||||
|
url = https://github.com/eclipse-paho/paho.mqtt.cpp.git
|
||||||
|
|||||||
@@ -103,8 +103,6 @@ target_sources(
|
|||||||
lib/macro/macro-action-macro.hpp
|
lib/macro/macro-action-macro.hpp
|
||||||
lib/macro/macro-action-queue.cpp
|
lib/macro/macro-action-queue.cpp
|
||||||
lib/macro/macro-action-queue.hpp
|
lib/macro/macro-action-queue.hpp
|
||||||
lib/macro/macro-action-script.cpp
|
|
||||||
lib/macro/macro-action-script.hpp
|
|
||||||
lib/macro/macro-action-variable.cpp
|
lib/macro/macro-action-variable.cpp
|
||||||
lib/macro/macro-action-variable.hpp
|
lib/macro/macro-action-variable.hpp
|
||||||
lib/macro/macro-action.cpp
|
lib/macro/macro-action.cpp
|
||||||
@@ -117,8 +115,6 @@ target_sources(
|
|||||||
lib/macro/macro-condition-macro.hpp
|
lib/macro/macro-condition-macro.hpp
|
||||||
lib/macro/macro-condition-queue.cpp
|
lib/macro/macro-condition-queue.cpp
|
||||||
lib/macro/macro-condition-queue.hpp
|
lib/macro/macro-condition-queue.hpp
|
||||||
lib/macro/macro-condition-script.cpp
|
|
||||||
lib/macro/macro-condition-script.hpp
|
|
||||||
lib/macro/macro-condition-tempvar.cpp
|
lib/macro/macro-condition-tempvar.cpp
|
||||||
lib/macro/macro-condition-tempvar.hpp
|
lib/macro/macro-condition-tempvar.hpp
|
||||||
lib/macro/macro-condition-variable.cpp
|
lib/macro/macro-condition-variable.cpp
|
||||||
@@ -139,14 +135,10 @@ target_sources(
|
|||||||
lib/macro/macro-ref.hpp
|
lib/macro/macro-ref.hpp
|
||||||
lib/macro/macro-run-button.cpp
|
lib/macro/macro-run-button.cpp
|
||||||
lib/macro/macro-run-button.hpp
|
lib/macro/macro-run-button.hpp
|
||||||
lib/macro/macro-script-handler.cpp
|
|
||||||
lib/macro/macro-script-handler.hpp
|
|
||||||
lib/macro/macro-segment-copy-paste.cpp
|
lib/macro/macro-segment-copy-paste.cpp
|
||||||
lib/macro/macro-segment-copy-paste.hpp
|
lib/macro/macro-segment-copy-paste.hpp
|
||||||
lib/macro/macro-segment-list.cpp
|
lib/macro/macro-segment-list.cpp
|
||||||
lib/macro/macro-segment-list.hpp
|
lib/macro/macro-segment-list.hpp
|
||||||
lib/macro/macro-segment-script.cpp
|
|
||||||
lib/macro/macro-segment-script.hpp
|
|
||||||
lib/macro/macro-segment-selection.cpp
|
lib/macro/macro-segment-selection.cpp
|
||||||
lib/macro/macro-segment-selection.hpp
|
lib/macro/macro-segment-selection.hpp
|
||||||
lib/macro/macro-segment.cpp
|
lib/macro/macro-segment.cpp
|
||||||
@@ -195,6 +187,8 @@ target_sources(
|
|||||||
lib/utils/help-icon.cpp
|
lib/utils/help-icon.cpp
|
||||||
lib/utils/item-selection-helpers.cpp
|
lib/utils/item-selection-helpers.cpp
|
||||||
lib/utils/item-selection-helpers.hpp
|
lib/utils/item-selection-helpers.hpp
|
||||||
|
lib/utils/json-helpers.cpp
|
||||||
|
lib/utils/json-helpers.hpp
|
||||||
lib/utils/layout-helpers.cpp
|
lib/utils/layout-helpers.cpp
|
||||||
lib/utils/layout-helpers.hpp
|
lib/utils/layout-helpers.hpp
|
||||||
lib/utils/list-controls.cpp
|
lib/utils/list-controls.cpp
|
||||||
@@ -221,17 +215,12 @@ target_sources(
|
|||||||
lib/utils/plugin-state-helpers.hpp
|
lib/utils/plugin-state-helpers.hpp
|
||||||
lib/utils/priority-helper.cpp
|
lib/utils/priority-helper.cpp
|
||||||
lib/utils/priority-helper.hpp
|
lib/utils/priority-helper.hpp
|
||||||
lib/utils/properties-view.cpp
|
|
||||||
lib/utils/properties-view.hpp
|
|
||||||
lib/utils/properties-view.moc.hpp
|
|
||||||
lib/utils/regex-config.cpp
|
lib/utils/regex-config.cpp
|
||||||
lib/utils/regex-config.hpp
|
lib/utils/regex-config.hpp
|
||||||
lib/utils/resizing-text-edit.cpp
|
lib/utils/resizing-text-edit.cpp
|
||||||
lib/utils/resizing-text-edit.hpp
|
lib/utils/resizing-text-edit.hpp
|
||||||
lib/utils/resource-table.cpp
|
lib/utils/resource-table.cpp
|
||||||
lib/utils/resource-table.hpp
|
lib/utils/resource-table.hpp
|
||||||
lib/utils/resource-table-hotkey-handler.cpp
|
|
||||||
lib/utils/resource-table-hotkey-handler.hpp
|
|
||||||
lib/utils/scene-selection.cpp
|
lib/utils/scene-selection.cpp
|
||||||
lib/utils/scene-selection.hpp
|
lib/utils/scene-selection.hpp
|
||||||
lib/utils/scene-switch-helpers.cpp
|
lib/utils/scene-switch-helpers.cpp
|
||||||
@@ -358,6 +347,21 @@ else()
|
|||||||
endif()
|
endif()
|
||||||
target_link_libraries(${LIB_NAME} PUBLIC nlohmann_json::nlohmann_json)
|
target_link_libraries(${LIB_NAME} PUBLIC nlohmann_json::nlohmann_json)
|
||||||
|
|
||||||
|
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/deps/jsoncons/CMakeLists.txt")
|
||||||
|
# Don't build jsoncons unit tests as they are causing compilation issues and
|
||||||
|
# won't be executed either way
|
||||||
|
if(OS_MACOS)
|
||||||
|
cmake_policy(SET CMP0077 NEW)
|
||||||
|
endif()
|
||||||
|
set(JSONCONS_BUILD_TESTS
|
||||||
|
OFF
|
||||||
|
CACHE BOOL "" FORCE)
|
||||||
|
|
||||||
|
add_subdirectory(deps/jsoncons EXCLUDE_FROM_ALL)
|
||||||
|
target_link_libraries(${LIB_NAME} PRIVATE jsoncons)
|
||||||
|
target_compile_definitions(${LIB_NAME} PRIVATE JSONPATH_SUPPORT=1)
|
||||||
|
endif()
|
||||||
|
|
||||||
find_package(CURL QUIET)
|
find_package(CURL QUIET)
|
||||||
find_package(Libcurl QUIET)
|
find_package(Libcurl QUIET)
|
||||||
if(CURL_FOUND)
|
if(CURL_FOUND)
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ The **Snap** package manager offers an OBS Studio installation which is bundled
|
|||||||
sudo snap install obs-studio
|
sudo snap install obs-studio
|
||||||
```
|
```
|
||||||
|
|
||||||
|
More information can be found [here](https://github.com/WarmUpTill/SceneSwitcher/wiki/Installation).
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
- If you wish to contribute code to the project, have a look at this [section](BUILDING.md) describing how to compile the plugin.
|
- If you wish to contribute code to the project, have a look at this [section](BUILDING.md) describing how to compile the plugin.
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ AdvSceneSwitcher.generalTab.generalBehavior.onNoMatch.switchToRandom="Wechsle zu
|
|||||||
AdvSceneSwitcher.generalTab.generalBehavior.onNoMatch.switchTo="Wechsle zu:"
|
AdvSceneSwitcher.generalTab.generalBehavior.onNoMatch.switchTo="Wechsle zu:"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.cooldown="Nach Ausführen von Aktionen überspringe das Ausführen von Aktionen für"
|
AdvSceneSwitcher.generalTab.generalBehavior.cooldown="Nach Ausführen von Aktionen überspringe das Ausführen von Aktionen für"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.cooldownHint="In diesem Zeitraum werden potentielle erfüllte Bedingungen ignoriert!"
|
AdvSceneSwitcher.generalTab.generalBehavior.cooldownHint="In diesem Zeitraum werden potentielle erfüllte Bedingungen ignoriert!"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.verboseLogging="Ausführliches Logging"
|
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.saveWindowGeo="Fensterposition und -größe speichern"
|
AdvSceneSwitcher.generalTab.generalBehavior.saveWindowGeo="Fensterposition und -größe speichern"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.showTrayNotifications="Benachrichtigungen im System-Tray anzeigen"
|
AdvSceneSwitcher.generalTab.generalBehavior.showTrayNotifications="Benachrichtigungen im System-Tray anzeigen"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="Deaktiviere UI Tipps"
|
AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="Deaktiviere UI Tipps"
|
||||||
@@ -41,7 +40,7 @@ AdvSceneSwitcher.generalTab.saveOrLoadsettings.export="Exportieren"
|
|||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.import="Importieren"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.import="Importieren"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportWindowTitle="Exportiere Erweiterter Automatischer Szenenwechsler Einstellungen zu Datei ..."
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportWindowTitle="Exportiere Erweiterter Automatischer Szenenwechsler Einstellungen zu Datei ..."
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.importWindowTitle="Exportiere Erweiterter Automatischer Szenenwechsler Einstellungen von Datei ..."
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.importWindowTitle="Exportiere Erweiterter Automatischer Szenenwechsler Einstellungen von Datei ..."
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.textType="Text Dateien (*.txt)"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.textType="Text Dateien (*.txt *.json)"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadFail="Importieren der Einstellungen ist fehlgeschlagen"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadFail="Importieren der Einstellungen ist fehlgeschlagen"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadSuccess="Einstellungen wurden erfolgreich importiert"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadSuccess="Einstellungen wurden erfolgreich importiert"
|
||||||
AdvSceneSwitcher.generalTab.priority.fileContent="Datei Inhalt"
|
AdvSceneSwitcher.generalTab.priority.fileContent="Datei Inhalt"
|
||||||
@@ -195,12 +194,12 @@ AdvSceneSwitcher.condition.video.modelLoadFail="Modelldaten konnten nicht gelade
|
|||||||
AdvSceneSwitcher.condition.video.type.main="OBS's Haupt-Ausgabe"
|
AdvSceneSwitcher.condition.video.type.main="OBS's Haupt-Ausgabe"
|
||||||
AdvSceneSwitcher.condition.video.type.source="Quelle"
|
AdvSceneSwitcher.condition.video.type.source="Quelle"
|
||||||
AdvSceneSwitcher.condition.video.type.scene="Szene"
|
AdvSceneSwitcher.condition.video.type.scene="Szene"
|
||||||
AdvSceneSwitcher.condition.video.entry="{{videoInputTypes}}{{sources}}{{scenes}}{{condition}}{{imagePath}}"
|
AdvSceneSwitcher.condition.video.layout="{{videoInputTypes}}{{sources}}{{scenes}}{{condition}}{{imagePath}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.modelPath="Modelldaten (Haar-Kaskaden-Klassifikator): {{modelDataPath}}"
|
AdvSceneSwitcher.condition.video.layout.modelPath="Modelldaten (Haar-Kaskaden-Klassifikator): {{modelDataPath}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.minNeighbor="Minimale Anzahl von Nachbarn: {{minNeighbors}}"
|
AdvSceneSwitcher.condition.video.layout.minNeighbor="Minimale Anzahl von Nachbarn: {{minNeighbors}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.throttle="{{throttleEnable}}Reduzieren Sie die CPU-Belastung, indem Sie die Prüfung nur alle {{throttleCount}} Millisekunden"
|
AdvSceneSwitcher.condition.video.layout.throttle="{{throttleEnable}}Reduzieren Sie die CPU-Belastung, indem Sie die Prüfung nur alle {{throttleCount}} Millisekunden"
|
||||||
AdvSceneSwitcher.condition.video.entry.checkAreaEnable="Kontrolle nur im Bereich durchführen"
|
AdvSceneSwitcher.condition.video.layout.checkAreaEnable="Kontrolle nur im Bereich durchführen"
|
||||||
AdvSceneSwitcher.condition.video.entry.checkArea="{{checkAreaEnable}}{{checkArea}}{{selectArea}}"
|
AdvSceneSwitcher.condition.video.layout.checkArea="{{checkAreaEnable}}{{checkArea}}{{selectArea}}"
|
||||||
AdvSceneSwitcher.condition.video.minSize="Minimale Größe:"
|
AdvSceneSwitcher.condition.video.minSize="Minimale Größe:"
|
||||||
AdvSceneSwitcher.condition.video.maxSize="Maximale Größe:"
|
AdvSceneSwitcher.condition.video.maxSize="Maximale Größe:"
|
||||||
AdvSceneSwitcher.condition.video.selectArea="Bereich auswählen"
|
AdvSceneSwitcher.condition.video.selectArea="Bereich auswählen"
|
||||||
@@ -753,9 +752,9 @@ AdvSceneSwitcher.hotkey.startStopToggleSwitcherHotkey="Starte/Stoppe den Erweite
|
|||||||
AdvSceneSwitcher.hotkey.macro.pause="Pausiere Makro %1"
|
AdvSceneSwitcher.hotkey.macro.pause="Pausiere Makro %1"
|
||||||
AdvSceneSwitcher.hotkey.macro.unpause="Makro %1 nicht mehr pausieren"
|
AdvSceneSwitcher.hotkey.macro.unpause="Makro %1 nicht mehr pausieren"
|
||||||
AdvSceneSwitcher.hotkey.macro.togglePause="Pause von Makro %1 togglen"
|
AdvSceneSwitcher.hotkey.macro.togglePause="Pause von Makro %1 togglen"
|
||||||
AdvSceneSwitcher.hotkey.upMacroSegmentHotkey="Makro-Segmentauswahl nach oben verschieben"
|
AdvSceneSwitcher.hotkey.macro.segment.up="Makro-Segmentauswahl nach oben verschieben"
|
||||||
AdvSceneSwitcher.hotkey.downMacroSegmentHotkey="Makro-Segmentauswahl nach unten verschieben"
|
AdvSceneSwitcher.hotkey.macro.segment.down="Makro-Segmentauswahl nach unten verschieben"
|
||||||
AdvSceneSwitcher.hotkey.removeMacroSegmentHotkey="Ausgewähltes Makro-Segment entfernen"
|
AdvSceneSwitcher.hotkey.macro.segment.remove="Ausgewähltes Makro-Segment entfernen"
|
||||||
|
|
||||||
AdvSceneSwitcher.askBackup="Neue Version des Erweiterten Automatischen Szenenwechslers wurde erkannt.\nSoll ein Backup der alten Einstellungen angelegt werden?"
|
AdvSceneSwitcher.askBackup="Neue Version des Erweiterten Automatischen Szenenwechslers wurde erkannt.\nSoll ein Backup der alten Einstellungen angelegt werden?"
|
||||||
AdvSceneSwitcher.askForMacro="Makro auswählen {{macroSelection}}"
|
AdvSceneSwitcher.askForMacro="Makro auswählen {{macroSelection}}"
|
||||||
|
|||||||
@@ -29,11 +29,11 @@ AdvSceneSwitcher.generalTab.generalBehavior.onNoMatch.switchTo="Switch to:"
|
|||||||
AdvSceneSwitcher.generalTab.generalBehavior.cooldown="After performing actions skip performing actions for"
|
AdvSceneSwitcher.generalTab.generalBehavior.cooldown="After performing actions skip performing actions for"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.cooldownHint="During this time potential matches will be ignored!"
|
AdvSceneSwitcher.generalTab.generalBehavior.cooldownHint="During this time potential matches will be ignored!"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.logLevel="Log level:"
|
AdvSceneSwitcher.generalTab.generalBehavior.logLevel="Log level:"
|
||||||
|
AdvSceneSwitcher.generalTab.generalBehavior.logLevel.disable="Disable logging"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.logLevel.default="Default"
|
AdvSceneSwitcher.generalTab.generalBehavior.logLevel.default="Default"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.logLevel.logMacro="Log executed macros"
|
AdvSceneSwitcher.generalTab.generalBehavior.logLevel.logMacro="Log executed macros"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.logLevel.logAction="Log performed actions"
|
AdvSceneSwitcher.generalTab.generalBehavior.logLevel.logAction="Log performed actions"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.logLevel.verbose="Verbose logging"
|
AdvSceneSwitcher.generalTab.generalBehavior.logLevel.verbose="Verbose logging"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.verboseLogging="Enable verbose logging"
|
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.saveWindowGeo="Save window position and size"
|
AdvSceneSwitcher.generalTab.generalBehavior.saveWindowGeo="Save window position and size"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.showTrayNotifications="Show system tray notifications"
|
AdvSceneSwitcher.generalTab.generalBehavior.showTrayNotifications="Show system tray notifications"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="Disable UI hints"
|
AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="Disable UI hints"
|
||||||
@@ -42,6 +42,7 @@ AdvSceneSwitcher.generalTab.generalBehavior.warnPluginLoadFailure="Display warni
|
|||||||
AdvSceneSwitcher.generalTab.generalBehavior.warnPluginLoadFailureMessage="<html><body>Loading of the following plugin libraries was unsuccessful, which could result in some Advanced Scene Switcher functions not being available:%1Check the OBS logs for details.<br>This message can be disabled on the General tab.</body></html>"
|
AdvSceneSwitcher.generalTab.generalBehavior.warnPluginLoadFailureMessage="<html><body>Loading of the following plugin libraries was unsuccessful, which could result in some Advanced Scene Switcher functions not being available:%1Check the OBS logs for details.<br>This message can be disabled on the General tab.</body></html>"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.warnCorruptedInstallMessage="The plugin installation seems to be corrupted and might crash!\nPlease make sure the plugin was installed correctly!"
|
AdvSceneSwitcher.generalTab.generalBehavior.warnCorruptedInstallMessage="The plugin installation seems to be corrupted and might crash!\nPlease make sure the plugin was installed correctly!"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.hideLegacyTabs="Hide tabs which can be represented via macros"
|
AdvSceneSwitcher.generalTab.generalBehavior.hideLegacyTabs="Hide tabs which can be represented via macros"
|
||||||
|
AdvSceneSwitcher.generalTab.generalBehavior.disableMacroWidgetCache="Disable macro widget caching"
|
||||||
AdvSceneSwitcher.generalTab.matchBehavior="Match behavior"
|
AdvSceneSwitcher.generalTab.matchBehavior="Match behavior"
|
||||||
AdvSceneSwitcher.generalTab.priority="Priority"
|
AdvSceneSwitcher.generalTab.priority="Priority"
|
||||||
AdvSceneSwitcher.generalTab.priority.description="Switching methods priority (Highest priority is at the top)"
|
AdvSceneSwitcher.generalTab.priority.description="Switching methods priority (Highest priority is at the top)"
|
||||||
@@ -52,7 +53,7 @@ AdvSceneSwitcher.generalTab.saveOrLoadsettings.export="Export"
|
|||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.import="Import"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.import="Import"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportWindowTitle="Export Advanced Scene Switcher settings to file ..."
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportWindowTitle="Export Advanced Scene Switcher settings to file ..."
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.importWindowTitle="Import Advanced Scene Switcher settings from file ..."
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.importWindowTitle="Import Advanced Scene Switcher settings from file ..."
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.textType="Text files (*.txt)"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.textType="Text files (*.txt);;JSON files (*.json)"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadFail="Advanced Scene Switcher failed to import settings"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadFail="Advanced Scene Switcher failed to import settings"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadSuccess="Advanced Scene Switcher settings imported successfully"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadSuccess="Advanced Scene Switcher settings imported successfully"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportSensitiveDataWarning="Warning:\nThe exported data might contain sensitive information!"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportSensitiveDataWarning="Warning:\nThe exported data might contain sensitive information!"
|
||||||
@@ -132,6 +133,18 @@ AdvSceneSwitcher.twitchConnectionTab.no="No"
|
|||||||
AdvSceneSwitcher.twitchConnectionTab.removeSingleConnectionPopup.text="Are you sure you want to remove \"%1\"?"
|
AdvSceneSwitcher.twitchConnectionTab.removeSingleConnectionPopup.text="Are you sure you want to remove \"%1\"?"
|
||||||
AdvSceneSwitcher.twitchConnectionTab.removeMultipleConnectionsPopup.text="Are you sure you want to remove %1 Twitch connections?"
|
AdvSceneSwitcher.twitchConnectionTab.removeMultipleConnectionsPopup.text="Are you sure you want to remove %1 Twitch connections?"
|
||||||
|
|
||||||
|
# MQTT Connections Tab
|
||||||
|
AdvSceneSwitcher.mqttConnectionTab.title="MQTT Connections"
|
||||||
|
AdvSceneSwitcher.mqttConnectionTab.help="MQTT connections can be used to communicate with other devices.\n\nClick on the highlighted plus symbol to add a new connection."
|
||||||
|
AdvSceneSwitcher.mqttConnectionTab.mqttonnectionAddButton.tooltip="Add new MQTT connection"
|
||||||
|
AdvSceneSwitcher.mqttConnectionTab.mqttConnectionRemoveButton.tooltip="Remove selected MQTT connections"
|
||||||
|
AdvSceneSwitcher.mqttConnectionTab.name.header="Name"
|
||||||
|
AdvSceneSwitcher.mqttConnectionTab.address.header="Address"
|
||||||
|
AdvSceneSwitcher.mqttConnectionTab.topics.header="Topic subscription count"
|
||||||
|
AdvSceneSwitcher.mqttConnectionTab.status.header="Status"
|
||||||
|
AdvSceneSwitcher.mqttConnectionTab.removeSingleConnectionPopup.text="Are you sure you want to remove \"%1\"?"
|
||||||
|
AdvSceneSwitcher.mqttConnectionTab.removeMultipleConnectionsPopup.text="Are you sure you want to remove %1 connections?"
|
||||||
|
|
||||||
# Macro Tab
|
# Macro Tab
|
||||||
AdvSceneSwitcher.macroTab.title="Macro"
|
AdvSceneSwitcher.macroTab.title="Macro"
|
||||||
AdvSceneSwitcher.macroTab.macros="Macros"
|
AdvSceneSwitcher.macroTab.macros="Macros"
|
||||||
@@ -199,8 +212,11 @@ AdvSceneSwitcher.macroTab.highlightTrueConditions="Highlight conditions of curre
|
|||||||
AdvSceneSwitcher.macroTab.highlightPerformedActions="Highlight recently performed actions of currently selected macro"
|
AdvSceneSwitcher.macroTab.highlightPerformedActions="Highlight recently performed actions of currently selected macro"
|
||||||
AdvSceneSwitcher.macroTab.newMacroRegisterHotkey="Register hotkeys to control the pause state of new macros"
|
AdvSceneSwitcher.macroTab.newMacroRegisterHotkey="Register hotkeys to control the pause state of new macros"
|
||||||
AdvSceneSwitcher.macroTab.newMacroUseShortCircuitEvaluation="Enable short circuit evaluation of macro conditions for new macros"
|
AdvSceneSwitcher.macroTab.newMacroUseShortCircuitEvaluation="Enable short circuit evaluation of macro conditions for new macros"
|
||||||
AdvSceneSwitcher.macroTab.saveSettingsOnMacroChange="Save settings when selecting a new macro"
|
AdvSceneSwitcher.macroTab.newMacroCheckInParallel="Evaluate conditions of new macros in parallel to other macros"
|
||||||
|
AdvSceneSwitcher.macroTab.checkInParallel.tooltip="If this option is not enabled, this macro's conditions will be evaluated after the preceeding macro's condition check has completed.\nSo, if there are three macros - Macro A, Macro B, and Macro C - in the macro list the order the conditions in are evaluated is:\n • Macro A's conditions\n • Macro B's conditions\n • Macro C's conditions\nIf this option is enabled, the order might differ.\nEnabling this option can be useful for scenarios in which you have multiple long running condition checks, which you don't want to result in \"blocking\" other macros."
|
||||||
|
AdvSceneSwitcher.macroTab.saveSettingsOnMacroChange="Save settings when switching between macros"
|
||||||
AdvSceneSwitcher.macroTab.saveSettingsOnMacroChange.tooltip="Saving the settings can be an expensive operation if you are working with a very large scene collection.\nIn this case, it might make sense to disable this option."
|
AdvSceneSwitcher.macroTab.saveSettingsOnMacroChange.tooltip="Saving the settings can be an expensive operation if you are working with a very large scene collection.\nIn this case, it might make sense to disable this option."
|
||||||
|
AdvSceneSwitcher.macroTab.currentCheckInParallel="Evaluate conditions of selected macro in parallel to other macros (Experimental)"
|
||||||
AdvSceneSwitcher.macroTab.currentRegisterHotkeys="Register hotkeys to control the pause state of selected macro"
|
AdvSceneSwitcher.macroTab.currentRegisterHotkeys="Register hotkeys to control the pause state of selected macro"
|
||||||
AdvSceneSwitcher.macroTab.currentUseShortCircuitEvaluation="Enable short circuit evaluation of macro conditions for currently selected macro"
|
AdvSceneSwitcher.macroTab.currentUseShortCircuitEvaluation="Enable short circuit evaluation of macro conditions for currently selected macro"
|
||||||
AdvSceneSwitcher.macroTab.shortCircuit.tooltip="Enabling short circuit evaluation might improve the performance, as some condition checks are skipped, if the overall macro cannot be evaluated to \"true\" anymore.\nHowever, please note that condition checks, which are skipped over, will also not update their duration modifier checks."
|
AdvSceneSwitcher.macroTab.shortCircuit.tooltip="Enabling short circuit evaluation might improve the performance, as some condition checks are skipped, if the overall macro cannot be evaluated to \"true\" anymore.\nHowever, please note that condition checks, which are skipped over, will also not update their duration modifier checks."
|
||||||
@@ -308,7 +324,7 @@ AdvSceneSwitcher.condition.scene.previousSceneTransitionBehaviour="During transi
|
|||||||
AdvSceneSwitcher.condition.scene.entry.line1="{{sceneType}}{{scenes}}{{pattern}}{{regex}}"
|
AdvSceneSwitcher.condition.scene.entry.line1="{{sceneType}}{{scenes}}{{pattern}}{{regex}}"
|
||||||
AdvSceneSwitcher.condition.scene.entry.line2="{{useTransitionTargetScene}}"
|
AdvSceneSwitcher.condition.scene.entry.line2="{{useTransitionTargetScene}}"
|
||||||
AdvSceneSwitcher.condition.window="Window"
|
AdvSceneSwitcher.condition.window="Window"
|
||||||
AdvSceneSwitcher.condition.window.entry.window="{{checkTitle}}Window title matches{{windowRegex}}{{windows}}"
|
AdvSceneSwitcher.condition.window.entry.window="{{checkTitle}}Window title matches{{windows}}{{windowRegex}}"
|
||||||
AdvSceneSwitcher.condition.window.entry.fullscreen="{{fullscreen}}Window is fullscreen"
|
AdvSceneSwitcher.condition.window.entry.fullscreen="{{fullscreen}}Window is fullscreen"
|
||||||
AdvSceneSwitcher.condition.window.entry.maximized="{{maximized}}Window is maximized"
|
AdvSceneSwitcher.condition.window.entry.maximized="{{maximized}}Window is maximized"
|
||||||
AdvSceneSwitcher.condition.window.entry.focused="{{focused}}Window is focused"
|
AdvSceneSwitcher.condition.window.entry.focused="{{focused}}Window is focused"
|
||||||
@@ -377,6 +393,13 @@ AdvSceneSwitcher.condition.video.patternMatchSuccessFullImage="Full image matche
|
|||||||
AdvSceneSwitcher.condition.video.objectMatchFail="Object was not found!"
|
AdvSceneSwitcher.condition.video.objectMatchFail="Object was not found!"
|
||||||
AdvSceneSwitcher.condition.video.objectMatchSuccess="Object is highlighted in red"
|
AdvSceneSwitcher.condition.video.objectMatchSuccess="Object is highlighted in red"
|
||||||
AdvSceneSwitcher.condition.video.ocrMatchSuccess="Detected text:\n\n%1"
|
AdvSceneSwitcher.condition.video.ocrMatchSuccess="Detected text:\n\n%1"
|
||||||
|
AdvSceneSwitcher.condition.video.ocrMatchFail="Could not detect any text!"
|
||||||
|
AdvSceneSwitcher.condition.video.ocrUseConfigFile="Use custom tesseract config file"
|
||||||
|
AdvSceneSwitcher.condition.video.ocrOpenConfigFile="Open"
|
||||||
|
AdvSceneSwitcher.condition.video.ocrOpenConfig.createFailed="Could not create the config file!"
|
||||||
|
AdvSceneSwitcher.condition.video.ocrOpenConfig.openFailed="Could not open the config file!"
|
||||||
|
AdvSceneSwitcher.condition.video.ocrConfigReload="Reload configuration file"
|
||||||
|
AdvSceneSwitcher.condition.video.ocrConfigHint="Tesseract config files consist of lines with parameter-value pairs (space separated).\nFor example:\n\ntessedit_char_blacklist\t\t\t\t\"abc\"\nlanguage_model_penalty_non_dict_word\t0"
|
||||||
AdvSceneSwitcher.condition.video.modelLoadFail="Model data could not be loaded!"
|
AdvSceneSwitcher.condition.video.modelLoadFail="Model data could not be loaded!"
|
||||||
AdvSceneSwitcher.condition.video.selectColor="Select Color"
|
AdvSceneSwitcher.condition.video.selectColor="Select Color"
|
||||||
AdvSceneSwitcher.condition.video.ocrMode.singleColumn="Single column of text of variable sizes"
|
AdvSceneSwitcher.condition.video.ocrMode.singleColumn="Single column of text of variable sizes"
|
||||||
@@ -396,16 +419,18 @@ AdvSceneSwitcher.condition.video.colorDeviationThresholdDescription="How similar
|
|||||||
AdvSceneSwitcher.condition.video.type.main="OBS's main output"
|
AdvSceneSwitcher.condition.video.type.main="OBS's main output"
|
||||||
AdvSceneSwitcher.condition.video.type.source="Source"
|
AdvSceneSwitcher.condition.video.type.source="Source"
|
||||||
AdvSceneSwitcher.condition.video.type.scene="Scene"
|
AdvSceneSwitcher.condition.video.type.scene="Scene"
|
||||||
AdvSceneSwitcher.condition.video.entry="{{videoInputTypes}}{{sources}}{{scenes}}{{condition}}{{imagePath}}"
|
AdvSceneSwitcher.condition.video.layout="{{videoInputTypes}}{{sources}}{{scenes}}{{condition}}{{imagePath}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.modelPath="Model data (haar cascade classifier):{{modelDataPath}}"
|
AdvSceneSwitcher.condition.video.layout.modelPath="Model data (haar cascade classifier):{{modelDataPath}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.minNeighbor="Minimum neighbors:{{minNeighbors}}"
|
AdvSceneSwitcher.condition.video.layout.minNeighbor="Minimum neighbors:{{minNeighbors}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.throttle="{{throttleEnable}}Reduce CPU load by performing check only every{{throttleCount}}milliseconds"
|
AdvSceneSwitcher.condition.video.layout.throttle="{{throttleEnable}}Reduce CPU load by performing check only every{{throttleCount}}milliseconds"
|
||||||
AdvSceneSwitcher.condition.video.entry.checkAreaEnable="Perform check only in area"
|
AdvSceneSwitcher.condition.video.layout.checkAreaEnable="Perform check only in area"
|
||||||
AdvSceneSwitcher.condition.video.entry.checkArea="{{checkAreaEnable}}{{checkArea}}{{selectArea}}"
|
AdvSceneSwitcher.condition.video.layout.checkArea="{{checkAreaEnable}}{{checkArea}}{{selectArea}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.orcColorPick="Check for text color:{{textColor}}{{selectColor}}"
|
AdvSceneSwitcher.condition.video.layout.ocrColorPick="Check for text color:{{textColor}}{{selectColor}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.orcTextType="Check for text type:{{textType}}"
|
AdvSceneSwitcher.condition.video.layout.ocrTextType="Check for text type:{{textType}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.orcLanguage="Check for language:{{languageCode}}"
|
AdvSceneSwitcher.condition.video.layout.ocrBaseDir="Tesseract base directory:{{tesseractBaseDir}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.color="Check for color:{{color}}{{selectColor}}"
|
AdvSceneSwitcher.condition.video.layout.ocrLanguage="Check for language:{{languageCode}}"
|
||||||
|
AdvSceneSwitcher.condition.video.layout.ocrConfig="Config file:{{configFile}}{{openConfigFile}}{{reloadConfig}}{{configFileHint}}"
|
||||||
|
AdvSceneSwitcher.condition.video.layout.color="Check for color:{{color}}{{selectColor}}"
|
||||||
AdvSceneSwitcher.condition.video.minSize="Minimum size:"
|
AdvSceneSwitcher.condition.video.minSize="Minimum size:"
|
||||||
AdvSceneSwitcher.condition.video.maxSize="Maximum size:"
|
AdvSceneSwitcher.condition.video.maxSize="Maximum size:"
|
||||||
AdvSceneSwitcher.condition.video.selectArea="Select area"
|
AdvSceneSwitcher.condition.video.selectArea="Select area"
|
||||||
@@ -705,6 +730,8 @@ AdvSceneSwitcher.condition.twitch.type.polling.channel.live="Stream is currently
|
|||||||
AdvSceneSwitcher.condition.twitch.type.polling.channel.title="Current title matches"
|
AdvSceneSwitcher.condition.twitch.type.polling.channel.title="Current title matches"
|
||||||
AdvSceneSwitcher.condition.twitch.type.polling.channel.category="Current category is"
|
AdvSceneSwitcher.condition.twitch.type.polling.channel.category="Current category is"
|
||||||
AdvSceneSwitcher.condition.twitch.type.chat.message="Chat message received"
|
AdvSceneSwitcher.condition.twitch.type.chat.message="Chat message received"
|
||||||
|
AdvSceneSwitcher.condition.twitch.type.chat.messageRemoved="Single chat message removed"
|
||||||
|
AdvSceneSwitcher.condition.twitch.type.chat.cleared="All messages of user or channel cleared"
|
||||||
AdvSceneSwitcher.condition.twitch.type.chat.properties="Chat message properties:"
|
AdvSceneSwitcher.condition.twitch.type.chat.properties="Chat message properties:"
|
||||||
AdvSceneSwitcher.condition.twitch.type.chat.properties.select="Select chat message property:"
|
AdvSceneSwitcher.condition.twitch.type.chat.properties.select="Select chat message property:"
|
||||||
AdvSceneSwitcher.condition.twitch.type.chat.properties.firstMessage="Is first message"
|
AdvSceneSwitcher.condition.twitch.type.chat.properties.firstMessage="Is first message"
|
||||||
@@ -771,9 +798,12 @@ AdvSceneSwitcher.condition.streamDeck.stopListen="Stop listening"
|
|||||||
AdvSceneSwitcher.condition.streamDeck.pluginDownload="<html><head/><body><p>The Stream Deck plugin can be found <a href=\"https://github.com/WarmUpTill/advanced-scene-switcher-streamdeck-plugin/releases\"><span style=\" text-decoration: underline; color:#268bd2;\">here on GitHub</span></a>.</p></body></html>"
|
AdvSceneSwitcher.condition.streamDeck.pluginDownload="<html><head/><body><p>The Stream Deck plugin can be found <a href=\"https://github.com/WarmUpTill/advanced-scene-switcher-streamdeck-plugin/releases\"><span style=\" text-decoration: underline; color:#268bd2;\">here on GitHub</span></a>.</p></body></html>"
|
||||||
AdvSceneSwitcher.condition.gameCapture="Game capture"
|
AdvSceneSwitcher.condition.gameCapture="Game capture"
|
||||||
AdvSceneSwitcher.condition.gameCapture.entry="{{sources}}hooked a game."
|
AdvSceneSwitcher.condition.gameCapture.entry="{{sources}}hooked a game."
|
||||||
|
|
||||||
AdvSceneSwitcher.condition.screenshot="Screenshot"
|
AdvSceneSwitcher.condition.screenshot="Screenshot"
|
||||||
AdvSceneSwitcher.condition.screenshot.entry="A screenshot was taken"
|
AdvSceneSwitcher.condition.screenshot.entry="A screenshot was taken"
|
||||||
|
AdvSceneSwitcher.condition.mqtt="MQTT"
|
||||||
|
AdvSceneSwitcher.condition.mqtt.layout.match="Message was received from{{connection}} which matches{{regex}}:"
|
||||||
|
AdvSceneSwitcher.condition.mqtt.layout.listen="Set message selection to incoming message:{{listenButton}}"
|
||||||
|
AdvSceneSwitcher.condition.script="Script"
|
||||||
|
|
||||||
# Macro Actions
|
# Macro Actions
|
||||||
AdvSceneSwitcher.action.unknown="Unknown action"
|
AdvSceneSwitcher.action.unknown="Unknown action"
|
||||||
@@ -908,6 +938,7 @@ AdvSceneSwitcher.action.media.seek.percentage.label="Percentage of total duratio
|
|||||||
AdvSceneSwitcher.action.macro="Macro"
|
AdvSceneSwitcher.action.macro="Macro"
|
||||||
AdvSceneSwitcher.action.macro.type.pause="Pause"
|
AdvSceneSwitcher.action.macro.type.pause="Pause"
|
||||||
AdvSceneSwitcher.action.macro.type.unpause="Unpause"
|
AdvSceneSwitcher.action.macro.type.unpause="Unpause"
|
||||||
|
AdvSceneSwitcher.action.macro.type.togglePause="Toggle pause"
|
||||||
AdvSceneSwitcher.action.macro.type.resetCounter="Reset counter"
|
AdvSceneSwitcher.action.macro.type.resetCounter="Reset counter"
|
||||||
AdvSceneSwitcher.action.macro.type.run="Run macro"
|
AdvSceneSwitcher.action.macro.type.run="Run macro"
|
||||||
AdvSceneSwitcher.action.macro.type.run.conditions.ignore="Do not consider condition state"
|
AdvSceneSwitcher.action.macro.type.run.conditions.ignore="Do not consider condition state"
|
||||||
@@ -1066,7 +1097,7 @@ AdvSceneSwitcher.action.http.type.post="POST"
|
|||||||
AdvSceneSwitcher.action.http.type.put="PUT"
|
AdvSceneSwitcher.action.http.type.put="PUT"
|
||||||
AdvSceneSwitcher.action.http.type.patch="PATCH"
|
AdvSceneSwitcher.action.http.type.patch="PATCH"
|
||||||
AdvSceneSwitcher.action.http.type.delete="DELETE"
|
AdvSceneSwitcher.action.http.type.delete="DELETE"
|
||||||
AdvSceneSwitcher.action.http.layout.method="Send{{method}}to URL{{url}}at path{{path}}"
|
AdvSceneSwitcher.action.http.layout.method="Send{{method}}to URL{{url}}"
|
||||||
AdvSceneSwitcher.action.http.layout.contentType="Content type:{{contentType}}"
|
AdvSceneSwitcher.action.http.layout.contentType="Content type:{{contentType}}"
|
||||||
AdvSceneSwitcher.action.http.layout.timeout="Timeout:{{timeout}}seconds"
|
AdvSceneSwitcher.action.http.layout.timeout="Timeout:{{timeout}}seconds"
|
||||||
AdvSceneSwitcher.action.http.entry.line1="Send{{method}}to{{url}}"
|
AdvSceneSwitcher.action.http.entry.line1="Send{{method}}to{{url}}"
|
||||||
@@ -1087,7 +1118,10 @@ AdvSceneSwitcher.action.variable.type.askForValue="Get user input"
|
|||||||
AdvSceneSwitcher.action.variable.type.environmentVariable="Set to environment variable value"
|
AdvSceneSwitcher.action.variable.type.environmentVariable="Set to environment variable value"
|
||||||
AdvSceneSwitcher.action.variable.type.sceneItemCount="Set to scene item count of scene"
|
AdvSceneSwitcher.action.variable.type.sceneItemCount="Set to scene item count of scene"
|
||||||
AdvSceneSwitcher.action.variable.type.stringLength="Set to length of string"
|
AdvSceneSwitcher.action.variable.type.stringLength="Set to length of string"
|
||||||
AdvSceneSwitcher.action.variable.type.extractJson="Extract json field with name"
|
AdvSceneSwitcher.action.variable.type.extractJsonField="Extract JSON field with name"
|
||||||
|
AdvSceneSwitcher.action.variable.type.queryJson="Query JSON"
|
||||||
|
AdvSceneSwitcher.action.variable.type.queryJson.info="You can use \"JSONPath\" (RFC 9535) syntax here.\nSo, for example:\n\n • $['books'][0]['category']\n • $.books[0].category\n\nIf the query or the JSON should be invalid, the variable value will not be changed.\nIf the input is valid, the result of the query will always be a JSON array."
|
||||||
|
AdvSceneSwitcher.action.variable.type.accessJsonArray="Access JSON array at index"
|
||||||
AdvSceneSwitcher.action.variable.type.setToTempvar="Set to macro property"
|
AdvSceneSwitcher.action.variable.type.setToTempvar="Set to macro property"
|
||||||
AdvSceneSwitcher.action.variable.type.setToTempvar.help="This action type will allow you to extract values out of segments of the current macro and assign those values to the selected variable.\nFor example, you can get the current scene name from a scene condition and assign this name to a variable."
|
AdvSceneSwitcher.action.variable.type.setToTempvar.help="This action type will allow you to extract values out of segments of the current macro and assign those values to the selected variable.\nFor example, you can get the current scene name from a scene condition and assign this name to a variable."
|
||||||
AdvSceneSwitcher.action.variable.type.sceneItemName="Set to scene item name at index"
|
AdvSceneSwitcher.action.variable.type.sceneItemName="Set to scene item name at index"
|
||||||
@@ -1116,15 +1150,15 @@ AdvSceneSwitcher.action.variable.invalidSelection="Invalid selection!"
|
|||||||
AdvSceneSwitcher.action.variable.actionNoVariableSupport="Getting variable values from %1 actions is not supported!"
|
AdvSceneSwitcher.action.variable.actionNoVariableSupport="Getting variable values from %1 actions is not supported!"
|
||||||
AdvSceneSwitcher.action.variable.conditionNoVariableSupport="Getting variable values from %1 conditions is not supported!"
|
AdvSceneSwitcher.action.variable.conditionNoVariableSupport="Getting variable values from %1 conditions is not supported!"
|
||||||
AdvSceneSwitcher.action.variable.currentSegmentValue="Current value:"
|
AdvSceneSwitcher.action.variable.currentSegmentValue="Current value:"
|
||||||
AdvSceneSwitcher.action.variable.entry.other="{{actions}}{{variables}}{{variables2}}{{strValue}}{{numValue}}{{segmentIndex}}{{mathExpression}}{{envVariableName}}{{scenes}}{{tempVars}}{{tempVarsHelp}}{{sceneItemIndex}}{{direction}}{{stringLength}}{{paddingCharSelection}}{{caseType}}"
|
AdvSceneSwitcher.action.variable.layout.other="{{actions}}{{variables}}{{variables2}}{{strValue}}{{numValue}}{{segmentIndex}}{{mathExpression}}{{envVariableName}}{{scenes}}{{tempVars}}{{tempVarsHelp}}{{sceneItemIndex}}{{direction}}{{stringLength}}{{paddingCharSelection}}{{caseType}}{{jsonQuery}}{{jsonQueryHelp}}{{jsonIndex}}"
|
||||||
AdvSceneSwitcher.action.variable.entry.pad="{{actions}}of{{variables}}to length{{stringLength}}by adding{{paddingCharSelection}}to the{{direction}}"
|
AdvSceneSwitcher.action.variable.layout.pad="{{actions}}of{{variables}}to length{{stringLength}}by adding{{paddingCharSelection}}to the{{direction}}"
|
||||||
AdvSceneSwitcher.action.variable.entry.truncate="{{actions}}of{{variables}}to length{{stringLength}}by removing characters from the{{direction}}"
|
AdvSceneSwitcher.action.variable.layout.truncate="{{actions}}of{{variables}}to length{{stringLength}}by removing characters from the{{direction}}"
|
||||||
AdvSceneSwitcher.action.variable.entry.substringIndex="Substring start:{{subStringStart}}Substring size:{{subStringSize}}"
|
AdvSceneSwitcher.action.variable.layout.substringIndex="Substring start:{{subStringStart}}Substring size:{{subStringSize}}"
|
||||||
AdvSceneSwitcher.action.variable.entry.substringRegex="Assign value of{{regexMatchIdx}}match using regular expression:"
|
AdvSceneSwitcher.action.variable.layout.substringRegex="Assign value of{{regexMatchIdx}}match using regular expression:"
|
||||||
AdvSceneSwitcher.action.variable.entry.findAndReplace="{{findStr}}{{findRegex}}{{replaceStr}}"
|
AdvSceneSwitcher.action.variable.layout.findAndReplace="{{findStr}}{{findRegex}}{{replaceStr}}"
|
||||||
AdvSceneSwitcher.action.variable.entry.userInput.customPrompt="{{useCustomPrompt}}Use custom prompt{{inputPrompt}}"
|
AdvSceneSwitcher.action.variable.layout.userInput.customPrompt="{{useCustomPrompt}}Use custom prompt{{inputPrompt}}"
|
||||||
AdvSceneSwitcher.action.variable.entry.userInput.placeholder="{{useInputPlaceholder}}Fill with placeholder{{inputPlaceholder}}"
|
AdvSceneSwitcher.action.variable.layout.userInput.placeholder="{{useInputPlaceholder}}Fill with placeholder{{inputPlaceholder}}"
|
||||||
AdvSceneSwitcher.action.variable.entry.randomNumber="Generate random number in range from{{randomNumberStart}}to{{randomNumberEnd}}"
|
AdvSceneSwitcher.action.variable.layout.randomNumber="Generate random number in range from{{randomNumberStart}}to{{randomNumberEnd}}"
|
||||||
AdvSceneSwitcher.action.projector="Projector"
|
AdvSceneSwitcher.action.projector="Projector"
|
||||||
AdvSceneSwitcher.action.projector.action.open="Open"
|
AdvSceneSwitcher.action.projector.action.open="Open"
|
||||||
AdvSceneSwitcher.action.projector.action.close="Close"
|
AdvSceneSwitcher.action.projector.action.close="Close"
|
||||||
@@ -1202,6 +1236,24 @@ AdvSceneSwitcher.action.window.entry="{{actions}}{{windows}}{{regex}}"
|
|||||||
AdvSceneSwitcher.action.log="Log"
|
AdvSceneSwitcher.action.log="Log"
|
||||||
AdvSceneSwitcher.action.log.placeholder="My log message!"
|
AdvSceneSwitcher.action.log.placeholder="My log message!"
|
||||||
AdvSceneSwitcher.action.log.entry="Write to OBS log:{{logMessage}}"
|
AdvSceneSwitcher.action.log.entry="Write to OBS log:{{logMessage}}"
|
||||||
|
AdvSceneSwitcher.action.mqtt="MQTT"
|
||||||
|
AdvSceneSwitcher.action.mqtt.topic="Topic:"
|
||||||
|
AdvSceneSwitcher.action.mqtt.qos="QoS:"
|
||||||
|
AdvSceneSwitcher.action.mqtt.retain="Retained message:"
|
||||||
|
AdvSceneSwitcher.action.mqtt.layout="Send message to{{connection}}"
|
||||||
|
AdvSceneSwitcher.action.obsSetting="OBS setting"
|
||||||
|
AdvSceneSwitcher.action.obsSetting.action.setFPSType="Set FPS selection type to"
|
||||||
|
AdvSceneSwitcher.action.obsSetting.action.setFPSCommonValue="Set FPS common selection to"
|
||||||
|
AdvSceneSwitcher.action.obsSetting.action.setFPSIntegerValue="Set FPS integer selection to"
|
||||||
|
AdvSceneSwitcher.action.obsSetting.action.setFPSFractionNumeratorValue="Set fractional FPS numerator selection to"
|
||||||
|
AdvSceneSwitcher.action.obsSetting.action.setFPSFractionDenominatorValue="Set fractional FPS denominator selection to"
|
||||||
|
AdvSceneSwitcher.action.obsSetting.action.setBaseCanvasX="Set base resolution X value"
|
||||||
|
AdvSceneSwitcher.action.obsSetting.action.setBaseCanvasY="Set base resolution Y value"
|
||||||
|
AdvSceneSwitcher.action.obsSetting.action.setOutputCanvasX="Set output resolution X value"
|
||||||
|
AdvSceneSwitcher.action.obsSetting.action.setOutputCanvasY="Set output resolution Y value"
|
||||||
|
AdvSceneSwitcher.action.obsSetting.getCurrentValue="Get current value"
|
||||||
|
AdvSceneSwitcher.action.obsSettings.layout="{{actions}}{{fpsType}}{{fpsIntValue}}{{fpsStringValue}}{{canvasSizeValue}}{{getCurrentValue}}"
|
||||||
|
AdvSceneSwitcher.action.script="Script"
|
||||||
|
|
||||||
# Hotkey
|
# Hotkey
|
||||||
AdvSceneSwitcher.hotkey.startSwitcherHotkey="Start the Advanced Scene Switcher"
|
AdvSceneSwitcher.hotkey.startSwitcherHotkey="Start the Advanced Scene Switcher"
|
||||||
@@ -1210,9 +1262,10 @@ AdvSceneSwitcher.hotkey.startStopToggleSwitcherHotkey="Toggle Start/Stop for the
|
|||||||
AdvSceneSwitcher.hotkey.macro.pause="Pause macro %1"
|
AdvSceneSwitcher.hotkey.macro.pause="Pause macro %1"
|
||||||
AdvSceneSwitcher.hotkey.macro.unpause="Unpause macro %1"
|
AdvSceneSwitcher.hotkey.macro.unpause="Unpause macro %1"
|
||||||
AdvSceneSwitcher.hotkey.macro.togglePause="Toggle pause of macro %1"
|
AdvSceneSwitcher.hotkey.macro.togglePause="Toggle pause of macro %1"
|
||||||
AdvSceneSwitcher.hotkey.upMacroSegmentHotkey="Move macro segment selection up"
|
AdvSceneSwitcher.hotkey.macro.new="Add new macro"
|
||||||
AdvSceneSwitcher.hotkey.downMacroSegmentHotkey="Move macro segment selection down"
|
AdvSceneSwitcher.hotkey.macro.segment.up="Move macro segment selection up"
|
||||||
AdvSceneSwitcher.hotkey.removeMacroSegmentHotkey="Remove selected macro segment"
|
AdvSceneSwitcher.hotkey.macro.segment.down="Move macro segment selection down"
|
||||||
|
AdvSceneSwitcher.hotkey.macro.segment.remove="Remove selected macro segment"
|
||||||
|
|
||||||
AdvSceneSwitcher.askBackup="Detected a new version of the Advanced Scene Switcher.\nShould a backup of the old settings be created?"
|
AdvSceneSwitcher.askBackup="Detected a new version of the Advanced Scene Switcher.\nShould a backup of the old settings be created?"
|
||||||
AdvSceneSwitcher.askForMacro="Select macro{{macroSelection}}"
|
AdvSceneSwitcher.askForMacro="Select macro{{macroSelection}}"
|
||||||
@@ -1358,6 +1411,35 @@ AdvSceneSwitcher.osc.message.type.false="False"
|
|||||||
AdvSceneSwitcher.osc.message.type.infinity="Infinitum"
|
AdvSceneSwitcher.osc.message.type.infinity="Infinitum"
|
||||||
AdvSceneSwitcher.osc.message.type.null="Nil"
|
AdvSceneSwitcher.osc.message.type.null="Nil"
|
||||||
|
|
||||||
|
AdvSceneSwitcher.mqttConnection.startListen="Start listening"
|
||||||
|
AdvSceneSwitcher.mqttConnection.stopListen="Stop listening"
|
||||||
|
AdvSceneSwitcher.mqttConnection.select="--select connection--"
|
||||||
|
AdvSceneSwitcher.mqttConnection.add="Add new connection"
|
||||||
|
AdvSceneSwitcher.mqttConnection.configure="Configure connection settings"
|
||||||
|
AdvSceneSwitcher.mqttConnection.invalid="Invalid connection selection"
|
||||||
|
AdvSceneSwitcher.mqttConnection.name="Name:"
|
||||||
|
AdvSceneSwitcher.mqttConnection.address="Address:"
|
||||||
|
AdvSceneSwitcher.mqttConnection.username="Username:"
|
||||||
|
AdvSceneSwitcher.mqttConnection.password="Password:"
|
||||||
|
AdvSceneSwitcher.mqttConnection.reconnect="Reconnect automatically:"
|
||||||
|
AdvSceneSwitcher.mqttConnection.reconnectDelay="Automatically reconnect after:"
|
||||||
|
AdvSceneSwitcher.mqttConnection.connectOnStart="Connect on startup:"
|
||||||
|
AdvSceneSwitcher.mqttConnection.test="Test connection"
|
||||||
|
AdvSceneSwitcher.mqttConnection.status.connected="Connected!"
|
||||||
|
AdvSceneSwitcher.mqttConnection.status.connecting="Connecting ..."
|
||||||
|
AdvSceneSwitcher.mqttConnection.status.disconnected="Could not connect!"
|
||||||
|
AdvSceneSwitcher.mqttConnection.topic="Topic"
|
||||||
|
AdvSceneSwitcher.mqttConnection.qos="QoS"
|
||||||
|
AdvSceneSwitcher.mqttConnection.topics="Topic subscriptions:"
|
||||||
|
AdvSceneSwitcher.mqttConnection.inputWarning.emptyTopic="Topic cannot be empty."
|
||||||
|
AdvSceneSwitcher.mqttConnection.inputWarning.emptyTopic.title="Input Error"
|
||||||
|
AdvSceneSwitcher.mqttConnection.inputWarning.duplicateTopic="This topic already exists."
|
||||||
|
AdvSceneSwitcher.mqttConnection.inputWarning.duplicateTopic.title="Duplicate Topic"
|
||||||
|
AdvSceneSwitcher.mqttConnection.inputWarning.qosRange="QoS must be 0, 1, or 2."
|
||||||
|
AdvSceneSwitcher.mqttConnection.inputWarning.qosRange.title="Invalid QoS"
|
||||||
|
AdvSceneSwitcher.mqttConnection.add.layout="Add topic subscription{{topic}}with QoS{{QoS}}"
|
||||||
|
AdvSceneSwitcher.mqttConnection.add.title="Add MQTT Topic Subscription"
|
||||||
|
|
||||||
AdvSceneSwitcher.twitchToken.name="Account name:"
|
AdvSceneSwitcher.twitchToken.name="Account name:"
|
||||||
AdvSceneSwitcher.twitchToken.nameNotAvailable="Account already in use"
|
AdvSceneSwitcher.twitchToken.nameNotAvailable="Account already in use"
|
||||||
AdvSceneSwitcher.twitchToken.select="--select Twitch connection--"
|
AdvSceneSwitcher.twitchToken.select="--select Twitch connection--"
|
||||||
@@ -1409,6 +1491,7 @@ AdvSceneSwitcher.twitchToken.moderator.chat.settings.manage="Manage channel's ch
|
|||||||
AdvSceneSwitcher.twitchToken.user.whispers.manage="Manage user's whispers."
|
AdvSceneSwitcher.twitchToken.user.whispers.manage="Manage user's whispers."
|
||||||
AdvSceneSwitcher.twitchToken.chat.read="View live stream chat messages."
|
AdvSceneSwitcher.twitchToken.chat.read="View live stream chat messages."
|
||||||
AdvSceneSwitcher.twitchToken.chat.edit="Send live stream chat messages."
|
AdvSceneSwitcher.twitchToken.chat.edit="Send live stream chat messages."
|
||||||
|
AdvSceneSwitcher.twitchToken.validateTimestamps="Validate timestamps of received Twitch event messages. (Recommended)"
|
||||||
|
|
||||||
AdvSceneSwitcher.twitch.selection.channel.open="Open channel"
|
AdvSceneSwitcher.twitch.selection.channel.open="Open channel"
|
||||||
AdvSceneSwitcher.twitch.selection.channel.open.tooltip.details="Open channel in external application handling the HTTPS protocol."
|
AdvSceneSwitcher.twitch.selection.channel.open.tooltip.details="Open channel in external application handling the HTTPS protocol."
|
||||||
@@ -1435,6 +1518,17 @@ AdvSceneSwitcher.twitch.selection.points.reward.tooltip.noPermission="Can't sele
|
|||||||
AdvSceneSwitcher.twitch.selection.points.reward.tooltip.noChannel="Can't select points reward without entering a channel first!"
|
AdvSceneSwitcher.twitch.selection.points.reward.tooltip.noChannel="Can't select points reward without entering a channel first!"
|
||||||
AdvSceneSwitcher.twitch.selection.points.reward.tooltip.error="Can't select points reward because Twitch responded with an error! Check OBS logs for more details."
|
AdvSceneSwitcher.twitch.selection.points.reward.tooltip.error="Can't select points reward because Twitch responded with an error! Check OBS logs for more details."
|
||||||
|
|
||||||
|
AdvSceneSwitcher.script.type.inline="Inline"
|
||||||
|
AdvSceneSwitcher.script.type.file="File"
|
||||||
|
AdvSceneSwitcher.script.type.layout="Script type:{{scriptType}}"
|
||||||
|
AdvSceneSwitcher.script.language.python="Python"
|
||||||
|
AdvSceneSwitcher.script.language.lua="LUA"
|
||||||
|
AdvSceneSwitcher.script.language.select="--select language--"
|
||||||
|
AdvSceneSwitcher.script.language.layout="Script language:{{language}}"
|
||||||
|
AdvSceneSwitcher.script.file.open="Open"
|
||||||
|
AdvSceneSwitcher.script.file.open.failed="Could not open script file!"
|
||||||
|
AdvSceneSwitcher.script.file.layout="Script file:{{path}}{{open}}"
|
||||||
|
|
||||||
AdvSceneSwitcher.tempVar.select="--select value--"
|
AdvSceneSwitcher.tempVar.select="--select value--"
|
||||||
AdvSceneSwitcher.tempVar.selectionInfo.lastValues="Last values:"
|
AdvSceneSwitcher.tempVar.selectionInfo.lastValues="Last values:"
|
||||||
|
|
||||||
@@ -1828,6 +1922,24 @@ AdvSceneSwitcher.tempVar.twitch.is_turbo.chatReceive.description="'true' if the
|
|||||||
AdvSceneSwitcher.tempVar.twitch.is_vip.chatReceive="Is chatter a VIP"
|
AdvSceneSwitcher.tempVar.twitch.is_vip.chatReceive="Is chatter a VIP"
|
||||||
AdvSceneSwitcher.tempVar.twitch.is_vip.chatReceive.description="'true' if the chatter is a VIP in the channel, 'false' otherwise."
|
AdvSceneSwitcher.tempVar.twitch.is_vip.chatReceive.description="'true' if the chatter is a VIP in the channel, 'false' otherwise."
|
||||||
|
|
||||||
|
AdvSceneSwitcher.tempVar.twitch.login.chatRemove="User login"
|
||||||
|
AdvSceneSwitcher.tempVar.twitch.login.chatRemove.description="The name of the user who sent the message."
|
||||||
|
AdvSceneSwitcher.tempVar.twitch.message.chatRemove="Chat message"
|
||||||
|
AdvSceneSwitcher.tempVar.twitch.message_id.chatRemove.description="The chat message that was removed."
|
||||||
|
AdvSceneSwitcher.tempVar.twitch.message_id.chatRemove="Chat message ID"
|
||||||
|
AdvSceneSwitcher.tempVar.twitch.message_id.chatRemove.description="The ID of the message in UUID format."
|
||||||
|
AdvSceneSwitcher.tempVar.twitch.timestamp.chatRemove="Chat message timestamp"
|
||||||
|
AdvSceneSwitcher.tempVar.twitch.timestamp.chatRemove.description="The UNIX timestamp."
|
||||||
|
|
||||||
|
AdvSceneSwitcher.tempVar.twitch.login.chatClear="User login"
|
||||||
|
AdvSceneSwitcher.tempVar.twitch.login.chatClear.description="The login name of the user whose messages were removed from the chat room because they were banned or put in a timeout."
|
||||||
|
AdvSceneSwitcher.tempVar.twitch.user_id.chatClear="User ID"
|
||||||
|
AdvSceneSwitcher.tempVar.twitch.user_id.chatClear.description="Optional.\nThe User ID of the user that was banned or put in a timeout.\nEmpty in case the complete chat was cleared."
|
||||||
|
AdvSceneSwitcher.tempVar.twitch.ban_duration.chatClear="Ban duration"
|
||||||
|
AdvSceneSwitcher.tempVar.twitch.ban_duration.chatClear.description="Set to zero if the complete chat was cleared or a user was banned indefinitely.\nIs set to non-zero value, if a user was put in a timeout.\nWill contain the duration of the timeout in seconds."
|
||||||
|
AdvSceneSwitcher.tempVar.twitch.timestamp.chatClear="Timestamp"
|
||||||
|
AdvSceneSwitcher.tempVar.twitch.timestamp.chatClear.description="The UNIX timestamp."
|
||||||
|
|
||||||
AdvSceneSwitcher.tempVar.twitch.user_login.chatJoin="User login"
|
AdvSceneSwitcher.tempVar.twitch.user_login.chatJoin="User login"
|
||||||
AdvSceneSwitcher.tempVar.twitch.user_login.chatJoin.description="The user login of the person who joined the chat room."
|
AdvSceneSwitcher.tempVar.twitch.user_login.chatJoin.description="The user login of the person who joined the chat room."
|
||||||
|
|
||||||
@@ -2059,6 +2171,11 @@ AdvSceneSwitcher.tempVar.http.body="Message body"
|
|||||||
AdvSceneSwitcher.tempVar.http.error="Error"
|
AdvSceneSwitcher.tempVar.http.error="Error"
|
||||||
AdvSceneSwitcher.tempVar.http.error.description="Empty when no error occurred.\nOther possible values:\n\n * Could not establish connection\n * Failed to bind IP address\n * Failed to read connection\n * Failed to write connection\n * Maximum redirect count exceeded\n * Connection handling canceled\n * SSL connection failed\n * SSL certificate loading failed\n * SSL server verification failed\n * Unsupported HTTP multipart boundary characters\n * Compression failed\n * Connection timed out\n * Proxy connection failed\n * Unknown"
|
AdvSceneSwitcher.tempVar.http.error.description="Empty when no error occurred.\nOther possible values:\n\n * Could not establish connection\n * Failed to bind IP address\n * Failed to read connection\n * Failed to write connection\n * Maximum redirect count exceeded\n * Connection handling canceled\n * SSL connection failed\n * SSL certificate loading failed\n * SSL server verification failed\n * Unsupported HTTP multipart boundary characters\n * Compression failed\n * Connection timed out\n * Proxy connection failed\n * Unknown"
|
||||||
|
|
||||||
|
AdvSceneSwitcher.tempVar.mqtt.message="Message"
|
||||||
|
|
||||||
|
AdvSceneSwitcher.tempVar.cursor.x="Cursor position (X)"
|
||||||
|
AdvSceneSwitcher.tempVar.cursor.y="Cursor position (Y)"
|
||||||
|
|
||||||
AdvSceneSwitcher.selectScene="--select scene--"
|
AdvSceneSwitcher.selectScene="--select scene--"
|
||||||
AdvSceneSwitcher.selectPreviousScene="Previous Scene"
|
AdvSceneSwitcher.selectPreviousScene="Previous Scene"
|
||||||
AdvSceneSwitcher.selectCurrentScene="Current Scene"
|
AdvSceneSwitcher.selectCurrentScene="Current Scene"
|
||||||
@@ -2178,13 +2295,12 @@ AdvSceneSwitcher.script.timeout="Script timeout:{{timeout}}"
|
|||||||
|
|
||||||
# This secion is copied from the OBS locale files
|
# This secion is copied from the OBS locale files
|
||||||
|
|
||||||
# commonly shared locale
|
# OBS commonly shared locale
|
||||||
Browse="Browse"
|
Browse="Browse"
|
||||||
Show="Show"
|
Show="Show"
|
||||||
Hide="Hide"
|
Hide="Hide"
|
||||||
|
|
||||||
|
# OBS properties window
|
||||||
# properties window
|
|
||||||
Basic.PropertiesWindow="Properties for '%1'"
|
Basic.PropertiesWindow="Properties for '%1'"
|
||||||
Basic.PropertiesWindow.AutoSelectFormat="%1 (autoselect: %2)"
|
Basic.PropertiesWindow.AutoSelectFormat="%1 (autoselect: %2)"
|
||||||
Basic.PropertiesWindow.SelectColor="Select color"
|
Basic.PropertiesWindow.SelectColor="Select color"
|
||||||
@@ -2201,7 +2317,7 @@ Basic.PropertiesWindow.AddEditableListFiles="Add files to '%1'"
|
|||||||
Basic.PropertiesWindow.AddEditableListEntry="Add entry to '%1'"
|
Basic.PropertiesWindow.AddEditableListEntry="Add entry to '%1'"
|
||||||
Basic.PropertiesWindow.EditEditableListEntry="Edit entry from '%1'"
|
Basic.PropertiesWindow.EditEditableListEntry="Edit entry from '%1'"
|
||||||
|
|
||||||
# properties view
|
# OBS properties view
|
||||||
Basic.PropertiesView.FPS.Simple="Simple FPS Values"
|
Basic.PropertiesView.FPS.Simple="Simple FPS Values"
|
||||||
Basic.PropertiesView.FPS.Rational="Rational FPS Values"
|
Basic.PropertiesView.FPS.Rational="Rational FPS Values"
|
||||||
Basic.PropertiesView.FPS.ValidFPSRanges="Valid FPS Ranges:"
|
Basic.PropertiesView.FPS.ValidFPSRanges="Valid FPS Ranges:"
|
||||||
@@ -2209,6 +2325,11 @@ Basic.PropertiesView.UrlButton.Text="Open this link in your default web browser?
|
|||||||
Basic.PropertiesView.UrlButton.Text.Url="URL: %1"
|
Basic.PropertiesView.UrlButton.Text.Url="URL: %1"
|
||||||
Basic.PropertiesView.UrlButton.OpenUrl="Open URL"
|
Basic.PropertiesView.UrlButton.OpenUrl="Open URL"
|
||||||
|
|
||||||
|
# OBS settings
|
||||||
|
Basic.Settings.Video.FPSCommon="Common FPS Values"
|
||||||
|
Basic.Settings.Video.FPSInteger="Integer FPS Value"
|
||||||
|
Basic.Settings.Video.FPSFraction="Fractional FPS Value"
|
||||||
|
|
||||||
# Legacy tabs below - please don't waste your time adding translations for these :)
|
# Legacy tabs below - please don't waste your time adding translations for these :)
|
||||||
# Transition Tab
|
# Transition Tab
|
||||||
AdvSceneSwitcher.transitionTab.title="Transition"
|
AdvSceneSwitcher.transitionTab.title="Transition"
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ AdvSceneSwitcher.generalTab.generalBehavior.onNoMatch.dontSwitch="No cambiar"
|
|||||||
AdvSceneSwitcher.generalTab.generalBehavior.onNoMatch.switchToRandom="Cambiar a una escena aleatoria"
|
AdvSceneSwitcher.generalTab.generalBehavior.onNoMatch.switchToRandom="Cambiar a una escena aleatoria"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.onNoMatch.switchTo="Cambiar a:"
|
AdvSceneSwitcher.generalTab.generalBehavior.onNoMatch.switchTo="Cambiar a:"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.cooldownHint="¡Durante este tiempo, se ignorarán las posibles coincidencias!"
|
AdvSceneSwitcher.generalTab.generalBehavior.cooldownHint="¡Durante este tiempo, se ignorarán las posibles coincidencias!"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.verboseLogging="Habilitar el registro detallado"
|
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.saveWindowGeo="Guardar la posición y el tamaño de la ventana"
|
AdvSceneSwitcher.generalTab.generalBehavior.saveWindowGeo="Guardar la posición y el tamaño de la ventana"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.showTrayNotifications="Mostrar notificaciones del sistema"
|
AdvSceneSwitcher.generalTab.generalBehavior.showTrayNotifications="Mostrar notificaciones del sistema"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="Deshabilitar sugerencias de interfaz de usuario"
|
AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="Deshabilitar sugerencias de interfaz de usuario"
|
||||||
@@ -39,7 +38,7 @@ AdvSceneSwitcher.generalTab.saveOrLoadsettings.export="Exportar"
|
|||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.import="Importar"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.import="Importar"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportWindowTitle="Exportar los ajustes para Advanced Scene Switcher ..."
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportWindowTitle="Exportar los ajustes para Advanced Scene Switcher ..."
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.importWindowTitle="Importar los ajustes para Advanced Scene Switcher ..."
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.importWindowTitle="Importar los ajustes para Advanced Scene Switcher ..."
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.textType="Archivos de texto (*.txt)"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.textType="Archivos de texto (*.txt *.json)"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadFail="La importacion la configuracion de escenas fallo"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadFail="La importacion la configuracion de escenas fallo"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadSuccess="Configuración de escenas importada correctamente"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadSuccess="Configuración de escenas importada correctamente"
|
||||||
AdvSceneSwitcher.generalTab.priority.fileContent="Contenido del archivo"
|
AdvSceneSwitcher.generalTab.priority.fileContent="Contenido del archivo"
|
||||||
@@ -155,12 +154,12 @@ AdvSceneSwitcher.condition.video.patternMatchSuccess="El patrón está resaltado
|
|||||||
AdvSceneSwitcher.condition.video.objectMatchFail="¡No se encontró el objeto!"
|
AdvSceneSwitcher.condition.video.objectMatchFail="¡No se encontró el objeto!"
|
||||||
AdvSceneSwitcher.condition.video.objectMatchSuccess="El objeto está resaltado en rojo"
|
AdvSceneSwitcher.condition.video.objectMatchSuccess="El objeto está resaltado en rojo"
|
||||||
AdvSceneSwitcher.condition.video.modelLoadFail="¡No se pudieron cargar los datos del modelo!"
|
AdvSceneSwitcher.condition.video.modelLoadFail="¡No se pudieron cargar los datos del modelo!"
|
||||||
AdvSceneSwitcher.condition.video.entry="{{videoInputTypes}}{{sources}}{{scenes}}{{condition}}{{imagePath}}"
|
AdvSceneSwitcher.condition.video.layout="{{videoInputTypes}}{{sources}}{{scenes}}{{condition}}{{imagePath}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.modelPath="Datos del modelo (haar cascade classifier): {{modelDataPath}}"
|
AdvSceneSwitcher.condition.video.layout.modelPath="Datos del modelo (haar cascade classifier): {{modelDataPath}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.minNeighbor="Mínimo de vecinos: {{minNeighbors}}"
|
AdvSceneSwitcher.condition.video.layout.minNeighbor="Mínimo de vecinos: {{minNeighbors}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.throttle="{{throttleEnable}}Reduzca la carga de la CPU realizando una comprobación solo cada {{throttleCount}} milisegundos"
|
AdvSceneSwitcher.condition.video.layout.throttle="{{throttleEnable}}Reduzca la carga de la CPU realizando una comprobación solo cada {{throttleCount}} milisegundos"
|
||||||
AdvSceneSwitcher.condition.video.entry.checkAreaEnable="Realizar comprobación solo en el área"
|
AdvSceneSwitcher.condition.video.layout.checkAreaEnable="Realizar comprobación solo en el área"
|
||||||
AdvSceneSwitcher.condition.video.entry.checkArea="{{checkAreaEnable}}Realizar comprobación solo en el área {{checkArea}} {{selectArea}}"
|
AdvSceneSwitcher.condition.video.layout.checkArea="{{checkAreaEnable}}Realizar comprobación solo en el área {{checkArea}} {{selectArea}}"
|
||||||
AdvSceneSwitcher.condition.video.minSize="Tamaño mínimo:"
|
AdvSceneSwitcher.condition.video.minSize="Tamaño mínimo:"
|
||||||
AdvSceneSwitcher.condition.video.maxSize="Tamaño máximo:"
|
AdvSceneSwitcher.condition.video.maxSize="Tamaño máximo:"
|
||||||
AdvSceneSwitcher.condition.video.selectArea="Seleccionar área"
|
AdvSceneSwitcher.condition.video.selectArea="Seleccionar área"
|
||||||
@@ -641,9 +640,9 @@ AdvSceneSwitcher.hotkey.startStopToggleSwitcherHotkey="Alternar inicio / detenci
|
|||||||
AdvSceneSwitcher.hotkey.macro.pause="Pausar macro %1"
|
AdvSceneSwitcher.hotkey.macro.pause="Pausar macro %1"
|
||||||
AdvSceneSwitcher.hotkey.macro.unpause="Despausar macro %1"
|
AdvSceneSwitcher.hotkey.macro.unpause="Despausar macro %1"
|
||||||
AdvSceneSwitcher.hotkey.macro.togglePause="Alternar pausa de macro %1"
|
AdvSceneSwitcher.hotkey.macro.togglePause="Alternar pausa de macro %1"
|
||||||
AdvSceneSwitcher.hotkey.upMacroSegmentHotkey="Mover selección de segmento de macro hacia arriba"
|
AdvSceneSwitcher.hotkey.macro.segment.up="Mover selección de segmento de macro hacia arriba"
|
||||||
AdvSceneSwitcher.hotkey.downMacroSegmentHotkey="Mover selección de segmento de macro hacia abajo"
|
AdvSceneSwitcher.hotkey.macro.segment.down="Mover selección de segmento de macro hacia abajo"
|
||||||
AdvSceneSwitcher.hotkey.removeMacroSegmentHotkey="Eliminar segmento de macro seleccionado"
|
AdvSceneSwitcher.hotkey.macro.segment.remove="Eliminar segmento de macro seleccionado"
|
||||||
|
|
||||||
AdvSceneSwitcher.askBackup="Se detectó una nueva versión de Advanced Scene Switcher.\n¿Crear una copia de seguridad de la configuración anterior?"
|
AdvSceneSwitcher.askBackup="Se detectó una nueva versión de Advanced Scene Switcher.\n¿Crear una copia de seguridad de la configuración anterior?"
|
||||||
AdvSceneSwitcher.askForMacro="Select macro {{macroSelection}}"
|
AdvSceneSwitcher.askForMacro="Select macro {{macroSelection}}"
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ AdvSceneSwitcher.generalTab.generalBehavior.onNoMatch.switchToRandom="Basculer v
|
|||||||
AdvSceneSwitcher.generalTab.generalBehavior.onNoMatch.switchTo="Basculer vers :"
|
AdvSceneSwitcher.generalTab.generalBehavior.onNoMatch.switchTo="Basculer vers :"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.cooldown="Après avoir effectué des actions, sauter l'exécution d'actions pendant"
|
AdvSceneSwitcher.generalTab.generalBehavior.cooldown="Après avoir effectué des actions, sauter l'exécution d'actions pendant"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.cooldownHint="Pendant cette période, les correspondances potentielles seront ignorées !"
|
AdvSceneSwitcher.generalTab.generalBehavior.cooldownHint="Pendant cette période, les correspondances potentielles seront ignorées !"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.verboseLogging="Activer les journaux détaillés"
|
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.saveWindowGeo="Enregistrer la position et la taille de la fenêtre"
|
AdvSceneSwitcher.generalTab.generalBehavior.saveWindowGeo="Enregistrer la position et la taille de la fenêtre"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.showTrayNotifications="Afficher les notifications dans la zone de notification système"
|
AdvSceneSwitcher.generalTab.generalBehavior.showTrayNotifications="Afficher les notifications dans la zone de notification système"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="Désactiver les indications de l'interface utilisateur"
|
AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="Désactiver les indications de l'interface utilisateur"
|
||||||
@@ -44,7 +43,7 @@ AdvSceneSwitcher.generalTab.saveOrLoadsettings.export="Exporter"
|
|||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.import="Importer"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.import="Importer"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportWindowTitle="Exporter les paramètres d'Advanced Scene Switcher vers un fichier ..."
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportWindowTitle="Exporter les paramètres d'Advanced Scene Switcher vers un fichier ..."
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.importWindowTitle="Importer les paramètres d'Advanced Scene Switcher depuis un fichier ..."
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.importWindowTitle="Importer les paramètres d'Advanced Scene Switcher depuis un fichier ..."
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.textType="Fichiers texte (*.txt)"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.textType="Fichiers texte (*.txt *.json)"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadFail="L'importation des paramètres d'Advanced Scene Switcher a échoué"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadFail="L'importation des paramètres d'Advanced Scene Switcher a échoué"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadSuccess="Les paramètres d'Advanced Scene Switcher ont été importés avec succès"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadSuccess="Les paramètres d'Advanced Scene Switcher ont été importés avec succès"
|
||||||
AdvSceneSwitcher.generalTab.priority.fileContent="Contenu du fichier"
|
AdvSceneSwitcher.generalTab.priority.fileContent="Contenu du fichier"
|
||||||
@@ -258,14 +257,14 @@ AdvSceneSwitcher.condition.video.colorDeviationThresholdDescription="À quel poi
|
|||||||
AdvSceneSwitcher.condition.video.type.main="Sortie principale d'OBS"
|
AdvSceneSwitcher.condition.video.type.main="Sortie principale d'OBS"
|
||||||
AdvSceneSwitcher.condition.video.type.source="Source"
|
AdvSceneSwitcher.condition.video.type.source="Source"
|
||||||
AdvSceneSwitcher.condition.video.type.scene="Scène"
|
AdvSceneSwitcher.condition.video.type.scene="Scène"
|
||||||
AdvSceneSwitcher.condition.video.entry.modelPath="Données du modèle (classificateur de cascade de Haar) :{{modelDataPath}}"
|
AdvSceneSwitcher.condition.video.layout.modelPath="Données du modèle (classificateur de cascade de Haar) :{{modelDataPath}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.minNeighbor="Nombre minimum de voisins :{{minNeighbors}}"
|
AdvSceneSwitcher.condition.video.layout.minNeighbor="Nombre minimum de voisins :{{minNeighbors}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.throttle="{{throttleEnable}}Réduire la charge CPU en effectuant la vérification uniquement toutes les{{throttleCount}}millisecondes"
|
AdvSceneSwitcher.condition.video.layout.throttle="{{throttleEnable}}Réduire la charge CPU en effectuant la vérification uniquement toutes les{{throttleCount}}millisecondes"
|
||||||
AdvSceneSwitcher.condition.video.entry.checkAreaEnable="Effectuer la vérification uniquement dans la zone"
|
AdvSceneSwitcher.condition.video.layout.checkAreaEnable="Effectuer la vérification uniquement dans la zone"
|
||||||
AdvSceneSwitcher.condition.video.entry.orcColorPick="Vérifier la couleur du texte :{{textColor}}{{selectColor}}"
|
AdvSceneSwitcher.condition.video.layout.ocrColorPick="Vérifier la couleur du texte :{{textColor}}{{selectColor}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.orcTextType="Vérifier le type de texte :{{textType}}"
|
AdvSceneSwitcher.condition.video.layout.ocrTextType="Vérifier le type de texte :{{textType}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.orcLanguage="Vérifier la langue :{{languageCode}}"
|
AdvSceneSwitcher.condition.video.layout.ocrLanguage="Vérifier la langue :{{languageCode}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.color="Vérifier la couleur :{{color}}{{selectColor}}"
|
AdvSceneSwitcher.condition.video.layout.color="Vérifier la couleur :{{color}}{{selectColor}}"
|
||||||
AdvSceneSwitcher.condition.video.minSize="Taille minimale :"
|
AdvSceneSwitcher.condition.video.minSize="Taille minimale :"
|
||||||
AdvSceneSwitcher.condition.video.maxSize="Taille maximale :"
|
AdvSceneSwitcher.condition.video.maxSize="Taille maximale :"
|
||||||
AdvSceneSwitcher.condition.video.selectArea="Sélectionner la zone"
|
AdvSceneSwitcher.condition.video.selectArea="Sélectionner la zone"
|
||||||
@@ -704,10 +703,10 @@ AdvSceneSwitcher.action.variable.invalidSelection="Sélection invalide !"
|
|||||||
AdvSceneSwitcher.action.variable.actionNoVariableSupport="La récupération de valeurs de variables à partir d'actions %1 n'est pas prise en charge !"
|
AdvSceneSwitcher.action.variable.actionNoVariableSupport="La récupération de valeurs de variables à partir d'actions %1 n'est pas prise en charge !"
|
||||||
AdvSceneSwitcher.action.variable.conditionNoVariableSupport="La récupération de valeurs de variables à partir de conditions %1 n'est pas prise en charge !"
|
AdvSceneSwitcher.action.variable.conditionNoVariableSupport="La récupération de valeurs de variables à partir de conditions %1 n'est pas prise en charge !"
|
||||||
AdvSceneSwitcher.action.variable.currentSegmentValue="Valeur actuelle :"
|
AdvSceneSwitcher.action.variable.currentSegmentValue="Valeur actuelle :"
|
||||||
AdvSceneSwitcher.action.variable.entry.substringIndex="Début de la sous-chaîne :{{subStringStart}}Taille de la sous-chaîne :{{subStringSize}}"
|
AdvSceneSwitcher.action.variable.layout.substringIndex="Début de la sous-chaîne :{{subStringStart}}Taille de la sous-chaîne :{{subStringSize}}"
|
||||||
AdvSceneSwitcher.action.variable.entry.substringRegex="Attribuer la valeur du match{{regexMatchIdx}}en utilisant une expression régulière :"
|
AdvSceneSwitcher.action.variable.layout.substringRegex="Attribuer la valeur du match{{regexMatchIdx}}en utilisant une expression régulière :"
|
||||||
AdvSceneSwitcher.action.variable.entry.userInput.customPrompt="{{useCustomPrompt}}Utiliser un message personnalisé{{inputPrompt}}"
|
AdvSceneSwitcher.action.variable.layout.userInput.customPrompt="{{useCustomPrompt}}Utiliser un message personnalisé{{inputPrompt}}"
|
||||||
AdvSceneSwitcher.action.variable.entry.userInput.placeholder="{{useInputPlaceholder}}Remplir avec un indicateur de position{{inputPlaceholder}}"
|
AdvSceneSwitcher.action.variable.layout.userInput.placeholder="{{useInputPlaceholder}}Remplir avec un indicateur de position{{inputPlaceholder}}"
|
||||||
AdvSceneSwitcher.action.projector="Projecteur"
|
AdvSceneSwitcher.action.projector="Projecteur"
|
||||||
AdvSceneSwitcher.action.projector.type.source="Source"
|
AdvSceneSwitcher.action.projector.type.source="Source"
|
||||||
AdvSceneSwitcher.action.projector.type.scene="Scène"
|
AdvSceneSwitcher.action.projector.type.scene="Scène"
|
||||||
@@ -921,9 +920,9 @@ AdvSceneSwitcher.hotkey.startStopToggleSwitcherHotkey="Basculer le démarrage/ar
|
|||||||
AdvSceneSwitcher.hotkey.macro.pause="Mettre en pause la macro %1"
|
AdvSceneSwitcher.hotkey.macro.pause="Mettre en pause la macro %1"
|
||||||
AdvSceneSwitcher.hotkey.macro.unpause="Reprendre la macro %1"
|
AdvSceneSwitcher.hotkey.macro.unpause="Reprendre la macro %1"
|
||||||
AdvSceneSwitcher.hotkey.macro.togglePause="Basculer la pause de la macro %1"
|
AdvSceneSwitcher.hotkey.macro.togglePause="Basculer la pause de la macro %1"
|
||||||
AdvSceneSwitcher.hotkey.upMacroSegmentHotkey="Déplacer la sélection du segment de macro vers le haut"
|
AdvSceneSwitcher.hotkey.macro.segment.up="Déplacer la sélection du segment de macro vers le haut"
|
||||||
AdvSceneSwitcher.hotkey.downMacroSegmentHotkey="Déplacer la sélection du segment de macro vers le bas"
|
AdvSceneSwitcher.hotkey.macro.segment.down="Déplacer la sélection du segment de macro vers le bas"
|
||||||
AdvSceneSwitcher.hotkey.removeMacroSegmentHotkey="Supprimer le segment de macro sélectionné"
|
AdvSceneSwitcher.hotkey.macro.segment.remove="Supprimer le segment de macro sélectionné"
|
||||||
|
|
||||||
AdvSceneSwitcher.askBackup="Une nouvelle version du commutateur de scènes avancé a été détectée.\nSouhaitez-vous créer une sauvegarde des anciens paramètres ?"
|
AdvSceneSwitcher.askBackup="Une nouvelle version du commutateur de scènes avancé a été détectée.\nSouhaitez-vous créer une sauvegarde des anciens paramètres ?"
|
||||||
AdvSceneSwitcher.askForMacro="Sélectionnez la macro{{macroSelection}}"
|
AdvSceneSwitcher.askForMacro="Sélectionnez la macro{{macroSelection}}"
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ AdvSceneSwitcher.generalTab.generalBehavior.logLevel="ログレベル:"
|
|||||||
AdvSceneSwitcher.generalTab.generalBehavior.logLevel.default="デフォルト"
|
AdvSceneSwitcher.generalTab.generalBehavior.logLevel.default="デフォルト"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.logLevel.logAction="実行されたアクションのログ"
|
AdvSceneSwitcher.generalTab.generalBehavior.logLevel.logAction="実行されたアクションのログ"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.logLevel.verbose="詳細ログ(Verbose)"
|
AdvSceneSwitcher.generalTab.generalBehavior.logLevel.verbose="詳細ログ(Verbose)"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.verboseLogging="詳細ログを有効にする(生成されるログファイルのサイズが増加します)"
|
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.saveWindowGeo="ウィンドウのサイズと位置を記憶する"
|
AdvSceneSwitcher.generalTab.generalBehavior.saveWindowGeo="ウィンドウのサイズと位置を記憶する"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.showTrayNotifications="システムトレイ通知を表示"
|
AdvSceneSwitcher.generalTab.generalBehavior.showTrayNotifications="システムトレイ通知を表示"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="UIヒントを無効にする"
|
AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="UIヒントを無効にする"
|
||||||
@@ -49,7 +48,7 @@ AdvSceneSwitcher.generalTab.saveOrLoadsettings.export="エクスポート"
|
|||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.import="インポート"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.import="インポート"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportWindowTitle="高機能シーンスイッチャーの設定をファイルにエクスポート..."
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportWindowTitle="高機能シーンスイッチャーの設定をファイルにエクスポート..."
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.importWindowTitle="高機能シーンスイッチャーの設定をファイルからインポート..."
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.importWindowTitle="高機能シーンスイッチャーの設定をファイルからインポート..."
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.textType="テキストファイル(*.txt)"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.textType="テキストファイル(*.txt *.json)"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadFail="高機能シーンスイッチャーの設定インポートに失敗しました"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadFail="高機能シーンスイッチャーの設定インポートに失敗しました"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadSuccess="高機能シーンスイッチャーの設定が正常にインポートされました"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadSuccess="高機能シーンスイッチャーの設定が正常にインポートされました"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportSensitiveDataWarning="警告:\nエクスポートされたデータにはセンシティブ情報が含まれている可能性があります!"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportSensitiveDataWarning="警告:\nエクスポートされたデータにはセンシティブ情報が含まれている可能性があります!"
|
||||||
@@ -380,16 +379,14 @@ AdvSceneSwitcher.condition.video.colorDeviationThresholdDescription="一致と
|
|||||||
AdvSceneSwitcher.condition.video.type.main="OBS's main output"
|
AdvSceneSwitcher.condition.video.type.main="OBS's main output"
|
||||||
AdvSceneSwitcher.condition.video.type.source="ソース"
|
AdvSceneSwitcher.condition.video.type.source="ソース"
|
||||||
AdvSceneSwitcher.condition.video.type.scene="シーン"
|
AdvSceneSwitcher.condition.video.type.scene="シーン"
|
||||||
; AdvSceneSwitcher.condition.video.entry="{{videoInputTypes}}{{sources}}{{scenes}}{{condition}}{{imagePath}}"
|
AdvSceneSwitcher.condition.video.layout.modelPath="モデルデータ (そのカスケード分類子):{{modelDataPath}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.modelPath="モデルデータ (そのカスケード分類子):{{modelDataPath}}"
|
AdvSceneSwitcher.condition.video.layout.minNeighbor="最小近傍数:{{minNeighbors}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.minNeighbor="最小近傍数:{{minNeighbors}}"
|
AdvSceneSwitcher.condition.video.layout.throttle="{{throttleEnable}}:{{throttleCount}}ミリ秒ごとにのみチェックを実行することでCPU負荷を軽減します"
|
||||||
AdvSceneSwitcher.condition.video.entry.throttle="{{throttleEnable}}:{{throttleCount}}ミリ秒ごとにのみチェックを実行することでCPU負荷を軽減します"
|
AdvSceneSwitcher.condition.video.layout.checkAreaEnable="エリア内のみチェックを実施"
|
||||||
AdvSceneSwitcher.condition.video.entry.checkAreaEnable="エリア内のみチェックを実施"
|
AdvSceneSwitcher.condition.video.layout.ocrColorPick="テキストの色の確認:{{textColor}}{{selectColor}}"
|
||||||
; AdvSceneSwitcher.condition.video.entry.checkArea="{{checkAreaEnable}}{{checkArea}}{{selectArea}}"
|
AdvSceneSwitcher.condition.video.layout.ocrTextType="テキストタイプの確認:{{textType}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.orcColorPick="テキストの色の確認:{{textColor}}{{selectColor}}"
|
AdvSceneSwitcher.condition.video.layout.ocrLanguage="言語の確認:{{languageCode}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.orcTextType="テキストタイプの確認:{{textType}}"
|
AdvSceneSwitcher.condition.video.layout.color="カラーを確認してください:{{color}}{{selectColor}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.orcLanguage="言語の確認:{{languageCode}}"
|
|
||||||
AdvSceneSwitcher.condition.video.entry.color="カラーを確認してください:{{color}}{{selectColor}}"
|
|
||||||
AdvSceneSwitcher.condition.video.minSize="最小サイズ:"
|
AdvSceneSwitcher.condition.video.minSize="最小サイズ:"
|
||||||
AdvSceneSwitcher.condition.video.maxSize="最大サイズ:"
|
AdvSceneSwitcher.condition.video.maxSize="最大サイズ:"
|
||||||
AdvSceneSwitcher.condition.video.selectArea="範囲指定"
|
AdvSceneSwitcher.condition.video.selectArea="範囲指定"
|
||||||
@@ -1030,7 +1027,7 @@ AdvSceneSwitcher.action.variable.type.askForValue="入力ダイアログを表
|
|||||||
AdvSceneSwitcher.action.variable.type.environmentVariable="特定の環境変数の値に設定します"
|
AdvSceneSwitcher.action.variable.type.environmentVariable="特定の環境変数の値に設定します"
|
||||||
AdvSceneSwitcher.action.variable.type.sceneItemCount="特定のシーンのシーン項目の数の値にします"
|
AdvSceneSwitcher.action.variable.type.sceneItemCount="特定のシーンのシーン項目の数の値にします"
|
||||||
AdvSceneSwitcher.action.variable.type.stringLength="変数値を指定された入力文字列の長さに設定"
|
AdvSceneSwitcher.action.variable.type.stringLength="変数値を指定された入力文字列の長さに設定"
|
||||||
AdvSceneSwitcher.action.variable.type.extractJson="変数から json フィールドを抽出する"
|
AdvSceneSwitcher.action.variable.type.extractJsonField="変数から json フィールドを抽出する"
|
||||||
AdvSceneSwitcher.action.variable.type.setToTempvar="マクロプロパティに設定"
|
AdvSceneSwitcher.action.variable.type.setToTempvar="マクロプロパティに設定"
|
||||||
AdvSceneSwitcher.action.variable.type.setToTempvar.help="このアクション タイプを使用すると、現在のマクロのセグメントから値を抽出し、それらの値を選択した変数に割り当てることができます。\nたとえば、シーン条件から現在のシーン名を取得し、この名前を変数に割り当てることができます。"
|
AdvSceneSwitcher.action.variable.type.setToTempvar.help="このアクション タイプを使用すると、現在のマクロのセグメントから値を抽出し、それらの値を選択した変数に割り当てることができます。\nたとえば、シーン条件から現在のシーン名を取得し、この名前を変数に割り当てることができます。"
|
||||||
AdvSceneSwitcher.action.variable.type.sceneItemName="インデックスのシーン項目名に設定"
|
AdvSceneSwitcher.action.variable.type.sceneItemName="インデックスのシーン項目名に設定"
|
||||||
@@ -1050,14 +1047,14 @@ AdvSceneSwitcher.action.variable.invalidSelection="選択が無効です!"
|
|||||||
AdvSceneSwitcher.action.variable.actionNoVariableSupport="%1 アクションからの変数値の取得はサポートされていません!"
|
AdvSceneSwitcher.action.variable.actionNoVariableSupport="%1 アクションからの変数値の取得はサポートされていません!"
|
||||||
AdvSceneSwitcher.action.variable.conditionNoVariableSupport="%1 条件からの変数値の取得はサポートされていません!"
|
AdvSceneSwitcher.action.variable.conditionNoVariableSupport="%1 条件からの変数値の取得はサポートされていません!"
|
||||||
AdvSceneSwitcher.action.variable.currentSegmentValue="現在値:"
|
AdvSceneSwitcher.action.variable.currentSegmentValue="現在値:"
|
||||||
; AdvSceneSwitcher.action.variable.entry.other="{{actions}}{{variables}}{{variables2}}{{strValue}}{{numValue}}{{segmentIndex}}{{mathExpression}}{{envVariableName}}{{scenes}}{{tempVars}}{{tempVarsHelp}}{{sceneItemIndex}}{{direction}}{{stringLength}}{{paddingCharSelection}}"
|
; AdvSceneSwitcher.action.variable.layout.other="{{actions}}{{variables}}{{variables2}}{{strValue}}{{numValue}}{{segmentIndex}}{{mathExpression}}{{envVariableName}}{{scenes}}{{tempVars}}{{tempVarsHelp}}{{sceneItemIndex}}{{direction}}{{stringLength}}{{paddingCharSelection}}"
|
||||||
AdvSceneSwitcher.action.variable.entry.pad="{{actions}}の{{variables}}の長さを{{stringLength}}にするには、{{paddingCharSelection}}を{{direction}}に追加します。"
|
AdvSceneSwitcher.action.variable.layout.pad="{{actions}}の{{variables}}の長さを{{stringLength}}にするには、{{paddingCharSelection}}を{{direction}}に追加します。"
|
||||||
AdvSceneSwitcher.action.variable.entry.truncate="{{actions}}の{{variables}}の長さを{{stringLength}}にするには、{{direction}}から文字を削除します。"
|
AdvSceneSwitcher.action.variable.layout.truncate="{{actions}}の{{variables}}の長さを{{stringLength}}にするには、{{direction}}から文字を削除します。"
|
||||||
AdvSceneSwitcher.action.variable.entry.substringIndex="部分文字列の開始:{{subStringStart}}部分文字列のサイズ:{{subStringSize}}"
|
AdvSceneSwitcher.action.variable.layout.substringIndex="部分文字列の開始:{{subStringStart}}部分文字列のサイズ:{{subStringSize}}"
|
||||||
AdvSceneSwitcher.action.variable.entry.substringRegex="正規表現を使用して{{regexMatchIdx}}一致の値を割り当てます:"
|
AdvSceneSwitcher.action.variable.layout.substringRegex="正規表現を使用して{{regexMatchIdx}}一致の値を割り当てます:"
|
||||||
; AdvSceneSwitcher.action.variable.entry.findAndReplace="{{findStr}}{{findRegex}}{{replaceStr}}"
|
; AdvSceneSwitcher.action.variable.layout.findAndReplace="{{findStr}}{{findRegex}}{{replaceStr}}"
|
||||||
AdvSceneSwitcher.action.variable.entry.userInput.customPrompt="{{useCustomPrompt}}カスタム プロンプトを使用する{{inputPrompt}}"
|
AdvSceneSwitcher.action.variable.layout.userInput.customPrompt="{{useCustomPrompt}}カスタム プロンプトを使用する{{inputPrompt}}"
|
||||||
AdvSceneSwitcher.action.variable.entry.userInput.placeholder="{{useInputPlaceholder}}プレースホルダーを入力{{inputPlaceholder}}"
|
AdvSceneSwitcher.action.variable.layout.userInput.placeholder="{{useInputPlaceholder}}プレースホルダーを入力{{inputPlaceholder}}"
|
||||||
AdvSceneSwitcher.action.projector="プロジェクター"
|
AdvSceneSwitcher.action.projector="プロジェクター"
|
||||||
AdvSceneSwitcher.action.projector.type.source="ソース"
|
AdvSceneSwitcher.action.projector.type.source="ソース"
|
||||||
AdvSceneSwitcher.action.projector.type.scene="シーン"
|
AdvSceneSwitcher.action.projector.type.scene="シーン"
|
||||||
@@ -1131,9 +1128,9 @@ AdvSceneSwitcher.hotkey.startStopToggleSwitcherHotkey="高機能シーンスイ
|
|||||||
AdvSceneSwitcher.hotkey.macro.pause="マクロ %1 を一時停止します"
|
AdvSceneSwitcher.hotkey.macro.pause="マクロ %1 を一時停止します"
|
||||||
AdvSceneSwitcher.hotkey.macro.unpause="マクロ %1 の一時停止を解除します"
|
AdvSceneSwitcher.hotkey.macro.unpause="マクロ %1 の一時停止を解除します"
|
||||||
AdvSceneSwitcher.hotkey.macro.togglePause="マクロ %1 の一時停止を切り替えます"
|
AdvSceneSwitcher.hotkey.macro.togglePause="マクロ %1 の一時停止を切り替えます"
|
||||||
AdvSceneSwitcher.hotkey.upMacroSegmentHotkey="マクロセグメント選択を上に移動"
|
AdvSceneSwitcher.hotkey.macro.segment.up="マクロセグメント選択を上に移動"
|
||||||
AdvSceneSwitcher.hotkey.downMacroSegmentHotkey="マクロセグメント選択を下に移動"
|
AdvSceneSwitcher.hotkey.macro.segment.down="マクロセグメント選択を下に移動"
|
||||||
AdvSceneSwitcher.hotkey.removeMacroSegmentHotkey="選択したマクロセグメントを削除"
|
AdvSceneSwitcher.hotkey.macro.segment.remove="選択したマクロセグメントを削除"
|
||||||
|
|
||||||
AdvSceneSwitcher.askBackup="高機能シーンスイッチャーの新しいバージョンが検出されました。\n古い設定のバックアップを作成する必要がありますか?"
|
AdvSceneSwitcher.askBackup="高機能シーンスイッチャーの新しいバージョンが検出されました。\n古い設定のバックアップを作成する必要がありますか?"
|
||||||
AdvSceneSwitcher.askForMacro="マクロ選択{{macroSelection}}"
|
AdvSceneSwitcher.askForMacro="マクロ選択{{macroSelection}}"
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ AdvSceneSwitcher.generalTab.generalBehavior.logLevel="Nível de log:"
|
|||||||
AdvSceneSwitcher.generalTab.generalBehavior.logLevel.default="Padrão"
|
AdvSceneSwitcher.generalTab.generalBehavior.logLevel.default="Padrão"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.logLevel.logAction="Registrar ações executadas"
|
AdvSceneSwitcher.generalTab.generalBehavior.logLevel.logAction="Registrar ações executadas"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.logLevel.verbose="Registro detalhado"
|
AdvSceneSwitcher.generalTab.generalBehavior.logLevel.verbose="Registro detalhado"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.verboseLogging="Ativar registro detalhado"
|
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.saveWindowGeo="Salvar posição e tamanho da janela"
|
AdvSceneSwitcher.generalTab.generalBehavior.saveWindowGeo="Salvar posição e tamanho da janela"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.showTrayNotifications="Mostrar notificações na área de notificação"
|
AdvSceneSwitcher.generalTab.generalBehavior.showTrayNotifications="Mostrar notificações na área de notificação"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="Desativar dicas de interface"
|
AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="Desativar dicas de interface"
|
||||||
@@ -49,7 +48,7 @@ AdvSceneSwitcher.generalTab.saveOrLoadsettings.export="Exportar"
|
|||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.import="Importar"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.import="Importar"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportWindowTitle="Exportar configurações do Advanced Scene Switcher para arquivo ..."
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportWindowTitle="Exportar configurações do Advanced Scene Switcher para arquivo ..."
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.importWindowTitle="Importar configurações do Advanced Scene Switcher de arquivo ..."
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.importWindowTitle="Importar configurações do Advanced Scene Switcher de arquivo ..."
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.textType="Arquivos de texto (*.txt)"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.textType="Arquivos de texto (*.txt *.json)"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadFail="O Advanced Scene Switcher falhou ao importar configurações"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadFail="O Advanced Scene Switcher falhou ao importar configurações"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadSuccess="Configurações do Advanced Scene Switcher importadas com sucesso"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadSuccess="Configurações do Advanced Scene Switcher importadas com sucesso"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportSensitiveDataWarning="Aviso:\nOs dados exportados podem conter informações sensíveis!"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportSensitiveDataWarning="Aviso:\nOs dados exportados podem conter informações sensíveis!"
|
||||||
@@ -373,16 +372,16 @@ AdvSceneSwitcher.condition.video.colorDeviationThresholdDescription="Quão semel
|
|||||||
AdvSceneSwitcher.condition.video.type.main="Saída principal do OBS"
|
AdvSceneSwitcher.condition.video.type.main="Saída principal do OBS"
|
||||||
AdvSceneSwitcher.condition.video.type.source="Fonte"
|
AdvSceneSwitcher.condition.video.type.source="Fonte"
|
||||||
AdvSceneSwitcher.condition.video.type.scene="Cena"
|
AdvSceneSwitcher.condition.video.type.scene="Cena"
|
||||||
AdvSceneSwitcher.condition.video.entry="{{videoInputTypes}}{{sources}}{{scenes}}{{condition}}{{imagePath}}"
|
AdvSceneSwitcher.condition.video.layout="{{videoInputTypes}}{{sources}}{{scenes}}{{condition}}{{imagePath}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.modelPath="Dados do modelo (classificador em cascata haar):{{modelDataPath}}"
|
AdvSceneSwitcher.condition.video.layout.modelPath="Dados do modelo (classificador em cascata haar):{{modelDataPath}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.minNeighbor="Vizinhos mínimos:{{minNeighbors}}"
|
AdvSceneSwitcher.condition.video.layout.minNeighbor="Vizinhos mínimos:{{minNeighbors}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.throttle="{{throttleEnable}}Reduzir carga de CPU realizando a verificação apenas a cada {{throttleCount}} milissegundos"
|
AdvSceneSwitcher.condition.video.layout.throttle="{{throttleEnable}}Reduzir carga de CPU realizando a verificação apenas a cada {{throttleCount}} milissegundos"
|
||||||
AdvSceneSwitcher.condition.video.entry.checkAreaEnable="Realizar verificação apenas na área"
|
AdvSceneSwitcher.condition.video.layout.checkAreaEnable="Realizar verificação apenas na área"
|
||||||
AdvSceneSwitcher.condition.video.entry.checkArea="{{checkAreaEnable}}{{checkArea}}{{selectArea}}"
|
AdvSceneSwitcher.condition.video.layout.checkArea="{{checkAreaEnable}}{{checkArea}}{{selectArea}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.orcColorPick="Verificar cor do texto:{{textColor}}{{selectColor}}"
|
AdvSceneSwitcher.condition.video.layout.ocrColorPick="Verificar cor do texto:{{textColor}}{{selectColor}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.orcTextType="Verificar tipo de texto:{{textType}}"
|
AdvSceneSwitcher.condition.video.layout.ocrTextType="Verificar tipo de texto:{{textType}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.orcLanguage="Verificar idioma:{{languageCode}}"
|
AdvSceneSwitcher.condition.video.layout.ocrLanguage="Verificar idioma:{{languageCode}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.color="Verificar cor:{{color}}{{selectColor}}"
|
AdvSceneSwitcher.condition.video.layout.color="Verificar cor:{{color}}{{selectColor}}"
|
||||||
AdvSceneSwitcher.condition.video.minSize="Tamanho mínimo:"
|
AdvSceneSwitcher.condition.video.minSize="Tamanho mínimo:"
|
||||||
AdvSceneSwitcher.condition.video.maxSize="Tamanho máximo:"
|
AdvSceneSwitcher.condition.video.maxSize="Tamanho máximo:"
|
||||||
AdvSceneSwitcher.condition.video.selectArea="Selecionar área"
|
AdvSceneSwitcher.condition.video.selectArea="Selecionar área"
|
||||||
@@ -1012,7 +1011,7 @@ AdvSceneSwitcher.action.variable.type.askForValue="Obter entrada do usuário"
|
|||||||
AdvSceneSwitcher.action.variable.type.environmentVariable="Definir valor da variável de ambiente"
|
AdvSceneSwitcher.action.variable.type.environmentVariable="Definir valor da variável de ambiente"
|
||||||
AdvSceneSwitcher.action.variable.type.sceneItemCount="Definir para contagem de itens de cena"
|
AdvSceneSwitcher.action.variable.type.sceneItemCount="Definir para contagem de itens de cena"
|
||||||
AdvSceneSwitcher.action.variable.type.stringLength="Definir comprimento da string"
|
AdvSceneSwitcher.action.variable.type.stringLength="Definir comprimento da string"
|
||||||
AdvSceneSwitcher.action.variable.type.extractJson="Extrair campo json com nome"
|
AdvSceneSwitcher.action.variable.type.extractJsonField="Extrair campo json com nome"
|
||||||
AdvSceneSwitcher.action.variable.type.setToTempvar="Definir para propriedade da macro"
|
AdvSceneSwitcher.action.variable.type.setToTempvar="Definir para propriedade da macro"
|
||||||
AdvSceneSwitcher.action.variable.type.setToTempvar.help="Este tipo de ação permite extrair valores de segmentos da macro atual e atribuir esses valores à variável selecionada.\nPor exemplo, você pode obter o nome da cena atual de uma condição de cena e atribuir esse nome a uma variável."
|
AdvSceneSwitcher.action.variable.type.setToTempvar.help="Este tipo de ação permite extrair valores de segmentos da macro atual e atribuir esses valores à variável selecionada.\nPor exemplo, você pode obter o nome da cena atual de uma condição de cena e atribuir esse nome a uma variável."
|
||||||
AdvSceneSwitcher.action.variable.type.sceneItemName="Definir para nome do item de cena no índice"
|
AdvSceneSwitcher.action.variable.type.sceneItemName="Definir para nome do item de cena no índice"
|
||||||
@@ -1032,13 +1031,13 @@ AdvSceneSwitcher.action.variable.invalidSelection="Seleção inválida!"
|
|||||||
AdvSceneSwitcher.action.variable.actionNoVariableSupport="Obter valores de variáveis das ações %1 não é suportado!"
|
AdvSceneSwitcher.action.variable.actionNoVariableSupport="Obter valores de variáveis das ações %1 não é suportado!"
|
||||||
AdvSceneSwitcher.action.variable.conditionNoVariableSupport="Obter valores de variáveis das condições %1 não é suportado!"
|
AdvSceneSwitcher.action.variable.conditionNoVariableSupport="Obter valores de variáveis das condições %1 não é suportado!"
|
||||||
AdvSceneSwitcher.action.variable.currentSegmentValue="Valor atual:"
|
AdvSceneSwitcher.action.variable.currentSegmentValue="Valor atual:"
|
||||||
AdvSceneSwitcher.action.variable.entry.pad="{{actions}}de{{variables}}para comprimento{{stringLength}}adicionando{{paddingCharSelection}}ao{{direction}}"
|
AdvSceneSwitcher.action.variable.layout.pad="{{actions}}de{{variables}}para comprimento{{stringLength}}adicionando{{paddingCharSelection}}ao{{direction}}"
|
||||||
AdvSceneSwitcher.action.variable.entry.truncate="{{actions}}de{{variables}}para comprimento{{stringLength}}removendo caracteres da{{direction}}"
|
AdvSceneSwitcher.action.variable.layout.truncate="{{actions}}de{{variables}}para comprimento{{stringLength}}removendo caracteres da{{direction}}"
|
||||||
AdvSceneSwitcher.action.variable.entry.substringIndex="Início da substring:{{subStringStart}}Tamanho da substring:{{subStringSize}}"
|
AdvSceneSwitcher.action.variable.layout.substringIndex="Início da substring:{{subStringStart}}Tamanho da substring:{{subStringSize}}"
|
||||||
AdvSceneSwitcher.action.variable.entry.substringRegex="Atribuir valor do{{regexMatchIdx}}correspondência usando expressão regular:"
|
AdvSceneSwitcher.action.variable.layout.substringRegex="Atribuir valor do{{regexMatchIdx}}correspondência usando expressão regular:"
|
||||||
AdvSceneSwitcher.action.variable.entry.findAndReplace="{{findStr}}{{findRegex}}{{replaceStr}}"
|
AdvSceneSwitcher.action.variable.layout.findAndReplace="{{findStr}}{{findRegex}}{{replaceStr}}"
|
||||||
AdvSceneSwitcher.action.variable.entry.userInput.customPrompt="{{useCustomPrompt}}Usar prompt personalizado{{inputPrompt}}"
|
AdvSceneSwitcher.action.variable.layout.userInput.customPrompt="{{useCustomPrompt}}Usar prompt personalizado{{inputPrompt}}"
|
||||||
AdvSceneSwitcher.action.variable.entry.userInput.placeholder="{{useInputPlaceholder}}Preencher com placeholder{{inputPlaceholder}}"
|
AdvSceneSwitcher.action.variable.layout.userInput.placeholder="{{useInputPlaceholder}}Preencher com placeholder{{inputPlaceholder}}"
|
||||||
AdvSceneSwitcher.action.projector="Projetor"
|
AdvSceneSwitcher.action.projector="Projetor"
|
||||||
AdvSceneSwitcher.action.projector.type.source="Fonte"
|
AdvSceneSwitcher.action.projector.type.source="Fonte"
|
||||||
AdvSceneSwitcher.action.projector.type.scene="Cena"
|
AdvSceneSwitcher.action.projector.type.scene="Cena"
|
||||||
@@ -1112,9 +1111,9 @@ AdvSceneSwitcher.hotkey.startStopToggleSwitcherHotkey="Alternar Iniciar/Parar pa
|
|||||||
AdvSceneSwitcher.hotkey.macro.pause="Pausar macro %1"
|
AdvSceneSwitcher.hotkey.macro.pause="Pausar macro %1"
|
||||||
AdvSceneSwitcher.hotkey.macro.unpause="Retomar macro %1"
|
AdvSceneSwitcher.hotkey.macro.unpause="Retomar macro %1"
|
||||||
AdvSceneSwitcher.hotkey.macro.togglePause="Alternar pausa da macro %1"
|
AdvSceneSwitcher.hotkey.macro.togglePause="Alternar pausa da macro %1"
|
||||||
AdvSceneSwitcher.hotkey.upMacroSegmentHotkey="Mover seleção de segmento de macro para cima"
|
AdvSceneSwitcher.hotkey.macro.segment.up="Mover seleção de segmento de macro para cima"
|
||||||
AdvSceneSwitcher.hotkey.downMacroSegmentHotkey="Mover seleção de segmento de macro para baixo"
|
AdvSceneSwitcher.hotkey.macro.segment.down="Mover seleção de segmento de macro para baixo"
|
||||||
AdvSceneSwitcher.hotkey.removeMacroSegmentHotkey="Remover segmento de macro selecionado"
|
AdvSceneSwitcher.hotkey.macro.segment.remove="Remover segmento de macro selecionado"
|
||||||
|
|
||||||
AdvSceneSwitcher.askBackup="Detectada uma nova versão do Advanced Scene Switcher.\nDeve ser criado um backup das configurações antigas?"
|
AdvSceneSwitcher.askBackup="Detectada uma nova versão do Advanced Scene Switcher.\nDeve ser criado um backup das configurações antigas?"
|
||||||
AdvSceneSwitcher.askForMacro="Selecionar macro{{macroSelection}}"
|
AdvSceneSwitcher.askForMacro="Selecionar macro{{macroSelection}}"
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ AdvSceneSwitcher.generalTab.generalBehavior.onNoMatch.dontSwitch="Не пере
|
|||||||
AdvSceneSwitcher.generalTab.generalBehavior.onNoMatch.switchToRandom="Переключиться на любую сцену на вкладке Random"
|
AdvSceneSwitcher.generalTab.generalBehavior.onNoMatch.switchToRandom="Переключиться на любую сцену на вкладке Random"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.onNoMatch.switchTo="Переключиться на:"
|
AdvSceneSwitcher.generalTab.generalBehavior.onNoMatch.switchTo="Переключиться на:"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.cooldownHint="В течение этого времени потенциальные совпадения будут игнорироваться!"
|
AdvSceneSwitcher.generalTab.generalBehavior.cooldownHint="В течение этого времени потенциальные совпадения будут игнорироваться!"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.verboseLogging="Включить ведение подробного журнала"
|
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.saveWindowGeo="Сохранять положение и размер окна"
|
AdvSceneSwitcher.generalTab.generalBehavior.saveWindowGeo="Сохранять положение и размер окна"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="Отключить подсказки пользовательского интерфейса"
|
AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="Отключить подсказки пользовательского интерфейса"
|
||||||
AdvSceneSwitcher.generalTab.priority="Приоритет"
|
AdvSceneSwitcher.generalTab.priority="Приоритет"
|
||||||
@@ -37,7 +36,7 @@ AdvSceneSwitcher.generalTab.saveOrLoadsettings.export="Экспорт"
|
|||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.import="Импорт"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.import="Импорт"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportWindowTitle="Экспортировать настройки расширенного переключателя сцен в файл ..."
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportWindowTitle="Экспортировать настройки расширенного переключателя сцен в файл ..."
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.importWindowTitle="Импортировать настройки Advanced Scene Switcher из файла ..."
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.importWindowTitle="Импортировать настройки Advanced Scene Switcher из файла ..."
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.textType="Текстовые файлы (*.txt)"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.textType="Текстовые файлы (*.txt *.json)"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadFail="Advanced Scene Switcher не удалось импортировать настройки"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadFail="Advanced Scene Switcher не удалось импортировать настройки"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadSuccess="Настройки Advanced Scene Switcher импортированы успешно"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadSuccess="Настройки Advanced Scene Switcher импортированы успешно"
|
||||||
AdvSceneSwitcher.generalTab.priority.fileContent="Содержание файла"
|
AdvSceneSwitcher.generalTab.priority.fileContent="Содержание файла"
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ AdvSceneSwitcher.generalTab.generalBehavior.onNoMatch.switchToRandom="Rastgele s
|
|||||||
AdvSceneSwitcher.generalTab.generalBehavior.onNoMatch.switchTo="Değiştirmek:"
|
AdvSceneSwitcher.generalTab.generalBehavior.onNoMatch.switchTo="Değiştirmek:"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.cooldown="Bir eşleşmeden sonra aşağıdakiler için işlem yapmayın:"
|
AdvSceneSwitcher.generalTab.generalBehavior.cooldown="Bir eşleşmeden sonra aşağıdakiler için işlem yapmayın:"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.cooldownHint="Bu süre zarfında olası eşleşmeler göz ardı edilecektir!"
|
AdvSceneSwitcher.generalTab.generalBehavior.cooldownHint="Bu süre zarfında olası eşleşmeler göz ardı edilecektir!"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.verboseLogging="Ayrıntılı günlük kaydını etkinleştir"
|
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.saveWindowGeo="Pencere konumunu ve boyutunu kaydet"
|
AdvSceneSwitcher.generalTab.generalBehavior.saveWindowGeo="Pencere konumunu ve boyutunu kaydet"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.showTrayNotifications="Sistem tepsisi bildirimlerini göster"
|
AdvSceneSwitcher.generalTab.generalBehavior.showTrayNotifications="Sistem tepsisi bildirimlerini göster"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="UI ipuçlarını devre dışı bırak"
|
AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="UI ipuçlarını devre dışı bırak"
|
||||||
@@ -39,7 +38,7 @@ AdvSceneSwitcher.generalTab.saveOrLoadsettings.export="Dışa Aktar"
|
|||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.import="İçe Aktar"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.import="İçe Aktar"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportWindowTitle="Gelişmiş Sahne Değiştirici ayarlarını dosyaya aktar ..."
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportWindowTitle="Gelişmiş Sahne Değiştirici ayarlarını dosyaya aktar ..."
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.importWindowTitle="Gelişmiş Sahne Değiştirici ayarlarını dosyadan içe aktar ..."
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.importWindowTitle="Gelişmiş Sahne Değiştirici ayarlarını dosyadan içe aktar ..."
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.textType="Text dosyası (*.txt)"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.textType="Text dosyası (*.txt *.json)"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadFail="Gelişmiş Sahne Değiştirici ayarları dosyadan içe aktarmakta başarısız oldu"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadFail="Gelişmiş Sahne Değiştirici ayarları dosyadan içe aktarmakta başarısız oldu"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadSuccess="Gelişmiş Sahne Değiştirici ayarları başarılı bir şekilde dosyadan içe aktarıldı"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadSuccess="Gelişmiş Sahne Değiştirici ayarları başarılı bir şekilde dosyadan içe aktarıldı"
|
||||||
AdvSceneSwitcher.generalTab.priority.fileContent="Dosya İçeriği"
|
AdvSceneSwitcher.generalTab.priority.fileContent="Dosya İçeriği"
|
||||||
@@ -140,10 +139,10 @@ AdvSceneSwitcher.condition.video.screenshotFail="Kaynağın ekran görüntüsü
|
|||||||
AdvSceneSwitcher.condition.video.patternMatchFail="Desen bulunamadı!"
|
AdvSceneSwitcher.condition.video.patternMatchFail="Desen bulunamadı!"
|
||||||
AdvSceneSwitcher.condition.video.objectMatchFail="Nesne bulunamadı!"
|
AdvSceneSwitcher.condition.video.objectMatchFail="Nesne bulunamadı!"
|
||||||
AdvSceneSwitcher.condition.video.modelLoadFail="Model verileri yüklenemedi!"
|
AdvSceneSwitcher.condition.video.modelLoadFail="Model verileri yüklenemedi!"
|
||||||
AdvSceneSwitcher.condition.video.entry="{{videoInputTypes}}{{sources}}{{scenes}}{{condition}}{{imagePath}}"
|
AdvSceneSwitcher.condition.video.layout="{{videoInputTypes}}{{sources}}{{scenes}}{{condition}}{{imagePath}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.modelPath="Model verileri (haar kademeli sınıflandırıcı):{{modelDataPath}}"
|
AdvSceneSwitcher.condition.video.layout.modelPath="Model verileri (haar kademeli sınıflandırıcı):{{modelDataPath}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.minNeighbor="Minimum komşular: {{minNeighbors}}"
|
AdvSceneSwitcher.condition.video.layout.minNeighbor="Minimum komşular: {{minNeighbors}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.throttle="{{throttleEnable}} Yalnızca her seferinde kontrol gerçekleştirerek CPU yükünü azaltın {{throttleCount}} millisaniyeler"
|
AdvSceneSwitcher.condition.video.layout.throttle="{{throttleEnable}} Yalnızca her seferinde kontrol gerçekleştirerek CPU yükünü azaltın {{throttleCount}} millisaniyeler"
|
||||||
AdvSceneSwitcher.condition.stream="Yayınlama"
|
AdvSceneSwitcher.condition.stream="Yayınlama"
|
||||||
AdvSceneSwitcher.condition.stream.state.start="Yayın çalışıyor"
|
AdvSceneSwitcher.condition.stream.state.start="Yayın çalışıyor"
|
||||||
AdvSceneSwitcher.condition.stream.state.stop="Yayın durdu"
|
AdvSceneSwitcher.condition.stream.state.stop="Yayın durdu"
|
||||||
|
|||||||
@@ -33,7 +33,6 @@ AdvSceneSwitcher.generalTab.generalBehavior.logLevel.default="默认"
|
|||||||
AdvSceneSwitcher.generalTab.generalBehavior.logLevel.logMacro="记录已执行的宏"
|
AdvSceneSwitcher.generalTab.generalBehavior.logLevel.logMacro="记录已执行的宏"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.logLevel.logAction="记录已执行的操作"
|
AdvSceneSwitcher.generalTab.generalBehavior.logLevel.logAction="记录已执行的操作"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.logLevel.verbose="记录所有信息"
|
AdvSceneSwitcher.generalTab.generalBehavior.logLevel.verbose="记录所有信息"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.verboseLogging="详细日志输出"
|
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.saveWindowGeo="保存窗口位置和大小"
|
AdvSceneSwitcher.generalTab.generalBehavior.saveWindowGeo="保存窗口位置和大小"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.showTrayNotifications="显示系统托盘通知"
|
AdvSceneSwitcher.generalTab.generalBehavior.showTrayNotifications="显示系统托盘通知"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="禁用UI提示"
|
AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="禁用UI提示"
|
||||||
@@ -52,7 +51,7 @@ AdvSceneSwitcher.generalTab.saveOrLoadsettings.export="导出设置"
|
|||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.import="导入设置"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.import="导入设置"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportWindowTitle="导出高级场景切换器到文件..."
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportWindowTitle="导出高级场景切换器到文件..."
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.importWindowTitle="导入高级场景切换器到文件..."
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.importWindowTitle="导入高级场景切换器到文件..."
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.textType="文本文件 (*.txt)"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.textType="文本文件 (*.txt *.json)"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadFail="高级场景切换器导入设置失败"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadFail="高级场景切换器导入设置失败"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadSuccess="高级场景切换器导入设置成功"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadSuccess="高级场景切换器导入设置成功"
|
||||||
AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportSensitiveDataWarning="警告:\n导出的数据可能包含敏感信息!"
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportSensitiveDataWarning="警告:\n导出的数据可能包含敏感信息!"
|
||||||
@@ -396,16 +395,16 @@ AdvSceneSwitcher.condition.video.colorDeviationThresholdDescription="颜色与
|
|||||||
AdvSceneSwitcher.condition.video.type.main="OBS的主输出"
|
AdvSceneSwitcher.condition.video.type.main="OBS的主输出"
|
||||||
AdvSceneSwitcher.condition.video.type.source="源"
|
AdvSceneSwitcher.condition.video.type.source="源"
|
||||||
AdvSceneSwitcher.condition.video.type.scene="场景"
|
AdvSceneSwitcher.condition.video.type.scene="场景"
|
||||||
AdvSceneSwitcher.condition.video.entry="{{videoInputTypes}}{{sources}}{{scenes}}{{condition}}{{imagePath}}"
|
AdvSceneSwitcher.condition.video.layout="{{videoInputTypes}}{{sources}}{{scenes}}{{condition}}{{imagePath}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.modelPath="模型数据 (haar级联分类器): {{modelDataPath}}"
|
AdvSceneSwitcher.condition.video.layout.modelPath="模型数据 (haar级联分类器): {{modelDataPath}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.minNeighbor="最小区域: {{minNeighbors}}"
|
AdvSceneSwitcher.condition.video.layout.minNeighbor="最小区域: {{minNeighbors}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.throttle="{{throttleEnable}}每隔{{throttleCount}} 毫秒,才执行一次检查,从而减少 CPU 负载."
|
AdvSceneSwitcher.condition.video.layout.throttle="{{throttleEnable}}每隔{{throttleCount}} 毫秒,才执行一次检查,从而减少 CPU 负载."
|
||||||
AdvSceneSwitcher.condition.video.entry.checkAreaEnable="仅在区域内执行检查"
|
AdvSceneSwitcher.condition.video.layout.checkAreaEnable="仅在区域内执行检查"
|
||||||
AdvSceneSwitcher.condition.video.entry.checkArea="{{checkAreaEnable}}{{checkArea}}{{selectArea}}"
|
AdvSceneSwitcher.condition.video.layout.checkArea="{{checkAreaEnable}}{{checkArea}}{{selectArea}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.orcColorPick="文本检查颜色:{{textColor}}{{selectColor}}"
|
AdvSceneSwitcher.condition.video.layout.ocrColorPick="文本检查颜色:{{textColor}}{{selectColor}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.orcTextType="文本检查类型:{{textType}}"
|
AdvSceneSwitcher.condition.video.layout.ocrTextType="文本检查类型:{{textType}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.orcLanguage="语言检查:{{languageCode}}"
|
AdvSceneSwitcher.condition.video.layout.ocrLanguage="语言检查:{{languageCode}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.color="颜色检查:{{color}}{{selectColor}}"
|
AdvSceneSwitcher.condition.video.layout.color="颜色检查:{{color}}{{selectColor}}"
|
||||||
AdvSceneSwitcher.condition.video.minSize="最小尺寸:"
|
AdvSceneSwitcher.condition.video.minSize="最小尺寸:"
|
||||||
AdvSceneSwitcher.condition.video.maxSize="最大尺寸:"
|
AdvSceneSwitcher.condition.video.maxSize="最大尺寸:"
|
||||||
AdvSceneSwitcher.condition.video.selectArea="选择区域"
|
AdvSceneSwitcher.condition.video.selectArea="选择区域"
|
||||||
@@ -1073,7 +1072,7 @@ AdvSceneSwitcher.action.variable.type.askForValue="获取用户输入内容"
|
|||||||
AdvSceneSwitcher.action.variable.type.environmentVariable="设置为环境变量值"
|
AdvSceneSwitcher.action.variable.type.environmentVariable="设置为环境变量值"
|
||||||
AdvSceneSwitcher.action.variable.type.sceneItemCount="设置为场景内的场景项目计数"
|
AdvSceneSwitcher.action.variable.type.sceneItemCount="设置为场景内的场景项目计数"
|
||||||
AdvSceneSwitcher.action.variable.type.stringLength="设置为字符串长度"
|
AdvSceneSwitcher.action.variable.type.stringLength="设置为字符串长度"
|
||||||
AdvSceneSwitcher.action.variable.type.extractJson="取JSON内字段的值"
|
AdvSceneSwitcher.action.variable.type.extractJsonField="取JSON内字段的值"
|
||||||
AdvSceneSwitcher.action.variable.type.setToTempvar="设置为宏属性"
|
AdvSceneSwitcher.action.variable.type.setToTempvar="设置为宏属性"
|
||||||
AdvSceneSwitcher.action.variable.type.setToTempvar.help="此操作类型将允许您从当前宏的部分中提取值,并将这些值分配给所选变量.\n例如,可以从场景条件中获取当前场景名称,并将该名称分配给变量."
|
AdvSceneSwitcher.action.variable.type.setToTempvar.help="此操作类型将允许您从当前宏的部分中提取值,并将这些值分配给所选变量.\n例如,可以从场景条件中获取当前场景名称,并将该名称分配给变量."
|
||||||
AdvSceneSwitcher.action.variable.type.sceneItemName="设置为场景项目索引的名称"
|
AdvSceneSwitcher.action.variable.type.sceneItemName="设置为场景项目索引的名称"
|
||||||
@@ -1102,15 +1101,14 @@ AdvSceneSwitcher.action.variable.invalidSelection="无效选择!"
|
|||||||
AdvSceneSwitcher.action.variable.actionNoVariableSupport="不支持从 %1 操作中获取变量值!"
|
AdvSceneSwitcher.action.variable.actionNoVariableSupport="不支持从 %1 操作中获取变量值!"
|
||||||
AdvSceneSwitcher.action.variable.conditionNoVariableSupport="不支持从 %1 条件中获取变量值!"
|
AdvSceneSwitcher.action.variable.conditionNoVariableSupport="不支持从 %1 条件中获取变量值!"
|
||||||
AdvSceneSwitcher.action.variable.currentSegmentValue="当前值:"
|
AdvSceneSwitcher.action.variable.currentSegmentValue="当前值:"
|
||||||
AdvSceneSwitcher.action.variable.entry.other="{{actions}}{{variables}}{{variables2}}{{strValue}}{{numValue}}{{segmentIndex}}{{mathExpression}}{{envVariableName}}{{scenes}}{{tempVars}}{{tempVarsHelp}}{{sceneItemIndex}}{{direction}}{{stringLength}}{{paddingCharSelection}}{{caseType}}"
|
AdvSceneSwitcher.action.variable.layout.pad="{{actions}}于{{variables}}的{{direction}}起,内容为{{paddingCharSelection}}将其变量值长度增加至{{stringLength}}."
|
||||||
AdvSceneSwitcher.action.variable.entry.pad="{{actions}}于{{variables}}的{{direction}}起,内容为{{paddingCharSelection}}将其变量值长度增加至{{stringLength}}."
|
AdvSceneSwitcher.action.variable.layout.truncate="{{actions}}于{{variables}}的{{direction}}起,将变量长度缩减至{{stringLength}}"
|
||||||
AdvSceneSwitcher.action.variable.entry.truncate="{{actions}}于{{variables}}的{{direction}}起,将变量长度缩减至{{stringLength}}"
|
AdvSceneSwitcher.action.variable.layout.substringIndex="截取字符串开始位置:{{subStringStart}} 截取字符串长度:{{subStringSize}}"
|
||||||
AdvSceneSwitcher.action.variable.entry.substringIndex="截取字符串开始位置:{{subStringStart}} 截取字符串长度:{{subStringSize}}"
|
AdvSceneSwitcher.action.variable.layout.substringRegex="使用正则表达式为 {{regexMatchIdx}} 匹配的值:"
|
||||||
AdvSceneSwitcher.action.variable.entry.substringRegex="使用正则表达式为 {{regexMatchIdx}} 匹配的值:"
|
AdvSceneSwitcher.action.variable.layout.findAndReplace="{{findStr}}{{findRegex}}{{replaceStr}}"
|
||||||
AdvSceneSwitcher.action.variable.entry.findAndReplace="{{findStr}}{{findRegex}}{{replaceStr}}"
|
AdvSceneSwitcher.action.variable.layout.userInput.customPrompt="{{useCustomPrompt}}使用自定义提示{{inputPrompt}}"
|
||||||
AdvSceneSwitcher.action.variable.entry.userInput.customPrompt="{{useCustomPrompt}}使用自定义提示{{inputPrompt}}"
|
AdvSceneSwitcher.action.variable.layout.userInput.placeholder="{{useInputPlaceholder}}用占位符填充{{inputPlaceholder}}"
|
||||||
AdvSceneSwitcher.action.variable.entry.userInput.placeholder="{{useInputPlaceholder}}用占位符填充{{inputPlaceholder}}"
|
AdvSceneSwitcher.action.variable.layout.randomNumber="在以下范围内生成随机数{{randomNumberStart}}到{{randomNumberEnd}}"
|
||||||
AdvSceneSwitcher.action.variable.entry.randomNumber="在以下范围内生成随机数{{randomNumberStart}}到{{randomNumberEnd}}"
|
|
||||||
AdvSceneSwitcher.action.projector="投影仪"
|
AdvSceneSwitcher.action.projector="投影仪"
|
||||||
AdvSceneSwitcher.action.projector.type.source="源"
|
AdvSceneSwitcher.action.projector.type.source="源"
|
||||||
AdvSceneSwitcher.action.projector.type.scene="场景"
|
AdvSceneSwitcher.action.projector.type.scene="场景"
|
||||||
@@ -1191,9 +1189,9 @@ AdvSceneSwitcher.hotkey.startStopToggleSwitcherHotkey="切换(启动/停止)高
|
|||||||
AdvSceneSwitcher.hotkey.macro.pause="停用宏 %1"
|
AdvSceneSwitcher.hotkey.macro.pause="停用宏 %1"
|
||||||
AdvSceneSwitcher.hotkey.macro.unpause="启用宏 %1"
|
AdvSceneSwitcher.hotkey.macro.unpause="启用宏 %1"
|
||||||
AdvSceneSwitcher.hotkey.macro.togglePause="切换(停用/启用)宏 %1"
|
AdvSceneSwitcher.hotkey.macro.togglePause="切换(停用/启用)宏 %1"
|
||||||
AdvSceneSwitcher.hotkey.upMacroSegmentHotkey="上移选择宏"
|
AdvSceneSwitcher.hotkey.macro.segment.up="上移选择宏"
|
||||||
AdvSceneSwitcher.hotkey.downMacroSegmentHotkey="下移选择宏"
|
AdvSceneSwitcher.hotkey.macro.segment.down="下移选择宏"
|
||||||
AdvSceneSwitcher.hotkey.removeMacroSegmentHotkey="删除选定的宏"
|
AdvSceneSwitcher.hotkey.macro.segment.remove="删除选定的宏"
|
||||||
|
|
||||||
AdvSceneSwitcher.askBackup="检测到新版本的高级场景切换器。\n是否要创建旧版本的设置备份?"
|
AdvSceneSwitcher.askBackup="检测到新版本的高级场景切换器。\n是否要创建旧版本的设置备份?"
|
||||||
AdvSceneSwitcher.askForMacro="选择宏 {{macroSelection}}"
|
AdvSceneSwitcher.askForMacro="选择宏 {{macroSelection}}"
|
||||||
|
|||||||
1
deps/date
vendored
Submodule
1
deps/date
vendored
Submodule
Submodule deps/date added at 5bdb7e6f31
1
deps/jsoncons
vendored
Submodule
1
deps/jsoncons
vendored
Submodule
Submodule deps/jsoncons added at 64b9da1e9f
1
deps/paho.mqtt.cpp
vendored
Submodule
1
deps/paho.mqtt.cpp
vendored
Submodule
Submodule deps/paho.mqtt.cpp added at 165476b1dc
@@ -181,28 +181,7 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QComboBox" name="logLevel">
|
<widget class="QComboBox" name="logLevel"/>
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>AdvSceneSwitcher.generalTab.generalBehavior.logLevel.default</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>AdvSceneSwitcher.generalTab.generalBehavior.logLevel.logMacro</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>AdvSceneSwitcher.generalTab.generalBehavior.logLevel.logAction</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>AdvSceneSwitcher.generalTab.generalBehavior.logLevel.verbose</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
</widget>
|
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<spacer name="horizontalSpacer_49">
|
<spacer name="horizontalSpacer_49">
|
||||||
@@ -315,6 +294,17 @@
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_12">
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="disableMacroWidgetCache">
|
||||||
|
<property name="text">
|
||||||
|
<string>AdvSceneSwitcher.generalTab.generalBehavior.disableMacroWidgetCache</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_26">
|
<layout class="QHBoxLayout" name="horizontalLayout_26">
|
||||||
<item>
|
<item>
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ namespace advss {
|
|||||||
|
|
||||||
class MacroActionEdit;
|
class MacroActionEdit;
|
||||||
class MacroConditionEdit;
|
class MacroConditionEdit;
|
||||||
|
class MacroSegment;
|
||||||
class Duration;
|
class Duration;
|
||||||
class SequenceWidget;
|
class SequenceWidget;
|
||||||
struct SceneGroup;
|
struct SceneGroup;
|
||||||
@@ -66,6 +67,7 @@ public slots:
|
|||||||
void on_showTrayNotifications_stateChanged(int state);
|
void on_showTrayNotifications_stateChanged(int state);
|
||||||
void on_uiHintsDisable_stateChanged(int state);
|
void on_uiHintsDisable_stateChanged(int state);
|
||||||
void on_disableComboBoxFilter_stateChanged(int state);
|
void on_disableComboBoxFilter_stateChanged(int state);
|
||||||
|
void on_disableMacroWidgetCache_stateChanged(int state);
|
||||||
void on_warnPluginLoadFailure_stateChanged(int state);
|
void on_warnPluginLoadFailure_stateChanged(int state);
|
||||||
void on_hideLegacyTabs_stateChanged(int state);
|
void on_hideLegacyTabs_stateChanged(int state);
|
||||||
void on_priorityUp_clicked();
|
void on_priorityUp_clicked();
|
||||||
@@ -82,19 +84,21 @@ public:
|
|||||||
void RemoveMacro(std::shared_ptr<Macro> &);
|
void RemoveMacro(std::shared_ptr<Macro> &);
|
||||||
void RemoveSelectedMacros();
|
void RemoveSelectedMacros();
|
||||||
void RenameMacro(std::shared_ptr<Macro> &, const QString &name);
|
void RenameMacro(std::shared_ptr<Macro> &, const QString &name);
|
||||||
std::shared_ptr<Macro> GetSelectedMacro();
|
std::shared_ptr<Macro> GetSelectedMacro() const;
|
||||||
std::vector<std::shared_ptr<Macro>> GetSelectedMacros();
|
std::vector<std::shared_ptr<Macro>> GetSelectedMacros() const;
|
||||||
void SetEditMacro(Macro &m);
|
void SetEditMacro(Macro &m);
|
||||||
void SetMacroEditAreaDisabled(bool);
|
void SetMacroEditAreaDisabled(bool) const;
|
||||||
void HighlightAction(int idx, QColor color = QColor(Qt::green));
|
void HighlightAction(int idx, QColor color = QColor(Qt::green)) const;
|
||||||
void HighlightElseAction(int idx, QColor color = QColor(Qt::green));
|
void HighlightElseAction(int idx,
|
||||||
void HighlightCondition(int idx, QColor color = QColor(Qt::green));
|
QColor color = QColor(Qt::green)) const;
|
||||||
|
void HighlightCondition(int idx,
|
||||||
|
QColor color = QColor(Qt::green)) const;
|
||||||
void PopulateMacroActions(Macro &m, uint32_t afterIdx = 0);
|
void PopulateMacroActions(Macro &m, uint32_t afterIdx = 0);
|
||||||
void PopulateMacroElseActions(Macro &m, uint32_t afterIdx = 0);
|
void PopulateMacroElseActions(Macro &m, uint32_t afterIdx = 0);
|
||||||
void PopulateMacroConditions(Macro &m, uint32_t afterIdx = 0);
|
void PopulateMacroConditions(Macro &m, uint32_t afterIdx = 0);
|
||||||
void SetActionData(Macro &m);
|
void SetActionData(Macro &m) const;
|
||||||
void SetElseActionData(Macro &m);
|
void SetElseActionData(Macro &m) const;
|
||||||
void SetConditionData(Macro &m);
|
void SetConditionData(Macro &m) const;
|
||||||
void SwapActions(Macro *m, int pos1, int pos2);
|
void SwapActions(Macro *m, int pos1, int pos2);
|
||||||
void SwapConditions(Macro *m, int pos1, int pos2);
|
void SwapConditions(Macro *m, int pos1, int pos2);
|
||||||
void HighlightMacroSettingsButton(bool enable = true);
|
void HighlightMacroSettingsButton(bool enable = true);
|
||||||
@@ -102,11 +106,11 @@ public:
|
|||||||
public slots:
|
public slots:
|
||||||
void on_macroAdd_clicked();
|
void on_macroAdd_clicked();
|
||||||
void on_macroRemove_clicked();
|
void on_macroRemove_clicked();
|
||||||
void on_macroUp_clicked();
|
void on_macroUp_clicked() const;
|
||||||
void on_macroDown_clicked();
|
void on_macroDown_clicked() const;
|
||||||
void on_macroName_editingFinished();
|
void on_macroName_editingFinished();
|
||||||
void on_runMacroInParallel_stateChanged(int value);
|
void on_runMacroInParallel_stateChanged(int value) const;
|
||||||
void on_runMacroOnChange_stateChanged(int value);
|
void on_runMacroOnChange_stateChanged(int value) const;
|
||||||
void on_conditionAdd_clicked();
|
void on_conditionAdd_clicked();
|
||||||
void on_conditionRemove_clicked();
|
void on_conditionRemove_clicked();
|
||||||
void on_conditionTop_clicked();
|
void on_conditionTop_clicked();
|
||||||
@@ -119,14 +123,14 @@ public slots:
|
|||||||
void on_actionUp_clicked();
|
void on_actionUp_clicked();
|
||||||
void on_actionDown_clicked();
|
void on_actionDown_clicked();
|
||||||
void on_actionBottom_clicked();
|
void on_actionBottom_clicked();
|
||||||
void on_toggleElseActions_clicked();
|
void on_toggleElseActions_clicked() const;
|
||||||
void on_elseActionAdd_clicked();
|
void on_elseActionAdd_clicked();
|
||||||
void on_elseActionRemove_clicked();
|
void on_elseActionRemove_clicked();
|
||||||
void on_elseActionTop_clicked();
|
void on_elseActionTop_clicked();
|
||||||
void on_elseActionUp_clicked();
|
void on_elseActionUp_clicked();
|
||||||
void on_elseActionDown_clicked();
|
void on_elseActionDown_clicked();
|
||||||
void on_elseActionBottom_clicked();
|
void on_elseActionBottom_clicked();
|
||||||
void MacroSelectionAboutToChange();
|
void MacroSelectionAboutToChange() const;
|
||||||
void MacroSelectionChanged();
|
void MacroSelectionChanged();
|
||||||
void UpMacroSegementHotkey();
|
void UpMacroSegementHotkey();
|
||||||
void DownMacroSegementHotkey();
|
void DownMacroSegementHotkey();
|
||||||
@@ -137,22 +141,22 @@ public slots:
|
|||||||
void ShowMacroConditionsContextMenu(const QPoint &);
|
void ShowMacroConditionsContextMenu(const QPoint &);
|
||||||
void CopyMacro();
|
void CopyMacro();
|
||||||
void RenameSelectedMacro();
|
void RenameSelectedMacro();
|
||||||
void ExportMacros();
|
void ExportMacros() const;
|
||||||
void ImportMacros();
|
void ImportMacros();
|
||||||
void ExpandAllActions();
|
void ExpandAllActions() const;
|
||||||
void ExpandAllElseActions();
|
void ExpandAllElseActions() const;
|
||||||
void ExpandAllConditions();
|
void ExpandAllConditions() const;
|
||||||
void CollapseAllActions();
|
void CollapseAllActions() const;
|
||||||
void CollapseAllElseActions();
|
void CollapseAllElseActions() const;
|
||||||
void CollapseAllConditions();
|
void CollapseAllConditions() const;
|
||||||
void MinimizeActions();
|
void MinimizeActions() const;
|
||||||
void MaximizeActions();
|
void MaximizeActions() const;
|
||||||
void MinimizeElseActions();
|
void MinimizeElseActions() const;
|
||||||
void MaximizeElseActions();
|
void MaximizeElseActions() const;
|
||||||
void MinimizeConditions();
|
void MinimizeConditions() const;
|
||||||
void MaximizeConditions();
|
void MaximizeConditions() const;
|
||||||
void SetElseActionsStateToHidden();
|
void SetElseActionsStateToHidden() const;
|
||||||
void SetElseActionsStateToVisible();
|
void SetElseActionsStateToVisible() const;
|
||||||
void MacroActionSelectionChanged(int idx);
|
void MacroActionSelectionChanged(int idx);
|
||||||
void MacroActionReorder(int to, int target);
|
void MacroActionReorder(int to, int target);
|
||||||
void AddMacroAction(Macro *macro, int idx, const std::string &id,
|
void AddMacroAction(Macro *macro, int idx, const std::string &id,
|
||||||
@@ -178,8 +182,8 @@ public slots:
|
|||||||
void RemoveMacroCondition(int idx);
|
void RemoveMacroCondition(int idx);
|
||||||
void MoveMacroConditionUp(int idx);
|
void MoveMacroConditionUp(int idx);
|
||||||
void MoveMacroConditionDown(int idx);
|
void MoveMacroConditionDown(int idx);
|
||||||
void HighlightControls();
|
void HighlightControls() const;
|
||||||
void HighlightOnChange();
|
void HighlightOnChange() const;
|
||||||
void on_macroSettings_clicked();
|
void on_macroSettings_clicked();
|
||||||
void CopyMacroSegment();
|
void CopyMacroSegment();
|
||||||
void PasteMacroSegment();
|
void PasteMacroSegment();
|
||||||
@@ -189,7 +193,7 @@ signals:
|
|||||||
void MacroRemoved(const QString &name);
|
void MacroRemoved(const QString &name);
|
||||||
void MacroRenamed(const QString &oldName, const QString &newName);
|
void MacroRenamed(const QString &oldName, const QString &newName);
|
||||||
void MacroSegmentOrderChanged();
|
void MacroSegmentOrderChanged();
|
||||||
void SegmentTempVarsChanged();
|
void SegmentTempVarsChanged(MacroSegment *);
|
||||||
void HighlightMacrosChanged(bool value);
|
void HighlightMacrosChanged(bool value);
|
||||||
|
|
||||||
void ConnectionAdded(const QString &);
|
void ConnectionAdded(const QString &);
|
||||||
|
|||||||
@@ -113,12 +113,12 @@ void AdvSceneSwitcher::on_startupBehavior_currentIndexChanged(int index)
|
|||||||
static_cast<SwitcherData::StartupBehavior>(index);
|
static_cast<SwitcherData::StartupBehavior>(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::on_logLevel_currentIndexChanged(int value)
|
void AdvSceneSwitcher::on_logLevel_currentIndexChanged(int idx)
|
||||||
{
|
{
|
||||||
if (loading) {
|
if (loading) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
switcher->logLevel = static_cast<SwitcherData::LogLevel>(value);
|
SetLogLevel(static_cast<LogLevel>(ui->logLevel->itemData(idx).toInt()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::on_autoStartEvent_currentIndexChanged(int index)
|
void AdvSceneSwitcher::on_autoStartEvent_currentIndexChanged(int index)
|
||||||
@@ -205,6 +205,16 @@ void AdvSceneSwitcher::on_disableComboBoxFilter_stateChanged(int state)
|
|||||||
FilterComboBox::SetFilterBehaviourEnabled(!state);
|
FilterComboBox::SetFilterBehaviourEnabled(!state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AdvSceneSwitcher::on_disableMacroWidgetCache_stateChanged(int state)
|
||||||
|
{
|
||||||
|
if (loading) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switcher->disableMacroWidgetCache = state;
|
||||||
|
MacroSegmentList::SetCachingEnabled(!state);
|
||||||
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::on_warnPluginLoadFailure_stateChanged(int state)
|
void AdvSceneSwitcher::on_warnPluginLoadFailure_stateChanged(int state)
|
||||||
{
|
{
|
||||||
if (loading) {
|
if (loading) {
|
||||||
@@ -275,12 +285,15 @@ static bool containsSensitiveData(obs_data_t *data)
|
|||||||
obs_data_get_array(data, "twitchConnections");
|
obs_data_get_array(data, "twitchConnections");
|
||||||
OBSDataArrayAutoRelease websocketConnections =
|
OBSDataArrayAutoRelease websocketConnections =
|
||||||
obs_data_get_array(data, "websocketConnections");
|
obs_data_get_array(data, "websocketConnections");
|
||||||
|
OBSDataArrayAutoRelease mqttConnections =
|
||||||
|
obs_data_get_array(data, "mqttConnections");
|
||||||
|
|
||||||
auto isNotEmpty = [](obs_data_array *array) {
|
auto isNotEmpty = [](obs_data_array *array) {
|
||||||
return obs_data_array_count(array) > 0;
|
return obs_data_array_count(array) > 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
return isNotEmpty(twitchTokens) || isNotEmpty(websocketConnections);
|
return isNotEmpty(twitchTokens) || isNotEmpty(websocketConnections) ||
|
||||||
|
isNotEmpty(mqttConnections);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::on_exportSettings_clicked()
|
void AdvSceneSwitcher::on_exportSettings_clicked()
|
||||||
@@ -383,6 +396,7 @@ void AdvSceneSwitcher::CheckFirstTimeSetup()
|
|||||||
switcher->firstBoot = false;
|
switcher->firstBoot = false;
|
||||||
DisplayMessage(
|
DisplayMessage(
|
||||||
obs_module_text("AdvSceneSwitcher.firstBootMessage"));
|
obs_module_text("AdvSceneSwitcher.firstBootMessage"));
|
||||||
|
switcher->Start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -529,13 +543,15 @@ void SwitcherData::SaveGeneralSettings(obs_data_t *obj)
|
|||||||
obs_data_set_int(obj, "autoStartEvent",
|
obs_data_set_int(obj, "autoStartEvent",
|
||||||
static_cast<int>(autoStartEvent));
|
static_cast<int>(autoStartEvent));
|
||||||
|
|
||||||
obs_data_set_int(obj, "logLevel", static_cast<int>(logLevel));
|
SaveLogLevel(obj);
|
||||||
obs_data_set_int(obj, "logLevelVersion", 1);
|
|
||||||
obs_data_set_bool(obj, "showSystemTrayNotifications",
|
obs_data_set_bool(obj, "showSystemTrayNotifications",
|
||||||
showSystemTrayNotifications);
|
showSystemTrayNotifications);
|
||||||
obs_data_set_bool(obj, "disableHints", disableHints);
|
obs_data_set_bool(obj, "disableHints", disableHints);
|
||||||
obs_data_set_bool(obj, "disableFilterComboboxFilter",
|
obs_data_set_bool(obj, "disableFilterComboboxFilter",
|
||||||
disableFilterComboboxFilter);
|
disableFilterComboboxFilter);
|
||||||
|
obs_data_set_bool(obj, "disableMacroWidgetCache",
|
||||||
|
disableMacroWidgetCache);
|
||||||
obs_data_set_bool(obj, "warnPluginLoadFailure", warnPluginLoadFailure);
|
obs_data_set_bool(obj, "warnPluginLoadFailure", warnPluginLoadFailure);
|
||||||
obs_data_set_bool(obj, "hideLegacyTabs", hideLegacyTabs);
|
obs_data_set_bool(obj, "hideLegacyTabs", hideLegacyTabs);
|
||||||
|
|
||||||
@@ -586,31 +602,15 @@ void SwitcherData::LoadGeneralSettings(obs_data_t *obj)
|
|||||||
autoStartEvent =
|
autoStartEvent =
|
||||||
static_cast<AutoStart>(obs_data_get_int(obj, "autoStartEvent"));
|
static_cast<AutoStart>(obs_data_get_int(obj, "autoStartEvent"));
|
||||||
|
|
||||||
logLevel = static_cast<LogLevel>(obs_data_get_int(obj, "logLevel"));
|
LoadLogLevel(obj);
|
||||||
if (obs_data_get_int(obj, "logLevelVersion") < 1) {
|
|
||||||
enum OldLogLevel { DEFAULT, LOG_ACTION, VERBOSE };
|
|
||||||
OldLogLevel oldLogLevel = static_cast<OldLogLevel>(
|
|
||||||
obs_data_get_int(obj, "logLevel"));
|
|
||||||
switch (oldLogLevel) {
|
|
||||||
case DEFAULT:
|
|
||||||
logLevel = LogLevel::DEFAULT;
|
|
||||||
break;
|
|
||||||
case LOG_ACTION:
|
|
||||||
logLevel = LogLevel::LOG_ACTION;
|
|
||||||
break;
|
|
||||||
case VERBOSE:
|
|
||||||
logLevel = LogLevel::VERBOSE;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
showSystemTrayNotifications =
|
showSystemTrayNotifications =
|
||||||
obs_data_get_bool(obj, "showSystemTrayNotifications");
|
obs_data_get_bool(obj, "showSystemTrayNotifications");
|
||||||
disableHints = obs_data_get_bool(obj, "disableHints");
|
disableHints = obs_data_get_bool(obj, "disableHints");
|
||||||
disableFilterComboboxFilter =
|
disableFilterComboboxFilter =
|
||||||
obs_data_get_bool(obj, "disableFilterComboboxFilter");
|
obs_data_get_bool(obj, "disableFilterComboboxFilter");
|
||||||
|
disableMacroWidgetCache =
|
||||||
|
obs_data_get_bool(obj, "disableMacroWidgetCache");
|
||||||
obs_data_set_default_bool(obj, "warnPluginLoadFailure", true);
|
obs_data_set_default_bool(obj, "warnPluginLoadFailure", true);
|
||||||
warnPluginLoadFailure = obs_data_get_bool(obj, "warnPluginLoadFailure");
|
warnPluginLoadFailure = obs_data_get_bool(obj, "warnPluginLoadFailure");
|
||||||
obs_data_set_default_bool(obj, "hideLegacyTabs", true);
|
obs_data_set_default_bool(obj, "hideLegacyTabs", true);
|
||||||
@@ -894,7 +894,9 @@ void AdvSceneSwitcher::SetupGeneralTab()
|
|||||||
SIGNAL(DurationChanged(const Duration &)), this,
|
SIGNAL(DurationChanged(const Duration &)), this,
|
||||||
SLOT(CooldownDurationChanged(const Duration &)));
|
SLOT(CooldownDurationChanged(const Duration &)));
|
||||||
|
|
||||||
ui->logLevel->setCurrentIndex(static_cast<int>(switcher->logLevel));
|
PopulateLogLevelSelection(ui->logLevel);
|
||||||
|
ui->logLevel->setCurrentIndex(
|
||||||
|
ui->logLevel->findData(static_cast<int>(GetLogLevel())));
|
||||||
|
|
||||||
ui->saveWindowGeo->setChecked(switcher->saveWindowGeo);
|
ui->saveWindowGeo->setChecked(switcher->saveWindowGeo);
|
||||||
ui->showTrayNotifications->setChecked(
|
ui->showTrayNotifications->setChecked(
|
||||||
@@ -904,6 +906,9 @@ void AdvSceneSwitcher::SetupGeneralTab()
|
|||||||
switcher->disableFilterComboboxFilter);
|
switcher->disableFilterComboboxFilter);
|
||||||
FilterComboBox::SetFilterBehaviourEnabled(
|
FilterComboBox::SetFilterBehaviourEnabled(
|
||||||
!switcher->disableFilterComboboxFilter);
|
!switcher->disableFilterComboboxFilter);
|
||||||
|
ui->disableMacroWidgetCache->setChecked(
|
||||||
|
switcher->disableMacroWidgetCache);
|
||||||
|
MacroSegmentList::SetCachingEnabled(!switcher->disableMacroWidgetCache);
|
||||||
ui->warnPluginLoadFailure->setChecked(switcher->warnPluginLoadFailure);
|
ui->warnPluginLoadFailure->setChecked(switcher->warnPluginLoadFailure);
|
||||||
ui->hideLegacyTabs->setChecked(switcher->hideLegacyTabs);
|
ui->hideLegacyTabs->setChecked(switcher->hideLegacyTabs);
|
||||||
|
|
||||||
|
|||||||
@@ -259,7 +259,8 @@ void AudioSwitch::setVolumeLevel(void *data, const float *,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
obs_volmeter_t *AddVolmeterToSource(AudioSwitch *entry, obs_weak_source *source)
|
static obs_volmeter_t *addVolmeterToSource(AudioSwitch *entry,
|
||||||
|
obs_weak_source *source)
|
||||||
{
|
{
|
||||||
obs_volmeter_t *volmeter = obs_volmeter_create(OBS_FADER_LOG);
|
obs_volmeter_t *volmeter = obs_volmeter_create(OBS_FADER_LOG);
|
||||||
obs_volmeter_add_callback(volmeter, AudioSwitch::setVolumeLevel, entry);
|
obs_volmeter_add_callback(volmeter, AudioSwitch::setVolumeLevel, entry);
|
||||||
@@ -279,7 +280,7 @@ void AudioSwitch::resetVolmeter()
|
|||||||
obs_volmeter_remove_callback(volmeter, setVolumeLevel, this);
|
obs_volmeter_remove_callback(volmeter, setVolumeLevel, this);
|
||||||
obs_volmeter_destroy(volmeter);
|
obs_volmeter_destroy(volmeter);
|
||||||
|
|
||||||
volmeter = AddVolmeterToSource(this, audioSource);
|
volmeter = addVolmeterToSource(this, audioSource);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AudioSwitch::initialized()
|
bool AudioSwitch::initialized()
|
||||||
@@ -318,7 +319,7 @@ void AudioSwitch::load(obs_data_t *obj)
|
|||||||
duration.Load(obj, "duration");
|
duration.Load(obj, "duration");
|
||||||
ignoreInactiveSource = obs_data_get_bool(obj, "ignoreInactiveSource");
|
ignoreInactiveSource = obs_data_get_bool(obj, "ignoreInactiveSource");
|
||||||
|
|
||||||
volmeter = AddVolmeterToSource(this, audioSource);
|
volmeter = addVolmeterToSource(this, audioSource);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioSwitchFallback::save(obs_data_t *obj)
|
void AudioSwitchFallback::save(obs_data_t *obj)
|
||||||
@@ -349,7 +350,7 @@ AudioSwitch::AudioSwitch(const AudioSwitch &other)
|
|||||||
condition(other.condition),
|
condition(other.condition),
|
||||||
duration(other.duration)
|
duration(other.duration)
|
||||||
{
|
{
|
||||||
volmeter = AddVolmeterToSource(this, other.audioSource);
|
volmeter = addVolmeterToSource(this, other.audioSource);
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioSwitch::AudioSwitch(AudioSwitch &&other) noexcept
|
AudioSwitch::AudioSwitch(AudioSwitch &&other) noexcept
|
||||||
|
|||||||
@@ -550,6 +550,11 @@ static void initProc2()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ignoreXerror(Display *d, XErrorEvent *e)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void PlatformInit()
|
void PlatformInit()
|
||||||
{
|
{
|
||||||
auto display = disp();
|
auto display = disp();
|
||||||
@@ -560,6 +565,7 @@ void PlatformInit()
|
|||||||
initXss();
|
initXss();
|
||||||
initProcps();
|
initProcps();
|
||||||
initProc2();
|
initProc2();
|
||||||
|
XSetErrorHandler(ignoreXerror);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cleanupHelper(QLibrary *lib)
|
static void cleanupHelper(QLibrary *lib)
|
||||||
@@ -576,6 +582,7 @@ void PlatformCleanup()
|
|||||||
cleanupHelper(libprocps);
|
cleanupHelper(libprocps);
|
||||||
cleanupHelper(libproc2);
|
cleanupHelper(libproc2);
|
||||||
cleanupDisplay();
|
cleanupDisplay();
|
||||||
|
XSetErrorHandler(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace advss
|
} // namespace advss
|
||||||
|
|||||||
@@ -7,8 +7,6 @@
|
|||||||
#include "section.hpp"
|
#include "section.hpp"
|
||||||
#include "switch-button.hpp"
|
#include "switch-button.hpp"
|
||||||
|
|
||||||
#include <QGraphicsOpacityEffect>
|
|
||||||
|
|
||||||
namespace advss {
|
namespace advss {
|
||||||
|
|
||||||
static inline void populateActionSelection(QComboBox *list)
|
static inline void populateActionSelection(QComboBox *list)
|
||||||
@@ -37,12 +35,14 @@ MacroActionEdit::MacroActionEdit(QWidget *parent,
|
|||||||
_enable(new SwitchButton()),
|
_enable(new SwitchButton()),
|
||||||
_entryData(entryData)
|
_entryData(entryData)
|
||||||
{
|
{
|
||||||
|
auto actionStateTimer = new QTimer(this);
|
||||||
|
|
||||||
QWidget::connect(_actionSelection,
|
QWidget::connect(_actionSelection,
|
||||||
SIGNAL(currentTextChanged(const QString &)), this,
|
SIGNAL(currentTextChanged(const QString &)), this,
|
||||||
SLOT(ActionSelectionChanged(const QString &)));
|
SLOT(ActionSelectionChanged(const QString &)));
|
||||||
QWidget::connect(_enable, SIGNAL(checked(bool)), this,
|
QWidget::connect(_enable, SIGNAL(checked(bool)), this,
|
||||||
SLOT(ActionEnableChanged(bool)));
|
SLOT(ActionEnableChanged(bool)));
|
||||||
QWidget::connect(&_actionStateTimer, SIGNAL(timeout()), this,
|
QWidget::connect(actionStateTimer, SIGNAL(timeout()), this,
|
||||||
SLOT(UpdateActionState()));
|
SLOT(UpdateActionState()));
|
||||||
|
|
||||||
populateActionSelection(_actionSelection);
|
populateActionSelection(_actionSelection);
|
||||||
@@ -63,12 +63,40 @@ MacroActionEdit::MacroActionEdit(QWidget *parent,
|
|||||||
setLayout(mainLayout);
|
setLayout(mainLayout);
|
||||||
|
|
||||||
_entryData = entryData;
|
_entryData = entryData;
|
||||||
UpdateEntryData(id);
|
SetupWidgets(true);
|
||||||
|
|
||||||
_actionStateTimer.start(300);
|
actionStateTimer->start(300);
|
||||||
_loading = false;
|
_loading = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MacroActionEdit::SetupWidgets(bool basicSetup)
|
||||||
|
{
|
||||||
|
if (_allWidgetsAreSetup) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto id = (*_entryData)->GetId();
|
||||||
|
_actionSelection->setCurrentText(
|
||||||
|
obs_module_text(MacroActionFactory::GetActionName(id).c_str()));
|
||||||
|
const bool enabled = (*_entryData)->Enabled();
|
||||||
|
_enable->setChecked(enabled);
|
||||||
|
SetDisableEffect(!enabled);
|
||||||
|
HeaderInfoChanged(
|
||||||
|
QString::fromStdString((*_entryData)->GetShortDesc()));
|
||||||
|
|
||||||
|
if (basicSetup) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto widget = MacroActionFactory::CreateWidget(id, this, *_entryData);
|
||||||
|
QWidget::connect(widget, SIGNAL(HeaderInfoChanged(const QString &)),
|
||||||
|
this, SLOT(HeaderInfoChanged(const QString &)));
|
||||||
|
_section->SetContent(widget, (*_entryData)->GetCollapsed());
|
||||||
|
SetFocusPolicyOfWidgets();
|
||||||
|
|
||||||
|
_allWidgetsAreSetup = true;
|
||||||
|
}
|
||||||
|
|
||||||
void MacroActionEdit::ActionSelectionChanged(const QString &text)
|
void MacroActionEdit::ActionSelectionChanged(const QString &text)
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
if (_loading || !_entryData) {
|
||||||
@@ -98,38 +126,11 @@ void MacroActionEdit::ActionSelectionChanged(const QString &text)
|
|||||||
SetFocusPolicyOfWidgets();
|
SetFocusPolicyOfWidgets();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroActionEdit::UpdateEntryData(const std::string &id)
|
|
||||||
{
|
|
||||||
_actionSelection->setCurrentText(
|
|
||||||
obs_module_text(MacroActionFactory::GetActionName(id).c_str()));
|
|
||||||
const bool enabled = (*_entryData)->Enabled();
|
|
||||||
_enable->setChecked(enabled);
|
|
||||||
SetDisableEffect(!enabled);
|
|
||||||
auto widget = MacroActionFactory::CreateWidget(id, this, *_entryData);
|
|
||||||
QWidget::connect(widget, SIGNAL(HeaderInfoChanged(const QString &)),
|
|
||||||
this, SLOT(HeaderInfoChanged(const QString &)));
|
|
||||||
HeaderInfoChanged(
|
|
||||||
QString::fromStdString((*_entryData)->GetShortDesc()));
|
|
||||||
_section->SetContent(widget, (*_entryData)->GetCollapsed());
|
|
||||||
SetFocusPolicyOfWidgets();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MacroActionEdit::SetEntryData(std::shared_ptr<MacroAction> *data)
|
void MacroActionEdit::SetEntryData(std::shared_ptr<MacroAction> *data)
|
||||||
{
|
{
|
||||||
_entryData = data;
|
_entryData = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroActionEdit::SetDisableEffect(bool value)
|
|
||||||
{
|
|
||||||
if (value) {
|
|
||||||
auto effect = new QGraphicsOpacityEffect(this);
|
|
||||||
effect->setOpacity(0.5);
|
|
||||||
_section->setGraphicsEffect(effect);
|
|
||||||
} else {
|
|
||||||
_section->setGraphicsEffect(nullptr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MacroActionEdit::ActionEnableChanged(bool value)
|
void MacroActionEdit::ActionEnableChanged(bool value)
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
if (_loading || !_entryData) {
|
||||||
@@ -147,13 +148,9 @@ void MacroActionEdit::UpdateActionState()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SetEnableAppearance((*_entryData)->Enabled());
|
const bool enabled = (*_entryData)->Enabled();
|
||||||
}
|
SetEnableAppearance(enabled);
|
||||||
|
_enable->setChecked(enabled);
|
||||||
void MacroActionEdit::SetEnableAppearance(bool value)
|
|
||||||
{
|
|
||||||
_enable->setChecked(value);
|
|
||||||
SetDisableEffect(!value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<MacroSegment> MacroActionEdit::Data() const
|
std::shared_ptr<MacroSegment> MacroActionEdit::Data() const
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ public:
|
|||||||
QWidget *parent = nullptr,
|
QWidget *parent = nullptr,
|
||||||
std::shared_ptr<MacroAction> * = nullptr,
|
std::shared_ptr<MacroAction> * = nullptr,
|
||||||
const std::string &id = MacroAction::GetDefaultID().data());
|
const std::string &id = MacroAction::GetDefaultID().data());
|
||||||
void UpdateEntryData(const std::string &id);
|
void SetupWidgets(bool basicSetup = false);
|
||||||
void SetEntryData(std::shared_ptr<MacroAction> *);
|
void SetEntryData(std::shared_ptr<MacroAction> *);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
@@ -27,14 +27,11 @@ private slots:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<MacroSegment> Data() const;
|
std::shared_ptr<MacroSegment> Data() const;
|
||||||
void SetDisableEffect(bool);
|
|
||||||
void SetEnableAppearance(bool);
|
|
||||||
|
|
||||||
FilterComboBox *_actionSelection;
|
FilterComboBox *_actionSelection;
|
||||||
SwitchButton *_enable;
|
SwitchButton *_enable;
|
||||||
|
|
||||||
std::shared_ptr<MacroAction> *_entryData;
|
std::shared_ptr<MacroAction> *_entryData;
|
||||||
QTimer _actionStateTimer;
|
|
||||||
bool _loading = true;
|
bool _loading = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ public:
|
|||||||
MacroActionFactory() = delete;
|
MacroActionFactory() = delete;
|
||||||
|
|
||||||
EXPORT static bool Register(const std::string &id, MacroActionInfo);
|
EXPORT static bool Register(const std::string &id, MacroActionInfo);
|
||||||
static bool Deregister(const std::string &id);
|
EXPORT static bool Deregister(const std::string &id);
|
||||||
static std::shared_ptr<MacroAction> Create(const std::string &id,
|
static std::shared_ptr<MacroAction> Create(const std::string &id,
|
||||||
Macro *m);
|
Macro *m);
|
||||||
static QWidget *CreateWidget(const std::string &id, QWidget *parent,
|
static QWidget *CreateWidget(const std::string &id, QWidget *parent,
|
||||||
|
|||||||
@@ -12,25 +12,6 @@ bool MacroActionMacro::_registered = MacroActionFactory::Register(
|
|||||||
{MacroActionMacro::Create, MacroActionMacroEdit::Create,
|
{MacroActionMacro::Create, MacroActionMacroEdit::Create,
|
||||||
"AdvSceneSwitcher.action.macro"});
|
"AdvSceneSwitcher.action.macro"});
|
||||||
|
|
||||||
const static std::map<MacroActionMacro::Action, std::string> actionTypes = {
|
|
||||||
{MacroActionMacro::Action::PAUSE,
|
|
||||||
"AdvSceneSwitcher.action.macro.type.pause"},
|
|
||||||
{MacroActionMacro::Action::UNPAUSE,
|
|
||||||
"AdvSceneSwitcher.action.macro.type.unpause"},
|
|
||||||
{MacroActionMacro::Action::RESET_COUNTER,
|
|
||||||
"AdvSceneSwitcher.action.macro.type.resetCounter"},
|
|
||||||
{MacroActionMacro::Action::RUN,
|
|
||||||
"AdvSceneSwitcher.action.macro.type.run"},
|
|
||||||
{MacroActionMacro::Action::STOP,
|
|
||||||
"AdvSceneSwitcher.action.macro.type.stop"},
|
|
||||||
{MacroActionMacro::Action::DISABLE_ACTION,
|
|
||||||
"AdvSceneSwitcher.action.macro.type.disableAction"},
|
|
||||||
{MacroActionMacro::Action::ENABLE_ACTION,
|
|
||||||
"AdvSceneSwitcher.action.macro.type.enableAction"},
|
|
||||||
{MacroActionMacro::Action::TOGGLE_ACTION,
|
|
||||||
"AdvSceneSwitcher.action.macro.type.toggleAction"},
|
|
||||||
};
|
|
||||||
|
|
||||||
bool MacroActionMacro::PerformAction()
|
bool MacroActionMacro::PerformAction()
|
||||||
{
|
{
|
||||||
auto macro = _macro.GetMacro();
|
auto macro = _macro.GetMacro();
|
||||||
@@ -45,6 +26,9 @@ bool MacroActionMacro::PerformAction()
|
|||||||
case Action::UNPAUSE:
|
case Action::UNPAUSE:
|
||||||
macro->SetPaused(false);
|
macro->SetPaused(false);
|
||||||
break;
|
break;
|
||||||
|
case Action::TOGGLE_PAUSE:
|
||||||
|
macro->SetPaused(!macro->Paused());
|
||||||
|
break;
|
||||||
case Action::RESET_COUNTER:
|
case Action::RESET_COUNTER:
|
||||||
macro->ResetRunCount();
|
macro->ResetRunCount();
|
||||||
break;
|
break;
|
||||||
@@ -210,8 +194,31 @@ void MacroActionMacro::RunActions(Macro *actionMacro) const
|
|||||||
|
|
||||||
static void populateActionSelection(QComboBox *list)
|
static void populateActionSelection(QComboBox *list)
|
||||||
{
|
{
|
||||||
for (const auto &[_, name] : actionTypes) {
|
static const std::vector<std::pair<MacroActionMacro::Action, std::string>>
|
||||||
list->addItem(obs_module_text(name.c_str()));
|
actions = {
|
||||||
|
{MacroActionMacro::Action::PAUSE,
|
||||||
|
"AdvSceneSwitcher.action.macro.type.pause"},
|
||||||
|
{MacroActionMacro::Action::UNPAUSE,
|
||||||
|
"AdvSceneSwitcher.action.macro.type.unpause"},
|
||||||
|
{MacroActionMacro::Action::TOGGLE_PAUSE,
|
||||||
|
"AdvSceneSwitcher.action.macro.type.togglePause"},
|
||||||
|
{MacroActionMacro::Action::RESET_COUNTER,
|
||||||
|
"AdvSceneSwitcher.action.macro.type.resetCounter"},
|
||||||
|
{MacroActionMacro::Action::RUN,
|
||||||
|
"AdvSceneSwitcher.action.macro.type.run"},
|
||||||
|
{MacroActionMacro::Action::STOP,
|
||||||
|
"AdvSceneSwitcher.action.macro.type.stop"},
|
||||||
|
{MacroActionMacro::Action::DISABLE_ACTION,
|
||||||
|
"AdvSceneSwitcher.action.macro.type.disableAction"},
|
||||||
|
{MacroActionMacro::Action::ENABLE_ACTION,
|
||||||
|
"AdvSceneSwitcher.action.macro.type.enableAction"},
|
||||||
|
{MacroActionMacro::Action::TOGGLE_ACTION,
|
||||||
|
"AdvSceneSwitcher.action.macro.type.toggleAction"},
|
||||||
|
};
|
||||||
|
|
||||||
|
for (const auto &[value, name] : actions) {
|
||||||
|
list->addItem(obs_module_text(name.c_str()),
|
||||||
|
static_cast<int>(value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -321,7 +328,8 @@ void MacroActionMacroEdit::UpdateEntryData()
|
|||||||
if (!_entryData) {
|
if (!_entryData) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_actions->setCurrentIndex(static_cast<int>(_entryData->_action));
|
_actions->setCurrentIndex(
|
||||||
|
_actions->findData(static_cast<int>(_entryData->_action)));
|
||||||
_actionIndex->SetValue(_entryData->_actionIndex);
|
_actionIndex->SetValue(_entryData->_actionIndex);
|
||||||
_actionIndex->SetMacro(_entryData->_macro.GetMacro());
|
_actionIndex->SetMacro(_entryData->_macro.GetMacro());
|
||||||
_macros->SetCurrentMacro(_entryData->_macro);
|
_macros->SetCurrentMacro(_entryData->_macro);
|
||||||
@@ -350,10 +358,11 @@ void MacroActionMacroEdit::MacroChanged(const QString &text)
|
|||||||
SetWidgetVisibility();
|
SetWidgetVisibility();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroActionMacroEdit::ActionChanged(int value)
|
void MacroActionMacroEdit::ActionChanged(int idx)
|
||||||
{
|
{
|
||||||
GUARD_LOADING_AND_LOCK();
|
GUARD_LOADING_AND_LOCK();
|
||||||
_entryData->_action = static_cast<MacroActionMacro::Action>(value);
|
_entryData->_action = static_cast<MacroActionMacro::Action>(
|
||||||
|
_actions->itemData(idx).toInt());
|
||||||
SetWidgetVisibility();
|
SetWidgetVisibility();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ public:
|
|||||||
DISABLE_ACTION,
|
DISABLE_ACTION,
|
||||||
ENABLE_ACTION,
|
ENABLE_ACTION,
|
||||||
TOGGLE_ACTION,
|
TOGGLE_ACTION,
|
||||||
|
TOGGLE_PAUSE,
|
||||||
};
|
};
|
||||||
Action _action = Action::RUN;
|
Action _action = Action::RUN;
|
||||||
IntVariable _actionIndex = 1;
|
IntVariable _actionIndex = 1;
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
#include "macro-action-variable.hpp"
|
#include "macro-action-variable.hpp"
|
||||||
#include "advanced-scene-switcher.hpp"
|
#include "advanced-scene-switcher.hpp"
|
||||||
|
#include "json-helpers.hpp"
|
||||||
#include "layout-helpers.hpp"
|
#include "layout-helpers.hpp"
|
||||||
#include "math-helpers.hpp"
|
#include "math-helpers.hpp"
|
||||||
#include "macro-condition-edit.hpp"
|
#include "macro-condition-edit.hpp"
|
||||||
#include "macro.hpp"
|
#include "macro.hpp"
|
||||||
#include "non-modal-dialog.hpp"
|
#include "non-modal-dialog.hpp"
|
||||||
#include "source-helpers.hpp"
|
#include "source-helpers.hpp"
|
||||||
|
#include "ui-helpers.hpp"
|
||||||
#include "utility.hpp"
|
#include "utility.hpp"
|
||||||
|
|
||||||
#include <random>
|
#include <random>
|
||||||
@@ -385,6 +387,22 @@ bool MacroActionVariable::PerformAction()
|
|||||||
var->SetValue(*value);
|
var->SetValue(*value);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
case Action::QUERY_JSON: {
|
||||||
|
auto value = QueryJson(var->Value(), _jsonQuery);
|
||||||
|
if (!value.has_value()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
var->SetValue(*value);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
case Action::ARRAY_JSON: {
|
||||||
|
auto value = AccessJsonArrayIndex(var->Value(), _jsonIndex);
|
||||||
|
if (!value.has_value()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
var->SetValue(*value);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
case Action::SET_TO_TEMPVAR: {
|
case Action::SET_TO_TEMPVAR: {
|
||||||
auto tempVar = _tempVar.GetTempVariable(GetMacro());
|
auto tempVar = _tempVar.GetTempVariable(GetMacro());
|
||||||
if (!tempVar) {
|
if (!tempVar) {
|
||||||
@@ -471,6 +489,8 @@ bool MacroActionVariable::Save(obs_data_t *obj) const
|
|||||||
_randomNumberStart.Save(obj, "randomNumberStart");
|
_randomNumberStart.Save(obj, "randomNumberStart");
|
||||||
_randomNumberEnd.Save(obj, "randomNumberEnd");
|
_randomNumberEnd.Save(obj, "randomNumberEnd");
|
||||||
obs_data_set_bool(obj, "generateInteger", _generateInteger);
|
obs_data_set_bool(obj, "generateInteger", _generateInteger);
|
||||||
|
_jsonQuery.Save(obj, "jsonQuery");
|
||||||
|
_jsonIndex.Save(obj, "jsonIndex");
|
||||||
|
|
||||||
obs_data_set_int(obj, "version", 1);
|
obs_data_set_int(obj, "version", 1);
|
||||||
|
|
||||||
@@ -527,6 +547,8 @@ bool MacroActionVariable::Load(obs_data_t *obj)
|
|||||||
_randomNumberStart.Load(obj, "randomNumberStart");
|
_randomNumberStart.Load(obj, "randomNumberStart");
|
||||||
_randomNumberEnd.Load(obj, "randomNumberEnd");
|
_randomNumberEnd.Load(obj, "randomNumberEnd");
|
||||||
_generateInteger = obs_data_get_bool(obj, "generateInteger");
|
_generateInteger = obs_data_get_bool(obj, "generateInteger");
|
||||||
|
_jsonQuery.Load(obj, "jsonQuery");
|
||||||
|
_jsonIndex.Load(obj, "jsonIndex");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -626,6 +648,8 @@ void MacroActionVariable::ResolveVariablesToFixedValues()
|
|||||||
_envVariableName.ResolveVariables();
|
_envVariableName.ResolveVariables();
|
||||||
_scene.ResolveVariables();
|
_scene.ResolveVariables();
|
||||||
_sceneItemIndex.ResolveVariables();
|
_sceneItemIndex.ResolveVariables();
|
||||||
|
_jsonQuery.ResolveVariables();
|
||||||
|
_jsonIndex.ResolveVariables();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroActionVariable::DecrementCurrentSegmentVariableRef()
|
void MacroActionVariable::DecrementCurrentSegmentVariableRef()
|
||||||
@@ -655,8 +679,6 @@ static inline void populateActionSelection(QComboBox *list)
|
|||||||
"AdvSceneSwitcher.action.variable.type.subString"},
|
"AdvSceneSwitcher.action.variable.type.subString"},
|
||||||
{MacroActionVariable::Action::FIND_AND_REPLACE,
|
{MacroActionVariable::Action::FIND_AND_REPLACE,
|
||||||
"AdvSceneSwitcher.action.variable.type.findAndReplace"},
|
"AdvSceneSwitcher.action.variable.type.findAndReplace"},
|
||||||
{MacroActionVariable::Action::EXTRACT_JSON,
|
|
||||||
"AdvSceneSwitcher.action.variable.type.extractJson"},
|
|
||||||
{MacroActionVariable::Action::STRING_LENGTH,
|
{MacroActionVariable::Action::STRING_LENGTH,
|
||||||
"AdvSceneSwitcher.action.variable.type.stringLength"},
|
"AdvSceneSwitcher.action.variable.type.stringLength"},
|
||||||
{MacroActionVariable::Action::TRIM,
|
{MacroActionVariable::Action::TRIM,
|
||||||
@@ -665,6 +687,14 @@ static inline void populateActionSelection(QComboBox *list)
|
|||||||
"AdvSceneSwitcher.action.variable.type.changeCase"},
|
"AdvSceneSwitcher.action.variable.type.changeCase"},
|
||||||
{true, ""}, // Separator
|
{true, ""}, // Separator
|
||||||
|
|
||||||
|
{MacroActionVariable::Action::EXTRACT_JSON,
|
||||||
|
"AdvSceneSwitcher.action.variable.type.extractJsonField"},
|
||||||
|
{MacroActionVariable::Action::QUERY_JSON,
|
||||||
|
"AdvSceneSwitcher.action.variable.type.queryJson"},
|
||||||
|
{MacroActionVariable::Action::ARRAY_JSON,
|
||||||
|
"AdvSceneSwitcher.action.variable.type.accessJsonArray"},
|
||||||
|
{true, ""}, // Separator
|
||||||
|
|
||||||
{MacroActionVariable::Action::SET_TO_TEMPVAR,
|
{MacroActionVariable::Action::SET_TO_TEMPVAR,
|
||||||
"AdvSceneSwitcher.action.variable.type.setToTempvar"},
|
"AdvSceneSwitcher.action.variable.type.setToTempvar"},
|
||||||
{MacroActionVariable::Action::SET_CONDITION_VALUE,
|
{MacroActionVariable::Action::SET_CONDITION_VALUE,
|
||||||
@@ -797,6 +827,9 @@ MacroActionVariableEdit::MacroActionVariableEdit(
|
|||||||
"AdvSceneSwitcher.action.variable.generateInteger"),
|
"AdvSceneSwitcher.action.variable.generateInteger"),
|
||||||
this)),
|
this)),
|
||||||
_randomLayout(new QVBoxLayout()),
|
_randomLayout(new QVBoxLayout()),
|
||||||
|
_jsonQuery(new VariableLineEdit(this)),
|
||||||
|
_jsonQueryHelp(new QLabel(this)),
|
||||||
|
_jsonIndex(new VariableSpinBox(this)),
|
||||||
_entryLayout(new QHBoxLayout())
|
_entryLayout(new QHBoxLayout())
|
||||||
{
|
{
|
||||||
_numValue->setMinimum(-9999999999);
|
_numValue->setMinimum(-9999999999);
|
||||||
@@ -826,6 +859,15 @@ MacroActionVariableEdit::MacroActionVariableEdit(
|
|||||||
_randomNumberStart->setMaximum(9999999999);
|
_randomNumberStart->setMaximum(9999999999);
|
||||||
_randomNumberEnd->setMinimum(-9999999999);
|
_randomNumberEnd->setMinimum(-9999999999);
|
||||||
_randomNumberEnd->setMaximum(9999999999);
|
_randomNumberEnd->setMaximum(9999999999);
|
||||||
|
const QString path = GetThemeTypeName() == "Light"
|
||||||
|
? ":/res/images/help.svg"
|
||||||
|
: ":/res/images/help_light.svg";
|
||||||
|
const QIcon icon(path);
|
||||||
|
const QPixmap pixmap = icon.pixmap(QSize(16, 16));
|
||||||
|
_jsonQueryHelp->setPixmap(pixmap);
|
||||||
|
_jsonQueryHelp->setToolTip(obs_module_text(
|
||||||
|
"AdvSceneSwitcher.action.variable.type.queryJson.info"));
|
||||||
|
_jsonIndex->setMaximum(999);
|
||||||
|
|
||||||
QWidget::connect(_variables, SIGNAL(SelectionChanged(const QString &)),
|
QWidget::connect(_variables, SIGNAL(SelectionChanged(const QString &)),
|
||||||
this, SLOT(VariableChanged(const QString &)));
|
this, SLOT(VariableChanged(const QString &)));
|
||||||
@@ -912,6 +954,12 @@ MacroActionVariableEdit::MacroActionVariableEdit(
|
|||||||
SLOT(RandomNumberEndChanged(const NumberVariable<double> &)));
|
SLOT(RandomNumberEndChanged(const NumberVariable<double> &)));
|
||||||
QWidget::connect(_generateInteger, SIGNAL(stateChanged(int)), this,
|
QWidget::connect(_generateInteger, SIGNAL(stateChanged(int)), this,
|
||||||
SLOT(GenerateIntegerChanged(int)));
|
SLOT(GenerateIntegerChanged(int)));
|
||||||
|
QWidget::connect(_jsonQuery, SIGNAL(editingFinished()), this,
|
||||||
|
SLOT(JsonQueryChanged()));
|
||||||
|
QWidget::connect(
|
||||||
|
_jsonIndex,
|
||||||
|
SIGNAL(NumberVariableChanged(const NumberVariable<int> &)),
|
||||||
|
this, SLOT(JsonIndexChanged(const NumberVariable<int> &)));
|
||||||
|
|
||||||
const std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
|
const std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
|
||||||
{"{{variables}}", _variables},
|
{"{{variables}}", _variables},
|
||||||
@@ -943,39 +991,42 @@ MacroActionVariableEdit::MacroActionVariableEdit(
|
|||||||
{"{{randomNumberStart}}", _randomNumberStart},
|
{"{{randomNumberStart}}", _randomNumberStart},
|
||||||
{"{{randomNumberEnd}}", _randomNumberEnd},
|
{"{{randomNumberEnd}}", _randomNumberEnd},
|
||||||
{"{{generateInteger}}", _generateInteger},
|
{"{{generateInteger}}", _generateInteger},
|
||||||
|
{"{{jsonQuery}}", _jsonQuery},
|
||||||
|
{"{{jsonQueryHelp}}", _jsonQueryHelp},
|
||||||
|
{"{{jsonIndex}}", _jsonIndex},
|
||||||
};
|
};
|
||||||
PlaceWidgets(
|
PlaceWidgets(obs_module_text(
|
||||||
obs_module_text("AdvSceneSwitcher.action.variable.entry.other"),
|
"AdvSceneSwitcher.action.variable.layout.other"),
|
||||||
_entryLayout, widgetPlaceholders);
|
_entryLayout, widgetPlaceholders);
|
||||||
|
|
||||||
PlaceWidgets(
|
PlaceWidgets(
|
||||||
obs_module_text(
|
obs_module_text(
|
||||||
"AdvSceneSwitcher.action.variable.entry.substringIndex"),
|
"AdvSceneSwitcher.action.variable.layout.substringIndex"),
|
||||||
_subStringIndexEntryLayout, widgetPlaceholders);
|
_subStringIndexEntryLayout, widgetPlaceholders);
|
||||||
|
|
||||||
PlaceWidgets(
|
PlaceWidgets(
|
||||||
obs_module_text(
|
obs_module_text(
|
||||||
"AdvSceneSwitcher.action.variable.entry.substringRegex"),
|
"AdvSceneSwitcher.action.variable.layout.substringRegex"),
|
||||||
_subStringRegexEntryLayout, widgetPlaceholders);
|
_subStringRegexEntryLayout, widgetPlaceholders);
|
||||||
|
|
||||||
PlaceWidgets(
|
PlaceWidgets(
|
||||||
obs_module_text(
|
obs_module_text(
|
||||||
"AdvSceneSwitcher.action.variable.entry.findAndReplace"),
|
"AdvSceneSwitcher.action.variable.layout.findAndReplace"),
|
||||||
_findReplaceLayout, widgetPlaceholders, false);
|
_findReplaceLayout, widgetPlaceholders, false);
|
||||||
|
|
||||||
PlaceWidgets(
|
PlaceWidgets(
|
||||||
obs_module_text(
|
obs_module_text(
|
||||||
"AdvSceneSwitcher.action.variable.entry.userInput.customPrompt"),
|
"AdvSceneSwitcher.action.variable.layout.userInput.customPrompt"),
|
||||||
_promptLayout, widgetPlaceholders);
|
_promptLayout, widgetPlaceholders);
|
||||||
PlaceWidgets(
|
PlaceWidgets(
|
||||||
obs_module_text(
|
obs_module_text(
|
||||||
"AdvSceneSwitcher.action.variable.entry.userInput.placeholder"),
|
"AdvSceneSwitcher.action.variable.layout.userInput.placeholder"),
|
||||||
_placeholderLayout, widgetPlaceholders);
|
_placeholderLayout, widgetPlaceholders);
|
||||||
|
|
||||||
auto randomLayout = new QHBoxLayout();
|
auto randomLayout = new QHBoxLayout();
|
||||||
PlaceWidgets(
|
PlaceWidgets(
|
||||||
obs_module_text(
|
obs_module_text(
|
||||||
"AdvSceneSwitcher.action.variable.entry.randomNumber"),
|
"AdvSceneSwitcher.action.variable.layout.randomNumber"),
|
||||||
randomLayout, widgetPlaceholders);
|
randomLayout, widgetPlaceholders);
|
||||||
_randomLayout->addLayout(randomLayout);
|
_randomLayout->addLayout(randomLayout);
|
||||||
_randomLayout->addWidget(_generateInteger);
|
_randomLayout->addWidget(_generateInteger);
|
||||||
@@ -1057,17 +1108,15 @@ void MacroActionVariableEdit::UpdateEntryData()
|
|||||||
_randomNumberStart->SetValue(_entryData->_randomNumberStart);
|
_randomNumberStart->SetValue(_entryData->_randomNumberStart);
|
||||||
_randomNumberEnd->SetValue(_entryData->_randomNumberEnd);
|
_randomNumberEnd->SetValue(_entryData->_randomNumberEnd);
|
||||||
_generateInteger->setChecked(_entryData->_generateInteger);
|
_generateInteger->setChecked(_entryData->_generateInteger);
|
||||||
|
_jsonQuery->setText(_entryData->_jsonQuery);
|
||||||
|
_jsonIndex->SetValue(_entryData->_jsonIndex);
|
||||||
|
|
||||||
SetWidgetVisibility();
|
SetWidgetVisibility();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroActionVariableEdit::VariableChanged(const QString &text)
|
void MacroActionVariableEdit::VariableChanged(const QString &text)
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_variable = GetWeakVariableByQString(text);
|
_entryData->_variable = GetWeakVariableByQString(text);
|
||||||
emit HeaderInfoChanged(
|
emit HeaderInfoChanged(
|
||||||
QString::fromStdString(_entryData->GetShortDesc()));
|
QString::fromStdString(_entryData->GetShortDesc()));
|
||||||
@@ -1075,11 +1124,7 @@ void MacroActionVariableEdit::VariableChanged(const QString &text)
|
|||||||
|
|
||||||
void MacroActionVariableEdit::Variable2Changed(const QString &text)
|
void MacroActionVariableEdit::Variable2Changed(const QString &text)
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_variable2 = GetWeakVariableByQString(text);
|
_entryData->_variable2 = GetWeakVariableByQString(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1105,11 +1150,7 @@ void MacroActionVariableEdit::ActionChanged(int idx)
|
|||||||
|
|
||||||
void MacroActionVariableEdit::StrValueChanged()
|
void MacroActionVariableEdit::StrValueChanged()
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_strValue = _strValue->toPlainText().toStdString();
|
_entryData->_strValue = _strValue->toPlainText().toStdString();
|
||||||
adjustSize();
|
adjustSize();
|
||||||
updateGeometry();
|
updateGeometry();
|
||||||
@@ -1118,21 +1159,13 @@ void MacroActionVariableEdit::StrValueChanged()
|
|||||||
void MacroActionVariableEdit::NumValueChanged(
|
void MacroActionVariableEdit::NumValueChanged(
|
||||||
const NumberVariable<double> &value)
|
const NumberVariable<double> &value)
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_numValue = value;
|
_entryData->_numValue = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroActionVariableEdit::SegmentIndexChanged(const IntVariable &val)
|
void MacroActionVariableEdit::SegmentIndexChanged(const IntVariable &val)
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->SetSegmentIndexValue(val - 1);
|
_entryData->SetSegmentIndexValue(val - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1238,32 +1271,20 @@ void MacroActionVariableEdit::MacroSegmentOrderChanged()
|
|||||||
void MacroActionVariableEdit::SubStringStartChanged(
|
void MacroActionVariableEdit::SubStringStartChanged(
|
||||||
const NumberVariable<int> &start)
|
const NumberVariable<int> &start)
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_subStringStart = start;
|
_entryData->_subStringStart = start;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroActionVariableEdit::SubStringSizeChanged(
|
void MacroActionVariableEdit::SubStringSizeChanged(
|
||||||
const NumberVariable<int> &size)
|
const NumberVariable<int> &size)
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_subStringSize = size;
|
_entryData->_subStringSize = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroActionVariableEdit::SubStringRegexChanged(const RegexConfig &conf)
|
void MacroActionVariableEdit::SubStringRegexChanged(const RegexConfig &conf)
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_subStringRegex = conf;
|
_entryData->_subStringRegex = conf;
|
||||||
|
|
||||||
SetWidgetVisibility();
|
SetWidgetVisibility();
|
||||||
@@ -1271,11 +1292,7 @@ void MacroActionVariableEdit::SubStringRegexChanged(const RegexConfig &conf)
|
|||||||
|
|
||||||
void MacroActionVariableEdit::RegexPatternChanged()
|
void MacroActionVariableEdit::RegexPatternChanged()
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_regexPattern = _regexPattern->toPlainText().toStdString();
|
_entryData->_regexPattern = _regexPattern->toPlainText().toStdString();
|
||||||
adjustSize();
|
adjustSize();
|
||||||
updateGeometry();
|
updateGeometry();
|
||||||
@@ -1284,21 +1301,13 @@ void MacroActionVariableEdit::RegexPatternChanged()
|
|||||||
void MacroActionVariableEdit::RegexMatchIdxChanged(
|
void MacroActionVariableEdit::RegexMatchIdxChanged(
|
||||||
const NumberVariable<int> &index)
|
const NumberVariable<int> &index)
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_regexMatchIdx = index;
|
_entryData->_regexMatchIdx = index;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroActionVariableEdit::FindStrValueChanged()
|
void MacroActionVariableEdit::FindStrValueChanged()
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_findStr = _findStr->toPlainText().toStdString();
|
_entryData->_findStr = _findStr->toPlainText().toStdString();
|
||||||
adjustSize();
|
adjustSize();
|
||||||
updateGeometry();
|
updateGeometry();
|
||||||
@@ -1306,11 +1315,7 @@ void MacroActionVariableEdit::FindStrValueChanged()
|
|||||||
|
|
||||||
void MacroActionVariableEdit::FindRegexChanged(const RegexConfig &conf)
|
void MacroActionVariableEdit::FindRegexChanged(const RegexConfig &conf)
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_findRegex = conf;
|
_entryData->_findRegex = conf;
|
||||||
adjustSize();
|
adjustSize();
|
||||||
updateGeometry();
|
updateGeometry();
|
||||||
@@ -1318,11 +1323,7 @@ void MacroActionVariableEdit::FindRegexChanged(const RegexConfig &conf)
|
|||||||
|
|
||||||
void MacroActionVariableEdit::ReplaceStrValueChanged()
|
void MacroActionVariableEdit::ReplaceStrValueChanged()
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_replaceStr = _replaceStr->toPlainText().toStdString();
|
_entryData->_replaceStr = _replaceStr->toPlainText().toStdString();
|
||||||
adjustSize();
|
adjustSize();
|
||||||
updateGeometry();
|
updateGeometry();
|
||||||
@@ -1330,11 +1331,7 @@ void MacroActionVariableEdit::ReplaceStrValueChanged()
|
|||||||
|
|
||||||
void MacroActionVariableEdit::MathExpressionChanged()
|
void MacroActionVariableEdit::MathExpressionChanged()
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_mathExpression = _mathExpression->text().toStdString();
|
_entryData->_mathExpression = _mathExpression->text().toStdString();
|
||||||
|
|
||||||
// In case of invalid expression display an error
|
// In case of invalid expression display an error
|
||||||
@@ -1352,73 +1349,45 @@ void MacroActionVariableEdit::MathExpressionChanged()
|
|||||||
|
|
||||||
void MacroActionVariableEdit::UseCustomPromptChanged(int value)
|
void MacroActionVariableEdit::UseCustomPromptChanged(int value)
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_useCustomPrompt = value;
|
_entryData->_useCustomPrompt = value;
|
||||||
SetWidgetVisibility();
|
SetWidgetVisibility();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroActionVariableEdit::InputPromptChanged()
|
void MacroActionVariableEdit::InputPromptChanged()
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_inputPrompt = _inputPrompt->text().toStdString();
|
_entryData->_inputPrompt = _inputPrompt->text().toStdString();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroActionVariableEdit::UseInputPlaceholderChanged(int value)
|
void MacroActionVariableEdit::UseInputPlaceholderChanged(int value)
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_useInputPlaceholder = value;
|
_entryData->_useInputPlaceholder = value;
|
||||||
SetWidgetVisibility();
|
SetWidgetVisibility();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroActionVariableEdit::InputPlaceholderChanged()
|
void MacroActionVariableEdit::InputPlaceholderChanged()
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_inputPlaceholder = _inputPlaceholder->text().toStdString();
|
_entryData->_inputPlaceholder = _inputPlaceholder->text().toStdString();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroActionVariableEdit::EnvVariableChanged()
|
void MacroActionVariableEdit::EnvVariableChanged()
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_envVariableName = _envVariable->text().toStdString();
|
_entryData->_envVariableName = _envVariable->text().toStdString();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroActionVariableEdit::SceneChanged(const SceneSelection &scene)
|
void MacroActionVariableEdit::SceneChanged(const SceneSelection &scene)
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_scene = scene;
|
_entryData->_scene = scene;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroActionVariableEdit::SelectionChanged(const TempVariableRef &var)
|
void MacroActionVariableEdit::SelectionChanged(const TempVariableRef &var)
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_tempVar = var;
|
_entryData->_tempVar = var;
|
||||||
SetWidgetVisibility();
|
SetWidgetVisibility();
|
||||||
}
|
}
|
||||||
@@ -1426,21 +1395,13 @@ void MacroActionVariableEdit::SelectionChanged(const TempVariableRef &var)
|
|||||||
void MacroActionVariableEdit::SceneItemIndexChanged(
|
void MacroActionVariableEdit::SceneItemIndexChanged(
|
||||||
const NumberVariable<int> &value)
|
const NumberVariable<int> &value)
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_sceneItemIndex = value;
|
_entryData->_sceneItemIndex = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroActionVariableEdit::DirectionChanged(int value)
|
void MacroActionVariableEdit::DirectionChanged(int value)
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_direction =
|
_entryData->_direction =
|
||||||
static_cast<MacroActionVariable::Direction>(value);
|
static_cast<MacroActionVariable::Direction>(value);
|
||||||
}
|
}
|
||||||
@@ -1448,21 +1409,13 @@ void MacroActionVariableEdit::DirectionChanged(int value)
|
|||||||
void MacroActionVariableEdit::StringLengthChanged(
|
void MacroActionVariableEdit::StringLengthChanged(
|
||||||
const NumberVariable<int> &value)
|
const NumberVariable<int> &value)
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_stringLength = value;
|
_entryData->_stringLength = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroActionVariableEdit::CharSelectionChanged(const QString &character)
|
void MacroActionVariableEdit::CharSelectionChanged(const QString &character)
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
if (character.isEmpty()) {
|
if (character.isEmpty()) {
|
||||||
_entryData->_paddingChar = ' ';
|
_entryData->_paddingChar = ' ';
|
||||||
} else {
|
} else {
|
||||||
@@ -1472,11 +1425,7 @@ void MacroActionVariableEdit::CharSelectionChanged(const QString &character)
|
|||||||
|
|
||||||
void MacroActionVariableEdit::CaseTypeChanged(int index)
|
void MacroActionVariableEdit::CaseTypeChanged(int index)
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_caseType = static_cast<MacroActionVariable::CaseType>(
|
_entryData->_caseType = static_cast<MacroActionVariable::CaseType>(
|
||||||
_caseType->itemData(index).toInt());
|
_caseType->itemData(index).toInt());
|
||||||
}
|
}
|
||||||
@@ -1501,6 +1450,18 @@ void MacroActionVariableEdit::GenerateIntegerChanged(int value)
|
|||||||
_entryData->_generateInteger = value;
|
_entryData->_generateInteger = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MacroActionVariableEdit::JsonQueryChanged()
|
||||||
|
{
|
||||||
|
GUARD_LOADING_AND_LOCK();
|
||||||
|
_entryData->_jsonQuery = _jsonQuery->text().toStdString();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MacroActionVariableEdit::JsonIndexChanged(const NumberVariable<int> &value)
|
||||||
|
{
|
||||||
|
GUARD_LOADING_AND_LOCK();
|
||||||
|
_entryData->_jsonIndex = value;
|
||||||
|
}
|
||||||
|
|
||||||
void MacroActionVariableEdit::SetWidgetVisibility()
|
void MacroActionVariableEdit::SetWidgetVisibility()
|
||||||
{
|
{
|
||||||
if (!_entryData) {
|
if (!_entryData) {
|
||||||
@@ -1524,19 +1485,22 @@ void MacroActionVariableEdit::SetWidgetVisibility()
|
|||||||
{"{{stringLength}}", _stringLength},
|
{"{{stringLength}}", _stringLength},
|
||||||
{"{{paddingCharSelection}}", _paddingCharSelection},
|
{"{{paddingCharSelection}}", _paddingCharSelection},
|
||||||
{"{{caseType}}", _caseType},
|
{"{{caseType}}", _caseType},
|
||||||
|
{"{{jsonQuery}}", _jsonQuery},
|
||||||
|
{"{{jsonQueryHelp}}", _jsonQueryHelp},
|
||||||
|
{"{{jsonIndex}}", _jsonIndex},
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *layoutString = "";
|
const char *layoutString = "";
|
||||||
if (_entryData->_action == MacroActionVariable::Action::PAD) {
|
if (_entryData->_action == MacroActionVariable::Action::PAD) {
|
||||||
layoutString = obs_module_text(
|
layoutString = obs_module_text(
|
||||||
"AdvSceneSwitcher.action.variable.entry.pad");
|
"AdvSceneSwitcher.action.variable.layout.pad");
|
||||||
} else if (_entryData->_action ==
|
} else if (_entryData->_action ==
|
||||||
MacroActionVariable::Action::TRUNCATE) {
|
MacroActionVariable::Action::TRUNCATE) {
|
||||||
layoutString = obs_module_text(
|
layoutString = obs_module_text(
|
||||||
"AdvSceneSwitcher.action.variable.entry.truncate");
|
"AdvSceneSwitcher.action.variable.layout.truncate");
|
||||||
} else {
|
} else {
|
||||||
layoutString = obs_module_text(
|
layoutString = obs_module_text(
|
||||||
"AdvSceneSwitcher.action.variable.entry.other");
|
"AdvSceneSwitcher.action.variable.layout.other");
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const auto &[_, widget] : widgetPlaceholders) {
|
for (const auto &[_, widget] : widgetPlaceholders) {
|
||||||
@@ -1552,7 +1516,8 @@ void MacroActionVariableEdit::SetWidgetVisibility()
|
|||||||
MacroActionVariable::Action::MATH_EXPRESSION ||
|
MacroActionVariable::Action::MATH_EXPRESSION ||
|
||||||
_entryData->_action == MacroActionVariable::Action::ENV_VARIABLE ||
|
_entryData->_action == MacroActionVariable::Action::ENV_VARIABLE ||
|
||||||
_entryData->_action == MacroActionVariable::Action::STRING_LENGTH ||
|
_entryData->_action == MacroActionVariable::Action::STRING_LENGTH ||
|
||||||
_entryData->_action == MacroActionVariable::Action::EXTRACT_JSON) {
|
_entryData->_action == MacroActionVariable::Action::EXTRACT_JSON ||
|
||||||
|
_entryData->_action == MacroActionVariable::Action::QUERY_JSON) {
|
||||||
RemoveStretchIfPresent(_entryLayout);
|
RemoveStretchIfPresent(_entryLayout);
|
||||||
} else {
|
} else {
|
||||||
AddStretchIfNecessary(_entryLayout);
|
AddStretchIfNecessary(_entryLayout);
|
||||||
@@ -1664,6 +1629,12 @@ void MacroActionVariableEdit::SetWidgetVisibility()
|
|||||||
SetLayoutVisible(_randomLayout,
|
SetLayoutVisible(_randomLayout,
|
||||||
_entryData->_action ==
|
_entryData->_action ==
|
||||||
MacroActionVariable::Action::RANDOM_NUMBER);
|
MacroActionVariable::Action::RANDOM_NUMBER);
|
||||||
|
_jsonQuery->setVisible(_entryData->_action ==
|
||||||
|
MacroActionVariable::Action::QUERY_JSON);
|
||||||
|
_jsonQueryHelp->setVisible(_entryData->_action ==
|
||||||
|
MacroActionVariable::Action::QUERY_JSON);
|
||||||
|
_jsonIndex->setVisible(_entryData->_action ==
|
||||||
|
MacroActionVariable::Action::ARRAY_JSON);
|
||||||
|
|
||||||
adjustSize();
|
adjustSize();
|
||||||
updateGeometry();
|
updateGeometry();
|
||||||
|
|||||||
@@ -53,6 +53,8 @@ public:
|
|||||||
TRIM,
|
TRIM,
|
||||||
CHANGE_CASE,
|
CHANGE_CASE,
|
||||||
RANDOM_NUMBER,
|
RANDOM_NUMBER,
|
||||||
|
QUERY_JSON,
|
||||||
|
ARRAY_JSON,
|
||||||
};
|
};
|
||||||
|
|
||||||
Action _action = Action::SET_VALUE;
|
Action _action = Action::SET_VALUE;
|
||||||
@@ -104,6 +106,9 @@ public:
|
|||||||
DoubleVariable _randomNumberEnd = 100;
|
DoubleVariable _randomNumberEnd = 100;
|
||||||
bool _generateInteger = true;
|
bool _generateInteger = true;
|
||||||
|
|
||||||
|
StringVariable _jsonQuery = "$.some.nested.value";
|
||||||
|
IntVariable _jsonIndex = 0;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void DecrementCurrentSegmentVariableRef();
|
void DecrementCurrentSegmentVariableRef();
|
||||||
void HandleIndexSubString(Variable *);
|
void HandleIndexSubString(Variable *);
|
||||||
@@ -169,6 +174,8 @@ private slots:
|
|||||||
void RandomNumberStartChanged(const NumberVariable<double> &);
|
void RandomNumberStartChanged(const NumberVariable<double> &);
|
||||||
void RandomNumberEndChanged(const NumberVariable<double> &);
|
void RandomNumberEndChanged(const NumberVariable<double> &);
|
||||||
void GenerateIntegerChanged(int);
|
void GenerateIntegerChanged(int);
|
||||||
|
void JsonQueryChanged();
|
||||||
|
void JsonIndexChanged(const NumberVariable<int> &);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void HeaderInfoChanged(const QString &);
|
void HeaderInfoChanged(const QString &);
|
||||||
@@ -218,6 +225,9 @@ private:
|
|||||||
VariableDoubleSpinBox *_randomNumberEnd;
|
VariableDoubleSpinBox *_randomNumberEnd;
|
||||||
QCheckBox *_generateInteger;
|
QCheckBox *_generateInteger;
|
||||||
QVBoxLayout *_randomLayout;
|
QVBoxLayout *_randomLayout;
|
||||||
|
VariableLineEdit *_jsonQuery;
|
||||||
|
QLabel *_jsonQueryHelp;
|
||||||
|
VariableSpinBox *_jsonIndex;
|
||||||
QHBoxLayout *_entryLayout;
|
QHBoxLayout *_entryLayout;
|
||||||
|
|
||||||
std::shared_ptr<MacroActionVariable> _entryData;
|
std::shared_ptr<MacroActionVariable> _entryData;
|
||||||
|
|||||||
@@ -11,15 +11,12 @@ bool MacroAction::Save(obs_data_t *obj) const
|
|||||||
{
|
{
|
||||||
MacroSegment::Save(obj);
|
MacroSegment::Save(obj);
|
||||||
obs_data_set_string(obj, "id", GetId().c_str());
|
obs_data_set_string(obj, "id", GetId().c_str());
|
||||||
obs_data_set_bool(obj, "enabled", _enabled);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MacroAction::Load(obs_data_t *obj)
|
bool MacroAction::Load(obs_data_t *obj)
|
||||||
{
|
{
|
||||||
MacroSegment::Load(obj);
|
MacroSegment::Load(obj);
|
||||||
obs_data_set_default_bool(obj, "enabled", true);
|
|
||||||
_enabled = obs_data_get_bool(obj, "enabled");
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -28,16 +25,6 @@ void MacroAction::LogAction() const
|
|||||||
ablog(LOG_INFO, "performed action %s", GetId().c_str());
|
ablog(LOG_INFO, "performed action %s", GetId().c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroAction::SetEnabled(bool value)
|
|
||||||
{
|
|
||||||
_enabled = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MacroAction::Enabled() const
|
|
||||||
{
|
|
||||||
return _enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MacroAction::ResolveVariablesToFixedValues() {}
|
void MacroAction::ResolveVariablesToFixedValues() {}
|
||||||
|
|
||||||
std::string_view MacroAction::GetDefaultID()
|
std::string_view MacroAction::GetDefaultID()
|
||||||
|
|||||||
@@ -19,13 +19,9 @@ public:
|
|||||||
// Used to resolve variables before actions are added to action queues
|
// Used to resolve variables before actions are added to action queues
|
||||||
virtual void ResolveVariablesToFixedValues();
|
virtual void ResolveVariablesToFixedValues();
|
||||||
|
|
||||||
void SetEnabled(bool);
|
|
||||||
bool Enabled() const;
|
|
||||||
|
|
||||||
static std::string_view GetDefaultID();
|
static std::string_view GetDefaultID();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool _enabled = true;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class EXPORT MacroRefAction : virtual public MacroAction {
|
class EXPORT MacroRefAction : virtual public MacroAction {
|
||||||
|
|||||||
@@ -138,7 +138,7 @@ MacroConditionEdit::MacroConditionEdit(
|
|||||||
mainLayout->addWidget(_frame);
|
mainLayout->addWidget(_frame);
|
||||||
setLayout(mainLayout);
|
setLayout(mainLayout);
|
||||||
|
|
||||||
UpdateEntryData(id);
|
SetupWidgets(true);
|
||||||
_loading = false;
|
_loading = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -152,9 +152,11 @@ void MacroConditionEdit::LogicSelectionChanged(int idx)
|
|||||||
const auto logic = static_cast<Logic::Type>(
|
const auto logic = static_cast<Logic::Type>(
|
||||||
_logicSelection->itemData(idx).toInt());
|
_logicSelection->itemData(idx).toInt());
|
||||||
(*_entryData)->SetLogicType(logic);
|
(*_entryData)->SetLogicType(logic);
|
||||||
|
|
||||||
|
SetEnableAppearance(logic != Logic::Type::NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MacroConditionEdit::IsRootNode()
|
bool MacroConditionEdit::IsRootNode() const
|
||||||
{
|
{
|
||||||
return _isRoot;
|
return _isRoot;
|
||||||
}
|
}
|
||||||
@@ -164,6 +166,7 @@ void MacroConditionEdit::SetLogicSelection()
|
|||||||
const auto logic = (*_entryData)->GetLogicType();
|
const auto logic = (*_entryData)->GetLogicType();
|
||||||
_logicSelection->setCurrentIndex(
|
_logicSelection->setCurrentIndex(
|
||||||
_logicSelection->findData(static_cast<int>(logic)));
|
_logicSelection->findData(static_cast<int>(logic)));
|
||||||
|
SetEnableAppearance(logic != Logic::Type::NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroConditionEdit::SetRootNode(bool root)
|
void MacroConditionEdit::SetRootNode(bool root)
|
||||||
@@ -175,23 +178,36 @@ void MacroConditionEdit::SetRootNode(bool root)
|
|||||||
SetLogicSelection();
|
SetLogicSelection();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroConditionEdit::UpdateEntryData(const std::string &id)
|
void MacroConditionEdit::SetupWidgets(bool basicSetup)
|
||||||
{
|
{
|
||||||
|
if (_allWidgetsAreSetup) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto id = (*_entryData)->GetId();
|
||||||
_conditionSelection->setCurrentText(obs_module_text(
|
_conditionSelection->setCurrentText(obs_module_text(
|
||||||
MacroConditionFactory::GetConditionName(id).c_str()));
|
MacroConditionFactory::GetConditionName(id).c_str()));
|
||||||
auto widget =
|
|
||||||
MacroConditionFactory::CreateWidget(id, this, *_entryData);
|
|
||||||
QWidget::connect(widget, SIGNAL(HeaderInfoChanged(const QString &)),
|
|
||||||
this, SLOT(HeaderInfoChanged(const QString &)));
|
|
||||||
HeaderInfoChanged(
|
HeaderInfoChanged(
|
||||||
QString::fromStdString((*_entryData)->GetShortDesc()));
|
QString::fromStdString((*_entryData)->GetShortDesc()));
|
||||||
SetLogicSelection();
|
SetLogicSelection();
|
||||||
_section->SetContent(widget, (*_entryData)->GetCollapsed());
|
|
||||||
|
|
||||||
_dur->setVisible(MacroConditionFactory::UsesDurationModifier(id));
|
_dur->setVisible(MacroConditionFactory::UsesDurationModifier(id));
|
||||||
auto modifier = (*_entryData)->GetDurationModifier();
|
auto modifier = (*_entryData)->GetDurationModifier();
|
||||||
_dur->SetValue(modifier);
|
_dur->SetValue(modifier);
|
||||||
|
|
||||||
|
if (basicSetup) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto widget =
|
||||||
|
MacroConditionFactory::CreateWidget(id, this, *_entryData);
|
||||||
|
QWidget::connect(widget, SIGNAL(HeaderInfoChanged(const QString &)),
|
||||||
|
this, SLOT(HeaderInfoChanged(const QString &)));
|
||||||
|
_section->SetContent(widget, (*_entryData)->GetCollapsed());
|
||||||
SetFocusPolicyOfWidgets();
|
SetFocusPolicyOfWidgets();
|
||||||
|
|
||||||
|
_allWidgetsAreSetup = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroConditionEdit::SetEntryData(std::shared_ptr<MacroCondition> *data)
|
void MacroConditionEdit::SetEntryData(std::shared_ptr<MacroCondition> *data)
|
||||||
|
|||||||
@@ -39,9 +39,9 @@ public:
|
|||||||
std::shared_ptr<MacroCondition> * = nullptr,
|
std::shared_ptr<MacroCondition> * = nullptr,
|
||||||
const std::string &id = MacroCondition::GetDefaultID().data(),
|
const std::string &id = MacroCondition::GetDefaultID().data(),
|
||||||
bool root = true);
|
bool root = true);
|
||||||
bool IsRootNode();
|
bool IsRootNode() const;
|
||||||
void SetRootNode(bool);
|
void SetRootNode(bool);
|
||||||
void UpdateEntryData(const std::string &id);
|
void SetupWidgets(bool basicSetup = false);
|
||||||
void SetEntryData(std::shared_ptr<MacroCondition> *);
|
void SetEntryData(std::shared_ptr<MacroCondition> *);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ class MacroConditionFactory {
|
|||||||
public:
|
public:
|
||||||
MacroConditionFactory() = delete;
|
MacroConditionFactory() = delete;
|
||||||
EXPORT static bool Register(const std::string &, MacroConditionInfo);
|
EXPORT static bool Register(const std::string &, MacroConditionInfo);
|
||||||
static bool Deregister(const std::string &);
|
EXPORT static bool Deregister(const std::string &);
|
||||||
static std::shared_ptr<MacroCondition> Create(const std::string &,
|
static std::shared_ptr<MacroCondition> Create(const std::string &,
|
||||||
Macro *m);
|
Macro *m);
|
||||||
static QWidget *CreateWidget(const std::string &id, QWidget *parent,
|
static QWidget *CreateWidget(const std::string &id, QWidget *parent,
|
||||||
|
|||||||
@@ -78,36 +78,36 @@ bool MacroSwitchedScene()
|
|||||||
return macroSceneSwitched;
|
return macroSceneSwitched;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string GetMacroName(Macro *macro)
|
std::string GetMacroName(const Macro *macro)
|
||||||
{
|
{
|
||||||
return macro ? macro->Name() : "";
|
return macro ? macro->Name() : "";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::chrono::high_resolution_clock::time_point
|
std::chrono::high_resolution_clock::time_point
|
||||||
LastMacroConditionCheckTime(Macro *macro)
|
LastMacroConditionCheckTime(const Macro *macro)
|
||||||
{
|
{
|
||||||
return macro ? macro->LastConditionCheckTime()
|
return macro ? macro->LastConditionCheckTime()
|
||||||
: std::chrono::high_resolution_clock::time_point{};
|
: std::chrono::high_resolution_clock::time_point{};
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MacroIsStopped(Macro *macro)
|
bool MacroIsStopped(const Macro *macro)
|
||||||
{
|
{
|
||||||
return macro ? macro->GetStop() : true;
|
return macro ? macro->GetStop() : true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MacroIsPaused(Macro *macro)
|
bool MacroIsPaused(const Macro *macro)
|
||||||
{
|
{
|
||||||
return macro ? macro->Paused() : true;
|
return macro ? macro->Paused() : true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MacroWasPausedSince(
|
bool MacroWasPausedSince(
|
||||||
Macro *macro,
|
const Macro *macro,
|
||||||
const std::chrono::high_resolution_clock::time_point &time)
|
const std::chrono::high_resolution_clock::time_point &time)
|
||||||
{
|
{
|
||||||
return macro ? macro->WasPausedSince(time) : false;
|
return macro ? macro->WasPausedSince(time) : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MacroWasCheckedSinceLastStart(Macro *macro)
|
bool MacroWasCheckedSinceLastStart(const Macro *macro)
|
||||||
{
|
{
|
||||||
if (!macro) {
|
if (!macro) {
|
||||||
return false;
|
return false;
|
||||||
@@ -144,7 +144,7 @@ void ResetMacroRunCount(Macro *macro)
|
|||||||
macro->ResetRunCount();
|
macro->ResetRunCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsValidMacroSegmentIndex(Macro *m, const int idx, bool isCondition)
|
bool IsValidMacroSegmentIndex(const Macro *m, const int idx, bool isCondition)
|
||||||
{
|
{
|
||||||
if (!m || idx < 0) {
|
if (!m || idx < 0) {
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -41,17 +41,17 @@ EXPORT std::atomic_int &GetShutdownConditionCount();
|
|||||||
EXPORT void SetMacroSwitchedScene(bool value);
|
EXPORT void SetMacroSwitchedScene(bool value);
|
||||||
EXPORT bool MacroSwitchedScene();
|
EXPORT bool MacroSwitchedScene();
|
||||||
|
|
||||||
EXPORT std::string GetMacroName(Macro *);
|
EXPORT std::string GetMacroName(const Macro *);
|
||||||
|
|
||||||
EXPORT std::chrono::high_resolution_clock::time_point
|
EXPORT std::chrono::high_resolution_clock::time_point
|
||||||
LastMacroConditionCheckTime(Macro *);
|
LastMacroConditionCheckTime(const Macro *);
|
||||||
|
|
||||||
EXPORT bool MacroIsStopped(Macro *);
|
EXPORT bool MacroIsStopped(const Macro *);
|
||||||
EXPORT bool MacroIsPaused(Macro *);
|
EXPORT bool MacroIsPaused(const Macro *);
|
||||||
EXPORT bool
|
EXPORT bool
|
||||||
MacroWasPausedSince(Macro *,
|
MacroWasPausedSince(const Macro *,
|
||||||
const std::chrono::high_resolution_clock::time_point &);
|
const std::chrono::high_resolution_clock::time_point &);
|
||||||
EXPORT bool MacroWasCheckedSinceLastStart(Macro *);
|
EXPORT bool MacroWasCheckedSinceLastStart(const Macro *);
|
||||||
|
|
||||||
EXPORT void AddMacroHelperThread(Macro *, std::thread &&);
|
EXPORT void AddMacroHelperThread(Macro *, std::thread &&);
|
||||||
|
|
||||||
@@ -68,6 +68,6 @@ EXPORT void InvalidateMacroTempVarValues();
|
|||||||
EXPORT void ResetMacroConditionTimers(Macro *);
|
EXPORT void ResetMacroConditionTimers(Macro *);
|
||||||
EXPORT void ResetMacroRunCount(Macro *);
|
EXPORT void ResetMacroRunCount(Macro *);
|
||||||
|
|
||||||
bool IsValidMacroSegmentIndex(Macro *m, const int idx, bool isCondition);
|
bool IsValidMacroSegmentIndex(const Macro *m, const int idx, bool isCondition);
|
||||||
|
|
||||||
} // namespace advss
|
} // namespace advss
|
||||||
|
|||||||
@@ -13,6 +13,8 @@
|
|||||||
|
|
||||||
namespace advss {
|
namespace advss {
|
||||||
|
|
||||||
|
bool MacroSegmentList::_useCache = true;
|
||||||
|
|
||||||
MacroSegmentList::MacroSegmentList(QWidget *parent)
|
MacroSegmentList::MacroSegmentList(QWidget *parent)
|
||||||
: QScrollArea(parent),
|
: QScrollArea(parent),
|
||||||
_layout(new QVBoxLayout),
|
_layout(new QVBoxLayout),
|
||||||
@@ -35,14 +37,26 @@ MacroSegmentList::MacroSegmentList(QWidget *parent)
|
|||||||
setWidget(wrapper);
|
setWidget(wrapper);
|
||||||
setWidgetResizable(true);
|
setWidgetResizable(true);
|
||||||
setAcceptDrops(true);
|
setAcceptDrops(true);
|
||||||
|
|
||||||
|
connect(verticalScrollBar(), &QScrollBar::valueChanged, this,
|
||||||
|
[this]() { SetupVisibleMacroSegmentWidgets(); });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void clearWidgetVector(const std::vector<QWidget *> &widgets)
|
||||||
|
{
|
||||||
|
for (auto widget : widgets) {
|
||||||
|
widget->deleteLater();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
MacroSegmentList::~MacroSegmentList()
|
MacroSegmentList::~MacroSegmentList()
|
||||||
{
|
{
|
||||||
if (_autoScrollThread.joinable()) {
|
if (_autoScrollThread.joinable()) {
|
||||||
_autoScroll = false;
|
_autoScroll = false;
|
||||||
_autoScrollThread.join();
|
_autoScrollThread.join();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ClearWidgetCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool posIsInScrollbar(const QScrollBar *scrollbar, const QPoint &pos)
|
static bool posIsInScrollbar(const QScrollBar *scrollbar, const QPoint &pos)
|
||||||
@@ -53,7 +67,7 @@ static bool posIsInScrollbar(const QScrollBar *scrollbar, const QPoint &pos)
|
|||||||
if (!scrollbar->isVisible()) {
|
if (!scrollbar->isVisible()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
const auto geo = scrollbar->geometry();
|
const auto &geo = scrollbar->geometry();
|
||||||
const auto globalGeo = QRect(scrollbar->mapToGlobal(geo.topLeft()),
|
const auto globalGeo = QRect(scrollbar->mapToGlobal(geo.topLeft()),
|
||||||
scrollbar->mapToGlobal(geo.bottomRight()));
|
scrollbar->mapToGlobal(geo.bottomRight()));
|
||||||
return globalGeo.contains(pos);
|
return globalGeo.contains(pos);
|
||||||
@@ -98,16 +112,18 @@ void MacroSegmentList::SetHelpMsgVisible(bool visible) const
|
|||||||
_helpMsg->setVisible(visible);
|
_helpMsg->setVisible(visible);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroSegmentList::Insert(int idx, MacroSegmentEdit *widget)
|
void MacroSegmentList::Insert(int idx, QWidget *widget)
|
||||||
{
|
{
|
||||||
widget->installEventFilter(this);
|
widget->installEventFilter(this);
|
||||||
_contentLayout->insertWidget(idx, widget);
|
_contentLayout->insertWidget(idx, widget);
|
||||||
|
SetupVisibleMacroSegmentWidgets();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroSegmentList::Add(QWidget *widget)
|
void MacroSegmentList::Add(QWidget *widget)
|
||||||
{
|
{
|
||||||
widget->installEventFilter(this);
|
widget->installEventFilter(this);
|
||||||
_contentLayout->addWidget(widget);
|
_contentLayout->addWidget(widget);
|
||||||
|
SetupVisibleMacroSegmentWidgets();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroSegmentList::Remove(int idx) const
|
void MacroSegmentList::Remove(int idx) const
|
||||||
@@ -120,6 +136,61 @@ void MacroSegmentList::Clear(int idx) const
|
|||||||
ClearLayout(_contentLayout, idx);
|
ClearLayout(_contentLayout, idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MacroSegmentList::SetCachingEnabled(bool enable)
|
||||||
|
{
|
||||||
|
_useCache = enable;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MacroSegmentList::CacheCurrentWidgetsFor(const Macro *macro)
|
||||||
|
{
|
||||||
|
if (!_useCache) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<QWidget *> result;
|
||||||
|
int idx = 0;
|
||||||
|
QLayoutItem *item;
|
||||||
|
while ((item = _contentLayout->takeAt(idx))) {
|
||||||
|
if (!item || !item->widget()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
auto widget = item->widget();
|
||||||
|
widget->hide();
|
||||||
|
result.emplace_back(widget);
|
||||||
|
}
|
||||||
|
|
||||||
|
_widgetCache[macro] = result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MacroSegmentList::PopulateWidgetsFromCache(const Macro *macro)
|
||||||
|
{
|
||||||
|
if (!_useCache) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto it = _widgetCache.find(macro);
|
||||||
|
if (it == _widgetCache.end()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto widget : it->second) {
|
||||||
|
_contentLayout->addWidget(widget);
|
||||||
|
widget->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MacroSegmentList::ClearWidgetsFromCacheFor(const Macro *macro)
|
||||||
|
{
|
||||||
|
auto it = _widgetCache.find(macro);
|
||||||
|
if (it == _widgetCache.end()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
clearWidgetVector(it->second);
|
||||||
|
_widgetCache.erase(it);
|
||||||
|
}
|
||||||
|
|
||||||
void MacroSegmentList::Highlight(int idx, QColor color)
|
void MacroSegmentList::Highlight(int idx, QColor color)
|
||||||
{
|
{
|
||||||
auto item = _contentLayout->itemAt(idx);
|
auto item = _contentLayout->itemAt(idx);
|
||||||
@@ -265,6 +336,13 @@ void MacroSegmentList::HideLastDropLine()
|
|||||||
_dropLineIdx = -1;
|
_dropLineIdx = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MacroSegmentList::ClearWidgetCache()
|
||||||
|
{
|
||||||
|
for (const auto &[_, widgets] : _widgetCache) {
|
||||||
|
clearWidgetVector(widgets);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static bool isInUpperHalfOf(const QPoint &pos, const QRect &rect)
|
static bool isInUpperHalfOf(const QPoint &pos, const QRect &rect)
|
||||||
{
|
{
|
||||||
return QRect(rect.topLeft(),
|
return QRect(rect.topLeft(),
|
||||||
@@ -322,6 +400,36 @@ QRect MacroSegmentList::GetContentItemRectWithPadding(int idx) const
|
|||||||
return rect;
|
return rect;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MacroSegmentList::SetVisibilityCheckEnable(bool enable)
|
||||||
|
{
|
||||||
|
_checkVisibility = enable;
|
||||||
|
|
||||||
|
if (_checkVisibility) {
|
||||||
|
QTimer::singleShot(0, this, [this]() {
|
||||||
|
SetupVisibleMacroSegmentWidgets();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MacroSegmentList::SetupVisibleMacroSegmentWidgets()
|
||||||
|
{
|
||||||
|
if (!_checkVisibility) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto viewportRect = viewport()->rect();
|
||||||
|
|
||||||
|
for (auto segment : widget()->findChildren<MacroSegmentEdit *>()) {
|
||||||
|
const auto pos = segment->mapTo(viewport(), QPoint(0, 0));
|
||||||
|
const QRect rect(pos, segment->size());
|
||||||
|
if (!viewportRect.intersects(rect)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
segment->SetupWidgets();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int MacroSegmentList::GetSegmentIndexFromPos(const QPoint &pos) const
|
int MacroSegmentList::GetSegmentIndexFromPos(const QPoint &pos) const
|
||||||
{
|
{
|
||||||
int idx = -1;
|
int idx = -1;
|
||||||
@@ -455,4 +563,10 @@ void MacroSegmentList::dropEvent(QDropEvent *event)
|
|||||||
_dragPosition = -1;
|
_dragPosition = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MacroSegmentList::resizeEvent(QResizeEvent *event)
|
||||||
|
{
|
||||||
|
QScrollArea::resizeEvent(event);
|
||||||
|
SetupVisibleMacroSegmentWidgets();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace advss
|
} // namespace advss
|
||||||
|
|||||||
@@ -9,25 +9,32 @@
|
|||||||
|
|
||||||
namespace advss {
|
namespace advss {
|
||||||
|
|
||||||
|
class Macro;
|
||||||
|
|
||||||
class MacroSegmentList : public QScrollArea {
|
class MacroSegmentList : public QScrollArea {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MacroSegmentList(QWidget *parent = nullptr);
|
MacroSegmentList(QWidget *parent = nullptr);
|
||||||
virtual ~MacroSegmentList();
|
~MacroSegmentList();
|
||||||
void SetHelpMsg(const QString &msg) const;
|
void SetHelpMsg(const QString &msg) const;
|
||||||
void SetHelpMsgVisible(bool visible) const;
|
void SetHelpMsgVisible(bool visible) const;
|
||||||
MacroSegmentEdit *WidgetAt(int idx) const;
|
MacroSegmentEdit *WidgetAt(int idx) const;
|
||||||
MacroSegmentEdit *WidgetAt(const QPoint &) const;
|
MacroSegmentEdit *WidgetAt(const QPoint &) const;
|
||||||
int IndexAt(const QPoint &) const;
|
int IndexAt(const QPoint &) const;
|
||||||
void Insert(int idx, MacroSegmentEdit *widget);
|
void Insert(int idx, QWidget *widget);
|
||||||
void Add(QWidget *widget);
|
void Add(QWidget *widget);
|
||||||
void Remove(int idx) const;
|
void Remove(int idx) const;
|
||||||
void Clear(int idx = 0) const; // Clear all elements >= idx
|
void Clear(int idx = 0) const; // Clear all elements >= idx
|
||||||
|
static void SetCachingEnabled(bool enable);
|
||||||
|
void CacheCurrentWidgetsFor(const Macro *);
|
||||||
|
bool PopulateWidgetsFromCache(const Macro *);
|
||||||
|
void ClearWidgetsFromCacheFor(const Macro *);
|
||||||
void Highlight(int idx, QColor color = QColor(Qt::green));
|
void Highlight(int idx, QColor color = QColor(Qt::green));
|
||||||
void SetCollapsed(bool) const;
|
void SetCollapsed(bool) const;
|
||||||
void SetSelection(int idx) const;
|
void SetSelection(int idx) const;
|
||||||
QVBoxLayout *ContentLayout() const { return _contentLayout; }
|
QVBoxLayout *ContentLayout() const { return _contentLayout; }
|
||||||
|
void SetVisibilityCheckEnable(bool enable);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void SelectionChanged(int idx);
|
void SelectionChanged(int idx);
|
||||||
@@ -42,8 +49,10 @@ protected:
|
|||||||
void dragEnterEvent(QDragEnterEvent *event);
|
void dragEnterEvent(QDragEnterEvent *event);
|
||||||
void dragMoveEvent(QDragMoveEvent *event);
|
void dragMoveEvent(QDragMoveEvent *event);
|
||||||
void dropEvent(QDropEvent *event);
|
void dropEvent(QDropEvent *event);
|
||||||
|
void resizeEvent(QResizeEvent *event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void SetupVisibleMacroSegmentWidgets();
|
||||||
int GetSegmentIndexFromPos(const QPoint &) const;
|
int GetSegmentIndexFromPos(const QPoint &) const;
|
||||||
int GetDragIndex(const QPoint &) const;
|
int GetDragIndex(const QPoint &) const;
|
||||||
int GetDropIndex(const QPoint &) const;
|
int GetDropIndex(const QPoint &) const;
|
||||||
@@ -52,6 +61,7 @@ private:
|
|||||||
bool IsInListArea(const QPoint &) const;
|
bool IsInListArea(const QPoint &) const;
|
||||||
QRect GetContentItemRectWithPadding(int idx) const;
|
QRect GetContentItemRectWithPadding(int idx) const;
|
||||||
void HideLastDropLine();
|
void HideLastDropLine();
|
||||||
|
void ClearWidgetCache();
|
||||||
|
|
||||||
int _dragPosition = -1;
|
int _dragPosition = -1;
|
||||||
int _dropLineIdx = -1;
|
int _dropLineIdx = -1;
|
||||||
@@ -62,6 +72,11 @@ private:
|
|||||||
QVBoxLayout *_layout;
|
QVBoxLayout *_layout;
|
||||||
QVBoxLayout *_contentLayout;
|
QVBoxLayout *_contentLayout;
|
||||||
QLabel *_helpMsg;
|
QLabel *_helpMsg;
|
||||||
|
|
||||||
|
bool _checkVisibility = true;
|
||||||
|
|
||||||
|
static bool _useCache;
|
||||||
|
std::unordered_map<const Macro *, std::vector<QWidget *>> _widgetCache;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace advss
|
} // namespace advss
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QEvent>
|
#include <QEvent>
|
||||||
|
#include <QGraphicsOpacityEffect>
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
#include <QMouseEvent>
|
#include <QMouseEvent>
|
||||||
#include <QScrollBar>
|
#include <QScrollBar>
|
||||||
@@ -24,24 +25,24 @@ bool MacroSegment::Save(obs_data_t *obj) const
|
|||||||
obs_data_set_bool(data, "collapsed", _collapsed);
|
obs_data_set_bool(data, "collapsed", _collapsed);
|
||||||
obs_data_set_bool(data, "useCustomLabel", _useCustomLabel);
|
obs_data_set_bool(data, "useCustomLabel", _useCustomLabel);
|
||||||
obs_data_set_string(data, "customLabel", _customLabel.c_str());
|
obs_data_set_string(data, "customLabel", _customLabel.c_str());
|
||||||
|
obs_data_set_bool(data, "enabled", _enabled);
|
||||||
|
obs_data_set_int(data, "version", 1);
|
||||||
obs_data_set_obj(obj, "segmentSettings", data);
|
obs_data_set_obj(obj, "segmentSettings", data);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MacroSegment::Load(obs_data_t *obj)
|
bool MacroSegment::Load(obs_data_t *obj)
|
||||||
{
|
{
|
||||||
|
OBSDataAutoRelease data = obs_data_get_obj(obj, "segmentSettings");
|
||||||
|
_collapsed = obs_data_get_bool(data, "collapsed");
|
||||||
|
_useCustomLabel = obs_data_get_bool(data, "useCustomLabel");
|
||||||
|
_customLabel = obs_data_get_string(data, "customLabel");
|
||||||
|
obs_data_set_default_bool(data, "enabled", true);
|
||||||
|
_enabled = obs_data_get_bool(data, "enabled");
|
||||||
|
|
||||||
// TODO: remove this fallback at some point
|
// TODO: remove this fallback at some point
|
||||||
if (obs_data_has_user_value(obj, "segmentSettings")) {
|
if (!obs_data_has_user_value(data, "version")) {
|
||||||
OBSDataAutoRelease data =
|
_enabled = obs_data_get_bool(obj, "enabled");
|
||||||
obs_data_get_obj(obj, "segmentSettings");
|
|
||||||
_collapsed = obs_data_get_bool(data, "collapsed");
|
|
||||||
_useCustomLabel = obs_data_get_bool(data, "useCustomLabel");
|
|
||||||
_customLabel = obs_data_get_string(data, "customLabel");
|
|
||||||
} else {
|
|
||||||
_collapsed = obs_data_get_bool(obj, "collapsed");
|
|
||||||
_useCustomLabel = false;
|
|
||||||
_customLabel = obs_module_text(
|
|
||||||
"AdvSceneSwitcher.macroTab.segment.defaultCustomLabel");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ClearAvailableTempvars();
|
ClearAvailableTempvars();
|
||||||
@@ -73,6 +74,16 @@ bool MacroSegment::GetHighlightAndReset()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MacroSegment::SetEnabled(bool value)
|
||||||
|
{
|
||||||
|
_enabled = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MacroSegment::Enabled() const
|
||||||
|
{
|
||||||
|
return _enabled;
|
||||||
|
}
|
||||||
|
|
||||||
std::string MacroSegment::GetVariableValue() const
|
std::string MacroSegment::GetVariableValue() const
|
||||||
{
|
{
|
||||||
if (_supportsVariableValue) {
|
if (_supportsVariableValue) {
|
||||||
@@ -96,7 +107,7 @@ void MacroSegment::SetupTempVars()
|
|||||||
void MacroSegment::ClearAvailableTempvars()
|
void MacroSegment::ClearAvailableTempvars()
|
||||||
{
|
{
|
||||||
_tempVariables.clear();
|
_tempVariables.clear();
|
||||||
NotifyUIAboutTempVarChange();
|
NotifyUIAboutTempVarChange(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::shared_ptr<MacroSegment>
|
static std::shared_ptr<MacroSegment>
|
||||||
@@ -138,7 +149,7 @@ void MacroSegment::AddTempvar(const std::string &id, const std::string &name,
|
|||||||
|
|
||||||
TempVariable var(id, name, description, sharedSegment);
|
TempVariable var(id, name, description, sharedSegment);
|
||||||
_tempVariables.emplace_back(std::move(var));
|
_tempVariables.emplace_back(std::move(var));
|
||||||
NotifyUIAboutTempVarChange();
|
NotifyUIAboutTempVarChange(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroSegment::SetTempVarValue(const std::string &id,
|
void MacroSegment::SetTempVarValue(const std::string &id,
|
||||||
@@ -313,13 +324,29 @@ void MacroSegmentEdit::HeaderInfoChanged(const QString &text)
|
|||||||
_headerInfo->setText(text);
|
_headerInfo->setText(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroSegmentEdit::Collapsed(bool collapsed)
|
void MacroSegmentEdit::Collapsed(bool collapsed) const
|
||||||
{
|
{
|
||||||
if (Data()) {
|
if (Data()) {
|
||||||
Data()->SetCollapsed(collapsed);
|
Data()->SetCollapsed(collapsed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MacroSegmentEdit::SetDisableEffect(bool value)
|
||||||
|
{
|
||||||
|
if (value) {
|
||||||
|
auto effect = new QGraphicsOpacityEffect(this);
|
||||||
|
effect->setOpacity(0.5);
|
||||||
|
_section->setGraphicsEffect(effect);
|
||||||
|
} else {
|
||||||
|
_section->setGraphicsEffect(nullptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MacroSegmentEdit::SetEnableAppearance(bool value)
|
||||||
|
{
|
||||||
|
SetDisableEffect(!value);
|
||||||
|
}
|
||||||
|
|
||||||
void MacroSegmentEdit::SetFocusPolicyOfWidgets()
|
void MacroSegmentEdit::SetFocusPolicyOfWidgets()
|
||||||
{
|
{
|
||||||
QList<QWidget *> widgets = this->findChildren<QWidget *>();
|
QList<QWidget *> widgets = this->findChildren<QWidget *>();
|
||||||
|
|||||||
@@ -39,6 +39,8 @@ public:
|
|||||||
virtual std::string GetId() const = 0;
|
virtual std::string GetId() const = 0;
|
||||||
void EnableHighlight();
|
void EnableHighlight();
|
||||||
bool GetHighlightAndReset();
|
bool GetHighlightAndReset();
|
||||||
|
void SetEnabled(bool);
|
||||||
|
bool Enabled() const;
|
||||||
virtual std::string GetVariableValue() const;
|
virtual std::string GetVariableValue() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -46,7 +48,7 @@ protected:
|
|||||||
friend void IncrementVariableRef(MacroSegment *);
|
friend void IncrementVariableRef(MacroSegment *);
|
||||||
friend void DecrementVariableRef(MacroSegment *);
|
friend void DecrementVariableRef(MacroSegment *);
|
||||||
void SetVariableValue(const std::string &value);
|
void SetVariableValue(const std::string &value);
|
||||||
bool IsReferencedInVars() { return _variableRefs != 0; }
|
bool IsReferencedInVars() const { return _variableRefs != 0; }
|
||||||
|
|
||||||
virtual void SetupTempVars();
|
virtual void SetupTempVars();
|
||||||
void AddTempvar(const std::string &id, const std::string &name,
|
void AddTempvar(const std::string &id, const std::string &name,
|
||||||
@@ -75,6 +77,7 @@ private:
|
|||||||
// UI helper
|
// UI helper
|
||||||
bool _highlight = false;
|
bool _highlight = false;
|
||||||
bool _collapsed = false;
|
bool _collapsed = false;
|
||||||
|
bool _enabled = true;
|
||||||
|
|
||||||
// Custom header labels
|
// Custom header labels
|
||||||
bool _useCustomLabel = false;
|
bool _useCustomLabel = false;
|
||||||
@@ -103,12 +106,13 @@ public:
|
|||||||
void SetCollapsed(bool collapsed);
|
void SetCollapsed(bool collapsed);
|
||||||
void SetSelected(bool);
|
void SetSelected(bool);
|
||||||
virtual std::shared_ptr<MacroSegment> Data() const = 0;
|
virtual std::shared_ptr<MacroSegment> Data() const = 0;
|
||||||
|
virtual void SetupWidgets(bool basicSetup = false) = 0;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void HeaderInfoChanged(const QString &);
|
void HeaderInfoChanged(const QString &);
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
void Collapsed(bool);
|
void Collapsed(bool) const;
|
||||||
signals:
|
signals:
|
||||||
void MacroAdded(const QString &name);
|
void MacroAdded(const QString &name);
|
||||||
void MacroRemoved(const QString &name);
|
void MacroRemoved(const QString &name);
|
||||||
@@ -118,12 +122,16 @@ signals:
|
|||||||
void SceneGroupRenamed(const QString &oldName, const QString newName);
|
void SceneGroupRenamed(const QString &oldName, const QString newName);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
void SetDisableEffect(bool);
|
||||||
|
void SetEnableAppearance(bool);
|
||||||
|
|
||||||
bool eventFilter(QObject *obj, QEvent *ev) override;
|
bool eventFilter(QObject *obj, QEvent *ev) override;
|
||||||
|
|
||||||
Section *_section;
|
Section *_section;
|
||||||
QLabel *_headerInfo;
|
QLabel *_headerInfo;
|
||||||
QWidget *_frame;
|
QWidget *_frame;
|
||||||
QVBoxLayout *_contentLayout;
|
QVBoxLayout *_contentLayout;
|
||||||
|
bool _allWidgetsAreSetup = false;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
enum class DropLineState {
|
enum class DropLineState {
|
||||||
|
|||||||
@@ -76,12 +76,16 @@ void MacroSelection::ShowAllMacros()
|
|||||||
|
|
||||||
void MacroSelection::MacroRemove(const QString &name)
|
void MacroSelection::MacroRemove(const QString &name)
|
||||||
{
|
{
|
||||||
|
const bool currentSelectionWasRemoved = name == currentText();
|
||||||
|
|
||||||
int idx = findText(name);
|
int idx = findText(name);
|
||||||
if (idx == -1) {
|
if (idx == -1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
removeItem(idx);
|
removeItem(idx);
|
||||||
setCurrentIndex(-1);
|
if (currentSelectionWasRemoved) {
|
||||||
|
setCurrentIndex(-1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroSelection::MacroRename(const QString &oldName, const QString &newName)
|
void MacroSelection::MacroRename(const QString &oldName, const QString &newName)
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ void GlobalMacroSettings::Save(obs_data_t *obj) const
|
|||||||
obs_data_set_bool(data, "highlightExecuted", _highlightExecuted);
|
obs_data_set_bool(data, "highlightExecuted", _highlightExecuted);
|
||||||
obs_data_set_bool(data, "highlightConditions", _highlightConditions);
|
obs_data_set_bool(data, "highlightConditions", _highlightConditions);
|
||||||
obs_data_set_bool(data, "highlightActions", _highlightActions);
|
obs_data_set_bool(data, "highlightActions", _highlightActions);
|
||||||
|
obs_data_set_bool(data, "newMacroCheckInParallel",
|
||||||
|
_newMacroCheckInParallel);
|
||||||
obs_data_set_bool(data, "newMacroRegisterHotkey",
|
obs_data_set_bool(data, "newMacroRegisterHotkey",
|
||||||
_newMacroRegisterHotkeys);
|
_newMacroRegisterHotkeys);
|
||||||
obs_data_set_bool(data, "newMacroUseShortCircuitEvaluation",
|
obs_data_set_bool(data, "newMacroUseShortCircuitEvaluation",
|
||||||
@@ -41,6 +43,8 @@ void GlobalMacroSettings::Load(obs_data_t *obj)
|
|||||||
_highlightExecuted = obs_data_get_bool(data, "highlightExecuted");
|
_highlightExecuted = obs_data_get_bool(data, "highlightExecuted");
|
||||||
_highlightConditions = obs_data_get_bool(data, "highlightConditions");
|
_highlightConditions = obs_data_get_bool(data, "highlightConditions");
|
||||||
_highlightActions = obs_data_get_bool(data, "highlightActions");
|
_highlightActions = obs_data_get_bool(data, "highlightActions");
|
||||||
|
_newMacroCheckInParallel =
|
||||||
|
obs_data_get_bool(data, "newMacroCheckInParallel");
|
||||||
_newMacroRegisterHotkeys =
|
_newMacroRegisterHotkeys =
|
||||||
obs_data_get_bool(data, "newMacroRegisterHotkey");
|
obs_data_get_bool(data, "newMacroRegisterHotkey");
|
||||||
_newMacroUseShortCircuitEvaluation =
|
_newMacroUseShortCircuitEvaluation =
|
||||||
@@ -62,12 +66,16 @@ MacroSettingsDialog::MacroSettingsDialog(QWidget *parent,
|
|||||||
"AdvSceneSwitcher.macroTab.highlightTrueConditions"))),
|
"AdvSceneSwitcher.macroTab.highlightTrueConditions"))),
|
||||||
_highlightActions(new QCheckBox(obs_module_text(
|
_highlightActions(new QCheckBox(obs_module_text(
|
||||||
"AdvSceneSwitcher.macroTab.highlightPerformedActions"))),
|
"AdvSceneSwitcher.macroTab.highlightPerformedActions"))),
|
||||||
|
_newMacroCheckInParallel(new QCheckBox(obs_module_text(
|
||||||
|
"AdvSceneSwitcher.macroTab.newMacroCheckInParallel"))),
|
||||||
_newMacroRegisterHotkeys(new QCheckBox(obs_module_text(
|
_newMacroRegisterHotkeys(new QCheckBox(obs_module_text(
|
||||||
"AdvSceneSwitcher.macroTab.newMacroRegisterHotkey"))),
|
"AdvSceneSwitcher.macroTab.newMacroRegisterHotkey"))),
|
||||||
_newMacroUseShortCircuitEvaluation(new QCheckBox(obs_module_text(
|
_newMacroUseShortCircuitEvaluation(new QCheckBox(obs_module_text(
|
||||||
"AdvSceneSwitcher.macroTab.newMacroUseShortCircuitEvaluation"))),
|
"AdvSceneSwitcher.macroTab.newMacroUseShortCircuitEvaluation"))),
|
||||||
_saveSettingsOnMacroChange(new QCheckBox(obs_module_text(
|
_saveSettingsOnMacroChange(new QCheckBox(obs_module_text(
|
||||||
"AdvSceneSwitcher.macroTab.saveSettingsOnMacroChange"))),
|
"AdvSceneSwitcher.macroTab.saveSettingsOnMacroChange"))),
|
||||||
|
_currentCheckInParallel(new QCheckBox(obs_module_text(
|
||||||
|
"AdvSceneSwitcher.macroTab.currentCheckInParallel"))),
|
||||||
_currentMacroRegisterHotkeys(new QCheckBox(obs_module_text(
|
_currentMacroRegisterHotkeys(new QCheckBox(obs_module_text(
|
||||||
"AdvSceneSwitcher.macroTab.currentRegisterHotkeys"))),
|
"AdvSceneSwitcher.macroTab.currentRegisterHotkeys"))),
|
||||||
_currentUseShortCircuitEvaluation(new QCheckBox(obs_module_text(
|
_currentUseShortCircuitEvaluation(new QCheckBox(obs_module_text(
|
||||||
@@ -107,6 +115,11 @@ MacroSettingsDialog::MacroSettingsDialog(QWidget *parent,
|
|||||||
setWindowModality(Qt::WindowModality::WindowModal);
|
setWindowModality(Qt::WindowModality::WindowModal);
|
||||||
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
|
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
|
||||||
|
|
||||||
|
_newMacroCheckInParallel->setToolTip(obs_module_text(
|
||||||
|
"AdvSceneSwitcher.macroTab.checkInParallel.tooltip"));
|
||||||
|
_currentCheckInParallel->setToolTip(obs_module_text(
|
||||||
|
"AdvSceneSwitcher.macroTab.checkInParallel.tooltip"));
|
||||||
|
|
||||||
_newMacroUseShortCircuitEvaluation->setToolTip(obs_module_text(
|
_newMacroUseShortCircuitEvaluation->setToolTip(obs_module_text(
|
||||||
"AdvSceneSwitcher.macroTab.shortCircuit.tooltip"));
|
"AdvSceneSwitcher.macroTab.shortCircuit.tooltip"));
|
||||||
_saveSettingsOnMacroChange->setToolTip(obs_module_text(
|
_saveSettingsOnMacroChange->setToolTip(obs_module_text(
|
||||||
@@ -146,6 +159,8 @@ MacroSettingsDialog::MacroSettingsDialog(QWidget *parent,
|
|||||||
obs_module_text("AdvSceneSwitcher.macroTab.generalSettings"));
|
obs_module_text("AdvSceneSwitcher.macroTab.generalSettings"));
|
||||||
auto generalLayout = new QVBoxLayout;
|
auto generalLayout = new QVBoxLayout;
|
||||||
generalLayout->addWidget(_saveSettingsOnMacroChange);
|
generalLayout->addWidget(_saveSettingsOnMacroChange);
|
||||||
|
generalLayout->addWidget(_currentCheckInParallel);
|
||||||
|
generalLayout->addWidget(_newMacroCheckInParallel);
|
||||||
generalLayout->addWidget(_currentSkipOnStartup);
|
generalLayout->addWidget(_currentSkipOnStartup);
|
||||||
generalLayout->addWidget(_currentStopActionsIfNotDone);
|
generalLayout->addWidget(_currentStopActionsIfNotDone);
|
||||||
generalLayout->addWidget(_currentUseShortCircuitEvaluation);
|
generalLayout->addWidget(_currentUseShortCircuitEvaluation);
|
||||||
@@ -273,6 +288,7 @@ MacroSettingsDialog::MacroSettingsDialog(QWidget *parent,
|
|||||||
_highlightExecutedMacros->setChecked(settings._highlightExecuted);
|
_highlightExecutedMacros->setChecked(settings._highlightExecuted);
|
||||||
_highlightConditions->setChecked(settings._highlightConditions);
|
_highlightConditions->setChecked(settings._highlightConditions);
|
||||||
_highlightActions->setChecked(settings._highlightActions);
|
_highlightActions->setChecked(settings._highlightActions);
|
||||||
|
_newMacroCheckInParallel->setChecked(settings._newMacroCheckInParallel);
|
||||||
_newMacroRegisterHotkeys->setChecked(settings._newMacroRegisterHotkeys);
|
_newMacroRegisterHotkeys->setChecked(settings._newMacroRegisterHotkeys);
|
||||||
_newMacroUseShortCircuitEvaluation->setChecked(
|
_newMacroUseShortCircuitEvaluation->setChecked(
|
||||||
settings._newMacroUseShortCircuitEvaluation);
|
settings._newMacroUseShortCircuitEvaluation);
|
||||||
@@ -280,20 +296,23 @@ MacroSettingsDialog::MacroSettingsDialog(QWidget *parent,
|
|||||||
settings._saveSettingsOnMacroChange);
|
settings._saveSettingsOnMacroChange);
|
||||||
|
|
||||||
if (!macro || macro->IsGroup()) {
|
if (!macro || macro->IsGroup()) {
|
||||||
hotkeyOptions->hide();
|
|
||||||
|
|
||||||
// General group
|
// General group
|
||||||
_currentSkipOnStartup->hide();
|
_currentSkipOnStartup->hide();
|
||||||
_currentStopActionsIfNotDone->hide();
|
_currentStopActionsIfNotDone->hide();
|
||||||
_currentUseShortCircuitEvaluation->hide();
|
_currentUseShortCircuitEvaluation->hide();
|
||||||
|
_currentCheckInParallel->hide();
|
||||||
SetLayoutVisible(customConditionIntervalLayout, false);
|
SetLayoutVisible(customConditionIntervalLayout, false);
|
||||||
SetLayoutVisible(pauseStateSaveBehavorLayout, false);
|
SetLayoutVisible(pauseStateSaveBehavorLayout, false);
|
||||||
|
|
||||||
|
// Hotkey group
|
||||||
|
_currentMacroRegisterHotkeys->hide();
|
||||||
|
|
||||||
inputOptions->hide();
|
inputOptions->hide();
|
||||||
_dockOptions->hide();
|
_dockOptions->hide();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_currentCheckInParallel->setChecked(macro->CheckInParallel());
|
||||||
_currentMacroRegisterHotkeys->setChecked(macro->PauseHotkeysEnabled());
|
_currentMacroRegisterHotkeys->setChecked(macro->PauseHotkeysEnabled());
|
||||||
_currentUseShortCircuitEvaluation->setChecked(
|
_currentUseShortCircuitEvaluation->setChecked(
|
||||||
macro->ShortCircuitEvaluationEnabled());
|
macro->ShortCircuitEvaluationEnabled());
|
||||||
@@ -431,6 +450,8 @@ bool MacroSettingsDialog::AskForSettings(QWidget *parent,
|
|||||||
userInput._highlightConditions =
|
userInput._highlightConditions =
|
||||||
dialog._highlightConditions->isChecked();
|
dialog._highlightConditions->isChecked();
|
||||||
userInput._highlightActions = dialog._highlightActions->isChecked();
|
userInput._highlightActions = dialog._highlightActions->isChecked();
|
||||||
|
userInput._newMacroCheckInParallel =
|
||||||
|
dialog._newMacroCheckInParallel->isChecked();
|
||||||
userInput._newMacroRegisterHotkeys =
|
userInput._newMacroRegisterHotkeys =
|
||||||
dialog._newMacroRegisterHotkeys->isChecked();
|
dialog._newMacroRegisterHotkeys->isChecked();
|
||||||
userInput._newMacroUseShortCircuitEvaluation =
|
userInput._newMacroUseShortCircuitEvaluation =
|
||||||
@@ -441,6 +462,7 @@ bool MacroSettingsDialog::AskForSettings(QWidget *parent,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
macro->SetCheckInParallel(dialog._currentCheckInParallel->isChecked());
|
||||||
macro->EnablePauseHotkeys(
|
macro->EnablePauseHotkeys(
|
||||||
dialog._currentMacroRegisterHotkeys->isChecked());
|
dialog._currentMacroRegisterHotkeys->isChecked());
|
||||||
macro->SetShortCircuitEvaluation(
|
macro->SetShortCircuitEvaluation(
|
||||||
|
|||||||
@@ -20,9 +20,10 @@ public:
|
|||||||
void Save(obs_data_t *obj) const;
|
void Save(obs_data_t *obj) const;
|
||||||
void Load(obs_data_t *obj);
|
void Load(obs_data_t *obj);
|
||||||
|
|
||||||
bool _highlightExecuted = false;
|
bool _highlightExecuted = true;
|
||||||
bool _highlightConditions = false;
|
bool _highlightConditions = true;
|
||||||
bool _highlightActions = false;
|
bool _highlightActions = true;
|
||||||
|
bool _newMacroCheckInParallel = false;
|
||||||
bool _newMacroRegisterHotkeys = true;
|
bool _newMacroRegisterHotkeys = true;
|
||||||
bool _newMacroUseShortCircuitEvaluation = false;
|
bool _newMacroUseShortCircuitEvaluation = false;
|
||||||
bool _saveSettingsOnMacroChange = true;
|
bool _saveSettingsOnMacroChange = true;
|
||||||
@@ -52,10 +53,12 @@ private:
|
|||||||
QCheckBox *_highlightExecutedMacros;
|
QCheckBox *_highlightExecutedMacros;
|
||||||
QCheckBox *_highlightConditions;
|
QCheckBox *_highlightConditions;
|
||||||
QCheckBox *_highlightActions;
|
QCheckBox *_highlightActions;
|
||||||
|
QCheckBox *_newMacroCheckInParallel;
|
||||||
QCheckBox *_newMacroRegisterHotkeys;
|
QCheckBox *_newMacroRegisterHotkeys;
|
||||||
QCheckBox *_newMacroUseShortCircuitEvaluation;
|
QCheckBox *_newMacroUseShortCircuitEvaluation;
|
||||||
QCheckBox *_saveSettingsOnMacroChange;
|
QCheckBox *_saveSettingsOnMacroChange;
|
||||||
// Current macro specific settings
|
// Current macro specific settings
|
||||||
|
QCheckBox *_currentCheckInParallel;
|
||||||
QCheckBox *_currentMacroRegisterHotkeys;
|
QCheckBox *_currentMacroRegisterHotkeys;
|
||||||
QCheckBox *_currentUseShortCircuitEvaluation;
|
QCheckBox *_currentUseShortCircuitEvaluation;
|
||||||
QCheckBox *_currentUseCustomConditionCheckInterval;
|
QCheckBox *_currentUseCustomConditionCheckInterval;
|
||||||
|
|||||||
@@ -27,6 +27,14 @@ namespace advss {
|
|||||||
static QObject *addPulse = nullptr;
|
static QObject *addPulse = nullptr;
|
||||||
static QTimer onChangeHighlightTimer;
|
static QTimer onChangeHighlightTimer;
|
||||||
|
|
||||||
|
static void disableAddButtonHighlight()
|
||||||
|
{
|
||||||
|
if (addPulse) {
|
||||||
|
addPulse->deleteLater();
|
||||||
|
addPulse = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static bool macroNameExists(const std::string &name)
|
static bool macroNameExists(const std::string &name)
|
||||||
{
|
{
|
||||||
return !!GetMacroByName(name.c_str());
|
return !!GetMacroByName(name.c_str());
|
||||||
@@ -86,24 +94,26 @@ bool AdvSceneSwitcher::AddNewMacro(std::shared_ptr<Macro> &res,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
res = std::make_shared<Macro>(
|
res = std::make_shared<Macro>(name, GetGlobalMacroSettings());
|
||||||
name, GetGlobalMacroSettings()._newMacroRegisterHotkeys,
|
|
||||||
GetGlobalMacroSettings()._newMacroUseShortCircuitEvaluation);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::on_macroAdd_clicked()
|
void AdvSceneSwitcher::on_macroAdd_clicked()
|
||||||
{
|
{
|
||||||
|
// Hotkey to add new macro will also use this function.
|
||||||
|
// Since we don't want the hotkey to have an effect if the macro tab is
|
||||||
|
// not focused we need to check this here.
|
||||||
|
if (!MacroTabIsInFocus()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
std::string name;
|
std::string name;
|
||||||
std::shared_ptr<Macro> newMacro;
|
std::shared_ptr<Macro> newMacro;
|
||||||
if (!AddNewMacro(newMacro, name)) {
|
if (!AddNewMacro(newMacro, name)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (addPulse) {
|
disableAddButtonHighlight();
|
||||||
addPulse->deleteLater();
|
|
||||||
addPulse = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto selectedMacro = GetSelectedMacro();
|
auto selectedMacro = GetSelectedMacro();
|
||||||
if (!selectedMacro) {
|
if (!selectedMacro) {
|
||||||
@@ -130,6 +140,42 @@ void AdvSceneSwitcher::on_macroAdd_clicked()
|
|||||||
emit MacroAdded(QString::fromStdString(name));
|
emit MacroAdded(QString::fromStdString(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void addGroupSubitems(std::vector<std::shared_ptr<Macro>> ¯os,
|
||||||
|
const std::shared_ptr<Macro> &group)
|
||||||
|
{
|
||||||
|
std::vector<std::shared_ptr<Macro>> subitems;
|
||||||
|
subitems.reserve(group->GroupSize());
|
||||||
|
|
||||||
|
// Find all subitems
|
||||||
|
auto allMacros = GetMacros();
|
||||||
|
for (auto it = allMacros.begin(); it < allMacros.end(); it++) {
|
||||||
|
if ((*it)->Name() != group->Name()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (uint32_t i = 1; i <= group->GroupSize(); i++) {
|
||||||
|
subitems.emplace_back(*std::next(it, i));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove subitems which were already selected to avoid duplicates
|
||||||
|
for (const auto &subitem : subitems) {
|
||||||
|
auto it = std::find(macros.begin(), macros.end(), subitem);
|
||||||
|
if (it == macros.end()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
macros.erase(it);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add group subitems
|
||||||
|
auto it = std::find(macros.begin(), macros.end(), group);
|
||||||
|
if (it == macros.end()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
it = std::next(it);
|
||||||
|
macros.insert(it, subitems.begin(), subitems.end());
|
||||||
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::RemoveMacro(std::shared_ptr<Macro> ¯o)
|
void AdvSceneSwitcher::RemoveMacro(std::shared_ptr<Macro> ¯o)
|
||||||
{
|
{
|
||||||
if (!macro) {
|
if (!macro) {
|
||||||
@@ -145,7 +191,27 @@ void AdvSceneSwitcher::RemoveMacro(std::shared_ptr<Macro> ¯o)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const auto clearWidgetCache = [this](Macro *macro) {
|
||||||
|
ui->conditionsList->ClearWidgetsFromCacheFor(macro);
|
||||||
|
ui->actionsList->ClearWidgetsFromCacheFor(macro);
|
||||||
|
ui->elseActionsList->ClearWidgetsFromCacheFor(macro);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (macro->IsGroup()) {
|
||||||
|
std::vector<std::shared_ptr<Macro>> macros = {macro};
|
||||||
|
addGroupSubitems(macros, macro);
|
||||||
|
for (auto macro : macros) {
|
||||||
|
clearWidgetCache(macro.get());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
clearWidgetCache(macro.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't cache widgets for about to be deleted macros
|
||||||
|
MacroSegmentList::SetCachingEnabled(false);
|
||||||
ui->macros->Remove(macro);
|
ui->macros->Remove(macro);
|
||||||
|
MacroSegmentList::SetCachingEnabled(!switcher->disableMacroWidgetCache);
|
||||||
|
|
||||||
emit MacroRemoved(name);
|
emit MacroRemoved(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -160,7 +226,7 @@ void AdvSceneSwitcher::RemoveSelectedMacros()
|
|||||||
if (macroCount == 1) {
|
if (macroCount == 1) {
|
||||||
QString deleteWarning = obs_module_text(
|
QString deleteWarning = obs_module_text(
|
||||||
"AdvSceneSwitcher.macroTab.removeSingleMacroPopup.text");
|
"AdvSceneSwitcher.macroTab.removeSingleMacroPopup.text");
|
||||||
auto macro = macros.at(0);
|
auto ¯o = macros.at(0);
|
||||||
deleteWarning = deleteWarning.arg(
|
deleteWarning = deleteWarning.arg(
|
||||||
QString::fromStdString(macro->Name()));
|
QString::fromStdString(macro->Name()));
|
||||||
|
|
||||||
@@ -200,7 +266,7 @@ void AdvSceneSwitcher::on_macroRemove_clicked()
|
|||||||
RemoveSelectedMacros();
|
RemoveSelectedMacros();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::on_macroUp_clicked()
|
void AdvSceneSwitcher::on_macroUp_clicked() const
|
||||||
{
|
{
|
||||||
auto macro = GetSelectedMacro();
|
auto macro = GetSelectedMacro();
|
||||||
if (!macro) {
|
if (!macro) {
|
||||||
@@ -209,7 +275,7 @@ void AdvSceneSwitcher::on_macroUp_clicked()
|
|||||||
ui->macros->Up(macro);
|
ui->macros->Up(macro);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::on_macroDown_clicked()
|
void AdvSceneSwitcher::on_macroDown_clicked() const
|
||||||
{
|
{
|
||||||
auto macro = GetSelectedMacro();
|
auto macro = GetSelectedMacro();
|
||||||
if (!macro) {
|
if (!macro) {
|
||||||
@@ -244,42 +310,7 @@ void AdvSceneSwitcher::RenameSelectedMacro()
|
|||||||
ui->macroName->setText(QString::fromStdString(name));
|
ui->macroName->setText(QString::fromStdString(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void addGroupSubitems(std::vector<std::shared_ptr<Macro>> ¯os,
|
void AdvSceneSwitcher::ExportMacros() const
|
||||||
const std::shared_ptr<Macro> &group)
|
|
||||||
{
|
|
||||||
std::vector<std::shared_ptr<Macro>> subitems;
|
|
||||||
subitems.reserve(group->GroupSize());
|
|
||||||
|
|
||||||
// Find all subitems
|
|
||||||
auto allMacros = GetMacros();
|
|
||||||
for (auto it = allMacros.begin(); it < allMacros.end(); it++) {
|
|
||||||
if ((*it)->Name() == group->Name()) {
|
|
||||||
for (uint32_t i = 1; i <= group->GroupSize(); i++) {
|
|
||||||
subitems.emplace_back(*std::next(it, i));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove subitems which were already selected to avoid duplicates
|
|
||||||
for (const auto &subitem : subitems) {
|
|
||||||
auto it = std::find(macros.begin(), macros.end(), subitem);
|
|
||||||
if (it == macros.end()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
macros.erase(it);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add group subitems
|
|
||||||
auto it = std::find(macros.begin(), macros.end(), group);
|
|
||||||
if (it == macros.end()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
it = std::next(it);
|
|
||||||
macros.insert(it, subitems.begin(), subitems.end());
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdvSceneSwitcher::ExportMacros()
|
|
||||||
{
|
{
|
||||||
auto selectedMacros = GetSelectedMacros();
|
auto selectedMacros = GetSelectedMacros();
|
||||||
auto macros = selectedMacros;
|
auto macros = selectedMacros;
|
||||||
@@ -490,6 +521,7 @@ void AdvSceneSwitcher::ImportMacros()
|
|||||||
|
|
||||||
ui->macros->Reset(GetMacros(),
|
ui->macros->Reset(GetMacros(),
|
||||||
GetGlobalMacroSettings()._highlightExecuted);
|
GetGlobalMacroSettings()._highlightExecuted);
|
||||||
|
disableAddButtonHighlight();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::on_macroName_editingFinished()
|
void AdvSceneSwitcher::on_macroName_editingFinished()
|
||||||
@@ -510,7 +542,7 @@ void AdvSceneSwitcher::on_macroName_editingFinished()
|
|||||||
RenameMacro(macro, newName);
|
RenameMacro(macro, newName);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::on_runMacroInParallel_stateChanged(int value)
|
void AdvSceneSwitcher::on_runMacroInParallel_stateChanged(int value) const
|
||||||
{
|
{
|
||||||
auto macro = GetSelectedMacro();
|
auto macro = GetSelectedMacro();
|
||||||
if (!macro) {
|
if (!macro) {
|
||||||
@@ -520,7 +552,7 @@ void AdvSceneSwitcher::on_runMacroInParallel_stateChanged(int value)
|
|||||||
macro->SetRunInParallel(value);
|
macro->SetRunInParallel(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::on_runMacroOnChange_stateChanged(int value)
|
void AdvSceneSwitcher::on_runMacroOnChange_stateChanged(int value) const
|
||||||
{
|
{
|
||||||
auto macro = GetSelectedMacro();
|
auto macro = GetSelectedMacro();
|
||||||
if (!macro) {
|
if (!macro) {
|
||||||
@@ -533,29 +565,69 @@ void AdvSceneSwitcher::on_runMacroOnChange_stateChanged(int value)
|
|||||||
void AdvSceneSwitcher::PopulateMacroActions(Macro &m, uint32_t afterIdx)
|
void AdvSceneSwitcher::PopulateMacroActions(Macro &m, uint32_t afterIdx)
|
||||||
{
|
{
|
||||||
auto &actions = m.Actions();
|
auto &actions = m.Actions();
|
||||||
|
ui->actionsList->SetHelpMsgVisible(actions.size() == 0);
|
||||||
|
|
||||||
|
if (ui->actionsList->PopulateWidgetsFromCache(&m)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The layout system has not completed geometry propagation yet, so we
|
||||||
|
// can skip those checks for now
|
||||||
|
ui->actionsList->SetVisibilityCheckEnable(false);
|
||||||
|
|
||||||
for (; afterIdx < actions.size(); afterIdx++) {
|
for (; afterIdx < actions.size(); afterIdx++) {
|
||||||
auto newEntry = new MacroActionEdit(this, &actions[afterIdx],
|
auto newEntry = new MacroActionEdit(this, &actions[afterIdx],
|
||||||
actions[afterIdx]->GetId());
|
actions[afterIdx]->GetId());
|
||||||
ui->actionsList->Add(newEntry);
|
ui->actionsList->Add(newEntry);
|
||||||
}
|
}
|
||||||
ui->actionsList->SetHelpMsgVisible(actions.size() == 0);
|
|
||||||
|
// Give the layout system time before enabling the visibility checks and
|
||||||
|
// fully constructing the visible macro segments
|
||||||
|
QTimer::singleShot(0, this, [this]() {
|
||||||
|
ui->actionsList->SetVisibilityCheckEnable(true);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::PopulateMacroElseActions(Macro &m, uint32_t afterIdx)
|
void AdvSceneSwitcher::PopulateMacroElseActions(Macro &m, uint32_t afterIdx)
|
||||||
{
|
{
|
||||||
auto &actions = m.ElseActions();
|
auto &actions = m.ElseActions();
|
||||||
|
ui->elseActionsList->SetHelpMsgVisible(actions.size() == 0);
|
||||||
|
|
||||||
|
if (ui->elseActionsList->PopulateWidgetsFromCache(&m)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The layout system has not completed geometry propagation yet, so we
|
||||||
|
// can skip those checks for now
|
||||||
|
ui->elseActionsList->SetVisibilityCheckEnable(false);
|
||||||
|
|
||||||
for (; afterIdx < actions.size(); afterIdx++) {
|
for (; afterIdx < actions.size(); afterIdx++) {
|
||||||
auto newEntry = new MacroActionEdit(this, &actions[afterIdx],
|
auto newEntry = new MacroActionEdit(this, &actions[afterIdx],
|
||||||
actions[afterIdx]->GetId());
|
actions[afterIdx]->GetId());
|
||||||
ui->elseActionsList->Add(newEntry);
|
ui->elseActionsList->Add(newEntry);
|
||||||
}
|
}
|
||||||
ui->elseActionsList->SetHelpMsgVisible(actions.size() == 0);
|
|
||||||
|
// Give the layout system time before enabling the visibility checks and
|
||||||
|
// fully constructing the visible macro segments
|
||||||
|
QTimer::singleShot(0, this, [this]() {
|
||||||
|
ui->elseActionsList->SetVisibilityCheckEnable(true);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::PopulateMacroConditions(Macro &m, uint32_t afterIdx)
|
void AdvSceneSwitcher::PopulateMacroConditions(Macro &m, uint32_t afterIdx)
|
||||||
{
|
{
|
||||||
bool root = afterIdx == 0;
|
bool root = afterIdx == 0;
|
||||||
auto &conditions = m.Conditions();
|
auto &conditions = m.Conditions();
|
||||||
|
ui->conditionsList->SetHelpMsgVisible(conditions.size() == 0);
|
||||||
|
|
||||||
|
if (ui->conditionsList->PopulateWidgetsFromCache(&m)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The layout system has not completed geometry propagation yet, so we
|
||||||
|
// can skip those checks for now
|
||||||
|
ui->conditionsList->SetVisibilityCheckEnable(false);
|
||||||
|
|
||||||
for (; afterIdx < conditions.size(); afterIdx++) {
|
for (; afterIdx < conditions.size(); afterIdx++) {
|
||||||
auto newEntry = new MacroConditionEdit(
|
auto newEntry = new MacroConditionEdit(
|
||||||
this, &conditions[afterIdx],
|
this, &conditions[afterIdx],
|
||||||
@@ -563,10 +635,15 @@ void AdvSceneSwitcher::PopulateMacroConditions(Macro &m, uint32_t afterIdx)
|
|||||||
ui->conditionsList->Add(newEntry);
|
ui->conditionsList->Add(newEntry);
|
||||||
root = false;
|
root = false;
|
||||||
}
|
}
|
||||||
ui->conditionsList->SetHelpMsgVisible(conditions.size() == 0);
|
|
||||||
|
// Give the layout system time before enabling the visibility checks and
|
||||||
|
// fully constructing the visible macro segments
|
||||||
|
QTimer::singleShot(0, this, [this]() {
|
||||||
|
ui->conditionsList->SetVisibilityCheckEnable(true);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::SetActionData(Macro &m)
|
void AdvSceneSwitcher::SetActionData(Macro &m) const
|
||||||
{
|
{
|
||||||
auto &actions = m.Actions();
|
auto &actions = m.Actions();
|
||||||
for (int idx = 0; idx < ui->actionsList->ContentLayout()->count();
|
for (int idx = 0; idx < ui->actionsList->ContentLayout()->count();
|
||||||
@@ -583,7 +660,7 @@ void AdvSceneSwitcher::SetActionData(Macro &m)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::SetElseActionData(Macro &m)
|
void AdvSceneSwitcher::SetElseActionData(Macro &m) const
|
||||||
{
|
{
|
||||||
auto &actions = m.ElseActions();
|
auto &actions = m.ElseActions();
|
||||||
for (int idx = 0; idx < ui->elseActionsList->ContentLayout()->count();
|
for (int idx = 0; idx < ui->elseActionsList->ContentLayout()->count();
|
||||||
@@ -600,7 +677,7 @@ void AdvSceneSwitcher::SetElseActionData(Macro &m)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::SetConditionData(Macro &m)
|
void AdvSceneSwitcher::SetConditionData(Macro &m) const
|
||||||
{
|
{
|
||||||
auto &conditions = m.Conditions();
|
auto &conditions = m.Conditions();
|
||||||
for (int idx = 0; idx < ui->conditionsList->ContentLayout()->count();
|
for (int idx = 0; idx < ui->conditionsList->ContentLayout()->count();
|
||||||
@@ -678,7 +755,7 @@ void AdvSceneSwitcher::SetEditMacro(Macro &m)
|
|||||||
m.GetElseActionSplitterPosition());
|
m.GetElseActionSplitterPosition());
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::SetMacroEditAreaDisabled(bool disable)
|
void AdvSceneSwitcher::SetMacroEditAreaDisabled(bool disable) const
|
||||||
{
|
{
|
||||||
ui->macroName->setDisabled(disable);
|
ui->macroName->setDisabled(disable);
|
||||||
ui->runMacro->setDisabled(disable);
|
ui->runMacro->setDisabled(disable);
|
||||||
@@ -689,32 +766,32 @@ void AdvSceneSwitcher::SetMacroEditAreaDisabled(bool disable)
|
|||||||
ui->macroActionConditionSplitter->setDisabled(disable);
|
ui->macroActionConditionSplitter->setDisabled(disable);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::HighlightAction(int idx, QColor color)
|
void AdvSceneSwitcher::HighlightAction(int idx, QColor color) const
|
||||||
{
|
{
|
||||||
ui->actionsList->Highlight(idx, color);
|
ui->actionsList->Highlight(idx, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::HighlightElseAction(int idx, QColor color)
|
void AdvSceneSwitcher::HighlightElseAction(int idx, QColor color) const
|
||||||
{
|
{
|
||||||
ui->elseActionsList->Highlight(idx, color);
|
ui->elseActionsList->Highlight(idx, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::HighlightCondition(int idx, QColor color)
|
void AdvSceneSwitcher::HighlightCondition(int idx, QColor color) const
|
||||||
{
|
{
|
||||||
ui->conditionsList->Highlight(idx, color);
|
ui->conditionsList->Highlight(idx, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<Macro> AdvSceneSwitcher::GetSelectedMacro()
|
std::shared_ptr<Macro> AdvSceneSwitcher::GetSelectedMacro() const
|
||||||
{
|
{
|
||||||
return ui->macros->GetCurrentMacro();
|
return ui->macros->GetCurrentMacro();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::shared_ptr<Macro>> AdvSceneSwitcher::GetSelectedMacros()
|
std::vector<std::shared_ptr<Macro>> AdvSceneSwitcher::GetSelectedMacros() const
|
||||||
{
|
{
|
||||||
return ui->macros->GetCurrentMacros();
|
return ui->macros->GetCurrentMacros();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::MacroSelectionAboutToChange()
|
void AdvSceneSwitcher::MacroSelectionAboutToChange() const
|
||||||
{
|
{
|
||||||
if (loading) {
|
if (loading) {
|
||||||
return;
|
return;
|
||||||
@@ -742,6 +819,10 @@ void AdvSceneSwitcher::MacroSelectionAboutToChange()
|
|||||||
}
|
}
|
||||||
macro->SetElseActionSplitterPosition(
|
macro->SetElseActionSplitterPosition(
|
||||||
ui->macroElseActionSplitter->sizes());
|
ui->macroElseActionSplitter->sizes());
|
||||||
|
|
||||||
|
ui->conditionsList->CacheCurrentWidgetsFor(macro);
|
||||||
|
ui->actionsList->CacheCurrentWidgetsFor(macro);
|
||||||
|
ui->elseActionsList->CacheCurrentWidgetsFor(macro);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::MacroSelectionChanged()
|
void AdvSceneSwitcher::MacroSelectionChanged()
|
||||||
@@ -770,7 +851,7 @@ void AdvSceneSwitcher::MacroSelectionChanged()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::HighlightOnChange()
|
void AdvSceneSwitcher::HighlightOnChange() const
|
||||||
{
|
{
|
||||||
if (!GetGlobalMacroSettings()._highlightActions &&
|
if (!GetGlobalMacroSettings()._highlightActions &&
|
||||||
!GetGlobalMacroSettings()._highlightExecuted) {
|
!GetGlobalMacroSettings()._highlightExecuted) {
|
||||||
@@ -1299,15 +1380,12 @@ void AdvSceneSwitcher::CopyMacro()
|
|||||||
Macro::PrepareMoveToGroup(macro->Parent(), newMacro);
|
Macro::PrepareMoveToGroup(macro->Parent(), newMacro);
|
||||||
|
|
||||||
ui->macros->Add(newMacro, macro);
|
ui->macros->Add(newMacro, macro);
|
||||||
if (addPulse) {
|
disableAddButtonHighlight();
|
||||||
addPulse->deleteLater();
|
|
||||||
addPulse = nullptr;
|
|
||||||
}
|
|
||||||
emit MacroAdded(QString::fromStdString(name));
|
emit MacroAdded(QString::fromStdString(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
void setCollapsedHelper(const std::shared_ptr<Macro> &m, MacroSegmentList *list,
|
static void setCollapsedHelper(const std::shared_ptr<Macro> &m,
|
||||||
bool collapsed)
|
MacroSegmentList *list, bool collapsed)
|
||||||
{
|
{
|
||||||
if (!m) {
|
if (!m) {
|
||||||
return;
|
return;
|
||||||
@@ -1315,32 +1393,32 @@ void setCollapsedHelper(const std::shared_ptr<Macro> &m, MacroSegmentList *list,
|
|||||||
list->SetCollapsed(collapsed);
|
list->SetCollapsed(collapsed);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::ExpandAllActions()
|
void AdvSceneSwitcher::ExpandAllActions() const
|
||||||
{
|
{
|
||||||
setCollapsedHelper(GetSelectedMacro(), ui->actionsList, false);
|
setCollapsedHelper(GetSelectedMacro(), ui->actionsList, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::ExpandAllElseActions()
|
void AdvSceneSwitcher::ExpandAllElseActions() const
|
||||||
{
|
{
|
||||||
setCollapsedHelper(GetSelectedMacro(), ui->elseActionsList, false);
|
setCollapsedHelper(GetSelectedMacro(), ui->elseActionsList, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::ExpandAllConditions()
|
void AdvSceneSwitcher::ExpandAllConditions() const
|
||||||
{
|
{
|
||||||
setCollapsedHelper(GetSelectedMacro(), ui->conditionsList, false);
|
setCollapsedHelper(GetSelectedMacro(), ui->conditionsList, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::CollapseAllActions()
|
void AdvSceneSwitcher::CollapseAllActions() const
|
||||||
{
|
{
|
||||||
setCollapsedHelper(GetSelectedMacro(), ui->actionsList, true);
|
setCollapsedHelper(GetSelectedMacro(), ui->actionsList, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::CollapseAllElseActions()
|
void AdvSceneSwitcher::CollapseAllElseActions() const
|
||||||
{
|
{
|
||||||
setCollapsedHelper(GetSelectedMacro(), ui->elseActionsList, true);
|
setCollapsedHelper(GetSelectedMacro(), ui->elseActionsList, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::CollapseAllConditions()
|
void AdvSceneSwitcher::CollapseAllConditions() const
|
||||||
{
|
{
|
||||||
setCollapsedHelper(GetSelectedMacro(), ui->conditionsList, true);
|
setCollapsedHelper(GetSelectedMacro(), ui->conditionsList, true);
|
||||||
}
|
}
|
||||||
@@ -1355,7 +1433,7 @@ static void reduceSizeOfSplitterIdx(QSplitter *splitter, int idx)
|
|||||||
splitter->setSizes(sizes);
|
splitter->setSizes(sizes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::MinimizeActions()
|
void AdvSceneSwitcher::MinimizeActions() const
|
||||||
{
|
{
|
||||||
auto macro = GetSelectedMacro();
|
auto macro = GetSelectedMacro();
|
||||||
if (!macro) {
|
if (!macro) {
|
||||||
@@ -1369,13 +1447,13 @@ void AdvSceneSwitcher::MinimizeActions()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::MaximizeActions()
|
void AdvSceneSwitcher::MaximizeActions() const
|
||||||
{
|
{
|
||||||
MinimizeElseActions();
|
MinimizeElseActions();
|
||||||
MinimizeConditions();
|
MinimizeConditions();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::MinimizeElseActions()
|
void AdvSceneSwitcher::MinimizeElseActions() const
|
||||||
{
|
{
|
||||||
auto macro = GetSelectedMacro();
|
auto macro = GetSelectedMacro();
|
||||||
if (!macro) {
|
if (!macro) {
|
||||||
@@ -1388,24 +1466,24 @@ void AdvSceneSwitcher::MinimizeElseActions()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::MaximizeElseActions()
|
void AdvSceneSwitcher::MaximizeElseActions() const
|
||||||
{
|
{
|
||||||
MinimizeConditions();
|
MinimizeConditions();
|
||||||
reduceSizeOfSplitterIdx(ui->macroElseActionSplitter, 0);
|
reduceSizeOfSplitterIdx(ui->macroElseActionSplitter, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::MinimizeConditions()
|
void AdvSceneSwitcher::MinimizeConditions() const
|
||||||
{
|
{
|
||||||
reduceSizeOfSplitterIdx(ui->macroActionConditionSplitter, 0);
|
reduceSizeOfSplitterIdx(ui->macroActionConditionSplitter, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::MaximizeConditions()
|
void AdvSceneSwitcher::MaximizeConditions() const
|
||||||
{
|
{
|
||||||
MinimizeElseActions();
|
MinimizeElseActions();
|
||||||
MinimizeActions();
|
MinimizeActions();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::on_toggleElseActions_clicked()
|
void AdvSceneSwitcher::on_toggleElseActions_clicked() const
|
||||||
{
|
{
|
||||||
auto elsePosition = ui->macroElseActionSplitter->sizes();
|
auto elsePosition = ui->macroElseActionSplitter->sizes();
|
||||||
if (elsePosition[1] == 0) {
|
if (elsePosition[1] == 0) {
|
||||||
@@ -1416,14 +1494,14 @@ void AdvSceneSwitcher::on_toggleElseActions_clicked()
|
|||||||
maximizeFirstSplitterEntry(ui->macroElseActionSplitter);
|
maximizeFirstSplitterEntry(ui->macroElseActionSplitter);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::SetElseActionsStateToHidden()
|
void AdvSceneSwitcher::SetElseActionsStateToHidden() const
|
||||||
{
|
{
|
||||||
ui->toggleElseActions->setToolTip(obs_module_text(
|
ui->toggleElseActions->setToolTip(obs_module_text(
|
||||||
"AdvSceneSwitcher.macroTab.toggleElseActions.show.tooltip"));
|
"AdvSceneSwitcher.macroTab.toggleElseActions.show.tooltip"));
|
||||||
ui->toggleElseActions->setChecked(false);
|
ui->toggleElseActions->setChecked(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::SetElseActionsStateToVisible()
|
void AdvSceneSwitcher::SetElseActionsStateToVisible() const
|
||||||
{
|
{
|
||||||
ui->toggleElseActions->setToolTip(obs_module_text(
|
ui->toggleElseActions->setToolTip(obs_module_text(
|
||||||
"AdvSceneSwitcher.macroTab.toggleElseActions.hide.tooltip"));
|
"AdvSceneSwitcher.macroTab.toggleElseActions.hide.tooltip"));
|
||||||
@@ -1601,7 +1679,7 @@ static void fadeWidgets(const std::vector<QWidget *> &widgets, bool fadeOut)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvSceneSwitcher::HighlightControls()
|
void AdvSceneSwitcher::HighlightControls() const
|
||||||
{
|
{
|
||||||
const std::vector<QWidget *> conditionControls{
|
const std::vector<QWidget *> conditionControls{
|
||||||
ui->conditionAdd, ui->conditionRemove, ui->conditionTop,
|
ui->conditionAdd, ui->conditionRemove, ui->conditionTop,
|
||||||
|
|||||||
@@ -1301,10 +1301,10 @@ QSize MacroTreeDelegate::sizeHint(const QStyleOptionViewItem &option,
|
|||||||
QWidget *item = tree->indexWidget(index);
|
QWidget *item = tree->indexWidget(index);
|
||||||
|
|
||||||
if (!item) {
|
if (!item) {
|
||||||
return (QSize(0, 0));
|
return QStyledItemDelegate::sizeHint(option, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (QSize(option.widget->minimumWidth(), item->height()));
|
return QSize(item->sizeHint());
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace advss
|
} // namespace advss
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#include "macro-condition-factory.hpp"
|
#include "macro-condition-factory.hpp"
|
||||||
#include "macro-dock.hpp"
|
#include "macro-dock.hpp"
|
||||||
#include "macro-helpers.hpp"
|
#include "macro-helpers.hpp"
|
||||||
|
#include "macro-settings.hpp"
|
||||||
#include "plugin-state-helpers.hpp"
|
#include "plugin-state-helpers.hpp"
|
||||||
#include "splitter-helpers.hpp"
|
#include "splitter-helpers.hpp"
|
||||||
#include "sync-helpers.hpp"
|
#include "sync-helpers.hpp"
|
||||||
@@ -76,15 +77,21 @@ namespace advss {
|
|||||||
|
|
||||||
static std::deque<std::shared_ptr<Macro>> macros;
|
static std::deque<std::shared_ptr<Macro>> macros;
|
||||||
|
|
||||||
Macro::Macro(const std::string &name, const bool addHotkey,
|
Macro::Macro(const std::string &name)
|
||||||
const bool shortCircuitEvaluation)
|
|
||||||
{
|
{
|
||||||
SetName(name);
|
SetName(name);
|
||||||
if (addHotkey) {
|
}
|
||||||
|
|
||||||
|
Macro::Macro(const std::string &name, const GlobalMacroSettings &settings)
|
||||||
|
: Macro(name)
|
||||||
|
{
|
||||||
|
if (settings._newMacroRegisterHotkeys) {
|
||||||
SetupHotkeys();
|
SetupHotkeys();
|
||||||
}
|
}
|
||||||
_registerHotkeys = addHotkey;
|
_registerHotkeys = settings._newMacroRegisterHotkeys;
|
||||||
_useShortCircuitEvaluation = shortCircuitEvaluation;
|
_checkInParallel = settings._newMacroCheckInParallel;
|
||||||
|
_useShortCircuitEvaluation =
|
||||||
|
settings._newMacroUseShortCircuitEvaluation;
|
||||||
}
|
}
|
||||||
|
|
||||||
Macro::~Macro()
|
Macro::~Macro()
|
||||||
@@ -104,7 +111,8 @@ std::shared_ptr<Macro>
|
|||||||
Macro::CreateGroup(const std::string &name,
|
Macro::CreateGroup(const std::string &name,
|
||||||
std::vector<std::shared_ptr<Macro>> &children)
|
std::vector<std::shared_ptr<Macro>> &children)
|
||||||
{
|
{
|
||||||
auto group = std::make_shared<Macro>(name, false);
|
auto group = std::make_shared<Macro>(name);
|
||||||
|
group->_registerHotkeys = false;
|
||||||
for (auto &c : children) {
|
for (auto &c : children) {
|
||||||
c->SetParent(group);
|
c->SetParent(group);
|
||||||
}
|
}
|
||||||
@@ -244,19 +252,52 @@ bool Macro::CheckConditions(bool ignorePause)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
_stop = false;
|
const auto checkConditionsTask =
|
||||||
_matched = false;
|
[this,
|
||||||
for (auto &condition : _conditions) {
|
ignorePause](const std::deque<std::shared_ptr<MacroCondition>>
|
||||||
if (!condition) {
|
&conditions) {
|
||||||
continue;
|
for (auto &condition : conditions) {
|
||||||
}
|
if (!condition) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (_paused && !ignorePause) {
|
if (_paused && !ignorePause) {
|
||||||
vblog(LOG_INFO, "Macro %s is paused", _name.c_str());
|
vblog(LOG_INFO, "Macro %s is paused",
|
||||||
|
_name.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
_matched = CheckConditionHelper(condition);
|
||||||
|
}
|
||||||
|
return _matched;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (CheckInParallel()) {
|
||||||
|
if (!_conditionCheckFuture.valid()) {
|
||||||
|
_stop = false;
|
||||||
|
_matched = false;
|
||||||
|
_conditionCheckFuture = std::async(
|
||||||
|
std::launch::async,
|
||||||
|
[this, checkConditionsTask]() {
|
||||||
|
// Copy to avoid settings modifications
|
||||||
|
// causing issues
|
||||||
|
const auto conditionsCopy = _conditions;
|
||||||
|
checkConditionsTask(conditionsCopy);
|
||||||
|
});
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (_conditionCheckFuture.wait_for(std::chrono::seconds(0)) !=
|
||||||
_matched = CheckConditionHelper(condition);
|
std::future_status::ready) {
|
||||||
|
vblog(LOG_INFO,
|
||||||
|
"Macro %s still waiting for condition check result",
|
||||||
|
_name.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
_conditionCheckFuture.get();
|
||||||
|
} else {
|
||||||
|
_stop = false;
|
||||||
|
_matched = false;
|
||||||
|
_matched = checkConditionsTask(_conditions);
|
||||||
}
|
}
|
||||||
|
|
||||||
vblog(LOG_INFO, "Macro %s returned %d", _name.c_str(), _matched);
|
vblog(LOG_INFO, "Macro %s returned %d", _name.c_str(), _matched);
|
||||||
@@ -273,7 +314,9 @@ bool Macro::CheckConditions(bool ignorePause)
|
|||||||
|
|
||||||
bool Macro::PerformActions(bool match, bool forceParallel, bool ignorePause)
|
bool Macro::PerformActions(bool match, bool forceParallel, bool ignorePause)
|
||||||
{
|
{
|
||||||
if (!_done) {
|
if (_actionRunFuture.valid() &&
|
||||||
|
_actionRunFuture.wait_for(std::chrono::seconds(0)) !=
|
||||||
|
std::future_status::ready) {
|
||||||
vblog(LOG_INFO, "Macro %s already running", _name.c_str());
|
vblog(LOG_INFO, "Macro %s already running", _name.c_str());
|
||||||
|
|
||||||
if (!_stopActionsIfNotDone) {
|
if (!_stopActionsIfNotDone) {
|
||||||
@@ -291,14 +334,15 @@ bool Macro::PerformActions(bool match, bool forceParallel, bool ignorePause)
|
|||||||
: std::bind(&Macro::RunElseActions, this,
|
: std::bind(&Macro::RunElseActions, this,
|
||||||
std::placeholders::_1);
|
std::placeholders::_1);
|
||||||
_stop = false;
|
_stop = false;
|
||||||
_done = false;
|
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
if (_runInParallel || forceParallel) {
|
if (_runInParallel || forceParallel) {
|
||||||
if (_backgroundThread.joinable()) {
|
if (_actionRunFuture.valid()) {
|
||||||
_backgroundThread.join();
|
_actionRunFuture.get();
|
||||||
}
|
}
|
||||||
_backgroundThread = std::thread(
|
_actionRunFuture = std::async(std::launch::async,
|
||||||
[this, runFunc, ignorePause] { runFunc(ignorePause); });
|
[this, runFunc, ignorePause] {
|
||||||
|
runFunc(ignorePause);
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
ret = runFunc(ignorePause);
|
ret = runFunc(ignorePause);
|
||||||
}
|
}
|
||||||
@@ -336,6 +380,13 @@ bool Macro::ConditionsShouldBeChecked() const
|
|||||||
|
|
||||||
bool Macro::ShouldRunActions() const
|
bool Macro::ShouldRunActions() const
|
||||||
{
|
{
|
||||||
|
if (CheckInParallel() && _conditionCheckFuture.valid()) {
|
||||||
|
vblog(LOG_INFO,
|
||||||
|
"%s not ready to perform actions as condition check is still running",
|
||||||
|
_name.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
const bool hasActionsToExecute =
|
const bool hasActionsToExecute =
|
||||||
!_paused && (_matched || _elseActions.size() > 0) &&
|
!_paused && (_matched || _elseActions.size() > 0) &&
|
||||||
(!_performActionsOnChange || _conditionSateChanged);
|
(!_performActionsOnChange || _conditionSateChanged);
|
||||||
@@ -408,7 +459,6 @@ bool Macro::RunActionsHelper(
|
|||||||
action->EnableHighlight();
|
action->EnableHighlight();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_done = true;
|
|
||||||
return actionsExecutedSuccessfully;
|
return actionsExecutedSuccessfully;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -508,9 +558,35 @@ void Macro::Stop()
|
|||||||
t.join();
|
t.join();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (_backgroundThread.joinable()) {
|
if (_actionRunFuture.valid()) {
|
||||||
_backgroundThread.join();
|
_actionRunFuture.get();
|
||||||
}
|
}
|
||||||
|
if (_conditionCheckFuture.valid()) {
|
||||||
|
_conditionCheckFuture.get();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Macro::SetCheckInParallel(bool parallel)
|
||||||
|
{
|
||||||
|
_checkInParallel = parallel;
|
||||||
|
_conditionCheckFuture = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Macro::ParallelTasksCompleted() const
|
||||||
|
{
|
||||||
|
// A parallel action run might be triggered by RunInParallel() or the
|
||||||
|
// "Run Macro" button, so checking just for RunInParallel() will not
|
||||||
|
// suffice
|
||||||
|
if (!CheckInParallel() && !_actionRunFuture.valid()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (_actionRunFuture.valid()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (CheckInParallel() && _conditionCheckFuture.valid()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
MacroInputVariables Macro::GetInputVariables() const
|
MacroInputVariables Macro::GetInputVariables() const
|
||||||
@@ -648,16 +724,31 @@ std::deque<std::shared_ptr<MacroCondition>> &Macro::Conditions()
|
|||||||
return _conditions;
|
return _conditions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const std::deque<std::shared_ptr<MacroCondition>> &Macro::Conditions() const
|
||||||
|
{
|
||||||
|
return _conditions;
|
||||||
|
}
|
||||||
|
|
||||||
std::deque<std::shared_ptr<MacroAction>> &Macro::Actions()
|
std::deque<std::shared_ptr<MacroAction>> &Macro::Actions()
|
||||||
{
|
{
|
||||||
return _actions;
|
return _actions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const std::deque<std::shared_ptr<MacroAction>> &Macro::Actions() const
|
||||||
|
{
|
||||||
|
return _actions;
|
||||||
|
}
|
||||||
|
|
||||||
std::deque<std::shared_ptr<MacroAction>> &Macro::ElseActions()
|
std::deque<std::shared_ptr<MacroAction>> &Macro::ElseActions()
|
||||||
{
|
{
|
||||||
return _elseActions;
|
return _elseActions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const std::deque<std::shared_ptr<MacroAction>> &Macro::ElseActions() const
|
||||||
|
{
|
||||||
|
return _elseActions;
|
||||||
|
}
|
||||||
|
|
||||||
static void updateIndicesHelper(std::deque<std::shared_ptr<MacroSegment>> &list)
|
static void updateIndicesHelper(std::deque<std::shared_ptr<MacroSegment>> &list)
|
||||||
{
|
{
|
||||||
int idx = 0;
|
int idx = 0;
|
||||||
@@ -712,6 +803,7 @@ bool Macro::Save(obs_data_t *obj, bool saveForCopy) const
|
|||||||
static_cast<int>(_pauseSaveBehavior));
|
static_cast<int>(_pauseSaveBehavior));
|
||||||
obs_data_set_bool(obj, "pause", _paused);
|
obs_data_set_bool(obj, "pause", _paused);
|
||||||
obs_data_set_bool(obj, "parallel", _runInParallel);
|
obs_data_set_bool(obj, "parallel", _runInParallel);
|
||||||
|
obs_data_set_bool(obj, "checkConditionsInParallel", _checkInParallel);
|
||||||
obs_data_set_bool(obj, "onChange", _performActionsOnChange);
|
obs_data_set_bool(obj, "onChange", _performActionsOnChange);
|
||||||
obs_data_set_bool(obj, "skipExecOnStart", _skipExecOnStart);
|
obs_data_set_bool(obj, "skipExecOnStart", _skipExecOnStart);
|
||||||
obs_data_set_bool(obj, "stopActionsIfNotDone", _stopActionsIfNotDone);
|
obs_data_set_bool(obj, "stopActionsIfNotDone", _stopActionsIfNotDone);
|
||||||
@@ -797,6 +889,7 @@ bool Macro::Load(obs_data_t *obj)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
_runInParallel = obs_data_get_bool(obj, "parallel");
|
_runInParallel = obs_data_get_bool(obj, "parallel");
|
||||||
|
_checkInParallel = obs_data_get_bool(obj, "checkConditionsInParallel");
|
||||||
_performActionsOnChange = obs_data_get_bool(obj, "onChange");
|
_performActionsOnChange = obs_data_get_bool(obj, "onChange");
|
||||||
_skipExecOnStart = obs_data_get_bool(obj, "skipExecOnStart");
|
_skipExecOnStart = obs_data_get_bool(obj, "skipExecOnStart");
|
||||||
_stopActionsIfNotDone = obs_data_get_bool(obj, "stopActionsIfNotDone");
|
_stopActionsIfNotDone = obs_data_get_bool(obj, "stopActionsIfNotDone");
|
||||||
@@ -1468,6 +1561,14 @@ std::weak_ptr<Macro> GetWeakMacroByName(const char *name)
|
|||||||
void InvalidateMacroTempVarValues()
|
void InvalidateMacroTempVarValues()
|
||||||
{
|
{
|
||||||
for (const auto &m : macros) {
|
for (const auto &m : macros) {
|
||||||
|
// Do not invalidate the temp vars set during condition checks
|
||||||
|
// or action executions running in parallel to the "main" macro
|
||||||
|
// loop, as otherwise access to the information stored in those
|
||||||
|
// variables might get lost while those checks or actions are
|
||||||
|
// still ongoing.
|
||||||
|
if (!m->ParallelTasksCompleted()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
m->InvalidateTempVarValues();
|
m->InvalidateTempVarValues();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
#include "variable-string.hpp"
|
#include "variable-string.hpp"
|
||||||
#include "temp-variable.hpp"
|
#include "temp-variable.hpp"
|
||||||
|
|
||||||
|
#include <future>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QByteArray>
|
#include <QByteArray>
|
||||||
#include <string>
|
#include <string>
|
||||||
@@ -20,6 +21,7 @@
|
|||||||
namespace advss {
|
namespace advss {
|
||||||
|
|
||||||
class MacroDock;
|
class MacroDock;
|
||||||
|
class GlobalMacroSettings;
|
||||||
|
|
||||||
class Macro {
|
class Macro {
|
||||||
using TimePoint = std::chrono::high_resolution_clock::time_point;
|
using TimePoint = std::chrono::high_resolution_clock::time_point;
|
||||||
@@ -27,8 +29,8 @@ class Macro {
|
|||||||
public:
|
public:
|
||||||
enum class PauseStateSaveBehavior { PERSIST, PAUSE, UNPAUSE };
|
enum class PauseStateSaveBehavior { PERSIST, PAUSE, UNPAUSE };
|
||||||
|
|
||||||
Macro(const std::string &name = "", const bool addHotkey = false,
|
Macro(const std::string &name = "");
|
||||||
const bool shortCircuitEvaluation = false);
|
Macro(const std::string &name, const GlobalMacroSettings &settings);
|
||||||
~Macro();
|
~Macro();
|
||||||
|
|
||||||
std::string Name() const { return _name; }
|
std::string Name() const { return _name; }
|
||||||
@@ -77,6 +79,9 @@ public:
|
|||||||
void AddHelperThread(std::thread &&);
|
void AddHelperThread(std::thread &&);
|
||||||
void SetRunInParallel(bool parallel) { _runInParallel = parallel; }
|
void SetRunInParallel(bool parallel) { _runInParallel = parallel; }
|
||||||
bool RunInParallel() const { return _runInParallel; }
|
bool RunInParallel() const { return _runInParallel; }
|
||||||
|
bool CheckInParallel() const { return _checkInParallel; }
|
||||||
|
void SetCheckInParallel(bool parallel);
|
||||||
|
bool ParallelTasksCompleted() const;
|
||||||
|
|
||||||
// Input variables
|
// Input variables
|
||||||
MacroInputVariables GetInputVariables() const;
|
MacroInputVariables GetInputVariables() const;
|
||||||
@@ -90,8 +95,11 @@ public:
|
|||||||
|
|
||||||
// Macro segments
|
// Macro segments
|
||||||
std::deque<std::shared_ptr<MacroCondition>> &Conditions();
|
std::deque<std::shared_ptr<MacroCondition>> &Conditions();
|
||||||
|
const std::deque<std::shared_ptr<MacroCondition>> &Conditions() const;
|
||||||
std::deque<std::shared_ptr<MacroAction>> &Actions();
|
std::deque<std::shared_ptr<MacroAction>> &Actions();
|
||||||
|
const std::deque<std::shared_ptr<MacroAction>> &Actions() const;
|
||||||
std::deque<std::shared_ptr<MacroAction>> &ElseActions();
|
std::deque<std::shared_ptr<MacroAction>> &ElseActions();
|
||||||
|
const std::deque<std::shared_ptr<MacroAction>> &ElseActions() const;
|
||||||
void UpdateActionIndices();
|
void UpdateActionIndices();
|
||||||
void UpdateElseActionIndices();
|
void UpdateElseActionIndices();
|
||||||
void UpdateConditionIndices();
|
void UpdateConditionIndices();
|
||||||
@@ -182,11 +190,10 @@ private:
|
|||||||
std::string _name = "";
|
std::string _name = "";
|
||||||
bool _die = false;
|
bool _die = false;
|
||||||
bool _stop = false;
|
bool _stop = false;
|
||||||
bool _done = true;
|
std::future<void> _actionRunFuture;
|
||||||
TimePoint _lastCheckTime{};
|
TimePoint _lastCheckTime{};
|
||||||
TimePoint _lastUnpauseTime{};
|
TimePoint _lastUnpauseTime{};
|
||||||
TimePoint _lastExecutionTime{};
|
TimePoint _lastExecutionTime{};
|
||||||
std::thread _backgroundThread;
|
|
||||||
std::vector<std::thread> _helperThreads;
|
std::vector<std::thread> _helperThreads;
|
||||||
|
|
||||||
std::deque<std::shared_ptr<MacroCondition>> _conditions;
|
std::deque<std::shared_ptr<MacroCondition>> _conditions;
|
||||||
@@ -204,7 +211,9 @@ private:
|
|||||||
bool _conditionSateChanged = false;
|
bool _conditionSateChanged = false;
|
||||||
|
|
||||||
bool _runInParallel = false;
|
bool _runInParallel = false;
|
||||||
|
bool _checkInParallel = false;
|
||||||
bool _matched = false;
|
bool _matched = false;
|
||||||
|
std::future<void> _conditionCheckFuture;
|
||||||
bool _lastMatched = false;
|
bool _lastMatched = false;
|
||||||
bool _performActionsOnChange = true;
|
bool _performActionsOnChange = true;
|
||||||
bool _skipExecOnStart = false;
|
bool _skipExecOnStart = false;
|
||||||
|
|||||||
@@ -255,6 +255,16 @@ static void removeMacroSegmentHotkeyFunc(void *, obs_hotkey_id, obs_hotkey_t *,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void addNewMacroHotkeyFunc(void *, obs_hotkey_id, obs_hotkey_t *,
|
||||||
|
bool pressed)
|
||||||
|
{
|
||||||
|
if (pressed && SettingsWindowIsOpened()) {
|
||||||
|
QMetaObject::invokeMethod(GetSettingsWindow(),
|
||||||
|
"on_macroAdd_clicked",
|
||||||
|
Qt::QueuedConnection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void registerHotkeys()
|
static void registerHotkeys()
|
||||||
{
|
{
|
||||||
switcher->startHotkey = obs_hotkey_register_frontend(
|
switcher->startHotkey = obs_hotkey_register_frontend(
|
||||||
@@ -270,19 +280,21 @@ static void registerHotkeys()
|
|||||||
obs_module_text(
|
obs_module_text(
|
||||||
"AdvSceneSwitcher.hotkey.startStopToggleSwitcherHotkey"),
|
"AdvSceneSwitcher.hotkey.startStopToggleSwitcherHotkey"),
|
||||||
startStopToggleHotkeyFunc, NULL);
|
startStopToggleHotkeyFunc, NULL);
|
||||||
|
switcher->newMacroHotkey = obs_hotkey_register_frontend(
|
||||||
|
"newMacroSwitcherHotkey",
|
||||||
|
obs_module_text("AdvSceneSwitcher.hotkey.macro.new"),
|
||||||
|
addNewMacroHotkeyFunc, NULL);
|
||||||
switcher->upMacroSegment = obs_hotkey_register_frontend(
|
switcher->upMacroSegment = obs_hotkey_register_frontend(
|
||||||
"upMacroSegmentSwitcherHotkey",
|
"upMacroSegmentSwitcherHotkey",
|
||||||
obs_module_text("AdvSceneSwitcher.hotkey.upMacroSegmentHotkey"),
|
obs_module_text("AdvSceneSwitcher.hotkey.macro.segment.up"),
|
||||||
upMacroSegmentHotkeyFunc, NULL);
|
upMacroSegmentHotkeyFunc, NULL);
|
||||||
switcher->downMacroSegment = obs_hotkey_register_frontend(
|
switcher->downMacroSegment = obs_hotkey_register_frontend(
|
||||||
"downMacroSegmentSwitcherHotkey",
|
"downMacroSegmentSwitcherHotkey",
|
||||||
obs_module_text(
|
obs_module_text("AdvSceneSwitcher.hotkey.macro.segment.down"),
|
||||||
"AdvSceneSwitcher.hotkey.downMacroSegmentHotkey"),
|
|
||||||
downMacroSegmentHotkeyFunc, NULL);
|
downMacroSegmentHotkeyFunc, NULL);
|
||||||
switcher->removeMacroSegment = obs_hotkey_register_frontend(
|
switcher->removeMacroSegment = obs_hotkey_register_frontend(
|
||||||
"removeMacroSegmentSwitcherHotkey",
|
"removeMacroSegmentSwitcherHotkey",
|
||||||
obs_module_text(
|
obs_module_text("AdvSceneSwitcher.hotkey.macro.segment.remove"),
|
||||||
"AdvSceneSwitcher.hotkey.removeMacroSegmentHotkey"),
|
|
||||||
removeMacroSegmentHotkeyFunc, NULL);
|
removeMacroSegmentHotkeyFunc, NULL);
|
||||||
|
|
||||||
switcher->hotkeysRegistered = true;
|
switcher->hotkeysRegistered = true;
|
||||||
@@ -300,6 +312,7 @@ void SwitcherData::SaveHotkeys(obs_data_t *obj)
|
|||||||
saveHotkey(obj, startHotkey, "startHotkey");
|
saveHotkey(obj, startHotkey, "startHotkey");
|
||||||
saveHotkey(obj, stopHotkey, "stopHotkey");
|
saveHotkey(obj, stopHotkey, "stopHotkey");
|
||||||
saveHotkey(obj, toggleHotkey, "toggleHotkey");
|
saveHotkey(obj, toggleHotkey, "toggleHotkey");
|
||||||
|
saveHotkey(obj, newMacroHotkey, "newMacroHotkey");
|
||||||
saveHotkey(obj, upMacroSegment, "upMacroSegmentHotkey");
|
saveHotkey(obj, upMacroSegment, "upMacroSegmentHotkey");
|
||||||
saveHotkey(obj, downMacroSegment, "downMacroSegmentHotkey");
|
saveHotkey(obj, downMacroSegment, "downMacroSegmentHotkey");
|
||||||
saveHotkey(obj, removeMacroSegment, "removeMacroSegmentHotkey");
|
saveHotkey(obj, removeMacroSegment, "removeMacroSegmentHotkey");
|
||||||
@@ -312,14 +325,31 @@ static void loadHotkey(obs_data_t *obj, obs_hotkey_id id, const char *name)
|
|||||||
obs_data_array_release(a);
|
obs_data_array_release(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void setDefaultHotkeyBinding(obs_data_t *data, const char *name,
|
||||||
|
const char *value)
|
||||||
|
{
|
||||||
|
OBSDataAutoRelease hotkeyData = obs_data_create_from_json(value);
|
||||||
|
OBSDataArrayAutoRelease hotkeyArray = obs_data_array_create();
|
||||||
|
obs_data_array_push_back(hotkeyArray, hotkeyData);
|
||||||
|
obs_data_set_default_array(data, name, hotkeyArray);
|
||||||
|
}
|
||||||
|
|
||||||
void SwitcherData::LoadHotkeys(obs_data_t *obj)
|
void SwitcherData::LoadHotkeys(obs_data_t *obj)
|
||||||
{
|
{
|
||||||
if (!hotkeysRegistered) {
|
if (!hotkeysRegistered) {
|
||||||
registerHotkeys();
|
registerHotkeys();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setDefaultHotkeyBinding(obj, "newMacroHotkey",
|
||||||
|
"{"
|
||||||
|
"\"control\": true,"
|
||||||
|
"\"key\": \"OBS_KEY_N\""
|
||||||
|
"}");
|
||||||
|
|
||||||
loadHotkey(obj, startHotkey, "startHotkey");
|
loadHotkey(obj, startHotkey, "startHotkey");
|
||||||
loadHotkey(obj, stopHotkey, "stopHotkey");
|
loadHotkey(obj, stopHotkey, "stopHotkey");
|
||||||
loadHotkey(obj, toggleHotkey, "toggleHotkey");
|
loadHotkey(obj, toggleHotkey, "toggleHotkey");
|
||||||
|
loadHotkey(obj, newMacroHotkey, "newMacroHotkey");
|
||||||
loadHotkey(obj, upMacroSegment, "upMacroSegmentHotkey");
|
loadHotkey(obj, upMacroSegment, "upMacroSegmentHotkey");
|
||||||
loadHotkey(obj, downMacroSegment, "downMacroSegmentHotkey");
|
loadHotkey(obj, downMacroSegment, "downMacroSegmentHotkey");
|
||||||
loadHotkey(obj, removeMacroSegment, "removeMacroSegmentHotkey");
|
loadHotkey(obj, removeMacroSegment, "removeMacroSegmentHotkey");
|
||||||
|
|||||||
@@ -132,9 +132,6 @@ public:
|
|||||||
bool transitionOverrideOverride = false;
|
bool transitionOverrideOverride = false;
|
||||||
bool adjustActiveTransitionType = true;
|
bool adjustActiveTransitionType = true;
|
||||||
|
|
||||||
enum class LogLevel { DEFAULT, LOG_MACRO, LOG_ACTION, VERBOSE };
|
|
||||||
LogLevel logLevel = LogLevel::DEFAULT;
|
|
||||||
|
|
||||||
/* --- End of General tab section --- */
|
/* --- End of General tab section --- */
|
||||||
|
|
||||||
std::string lastTitle;
|
std::string lastTitle;
|
||||||
@@ -152,6 +149,7 @@ public:
|
|||||||
obs_hotkey_id startHotkey = OBS_INVALID_HOTKEY_ID;
|
obs_hotkey_id startHotkey = OBS_INVALID_HOTKEY_ID;
|
||||||
obs_hotkey_id stopHotkey = OBS_INVALID_HOTKEY_ID;
|
obs_hotkey_id stopHotkey = OBS_INVALID_HOTKEY_ID;
|
||||||
obs_hotkey_id toggleHotkey = OBS_INVALID_HOTKEY_ID;
|
obs_hotkey_id toggleHotkey = OBS_INVALID_HOTKEY_ID;
|
||||||
|
obs_hotkey_id newMacroHotkey = OBS_INVALID_HOTKEY_ID;
|
||||||
obs_hotkey_id upMacroSegment = OBS_INVALID_HOTKEY_ID;
|
obs_hotkey_id upMacroSegment = OBS_INVALID_HOTKEY_ID;
|
||||||
obs_hotkey_id downMacroSegment = OBS_INVALID_HOTKEY_ID;
|
obs_hotkey_id downMacroSegment = OBS_INVALID_HOTKEY_ID;
|
||||||
obs_hotkey_id removeMacroSegment = OBS_INVALID_HOTKEY_ID;
|
obs_hotkey_id removeMacroSegment = OBS_INVALID_HOTKEY_ID;
|
||||||
@@ -166,6 +164,7 @@ public:
|
|||||||
bool warnPluginLoadFailure = true;
|
bool warnPluginLoadFailure = true;
|
||||||
bool disableHints = false;
|
bool disableHints = false;
|
||||||
bool disableFilterComboboxFilter = false;
|
bool disableFilterComboboxFilter = false;
|
||||||
|
bool disableMacroWidgetCache = false;
|
||||||
bool hideLegacyTabs = true;
|
bool hideLegacyTabs = true;
|
||||||
bool saveWindowGeo = false;
|
bool saveWindowGeo = false;
|
||||||
QPoint windowPos = {};
|
QPoint windowPos = {};
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
namespace advss {
|
namespace advss {
|
||||||
|
|
||||||
class SliderIgnoreScroll : public QSlider {
|
class ADVSS_EXPORT SliderIgnoreScroll : public QSlider {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -9,15 +9,14 @@
|
|||||||
|
|
||||||
namespace advss {
|
namespace advss {
|
||||||
|
|
||||||
class DurationSelection : public QWidget {
|
class ADVSS_EXPORT DurationSelection : public QWidget {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
EXPORT DurationSelection(QWidget *parent = nullptr,
|
DurationSelection(QWidget *parent = nullptr,
|
||||||
bool showUnitSelection = true,
|
bool showUnitSelection = true, double minValue = 0.0);
|
||||||
double minValue = 0.0);
|
void SetDuration(const Duration &);
|
||||||
EXPORT void SetDuration(const Duration &);
|
|
||||||
Duration GetDuration() const { return _current; }
|
Duration GetDuration() const { return _current; }
|
||||||
EXPORT QDoubleSpinBox *SpinBox() { return _duration->SpinBox(); }
|
QDoubleSpinBox *SpinBox() { return _duration->SpinBox(); }
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void _DurationChanged(const NumberVariable<double> &value);
|
void _DurationChanged(const NumberVariable<double> &value);
|
||||||
|
|||||||
@@ -62,6 +62,11 @@ void FilterComboBox::SetFilterBehaviourEnabled(bool value)
|
|||||||
FilterComboBox::_filteringEnabled = value;
|
FilterComboBox::_filteringEnabled = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FilterComboBox::SetAllowUnmatchedSelection(bool allow)
|
||||||
|
{
|
||||||
|
_allowUnmatchedSelection = allow;
|
||||||
|
}
|
||||||
|
|
||||||
void FilterComboBox::setCurrentText(const QString &text)
|
void FilterComboBox::setCurrentText(const QString &text)
|
||||||
{
|
{
|
||||||
if (_filteringEnabled) {
|
if (_filteringEnabled) {
|
||||||
@@ -82,7 +87,7 @@ void FilterComboBox::setItemText(int index, const QString &text)
|
|||||||
void FilterComboBox::focusOutEvent(QFocusEvent *event)
|
void FilterComboBox::focusOutEvent(QFocusEvent *event)
|
||||||
{
|
{
|
||||||
// Reset on invalid selection
|
// Reset on invalid selection
|
||||||
if (findText(currentText()) == -1) {
|
if (!_allowUnmatchedSelection && findText(currentText()) == -1) {
|
||||||
setCurrentIndex(-1);
|
setCurrentIndex(-1);
|
||||||
Emit(-1, "");
|
Emit(-1, "");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ public:
|
|||||||
FilterComboBox(QWidget *parent = nullptr,
|
FilterComboBox(QWidget *parent = nullptr,
|
||||||
const QString &placehodler = "");
|
const QString &placehodler = "");
|
||||||
static void SetFilterBehaviourEnabled(bool);
|
static void SetFilterBehaviourEnabled(bool);
|
||||||
|
void SetAllowUnmatchedSelection(bool allow);
|
||||||
|
|
||||||
void setCurrentText(const QString &text);
|
void setCurrentText(const QString &text);
|
||||||
void setItemText(int index, const QString &text);
|
void setItemText(int index, const QString &text);
|
||||||
@@ -27,6 +28,7 @@ private slots:
|
|||||||
private:
|
private:
|
||||||
void Emit(int index, const QString &text);
|
void Emit(int index, const QString &text);
|
||||||
|
|
||||||
|
bool _allowUnmatchedSelection = false;
|
||||||
int _lastEmittedIndex = -1;
|
int _lastEmittedIndex = -1;
|
||||||
QString _lastEmittedText;
|
QString _lastEmittedText;
|
||||||
|
|
||||||
|
|||||||
102
lib/utils/json-helpers.cpp
Normal file
102
lib/utils/json-helpers.cpp
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
#include "json-helpers.hpp"
|
||||||
|
|
||||||
|
#ifdef JSONPATH_SUPPORT
|
||||||
|
#include <jsoncons/json.hpp>
|
||||||
|
#include <jsoncons_ext/jsonpath/jsonpath.hpp>
|
||||||
|
#endif
|
||||||
|
#include <nlohmann/json.hpp>
|
||||||
|
#include <QJsonDocument>
|
||||||
|
|
||||||
|
namespace advss {
|
||||||
|
|
||||||
|
QString FormatJsonString(std::string s)
|
||||||
|
{
|
||||||
|
return FormatJsonString(QString::fromStdString(s));
|
||||||
|
}
|
||||||
|
|
||||||
|
QString FormatJsonString(QString json)
|
||||||
|
{
|
||||||
|
QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8());
|
||||||
|
if (doc.isNull()) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return QString::fromUtf8(doc.toJson(QJsonDocument::Indented));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MatchJson(const std::string &json1, const std::string &json2,
|
||||||
|
const RegexConfig ®ex)
|
||||||
|
{
|
||||||
|
auto j1 = FormatJsonString(json1).toStdString();
|
||||||
|
auto j2 = FormatJsonString(json2).toStdString();
|
||||||
|
|
||||||
|
if (j1.empty()) {
|
||||||
|
j1 = json1;
|
||||||
|
}
|
||||||
|
if (j2.empty()) {
|
||||||
|
j2 = json2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (regex.Enabled()) {
|
||||||
|
return regex.Matches(j1, j2);
|
||||||
|
}
|
||||||
|
return j1 == j2;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<std::string> GetJsonField(const std::string &jsonStr,
|
||||||
|
const std::string &fieldToExtract)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
nlohmann::json json = nlohmann::json::parse(jsonStr);
|
||||||
|
auto it = json.find(fieldToExtract);
|
||||||
|
if (it == json.end()) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
if (it->is_string()) {
|
||||||
|
return it->get<std::string>();
|
||||||
|
}
|
||||||
|
return it->dump();
|
||||||
|
} catch (const nlohmann::json::exception &) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<std::string> QueryJson(const std::string &jsonStr,
|
||||||
|
const std::string &query)
|
||||||
|
{
|
||||||
|
#ifdef JSONPATH_SUPPORT
|
||||||
|
try {
|
||||||
|
auto json = jsoncons::json::parse(jsonStr);
|
||||||
|
auto result = jsoncons::jsonpath::json_query(json, query);
|
||||||
|
return result.as_string();
|
||||||
|
} catch (const jsoncons::json_exception &) {
|
||||||
|
return {};
|
||||||
|
} catch (const jsoncons::json_errc &) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
return {};
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<std::string> AccessJsonArrayIndex(const std::string &jsonStr,
|
||||||
|
const int index)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
nlohmann::json json = nlohmann::json::parse(jsonStr);
|
||||||
|
if (!json.is_array() || index >= (int)json.size() ||
|
||||||
|
index < 0) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
auto result = json.at(index);
|
||||||
|
if (result.is_string()) {
|
||||||
|
return result.get<std::string>();
|
||||||
|
}
|
||||||
|
return result.dump();
|
||||||
|
} catch (const nlohmann::json::exception &) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace advss
|
||||||
21
lib/utils/json-helpers.hpp
Normal file
21
lib/utils/json-helpers.hpp
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "export-symbol-helper.hpp"
|
||||||
|
#include "regex-config.hpp"
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace advss {
|
||||||
|
|
||||||
|
EXPORT QString FormatJsonString(std::string);
|
||||||
|
EXPORT QString FormatJsonString(QString);
|
||||||
|
EXPORT bool MatchJson(const std::string &json1, const std::string &json2,
|
||||||
|
const RegexConfig ®ex);
|
||||||
|
EXPORT std::optional<std::string> GetJsonField(const std::string &json,
|
||||||
|
const std::string &id);
|
||||||
|
EXPORT std::optional<std::string> QueryJson(const std::string &json,
|
||||||
|
const std::string &query);
|
||||||
|
EXPORT std::optional<std::string> AccessJsonArrayIndex(const std::string &json,
|
||||||
|
const int index);
|
||||||
|
|
||||||
|
} // namespace advss
|
||||||
@@ -1,26 +1,97 @@
|
|||||||
#include "log-helper.hpp"
|
#include "log-helper.hpp"
|
||||||
#include "switcher-data.hpp"
|
#include "obs-module-helper.hpp"
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <obs-data.h>
|
||||||
|
#include <QComboBox>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
namespace advss {
|
namespace advss {
|
||||||
|
|
||||||
|
static LogLevel logLevel = LogLevel::DEFAULT;
|
||||||
|
|
||||||
bool VerboseLoggingEnabled()
|
bool VerboseLoggingEnabled()
|
||||||
{
|
{
|
||||||
return GetSwitcher() &&
|
return logLevel == LogLevel::VERBOSE;
|
||||||
GetSwitcher()->logLevel == SwitcherData::LogLevel::VERBOSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ActionLoggingEnabled()
|
bool ActionLoggingEnabled()
|
||||||
{
|
{
|
||||||
return GetSwitcher() &&
|
return logLevel == LogLevel::LOG_ACTION || VerboseLoggingEnabled();
|
||||||
(GetSwitcher()->logLevel == SwitcherData::LogLevel::LOG_ACTION ||
|
|
||||||
VerboseLoggingEnabled());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MacroLoggingEnabled()
|
bool MacroLoggingEnabled()
|
||||||
{
|
{
|
||||||
return GetSwitcher() &&
|
return logLevel == LogLevel::LOG_MACRO || ActionLoggingEnabled();
|
||||||
(GetSwitcher()->logLevel == SwitcherData::LogLevel::LOG_MACRO ||
|
}
|
||||||
ActionLoggingEnabled());
|
|
||||||
|
bool LoggingEnabled()
|
||||||
|
{
|
||||||
|
return logLevel != LogLevel::DISABLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetLogLevel(LogLevel newLogLevel)
|
||||||
|
{
|
||||||
|
logLevel = newLogLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
LogLevel GetLogLevel()
|
||||||
|
{
|
||||||
|
return logLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SaveLogLevel(void *data)
|
||||||
|
{
|
||||||
|
auto obj = static_cast<obs_data_t *>(data);
|
||||||
|
obs_data_set_int(obj, "logLevel", static_cast<int>(logLevel));
|
||||||
|
obs_data_set_int(obj, "logLevelVersion", 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LoadLogLevel(void *data)
|
||||||
|
{
|
||||||
|
auto obj = static_cast<obs_data_t *>(data);
|
||||||
|
logLevel = static_cast<LogLevel>(obs_data_get_int(obj, "logLevel"));
|
||||||
|
if (obs_data_get_int(obj, "logLevelVersion") < 1) {
|
||||||
|
enum OldLogLevel { DEFAULT, LOG_ACTION, VERBOSE };
|
||||||
|
OldLogLevel oldLogLevel = static_cast<OldLogLevel>(
|
||||||
|
obs_data_get_int(obj, "logLevel"));
|
||||||
|
switch (oldLogLevel) {
|
||||||
|
case DEFAULT:
|
||||||
|
logLevel = LogLevel::DEFAULT;
|
||||||
|
break;
|
||||||
|
case LOG_ACTION:
|
||||||
|
logLevel = LogLevel::LOG_ACTION;
|
||||||
|
break;
|
||||||
|
case VERBOSE:
|
||||||
|
logLevel = LogLevel::VERBOSE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PopulateLogLevelSelection(void *sel)
|
||||||
|
{
|
||||||
|
auto selection = static_cast<QComboBox *>(sel);
|
||||||
|
static const std::map<LogLevel, std::string> logLevels = {
|
||||||
|
{LogLevel::DISABLE,
|
||||||
|
"AdvSceneSwitcher.generalTab.generalBehavior.logLevel.disable"},
|
||||||
|
{LogLevel::DEFAULT,
|
||||||
|
"AdvSceneSwitcher.generalTab.generalBehavior.logLevel.default"},
|
||||||
|
{LogLevel::LOG_MACRO,
|
||||||
|
"AdvSceneSwitcher.generalTab.generalBehavior.logLevel.logMacro"},
|
||||||
|
{LogLevel::LOG_ACTION,
|
||||||
|
"AdvSceneSwitcher.generalTab.generalBehavior.logLevel.logAction"},
|
||||||
|
{LogLevel::VERBOSE,
|
||||||
|
"AdvSceneSwitcher.generalTab.generalBehavior.logLevel.verbose"},
|
||||||
|
};
|
||||||
|
|
||||||
|
selection->clear();
|
||||||
|
for (const auto &[value, name] : logLevels) {
|
||||||
|
selection->addItem(obs_module_text(name.c_str()),
|
||||||
|
static_cast<int>(value));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace advss
|
} // namespace advss
|
||||||
|
|||||||
@@ -12,7 +12,13 @@ namespace advss {
|
|||||||
#else
|
#else
|
||||||
|
|
||||||
// Print log with "[adv-ss] " prefix
|
// Print log with "[adv-ss] " prefix
|
||||||
#define blog(level, msg, ...) blog(level, "[adv-ss] " msg, ##__VA_ARGS__)
|
#define blog(level, msg, ...) \
|
||||||
|
do { \
|
||||||
|
if (LoggingEnabled()) { \
|
||||||
|
blog(level, "[adv-ss] " msg, ##__VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
// Print log with "[adv-ss] " if log level is set to "verbose"
|
// Print log with "[adv-ss] " if log level is set to "verbose"
|
||||||
#define vblog(level, msg, ...) \
|
#define vblog(level, msg, ...) \
|
||||||
do { \
|
do { \
|
||||||
@@ -43,5 +49,15 @@ EXPORT bool VerboseLoggingEnabled();
|
|||||||
EXPORT bool ActionLoggingEnabled();
|
EXPORT bool ActionLoggingEnabled();
|
||||||
// Returns true if log level is set to "macro", "action" or "verbose"
|
// Returns true if log level is set to "macro", "action" or "verbose"
|
||||||
EXPORT bool MacroLoggingEnabled();
|
EXPORT bool MacroLoggingEnabled();
|
||||||
|
// Returns true if logging is enabled and false otherwise
|
||||||
|
EXPORT bool LoggingEnabled();
|
||||||
|
|
||||||
|
enum class LogLevel { DISABLE = -1, DEFAULT, LOG_MACRO, LOG_ACTION, VERBOSE };
|
||||||
|
|
||||||
|
void SetLogLevel(LogLevel);
|
||||||
|
LogLevel GetLogLevel();
|
||||||
|
void SaveLogLevel(void *data);
|
||||||
|
void LoadLogLevel(void *data);
|
||||||
|
void PopulateLogLevelSelection(void *);
|
||||||
|
|
||||||
} // namespace advss
|
} // namespace advss
|
||||||
|
|||||||
@@ -9,6 +9,27 @@ namespace advss {
|
|||||||
|
|
||||||
template<class T> class MessageDispatcher {
|
template<class T> class MessageDispatcher {
|
||||||
public:
|
public:
|
||||||
|
MessageDispatcher() = default;
|
||||||
|
~MessageDispatcher() = default;
|
||||||
|
MessageDispatcher(const MessageDispatcher &other)
|
||||||
|
: _clients(other._clients)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
MessageDispatcher(MessageDispatcher &&other) noexcept
|
||||||
|
: _clients(other._clients)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
MessageDispatcher<T> &operator=(const MessageDispatcher<T> &other)
|
||||||
|
{
|
||||||
|
_clients = other._clients;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
MessageDispatcher<T> &operator=(MessageDispatcher<T> &&other) noexcept
|
||||||
|
{
|
||||||
|
std::swap(_clients, other._clients);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
[[nodiscard]] std::shared_ptr<MessageBuffer<T>> RegisterClient();
|
[[nodiscard]] std::shared_ptr<MessageBuffer<T>> RegisterClient();
|
||||||
void DispatchMessage(const T &message);
|
void DispatchMessage(const T &message);
|
||||||
|
|
||||||
|
|||||||
@@ -25,8 +25,8 @@ EXPORT void StopPlugin();
|
|||||||
EXPORT void StartPlugin();
|
EXPORT void StartPlugin();
|
||||||
EXPORT bool PluginIsRunning();
|
EXPORT bool PluginIsRunning();
|
||||||
EXPORT int GetIntervalValue();
|
EXPORT int GetIntervalValue();
|
||||||
void AddStartStep(std::function<void()>);
|
EXPORT void AddStartStep(std::function<void()>);
|
||||||
void AddStopStep(std::function<void()>);
|
EXPORT void AddStopStep(std::function<void()>);
|
||||||
void RunStartSteps();
|
void RunStartSteps();
|
||||||
void RunStopSteps();
|
void RunStopSteps();
|
||||||
void RunIntervalResetSteps();
|
void RunIntervalResetSteps();
|
||||||
|
|||||||
@@ -5,15 +5,15 @@
|
|||||||
|
|
||||||
namespace advss {
|
namespace advss {
|
||||||
|
|
||||||
class ResizingPlainTextEdit : public QPlainTextEdit {
|
class ADVSS_EXPORT ResizingPlainTextEdit : public QPlainTextEdit {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
ResizingPlainTextEdit(QWidget *parent, const int scrollAt = 10,
|
ResizingPlainTextEdit(QWidget *parent, const int scrollAt = 10,
|
||||||
const int minLines = 3,
|
const int minLines = 3,
|
||||||
const int paddingLines = 2);
|
const int paddingLines = 2);
|
||||||
virtual ~ResizingPlainTextEdit(){};
|
virtual ~ResizingPlainTextEdit(){};
|
||||||
EXPORT int maxLength();
|
int maxLength();
|
||||||
EXPORT void setMaxLength(int maxLength);
|
void setMaxLength(int maxLength);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool eventFilter(QObject *obj, QEvent *event) override;
|
bool eventFilter(QObject *obj, QEvent *event) override;
|
||||||
|
|||||||
@@ -1,70 +0,0 @@
|
|||||||
#include "resource-table-hotkey-handler.hpp"
|
|
||||||
|
|
||||||
#include <QKeyEvent>
|
|
||||||
#include <QWidget>
|
|
||||||
#include <unordered_map>
|
|
||||||
|
|
||||||
namespace advss {
|
|
||||||
|
|
||||||
void RegisterHotkeyFunction(QWidget *widget, Qt::Key key,
|
|
||||||
std::function<void()> func)
|
|
||||||
{
|
|
||||||
ResourceTabHotkeyHandler::Instance()->RegisterHandler(widget, key,
|
|
||||||
func);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DeregisterHotkeyFunctions(QWidget *widget)
|
|
||||||
{
|
|
||||||
ResourceTabHotkeyHandler::Instance()->Deregister(widget);
|
|
||||||
}
|
|
||||||
|
|
||||||
ResourceTabHotkeyHandler *ResourceTabHotkeyHandler::Instance()
|
|
||||||
{
|
|
||||||
static ResourceTabHotkeyHandler handler;
|
|
||||||
return &handler;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ResourceTabHotkeyHandler::RegisterHandler(QWidget *widget, Qt::Key key,
|
|
||||||
std::function<void()> func)
|
|
||||||
{
|
|
||||||
std::lock_guard<std::mutex> lock(_mutex);
|
|
||||||
_callbacks.emplace(widget, CallbackData{key, func});
|
|
||||||
widget->installEventFilter(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ResourceTabHotkeyHandler::Deregister(QWidget *widget)
|
|
||||||
{
|
|
||||||
std::lock_guard<std::mutex> lock(_mutex);
|
|
||||||
_callbacks.erase(widget);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ResourceTabHotkeyHandler::eventFilter(QObject *obj, QEvent *event)
|
|
||||||
{
|
|
||||||
if (event->type() != QEvent::KeyPress) {
|
|
||||||
return QObject::eventFilter(obj, event);
|
|
||||||
}
|
|
||||||
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
|
|
||||||
auto pressedKey = keyEvent->key();
|
|
||||||
|
|
||||||
std::lock_guard<std::mutex> lock(_mutex);
|
|
||||||
auto it = _callbacks.find(obj);
|
|
||||||
if (it == _callbacks.end()) {
|
|
||||||
return QObject::eventFilter(obj, event);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto current = it;
|
|
||||||
while (current != _callbacks.end() && current->first == it->first) {
|
|
||||||
auto &[_, cbData] = *current;
|
|
||||||
if (pressedKey != cbData.key) {
|
|
||||||
++current;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
cbData.func();
|
|
||||||
++current;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
return QObject::eventFilter(obj, event);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace advss
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include "export-symbol-helper.hpp"
|
|
||||||
|
|
||||||
#include <map>
|
|
||||||
#include <mutex>
|
|
||||||
#include <QEvent>
|
|
||||||
#include <QObject>
|
|
||||||
|
|
||||||
namespace advss {
|
|
||||||
|
|
||||||
EXPORT void RegisterHotkeyFunction(QWidget *, Qt::Key,
|
|
||||||
std::function<void()> func);
|
|
||||||
EXPORT void DeregisterHotkeyFunctions(QWidget *);
|
|
||||||
|
|
||||||
class ResourceTabHotkeyHandler : public QObject {
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
static ResourceTabHotkeyHandler *Instance();
|
|
||||||
void RegisterHandler(QWidget *, Qt::Key, std::function<void()> func);
|
|
||||||
void Deregister(QWidget *);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
bool eventFilter(QObject *obj, QEvent *event) override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
struct CallbackData {
|
|
||||||
Qt::Key key;
|
|
||||||
std::function<void()> func;
|
|
||||||
};
|
|
||||||
|
|
||||||
ResourceTabHotkeyHandler() : QObject(){};
|
|
||||||
|
|
||||||
std::multimap<QObject *, CallbackData> _callbacks;
|
|
||||||
std::mutex _mutex;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace advss
|
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
#include "resource-table.hpp"
|
#include "resource-table.hpp"
|
||||||
#include "plugin-state-helpers.hpp"
|
#include "plugin-state-helpers.hpp"
|
||||||
#include "resource-table-hotkey-handler.hpp"
|
|
||||||
#include "ui-helpers.hpp"
|
#include "ui-helpers.hpp"
|
||||||
|
|
||||||
#include <QGridLayout>
|
#include <QGridLayout>
|
||||||
#include <QHeaderView>
|
#include <QHeaderView>
|
||||||
|
#include <QShortcut>
|
||||||
|
|
||||||
namespace advss {
|
namespace advss {
|
||||||
|
|
||||||
@@ -64,13 +64,16 @@ ResourceTable::ResourceTable(QTabWidget *parent, const QString &help,
|
|||||||
QWidget::connect(_table, &QTableWidget::cellDoubleClicked,
|
QWidget::connect(_table, &QTableWidget::cellDoubleClicked,
|
||||||
[openSettings]() { openSettings(); });
|
[openSettings]() { openSettings(); });
|
||||||
|
|
||||||
RegisterHotkeyFunction(this, Qt::Key_F2, openSettings);
|
auto settingsShortcut = new QShortcut(QKeySequence("F2"), this);
|
||||||
RegisterHotkeyFunction(this, Qt::Key_Delete, [this]() { Remove(); });
|
QWidget::connect(settingsShortcut, &QShortcut::activated, this,
|
||||||
}
|
openSettings);
|
||||||
|
auto removeShortcut = new QShortcut(QKeySequence("Del"), this);
|
||||||
|
QWidget::connect(removeShortcut, &QShortcut::activated, this,
|
||||||
|
[this]() { Remove(); });
|
||||||
|
|
||||||
ResourceTable::~ResourceTable()
|
auto newShortcut = new QShortcut(QKeySequence("Ctrl+N"), this);
|
||||||
{
|
QWidget::connect(newShortcut, &QShortcut::activated, this,
|
||||||
DeregisterHotkeyFunctions(this);
|
[this]() { Add(); });
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResourceTable::SetHelpVisible(bool visible) const
|
void ResourceTable::SetHelpVisible(bool visible) const
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ public:
|
|||||||
const QString &addToolTip, const QString &removeToolTip,
|
const QString &addToolTip, const QString &removeToolTip,
|
||||||
const QStringList &headers,
|
const QStringList &headers,
|
||||||
const std::function<void()> &openSettings);
|
const std::function<void()> &openSettings);
|
||||||
virtual ~ResourceTable();
|
|
||||||
|
|
||||||
QTableWidget *Table() const { return _table; }
|
QTableWidget *Table() const { return _table; }
|
||||||
void SetHelpVisible(bool) const;
|
void SetHelpVisible(bool) const;
|
||||||
|
|||||||
@@ -409,6 +409,13 @@ void SceneSelectionWidget::SetScene(const SceneSelection &s)
|
|||||||
_currentSelection = s;
|
_currentSelection = s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SceneSelectionWidget::showEvent(QShowEvent *event)
|
||||||
|
{
|
||||||
|
FilterComboBox::showEvent(event);
|
||||||
|
const QSignalBlocker b(this);
|
||||||
|
Reset();
|
||||||
|
}
|
||||||
|
|
||||||
bool SceneSelectionWidget::IsCurrentSceneSelected(const QString &name)
|
bool SceneSelectionWidget::IsCurrentSceneSelected(const QString &name)
|
||||||
{
|
{
|
||||||
return name == QString::fromStdString((obs_module_text(
|
return name == QString::fromStdString((obs_module_text(
|
||||||
@@ -435,9 +442,8 @@ void SceneSelectionWidget::SelectionChanged(int)
|
|||||||
|
|
||||||
void SceneSelectionWidget::ItemAdd(const QString &)
|
void SceneSelectionWidget::ItemAdd(const QString &)
|
||||||
{
|
{
|
||||||
blockSignals(true);
|
const QSignalBlocker b(this);
|
||||||
Reset();
|
Reset();
|
||||||
blockSignals(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SceneSelectionWidget::NameUsed(const QString &name)
|
bool SceneSelectionWidget::NameUsed(const QString &name)
|
||||||
@@ -462,9 +468,8 @@ void SceneSelectionWidget::ItemRemove(const QString &name)
|
|||||||
|
|
||||||
void SceneSelectionWidget::ItemRename(const QString &, const QString &)
|
void SceneSelectionWidget::ItemRename(const QString &, const QString &)
|
||||||
{
|
{
|
||||||
blockSignals(true);
|
const QSignalBlocker b(this);
|
||||||
Reset();
|
Reset();
|
||||||
blockSignals(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace advss
|
} // namespace advss
|
||||||
|
|||||||
@@ -45,6 +45,10 @@ public:
|
|||||||
bool previous = false, bool current = false,
|
bool previous = false, bool current = false,
|
||||||
bool preview = false);
|
bool preview = false);
|
||||||
EXPORT void SetScene(const SceneSelection &);
|
EXPORT void SetScene(const SceneSelection &);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void showEvent(QShowEvent *event) override;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void SceneChanged(const SceneSelection &);
|
void SceneChanged(const SceneSelection &);
|
||||||
|
|
||||||
|
|||||||
@@ -47,6 +47,12 @@ void Section::Collapse(bool collapse)
|
|||||||
_toggleButton->setChecked(collapse);
|
_toggleButton->setChecked(collapse);
|
||||||
_toggleButton->setArrowType(collapse ? Qt::ArrowType::RightArrow
|
_toggleButton->setArrowType(collapse ? Qt::ArrowType::RightArrow
|
||||||
: Qt::ArrowType::DownArrow);
|
: Qt::ArrowType::DownArrow);
|
||||||
|
if (!_toggleAnimation) {
|
||||||
|
_collapsed = collapse;
|
||||||
|
emit Collapsed(collapse);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
_toggleAnimation->setDirection(collapse ? QAbstractAnimation::Backward
|
_toggleAnimation->setDirection(collapse ? QAbstractAnimation::Backward
|
||||||
: QAbstractAnimation::Forward);
|
: QAbstractAnimation::Forward);
|
||||||
_transitioning = true;
|
_transitioning = true;
|
||||||
|
|||||||
@@ -164,7 +164,7 @@ void SourceSelectionWidget::PopulateSelection()
|
|||||||
}
|
}
|
||||||
_variablesEndIdx = count();
|
_variablesEndIdx = count();
|
||||||
|
|
||||||
AddSelectionGroup(this, _sourceNames);
|
AddSelectionGroup(this, _populateSourcesCallback());
|
||||||
_sourcesEndIdx = count();
|
_sourcesEndIdx = count();
|
||||||
|
|
||||||
// Remove last separator
|
// Remove last separator
|
||||||
@@ -172,13 +172,13 @@ void SourceSelectionWidget::PopulateSelection()
|
|||||||
setCurrentIndex(-1);
|
setCurrentIndex(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
SourceSelectionWidget::SourceSelectionWidget(QWidget *parent,
|
SourceSelectionWidget::SourceSelectionWidget(
|
||||||
const QStringList &sourceNames,
|
QWidget *parent, const std::function<QStringList()> &populate,
|
||||||
bool addVariables)
|
bool addVariables)
|
||||||
: FilterComboBox(parent,
|
: FilterComboBox(parent,
|
||||||
obs_module_text("AdvSceneSwitcher.selectSource")),
|
obs_module_text("AdvSceneSwitcher.selectSource")),
|
||||||
_addVariables(addVariables),
|
_addVariables(addVariables),
|
||||||
_sourceNames(sourceNames)
|
_populateSourcesCallback(populate)
|
||||||
{
|
{
|
||||||
setDuplicatesEnabled(true);
|
setDuplicatesEnabled(true);
|
||||||
PopulateSelection();
|
PopulateSelection();
|
||||||
@@ -200,6 +200,11 @@ SourceSelectionWidget::SourceSelectionWidget(QWidget *parent,
|
|||||||
|
|
||||||
void SourceSelectionWidget::SetSource(const SourceSelection &s)
|
void SourceSelectionWidget::SetSource(const SourceSelection &s)
|
||||||
{
|
{
|
||||||
|
{
|
||||||
|
const QSignalBlocker b(this);
|
||||||
|
PopulateSelection();
|
||||||
|
}
|
||||||
|
|
||||||
int idx = -1;
|
int idx = -1;
|
||||||
|
|
||||||
switch (s.GetType()) {
|
switch (s.GetType()) {
|
||||||
@@ -229,23 +234,23 @@ void SourceSelectionWidget::SetSource(const SourceSelection &s)
|
|||||||
_currentSelection = s;
|
_currentSelection = s;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SourceSelectionWidget::SetSourceNameList(const QStringList &list)
|
|
||||||
{
|
|
||||||
_sourceNames = list;
|
|
||||||
Reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
void SourceSelectionWidget::SelectionChanged(int)
|
void SourceSelectionWidget::SelectionChanged(int)
|
||||||
{
|
{
|
||||||
_currentSelection = CurrentSelection();
|
_currentSelection = CurrentSelection();
|
||||||
emit SourceChanged(_currentSelection);
|
emit SourceChanged(_currentSelection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SourceSelectionWidget::showEvent(QShowEvent *event)
|
||||||
|
{
|
||||||
|
FilterComboBox::showEvent(event);
|
||||||
|
const QSignalBlocker b(this);
|
||||||
|
Reset();
|
||||||
|
}
|
||||||
|
|
||||||
void SourceSelectionWidget::ItemAdd(const QString &)
|
void SourceSelectionWidget::ItemAdd(const QString &)
|
||||||
{
|
{
|
||||||
blockSignals(true);
|
const QSignalBlocker b(this);
|
||||||
Reset();
|
Reset();
|
||||||
blockSignals(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SourceSelectionWidget::NameUsed(const QString &name)
|
bool SourceSelectionWidget::NameUsed(const QString &name)
|
||||||
@@ -265,9 +270,8 @@ void SourceSelectionWidget::ItemRemove(const QString &name)
|
|||||||
|
|
||||||
void SourceSelectionWidget::ItemRename(const QString &, const QString &)
|
void SourceSelectionWidget::ItemRename(const QString &, const QString &)
|
||||||
{
|
{
|
||||||
blockSignals(true);
|
const QSignalBlocker b(this);
|
||||||
Reset();
|
Reset();
|
||||||
blockSignals(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace advss
|
} // namespace advss
|
||||||
|
|||||||
@@ -39,13 +39,16 @@ class ADVSS_EXPORT SourceSelectionWidget : public FilterComboBox {
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SourceSelectionWidget(QWidget *parent, const QStringList &sourceNames,
|
SourceSelectionWidget(QWidget *parent,
|
||||||
|
const std::function<QStringList()> &populate,
|
||||||
bool addVariables = true);
|
bool addVariables = true);
|
||||||
void SetSource(const SourceSelection &);
|
void SetSource(const SourceSelection &);
|
||||||
void SetSourceNameList(const QStringList &);
|
|
||||||
signals:
|
signals:
|
||||||
void SourceChanged(const SourceSelection &);
|
void SourceChanged(const SourceSelection &);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void showEvent(QShowEvent *event) override;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void SelectionChanged(int);
|
void SelectionChanged(int);
|
||||||
void ItemAdd(const QString &name);
|
void ItemAdd(const QString &name);
|
||||||
@@ -59,7 +62,7 @@ private:
|
|||||||
bool NameUsed(const QString &name);
|
bool NameUsed(const QString &name);
|
||||||
|
|
||||||
bool _addVariables;
|
bool _addVariables;
|
||||||
QStringList _sourceNames;
|
std::function<QStringList()> _populateSourcesCallback;
|
||||||
SourceSelection _currentSelection;
|
SourceSelection _currentSelection;
|
||||||
|
|
||||||
// Order of entries
|
// Order of entries
|
||||||
|
|||||||
@@ -274,8 +274,9 @@ TempVariableSelection::TempVariableSelection(QWidget *parent)
|
|||||||
SLOT(HighlightChanged(int)));
|
SLOT(HighlightChanged(int)));
|
||||||
QWidget::connect(window(), SIGNAL(MacroSegmentOrderChanged()), this,
|
QWidget::connect(window(), SIGNAL(MacroSegmentOrderChanged()), this,
|
||||||
SLOT(MacroSegmentsChanged()));
|
SLOT(MacroSegmentsChanged()));
|
||||||
QWidget::connect(window(), SIGNAL(SegmentTempVarsChanged()), this,
|
QWidget::connect(window(),
|
||||||
SLOT(SegmentTempVarsChanged()));
|
SIGNAL(SegmentTempVarsChanged(MacroSegment *)), this,
|
||||||
|
SLOT(SegmentTempVarsChanged(MacroSegment *)));
|
||||||
|
|
||||||
auto layout = new QHBoxLayout();
|
auto layout = new QHBoxLayout();
|
||||||
layout->setContentsMargins(0, 0, 0, 0);
|
layout->setContentsMargins(0, 0, 0, 0);
|
||||||
@@ -314,9 +315,15 @@ void TempVariableSelection::MacroSegmentsChanged()
|
|||||||
SetVariable(currentSelection);
|
SetVariable(currentSelection);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TempVariableSelection::SegmentTempVarsChanged()
|
void TempVariableSelection::SegmentTempVarsChanged(MacroSegment *segment)
|
||||||
{
|
{
|
||||||
MacroSegmentsChanged();
|
const auto currentSegment = GetSegment();
|
||||||
|
const auto currentMacro = currentSegment ? currentSegment->GetMacro()
|
||||||
|
: nullptr;
|
||||||
|
const auto changeMacro = segment ? segment->GetMacro() : nullptr;
|
||||||
|
if (currentMacro == changeMacro) {
|
||||||
|
MacroSegmentsChanged();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TempVariableSelection::HighlightChanged(int idx)
|
void TempVariableSelection::HighlightChanged(int idx)
|
||||||
@@ -427,13 +434,11 @@ QString TempVariableSelection::SetupInfoLabel()
|
|||||||
MacroSegment *TempVariableSelection::GetSegment() const
|
MacroSegment *TempVariableSelection::GetSegment() const
|
||||||
{
|
{
|
||||||
const QWidget *widget = this;
|
const QWidget *widget = this;
|
||||||
{
|
while (widget) {
|
||||||
while (widget) {
|
if (qobject_cast<const MacroSegmentEdit *>(widget)) {
|
||||||
if (qobject_cast<const MacroSegmentEdit *>(widget)) {
|
break;
|
||||||
break;
|
|
||||||
}
|
|
||||||
widget = widget->parentWidget();
|
|
||||||
}
|
}
|
||||||
|
widget = widget->parentWidget();
|
||||||
}
|
}
|
||||||
if (!widget) {
|
if (!widget) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
@@ -442,17 +447,18 @@ MacroSegment *TempVariableSelection::GetSegment() const
|
|||||||
return segmentWidget->Data().get();
|
return segmentWidget->Data().get();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NotifyUIAboutTempVarChange()
|
void NotifyUIAboutTempVarChange(MacroSegment *segment)
|
||||||
{
|
{
|
||||||
obs_queue_task(
|
obs_queue_task(
|
||||||
OBS_TASK_UI,
|
OBS_TASK_UI,
|
||||||
[](void *) {
|
[](void *segment) {
|
||||||
if (!SettingsWindowIsOpened()) {
|
if (!SettingsWindowIsOpened()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
AdvSceneSwitcher::window->SegmentTempVarsChanged();
|
AdvSceneSwitcher::window->SegmentTempVarsChanged(
|
||||||
|
(MacroSegment *)segment);
|
||||||
},
|
},
|
||||||
nullptr, false);
|
segment, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace advss
|
} // namespace advss
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ public:
|
|||||||
private slots:
|
private slots:
|
||||||
void SelectionIdxChanged(int);
|
void SelectionIdxChanged(int);
|
||||||
void MacroSegmentsChanged();
|
void MacroSegmentsChanged();
|
||||||
void SegmentTempVarsChanged();
|
void SegmentTempVarsChanged(MacroSegment *);
|
||||||
void HighlightChanged(int);
|
void HighlightChanged(int);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
@@ -104,6 +104,6 @@ private:
|
|||||||
AutoUpdateTooltipLabel *_info;
|
AutoUpdateTooltipLabel *_info;
|
||||||
};
|
};
|
||||||
|
|
||||||
void NotifyUIAboutTempVarChange();
|
void NotifyUIAboutTempVarChange(MacroSegment *);
|
||||||
|
|
||||||
} // namespace advss
|
} // namespace advss
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
#include "utility.hpp"
|
#include "utility.hpp"
|
||||||
|
|
||||||
#include <nlohmann/json.hpp>
|
|
||||||
#include <QTextStream>
|
#include <QTextStream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
@@ -28,25 +27,6 @@ bool ReplaceAll(std::string &str, const std::string &from,
|
|||||||
return somethingWasReplaced;
|
return somethingWasReplaced;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::optional<std::string> GetJsonField(const std::string &jsonStr,
|
|
||||||
const std::string &fieldToExtract)
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
nlohmann::json json = nlohmann::json::parse(jsonStr);
|
|
||||||
auto it = json.find(fieldToExtract);
|
|
||||||
if (it == json.end()) {
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
if (it->is_string()) {
|
|
||||||
return it->get<std::string>();
|
|
||||||
}
|
|
||||||
return it->dump();
|
|
||||||
} catch (const nlohmann::json::exception &) {
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CompareIgnoringLineEnding(QString &s1, QString &s2)
|
bool CompareIgnoringLineEnding(QString &s1, QString &s2)
|
||||||
{
|
{
|
||||||
// Let QT deal with different types of lineendings
|
// Let QT deal with different types of lineendings
|
||||||
|
|||||||
@@ -15,8 +15,6 @@ EXPORT std::pair<int, int> GetCursorPos();
|
|||||||
|
|
||||||
bool ReplaceAll(std::string &str, const std::string &from,
|
bool ReplaceAll(std::string &str, const std::string &from,
|
||||||
const std::string &to);
|
const std::string &to);
|
||||||
EXPORT std::optional<std::string> GetJsonField(const std::string &json,
|
|
||||||
const std::string &id);
|
|
||||||
EXPORT bool CompareIgnoringLineEnding(QString &s1, QString &s2);
|
EXPORT bool CompareIgnoringLineEnding(QString &s1, QString &s2);
|
||||||
std::string ToString(double value);
|
std::string ToString(double value);
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
#include "websocket-api.hpp"
|
#include "websocket-api.hpp"
|
||||||
#include "log-helper.hpp"
|
|
||||||
#include "obs-websocket-api.h"
|
#include "obs-websocket-api.h"
|
||||||
#include "plugin-state-helpers.hpp"
|
#include "plugin-state-helpers.hpp"
|
||||||
|
|
||||||
|
// Must be after "obs-websocket-api.h" to avoid logging function conflict
|
||||||
|
#include "log-helper.hpp"
|
||||||
|
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
|
||||||
namespace advss {
|
namespace advss {
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ void StringVariable::operator=(const char *value)
|
|||||||
void StringVariable::Load(obs_data_t *obj, const char *name)
|
void StringVariable::Load(obs_data_t *obj, const char *name)
|
||||||
{
|
{
|
||||||
_value = obs_data_get_string(obj, name);
|
_value = obs_data_get_string(obj, name);
|
||||||
|
_lastResolve = {};
|
||||||
Resolve();
|
Resolve();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,15 +4,15 @@
|
|||||||
|
|
||||||
namespace advss {
|
namespace advss {
|
||||||
|
|
||||||
class VariableTextEdit : public ResizingPlainTextEdit {
|
class ADVSS_EXPORT VariableTextEdit : public ResizingPlainTextEdit {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
EXPORT VariableTextEdit(QWidget *parent, const int scrollAt = 10,
|
VariableTextEdit(QWidget *parent, const int scrollAt = 10,
|
||||||
const int minLines = 3,
|
const int minLines = 3, const int paddingLines = 2);
|
||||||
const int paddingLines = 2);
|
virtual ~VariableTextEdit(){};
|
||||||
EXPORT void setPlainText(const QString &);
|
void setPlainText(const QString &);
|
||||||
EXPORT void setPlainText(const StringVariable &);
|
void setPlainText(const StringVariable &);
|
||||||
EXPORT void setToolTip(const QString &string);
|
void setToolTip(const QString &string);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -30,7 +30,9 @@ install_advss_plugin_dependency(...)
|
|||||||
|
|
||||||
add_plugin(http)
|
add_plugin(http)
|
||||||
add_plugin(midi)
|
add_plugin(midi)
|
||||||
|
add_plugin(mqtt)
|
||||||
add_plugin(openvr)
|
add_plugin(openvr)
|
||||||
|
add_plugin(scripting)
|
||||||
add_plugin(stream-deck)
|
add_plugin(stream-deck)
|
||||||
add_plugin(twitch)
|
add_plugin(twitch)
|
||||||
add_plugin(usb)
|
add_plugin(usb)
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ target_sources(
|
|||||||
macro-action-log.hpp
|
macro-action-log.hpp
|
||||||
macro-action-media.cpp
|
macro-action-media.cpp
|
||||||
macro-action-media.hpp
|
macro-action-media.hpp
|
||||||
|
macro-action-obs-settings.cpp
|
||||||
|
macro-action-obs-settings.hpp
|
||||||
macro-action-osc.cpp
|
macro-action-osc.cpp
|
||||||
macro-action-osc.hpp
|
macro-action-osc.hpp
|
||||||
macro-action-plugin-state.cpp
|
macro-action-plugin-state.cpp
|
||||||
@@ -152,8 +154,6 @@ target_sources(
|
|||||||
utils/filter-selection.hpp
|
utils/filter-selection.hpp
|
||||||
utils/hotkey-helpers.cpp
|
utils/hotkey-helpers.cpp
|
||||||
utils/hotkey-helpers.hpp
|
utils/hotkey-helpers.hpp
|
||||||
utils/json-helpers.cpp
|
|
||||||
utils/json-helpers.hpp
|
|
||||||
utils/monitor-helpers.cpp
|
utils/monitor-helpers.cpp
|
||||||
utils/monitor-helpers.hpp
|
utils/monitor-helpers.hpp
|
||||||
utils/osc-helpers.cpp
|
utils/osc-helpers.cpp
|
||||||
@@ -183,7 +183,9 @@ target_sources(
|
|||||||
utils/websocket-helpers.cpp
|
utils/websocket-helpers.cpp
|
||||||
utils/websocket-helpers.hpp
|
utils/websocket-helpers.hpp
|
||||||
utils/websocket-tab.cpp
|
utils/websocket-tab.cpp
|
||||||
utils/websocket-tab.hpp)
|
utils/websocket-tab.hpp
|
||||||
|
utils/window-selection.cpp
|
||||||
|
utils/window-selection.hpp)
|
||||||
|
|
||||||
if(OS_WINDOWS)
|
if(OS_WINDOWS)
|
||||||
target_sources(${PROJECT_NAME} PRIVATE utils/windows/windows.cpp)
|
target_sources(${PROJECT_NAME} PRIVATE utils/windows/windows.cpp)
|
||||||
|
|||||||
@@ -421,10 +421,17 @@ static inline void populateFadeTypeSelection(QComboBox *list)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static QStringList getAudioSourcesList()
|
||||||
|
{
|
||||||
|
auto sources = GetAudioSourceNames();
|
||||||
|
sources.sort();
|
||||||
|
return sources;
|
||||||
|
}
|
||||||
|
|
||||||
MacroActionAudioEdit::MacroActionAudioEdit(
|
MacroActionAudioEdit::MacroActionAudioEdit(
|
||||||
QWidget *parent, std::shared_ptr<MacroActionAudio> entryData)
|
QWidget *parent, std::shared_ptr<MacroActionAudio> entryData)
|
||||||
: QWidget(parent),
|
: QWidget(parent),
|
||||||
_sources(new SourceSelectionWidget(this, QStringList(), true)),
|
_sources(new SourceSelectionWidget(this, getAudioSourcesList, true)),
|
||||||
_actions(new QComboBox),
|
_actions(new QComboBox),
|
||||||
_fadeTypes(new QComboBox),
|
_fadeTypes(new QComboBox),
|
||||||
_syncOffset(new VariableSpinBox),
|
_syncOffset(new VariableSpinBox),
|
||||||
@@ -468,9 +475,6 @@ MacroActionAudioEdit::MacroActionAudioEdit(
|
|||||||
_rate->setSuffix("%");
|
_rate->setSuffix("%");
|
||||||
|
|
||||||
populateActionSelection(_actions);
|
populateActionSelection(_actions);
|
||||||
auto sources = GetAudioSourceNames();
|
|
||||||
sources.sort();
|
|
||||||
_sources->SetSourceNameList(sources);
|
|
||||||
populateFadeTypeSelection(_fadeTypes);
|
populateFadeTypeSelection(_fadeTypes);
|
||||||
PopulateMonitorTypeSelection(_monitorTypes);
|
PopulateMonitorTypeSelection(_monitorTypes);
|
||||||
|
|
||||||
@@ -518,7 +522,7 @@ MacroActionAudioEdit::MacroActionAudioEdit(
|
|||||||
QWidget::connect(_fadeTypes, SIGNAL(currentIndexChanged(int)), this,
|
QWidget::connect(_fadeTypes, SIGNAL(currentIndexChanged(int)), this,
|
||||||
SLOT(FadeTypeChanged(int)));
|
SLOT(FadeTypeChanged(int)));
|
||||||
|
|
||||||
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
|
const std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
|
||||||
{"{{audioSources}}", _sources},
|
{"{{audioSources}}", _sources},
|
||||||
{"{{actions}}", _actions},
|
{"{{actions}}", _actions},
|
||||||
{"{{syncOffset}}", _syncOffset},
|
{"{{syncOffset}}", _syncOffset},
|
||||||
|
|||||||
@@ -185,8 +185,8 @@ void MacroActionFilter::ResolveVariablesToFixedValues()
|
|||||||
|
|
||||||
static inline void populateActionSelection(QComboBox *list)
|
static inline void populateActionSelection(QComboBox *list)
|
||||||
{
|
{
|
||||||
for (auto entry : actionTypes) {
|
for (const auto &[_, name] : actionTypes) {
|
||||||
list->addItem(obs_module_text(entry.second.c_str()));
|
list->addItem(obs_module_text(name.c_str()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -199,10 +199,17 @@ static inline void populateSettingsInputMethods(QComboBox *list)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static QStringList getFilterSourcesList()
|
||||||
|
{
|
||||||
|
auto sources = GetSourcesWithFilterNames();
|
||||||
|
sources.sort();
|
||||||
|
return sources;
|
||||||
|
}
|
||||||
|
|
||||||
MacroActionFilterEdit::MacroActionFilterEdit(
|
MacroActionFilterEdit::MacroActionFilterEdit(
|
||||||
QWidget *parent, std::shared_ptr<MacroActionFilter> entryData)
|
QWidget *parent, std::shared_ptr<MacroActionFilter> entryData)
|
||||||
: QWidget(parent),
|
: QWidget(parent),
|
||||||
_sources(new SourceSelectionWidget(this, QStringList(), true)),
|
_sources(new SourceSelectionWidget(this, getFilterSourcesList, true)),
|
||||||
_filters(new FilterSelectionWidget(this, _sources, true)),
|
_filters(new FilterSelectionWidget(this, _sources, true)),
|
||||||
_actions(new QComboBox()),
|
_actions(new QComboBox()),
|
||||||
_getSettings(new QPushButton(obs_module_text(
|
_getSettings(new QPushButton(obs_module_text(
|
||||||
@@ -220,9 +227,6 @@ MacroActionFilterEdit::MacroActionFilterEdit(
|
|||||||
_filters->setSizeAdjustPolicy(QComboBox::AdjustToContents);
|
_filters->setSizeAdjustPolicy(QComboBox::AdjustToContents);
|
||||||
|
|
||||||
populateActionSelection(_actions);
|
populateActionSelection(_actions);
|
||||||
auto sources = GetSourcesWithFilterNames();
|
|
||||||
sources.sort();
|
|
||||||
_sources->SetSourceNameList(sources);
|
|
||||||
_refreshSettingSelection->setToolTip(obs_module_text(
|
_refreshSettingSelection->setToolTip(obs_module_text(
|
||||||
"AdvSceneSwitcher.action.filter.refresh.tooltip"));
|
"AdvSceneSwitcher.action.filter.refresh.tooltip"));
|
||||||
|
|
||||||
|
|||||||
@@ -219,6 +219,13 @@ static inline void populateSelectionTypeSelection(QComboBox *list)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static QStringList getMediaSourcesList()
|
||||||
|
{
|
||||||
|
auto sources = GetMediaSourceNames();
|
||||||
|
sources.sort();
|
||||||
|
return sources;
|
||||||
|
}
|
||||||
|
|
||||||
MacroActionMediaEdit::MacroActionMediaEdit(
|
MacroActionMediaEdit::MacroActionMediaEdit(
|
||||||
QWidget *parent, std::shared_ptr<MacroActionMedia> entryData)
|
QWidget *parent, std::shared_ptr<MacroActionMedia> entryData)
|
||||||
: QWidget(parent),
|
: QWidget(parent),
|
||||||
@@ -229,15 +236,12 @@ MacroActionMediaEdit::MacroActionMediaEdit(
|
|||||||
0, 100,
|
0, 100,
|
||||||
obs_module_text(
|
obs_module_text(
|
||||||
"AdvSceneSwitcher.action.media.seek.percentage.label"))),
|
"AdvSceneSwitcher.action.media.seek.percentage.label"))),
|
||||||
_sources(new SourceSelectionWidget(this, QStringList(), true)),
|
_sources(new SourceSelectionWidget(this, getMediaSourcesList, true)),
|
||||||
_sceneItems(new SceneItemSelectionWidget(parent, false)),
|
_sceneItems(new SceneItemSelectionWidget(parent, false)),
|
||||||
_scenes(new SceneSelectionWidget(this, true, false, true, true, true))
|
_scenes(new SceneSelectionWidget(this, true, false, true, true, true))
|
||||||
{
|
{
|
||||||
populateActionSelection(_actions);
|
populateActionSelection(_actions);
|
||||||
populateSelectionTypeSelection(_selectionTypes);
|
populateSelectionTypeSelection(_selectionTypes);
|
||||||
auto sources = GetMediaSourceNames();
|
|
||||||
sources.sort();
|
|
||||||
_sources->SetSourceNameList(sources);
|
|
||||||
|
|
||||||
QWidget::connect(_actions, SIGNAL(currentIndexChanged(int)), this,
|
QWidget::connect(_actions, SIGNAL(currentIndexChanged(int)), this,
|
||||||
SLOT(ActionChanged(int)));
|
SLOT(ActionChanged(int)));
|
||||||
|
|||||||
387
plugins/base/macro-action-obs-settings.cpp
Normal file
387
plugins/base/macro-action-obs-settings.cpp
Normal file
@@ -0,0 +1,387 @@
|
|||||||
|
#include "macro-action-obs-settings.hpp"
|
||||||
|
#include "layout-helpers.hpp"
|
||||||
|
#include "profile-helpers.hpp"
|
||||||
|
#include "ui-helpers.hpp"
|
||||||
|
|
||||||
|
#include <obs-frontend-api.h>
|
||||||
|
#include <util/config-file.h>
|
||||||
|
|
||||||
|
namespace advss {
|
||||||
|
|
||||||
|
const std::string MacroActionOBSSettings::id = "obs_settings";
|
||||||
|
|
||||||
|
bool MacroActionOBSSettings::_registered = MacroActionFactory::Register(
|
||||||
|
MacroActionOBSSettings::id,
|
||||||
|
{MacroActionOBSSettings::Create, MacroActionOBSSettingsEdit::Create,
|
||||||
|
"AdvSceneSwitcher.action.obsSetting"});
|
||||||
|
|
||||||
|
const static std::map<MacroActionOBSSettings::Action, std::string> actionTypes = {
|
||||||
|
{MacroActionOBSSettings::Action::FPS_TYPE,
|
||||||
|
"AdvSceneSwitcher.action.obsSetting.action.setFPSType"},
|
||||||
|
{MacroActionOBSSettings::Action::FPS_COMMON_VALUE,
|
||||||
|
"AdvSceneSwitcher.action.obsSetting.action.setFPSCommonValue"},
|
||||||
|
{MacroActionOBSSettings::Action::FPS_INT_VALUE,
|
||||||
|
"AdvSceneSwitcher.action.obsSetting.action.setFPSIntegerValue"},
|
||||||
|
{MacroActionOBSSettings::Action::FPS_NUM_VALUE,
|
||||||
|
"AdvSceneSwitcher.action.obsSetting.action.setFPSFractionNumeratorValue"},
|
||||||
|
{MacroActionOBSSettings::Action::FPS_DEN_VALUE,
|
||||||
|
"AdvSceneSwitcher.action.obsSetting.action.setFPSFractionDenominatorValue"},
|
||||||
|
{MacroActionOBSSettings::Action::BASE_CANVAS_X_VALUE,
|
||||||
|
"AdvSceneSwitcher.action.obsSetting.action.setBaseCanvasX"},
|
||||||
|
{MacroActionOBSSettings::Action::BASE_CANVAS_Y_VALUE,
|
||||||
|
"AdvSceneSwitcher.action.obsSetting.action.setBaseCanvasY"},
|
||||||
|
{MacroActionOBSSettings::Action::OUTPUT_X_VALUE,
|
||||||
|
"AdvSceneSwitcher.action.obsSetting.action.setOutputCanvasX"},
|
||||||
|
{MacroActionOBSSettings::Action::OUTPUT_Y_VALUE,
|
||||||
|
"AdvSceneSwitcher.action.obsSetting.action.setOutputCanvasY"},
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename Func, typename... Args>
|
||||||
|
static void setConfigValueHelper(Func func, Args... args)
|
||||||
|
{
|
||||||
|
auto config = obs_frontend_get_profile_config();
|
||||||
|
func(config, args...);
|
||||||
|
if (config_save(config) != CONFIG_SUCCESS) {
|
||||||
|
blog(LOG_WARNING, "failed to save config!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Func, typename... Args>
|
||||||
|
static auto getConfigValueHelper(Func func, Func defaultFunc, Args... args)
|
||||||
|
-> std::optional<std::invoke_result_t<Func, config_t *, Args...>>
|
||||||
|
{
|
||||||
|
using Ret = std::invoke_result_t<Func, config_t *, Args...>;
|
||||||
|
|
||||||
|
auto config = obs_frontend_get_profile_config();
|
||||||
|
if (config_has_user_value(config, args...)) {
|
||||||
|
return func(config, args...);
|
||||||
|
}
|
||||||
|
if (config_has_default_value(config, args...)) {
|
||||||
|
return defaultFunc(config, args...);
|
||||||
|
}
|
||||||
|
return std::optional<Ret>{};
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MacroActionOBSSettings::PerformAction()
|
||||||
|
{
|
||||||
|
switch (_action) {
|
||||||
|
case Action::FPS_TYPE:
|
||||||
|
setConfigValueHelper(config_set_uint, "Video", "FPSType",
|
||||||
|
static_cast<int>(_fpsType));
|
||||||
|
obs_frontend_reset_video();
|
||||||
|
break;
|
||||||
|
case Action::FPS_COMMON_VALUE:
|
||||||
|
setConfigValueHelper(config_set_string, "Video", "FPSCommon",
|
||||||
|
_fpsStringValue.c_str());
|
||||||
|
obs_frontend_reset_video();
|
||||||
|
break;
|
||||||
|
case Action::FPS_INT_VALUE:
|
||||||
|
setConfigValueHelper(config_set_uint, "Video", "FPSInt",
|
||||||
|
static_cast<int>(_fpsIntValue));
|
||||||
|
obs_frontend_reset_video();
|
||||||
|
break;
|
||||||
|
case Action::FPS_NUM_VALUE:
|
||||||
|
setConfigValueHelper(config_set_uint, "Video", "FPSNum",
|
||||||
|
static_cast<int>(_fpsIntValue));
|
||||||
|
obs_frontend_reset_video();
|
||||||
|
break;
|
||||||
|
case Action::FPS_DEN_VALUE:
|
||||||
|
setConfigValueHelper(config_set_uint, "Video", "FPSDen",
|
||||||
|
static_cast<int>(_fpsIntValue));
|
||||||
|
obs_frontend_reset_video();
|
||||||
|
break;
|
||||||
|
case Action::BASE_CANVAS_X_VALUE:
|
||||||
|
setConfigValueHelper(config_set_uint, "Video", "BaseCX",
|
||||||
|
static_cast<int>(_canvasSizeValue));
|
||||||
|
obs_frontend_reset_video();
|
||||||
|
break;
|
||||||
|
case Action::BASE_CANVAS_Y_VALUE:
|
||||||
|
setConfigValueHelper(config_set_uint, "Video", "BaseCY",
|
||||||
|
static_cast<int>(_canvasSizeValue));
|
||||||
|
obs_frontend_reset_video();
|
||||||
|
break;
|
||||||
|
case Action::OUTPUT_X_VALUE:
|
||||||
|
setConfigValueHelper(config_set_uint, "Video", "OutputCX",
|
||||||
|
static_cast<int>(_canvasSizeValue));
|
||||||
|
obs_frontend_reset_video();
|
||||||
|
break;
|
||||||
|
case Action::OUTPUT_Y_VALUE:
|
||||||
|
setConfigValueHelper(config_set_uint, "Video", "OutputCY",
|
||||||
|
static_cast<int>(_canvasSizeValue));
|
||||||
|
obs_frontend_reset_video();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MacroActionOBSSettings::LogAction() const
|
||||||
|
{
|
||||||
|
auto it = actionTypes.find(_action);
|
||||||
|
if (it != actionTypes.end()) {
|
||||||
|
ablog(LOG_INFO, "performed action \"%s\"", it->second.c_str());
|
||||||
|
} else {
|
||||||
|
blog(LOG_WARNING, "ignored unknown obs setting action %d",
|
||||||
|
static_cast<int>(_action));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MacroActionOBSSettings::Save(obs_data_t *obj) const
|
||||||
|
{
|
||||||
|
MacroAction::Save(obj);
|
||||||
|
obs_data_set_int(obj, "action", static_cast<int>(_action));
|
||||||
|
_fpsIntValue.Save(obj, "fpsIntValue");
|
||||||
|
_fpsStringValue.Save(obj, "fpsStringValue");
|
||||||
|
_canvasSizeValue.Save(obj, "canvasSizeValue");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MacroActionOBSSettings::Load(obs_data_t *obj)
|
||||||
|
{
|
||||||
|
MacroAction::Load(obj);
|
||||||
|
_action = static_cast<Action>(obs_data_get_int(obj, "action"));
|
||||||
|
_fpsIntValue.Load(obj, "fpsIntValue");
|
||||||
|
_fpsStringValue.Load(obj, "fpsStringValue");
|
||||||
|
_canvasSizeValue.Load(obj, "canvasSizeValue");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<MacroAction> MacroActionOBSSettings::Create(Macro *m)
|
||||||
|
{
|
||||||
|
return std::make_shared<MacroActionOBSSettings>(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<MacroAction> MacroActionOBSSettings::Copy() const
|
||||||
|
{
|
||||||
|
return std::make_shared<MacroActionOBSSettings>(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MacroActionOBSSettings::ResolveVariablesToFixedValues()
|
||||||
|
{
|
||||||
|
_fpsIntValue.ResolveVariables();
|
||||||
|
_canvasSizeValue.ResolveVariables();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void populateActionSelection(QComboBox *list)
|
||||||
|
{
|
||||||
|
for (const auto &[value, name] : actionTypes) {
|
||||||
|
list->addItem(obs_module_text(name.c_str()),
|
||||||
|
static_cast<int>(value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void populateFPSTypeSelection(QComboBox *list)
|
||||||
|
{
|
||||||
|
static const std::map<MacroActionOBSSettings::FPSType, std::string>
|
||||||
|
types = {
|
||||||
|
{MacroActionOBSSettings::FPSType::COMMON,
|
||||||
|
"Basic.Settings.Video.FPSCommon"},
|
||||||
|
{MacroActionOBSSettings::FPSType::INTEGER,
|
||||||
|
"Basic.Settings.Video.FPSInteger"},
|
||||||
|
{MacroActionOBSSettings::FPSType::FRACTION,
|
||||||
|
"Basic.Settings.Video.FPSFraction"},
|
||||||
|
};
|
||||||
|
|
||||||
|
for (const auto &[value, name] : types) {
|
||||||
|
list->addItem(obs_module_text(name.c_str()),
|
||||||
|
static_cast<int>(value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MacroActionOBSSettingsEdit::MacroActionOBSSettingsEdit(
|
||||||
|
QWidget *parent, std::shared_ptr<MacroActionOBSSettings> entryData)
|
||||||
|
: QWidget(parent),
|
||||||
|
_actions(new QComboBox(this)),
|
||||||
|
_fpsType(new QComboBox(this)),
|
||||||
|
_fpsIntValue(new VariableSpinBox(this)),
|
||||||
|
_fpsStringValue(new VariableLineEdit(this)),
|
||||||
|
_canvasSizeValue(new VariableSpinBox(this)),
|
||||||
|
_getCurrentValue(new QPushButton(obs_module_text(
|
||||||
|
"AdvSceneSwitcher.action.obsSetting.getCurrentValue")))
|
||||||
|
{
|
||||||
|
populateActionSelection(_actions);
|
||||||
|
populateFPSTypeSelection(_fpsType);
|
||||||
|
|
||||||
|
_fpsIntValue->setMaximum(1000);
|
||||||
|
_canvasSizeValue->setMaximum(100000);
|
||||||
|
|
||||||
|
QWidget::connect(_actions, SIGNAL(currentIndexChanged(int)), this,
|
||||||
|
SLOT(ActionChanged(int)));
|
||||||
|
QWidget::connect(_fpsType, SIGNAL(currentIndexChanged(int)), this,
|
||||||
|
SLOT(FPSTypeChanged(int)));
|
||||||
|
QWidget::connect(
|
||||||
|
_fpsIntValue,
|
||||||
|
SIGNAL(NumberVariableChanged(const NumberVariable<int> &)),
|
||||||
|
this, SLOT(FPSIntValueChanged(const NumberVariable<int> &)));
|
||||||
|
QWidget::connect(_fpsStringValue, SIGNAL(editingFinished()), this,
|
||||||
|
SLOT(FPSStringValueChanged()));
|
||||||
|
QWidget::connect(
|
||||||
|
_canvasSizeValue,
|
||||||
|
SIGNAL(NumberVariableChanged(const NumberVariable<int> &)),
|
||||||
|
this,
|
||||||
|
SLOT(CanvasSizeValueChanged(const NumberVariable<int> &)));
|
||||||
|
QWidget::connect(_getCurrentValue, SIGNAL(clicked()), this,
|
||||||
|
SLOT(GetCurrentValueClicked()));
|
||||||
|
|
||||||
|
auto layout = new QHBoxLayout();
|
||||||
|
PlaceWidgets(
|
||||||
|
obs_module_text("AdvSceneSwitcher.action.obsSettings.layout"),
|
||||||
|
layout,
|
||||||
|
{{"{{actions}}", _actions},
|
||||||
|
{"{{fpsType}}", _fpsType},
|
||||||
|
{"{{fpsIntValue}}", _fpsIntValue},
|
||||||
|
{"{{fpsStringValue}}", _fpsStringValue},
|
||||||
|
{"{{canvasSizeValue}}", _canvasSizeValue},
|
||||||
|
{"{{getCurrentValue}}", _getCurrentValue}});
|
||||||
|
setLayout(layout);
|
||||||
|
|
||||||
|
_entryData = entryData;
|
||||||
|
UpdateEntryData();
|
||||||
|
_loading = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MacroActionOBSSettingsEdit::UpdateEntryData()
|
||||||
|
{
|
||||||
|
if (!_entryData) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_actions->setCurrentIndex(
|
||||||
|
_actions->findData(static_cast<int>(_entryData->_action)));
|
||||||
|
_fpsType->setCurrentIndex(
|
||||||
|
_actions->findData(static_cast<int>(_entryData->_fpsType)));
|
||||||
|
_fpsIntValue->SetValue(_entryData->_fpsIntValue);
|
||||||
|
_fpsStringValue->setText(_entryData->_fpsStringValue);
|
||||||
|
_canvasSizeValue->SetValue(_entryData->_canvasSizeValue);
|
||||||
|
SetWidgetVisibility();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MacroActionOBSSettingsEdit::FPSTypeChanged(int idx)
|
||||||
|
{
|
||||||
|
GUARD_LOADING_AND_LOCK();
|
||||||
|
_entryData->_fpsType = static_cast<MacroActionOBSSettings::FPSType>(
|
||||||
|
_fpsType->itemData(idx).toInt());
|
||||||
|
SetWidgetVisibility();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MacroActionOBSSettingsEdit::FPSIntValueChanged(
|
||||||
|
const NumberVariable<int> &value)
|
||||||
|
{
|
||||||
|
GUARD_LOADING_AND_LOCK();
|
||||||
|
_entryData->_fpsIntValue = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MacroActionOBSSettingsEdit::FPSStringValueChanged()
|
||||||
|
{
|
||||||
|
GUARD_LOADING_AND_LOCK();
|
||||||
|
_entryData->_fpsStringValue = _fpsStringValue->text().toStdString();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MacroActionOBSSettingsEdit::CanvasSizeValueChanged(
|
||||||
|
const NumberVariable<int> &value)
|
||||||
|
{
|
||||||
|
GUARD_LOADING_AND_LOCK();
|
||||||
|
_entryData->_canvasSizeValue = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MacroActionOBSSettingsEdit::GetCurrentValueClicked()
|
||||||
|
{
|
||||||
|
const auto setSpinVideoValue = [this](VariableSpinBox *spin,
|
||||||
|
const char *name) {
|
||||||
|
auto value = getConfigValueHelper(config_get_uint,
|
||||||
|
config_get_default_uint,
|
||||||
|
"Video", name);
|
||||||
|
if (!value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
spin->SetFixedValue(static_cast<int>(*value));
|
||||||
|
};
|
||||||
|
const auto setFpsValue = [&](const char *name) {
|
||||||
|
setSpinVideoValue(_fpsIntValue, name);
|
||||||
|
};
|
||||||
|
const auto setCanvasValue = [&](const char *name) {
|
||||||
|
setSpinVideoValue(_canvasSizeValue, name);
|
||||||
|
};
|
||||||
|
|
||||||
|
switch (_entryData->_action) {
|
||||||
|
case MacroActionOBSSettings::Action::FPS_COMMON_VALUE: {
|
||||||
|
auto value = getConfigValueHelper(config_get_string,
|
||||||
|
config_get_default_string,
|
||||||
|
"Video", "FPSCommon");
|
||||||
|
if (!value) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
_fpsStringValue->setText(QString(*value));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MacroActionOBSSettings::Action::FPS_INT_VALUE:
|
||||||
|
setFpsValue("FPSInt");
|
||||||
|
break;
|
||||||
|
case MacroActionOBSSettings::Action::FPS_NUM_VALUE:
|
||||||
|
setFpsValue("FPSNum");
|
||||||
|
break;
|
||||||
|
case MacroActionOBSSettings::Action::FPS_DEN_VALUE:
|
||||||
|
setFpsValue("FPSDen");
|
||||||
|
break;
|
||||||
|
case MacroActionOBSSettings::Action::BASE_CANVAS_X_VALUE:
|
||||||
|
setCanvasValue("BaseCX");
|
||||||
|
break;
|
||||||
|
case MacroActionOBSSettings::Action::BASE_CANVAS_Y_VALUE:
|
||||||
|
setCanvasValue("BaseCY");
|
||||||
|
break;
|
||||||
|
case MacroActionOBSSettings::Action::OUTPUT_X_VALUE:
|
||||||
|
setCanvasValue("OutputCX");
|
||||||
|
break;
|
||||||
|
case MacroActionOBSSettings::Action::OUTPUT_Y_VALUE:
|
||||||
|
setCanvasValue("OutputCY");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MacroActionOBSSettingsEdit::SetWidgetVisibility()
|
||||||
|
{
|
||||||
|
if (!_entryData) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const bool isFPSSelection =
|
||||||
|
_entryData->_action ==
|
||||||
|
MacroActionOBSSettings::Action::FPS_TYPE ||
|
||||||
|
_entryData->_action ==
|
||||||
|
MacroActionOBSSettings::Action::FPS_COMMON_VALUE ||
|
||||||
|
_entryData->_action ==
|
||||||
|
MacroActionOBSSettings::Action::FPS_INT_VALUE ||
|
||||||
|
_entryData->_action ==
|
||||||
|
MacroActionOBSSettings::Action::FPS_DEN_VALUE ||
|
||||||
|
_entryData->_action ==
|
||||||
|
MacroActionOBSSettings::Action::FPS_NUM_VALUE;
|
||||||
|
|
||||||
|
_fpsType->setVisible(_entryData->_action ==
|
||||||
|
MacroActionOBSSettings::Action::FPS_TYPE);
|
||||||
|
_fpsIntValue->setVisible(
|
||||||
|
_entryData->_action ==
|
||||||
|
MacroActionOBSSettings::Action::FPS_INT_VALUE ||
|
||||||
|
_entryData->_action ==
|
||||||
|
MacroActionOBSSettings::Action::FPS_NUM_VALUE ||
|
||||||
|
_entryData->_action ==
|
||||||
|
MacroActionOBSSettings::Action::FPS_DEN_VALUE);
|
||||||
|
_fpsStringValue->setVisible(
|
||||||
|
_entryData->_action ==
|
||||||
|
MacroActionOBSSettings::Action::FPS_COMMON_VALUE);
|
||||||
|
_canvasSizeValue->setVisible(!isFPSSelection);
|
||||||
|
_getCurrentValue->setVisible(_entryData->_action !=
|
||||||
|
MacroActionOBSSettings::Action::FPS_TYPE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MacroActionOBSSettingsEdit::ActionChanged(int idx)
|
||||||
|
{
|
||||||
|
GUARD_LOADING_AND_LOCK();
|
||||||
|
_entryData->_action = static_cast<MacroActionOBSSettings::Action>(
|
||||||
|
_actions->itemData(idx).toInt());
|
||||||
|
SetWidgetVisibility();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace advss
|
||||||
90
plugins/base/macro-action-obs-settings.hpp
Normal file
90
plugins/base/macro-action-obs-settings.hpp
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "macro-action-edit.hpp"
|
||||||
|
#include "variable-spinbox.hpp"
|
||||||
|
#include "variable-line-edit.hpp"
|
||||||
|
|
||||||
|
#include <QComboBox>
|
||||||
|
#include <QHBoxLayout>
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
|
namespace advss {
|
||||||
|
|
||||||
|
class MacroActionOBSSettings : public MacroAction {
|
||||||
|
public:
|
||||||
|
MacroActionOBSSettings(Macro *m) : MacroAction(m) {}
|
||||||
|
bool PerformAction();
|
||||||
|
void LogAction() const;
|
||||||
|
bool Save(obs_data_t *obj) const;
|
||||||
|
bool Load(obs_data_t *obj);
|
||||||
|
std::string GetId() const { return id; };
|
||||||
|
static std::shared_ptr<MacroAction> Create(Macro *m);
|
||||||
|
std::shared_ptr<MacroAction> Copy() const;
|
||||||
|
void ResolveVariablesToFixedValues();
|
||||||
|
|
||||||
|
enum class Action {
|
||||||
|
FPS_TYPE,
|
||||||
|
FPS_COMMON_VALUE,
|
||||||
|
FPS_INT_VALUE,
|
||||||
|
FPS_NUM_VALUE,
|
||||||
|
FPS_DEN_VALUE,
|
||||||
|
BASE_CANVAS_X_VALUE,
|
||||||
|
BASE_CANVAS_Y_VALUE,
|
||||||
|
OUTPUT_X_VALUE,
|
||||||
|
OUTPUT_Y_VALUE,
|
||||||
|
};
|
||||||
|
Action _action = Action::FPS_COMMON_VALUE;
|
||||||
|
enum class FPSType {
|
||||||
|
COMMON,
|
||||||
|
INTEGER,
|
||||||
|
FRACTION,
|
||||||
|
};
|
||||||
|
FPSType _fpsType = FPSType::INTEGER;
|
||||||
|
IntVariable _fpsIntValue = 30;
|
||||||
|
StringVariable _fpsStringValue = "24 NTSC";
|
||||||
|
IntVariable _canvasSizeValue = 1920;
|
||||||
|
|
||||||
|
private:
|
||||||
|
static bool _registered;
|
||||||
|
static const std::string id;
|
||||||
|
};
|
||||||
|
|
||||||
|
class MacroActionOBSSettingsEdit : public QWidget {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
MacroActionOBSSettingsEdit(
|
||||||
|
QWidget *parent,
|
||||||
|
std::shared_ptr<MacroActionOBSSettings> entryData = nullptr);
|
||||||
|
void UpdateEntryData();
|
||||||
|
static QWidget *Create(QWidget *parent,
|
||||||
|
std::shared_ptr<MacroAction> action)
|
||||||
|
{
|
||||||
|
return new MacroActionOBSSettingsEdit(
|
||||||
|
parent,
|
||||||
|
std::dynamic_pointer_cast<MacroActionOBSSettings>(
|
||||||
|
action));
|
||||||
|
}
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void ActionChanged(int);
|
||||||
|
void FPSTypeChanged(int);
|
||||||
|
void FPSIntValueChanged(const NumberVariable<int> &);
|
||||||
|
void FPSStringValueChanged();
|
||||||
|
void CanvasSizeValueChanged(const NumberVariable<int> &);
|
||||||
|
void GetCurrentValueClicked();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void SetWidgetVisibility();
|
||||||
|
|
||||||
|
QComboBox *_actions;
|
||||||
|
QComboBox *_fpsType;
|
||||||
|
VariableSpinBox *_fpsIntValue;
|
||||||
|
VariableLineEdit *_fpsStringValue;
|
||||||
|
VariableSpinBox *_canvasSizeValue;
|
||||||
|
QPushButton *_getCurrentValue;
|
||||||
|
|
||||||
|
std::shared_ptr<MacroActionOBSSettings> _entryData;
|
||||||
|
bool _loading = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace advss
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
#include "macro-action-profile.hpp"
|
#include "macro-action-profile.hpp"
|
||||||
#include "layout-helpers.hpp"
|
#include "layout-helpers.hpp"
|
||||||
#include "profile-helpers.hpp"
|
|
||||||
|
|
||||||
#include <obs-frontend-api.h>
|
#include <obs-frontend-api.h>
|
||||||
|
|
||||||
@@ -55,20 +54,16 @@ std::shared_ptr<MacroAction> MacroActionProfile::Copy() const
|
|||||||
|
|
||||||
MacroActionProfileEdit::MacroActionProfileEdit(
|
MacroActionProfileEdit::MacroActionProfileEdit(
|
||||||
QWidget *parent, std::shared_ptr<MacroActionProfile> entryData)
|
QWidget *parent, std::shared_ptr<MacroActionProfile> entryData)
|
||||||
: QWidget(parent)
|
: QWidget(parent),
|
||||||
|
_profiles(new ProfileSelectionWidget(this))
|
||||||
{
|
{
|
||||||
_profiles = new QComboBox();
|
|
||||||
PopulateProfileSelection(_profiles);
|
|
||||||
QWidget::connect(_profiles, SIGNAL(currentTextChanged(const QString &)),
|
QWidget::connect(_profiles, SIGNAL(currentTextChanged(const QString &)),
|
||||||
this, SLOT(ProfileChanged(const QString &)));
|
this, SLOT(ProfileChanged(const QString &)));
|
||||||
|
|
||||||
QHBoxLayout *mainLayout = new QHBoxLayout;
|
auto layout = new QHBoxLayout;
|
||||||
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
|
|
||||||
{"{{profiles}}", _profiles},
|
|
||||||
};
|
|
||||||
PlaceWidgets(obs_module_text("AdvSceneSwitcher.action.profile.entry"),
|
PlaceWidgets(obs_module_text("AdvSceneSwitcher.action.profile.entry"),
|
||||||
mainLayout, widgetPlaceholders);
|
layout, {{"{{profiles}}", _profiles}});
|
||||||
setLayout(mainLayout);
|
setLayout(layout);
|
||||||
|
|
||||||
_entryData = entryData;
|
_entryData = entryData;
|
||||||
UpdateEntryData();
|
UpdateEntryData();
|
||||||
@@ -86,11 +81,7 @@ void MacroActionProfileEdit::UpdateEntryData()
|
|||||||
|
|
||||||
void MacroActionProfileEdit::ProfileChanged(const QString &text)
|
void MacroActionProfileEdit::ProfileChanged(const QString &text)
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_profile = text.toStdString();
|
_entryData->_profile = text.toStdString();
|
||||||
emit HeaderInfoChanged(
|
emit HeaderInfoChanged(
|
||||||
QString::fromStdString(_entryData->GetShortDesc()));
|
QString::fromStdString(_entryData->GetShortDesc()));
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "macro-action-edit.hpp"
|
#include "macro-action-edit.hpp"
|
||||||
|
#include "profile-helpers.hpp"
|
||||||
#include <QComboBox>
|
|
||||||
|
|
||||||
namespace advss {
|
namespace advss {
|
||||||
|
|
||||||
@@ -45,11 +44,10 @@ private slots:
|
|||||||
signals:
|
signals:
|
||||||
void HeaderInfoChanged(const QString &);
|
void HeaderInfoChanged(const QString &);
|
||||||
|
|
||||||
protected:
|
|
||||||
QComboBox *_profiles;
|
|
||||||
std::shared_ptr<MacroActionProfile> _entryData;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
ProfileSelectionWidget *_profiles;
|
||||||
|
|
||||||
|
std::shared_ptr<MacroActionProfile> _entryData;
|
||||||
bool _loading = true;
|
bool _loading = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
#include "macro-action-projector.hpp"
|
#include "macro-action-projector.hpp"
|
||||||
#include "layout-helpers.hpp"
|
#include "layout-helpers.hpp"
|
||||||
#include "monitor-helpers.hpp"
|
|
||||||
#include "selection-helpers.hpp"
|
#include "selection-helpers.hpp"
|
||||||
#include "source-helpers.hpp"
|
#include "source-helpers.hpp"
|
||||||
|
|
||||||
@@ -230,6 +229,13 @@ static void populateWindowTypes(QComboBox *list)
|
|||||||
"AdvSceneSwitcher.action.projector.fullscreen"));
|
"AdvSceneSwitcher.action.projector.fullscreen"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static QStringList getSourcesList()
|
||||||
|
{
|
||||||
|
auto sources = GetSourceNames();
|
||||||
|
sources.sort();
|
||||||
|
return sources;
|
||||||
|
}
|
||||||
|
|
||||||
MacroActionProjectorEdit::MacroActionProjectorEdit(
|
MacroActionProjectorEdit::MacroActionProjectorEdit(
|
||||||
QWidget *parent, std::shared_ptr<MacroActionProjector> entryData)
|
QWidget *parent, std::shared_ptr<MacroActionProjector> entryData)
|
||||||
: QWidget(parent),
|
: QWidget(parent),
|
||||||
@@ -238,8 +244,8 @@ MacroActionProjectorEdit::MacroActionProjectorEdit(
|
|||||||
_windowTypes(new QComboBox()),
|
_windowTypes(new QComboBox()),
|
||||||
_scenes(new SceneSelectionWidget(window(), true, false, true, true,
|
_scenes(new SceneSelectionWidget(window(), true, false, true, true,
|
||||||
true)),
|
true)),
|
||||||
_sources(new SourceSelectionWidget(window(), QStringList(), true)),
|
_sources(new SourceSelectionWidget(window(), getSourcesList, true)),
|
||||||
_monitors(new QComboBox()),
|
_monitors(new MonitorSelectionWidget(this)),
|
||||||
_projectorWindowName(new VariableLineEdit(this)),
|
_projectorWindowName(new VariableLineEdit(this)),
|
||||||
_regex(new RegexConfigWidget(this)),
|
_regex(new RegexConfigWidget(this)),
|
||||||
_layout(new QHBoxLayout(this))
|
_layout(new QHBoxLayout(this))
|
||||||
@@ -247,12 +253,11 @@ MacroActionProjectorEdit::MacroActionProjectorEdit(
|
|||||||
populateActionSelection(_actions);
|
populateActionSelection(_actions);
|
||||||
populateWindowTypes(_windowTypes);
|
populateWindowTypes(_windowTypes);
|
||||||
populateSelectionTypes(_types);
|
populateSelectionTypes(_types);
|
||||||
auto sources = GetSourceNames();
|
|
||||||
sources.sort();
|
|
||||||
_sources->SetSourceNameList(sources);
|
|
||||||
_monitors->addItems(GetMonitorNames());
|
_monitors->addItems(GetMonitorNames());
|
||||||
_monitors->setPlaceholderText(
|
_monitors->setPlaceholderText(
|
||||||
obs_module_text("AdvSceneSwitcher.selectDisplay"));
|
obs_module_text("AdvSceneSwitcher.selectDisplay"));
|
||||||
|
_monitors->SetAllowUnmatchedSelection(false);
|
||||||
|
|
||||||
QWidget::connect(_actions, SIGNAL(currentIndexChanged(int)), this,
|
QWidget::connect(_actions, SIGNAL(currentIndexChanged(int)), this,
|
||||||
SLOT(ActionChanged(int)));
|
SLOT(ActionChanged(int)));
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "macro-action-edit.hpp"
|
#include "macro-action-edit.hpp"
|
||||||
|
#include "monitor-helpers.hpp"
|
||||||
#include "regex-config.hpp"
|
#include "regex-config.hpp"
|
||||||
#include "scene-selection.hpp"
|
#include "scene-selection.hpp"
|
||||||
#include "source-selection.hpp"
|
#include "source-selection.hpp"
|
||||||
@@ -88,7 +89,7 @@ private:
|
|||||||
QComboBox *_windowTypes;
|
QComboBox *_windowTypes;
|
||||||
SceneSelectionWidget *_scenes;
|
SceneSelectionWidget *_scenes;
|
||||||
SourceSelectionWidget *_sources;
|
SourceSelectionWidget *_sources;
|
||||||
QComboBox *_monitors;
|
MonitorSelectionWidget *_monitors;
|
||||||
VariableLineEdit *_projectorWindowName;
|
VariableLineEdit *_projectorWindowName;
|
||||||
RegexConfigWidget *_regex;
|
RegexConfigWidget *_regex;
|
||||||
QHBoxLayout *_layout;
|
QHBoxLayout *_layout;
|
||||||
|
|||||||
@@ -193,12 +193,19 @@ static void populateTargetTypeSelection(QComboBox *list)
|
|||||||
list->addItem(obs_module_text("AdvSceneSwitcher.OBSVideoOutput"));
|
list->addItem(obs_module_text("AdvSceneSwitcher.OBSVideoOutput"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static QStringList getVideoSourcesList()
|
||||||
|
{
|
||||||
|
auto sources = GetVideoSourceNames();
|
||||||
|
sources.sort();
|
||||||
|
return sources;
|
||||||
|
}
|
||||||
|
|
||||||
MacroActionScreenshotEdit::MacroActionScreenshotEdit(
|
MacroActionScreenshotEdit::MacroActionScreenshotEdit(
|
||||||
QWidget *parent, std::shared_ptr<MacroActionScreenshot> entryData)
|
QWidget *parent, std::shared_ptr<MacroActionScreenshot> entryData)
|
||||||
: QWidget(parent),
|
: QWidget(parent),
|
||||||
_scenes(new SceneSelectionWidget(this, true, false, true, true,
|
_scenes(new SceneSelectionWidget(this, true, false, true, true,
|
||||||
true)),
|
true)),
|
||||||
_sources(new SourceSelectionWidget(this, QStringList(), true)),
|
_sources(new SourceSelectionWidget(this, getVideoSourcesList, true)),
|
||||||
_saveType(new QComboBox()),
|
_saveType(new QComboBox()),
|
||||||
_targetType(new QComboBox()),
|
_targetType(new QComboBox()),
|
||||||
_savePath(new FileSelection(FileSelection::Type::WRITE, this)),
|
_savePath(new FileSelection(FileSelection::Type::WRITE, this)),
|
||||||
@@ -206,9 +213,6 @@ MacroActionScreenshotEdit::MacroActionScreenshotEdit(
|
|||||||
{
|
{
|
||||||
setToolTip(obs_module_text(
|
setToolTip(obs_module_text(
|
||||||
"AdvSceneSwitcher.action.screenshot.blackscreenNote"));
|
"AdvSceneSwitcher.action.screenshot.blackscreenNote"));
|
||||||
auto sources = GetVideoSourceNames();
|
|
||||||
sources.sort();
|
|
||||||
_sources->SetSourceNameList(sources);
|
|
||||||
|
|
||||||
populateSaveTypeSelection(_saveType);
|
populateSaveTypeSelection(_saveType);
|
||||||
populateTargetTypeSelection(_targetType);
|
populateTargetTypeSelection(_targetType);
|
||||||
|
|||||||
@@ -274,10 +274,17 @@ static inline void populateModeSelection(QComboBox *list,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static QStringList getSourcesList()
|
||||||
|
{
|
||||||
|
auto sources = GetSourceNames();
|
||||||
|
sources.sort();
|
||||||
|
return sources;
|
||||||
|
}
|
||||||
|
|
||||||
MacroActionSourceEdit::MacroActionSourceEdit(
|
MacroActionSourceEdit::MacroActionSourceEdit(
|
||||||
QWidget *parent, std::shared_ptr<MacroActionSource> entryData)
|
QWidget *parent, std::shared_ptr<MacroActionSource> entryData)
|
||||||
: QWidget(parent),
|
: QWidget(parent),
|
||||||
_sources(new SourceSelectionWidget(this, QStringList(), true)),
|
_sources(new SourceSelectionWidget(this, getSourcesList, true)),
|
||||||
_actions(new QComboBox()),
|
_actions(new QComboBox()),
|
||||||
_settingsButtons(new SourceSettingsButtonSelection(this)),
|
_settingsButtons(new SourceSettingsButtonSelection(this)),
|
||||||
_settingsLayout(new QHBoxLayout()),
|
_settingsLayout(new QHBoxLayout()),
|
||||||
@@ -296,9 +303,7 @@ MacroActionSourceEdit::MacroActionSourceEdit(
|
|||||||
obs_module_text("AdvSceneSwitcher.action.source.refresh")))
|
obs_module_text("AdvSceneSwitcher.action.source.refresh")))
|
||||||
{
|
{
|
||||||
populateActionSelection(_actions);
|
populateActionSelection(_actions);
|
||||||
auto sources = GetSourceNames();
|
|
||||||
sources.sort();
|
|
||||||
_sources->SetSourceNameList(sources);
|
|
||||||
populateModeSelection(_deinterlaceMode, deinterlaceModes);
|
populateModeSelection(_deinterlaceMode, deinterlaceModes);
|
||||||
populateModeSelection(_deinterlaceOrder, deinterlaceFieldOrders);
|
populateModeSelection(_deinterlaceOrder, deinterlaceFieldOrders);
|
||||||
populateModeSelection(_settingsInputMethods, inputMethods);
|
populateModeSelection(_settingsInputMethods, inputMethods);
|
||||||
|
|||||||
@@ -163,15 +163,14 @@ MacroActionWindowEdit::MacroActionWindowEdit(
|
|||||||
QWidget *parent, std::shared_ptr<MacroActionWindow> entryData)
|
QWidget *parent, std::shared_ptr<MacroActionWindow> entryData)
|
||||||
: QWidget(parent),
|
: QWidget(parent),
|
||||||
_actions(new QComboBox()),
|
_actions(new QComboBox()),
|
||||||
_windows(new QComboBox()),
|
_windows(new WindowSelectionWidget(this)),
|
||||||
_regex(new RegexConfigWidget(this)),
|
_regex(new RegexConfigWidget(this)),
|
||||||
_infoLayout(new QHBoxLayout())
|
_infoLayout(new QHBoxLayout())
|
||||||
{
|
{
|
||||||
populateActionSelection(_actions);
|
populateActionSelection(_actions);
|
||||||
|
|
||||||
_windows->setEditable(true);
|
_windows->setToolTip(
|
||||||
_windows->setMaxVisibleItems(20);
|
obs_module_text("AdvSceneSwitcher.tooltip.availableVariables"));
|
||||||
PopulateWindowSelection(_windows);
|
|
||||||
|
|
||||||
auto focusLimitation = new QLabel(obs_module_text(
|
auto focusLimitation = new QLabel(obs_module_text(
|
||||||
"AdvSceneSwitcher.action.window.type.setFocusWindow.limitation"));
|
"AdvSceneSwitcher.action.window.type.setFocusWindow.limitation"));
|
||||||
@@ -211,19 +210,17 @@ void MacroActionWindowEdit::UpdateEntryData()
|
|||||||
if (!_entryData) {
|
if (!_entryData) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_actions->setCurrentIndex(static_cast<int>(_entryData->_action));
|
_actions->setCurrentIndex(static_cast<int>(_entryData->_action));
|
||||||
_windows->setCurrentText(QString::fromStdString(_entryData->_window));
|
_windows->setCurrentText(
|
||||||
|
QString::fromStdString(_entryData->_window.UnresolvedValue()));
|
||||||
_regex->SetRegexConfig(_entryData->_regex);
|
_regex->SetRegexConfig(_entryData->_regex);
|
||||||
SetWidgetVisibility();
|
SetWidgetVisibility();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroActionWindowEdit::WindowChanged(const QString &text)
|
void MacroActionWindowEdit::WindowChanged(const QString &text)
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_window = text.toStdString();
|
_entryData->_window = text.toStdString();
|
||||||
emit HeaderInfoChanged(
|
emit HeaderInfoChanged(
|
||||||
QString::fromStdString(_entryData->GetShortDesc()));
|
QString::fromStdString(_entryData->GetShortDesc()));
|
||||||
@@ -231,11 +228,7 @@ void MacroActionWindowEdit::WindowChanged(const QString &text)
|
|||||||
|
|
||||||
void MacroActionWindowEdit::RegexChanged(const RegexConfig ®ex)
|
void MacroActionWindowEdit::RegexChanged(const RegexConfig ®ex)
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_regex = regex;
|
_entryData->_regex = regex;
|
||||||
adjustSize();
|
adjustSize();
|
||||||
updateGeometry();
|
updateGeometry();
|
||||||
@@ -252,11 +245,7 @@ void MacroActionWindowEdit::SetWidgetVisibility()
|
|||||||
|
|
||||||
void MacroActionWindowEdit::ActionChanged(int value)
|
void MacroActionWindowEdit::ActionChanged(int value)
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
GUARD_LOADING_AND_LOCK();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto lock = LockContext();
|
|
||||||
_entryData->_action = static_cast<MacroActionWindow::Action>(value);
|
_entryData->_action = static_cast<MacroActionWindow::Action>(value);
|
||||||
SetWidgetVisibility();
|
SetWidgetVisibility();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#include "macro-action-edit.hpp"
|
#include "macro-action-edit.hpp"
|
||||||
#include "regex-config.hpp"
|
#include "regex-config.hpp"
|
||||||
#include "variable-string.hpp"
|
#include "variable-string.hpp"
|
||||||
|
#include "window-selection.hpp"
|
||||||
|
|
||||||
namespace advss {
|
namespace advss {
|
||||||
|
|
||||||
@@ -62,7 +63,7 @@ private:
|
|||||||
void SetWidgetVisibility();
|
void SetWidgetVisibility();
|
||||||
|
|
||||||
QComboBox *_actions;
|
QComboBox *_actions;
|
||||||
QComboBox *_windows;
|
WindowSelectionWidget *_windows;
|
||||||
RegexConfigWidget *_regex;
|
RegexConfigWidget *_regex;
|
||||||
QHBoxLayout *_infoLayout;
|
QHBoxLayout *_infoLayout;
|
||||||
|
|
||||||
|
|||||||
@@ -292,8 +292,8 @@ bool MacroConditionAudio::Save(obs_data_t *obj) const
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
obs_volmeter_t *AddVolmeterToSource(MacroConditionAudio *entry,
|
static obs_volmeter_t *addVolmeterToSource(MacroConditionAudio *entry,
|
||||||
obs_weak_source *source)
|
obs_weak_source *source)
|
||||||
{
|
{
|
||||||
obs_volmeter_t *volmeter = obs_volmeter_create(OBS_FADER_LOG);
|
obs_volmeter_t *volmeter = obs_volmeter_create(OBS_FADER_LOG);
|
||||||
obs_volmeter_add_callback(volmeter, MacroConditionAudio::SetVolumeLevel,
|
obs_volmeter_add_callback(volmeter, MacroConditionAudio::SetVolumeLevel,
|
||||||
@@ -328,7 +328,7 @@ bool MacroConditionAudio::Load(obs_data_t *obj)
|
|||||||
obs_data_get_int(obj, "outputCondition"));
|
obs_data_get_int(obj, "outputCondition"));
|
||||||
_volumeCondition = static_cast<VolumeCondition>(
|
_volumeCondition = static_cast<VolumeCondition>(
|
||||||
obs_data_get_int(obj, "volumeCondition"));
|
obs_data_get_int(obj, "volumeCondition"));
|
||||||
_volmeter = AddVolmeterToSource(this, _audioSource.GetSource());
|
_volmeter = addVolmeterToSource(this, _audioSource.GetSource());
|
||||||
|
|
||||||
if (obs_data_get_int(obj, "version") < 2) {
|
if (obs_data_get_int(obj, "version") < 2) {
|
||||||
// Set default values for dB handling
|
// Set default values for dB handling
|
||||||
@@ -379,7 +379,7 @@ void MacroConditionAudio::ResetVolmeter()
|
|||||||
obs_volmeter_remove_callback(_volmeter, SetVolumeLevel, this);
|
obs_volmeter_remove_callback(_volmeter, SetVolumeLevel, this);
|
||||||
obs_volmeter_destroy(_volmeter);
|
obs_volmeter_destroy(_volmeter);
|
||||||
|
|
||||||
_volmeter = AddVolmeterToSource(this, _audioSource.GetSource());
|
_volmeter = addVolmeterToSource(this, _audioSource.GetSource());
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroConditionAudio::SetupTempVars()
|
void MacroConditionAudio::SetupTempVars()
|
||||||
@@ -458,11 +458,18 @@ static inline void populateVolumeConditionSelection(QComboBox *list)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static QStringList getAudioSourcesList()
|
||||||
|
{
|
||||||
|
auto sources = GetAudioSourceNames();
|
||||||
|
sources.sort();
|
||||||
|
return sources;
|
||||||
|
}
|
||||||
|
|
||||||
MacroConditionAudioEdit::MacroConditionAudioEdit(
|
MacroConditionAudioEdit::MacroConditionAudioEdit(
|
||||||
QWidget *parent, std::shared_ptr<MacroConditionAudio> entryData)
|
QWidget *parent, std::shared_ptr<MacroConditionAudio> entryData)
|
||||||
: QWidget(parent),
|
: QWidget(parent),
|
||||||
_checkTypes(new QComboBox()),
|
_checkTypes(new QComboBox()),
|
||||||
_sources(new SourceSelectionWidget(this, QStringList(), true)),
|
_sources(new SourceSelectionWidget(this, getAudioSourcesList, true)),
|
||||||
_condition(new QComboBox()),
|
_condition(new QComboBox()),
|
||||||
_volumePercent(new VariableDoubleSpinBox()),
|
_volumePercent(new VariableDoubleSpinBox()),
|
||||||
_volumeDB(new VariableDoubleSpinBox),
|
_volumeDB(new VariableDoubleSpinBox),
|
||||||
@@ -484,10 +491,6 @@ MacroConditionAudioEdit::MacroConditionAudioEdit(
|
|||||||
_syncOffset->setMaximum(20000);
|
_syncOffset->setMaximum(20000);
|
||||||
_syncOffset->setSuffix("ms");
|
_syncOffset->setSuffix("ms");
|
||||||
|
|
||||||
auto sources = GetAudioSourceNames();
|
|
||||||
sources.sort();
|
|
||||||
_sources->SetSourceNameList(sources);
|
|
||||||
|
|
||||||
QWidget::connect(_checkTypes, SIGNAL(currentIndexChanged(int)), this,
|
QWidget::connect(_checkTypes, SIGNAL(currentIndexChanged(int)), this,
|
||||||
SLOT(CheckTypeChanged(int)));
|
SLOT(CheckTypeChanged(int)));
|
||||||
QWidget::connect(
|
QWidget::connect(
|
||||||
|
|||||||
@@ -52,24 +52,26 @@ bool MacroConditionCursor::CheckClick()
|
|||||||
bool MacroConditionCursor::CheckCondition()
|
bool MacroConditionCursor::CheckCondition()
|
||||||
{
|
{
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
std::pair<int, int> cursorPos = GetCursorPos();
|
const auto &[x, y] = GetCursorPos();
|
||||||
|
SetTempVarValue("x", std::to_string(x));
|
||||||
|
SetTempVarValue("y", std::to_string(y));
|
||||||
|
|
||||||
switch (_condition) {
|
switch (_condition) {
|
||||||
case Condition::REGION:
|
case Condition::REGION:
|
||||||
ret = cursorPos.first >= _minX && cursorPos.second >= _minY &&
|
ret = x >= _minX && y >= _minY && x <= _maxX && y <= _maxY;
|
||||||
cursorPos.first <= _maxX && cursorPos.second <= _maxY;
|
SetVariableValue(std::to_string(x) + " " + std::to_string(y));
|
||||||
SetVariableValue(std::to_string(cursorPos.first) + " " +
|
|
||||||
std::to_string(cursorPos.second));
|
|
||||||
break;
|
break;
|
||||||
case Condition::MOVING:
|
case Condition::MOVING:
|
||||||
ret = cursorPos.first != _lastCursorPosition.first ||
|
ret = x != _lastX || y != _lastY;
|
||||||
cursorPos.second != _lastCursorPosition.second;
|
|
||||||
break;
|
break;
|
||||||
case Condition::CLICK:
|
case Condition::CLICK:
|
||||||
ret = CheckClick();
|
ret = CheckClick();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
_lastCheckTime = std::chrono::high_resolution_clock::now();
|
_lastCheckTime = std::chrono::high_resolution_clock::now();
|
||||||
_lastCursorPosition = cursorPos;
|
_lastX = x;
|
||||||
|
_lastY = y;
|
||||||
|
|
||||||
if (GetVariableValue().empty()) {
|
if (GetVariableValue().empty()) {
|
||||||
SetVariableValue(ret ? "true" : "false");
|
SetVariableValue(ret ? "true" : "false");
|
||||||
@@ -109,6 +111,12 @@ bool MacroConditionCursor::Load(obs_data_t *obj)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MacroConditionCursor::SetupTempVars()
|
||||||
|
{
|
||||||
|
AddTempvar("x", obs_module_text("AdvSceneSwitcher.tempVar.cursor.x"));
|
||||||
|
AddTempvar("y", obs_module_text("AdvSceneSwitcher.tempVar.cursor.y"));
|
||||||
|
}
|
||||||
|
|
||||||
static inline void populateConditionSelection(QComboBox *list)
|
static inline void populateConditionSelection(QComboBox *list)
|
||||||
{
|
{
|
||||||
for (const auto &[condition, name] : cursorConditionTypes) {
|
for (const auto &[condition, name] : cursorConditionTypes) {
|
||||||
|
|||||||
@@ -38,9 +38,12 @@ public:
|
|||||||
NumberVariable<int> _minX = 0, _minY = 0, _maxX = 0, _maxY = 0;
|
NumberVariable<int> _minX = 0, _minY = 0, _maxX = 0, _maxY = 0;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void SetupTempVars();
|
||||||
|
|
||||||
bool CheckClick();
|
bool CheckClick();
|
||||||
std::chrono::high_resolution_clock::time_point _lastCheckTime{};
|
std::chrono::high_resolution_clock::time_point _lastCheckTime{};
|
||||||
std::pair<int, int> _lastCursorPosition;
|
int _lastX = 0;
|
||||||
|
int _lastY = 0;
|
||||||
|
|
||||||
static bool _registered;
|
static bool _registered;
|
||||||
static const std::string id;
|
static const std::string id;
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
#include "macro-condition-display.hpp"
|
#include "macro-condition-display.hpp"
|
||||||
#include "layout-helpers.hpp"
|
#include "layout-helpers.hpp"
|
||||||
#include "monitor-helpers.hpp"
|
|
||||||
|
|
||||||
#include <QGuiApplication>
|
#include <QGuiApplication>
|
||||||
#include <QScreen>
|
#include <QScreen>
|
||||||
@@ -254,7 +253,7 @@ MacroConditionDisplayEdit::MacroConditionDisplayEdit(
|
|||||||
: QWidget(parent),
|
: QWidget(parent),
|
||||||
_conditions(new QComboBox()),
|
_conditions(new QComboBox()),
|
||||||
_compareModes(new QComboBox()),
|
_compareModes(new QComboBox()),
|
||||||
_displays(new QComboBox()),
|
_displays(new MonitorSelectionWidget(this)),
|
||||||
_regex(new RegexConfigWidget()),
|
_regex(new RegexConfigWidget()),
|
||||||
_displayCount(new VariableSpinBox(this)),
|
_displayCount(new VariableSpinBox(this)),
|
||||||
_displayWidth(new VariableSpinBox(this)),
|
_displayWidth(new VariableSpinBox(this)),
|
||||||
@@ -264,8 +263,6 @@ MacroConditionDisplayEdit::MacroConditionDisplayEdit(
|
|||||||
{
|
{
|
||||||
populateConditionSelection(_conditions);
|
populateConditionSelection(_conditions);
|
||||||
populateCompareModeselection(_compareModes);
|
populateCompareModeselection(_compareModes);
|
||||||
_displays->addItems(GetMonitorNames());
|
|
||||||
_displays->setEditable(true);
|
|
||||||
_displayWidth->setMaximum(99999);
|
_displayWidth->setMaximum(99999);
|
||||||
_displayHeight->setMaximum(99999);
|
_displayHeight->setMaximum(99999);
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "macro-condition-edit.hpp"
|
#include "macro-condition-edit.hpp"
|
||||||
|
#include "monitor-helpers.hpp"
|
||||||
#include "variable-line-edit.hpp"
|
#include "variable-line-edit.hpp"
|
||||||
#include "variable-spinbox.hpp"
|
#include "variable-spinbox.hpp"
|
||||||
#include "regex-config.hpp"
|
#include "regex-config.hpp"
|
||||||
@@ -80,7 +81,7 @@ private:
|
|||||||
|
|
||||||
QComboBox *_conditions;
|
QComboBox *_conditions;
|
||||||
QComboBox *_compareModes;
|
QComboBox *_compareModes;
|
||||||
QComboBox *_displays;
|
MonitorSelectionWidget *_displays;
|
||||||
RegexConfigWidget *_regex;
|
RegexConfigWidget *_regex;
|
||||||
VariableSpinBox *_displayCount;
|
VariableSpinBox *_displayCount;
|
||||||
VariableSpinBox *_displayWidth;
|
VariableSpinBox *_displayWidth;
|
||||||
|
|||||||
@@ -185,10 +185,17 @@ static inline void populateConditionSelection(QComboBox *list)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static QStringList getFilterSourcesList()
|
||||||
|
{
|
||||||
|
auto sources = GetSourcesWithFilterNames();
|
||||||
|
sources.sort();
|
||||||
|
return sources;
|
||||||
|
}
|
||||||
|
|
||||||
MacroConditionFilterEdit::MacroConditionFilterEdit(
|
MacroConditionFilterEdit::MacroConditionFilterEdit(
|
||||||
QWidget *parent, std::shared_ptr<MacroConditionFilter> entryData)
|
QWidget *parent, std::shared_ptr<MacroConditionFilter> entryData)
|
||||||
: QWidget(parent),
|
: QWidget(parent),
|
||||||
_sources(new SourceSelectionWidget(this, QStringList(), true)),
|
_sources(new SourceSelectionWidget(this, getFilterSourcesList, true)),
|
||||||
_filters(new FilterSelectionWidget(this, _sources, true)),
|
_filters(new FilterSelectionWidget(this, _sources, true)),
|
||||||
_conditions(new QComboBox()),
|
_conditions(new QComboBox()),
|
||||||
_getSettings(new QPushButton(obs_module_text(
|
_getSettings(new QPushButton(obs_module_text(
|
||||||
@@ -200,9 +207,7 @@ MacroConditionFilterEdit::MacroConditionFilterEdit(
|
|||||||
obs_module_text("AdvSceneSwitcher.condition.filter.refresh")))
|
obs_module_text("AdvSceneSwitcher.condition.filter.refresh")))
|
||||||
{
|
{
|
||||||
populateConditionSelection(_conditions);
|
populateConditionSelection(_conditions);
|
||||||
auto sources = GetSourcesWithFilterNames();
|
|
||||||
sources.sort();
|
|
||||||
_sources->SetSourceNameList(sources);
|
|
||||||
_refreshSettingSelection->setToolTip(obs_module_text(
|
_refreshSettingSelection->setToolTip(obs_module_text(
|
||||||
"AdvSceneSwitcher.condition.filter.refresh.tooltip"));
|
"AdvSceneSwitcher.condition.filter.refresh.tooltip"));
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user