Compare commits

..

1 Commits
1.21.0 ... osx

Author SHA1 Message Date
WarmUpTill
b74e9d2e2a Enable executing AppleScripts on MacOS 2023-03-04 18:14:16 +01:00
164 changed files with 1776 additions and 65752 deletions

View File

@@ -1,37 +0,0 @@
name: 'Package plugin'
description: 'Packages the plugin for specified architecture and build config.'
inputs:
target:
description: 'Build target'
required: true
workingDirectory:
description: 'Working directory'
required: false
default: ${{ github.workspace }}
runs:
using: 'composite'
steps:
- name: Run macOS tests
if: ${{ runner.os == 'macOS' }}
shell: zsh {0}
run: |
if [[ '${{ inputs.target }}' != 'x86_64' ]]; then
echo tests skipped!
exit 0
fi
${{ inputs.workingDirectory }}/build_x86_64/tests/advanced-scene-switcher-tests
- name: Run Linux packaging
if: ${{ runner.os == 'Linux' }}
shell: bash
run: |
if [[ '${{ inputs.target }}' != 'x86_64' ]]; then
exit 0
fi
${{ inputs.workingDirectory }}/build_x86_64/tests/advanced-scene-switcher-tests
- name: Run Windows packaging
if: ${{ runner.os == 'Windows' }}
shell: pwsh
run: |
${{ inputs.workingDirectory }}/build_x64/tests/RelWithDebInfo/advanced-scene-switcher-tests.exe

View File

@@ -155,12 +155,6 @@ jobs:
codesign: 'true' codesign: 'true'
codesignIdent: ${{ env.CODESIGN_IDENT }} codesignIdent: ${{ env.CODESIGN_IDENT }}
- name: Run tests
uses: ./plugin/.github/actions/run-tests
with:
workingDirectory: ${{ github.workspace }}/plugin
target: ${{ matrix.arch }}
- name: Package Plugin - name: Package Plugin
uses: ./plugin/.github/actions/package-plugin uses: ./plugin/.github/actions/package-plugin
with: with:
@@ -256,12 +250,6 @@ jobs:
config: RelWithDebInfo config: RelWithDebInfo
portable: ${{ matrix.portable }} portable: ${{ matrix.portable }}
- name: Run tests
uses: ./plugin/.github/actions/run-tests
with:
workingDirectory: ${{ github.workspace }}/plugin
target: ${{ matrix.arch }}
- name: Package Plugin - name: Package Plugin
uses: ./plugin/.github/actions/package-plugin uses: ./plugin/.github/actions/package-plugin
with: with:
@@ -365,12 +353,6 @@ jobs:
config: RelWithDebInfo config: RelWithDebInfo
visualStudio: 'Visual Studio 17 2022' visualStudio: 'Visual Studio 17 2022'
- name: Run tests
uses: ./plugin/.github/actions/run-tests
with:
workingDirectory: ${{ github.workspace }}/plugin
target: ${{ matrix.arch }}
- name: Package Plugin - name: Package Plugin
uses: ./plugin/.github/actions/package-plugin uses: ./plugin/.github/actions/package-plugin
with: with:
@@ -425,11 +407,10 @@ jobs:
for file in ${{ github.workspace }}/**/@(*.pkg|*.exe|*.deb|*.zip); do for file in ${{ github.workspace }}/**/@(*.pkg|*.exe|*.deb|*.zip); do
echo " ${file##*/}: $(sha256sum "${file}" | cut -d " " -f 1)" >> ${{ github.workspace }}/CHECKSUMS.txt echo " ${file##*/}: $(sha256sum "${file}" | cut -d " " -f 1)" >> ${{ github.workspace }}/CHECKSUMS.txt
done done
cat ${{ github.workspace }}/CHECKSUMS.txt
- name: Create Release - name: Create Release
id: create_release id: create_release
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@1e07f4398721186383de40550babbdf2b84acfc5
with: with:
draft: true draft: true
prerelease: true prerelease: true

View File

@@ -191,8 +191,6 @@ target_sources(
src/macro-core/macro-condition-recording.hpp src/macro-core/macro-condition-recording.hpp
src/macro-core/macro-condition-replay-buffer.cpp src/macro-core/macro-condition-replay-buffer.cpp
src/macro-core/macro-condition-replay-buffer.hpp src/macro-core/macro-condition-replay-buffer.hpp
src/macro-core/macro-condition-run.cpp
src/macro-core/macro-condition-run.hpp
src/macro-core/macro-condition-scene-order.cpp src/macro-core/macro-condition-scene-order.cpp
src/macro-core/macro-condition-scene-order.hpp src/macro-core/macro-condition-scene-order.hpp
src/macro-core/macro-condition-scene-transform.cpp src/macro-core/macro-condition-scene-transform.cpp
@@ -221,8 +219,6 @@ target_sources(
src/macro-core/macro-condition-window.hpp src/macro-core/macro-condition-window.hpp
src/macro-core/macro-condition.cpp src/macro-core/macro-condition.cpp
src/macro-core/macro-condition.hpp src/macro-core/macro-condition.hpp
src/macro-core/macro-dock.cpp
src/macro-core/macro-dock.hpp
src/macro-core/macro-properties.cpp src/macro-core/macro-properties.cpp
src/macro-core/macro-properties.hpp src/macro-core/macro-properties.hpp
src/macro-core/macro-ref.cpp src/macro-core/macro-ref.cpp
@@ -254,15 +250,8 @@ target_sources(
src/utils/file-selection.hpp src/utils/file-selection.hpp
src/utils/macro-list.cpp src/utils/macro-list.cpp
src/utils/macro-list.hpp src/utils/macro-list.hpp
src/utils/math-helpers.cpp
src/utils/math-helpers.hpp
src/utils/mouse-wheel-guard.cpp
src/utils/mouse-wheel-guard.hpp
src/utils/name-dialog.cpp src/utils/name-dialog.cpp
src/utils/name-dialog.hpp src/utils/name-dialog.hpp
src/utils/obs-dock.hpp
src/utils/process-config.cpp
src/utils/process-config.hpp
src/utils/regex-config.cpp src/utils/regex-config.cpp
src/utils/regex-config.hpp src/utils/regex-config.hpp
src/utils/resizing-text-edit.cpp src/utils/resizing-text-edit.cpp
@@ -279,24 +268,12 @@ target_sources(
src/utils/slider-spinbox.hpp src/utils/slider-spinbox.hpp
src/utils/source-selection.cpp src/utils/source-selection.cpp
src/utils/source-selection.hpp src/utils/source-selection.hpp
src/utils/string-list.cpp
src/utils/string-list.hpp
src/utils/striped-frame.cpp
src/utils/striped-frame.hpp
src/utils/transition-selection.cpp src/utils/transition-selection.cpp
src/utils/transition-selection.hpp src/utils/transition-selection.hpp
src/utils/utility.cpp src/utils/utility.cpp
src/utils/utility.hpp src/utils/utility.hpp
src/utils/variable.cpp src/utils/variable.cpp
src/utils/variable.hpp src/utils/variable.hpp
src/utils/variable-line-edit.cpp
src/utils/variable-line-edit.hpp
src/utils/variable-number.tpp
src/utils/variable-number.hpp
src/utils/variable-spinbox.cpp
src/utils/variable-spinbox.hpp
src/utils/variable-string.cpp
src/utils/variable-string.hpp
src/utils/variable-text-edit.cpp src/utils/variable-text-edit.cpp
src/utils/variable-text-edit.hpp src/utils/variable-text-edit.hpp
src/utils/volume-control.cpp src/utils/volume-control.cpp
@@ -343,8 +320,7 @@ target_include_directories(
${LIB_NAME} ${LIB_NAME}
PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/deps/asio/asio/include" PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/deps/asio/asio/include"
"${CMAKE_CURRENT_SOURCE_DIR}/deps/websocketpp" "${CMAKE_CURRENT_SOURCE_DIR}/deps/websocketpp"
"${CMAKE_CURRENT_SOURCE_DIR}/deps/obs-websocket/lib" "${CMAKE_CURRENT_SOURCE_DIR}/deps/obs-websocket/lib")
"${CMAKE_CURRENT_SOURCE_DIR}/deps/exprtk")
# --- End of section --- # --- End of section ---
@@ -355,8 +331,7 @@ if(OS_WINDOWS)
target_compile_definitions(${LIB_NAME} PRIVATE UNICODE _UNICODE) target_compile_definitions(${LIB_NAME} PRIVATE UNICODE _UNICODE)
if(MSVC) if(MSVC)
target_compile_options(${LIB_NAME} PUBLIC /MP /d2FH4- /wd4267 /wd4267 target_compile_options(${LIB_NAME} PUBLIC /MP /d2FH4- /wd4267 /wd4267)
/bigobj)
endif() endif()
target_sources(${LIB_NAME} PRIVATE src/win/advanced-scene-switcher-win.cpp) target_sources(${LIB_NAME} PRIVATE src/win/advanced-scene-switcher-win.cpp)
add_definitions(-D_WEBSOCKETPP_CPP11_STL_) add_definitions(-D_WEBSOCKETPP_CPP11_STL_)
@@ -473,4 +448,3 @@ endif()
# --- End of section --- # --- End of section ---
add_subdirectory(src/macro-external) add_subdirectory(src/macro-external)
add_subdirectory(tests)

View File

@@ -22,5 +22,9 @@
</array> </array>
<key>LSMinimumSystemVersion</key> <key>LSMinimumSystemVersion</key>
<string>10.13</string> <string>10.13</string>
<key>com.apple.security.automation.apple-events</key>
<true/>
<key>NSAppleEventsUsageDescription</key>
<string>Advanced scene switcher needs additional permissions to be able to run AppleScript applications</string>
</dict> </dict>
</plist> </plist>

View File

@@ -25,7 +25,7 @@ DirExistsWarning=no
Name: "english"; MessagesFile: "compiler:Default.isl" Name: "english"; MessagesFile: "compiler:Default.isl"
[Files] [Files]
Source: "..\release\*"; Excludes: "*.zip"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "..\release\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "..\LICENSE"; Flags: dontcopy Source: "..\LICENSE"; Flags: dontcopy
; NOTE: Don't use "Flags: ignoreversion" on any shared system files ; NOTE: Don't use "Flags: ignoreversion" on any shared system files

View File

@@ -506,7 +506,7 @@ AdvSceneSwitcher.action.hotkey.leftMeta="Linke Meta-Taste"
AdvSceneSwitcher.action.hotkey.rightMeta="Rechte Meta-Taste" AdvSceneSwitcher.action.hotkey.rightMeta="Rechte Meta-Taste"
AdvSceneSwitcher.action.hotkey.onlyOBS="Tastendruck nur an OBS senden" AdvSceneSwitcher.action.hotkey.onlyOBS="Tastendruck nur an OBS senden"
AdvSceneSwitcher.action.hotkey.disabled="Globale Tastendrücke können nicht simuliert werden - die Funktionalität beschränkt sich auf das Senden von Tastendrücken an OBS!" AdvSceneSwitcher.action.hotkey.disabled="Globale Tastendrücke können nicht simuliert werden - die Funktionalität beschränkt sich auf das Senden von Tastendrücken an OBS!"
AdvSceneSwitcher.action.hotkey.entry="Drücke {{keys}} für {{duration}}" AdvSceneSwitcher.action.hotkey.entry="Drücke {{keys}} für {{duration}} Millisekunden"
AdvSceneSwitcher.action.sceneOrder="Reihenfolge der Szenenelemente" AdvSceneSwitcher.action.sceneOrder="Reihenfolge der Szenenelemente"
AdvSceneSwitcher.action.sceneOrder.type.moveUp="Nach oben verschieben" AdvSceneSwitcher.action.sceneOrder.type.moveUp="Nach oben verschieben"
AdvSceneSwitcher.action.sceneOrder.type.moveDown="Nach unten verschieben" AdvSceneSwitcher.action.sceneOrder.type.moveDown="Nach unten verschieben"
@@ -587,7 +587,7 @@ AdvSceneSwitcher.action.variable.invalidSelection="Ungültige Auswahl!"
AdvSceneSwitcher.action.variable.actionNoVariableSupport="Das Abrufen von Variablenwerten aus %1 Aktionen wird nicht unterstützt!" AdvSceneSwitcher.action.variable.actionNoVariableSupport="Das Abrufen von Variablenwerten aus %1 Aktionen wird nicht unterstützt!"
AdvSceneSwitcher.action.variable.conditionNoVariableSupport="Das Abrufen von Variablenwerten aus %1 Bedingungen wird nicht unterstützt!" AdvSceneSwitcher.action.variable.conditionNoVariableSupport="Das Abrufen von Variablenwerten aus %1 Bedingungen wird nicht unterstützt!"
AdvSceneSwitcher.action.variable.currentSegmentValue="Aktueller Wert:" AdvSceneSwitcher.action.variable.currentSegmentValue="Aktueller Wert:"
AdvSceneSwitcher.action.variable.entry="{{actions}}{{variables}}{{variables2}}{{strValue}}{{numValue}}{{segmentIndex}}{{mathExpression}}" AdvSceneSwitcher.action.variable.entry="{{actions}}{{variables}}{{variables2}}{{strValue}}{{numValue}}{{segmentIndex}}"
; Transition Tab ; Transition Tab

View File

@@ -95,19 +95,11 @@ AdvSceneSwitcher.macroTab.maximize="Maximize"
AdvSceneSwitcher.macroTab.minimize="Minimize" AdvSceneSwitcher.macroTab.minimize="Minimize"
AdvSceneSwitcher.macroTab.highlightSettings="Visual settings" AdvSceneSwitcher.macroTab.highlightSettings="Visual settings"
AdvSceneSwitcher.macroTab.hotkeySettings="Hotkey settings" AdvSceneSwitcher.macroTab.hotkeySettings="Hotkey settings"
AdvSceneSwitcher.macroTab.dockSettings="Dock settings"
AdvSceneSwitcher.macroTab.highlightExecutedMacros="Highlight recently executed macros" AdvSceneSwitcher.macroTab.highlightExecutedMacros="Highlight recently executed macros"
AdvSceneSwitcher.macroTab.highlightTrueConditions="Highlight conditions of currently selected macro that evaluated to true recently" AdvSceneSwitcher.macroTab.highlightTrueConditions="Highlight conditions of currently selected macro that evaluated to true recently"
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.currentDisableHotkeys="Register hotkeys to control the pause state of selected macro" AdvSceneSwitcher.macroTab.currentDisableHotkeys="Register hotkeys to control the pause state of selected macro"
AdvSceneSwitcher.macroTab.currentRegisterDock="Register dock widget to control the pause state of selected macro or run it manually"
AdvSceneSwitcher.macroTab.currentDockAddRunButton="Add button to run the macro"
AdvSceneSwitcher.macroTab.currentDockAddPauseButton="Add button to pause or unpause the macro"
AdvSceneSwitcher.macroDock.pause="Pause"
AdvSceneSwitcher.macroDock.unpause="Unpause"
AdvSceneSwitcher.macroDock.run="Run"
; Macro List ; Macro List
AdvSceneSwitcher.macroList.deleted="deleted" AdvSceneSwitcher.macroList.deleted="deleted"
@@ -424,9 +416,6 @@ AdvSceneSwitcher.condition.variable.type.equalsVariable="equals variable"
AdvSceneSwitcher.condition.variable.type.lessThanVariable="is less than variable" AdvSceneSwitcher.condition.variable.type.lessThanVariable="is less than variable"
AdvSceneSwitcher.condition.variable.type.greaterThanVariable="is greater than variable" AdvSceneSwitcher.condition.variable.type.greaterThanVariable="is greater than variable"
AdvSceneSwitcher.condition.variable.entry="{{variables}}{{conditions}}{{strValue}}{{numValue}}{{variables2}}" AdvSceneSwitcher.condition.variable.entry="{{variables}}{{conditions}}{{strValue}}{{numValue}}{{variables2}}"
AdvSceneSwitcher.condition.run="Run"
AdvSceneSwitcher.condition.run.entry="Process exits before timeout of{{timeout}} seconds"
AdvSceneSwitcher.condition.run.entry.exit="{{checkExitCode}}Check for exit code{{exitCode}}"
; Macro Actions ; Macro Actions
AdvSceneSwitcher.action.switchScene="Switch scene" AdvSceneSwitcher.action.switchScene="Switch scene"
@@ -474,6 +463,11 @@ AdvSceneSwitcher.action.streaming.type.stop="Stop streaming"
AdvSceneSwitcher.action.streaming.type.start="Start streaming" AdvSceneSwitcher.action.streaming.type.start="Start streaming"
AdvSceneSwitcher.action.streaming.entry="{{actions}}" AdvSceneSwitcher.action.streaming.entry="{{actions}}"
AdvSceneSwitcher.action.run="Run" AdvSceneSwitcher.action.run="Run"
AdvSceneSwitcher.action.run.arguments="Arguments:"
AdvSceneSwitcher.action.run.addArgument="Add argument"
AdvSceneSwitcher.action.run.addArgumentDescription="Add new argument:"
AdvSceneSwitcher.action.run.entry="Run {{filePath}}"
AdvSceneSwitcher.action.run.entry.workingDirectory="Working directory:{{workingDirectory}}"
AdvSceneSwitcher.action.sceneVisibility="Scene item visibility" AdvSceneSwitcher.action.sceneVisibility="Scene item visibility"
AdvSceneSwitcher.action.sceneVisibility.type.show="Show" AdvSceneSwitcher.action.sceneVisibility.type.show="Show"
AdvSceneSwitcher.action.sceneVisibility.type.hide="Hide" AdvSceneSwitcher.action.sceneVisibility.type.hide="Hide"
@@ -535,7 +529,7 @@ AdvSceneSwitcher.action.hotkey.leftMeta="Left Meta"
AdvSceneSwitcher.action.hotkey.rightMeta="Right Meta" AdvSceneSwitcher.action.hotkey.rightMeta="Right Meta"
AdvSceneSwitcher.action.hotkey.onlyOBS="Send keypress only to OBS" AdvSceneSwitcher.action.hotkey.onlyOBS="Send keypress only to OBS"
AdvSceneSwitcher.action.hotkey.disabled="Cannot simulate global key presses - functionality limited to sending key press to OBS!" AdvSceneSwitcher.action.hotkey.disabled="Cannot simulate global key presses - functionality limited to sending key press to OBS!"
AdvSceneSwitcher.action.hotkey.entry="Press {{keys}} for {{duration}}" AdvSceneSwitcher.action.hotkey.entry="Press {{keys}} for {{duration}} milliseconds"
AdvSceneSwitcher.action.sceneOrder="Scene item order" AdvSceneSwitcher.action.sceneOrder="Scene item order"
AdvSceneSwitcher.action.sceneOrder.type.moveUp="Move up" AdvSceneSwitcher.action.sceneOrder.type.moveUp="Move up"
AdvSceneSwitcher.action.sceneOrder.type.moveDown="Move down" AdvSceneSwitcher.action.sceneOrder.type.moveDown="Move down"
@@ -600,9 +594,6 @@ AdvSceneSwitcher.action.websocket.type.event="Event"
AdvSceneSwitcher.action.websocket.entry.request="Send scene switcher {{type}} via {{connection}}" AdvSceneSwitcher.action.websocket.entry.request="Send scene switcher {{type}} via {{connection}}"
AdvSceneSwitcher.action.websocket.entry.event="Send scene switcher {{type}} to connected clients" AdvSceneSwitcher.action.websocket.entry.event="Send scene switcher {{type}} to connected clients"
AdvSceneSwitcher.action.http="Http" AdvSceneSwitcher.action.http="Http"
AdvSceneSwitcher.action.http.setHeaders="Set headers"
AdvSceneSwitcher.action.http.headers="Headers:"
AdvSceneSwitcher.action.http.addHeader="Add header"
AdvSceneSwitcher.action.http.type.get="GET" AdvSceneSwitcher.action.http.type.get="GET"
AdvSceneSwitcher.action.http.type.post="POST" AdvSceneSwitcher.action.http.type.post="POST"
AdvSceneSwitcher.action.http.entry.line1="Send {{method}} to {{url}}" AdvSceneSwitcher.action.http.entry.line1="Send {{method}} to {{url}}"
@@ -617,21 +608,15 @@ AdvSceneSwitcher.action.variable.type.setActionValue="Set to action value"
AdvSceneSwitcher.action.variable.type.setConditionValue="Set to condition value" AdvSceneSwitcher.action.variable.type.setConditionValue="Set to condition value"
AdvSceneSwitcher.action.variable.type.roundToInt="Round to nearest integer" AdvSceneSwitcher.action.variable.type.roundToInt="Round to nearest integer"
AdvSceneSwitcher.action.variable.type.subString="Set to substring of current value" AdvSceneSwitcher.action.variable.type.subString="Set to substring of current value"
AdvSceneSwitcher.action.variable.type.findAndReplace="Find and replace in current value"
AdvSceneSwitcher.action.variable.type.mathExpression="Mathematical expression"
AdvSceneSwitcher.action.variable.mathExpression.example="( 1 + 2 * 3 ) / 4"
AdvSceneSwitcher.action.variable.findAndReplace.find="Text to find"
AdvSceneSwitcher.action.variable.findAndReplace.replace="Text to replace with"
AdvSceneSwitcher.action.variable.subString.begin="Beginning" AdvSceneSwitcher.action.variable.subString.begin="Beginning"
AdvSceneSwitcher.action.variable.subString.all="All" AdvSceneSwitcher.action.variable.subString.all="All"
AdvSceneSwitcher.action.variable.invalidSelection="Invalid selection!" 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="{{actions}}{{variables}}{{variables2}}{{strValue}}{{numValue}}{{segmentIndex}}{{mathExpression}}" AdvSceneSwitcher.action.variable.entry="{{actions}}{{variables}}{{variables2}}{{strValue}}{{numValue}}{{segmentIndex}}"
AdvSceneSwitcher.action.variable.entry.substringIndex="Substring start:{{subStringStart}} Substring size:{{subStringSize}}" AdvSceneSwitcher.action.variable.entry.substringIndex="Substring start:{{subStringStart}} Substring size:{{subStringSize}}"
AdvSceneSwitcher.action.variable.entry.substringRegex="Assign value of{{regexMatchIdx}}match using regular expression:" AdvSceneSwitcher.action.variable.entry.substringRegex="Assign value of{{regexMatchIdx}}match using regular expression:"
AdvSceneSwitcher.action.variable.entry.findAndReplace="{{findStr}}{{replaceStr}}"
AdvSceneSwitcher.action.projector="Projector" AdvSceneSwitcher.action.projector="Projector"
AdvSceneSwitcher.action.projector.type.source="Source" AdvSceneSwitcher.action.projector.type.source="Source"
AdvSceneSwitcher.action.projector.type.scene="Scene" AdvSceneSwitcher.action.projector.type.scene="Scene"
@@ -936,15 +921,6 @@ AdvSceneSwitcher.regex.dotMatchNewline=". matches newlines"
AdvSceneSwitcher.regex.multiLine="^ and $ match start/end of line" AdvSceneSwitcher.regex.multiLine="^ and $ match start/end of line"
AdvSceneSwitcher.regex.extendedPattern="Enable Qt's ExtendedPatternSyntax" AdvSceneSwitcher.regex.extendedPattern="Enable Qt's ExtendedPatternSyntax"
AdvSceneSwitcher.process.showAdvanced="Show advanced settings"
AdvSceneSwitcher.process.arguments="Arguments:"
AdvSceneSwitcher.process.addArgument="Add argument"
AdvSceneSwitcher.process.addArgumentDescription="Add new argument:"
AdvSceneSwitcher.process.entry="Run{{filePath}}{{advancedSettings}}"
AdvSceneSwitcher.process.entry.workingDirectory="Working directory:{{workingDirectory}}"
AdvSceneSwitcher.math.expressionFail="Failed evaluate expression"
AdvSceneSwitcher.selectScene="--select scene--" AdvSceneSwitcher.selectScene="--select scene--"
AdvSceneSwitcher.selectPreviousScene="Previous Scene" AdvSceneSwitcher.selectPreviousScene="Previous Scene"
AdvSceneSwitcher.selectCurrentScene="Current Scene" AdvSceneSwitcher.selectCurrentScene="Current Scene"

View File

@@ -422,7 +422,7 @@ AdvSceneSwitcher.action.hotkey.leftMeta="Meta izquierda"
AdvSceneSwitcher.action.hotkey.rightMeta="Meta derecho" AdvSceneSwitcher.action.hotkey.rightMeta="Meta derecho"
AdvSceneSwitcher.action.hotkey.onlyOBS="Enviar pulsación de tecla solo a OBS" AdvSceneSwitcher.action.hotkey.onlyOBS="Enviar pulsación de tecla solo a OBS"
AdvSceneSwitcher.action.hotkey.disabled="No se puede simular la pulsación de teclas: ¡funcionalidad desactivada!" AdvSceneSwitcher.action.hotkey.disabled="No se puede simular la pulsación de teclas: ¡funcionalidad desactivada!"
AdvSceneSwitcher.action.hotkey.entry="Presione {{keys}} durante {{duration}}" AdvSceneSwitcher.action.hotkey.entry="Presione {{keys}} durante {{duration}} milisegundos"
AdvSceneSwitcher.action.sceneOrder="Orden de elementos de escena" AdvSceneSwitcher.action.sceneOrder="Orden de elementos de escena"
AdvSceneSwitcher.action.sceneOrder.type.moveUp="Mover hacia arriba" AdvSceneSwitcher.action.sceneOrder.type.moveUp="Mover hacia arriba"
AdvSceneSwitcher.action.sceneOrder.type.moveDown="Mover hacia abajo" AdvSceneSwitcher.action.sceneOrder.type.moveDown="Mover hacia abajo"

View File

@@ -350,7 +350,7 @@ AdvSceneSwitcher.action.hotkey.leftMeta="Sol Meta"
AdvSceneSwitcher.action.hotkey.rightMeta="Sağ Meta" AdvSceneSwitcher.action.hotkey.rightMeta="Sağ Meta"
AdvSceneSwitcher.action.hotkey.onlyOBS="Tuşa basımı yalnızca OBS'ye gönder" AdvSceneSwitcher.action.hotkey.onlyOBS="Tuşa basımı yalnızca OBS'ye gönder"
AdvSceneSwitcher.action.hotkey.disabled="Tuşa basma simülasyonu yapılamıyor - işlevsellik devre dışı!" AdvSceneSwitcher.action.hotkey.disabled="Tuşa basma simülasyonu yapılamıyor - işlevsellik devre dışı!"
AdvSceneSwitcher.action.hotkey.entry="Bas {{keys}} uygun {{duration}}" AdvSceneSwitcher.action.hotkey.entry="Bas {{keys}} uygun {{duration}} millisaniye"
AdvSceneSwitcher.action.sceneOrder="Sahne öğesi sırası" AdvSceneSwitcher.action.sceneOrder="Sahne öğesi sırası"
AdvSceneSwitcher.action.sceneOrder.type.moveUp="Yukarı taşı" AdvSceneSwitcher.action.sceneOrder.type.moveUp="Yukarı taşı"
AdvSceneSwitcher.action.sceneOrder.type.moveDown="Aşağı indir" AdvSceneSwitcher.action.sceneOrder.type.moveDown="Aşağı indir"

View File

@@ -467,7 +467,7 @@ AdvSceneSwitcher.action.hotkey.leftMeta="左 Meta"
AdvSceneSwitcher.action.hotkey.rightMeta="右 Meta" AdvSceneSwitcher.action.hotkey.rightMeta="右 Meta"
AdvSceneSwitcher.action.hotkey.onlyOBS="仅向OBS发送按键" AdvSceneSwitcher.action.hotkey.onlyOBS="仅向OBS发送按键"
AdvSceneSwitcher.action.hotkey.disabled="无法模拟按键-功能已禁用!" AdvSceneSwitcher.action.hotkey.disabled="无法模拟按键-功能已禁用!"
AdvSceneSwitcher.action.hotkey.entry="按下 {{keys}} for {{duration}}" AdvSceneSwitcher.action.hotkey.entry="按下 {{keys}} for {{duration}} 毫秒"
AdvSceneSwitcher.action.sceneOrder="场景项目顺序" AdvSceneSwitcher.action.sceneOrder="场景项目顺序"
AdvSceneSwitcher.action.sceneOrder.type.moveUp="上移" AdvSceneSwitcher.action.sceneOrder.type.moveUp="上移"
AdvSceneSwitcher.action.sceneOrder.type.moveDown="下移" AdvSceneSwitcher.action.sceneOrder.type.moveDown="下移"
@@ -541,7 +541,7 @@ AdvSceneSwitcher.action.variable.type.append="追加"
AdvSceneSwitcher.action.variable.type.appendVar="追加变量" AdvSceneSwitcher.action.variable.type.appendVar="追加变量"
AdvSceneSwitcher.action.variable.type.increment="增加" AdvSceneSwitcher.action.variable.type.increment="增加"
AdvSceneSwitcher.action.variable.type.decrement="减少" AdvSceneSwitcher.action.variable.type.decrement="减少"
AdvSceneSwitcher.action.variable.entry="{{actions}}{{variables}}{{variables2}}{{strValue}}{{numValue}}{{segmentIndex}}{{mathExpression}}" AdvSceneSwitcher.action.variable.entry="{{actions}}{{variables}}{{variables2}}{{strValue}}{{numValue}}{{segmentIndex}}"
; Transition Tab ; Transition Tab

View File

@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
<path d="m 13.855469 0 l -1.539063 1.4375 c -0.453125 0.421875 -0.53125 1.148438 -0.269531 1.707031 l -5.886719 5.996094 c -0.011718 0 -0.019531 0 -0.03125 0 c -0.257812 -0.128906 -0.550781 -0.183594 -0.839844 -0.148437 c -0.328124 0.046874 -0.632812 0.199218 -0.867187 0.441406 l -3.945313 3.996094 c -0.3906245 0.375 -0.5468745 0.933593 -0.4062495 1.457031 c 0.1406255 0.523437 0.5546875 0.929687 1.0820315 1.058593 c 0.527344 0.132813 1.082031 -0.03125 1.453125 -0.425781 l 3.945312 -3.996093 c 0.472657 -0.453126 0.59375 -1.15625 0.296875 -1.738282 l 5.890625 -5.964844 c 0.558594 0.25 1.273438 0.148438 1.707031 -0.289062 l 1.414063 -1.5625 z m -10.308594 0.0898438 c -0.398437 0 -0.785156 0.0937502 -1.140625 0.2187502 l 1.882812 1.878906 c 0.390626 0.382812 0.390626 1 0 1.386719 l -0.710937 0.707031 c -0.386719 0.386719 -1 0.386719 -1.390625 0 l -1.882812 -1.878906 c -0.125 0.355468 -0.2187505 0.742187 -0.2187505 1.140625 c 0 1.90625 1.5507815 3.453125 3.4609375 3.453125 c 0.402344 0 0.789063 -0.09375 1.144531 -0.21875 l 1.175782 1.171875 h 0.058593 l 2.070313 -2.0625 l -1.203125 -1.203125 c 0.125 -0.359375 0.214843 -0.742188 0.214843 -1.140625 c 0 -1.90625 -1.546874 -3.4531252 -3.460937 -3.4531252 z m 6.550781 7.8906252 l -2.070312 2.066406 c 0.011718 0.027344 0.023437 0.058594 0.03125 0.089844 l 1.144531 1.140625 c -0.125 0.355468 -0.21875 0.742187 -0.21875 1.140625 c 0 1.902343 1.550781 3.449219 3.460937 3.449219 c 0.433594 0 0.855469 -0.101563 1.238282 -0.246094 l -2.007813 -2 c -0.386719 -0.386719 -0.386719 -1.035156 0 -1.417969 l 0.679688 -0.679687 c 0.195312 -0.191407 0.457031 -0.308594 0.710937 -0.308594 s 0.515625 0.117187 0.710938 0.308594 l 1.945312 1.941406 c 0.105469 -0.328125 0.183594 -0.683594 0.183594 -1.046875 c 0 -1.90625 -1.546875 -3.453125 -3.460938 -3.453125 c -0.398437 0 -0.785156 0.09375 -1.140624 0.21875 z m 0 0" fill="#fefefe"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
<g fill="#fefefe">
<path d="m 3 1 c -1.644531 0 -3 1.355469 -3 3 v 8 c 0 1.644531 1.355469 3 3 3 h 8.882812 c 0.832032 0 1.578126 -0.402344 2.054688 -0.9375 c 0.472656 -0.53125 0.738281 -1.167969 0.910156 -1.800781 l 0.972656 -2.609375 c 0.390626 -1.449219 -0.09375 -2.652344 -0.820312 -3.167969 c -0.484375 -0.34375 -0.714844 -0.292969 -1 -0.324219 v -1.160156 c 0 -0.855469 -0.558594 -1.589844 -1.09375 -1.828125 c -0.53125 -0.238281 -1.011719 -0.167969 -1.011719 -0.167969 l 0.105469 -0.003906 h -3.585938 l -1.707031 -1.707031 c -0.1875 -0.1875 -0.441406 -0.292969 -0.707031 -0.292969 z m 0 2 h 2.585938 l 1.707031 1.707031 c 0.1875 0.1875 0.441406 0.292969 0.707031 0.292969 h 4 c 0.035156 0 0.070312 -0.003906 0.105469 -0.007812 c 0 0 0.019531 0.019531 -0.011719 0.003906 c -0.035156 -0.011719 -0.09375 -0.25 -0.09375 0.003906 v 2 c 0 0.550781 0.449219 1 1 1 c 1 0 1.046875 0.703125 0.886719 1.128906 l -0.972657 2.609375 c -0.117187 0.4375 -0.296874 0.800781 -0.472656 0.996094 c -0.175781 0.199219 -0.285156 0.265625 -0.558594 0.265625 h -8.882812 c -0.570312 0 -1 -0.429688 -1 -1 v -8 c 0 -0.570312 0.46875 -0.792969 1 -1 z m 0 0"/>
<path d="m 7 6 l 0.042969 0.003906 c -0.914063 -0.042968 -1.75 0.390625 -2.195313 0.96875 c -0.710937 1.222656 -1.15625 2.277344 -1.800781 3.71875 c -0.171875 0.523438 0.117187 1.089844 0.640625 1.261719 c 0.527344 0.171875 1.09375 -0.117187 1.261719 -0.640625 c 0.488281 -1.011719 0.921875 -1.816406 1.339843 -2.808594 c 0.210938 -0.503906 0.703126 -0.492187 0.898438 -0.503906 h 5.8125 c 0.550781 0 1 -0.449219 1 -1 s -0.449219 -1 -1 -1 z m 0 0"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid meet" viewBox="0 0 640 640" width="640" height="640"><defs><path d="M599.62 325.49C599.62 477.26 476.41 600.47 324.64 600.47C172.88 600.47 49.67 477.26 49.67 325.49C49.67 173.73 172.88 50.52 324.64 50.52C476.41 50.52 599.62 173.73 599.62 325.49Z" id="c3Wyq0kfYS"></path><mask id="maskanTyyngos" x="-20.33" y="-19.48" width="689.95" height="689.95" maskUnits="userSpaceOnUse"><rect x="-20.33" y="-19.48" width="689.95" height="689.95" fill="white"></rect><use xlink:href="#c3Wyq0kfYS" opacity="1" fill="black"></use></mask><path d="M334.97 96.07C339.51 96.07 343.2 99.75 343.2 104.3C343.2 151.24 343.2 283.84 343.2 330.78C343.2 335.32 339.51 339 334.97 339C329.2 339 320.09 339 314.31 339C309.77 339 306.09 335.32 306.09 330.78C306.09 283.84 306.09 151.24 306.09 104.3C306.09 99.75 309.77 96.07 314.31 96.07C320.09 96.07 329.2 96.07 334.97 96.07Z" id="fxMeu932c"></path><path d="M471.96 338.21C471.97 341.31 469.46 343.83 466.37 343.84C434.35 343.93 343.92 344.21 311.91 344.31C308.81 344.32 306.3 341.82 306.29 338.72C306.27 332.42 306.23 319.13 306.21 312.83C306.2 309.73 308.7 307.21 311.8 307.2C343.81 307.11 434.24 306.83 466.25 306.73C469.35 306.72 471.87 309.23 471.88 312.32C471.9 318.62 471.94 331.91 471.96 338.21Z" id="h65nGmP2BL"></path></defs><g><g><g><g mask="url(#maskanTyyngos)"><use xlink:href="#c3Wyq0kfYS" opacity="1" fill-opacity="0" stroke="#fefefe" stroke-width="70" stroke-opacity="1"></use></g></g><g><use xlink:href="#fxMeu932c" opacity="1" fill="#fefefe" fill-opacity="1"></use></g><g><use xlink:href="#h65nGmP2BL" opacity="1" fill="#fefefe" fill-opacity="1"></use></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
<path d="m 13.855469 0 l -1.539063 1.4375 c -0.453125 0.421875 -0.53125 1.148438 -0.269531 1.707031 l -5.886719 5.996094 c -0.011718 0 -0.019531 0 -0.03125 0 c -0.257812 -0.128906 -0.550781 -0.183594 -0.839844 -0.148437 c -0.328124 0.046874 -0.632812 0.199218 -0.867187 0.441406 l -3.945313 3.996094 c -0.3906245 0.375 -0.5468745 0.933593 -0.4062495 1.457031 c 0.1406255 0.523437 0.5546875 0.929687 1.0820315 1.058593 c 0.527344 0.132813 1.082031 -0.03125 1.453125 -0.425781 l 3.945312 -3.996093 c 0.472657 -0.453126 0.59375 -1.15625 0.296875 -1.738282 l 5.890625 -5.964844 c 0.558594 0.25 1.273438 0.148438 1.707031 -0.289062 l 1.414063 -1.5625 z m -10.308594 0.0898438 c -0.398437 0 -0.785156 0.0937502 -1.140625 0.2187502 l 1.882812 1.878906 c 0.390626 0.382812 0.390626 1 0 1.386719 l -0.710937 0.707031 c -0.386719 0.386719 -1 0.386719 -1.390625 0 l -1.882812 -1.878906 c -0.125 0.355468 -0.2187505 0.742187 -0.2187505 1.140625 c 0 1.90625 1.5507815 3.453125 3.4609375 3.453125 c 0.402344 0 0.789063 -0.09375 1.144531 -0.21875 l 1.175782 1.171875 h 0.058593 l 2.070313 -2.0625 l -1.203125 -1.203125 c 0.125 -0.359375 0.214843 -0.742188 0.214843 -1.140625 c 0 -1.90625 -1.546874 -3.4531252 -3.460937 -3.4531252 z m 6.550781 7.8906252 l -2.070312 2.066406 c 0.011718 0.027344 0.023437 0.058594 0.03125 0.089844 l 1.144531 1.140625 c -0.125 0.355468 -0.21875 0.742187 -0.21875 1.140625 c 0 1.902343 1.550781 3.449219 3.460937 3.449219 c 0.433594 0 0.855469 -0.101563 1.238282 -0.246094 l -2.007813 -2 c -0.386719 -0.386719 -0.386719 -1.035156 0 -1.417969 l 0.679688 -0.679687 c 0.195312 -0.191407 0.457031 -0.308594 0.710937 -0.308594 s 0.515625 0.117187 0.710938 0.308594 l 1.945312 1.941406 c 0.105469 -0.328125 0.183594 -0.683594 0.183594 -1.046875 c 0 -1.90625 -1.546875 -3.453125 -3.460938 -3.453125 c -0.398437 0 -0.785156 0.09375 -1.140624 0.21875 z m 0 0" fill="#202020"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
<g fill="#202020">
<path d="m 3 1 c -1.644531 0 -3 1.355469 -3 3 v 8 c 0 1.644531 1.355469 3 3 3 h 8.882812 c 0.832032 0 1.578126 -0.402344 2.054688 -0.9375 c 0.472656 -0.53125 0.738281 -1.167969 0.910156 -1.800781 l 0.972656 -2.609375 c 0.390626 -1.449219 -0.09375 -2.652344 -0.820312 -3.167969 c -0.484375 -0.34375 -0.714844 -0.292969 -1 -0.324219 v -1.160156 c 0 -0.855469 -0.558594 -1.589844 -1.09375 -1.828125 c -0.53125 -0.238281 -1.011719 -0.167969 -1.011719 -0.167969 l 0.105469 -0.003906 h -3.585938 l -1.707031 -1.707031 c -0.1875 -0.1875 -0.441406 -0.292969 -0.707031 -0.292969 z m 0 2 h 2.585938 l 1.707031 1.707031 c 0.1875 0.1875 0.441406 0.292969 0.707031 0.292969 h 4 c 0.035156 0 0.070312 -0.003906 0.105469 -0.007812 c 0 0 0.019531 0.019531 -0.011719 0.003906 c -0.035156 -0.011719 -0.09375 -0.25 -0.09375 0.003906 v 2 c 0 0.550781 0.449219 1 1 1 c 1 0 1.046875 0.703125 0.886719 1.128906 l -0.972657 2.609375 c -0.117187 0.4375 -0.296874 0.800781 -0.472656 0.996094 c -0.175781 0.199219 -0.285156 0.265625 -0.558594 0.265625 h -8.882812 c -0.570312 0 -1 -0.429688 -1 -1 v -8 c 0 -0.570312 0.46875 -0.792969 1 -1 z m 0 0"/>
<path d="m 7 6 l 0.042969 0.003906 c -0.914063 -0.042968 -1.75 0.390625 -2.195313 0.96875 c -0.710937 1.222656 -1.15625 2.277344 -1.800781 3.71875 c -0.171875 0.523438 0.117187 1.089844 0.640625 1.261719 c 0.527344 0.171875 1.09375 -0.117187 1.261719 -0.640625 c 0.488281 -1.011719 0.921875 -1.816406 1.339843 -2.808594 c 0.210938 -0.503906 0.703126 -0.492187 0.898438 -0.503906 h 5.8125 c 0.550781 0 1 -0.449219 1 -1 s -0.449219 -1 -1 -1 z m 0 0"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1,2 +1,3 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid meet" viewBox="0 0 640 640" width="640" height="640"><defs><path d="M599.62 325.49C599.62 477.26 476.41 600.47 324.64 600.47C172.88 600.47 49.67 477.26 49.67 325.49C49.67 173.73 172.88 50.52 324.64 50.52C476.41 50.52 599.62 173.73 599.62 325.49Z" id="c3Wyq0kfYS"></path><mask id="maskanTyyngos" x="-20.33" y="-19.48" width="689.95" height="689.95" maskUnits="userSpaceOnUse"><rect x="-20.33" y="-19.48" width="689.95" height="689.95" fill="white"></rect><use xlink:href="#c3Wyq0kfYS" opacity="1" fill="black"></use></mask><path d="M334.97 96.07C339.51 96.07 343.2 99.75 343.2 104.3C343.2 151.24 343.2 283.84 343.2 330.78C343.2 335.32 339.51 339 334.97 339C329.2 339 320.09 339 314.31 339C309.77 339 306.09 335.32 306.09 330.78C306.09 283.84 306.09 151.24 306.09 104.3C306.09 99.75 309.77 96.07 314.31 96.07C320.09 96.07 329.2 96.07 334.97 96.07Z" id="fxMeu932c"></path><path d="M471.96 338.21C471.97 341.31 469.46 343.83 466.37 343.84C434.35 343.93 343.92 344.21 311.91 344.31C308.81 344.32 306.3 341.82 306.29 338.72C306.27 332.42 306.23 319.13 306.21 312.83C306.2 309.73 308.7 307.21 311.8 307.2C343.81 307.11 434.24 306.83 466.25 306.73C469.35 306.72 471.87 309.23 471.88 312.32C471.9 318.62 471.94 331.91 471.96 338.21Z" id="h65nGmP2BL"></path></defs><g><g><g><g mask="url(#maskanTyyngos)"><use xlink:href="#c3Wyq0kfYS" opacity="1" fill-opacity="0" stroke="#202020" stroke-width="70" stroke-opacity="1"></use></g></g><g><use xlink:href="#fxMeu932c" opacity="1" fill="#202020" fill-opacity="1"></use></g><g><use xlink:href="#h65nGmP2BL" opacity="1" fill="#202020" fill-opacity="1"></use></g></g></g></svg> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid meet" viewBox="0 0 640 640" width="640" height="640"><defs><path d="M599.62 325.49C599.62 477.26 476.41 600.47 324.64 600.47C172.88 600.47 49.67 477.26 49.67 325.49C49.67 173.73 172.88 50.52 324.64 50.52C476.41 50.52 599.62 173.73 599.62 325.49Z" id="c3Wyq0kfYS"></path><mask id="maskanTyyngos" x="-20.33" y="-19.48" width="689.95" height="689.95" maskUnits="userSpaceOnUse"><rect x="-20.33" y="-19.48" width="689.95" height="689.95" fill="white"></rect><use xlink:href="#c3Wyq0kfYS" opacity="1" fill="black"></use></mask><path d="M334.97 96.07C339.51 96.07 343.2 99.75 343.2 104.3C343.2 151.24 343.2 283.84 343.2 330.78C343.2 335.32 339.51 339 334.97 339C329.2 339 320.09 339 314.31 339C309.77 339 306.09 335.32 306.09 330.78C306.09 283.84 306.09 151.24 306.09 104.3C306.09 99.75 309.77 96.07 314.31 96.07C320.09 96.07 329.2 96.07 334.97 96.07Z" id="fxMeu932c"></path><path d="M471.96 338.21C471.97 341.31 469.46 343.83 466.37 343.84C434.35 343.93 343.92 344.21 311.91 344.31C308.81 344.32 306.3 341.82 306.29 338.72C306.27 332.42 306.23 319.13 306.21 312.83C306.2 309.73 308.7 307.21 311.8 307.2C343.81 307.11 434.24 306.83 466.25 306.73C469.35 306.72 471.87 309.23 471.88 312.32C471.9 318.62 471.94 331.91 471.96 338.21Z" id="h65nGmP2BL"></path></defs><g><g><g><g mask="url(#maskanTyyngos)"><use xlink:href="#c3Wyq0kfYS" opacity="1" fill-opacity="0" stroke="#d2d2d2" stroke-width="70" stroke-opacity="1"></use></g></g><g><use xlink:href="#fxMeu932c" opacity="1" fill="#d2d2d2" fill-opacity="1"></use></g><g><use xlink:href="#h65nGmP2BL" opacity="1" fill="#d2d2d2" fill-opacity="1"></use></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

41032
deps/exprtk/exprtk.hpp vendored

File diff suppressed because it is too large Load Diff

View File

@@ -16,9 +16,6 @@
const char *obs_module_text(const char *text) const char *obs_module_text(const char *text)
{ {
if (!switcher) {
return "";
}
return switcher->translate(text); return switcher->translate(text);
} }

View File

@@ -112,8 +112,10 @@ public slots:
void on_noMatchDontSwitch_clicked(); void on_noMatchDontSwitch_clicked();
void on_noMatchSwitch_clicked(); void on_noMatchSwitch_clicked();
void on_noMatchRandomSwitch_clicked(); void on_noMatchRandomSwitch_clicked();
void NoMatchDelayDurationChanged(const Duration &); void NoMatchDelayDurationChanged(double);
void CooldownDurationChanged(const Duration &); void NoMatchDelayUnitChanged(DurationUnit);
void CooldownDurationChanged(double);
void CooldownUnitChanged(DurationUnit);
void on_startupBehavior_currentIndexChanged(int index); void on_startupBehavior_currentIndexChanged(int index);
void on_autoStartEvent_currentIndexChanged(int index); void on_autoStartEvent_currentIndexChanged(int index);
void on_noMatchSwitchScene_currentTextChanged(const QString &text); void on_noMatchSwitchScene_currentTextChanged(const QString &text);

View File

@@ -60,24 +60,44 @@ void AdvSceneSwitcher::on_noMatchRandomSwitch_clicked()
ui->randomDisabledWarning->setVisible(false); ui->randomDisabledWarning->setVisible(false);
} }
void AdvSceneSwitcher::NoMatchDelayDurationChanged(const Duration &dur) void AdvSceneSwitcher::NoMatchDelayDurationChanged(double sec)
{ {
if (loading) { if (loading) {
return; return;
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
switcher->noMatchDelay = dur; switcher->noMatchDelay.seconds = sec;
} }
void AdvSceneSwitcher::CooldownDurationChanged(const Duration &dur) void AdvSceneSwitcher::NoMatchDelayUnitChanged(DurationUnit unit)
{ {
if (loading) { if (loading) {
return; return;
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
switcher->cooldown = dur; switcher->noMatchDelay.displayUnit = unit;
}
void AdvSceneSwitcher::CooldownDurationChanged(double sec)
{
if (loading) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
switcher->cooldown.seconds = sec;
}
void AdvSceneSwitcher::CooldownUnitChanged(DurationUnit unit)
{
if (loading) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
switcher->cooldown.displayUnit = unit;
} }
void AdvSceneSwitcher::on_startupBehavior_currentIndexChanged(int index) void AdvSceneSwitcher::on_startupBehavior_currentIndexChanged(int index)
@@ -538,8 +558,8 @@ void SwitcherData::loadSettings(obs_data_t *obj)
// selections to be available. // selections to be available.
loadSceneGroups(obj); loadSceneGroups(obj);
loadVariables(obj); loadVariables(obj);
loadConnections(obj);
loadMacros(obj); loadMacros(obj);
loadConnections(obj);
loadWindowTitleSwitches(obj); loadWindowTitleSwitches(obj);
loadScreenRegionSwitches(obj); loadScreenRegionSwitches(obj);
loadPauseSwitches(obj); loadPauseSwitches(obj);
@@ -602,9 +622,9 @@ void SwitcherData::saveGeneralSettings(obs_data_t *obj)
obs_data_set_string(obj, "non_matching_scene", obs_data_set_string(obj, "non_matching_scene",
nonMatchingSceneName.c_str()); nonMatchingSceneName.c_str());
obs_data_set_int(obj, "switch_if_not_matching", switchIfNotMatching); obs_data_set_int(obj, "switch_if_not_matching", switchIfNotMatching);
noMatchDelay.Save(obj, "noMatchDelay"); noMatchDelay.Save(obj, "noMatchDelay", "noMatchDelayUnit");
cooldown.Save(obj, "cooldown"); cooldown.Save(obj, "cooldown", "cooldownUnit");
obs_data_set_bool(obj, "active", sceneColletionStop ? true : !stop); obs_data_set_bool(obj, "active", sceneColletionStop ? true : !stop);
sceneColletionStop = false; sceneColletionStop = false;
@@ -652,9 +672,9 @@ void SwitcherData::loadGeneralSettings(obs_data_t *obj)
std::string nonMatchingSceneName = std::string nonMatchingSceneName =
obs_data_get_string(obj, "non_matching_scene"); obs_data_get_string(obj, "non_matching_scene");
nonMatchingScene = GetWeakSourceByName(nonMatchingSceneName.c_str()); nonMatchingScene = GetWeakSourceByName(nonMatchingSceneName.c_str());
noMatchDelay.Load(obj, "noMatchDelay"); noMatchDelay.Load(obj, "noMatchDelay", "noMatchDelayUnit");
cooldown.Load(obj, "cooldown"); cooldown.Load(obj, "cooldown", "cooldownUnit");
stop = !obs_data_get_bool(obj, "active"); stop = !obs_data_get_bool(obj, "active");
startupBehavior = startupBehavior =
@@ -950,9 +970,10 @@ void AdvSceneSwitcher::setupGeneralTab()
noMatchDelay->setToolTip(obs_module_text( noMatchDelay->setToolTip(obs_module_text(
"AdvSceneSwitcher.generalTab.generalBehavior.onNoMetDelayTooltip")); "AdvSceneSwitcher.generalTab.generalBehavior.onNoMetDelayTooltip"));
ui->noMatchLayout->addWidget(noMatchDelay); ui->noMatchLayout->addWidget(noMatchDelay);
QWidget::connect(noMatchDelay, QWidget::connect(noMatchDelay, SIGNAL(DurationChanged(double)), this,
SIGNAL(DurationChanged(const Duration &)), this, SLOT(NoMatchDelayDurationChanged(double)));
SLOT(NoMatchDelayDurationChanged(const Duration &))); QWidget::connect(noMatchDelay, SIGNAL(UnitChanged(DurationUnit)), this,
SLOT(NoMatchDelayUnitChanged(DurationUnit)));
ui->checkInterval->setValue(switcher->interval); ui->checkInterval->setValue(switcher->interval);
@@ -962,9 +983,10 @@ void AdvSceneSwitcher::setupGeneralTab()
"AdvSceneSwitcher.generalTab.generalBehavior.cooldownHint")); "AdvSceneSwitcher.generalTab.generalBehavior.cooldownHint"));
ui->cooldownLayout->addWidget(cooldownTime); ui->cooldownLayout->addWidget(cooldownTime);
ui->cooldownLayout->addStretch(); ui->cooldownLayout->addStretch();
QWidget::connect(cooldownTime, QWidget::connect(cooldownTime, SIGNAL(DurationChanged(double)), this,
SIGNAL(DurationChanged(const Duration &)), this, SLOT(CooldownDurationChanged(double)));
SLOT(CooldownDurationChanged(const Duration &))); QWidget::connect(cooldownTime, SIGNAL(UnitChanged(DurationUnit)), this,
SLOT(CooldownUnitChanged(DurationUnit)));
ui->verboseLogging->setChecked(switcher->verbose); ui->verboseLogging->setChecked(switcher->verbose);
ui->saveWindowGeo->setChecked(switcher->saveWindowGeo); ui->saveWindowGeo->setChecked(switcher->saveWindowGeo);

View File

@@ -156,7 +156,7 @@ void SceneTrigger::logMatch()
blog(LOG_INFO, blog(LOG_INFO,
"scene '%s' in status '%s' triggering action '%s' after %f seconds", "scene '%s' in status '%s' triggering action '%s' after %f seconds",
GetWeakSourceName(scene).c_str(), statusName.c_str(), GetWeakSourceName(scene).c_str(), statusName.c_str(),
actionName.c_str(), duration.Seconds()); actionName.c_str(), duration.seconds);
} }
void frontEndActionThread(sceneTriggerAction action, double delay) void frontEndActionThread(sceneTriggerAction action, double delay)
@@ -266,14 +266,14 @@ void SceneTrigger::performAction()
if (isFrontendAction(triggerAction)) { if (isFrontendAction(triggerAction)) {
t = std::thread(frontEndActionThread, triggerAction, t = std::thread(frontEndActionThread, triggerAction,
duration.Seconds()); duration.seconds);
} else if (isAudioAction(triggerAction)) { } else if (isAudioAction(triggerAction)) {
bool mute = triggerAction == sceneTriggerAction::MUTE_SOURCE; bool mute = triggerAction == sceneTriggerAction::MUTE_SOURCE;
t = std::thread(muteThread, audioSource, duration.Seconds(), t = std::thread(muteThread, audioSource, duration.seconds,
mute); mute);
} else if (isSwitcherStatusAction(triggerAction)) { } else if (isSwitcherStatusAction(triggerAction)) {
bool stop = triggerAction == sceneTriggerAction::STOP_SWITCHER; bool stop = triggerAction == sceneTriggerAction::STOP_SWITCHER;
t = std::thread(statusThread, duration.Seconds(), stop); t = std::thread(statusThread, duration.seconds, stop);
} else { } else {
blog(LOG_WARNING, "ignoring unknown action '%d'", blog(LOG_WARNING, "ignoring unknown action '%d'",
static_cast<int>(triggerAction)); static_cast<int>(triggerAction));
@@ -460,8 +460,10 @@ SceneTriggerWidget::SceneTriggerWidget(QWidget *parent, SceneTrigger *s)
SLOT(TriggerTypeChanged(int))); SLOT(TriggerTypeChanged(int)));
QWidget::connect(actions, SIGNAL(currentIndexChanged(int)), this, QWidget::connect(actions, SIGNAL(currentIndexChanged(int)), this,
SLOT(TriggerActionChanged(int))); SLOT(TriggerActionChanged(int)));
QWidget::connect(duration, SIGNAL(DurationChanged(const Duration &)), QWidget::connect(duration, SIGNAL(DurationChanged(double)), this,
this, SLOT(DurationChanged(const Duration &))); SLOT(DurationChanged(double)));
QWidget::connect(duration, SIGNAL(UnitChanged(DurationUnit)), this,
SLOT(DurationUnitChanged(DurationUnit)));
QWidget::connect(audioSources, QWidget::connect(audioSources,
SIGNAL(currentTextChanged(const QString &)), this, SIGNAL(currentTextChanged(const QString &)), this,
SLOT(AudioSourceChanged(const QString &))); SLOT(AudioSourceChanged(const QString &)));
@@ -550,14 +552,24 @@ void SceneTriggerWidget::TriggerActionChanged(int index)
} }
} }
void SceneTriggerWidget::DurationChanged(const Duration &duration) void SceneTriggerWidget::DurationChanged(double seconds)
{ {
if (loading || !switchData) { if (loading || !switchData) {
return; return;
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
switchData->duration = duration; switchData->duration.seconds = seconds;
}
void SceneTriggerWidget::DurationUnitChanged(DurationUnit unit)
{
if (loading || !switchData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
switchData->duration.displayUnit = unit;
} }
void SceneTriggerWidget::AudioSourceChanged(const QString &text) void SceneTriggerWidget::AudioSourceChanged(const QString &text)

View File

@@ -71,7 +71,8 @@ public:
private slots: private slots:
void TriggerTypeChanged(int index); void TriggerTypeChanged(int index);
void TriggerActionChanged(int index); void TriggerActionChanged(int index);
void DurationChanged(const Duration &); void DurationChanged(double seconds);
void DurationUnitChanged(DurationUnit unit);
void AudioSourceChanged(const QString &text); void AudioSourceChanged(const QString &text);
private: private:

View File

@@ -438,8 +438,8 @@ AudioSwitchWidget::AudioSwitchWidget(QWidget *parent, AudioSwitch *s)
SLOT(VolumeThresholdChanged(int))); SLOT(VolumeThresholdChanged(int)));
QWidget::connect(condition, SIGNAL(currentIndexChanged(int)), this, QWidget::connect(condition, SIGNAL(currentIndexChanged(int)), this,
SLOT(ConditionChanged(int))); SLOT(ConditionChanged(int)));
QWidget::connect(duration, SIGNAL(DurationChanged(const Duration &)), QWidget::connect(duration, SIGNAL(DurationChanged(double)), this,
this, SLOT(DurationChanged(const Duration &))); SLOT(DurationChanged(double)));
QWidget::connect(audioSources, QWidget::connect(audioSources,
SIGNAL(currentTextChanged(const QString &)), this, SIGNAL(currentTextChanged(const QString &)), this,
SLOT(SourceChanged(const QString &))); SLOT(SourceChanged(const QString &)));
@@ -554,14 +554,14 @@ void AudioSwitchWidget::ConditionChanged(int cond)
switchData->condition = (audioCondition)cond; switchData->condition = (audioCondition)cond;
} }
void AudioSwitchWidget::DurationChanged(const Duration &dur) void AudioSwitchWidget::DurationChanged(double sec)
{ {
if (loading || !switchData) { if (loading || !switchData) {
return; return;
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
switchData->duration = dur; switchData->duration.seconds = sec;
} }
void AudioSwitchWidget::IgnoreInactiveChanged(int state) void AudioSwitchWidget::IgnoreInactiveChanged(int state)
@@ -580,8 +580,8 @@ AudioSwitchFallbackWidget::AudioSwitchFallbackWidget(QWidget *parent,
{ {
duration = new DurationSelection(this, false); duration = new DurationSelection(this, false);
QWidget::connect(duration, SIGNAL(DurationChanged(const Duration &)), QWidget::connect(duration, SIGNAL(DurationChanged(double)), this,
this, SLOT(DurationChanged(const Duration &))); SLOT(DurationChanged(double)));
if (s) { if (s) {
duration->SetDuration(s->duration); duration->SetDuration(s->duration);
@@ -602,12 +602,12 @@ AudioSwitchFallbackWidget::AudioSwitchFallbackWidget(QWidget *parent,
loading = false; loading = false;
} }
void AudioSwitchFallbackWidget::DurationChanged(const Duration &dur) void AudioSwitchFallbackWidget::DurationChanged(double sec)
{ {
if (loading || !switchData) { if (loading || !switchData) {
return; return;
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
switchData->duration = dur; switchData->duration.seconds = sec;
} }

View File

@@ -75,7 +75,7 @@ private slots:
void SourceChanged(const QString &text); void SourceChanged(const QString &text);
void VolumeThresholdChanged(int vol); void VolumeThresholdChanged(int vol);
void ConditionChanged(int cond); void ConditionChanged(int cond);
void DurationChanged(const Duration &); void DurationChanged(double dur);
void IgnoreInactiveChanged(int state); void IgnoreInactiveChanged(int state);
private: private:
@@ -96,7 +96,7 @@ public:
AudioSwitchFallbackWidget(QWidget *parent, AudioSwitchFallback *s); AudioSwitchFallbackWidget(QWidget *parent, AudioSwitchFallback *s);
private slots: private slots:
void DurationChanged(const Duration &dur); void DurationChanged(double dur);
private: private:
DurationSelection *duration; DurationSelection *duration;

View File

@@ -455,7 +455,7 @@ bool SceneSequenceSwitch::checkDurationMatchInterruptible()
void SceneSequenceSwitch::prepareUninterruptibleMatch(int &linger) void SceneSequenceSwitch::prepareUninterruptibleMatch(int &linger)
{ {
int dur = delay.Milliseconds(); int dur = delay.seconds * 1000;
if (dur > 0) { if (dur > 0) {
linger = dur; linger = dur;
} }
@@ -588,8 +588,10 @@ SequenceWidget::SequenceWidget(QWidget *parent, SceneSequenceSwitch *s,
QWidget::connect(scenes, SIGNAL(currentTextChanged(const QString &)), QWidget::connect(scenes, SIGNAL(currentTextChanged(const QString &)),
this, SLOT(SceneChanged(const QString &))); this, SLOT(SceneChanged(const QString &)));
QWidget::connect(delay, SIGNAL(DurationChanged(const Duration &)), this, QWidget::connect(delay, SIGNAL(DurationChanged(double)), this,
SLOT(DelayChanged(const Duration &))); SLOT(DelayChanged(double)));
QWidget::connect(delay, SIGNAL(UnitChanged(DurationUnit)), this,
SLOT(DelayUnitsChanged(DurationUnit)));
QWidget::connect(startScenes, QWidget::connect(startScenes,
SIGNAL(currentTextChanged(const QString &)), this, SIGNAL(currentTextChanged(const QString &)), this,
SLOT(StartSceneChanged(const QString &))); SLOT(StartSceneChanged(const QString &)));
@@ -687,14 +689,24 @@ void SequenceWidget::swapSwitchData(SequenceWidget *s1, SequenceWidget *s2)
s2->setSwitchData(t); s2->setSwitchData(t);
} }
void SequenceWidget::DelayChanged(const Duration &delay) void SequenceWidget::DelayChanged(double sec)
{ {
if (loading || !switchData) { if (loading || !switchData) {
return; return;
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
switchData->delay = delay; switchData->delay.seconds = sec;
}
void SequenceWidget::DelayUnitsChanged(DurationUnit unit)
{
if (loading || !switchData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
switchData->delay.displayUnit = unit;
} }
void SequenceWidget::setExtendedSequenceStartScene() void SequenceWidget::setExtendedSequenceStartScene()

View File

@@ -59,7 +59,8 @@ public:
private slots: private slots:
void SceneChanged(const QString &text); void SceneChanged(const QString &text);
void DelayChanged(const Duration &delay); void DelayChanged(double delay);
void DelayUnitsChanged(DurationUnit);
void StartSceneChanged(const QString &text); void StartSceneChanged(const QString &text);
void InterruptibleChanged(int state); void InterruptibleChanged(int state);
void ExtendClicked(); void ExtendClicked();

View File

@@ -114,7 +114,7 @@ void MacroActionAudio::FadeVolume()
int nrSteps = 0; int nrSteps = 0;
float volStep = 0.; float volStep = 0.;
if (_fadeType == FadeType::DURATION) { if (_fadeType == FadeType::DURATION) {
nrSteps = _duration.Milliseconds() / fadeInterval.count(); nrSteps = _duration.seconds * 1000 / fadeInterval.count();
volStep = volDiff / nrSteps; volStep = volDiff / nrSteps;
} else { } else {
volStep = _rate / 1000.0f; volStep = _rate / 1000.0f;
@@ -212,7 +212,7 @@ void MacroActionAudio::LogAction() const
vblog(LOG_INFO, vblog(LOG_INFO,
"performed action \"%s\" for source \"%s\" with volume %d with fade %d %f", "performed action \"%s\" for source \"%s\" with volume %d with fade %d %f",
it->second.c_str(), _audioSource.ToString(true).c_str(), it->second.c_str(), _audioSource.ToString(true).c_str(),
_volume.GetValue(), _fade, _duration.Seconds()); _volume, _fade, _duration.seconds);
} else { } else {
blog(LOG_WARNING, "ignored unknown audio action %d", blog(LOG_WARNING, "ignored unknown audio action %d",
static_cast<int>(_action)); static_cast<int>(_action));
@@ -225,16 +225,15 @@ bool MacroActionAudio::Save(obs_data_t *obj) const
_duration.Save(obj); _duration.Save(obj);
_audioSource.Save(obj, "audioSource"); _audioSource.Save(obj, "audioSource");
obs_data_set_int(obj, "action", static_cast<int>(_action)); obs_data_set_int(obj, "action", static_cast<int>(_action));
obs_data_set_int(obj, "syncOffset", _syncOffset);
obs_data_set_int(obj, "monitor", _monitorType); obs_data_set_int(obj, "monitor", _monitorType);
_syncOffset.Save(obj, "syncOffset"); obs_data_set_double(obj, "balance", _balance);
_balance.Save(obj, "balance"); obs_data_set_int(obj, "volume", _volume);
_volume.Save(obj, "volume"); obs_data_set_double(obj, "rate", _rate);
_rate.Save(obj, "rate");
obs_data_set_bool(obj, "fade", _fade); obs_data_set_bool(obj, "fade", _fade);
obs_data_set_int(obj, "fadeType", static_cast<int>(_fadeType)); obs_data_set_int(obj, "fadeType", static_cast<int>(_fadeType));
obs_data_set_bool(obj, "wait", _wait); obs_data_set_bool(obj, "wait", _wait);
obs_data_set_bool(obj, "abortActiveFade", _abortActiveFade); obs_data_set_bool(obj, "abortActiveFade", _abortActiveFade);
obs_data_set_int(obj, "version", 1);
return true; return true;
} }
@@ -244,19 +243,12 @@ bool MacroActionAudio::Load(obs_data_t *obj)
_duration.Load(obj); _duration.Load(obj);
_audioSource.Load(obj, "audioSource"); _audioSource.Load(obj, "audioSource");
_action = static_cast<Action>(obs_data_get_int(obj, "action")); _action = static_cast<Action>(obs_data_get_int(obj, "action"));
_syncOffset = obs_data_get_int(obj, "syncOffset");
_monitorType = static_cast<obs_monitoring_type>( _monitorType = static_cast<obs_monitoring_type>(
obs_data_get_int(obj, "monitor")); obs_data_get_int(obj, "monitor"));
if (!obs_data_has_user_value(obj, "version")) { _balance = obs_data_get_double(obj, "balance");
_syncOffset = obs_data_get_int(obj, "syncOffset"); _volume = obs_data_get_int(obj, "volume");
_balance = obs_data_get_double(obj, "balance"); _rate = obs_data_get_double(obj, "rate");
_volume = obs_data_get_int(obj, "volume");
_rate = obs_data_get_double(obj, "rate");
} else {
_syncOffset.Load(obj, "syncOffset");
_balance.Load(obj, "balance");
_volume.Load(obj, "volume");
_rate.Load(obj, "rate");
}
_fade = obs_data_get_bool(obj, "fade"); _fade = obs_data_get_bool(obj, "fade");
if (obs_data_has_user_value(obj, "wait")) { if (obs_data_has_user_value(obj, "wait")) {
_wait = obs_data_get_bool(obj, "wait"); _wait = obs_data_get_bool(obj, "wait");
@@ -310,16 +302,16 @@ MacroActionAudioEdit::MacroActionAudioEdit(
_sources(new SourceSelectionWidget(this, QStringList(), true)), _sources(new SourceSelectionWidget(this, QStringList(), true)),
_actions(new QComboBox), _actions(new QComboBox),
_fadeTypes(new QComboBox), _fadeTypes(new QComboBox),
_syncOffset(new VariableSpinBox), _syncOffset(new QSpinBox),
_monitorTypes(new QComboBox), _monitorTypes(new QComboBox),
_balance(new SliderSpinBox( _balance(new SliderSpinBox(
0., 1., "", 0., 1., "",
obs_module_text( obs_module_text(
"AdvSceneSwitcher.action.audio.balance.description"))), "AdvSceneSwitcher.action.audio.balance.description"))),
_volumePercent(new VariableSpinBox), _volumePercent(new QSpinBox),
_fade(new QCheckBox), _fade(new QCheckBox),
_duration(new DurationSelection(parent, false)), _duration(new DurationSelection(parent, false)),
_rate(new VariableDoubleSpinBox), _rate(new QDoubleSpinBox),
_wait(new QCheckBox( _wait(new QCheckBox(
obs_module_text("AdvSceneSwitcher.action.audio.fade.wait"))), obs_module_text("AdvSceneSwitcher.action.audio.fade.wait"))),
_abortActiveFade(new QCheckBox( _abortActiveFade(new QCheckBox(
@@ -351,28 +343,20 @@ MacroActionAudioEdit::MacroActionAudioEdit(
QWidget::connect(_sources, QWidget::connect(_sources,
SIGNAL(SourceChanged(const SourceSelection &)), this, SIGNAL(SourceChanged(const SourceSelection &)), this,
SLOT(SourceChanged(const SourceSelection &))); SLOT(SourceChanged(const SourceSelection &)));
QWidget::connect( QWidget::connect(_syncOffset, SIGNAL(valueChanged(int)), this,
_syncOffset, SLOT(SyncOffsetChanged(int)));
SIGNAL(NumberVariableChanged(const NumberVariable<int> &)), QWidget::connect(_balance, SIGNAL(DoubleValueChanged(double)), this,
this, SLOT(SyncOffsetChanged(const NumberVariable<int> &))); SLOT(BalanceChanged(double)));
QWidget::connect(
_balance,
SIGNAL(DoubleValueChanged(const NumberVariable<double> &)),
this, SLOT(BalanceChanged(const NumberVariable<double> &)));
QWidget::connect(_monitorTypes, SIGNAL(currentIndexChanged(int)), this, QWidget::connect(_monitorTypes, SIGNAL(currentIndexChanged(int)), this,
SLOT(MonitorTypeChanged(int))); SLOT(MonitorTypeChanged(int)));
QWidget::connect( QWidget::connect(_volumePercent, SIGNAL(valueChanged(int)), this,
_volumePercent, SLOT(VolumeChanged(int)));
SIGNAL(NumberVariableChanged(const NumberVariable<int> &)),
this, SLOT(VolumeChanged(const NumberVariable<int> &)));
QWidget::connect(_fade, SIGNAL(stateChanged(int)), this, QWidget::connect(_fade, SIGNAL(stateChanged(int)), this,
SLOT(FadeChanged(int))); SLOT(FadeChanged(int)));
QWidget::connect(_duration, SIGNAL(DurationChanged(const Duration &)), QWidget::connect(_duration, SIGNAL(DurationChanged(double)), this,
this, SLOT(DurationChanged(const Duration &))); SLOT(DurationChanged(double)));
QWidget::connect( QWidget::connect(_rate, SIGNAL(valueChanged(double)), this,
_rate, SLOT(RateChanged(double)));
SIGNAL(NumberVariableChanged(const NumberVariable<double> &)),
this, SLOT(RateChanged(const NumberVariable<double> &)));
QWidget::connect(_wait, SIGNAL(stateChanged(int)), this, QWidget::connect(_wait, SIGNAL(stateChanged(int)), this,
SLOT(WaitChanged(int))); SLOT(WaitChanged(int)));
QWidget::connect(_abortActiveFade, SIGNAL(stateChanged(int)), this, QWidget::connect(_abortActiveFade, SIGNAL(stateChanged(int)), this,
@@ -484,13 +468,13 @@ void MacroActionAudioEdit::UpdateEntryData()
_sources->SetSource(_entryData->_audioSource); _sources->SetSource(_entryData->_audioSource);
_actions->setCurrentIndex( _actions->setCurrentIndex(
_actions->findData(static_cast<int>(_entryData->_action))); _actions->findData(static_cast<int>(_entryData->_action)));
_syncOffset->SetValue(_entryData->_syncOffset); _syncOffset->setValue(_entryData->_syncOffset);
_monitorTypes->setCurrentIndex(_entryData->_monitorType); _monitorTypes->setCurrentIndex(_entryData->_monitorType);
_balance->SetDoubleValue(_entryData->_balance); _balance->SetDoubleValue(_entryData->_balance);
_volumePercent->SetValue(_entryData->_volume); _volumePercent->setValue(_entryData->_volume);
_fade->setChecked(_entryData->_fade); _fade->setChecked(_entryData->_fade);
_duration->SetDuration(_entryData->_duration); _duration->SetDuration(_entryData->_duration);
_rate->SetValue(_entryData->_rate); _rate->setValue(_entryData->_rate);
_wait->setChecked(_entryData->_wait); _wait->setChecked(_entryData->_wait);
_abortActiveFade->setChecked(_entryData->_abortActiveFade); _abortActiveFade->setChecked(_entryData->_abortActiveFade);
_fadeTypes->setCurrentIndex(static_cast<int>(_entryData->_fadeType)); _fadeTypes->setCurrentIndex(static_cast<int>(_entryData->_fadeType));
@@ -521,7 +505,7 @@ void MacroActionAudioEdit::ActionChanged(int idx)
SetWidgetVisibility(); SetWidgetVisibility();
} }
void MacroActionAudioEdit::SyncOffsetChanged(const NumberVariable<int> &value) void MacroActionAudioEdit::SyncOffsetChanged(int value)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
@@ -541,7 +525,7 @@ void MacroActionAudioEdit::MonitorTypeChanged(int value)
_entryData->_monitorType = static_cast<obs_monitoring_type>(value); _entryData->_monitorType = static_cast<obs_monitoring_type>(value);
} }
void MacroActionAudioEdit::BalanceChanged(const NumberVariable<double> &value) void MacroActionAudioEdit::BalanceChanged(double value)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
@@ -551,7 +535,7 @@ void MacroActionAudioEdit::BalanceChanged(const NumberVariable<double> &value)
_entryData->_balance = value; _entryData->_balance = value;
} }
void MacroActionAudioEdit::VolumeChanged(const NumberVariable<int> &value) void MacroActionAudioEdit::VolumeChanged(int value)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
@@ -572,17 +556,17 @@ void MacroActionAudioEdit::FadeChanged(int value)
SetWidgetVisibility(); SetWidgetVisibility();
} }
void MacroActionAudioEdit::DurationChanged(const Duration &dur) void MacroActionAudioEdit::DurationChanged(double seconds)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_duration = dur; _entryData->_duration.seconds = seconds;
} }
void MacroActionAudioEdit::RateChanged(const NumberVariable<double> &value) void MacroActionAudioEdit::RateChanged(double value)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;

View File

@@ -42,13 +42,13 @@ public:
Action _action = Action::MUTE; Action _action = Action::MUTE;
FadeType _fadeType = FadeType::DURATION; FadeType _fadeType = FadeType::DURATION;
NumberVariable<int> _syncOffset = 0; int64_t _syncOffset = 0;
obs_monitoring_type _monitorType = OBS_MONITORING_TYPE_NONE; obs_monitoring_type _monitorType = OBS_MONITORING_TYPE_NONE;
NumberVariable<double> _balance = 0.5; double _balance = 0.5;
NumberVariable<int> _volume = 0; int _volume = 0;
bool _fade = false; bool _fade = false;
Duration _duration; Duration _duration;
NumberVariable<double> _rate = 100.; double _rate = 100.;
bool _wait = false; bool _wait = false;
bool _abortActiveFade = false; bool _abortActiveFade = false;
@@ -84,13 +84,13 @@ public:
private slots: private slots:
void SourceChanged(const SourceSelection &); void SourceChanged(const SourceSelection &);
void ActionChanged(int value); void ActionChanged(int value);
void SyncOffsetChanged(const NumberVariable<int> &value); void SyncOffsetChanged(int value);
void MonitorTypeChanged(int value); void MonitorTypeChanged(int value);
void BalanceChanged(const NumberVariable<double> &value); void BalanceChanged(double value);
void VolumeChanged(const NumberVariable<int> &value); void VolumeChanged(int value);
void FadeChanged(int value); void FadeChanged(int value);
void DurationChanged(const Duration &seconds); void DurationChanged(double seconds);
void RateChanged(const NumberVariable<double> &value); void RateChanged(double value);
void WaitChanged(int value); void WaitChanged(int value);
void AbortActiveFadeChanged(int value); void AbortActiveFadeChanged(int value);
void FadeTypeChanged(int value); void FadeTypeChanged(int value);
@@ -101,13 +101,13 @@ protected:
SourceSelectionWidget *_sources; SourceSelectionWidget *_sources;
QComboBox *_actions; QComboBox *_actions;
QComboBox *_fadeTypes; QComboBox *_fadeTypes;
VariableSpinBox *_syncOffset; QSpinBox *_syncOffset;
QComboBox *_monitorTypes; QComboBox *_monitorTypes;
SliderSpinBox *_balance; SliderSpinBox *_balance;
VariableSpinBox *_volumePercent; QSpinBox *_volumePercent;
QCheckBox *_fade; QCheckBox *_fade;
DurationSelection *_duration; DurationSelection *_duration;
VariableDoubleSpinBox *_rate; QDoubleSpinBox *_rate;
QCheckBox *_wait; QCheckBox *_wait;
QCheckBox *_abortActiveFade; QCheckBox *_abortActiveFade;
QHBoxLayout *_fadeTypeLayout; QHBoxLayout *_fadeTypeLayout;

View File

@@ -55,7 +55,7 @@ void MacroActionFile::LogAction() const
bool MacroActionFile::Save(obs_data_t *obj) const bool MacroActionFile::Save(obs_data_t *obj) const
{ {
MacroAction::Save(obj); MacroAction::Save(obj);
_file.Save(obj, "file"); obs_data_set_string(obj, "file", _file.c_str());
_text.Save(obj, "text"); _text.Save(obj, "text");
obs_data_set_int(obj, "action", static_cast<int>(_action)); obs_data_set_int(obj, "action", static_cast<int>(_action));
return true; return true;
@@ -64,7 +64,7 @@ bool MacroActionFile::Save(obs_data_t *obj) const
bool MacroActionFile::Load(obs_data_t *obj) bool MacroActionFile::Load(obs_data_t *obj)
{ {
MacroAction::Load(obj); MacroAction::Load(obj);
_file.Load(obj, "file"); _file = obs_data_get_string(obj, "file");
_text.Load(obj, "text"); _text.Load(obj, "text");
_action = static_cast<FileAction>(obs_data_get_int(obj, "action")); _action = static_cast<FileAction>(obs_data_get_int(obj, "action"));
return true; return true;
@@ -72,7 +72,7 @@ bool MacroActionFile::Load(obs_data_t *obj)
std::string MacroActionFile::GetShortDesc() const std::string MacroActionFile::GetShortDesc() const
{ {
return _file.UnresolvedValue(); return _file;
} }
static inline void populateActionSelection(QComboBox *list) static inline void populateActionSelection(QComboBox *list)

View File

@@ -24,8 +24,9 @@ public:
return std::make_shared<MacroActionFile>(m); return std::make_shared<MacroActionFile>(m);
} }
StringVariable _file = obs_module_text("AdvSceneSwitcher.enterPath"); std::string _file = obs_module_text("AdvSceneSwitcher.enterPath");
StringVariable _text = obs_module_text("AdvSceneSwitcher.enterText"); VariableResolvingString _text =
obs_module_text("AdvSceneSwitcher.enterText");
FileAction _action = FileAction::WRITE; FileAction _action = FileAction::WRITE;
private: private:

View File

@@ -30,7 +30,7 @@ public:
SourceSelection _source; SourceSelection _source;
OBSWeakSource _filter; OBSWeakSource _filter;
Action _action = Action::ENABLE; Action _action = Action::ENABLE;
StringVariable _settings = ""; VariableResolvingString _settings = "";
private: private:
void ResolveVariables(); void ResolveVariables();

View File

@@ -224,7 +224,7 @@ bool MacroActionHotkey::PerformAction()
} }
if (!keys.empty()) { if (!keys.empty()) {
int dur = _duration.Milliseconds(); int dur = _duration;
if (_onlySendToObs || !canSimulateKeyPresses) { if (_onlySendToObs || !canSimulateKeyPresses) {
std::thread t([keys, dur]() { InjectKeys(keys, dur); }); std::thread t([keys, dur]() { InjectKeys(keys, dur); });
t.detach(); t.detach();
@@ -254,9 +254,8 @@ bool MacroActionHotkey::Save(obs_data_t *obj) const
obs_data_set_bool(obj, "right_alt", _rightAlt); obs_data_set_bool(obj, "right_alt", _rightAlt);
obs_data_set_bool(obj, "left_meta", _leftMeta); obs_data_set_bool(obj, "left_meta", _leftMeta);
obs_data_set_bool(obj, "right_meta", _rightMeta); obs_data_set_bool(obj, "right_meta", _rightMeta);
_duration.Save(obj); obs_data_set_int(obj, "duration", _duration);
obs_data_set_bool(obj, "onlyOBS", _onlySendToObs); obs_data_set_bool(obj, "onlyOBS", _onlySendToObs);
obs_data_set_int(obj, "version", 1);
return true; return true;
} }
@@ -272,11 +271,7 @@ bool MacroActionHotkey::Load(obs_data_t *obj)
_rightAlt = obs_data_get_bool(obj, "right_alt"); _rightAlt = obs_data_get_bool(obj, "right_alt");
_leftMeta = obs_data_get_bool(obj, "left_meta"); _leftMeta = obs_data_get_bool(obj, "left_meta");
_rightMeta = obs_data_get_bool(obj, "right_meta"); _rightMeta = obs_data_get_bool(obj, "right_meta");
if (!obs_data_has_user_value(obj, "version")) { _duration = obs_data_get_int(obj, "duration");
_duration = obs_data_get_int(obj, "duration") / 1000.0;
} else {
_duration.Load(obj);
}
_onlySendToObs = obs_data_get_bool(obj, "onlyOBS"); _onlySendToObs = obs_data_get_bool(obj, "onlyOBS");
return true; return true;
} }
@@ -393,30 +388,32 @@ static inline void populateKeySelection(QComboBox *list)
MacroActionHotkeyEdit::MacroActionHotkeyEdit( MacroActionHotkeyEdit::MacroActionHotkeyEdit(
QWidget *parent, std::shared_ptr<MacroActionHotkey> entryData) QWidget *parent, std::shared_ptr<MacroActionHotkey> entryData)
: QWidget(parent), : QWidget(parent)
_keys(new QComboBox()),
_leftShift(new QCheckBox(
obs_module_text("AdvSceneSwitcher.action.hotkey.leftShift"))),
_rightShift(new QCheckBox(obs_module_text(
"AdvSceneSwitcher.action.hotkey.rightShift"))),
_leftCtrl(new QCheckBox(
obs_module_text("AdvSceneSwitcher.action.hotkey.leftCtrl"))),
_rightCtrl(new QCheckBox(
obs_module_text("AdvSceneSwitcher.action.hotkey.rightCtrl"))),
_leftAlt(new QCheckBox(
obs_module_text("AdvSceneSwitcher.action.hotkey.leftAlt"))),
_rightAlt(new QCheckBox(
obs_module_text("AdvSceneSwitcher.action.hotkey.rightAlt"))),
_leftMeta(new QCheckBox(
obs_module_text("AdvSceneSwitcher.action.hotkey.leftMeta"))),
_rightMeta(new QCheckBox(
obs_module_text("AdvSceneSwitcher.action.hotkey.rightMeta"))),
_duration(new DurationSelection(this, false)),
_onlySendToOBS(new QCheckBox(
obs_module_text("AdvSceneSwitcher.action.hotkey.onlyOBS"))),
_noKeyPressSimulationWarning(new QLabel(
obs_module_text("AdvSceneSwitcher.action.hotkey.disabled")))
{ {
_keys = new QComboBox();
_leftShift = new QCheckBox(
obs_module_text("AdvSceneSwitcher.action.hotkey.leftShift"));
_rightShift = new QCheckBox(
obs_module_text("AdvSceneSwitcher.action.hotkey.rightShift"));
_leftCtrl = new QCheckBox(
obs_module_text("AdvSceneSwitcher.action.hotkey.leftCtrl"));
_rightCtrl = new QCheckBox(
obs_module_text("AdvSceneSwitcher.action.hotkey.rightCtrl"));
_leftAlt = new QCheckBox(
obs_module_text("AdvSceneSwitcher.action.hotkey.leftAlt"));
_rightAlt = new QCheckBox(
obs_module_text("AdvSceneSwitcher.action.hotkey.rightAlt"));
_leftMeta = new QCheckBox(
obs_module_text("AdvSceneSwitcher.action.hotkey.leftMeta"));
_rightMeta = new QCheckBox(
obs_module_text("AdvSceneSwitcher.action.hotkey.rightMeta"));
_duration = new QSpinBox();
_duration->setMaximum(5000);
_onlySendToOBS = new QCheckBox(
obs_module_text("AdvSceneSwitcher.action.hotkey.onlyOBS"));
_noKeyPressSimulationWarning = new QLabel(
obs_module_text("AdvSceneSwitcher.action.hotkey.disabled"));
populateKeySelection(_keys); populateKeySelection(_keys);
QWidget::connect(_keys, SIGNAL(currentIndexChanged(int)), this, QWidget::connect(_keys, SIGNAL(currentIndexChanged(int)), this,
@@ -437,8 +434,8 @@ MacroActionHotkeyEdit::MacroActionHotkeyEdit(
SLOT(LMetaChanged(int))); SLOT(LMetaChanged(int)));
QWidget::connect(_rightMeta, SIGNAL(stateChanged(int)), this, QWidget::connect(_rightMeta, SIGNAL(stateChanged(int)), this,
SLOT(RMetaChanged(int))); SLOT(RMetaChanged(int)));
QWidget::connect(_duration, SIGNAL(DurationChanged(const Duration &)), QWidget::connect(_duration, SIGNAL(valueChanged(int)), this,
this, SLOT(DurationChanged(const Duration &))); SLOT(DurationChanged(int)));
QWidget::connect(_onlySendToOBS, SIGNAL(stateChanged(int)), this, QWidget::connect(_onlySendToOBS, SIGNAL(stateChanged(int)), this,
SLOT(OnlySendToOBSChanged(int))); SLOT(OnlySendToOBSChanged(int)));
@@ -496,7 +493,7 @@ void MacroActionHotkeyEdit::UpdateEntryData()
_rightAlt->setChecked(_entryData->_rightAlt); _rightAlt->setChecked(_entryData->_rightAlt);
_leftMeta->setChecked(_entryData->_leftMeta); _leftMeta->setChecked(_entryData->_leftMeta);
_rightMeta->setChecked(_entryData->_rightMeta); _rightMeta->setChecked(_entryData->_rightMeta);
_duration->SetDuration(_entryData->_duration); _duration->setValue(_entryData->_duration);
_onlySendToOBS->setChecked(_entryData->_onlySendToObs || _onlySendToOBS->setChecked(_entryData->_onlySendToObs ||
!canSimulateKeyPresses); !canSimulateKeyPresses);
SetWarningVisibility(); SetWarningVisibility();
@@ -582,14 +579,14 @@ void MacroActionHotkeyEdit::RMetaChanged(int state)
_entryData->_rightMeta = state; _entryData->_rightMeta = state;
} }
void MacroActionHotkeyEdit::DurationChanged(const Duration &dur) void MacroActionHotkeyEdit::DurationChanged(int ms)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_duration = dur; _entryData->_duration = ms;
} }
void MacroActionHotkeyEdit::OnlySendToOBSChanged(int state) void MacroActionHotkeyEdit::OnlySendToOBSChanged(int state)

View File

@@ -1,7 +1,6 @@
#pragma once #pragma once
#include "macro-action-edit.hpp" #include "macro-action-edit.hpp"
#include "hotkey.hpp" #include "hotkey.hpp"
#include "duration-control.hpp"
#include <QComboBox> #include <QComboBox>
#include <QCheckBox> #include <QCheckBox>
@@ -31,7 +30,7 @@ public:
bool _rightAlt = false; bool _rightAlt = false;
bool _leftMeta = false; bool _leftMeta = false;
bool _rightMeta = false; bool _rightMeta = false;
Duration _duration = 0.3; int _duration = 300; // in ms
#ifdef __APPLE__ #ifdef __APPLE__
bool _onlySendToObs = true; bool _onlySendToObs = true;
#else #else
@@ -69,7 +68,7 @@ private slots:
void RAltChanged(int state); void RAltChanged(int state);
void LMetaChanged(int state); void LMetaChanged(int state);
void RMetaChanged(int state); void RMetaChanged(int state);
void DurationChanged(const Duration &); void DurationChanged(int ms);
void OnlySendToOBSChanged(int state); void OnlySendToOBSChanged(int state);
protected: protected:
@@ -82,7 +81,7 @@ protected:
QCheckBox *_rightAlt; QCheckBox *_rightAlt;
QCheckBox *_leftMeta; QCheckBox *_leftMeta;
QCheckBox *_rightMeta; QCheckBox *_rightMeta;
DurationSelection *_duration; QSpinBox *_duration;
QCheckBox *_onlySendToOBS; QCheckBox *_onlySendToOBS;
QLabel *_noKeyPressSimulationWarning; QLabel *_noKeyPressSimulationWarning;

View File

@@ -27,26 +27,11 @@ size_t WriteCB(void *ptr, size_t size, size_t nmemb, std::string *buffer)
return size * nmemb; return size * nmemb;
} }
void MacroActionHttp::SetupHeaders()
{
if (!_setHeaders) {
return;
}
struct curl_slist *headers = nullptr;
for (auto &header : _headers) {
headers = switcher->curl.SlistAppend(headers, header.c_str());
}
if (!_headers.empty()) {
switcher->curl.SetOpt(CURLOPT_HTTPHEADER, headers);
}
}
void MacroActionHttp::Get() void MacroActionHttp::Get()
{ {
switcher->curl.SetOpt(CURLOPT_URL, _url.c_str()); switcher->curl.SetOpt(CURLOPT_URL, _url.c_str());
switcher->curl.SetOpt(CURLOPT_HTTPGET, 1L); switcher->curl.SetOpt(CURLOPT_HTTPGET, 1L);
switcher->curl.SetOpt(CURLOPT_TIMEOUT_MS, _timeout.Milliseconds()); switcher->curl.SetOpt(CURLOPT_TIMEOUT_MS, _timeout.seconds * 1000);
SetupHeaders();
std::string response; std::string response;
if (IsReferencedInVars()) { if (IsReferencedInVars()) {
@@ -64,8 +49,7 @@ void MacroActionHttp::Post()
{ {
switcher->curl.SetOpt(CURLOPT_URL, _url.c_str()); switcher->curl.SetOpt(CURLOPT_URL, _url.c_str());
switcher->curl.SetOpt(CURLOPT_POSTFIELDS, _data.c_str()); switcher->curl.SetOpt(CURLOPT_POSTFIELDS, _data.c_str());
switcher->curl.SetOpt(CURLOPT_TIMEOUT_MS, _timeout.Milliseconds()); switcher->curl.SetOpt(CURLOPT_TIMEOUT_MS, _timeout.seconds * 1000);
SetupHeaders();
switcher->curl.Perform(); switcher->curl.Perform();
} }
@@ -106,10 +90,8 @@ void MacroActionHttp::LogAction() const
bool MacroActionHttp::Save(obs_data_t *obj) const bool MacroActionHttp::Save(obs_data_t *obj) const
{ {
MacroAction::Save(obj); MacroAction::Save(obj);
_url.Save(obj, "url"); obs_data_set_string(obj, "url", _url.c_str());
_data.Save(obj, "data"); _data.Save(obj, "data");
obs_data_set_bool(obj, "setHeaders", _setHeaders);
_headers.Save(obj, "headers", "header");
obs_data_set_int(obj, "method", static_cast<int>(_method)); obs_data_set_int(obj, "method", static_cast<int>(_method));
_timeout.Save(obj); _timeout.Save(obj);
return true; return true;
@@ -118,10 +100,8 @@ bool MacroActionHttp::Save(obs_data_t *obj) const
bool MacroActionHttp::Load(obs_data_t *obj) bool MacroActionHttp::Load(obs_data_t *obj)
{ {
MacroAction::Load(obj); MacroAction::Load(obj);
_url.Load(obj, "url"); _url = obs_data_get_string(obj, "url");
_data.Load(obj, "data"); _data.Load(obj, "data");
_setHeaders = obs_data_get_bool(obj, "setHeaders");
_headers.Load(obj, "headers", "header");
_method = static_cast<Method>(obs_data_get_int(obj, "method")); _method = static_cast<Method>(obs_data_get_int(obj, "method"));
_timeout.Load(obj); _timeout.Load(obj);
return true; return true;
@@ -129,7 +109,7 @@ bool MacroActionHttp::Load(obs_data_t *obj)
std::string MacroActionHttp::GetShortDesc() const std::string MacroActionHttp::GetShortDesc() const
{ {
return _url.UnresolvedValue(); return _url;
} }
static inline void populateMethodSelection(QComboBox *list) static inline void populateMethodSelection(QComboBox *list)
@@ -142,15 +122,9 @@ static inline void populateMethodSelection(QComboBox *list)
MacroActionHttpEdit::MacroActionHttpEdit( MacroActionHttpEdit::MacroActionHttpEdit(
QWidget *parent, std::shared_ptr<MacroActionHttp> entryData) QWidget *parent, std::shared_ptr<MacroActionHttp> entryData)
: QWidget(parent), : QWidget(parent),
_url(new VariableLineEdit(this)), _url(new QLineEdit()),
_methods(new QComboBox()), _methods(new QComboBox()),
_data(new VariableTextEdit(this)), _data(new VariableTextEdit(this)),
_setHeaders(new QCheckBox(
obs_module_text("AdvSceneSwitcher.action.http.setHeaders"))),
_headerListLayout(new QVBoxLayout()),
_headerList(new StringListEdit(
this, obs_module_text("AdvSceneSwitcher.action.http.headers"),
obs_module_text("AdvSceneSwitcher.action.http.addHeader"))),
_timeout(new DurationSelection(this, false)) _timeout(new DurationSelection(this, false))
{ {
populateMethodSelection(_methods); populateMethodSelection(_methods);
@@ -161,13 +135,8 @@ MacroActionHttpEdit::MacroActionHttpEdit(
SLOT(DataChanged())); SLOT(DataChanged()));
QWidget::connect(_methods, SIGNAL(currentIndexChanged(int)), this, QWidget::connect(_methods, SIGNAL(currentIndexChanged(int)), this,
SLOT(MethodChanged(int))); SLOT(MethodChanged(int)));
QWidget::connect(_setHeaders, SIGNAL(stateChanged(int)), this, QWidget::connect(_timeout, SIGNAL(DurationChanged(double)), this,
SLOT(SetHeadersChanged(int))); SLOT(TimeoutChanged(double)));
QWidget::connect(_headerList,
SIGNAL(StringListChanged(const StringList &)), this,
SLOT(HeadersChanged(const StringList &)));
QWidget::connect(_timeout, SIGNAL(DurationChanged(const Duration &)),
this, SLOT(TimeoutChanged(const Duration &)));
std::unordered_map<std::string, QWidget *> widgetPlaceholders = { std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
{"{{url}}", _url}, {"{{url}}", _url},
@@ -184,14 +153,8 @@ MacroActionHttpEdit::MacroActionHttpEdit(
obs_module_text("AdvSceneSwitcher.action.http.entry.line2"), obs_module_text("AdvSceneSwitcher.action.http.entry.line2"),
timeoutLayout, widgetPlaceholders); timeoutLayout, widgetPlaceholders);
_headerListLayout->addWidget(new QLabel(
obs_module_text("AdvSceneSwitcher.action.http.headers")));
_headerListLayout->addWidget(_headerList);
QVBoxLayout *mainLayout = new QVBoxLayout; QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addLayout(actionLayout); mainLayout->addLayout(actionLayout);
mainLayout->addWidget(_setHeaders);
mainLayout->addLayout(_headerListLayout);
mainLayout->addWidget(_data); mainLayout->addWidget(_data);
mainLayout->addLayout(timeoutLayout); mainLayout->addLayout(timeoutLayout);
setLayout(mainLayout); setLayout(mainLayout);
@@ -207,10 +170,8 @@ void MacroActionHttpEdit::UpdateEntryData()
return; return;
} }
_url->setText(_entryData->_url); _url->setText(QString::fromStdString(_entryData->_url));
_data->setPlainText(_entryData->_data); _data->setPlainText(_entryData->_data);
_setHeaders->setChecked(_entryData->_setHeaders);
_headerList->SetStringList(_entryData->_headers);
_methods->setCurrentIndex(static_cast<int>(_entryData->_method)); _methods->setCurrentIndex(static_cast<int>(_entryData->_method));
_timeout->SetDuration(_entryData->_timeout); _timeout->SetDuration(_entryData->_timeout);
SetWidgetVisibility(); SetWidgetVisibility();
@@ -238,43 +199,28 @@ void MacroActionHttpEdit::MethodChanged(int value)
SetWidgetVisibility(); SetWidgetVisibility();
} }
void MacroActionHttpEdit::TimeoutChanged(const Duration &dur) void MacroActionHttpEdit::TimeoutChanged(double seconds)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_timeout = dur; _entryData->_timeout.seconds = seconds;
}
void MacroActionHttpEdit::SetHeadersChanged(int value)
{
if (_loading || !_entryData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_setHeaders = value;
SetWidgetVisibility();
}
void MacroActionHttpEdit::HeadersChanged(const StringList &headers)
{
if (_loading || !_entryData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_headers = headers;
adjustSize();
updateGeometry();
} }
void MacroActionHttpEdit::SetWidgetVisibility() void MacroActionHttpEdit::SetWidgetVisibility()
{ {
_data->setVisible(_entryData->_method == MacroActionHttp::Method::POST); switch (_entryData->_method) {
setLayoutVisible(_headerListLayout, _entryData->_setHeaders); case MacroActionHttp::Method::GET:
_data->hide();
break;
case MacroActionHttp::Method::POST:
_data->show();
break;
default:
break;
}
adjustSize(); adjustSize();
updateGeometry(); updateGeometry();

View File

@@ -1,13 +1,10 @@
#pragma once #pragma once
#include "macro-action-edit.hpp" #include "macro-action-edit.hpp"
#include "variable-text-edit.hpp" #include "variable-text-edit.hpp"
#include "variable-line-edit.hpp"
#include "duration-control.hpp" #include "duration-control.hpp"
#include "string-list.hpp"
#include <QLineEdit> #include <QLineEdit>
#include <QComboBox> #include <QComboBox>
#include <QCheckBox>
class MacroActionHttp : public MacroAction { class MacroActionHttp : public MacroAction {
public: public:
@@ -28,15 +25,13 @@ public:
POST, POST,
}; };
StringVariable _url = obs_module_text("AdvSceneSwitcher.enterURL"); std::string _url = obs_module_text("AdvSceneSwitcher.enterURL");
StringVariable _data = obs_module_text("AdvSceneSwitcher.enterText"); VariableResolvingString _data =
bool _setHeaders = false; obs_module_text("AdvSceneSwitcher.enterText");
StringList _headers;
Method _method = Method::GET; Method _method = Method::GET;
Duration _timeout = Duration(1.0); Duration _timeout;
private: private:
void SetupHeaders();
void Get(); void Get();
void Post(); void Post();
@@ -64,9 +59,7 @@ private slots:
void DataChanged(); void DataChanged();
void URLChanged(); void URLChanged();
void MethodChanged(int); void MethodChanged(int);
void TimeoutChanged(const Duration &seconds); void TimeoutChanged(double seconds);
void SetHeadersChanged(int);
void HeadersChanged(const StringList &);
signals: signals:
void HeaderInfoChanged(const QString &); void HeaderInfoChanged(const QString &);
@@ -76,12 +69,9 @@ protected:
private: private:
void SetWidgetVisibility(); void SetWidgetVisibility();
VariableLineEdit *_url; QLineEdit *_url;
QComboBox *_methods; QComboBox *_methods;
VariableTextEdit *_data; VariableTextEdit *_data;
QCheckBox *_setHeaders;
QVBoxLayout *_headerListLayout;
StringListEdit *_headerList;
DurationSelection *_timeout; DurationSelection *_timeout;
bool _loading = true; bool _loading = true;
}; };

View File

@@ -21,28 +21,27 @@ const static std::map<PerformMacroAction, std::string> actionTypes = {
bool MacroActionMacro::PerformAction() bool MacroActionMacro::PerformAction()
{ {
auto macro = _macro.GetMacro(); if (!_macro.get()) {
if (!macro) {
return true; return true;
} }
switch (_action) { switch (_action) {
case PerformMacroAction::PAUSE: case PerformMacroAction::PAUSE:
macro->SetPaused(); _macro->SetPaused();
break; break;
case PerformMacroAction::UNPAUSE: case PerformMacroAction::UNPAUSE:
macro->SetPaused(false); _macro->SetPaused(false);
break; break;
case PerformMacroAction::RESET_COUNTER: case PerformMacroAction::RESET_COUNTER:
macro->ResetRunCount(); _macro->ResetRunCount();
break; break;
case PerformMacroAction::RUN: case PerformMacroAction::RUN:
if (!macro->Paused()) { if (!_macro->Paused()) {
macro->PerformActions(); _macro->PerformActions();
} }
break; break;
case PerformMacroAction::STOP: case PerformMacroAction::STOP:
macro->Stop(); _macro->Stop();
break; break;
default: default:
break; break;
@@ -52,27 +51,26 @@ bool MacroActionMacro::PerformAction()
void MacroActionMacro::LogAction() const void MacroActionMacro::LogAction() const
{ {
auto macro = _macro.GetMacro(); if (!_macro.get()) {
if (!macro) {
return; return;
} }
switch (_action) { switch (_action) {
case PerformMacroAction::PAUSE: case PerformMacroAction::PAUSE:
vblog(LOG_INFO, "paused \"%s\"", macro->Name().c_str()); vblog(LOG_INFO, "paused \"%s\"", _macro->Name().c_str());
break; break;
case PerformMacroAction::UNPAUSE: case PerformMacroAction::UNPAUSE:
vblog(LOG_INFO, "unpaused \"%s\"", macro->Name().c_str()); vblog(LOG_INFO, "unpaused \"%s\"", _macro->Name().c_str());
break; break;
case PerformMacroAction::RESET_COUNTER: case PerformMacroAction::RESET_COUNTER:
vblog(LOG_INFO, "reset counter for \"%s\"", vblog(LOG_INFO, "reset counter for \"%s\"",
macro->Name().c_str()); _macro->Name().c_str());
break; break;
case PerformMacroAction::RUN: case PerformMacroAction::RUN:
vblog(LOG_INFO, "run nested macro \"%s\"", vblog(LOG_INFO, "run nested macro \"%s\"",
macro->Name().c_str()); _macro->Name().c_str());
break; break;
case PerformMacroAction::STOP: case PerformMacroAction::STOP:
vblog(LOG_INFO, "stopped macro \"%s\"", macro->Name().c_str()); vblog(LOG_INFO, "stopped macro \"%s\"", _macro->Name().c_str());
break; break;
default: default:
break; break;
@@ -98,7 +96,10 @@ bool MacroActionMacro::Load(obs_data_t *obj)
std::string MacroActionMacro::GetShortDesc() const std::string MacroActionMacro::GetShortDesc() const
{ {
return _macro.Name(); if (_macro.get()) {
return _macro->Name();
}
return "";
} }
static inline void populateActionSelection(QComboBox *list) static inline void populateActionSelection(QComboBox *list)
@@ -119,6 +120,8 @@ MacroActionMacroEdit::MacroActionMacroEdit(
QWidget::connect(_macros, SIGNAL(currentTextChanged(const QString &)), QWidget::connect(_macros, SIGNAL(currentTextChanged(const QString &)),
this, SLOT(MacroChanged(const QString &))); this, SLOT(MacroChanged(const QString &)));
QWidget::connect(parent, SIGNAL(MacroRemoved(const QString &)), this,
SLOT(MacroRemove(const QString &)));
QWidget::connect(_actions, SIGNAL(currentIndexChanged(int)), this, QWidget::connect(_actions, SIGNAL(currentIndexChanged(int)), this,
SLOT(ActionChanged(int))); SLOT(ActionChanged(int)));
@@ -142,7 +145,7 @@ void MacroActionMacroEdit::UpdateEntryData()
return; return;
} }
_actions->setCurrentIndex(static_cast<int>(_entryData->_action)); _actions->setCurrentIndex(static_cast<int>(_entryData->_action));
_macros->SetCurrentMacro(_entryData->_macro); _macros->SetCurrentMacro(_entryData->_macro.get());
if (_entryData->_action == PerformMacroAction::RUN || if (_entryData->_action == PerformMacroAction::RUN ||
_entryData->_action == PerformMacroAction::STOP) { _entryData->_action == PerformMacroAction::STOP) {
_macros->HideSelectedMacro(); _macros->HideSelectedMacro();
@@ -156,7 +159,7 @@ void MacroActionMacroEdit::MacroChanged(const QString &text)
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_macro = text; _entryData->_macro.UpdateRef(text);
emit HeaderInfoChanged( emit HeaderInfoChanged(
QString::fromStdString(_entryData->GetShortDesc())); QString::fromStdString(_entryData->GetShortDesc()));
} }
@@ -177,3 +180,10 @@ void MacroActionMacroEdit::ActionChanged(int value)
_macros->ShowAllMacros(); _macros->ShowAllMacros();
} }
} }
void MacroActionMacroEdit::MacroRemove(const QString &)
{
if (_entryData) {
_entryData->_macro.UpdateRef();
}
}

View File

@@ -51,6 +51,7 @@ public:
private slots: private slots:
void MacroChanged(const QString &text); void MacroChanged(const QString &text);
void MacroRemove(const QString &name);
void ActionChanged(int value); void ActionChanged(int value);
signals: signals:
void HeaderInfoChanged(const QString &); void HeaderInfoChanged(const QString &);

View File

@@ -48,7 +48,7 @@ bool MacroActionMedia::PerformAction()
obs_source_media_previous(source); obs_source_media_previous(source);
break; break;
case MediaAction::SEEK: case MediaAction::SEEK:
obs_source_media_set_time(source, _seek.Milliseconds()); obs_source_media_set_time(source, _seek.seconds * 1000);
break; break;
default: default:
break; break;
@@ -116,8 +116,10 @@ MacroActionMediaEdit::MacroActionMediaEdit(
QWidget::connect(_sources, QWidget::connect(_sources,
SIGNAL(SourceChanged(const SourceSelection &)), this, SIGNAL(SourceChanged(const SourceSelection &)), this,
SLOT(SourceChanged(const SourceSelection &))); SLOT(SourceChanged(const SourceSelection &)));
QWidget::connect(_seek, SIGNAL(DurationChanged(const Duration &)), this, QWidget::connect(_seek, SIGNAL(DurationChanged(double)), this,
SLOT(DurationChanged(const Duration &))); SLOT(DurationChanged(double)));
QWidget::connect(_seek, SIGNAL(UnitChanged(DurationUnit)), this,
SLOT(DurationUnitChanged(DurationUnit)));
QHBoxLayout *mainLayout = new QHBoxLayout; QHBoxLayout *mainLayout = new QHBoxLayout;
std::unordered_map<std::string, QWidget *> widgetPlaceholders = { std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
@@ -169,14 +171,24 @@ void MacroActionMediaEdit::ActionChanged(int value)
SetWidgetVisibility(); SetWidgetVisibility();
} }
void MacroActionMediaEdit::DurationChanged(const Duration &dur) void MacroActionMediaEdit::DurationChanged(double seconds)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_seek = dur; _entryData->_seek.seconds = seconds;
}
void MacroActionMediaEdit::DurationUnitChanged(DurationUnit unit)
{
if (_loading || !_entryData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_seek.displayUnit = unit;
} }
void MacroActionMediaEdit::SetWidgetVisibility() void MacroActionMediaEdit::SetWidgetVisibility()

View File

@@ -58,7 +58,8 @@ public:
private slots: private slots:
void SourceChanged(const SourceSelection &); void SourceChanged(const SourceSelection &);
void ActionChanged(int value); void ActionChanged(int value);
void DurationChanged(const Duration &value); void DurationChanged(double value);
void DurationUnitChanged(DurationUnit unit);
signals: signals:
void HeaderInfoChanged(const QString &); void HeaderInfoChanged(const QString &);

View File

@@ -102,7 +102,7 @@ bool MacroActionPluginState::Save(obs_data_t *obj) const
obs_data_set_int(obj, "action", static_cast<int>(_action)); obs_data_set_int(obj, "action", static_cast<int>(_action));
obs_data_set_int(obj, "value", _value); obs_data_set_int(obj, "value", _value);
obs_data_set_string(obj, "scene", GetWeakSourceName(_scene).c_str()); obs_data_set_string(obj, "scene", GetWeakSourceName(_scene).c_str());
_settingsPath.Save(obj, "settingsPath"); obs_data_set_string(obj, "settingsPath", _settingsPath.c_str());
return true; return true;
} }
@@ -114,7 +114,7 @@ bool MacroActionPluginState::Load(obs_data_t *obj)
_value = obs_data_get_int(obj, "value"); _value = obs_data_get_int(obj, "value");
const char *sceneName = obs_data_get_string(obj, "scene"); const char *sceneName = obs_data_get_string(obj, "scene");
_scene = GetWeakSourceByName(sceneName); _scene = GetWeakSourceByName(sceneName);
_settingsPath.Load(obj, "settingsPath"); _settingsPath = obs_data_get_string(obj, "settingsPath");
return true; return true;
} }
@@ -185,7 +185,7 @@ void MacroActionPluginStateEdit::UpdateEntryData()
populateValueSelection(_values, _entryData->_action); populateValueSelection(_values, _entryData->_action);
_values->setCurrentIndex(_entryData->_value); _values->setCurrentIndex(_entryData->_value);
_scenes->setCurrentText(GetWeakSourceName(_entryData->_scene).c_str()); _scenes->setCurrentText(GetWeakSourceName(_entryData->_scene).c_str());
_settings->SetPath(_entryData->_settingsPath); _settings->SetPath(QString::fromStdString(_entryData->_settingsPath));
SetWidgetVisibility(); SetWidgetVisibility();
} }

View File

@@ -26,7 +26,7 @@ public:
PluginStateAction _action = PluginStateAction::STOP; PluginStateAction _action = PluginStateAction::STOP;
int _value = 0; int _value = 0;
StringVariable _settingsPath; std::string _settingsPath;
OBSWeakSource _scene; OBSWeakSource _scene;
private: private:

View File

@@ -249,7 +249,7 @@ void MacroActionProjectorEdit::MonitorChanged(int value)
_entryData->_monitor = value; _entryData->_monitor = value;
} }
void MacroActionProjectorEdit::WindowTypeChanged(int) void MacroActionProjectorEdit::WindowTypeChanged(int value)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;

View File

@@ -11,30 +11,22 @@ bool MacroActionRandom::_registered = MacroActionFactory::Register(
{MacroActionRandom::Create, MacroActionRandomEdit::Create, {MacroActionRandom::Create, MacroActionRandomEdit::Create,
"AdvSceneSwitcher.action.random"}); "AdvSceneSwitcher.action.random"});
static bool validNextMacro(const std::shared_ptr<Macro> &macro) std::vector<MacroRef> getNextMacros(std::vector<MacroRef> &macros,
MacroRef &lastRandomMacro, bool allowRepeat)
{ {
return macro && !macro->Paused(); std::vector<MacroRef> res;
}
static std::vector<std::shared_ptr<Macro>>
getNextMacros(std::vector<MacroRef> &macros, MacroRef &lastRandomMacroRef,
bool allowRepeat)
{
std::vector<std::shared_ptr<Macro>> res;
if (macros.size() == 1) { if (macros.size() == 1) {
auto macro = macros[0].GetMacro(); if (!macros[0].get() || macros[0]->Paused()) {
if (validNextMacro(macro)) { return res;
res.push_back(macro); } else {
return macros;
} }
return res;
} }
auto lastRandomMacro = lastRandomMacroRef.GetMacro();
for (auto &m : macros) { for (auto &m : macros) {
auto macro = m.GetMacro(); if (m.get() && !m->Paused() &&
if (validNextMacro(macro) && (allowRepeat || (lastRandomMacro.get() != m.get()))) {
(allowRepeat || (lastRandomMacro != macro))) { res.push_back(m);
res.push_back(macro);
} }
} }
return res; return res;
@@ -50,7 +42,7 @@ bool MacroActionRandom::PerformAction()
if (macros.size() == 0) { if (macros.size() == 0) {
return true; return true;
} }
if (macros.size() == 1) { if (macros.size() == 1 && macros[0].get()) {
lastRandomMacro = macros[0]; lastRandomMacro = macros[0];
return macros[0]->PerformActions(); return macros[0]->PerformActions();
} }
@@ -134,7 +126,8 @@ void MacroActionRandomEdit::MacroRemove(const QString &)
auto it = _entryData->_macros.begin(); auto it = _entryData->_macros.begin();
while (it != _entryData->_macros.end()) { while (it != _entryData->_macros.end()) {
if (!it->GetMacro()) { it->UpdateRef();
if (it->get() == nullptr) {
it = _entryData->_macros.erase(it); it = _entryData->_macros.erase(it);
} else { } else {
++it; ++it;
@@ -195,9 +188,9 @@ bool MacroActionRandomEdit::ShouldShowAllowRepeat()
if (_entryData->_macros.size() <= 1) { if (_entryData->_macros.size() <= 1) {
return false; return false;
} }
const auto macro = _entryData->_macros[0].GetMacro(); const auto macro = _entryData->_macros[0];
for (const auto &m : _entryData->_macros) { for (const auto &m : _entryData->_macros) {
if (macro != m.GetMacro()) { if (macro.get() != m.get()) {
return true; return true;
} }
} }

View File

@@ -1,8 +1,10 @@
#include "macro-action-run.hpp" #include "macro-action-run.hpp"
#include "advanced-scene-switcher.hpp" #include "advanced-scene-switcher.hpp"
#include "name-dialog.hpp"
#include "utility.hpp" #include "utility.hpp"
#include <QProcess> #include <QProcess>
#include <QFileDialog>
#include <QDesktopServices> #include <QDesktopServices>
const std::string MacroActionRun::id = "run"; const std::string MacroActionRun::id = "run";
@@ -13,53 +15,137 @@ bool MacroActionRun::_registered = MacroActionFactory::Register(
bool MacroActionRun::PerformAction() bool MacroActionRun::PerformAction()
{ {
bool procStarted = QProcess::startDetached( if (!QProcess::startDetached(
QString::fromStdString(_procConfig.Path()), _procConfig.Args(), QString::fromStdString(_path), _args,
QString::fromStdString(_procConfig.WorkingDir())); QString::fromStdString(_workingDirectory)) &&
if (!procStarted && _procConfig.Args().empty()) { _args.empty()) {
vblog(LOG_INFO, "run \"%s\" using QDesktopServices", vblog(LOG_INFO, "run \"%s\" using QDesktopServices",
_procConfig.Path().c_str()); _path.c_str());
QDesktopServices::openUrl(QUrl::fromLocalFile( QDesktopServices::openUrl(
QString::fromStdString(_procConfig.Path()))); QUrl::fromLocalFile(QString::fromStdString(_path)));
} }
return true; return true;
} }
void MacroActionRun::LogAction() const void MacroActionRun::LogAction() const
{ {
vblog(LOG_INFO, "run \"%s\"", _procConfig.UnresolvedPath().c_str()); vblog(LOG_INFO, "run \"%s\"", _path.c_str());
} }
bool MacroActionRun::Save(obs_data_t *obj) const bool MacroActionRun::Save(obs_data_t *obj) const
{ {
MacroAction::Save(obj); MacroAction::Save(obj);
_procConfig.Save(obj); obs_data_set_string(obj, "path", _path.c_str());
obs_data_set_string(obj, "workingDirectory", _workingDirectory.c_str());
obs_data_array_t *args = obs_data_array_create();
for (auto &arg : _args) {
obs_data_t *array_obj = obs_data_create();
obs_data_set_string(array_obj, "arg",
arg.toStdString().c_str());
obs_data_array_push_back(args, array_obj);
obs_data_release(array_obj);
}
obs_data_set_array(obj, "args", args);
obs_data_array_release(args);
return true; return true;
} }
bool MacroActionRun::Load(obs_data_t *obj) bool MacroActionRun::Load(obs_data_t *obj)
{ {
MacroAction::Load(obj); MacroAction::Load(obj);
_procConfig.Load(obj); _path = obs_data_get_string(obj, "path");
_workingDirectory = obs_data_get_string(obj, "workingDirectory");
obs_data_array_t *args = obs_data_get_array(obj, "args");
size_t count = obs_data_array_count(args);
for (size_t i = 0; i < count; i++) {
obs_data_t *array_obj = obs_data_array_item(args, i);
_args << QString::fromStdString(
obs_data_get_string(array_obj, "arg"));
obs_data_release(array_obj);
}
obs_data_array_release(args);
return true; return true;
} }
std::string MacroActionRun::GetShortDesc() const std::string MacroActionRun::GetShortDesc() const
{ {
return _procConfig.UnresolvedPath(); return _path;
} }
MacroActionRunEdit::MacroActionRunEdit( MacroActionRunEdit::MacroActionRunEdit(
QWidget *parent, std::shared_ptr<MacroActionRun> entryData) QWidget *parent, std::shared_ptr<MacroActionRun> entryData)
: QWidget(parent), _procConfig(new ProcessConfigEdit(this)) : QWidget(parent),
_filePath(new FileSelection()),
_argList(new QListWidget()),
_addArg(new QPushButton()),
_removeArg(new QPushButton()),
_argUp(new QPushButton()),
_argDown(new QPushButton()),
_workingDirectory(new FileSelection(FileSelection::Type::FOLDER))
{ {
QWidget::connect(_procConfig, _addArg->setMaximumWidth(22);
SIGNAL(ConfigChanged(const ProcessConfig &)), this, _addArg->setProperty("themeID",
SLOT(ProcessConfigChanged(const ProcessConfig &))); QVariant(QString::fromUtf8("addIconSmall")));
_addArg->setFlat(true);
_removeArg->setMaximumWidth(22);
_removeArg->setProperty("themeID",
QVariant(QString::fromUtf8("removeIconSmall")));
_removeArg->setFlat(true);
_argUp->setMaximumWidth(22);
_argUp->setProperty("themeID",
QVariant(QString::fromUtf8("upArrowIconSmall")));
_argUp->setFlat(true);
_argDown->setMaximumWidth(22);
_argDown->setProperty(
"themeID", QVariant(QString::fromUtf8("downArrowIconSmall")));
_argDown->setFlat(true);
auto *layout = new QVBoxLayout; QWidget::connect(_filePath, SIGNAL(PathChanged(const QString &)), this,
layout->addWidget(_procConfig); SLOT(PathChanged(const QString &)));
setLayout(layout); QWidget::connect(_addArg, SIGNAL(clicked()), this, SLOT(AddArg()));
QWidget::connect(_removeArg, SIGNAL(clicked()), this,
SLOT(RemoveArg()));
QWidget::connect(_argUp, SIGNAL(clicked()), this, SLOT(ArgUp()));
QWidget::connect(_argDown, SIGNAL(clicked()), this, SLOT(ArgDown()));
QWidget::connect(_argList, SIGNAL(itemDoubleClicked(QListWidgetItem *)),
this, SLOT(ArgItemClicked(QListWidgetItem *)));
QWidget::connect(_workingDirectory,
SIGNAL(PathChanged(const QString &)), this,
SLOT(WorkingDirectoryChanged(const QString &)));
auto *entryLayout = new QHBoxLayout;
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
{"{{filePath}}", _filePath},
{"{{workingDirectory}}", _workingDirectory},
};
placeWidgets(obs_module_text("AdvSceneSwitcher.action.run.entry"),
entryLayout, widgetPlaceholders, false);
auto argButtonLayout = new QHBoxLayout;
argButtonLayout->addWidget(_addArg);
argButtonLayout->addWidget(_removeArg);
QFrame *line = new QFrame();
line->setFrameShape(QFrame::VLine);
line->setFrameShadow(QFrame::Sunken);
argButtonLayout->addWidget(line);
argButtonLayout->addWidget(_argUp);
argButtonLayout->addWidget(_argDown);
argButtonLayout->addStretch();
auto workingDirectoryLayout = new QHBoxLayout;
placeWidgets(
obs_module_text(
"AdvSceneSwitcher.action.run.entry.workingDirectory"),
workingDirectoryLayout, widgetPlaceholders, false);
auto *mainLayout = new QVBoxLayout;
mainLayout->addLayout(entryLayout);
mainLayout->addWidget(new QLabel(
obs_module_text("AdvSceneSwitcher.action.run.arguments")));
mainLayout->addWidget(_argList);
mainLayout->addLayout(argButtonLayout);
mainLayout->addLayout(workingDirectoryLayout);
setLayout(mainLayout);
_entryData = entryData; _entryData = entryData;
UpdateEntryData(); UpdateEntryData();
@@ -71,19 +157,142 @@ void MacroActionRunEdit::UpdateEntryData()
if (!_entryData) { if (!_entryData) {
return; return;
} }
_procConfig->SetProcessConfig(_entryData->_procConfig); _filePath->SetPath(QString::fromStdString(_entryData->_path));
for (auto &arg : _entryData->_args) {
QListWidgetItem *item = new QListWidgetItem(arg, _argList);
item->setData(Qt::UserRole, arg);
}
_workingDirectory->SetPath(
QString::fromStdString(_entryData->_workingDirectory));
SetArgListSize();
} }
void MacroActionRunEdit::ProcessConfigChanged(const ProcessConfig &conf) void MacroActionRunEdit::PathChanged(const QString &text)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_procConfig = conf; _entryData->_path = text.toUtf8().constData();
adjustSize();
updateGeometry();
emit HeaderInfoChanged( emit HeaderInfoChanged(
QString::fromStdString(_entryData->GetShortDesc())); QString::fromStdString(_entryData->GetShortDesc()));
} }
void MacroActionRunEdit::AddArg()
{
if (_loading || !_entryData) {
return;
}
std::string name;
bool accepted = AdvSSNameDialog::AskForName(
this,
obs_module_text("AdvSceneSwitcher.action.run.addArgument"),
obs_module_text(
"AdvSceneSwitcher.action.run.addArgumentDescription"),
name, "", 170, false);
if (!accepted || name.empty()) {
return;
}
auto arg = QString::fromStdString(name);
QVariant v = QVariant::fromValue(arg);
QListWidgetItem *item = new QListWidgetItem(arg, _argList);
item->setData(Qt::UserRole, arg);
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_args << arg;
SetArgListSize();
}
void MacroActionRunEdit::RemoveArg()
{
if (_loading || !_entryData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
int idx = _argList->currentRow();
if (idx == -1) {
return;
}
_entryData->_args.removeAt(idx);
QListWidgetItem *item = _argList->currentItem();
if (!item) {
return;
}
delete item;
SetArgListSize();
}
void MacroActionRunEdit::ArgUp()
{
if (_loading || !_entryData) {
return;
}
int idx = _argList->currentRow();
if (idx != -1 && idx != 0) {
_argList->insertItem(idx - 1, _argList->takeItem(idx));
_argList->setCurrentRow(idx - 1);
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_args.move(idx, idx - 1);
}
}
void MacroActionRunEdit::ArgDown()
{
int idx = _argList->currentRow();
if (idx != -1 && idx != _argList->count() - 1) {
_argList->insertItem(idx + 1, _argList->takeItem(idx));
_argList->setCurrentRow(idx + 1);
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_args.move(idx, idx + 1);
}
}
void MacroActionRunEdit::ArgItemClicked(QListWidgetItem *item)
{
if (_loading || !_entryData) {
return;
}
std::string name;
bool accepted = AdvSSNameDialog::AskForName(
this,
obs_module_text("AdvSceneSwitcher.action.run.addArgument"),
obs_module_text(
"AdvSceneSwitcher.action.run.addArgumentDescription"),
name, item->text(), 170, false);
if (!accepted || name.empty()) {
return;
}
auto arg = QString::fromStdString(name);
QVariant v = QVariant::fromValue(arg);
item->setText(arg);
item->setData(Qt::UserRole, arg);
int idx = _argList->currentRow();
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_args[idx] = arg;
}
void MacroActionRunEdit::WorkingDirectoryChanged(const QString &path)
{
if (_loading || !_entryData) {
return;
}
_entryData->_workingDirectory = path.toStdString();
}
void MacroActionRunEdit::SetArgListSize()
{
setHeightToContentHeight(_argList);
adjustSize();
}

View File

@@ -1,6 +1,11 @@
#pragma once #pragma once
#include "macro-action-edit.hpp" #include "macro-action-edit.hpp"
#include "process-config.hpp" #include "file-selection.hpp"
#include <QLineEdit>
#include <QPushButton>
#include <QListWidget>
#include <QStringList>
class MacroActionRun : public MacroAction { class MacroActionRun : public MacroAction {
public: public:
@@ -16,7 +21,9 @@ public:
return std::make_shared<MacroActionRun>(m); return std::make_shared<MacroActionRun>(m);
} }
ProcessConfig _procConfig; std::string _path = obs_module_text("AdvSceneSwitcher.enterPath");
std::string _workingDirectory = "";
QStringList _args;
private: private:
static bool _registered; static bool _registered;
@@ -39,7 +46,13 @@ public:
} }
private slots: private slots:
void ProcessConfigChanged(const ProcessConfig &); void PathChanged(const QString &text);
void AddArg();
void RemoveArg();
void ArgUp();
void ArgDown();
void ArgItemClicked(QListWidgetItem *);
void WorkingDirectoryChanged(const QString &text);
signals: signals:
void HeaderInfoChanged(const QString &); void HeaderInfoChanged(const QString &);
@@ -47,6 +60,14 @@ protected:
std::shared_ptr<MacroActionRun> _entryData; std::shared_ptr<MacroActionRun> _entryData;
private: private:
ProcessConfigEdit *_procConfig; void SetArgListSize();
FileSelection *_filePath;
QListWidget *_argList;
QPushButton *_addArg;
QPushButton *_removeArg;
QPushButton *_argUp;
QPushButton *_argDown;
FileSelection *_workingDirectory;
bool _loading = true; bool _loading = true;
}; };

View File

@@ -103,7 +103,7 @@ bool MacroActionSwitchScene::WaitForTransition(OBSWeakSource &scene,
OBSWeakSource &transition) OBSWeakSource &transition)
{ {
const int expectedTransitionDuration = getExpectedTransitionDuration( const int expectedTransitionDuration = getExpectedTransitionDuration(
scene, transition, _duration.Seconds()); scene, transition, _duration.seconds);
switcher->abortMacroWait = false; switcher->abortMacroWait = false;
std::unique_lock<std::mutex> lock(switcher->m); std::unique_lock<std::mutex> lock(switcher->m);
@@ -121,7 +121,7 @@ bool MacroActionSwitchScene::PerformAction()
{ {
auto scene = _scene.GetScene(); auto scene = _scene.GetScene();
auto transition = _transition.GetTransition(); auto transition = _transition.GetTransition();
switchScene({scene, transition, (int)(_duration.Milliseconds())}, switchScene({scene, transition, (int)(_duration.seconds * 1000)},
obs_frontend_preview_program_mode_active()); obs_frontend_preview_program_mode_active());
if (_blockUntilTransitionDone && scene) { if (_blockUntilTransitionDone && scene) {
return WaitForTransition(scene, transition); return WaitForTransition(scene, transition);
@@ -196,8 +196,8 @@ MacroActionSwitchSceneEdit::MacroActionSwitchSceneEdit(
SIGNAL(TransitionChanged(const TransitionSelection &)), SIGNAL(TransitionChanged(const TransitionSelection &)),
this, this,
SLOT(TransitionChanged(const TransitionSelection &))); SLOT(TransitionChanged(const TransitionSelection &)));
QWidget::connect(_duration, SIGNAL(DurationChanged(const Duration &)), QWidget::connect(_duration, SIGNAL(DurationChanged(double)), this,
this, SLOT(DurationChanged(const Duration &))); SLOT(DurationChanged(double)));
QWidget::connect(_blockUntilTransitionDone, SIGNAL(stateChanged(int)), QWidget::connect(_blockUntilTransitionDone, SIGNAL(stateChanged(int)),
this, SLOT(BlockUntilTransitionDoneChanged(int))); this, SLOT(BlockUntilTransitionDoneChanged(int)));
@@ -225,14 +225,14 @@ MacroActionSwitchSceneEdit::MacroActionSwitchSceneEdit(
_loading = false; _loading = false;
} }
void MacroActionSwitchSceneEdit::DurationChanged(const Duration &dur) void MacroActionSwitchSceneEdit::DurationChanged(double seconds)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_duration = dur; _entryData->_duration.seconds = seconds;
} }
void MacroActionSwitchSceneEdit::BlockUntilTransitionDoneChanged(int state) void MacroActionSwitchSceneEdit::BlockUntilTransitionDoneChanged(int state)

View File

@@ -51,7 +51,7 @@ public:
private slots: private slots:
void SceneChanged(const SceneSelection &); void SceneChanged(const SceneSelection &);
void TransitionChanged(const TransitionSelection &); void TransitionChanged(const TransitionSelection &);
void DurationChanged(const Duration &seconds); void DurationChanged(double seconds);
void BlockUntilTransitionDoneChanged(int state); void BlockUntilTransitionDoneChanged(int state);
signals: signals:
void HeaderInfoChanged(const QString &); void HeaderInfoChanged(const QString &);

View File

@@ -22,7 +22,7 @@ public:
SceneSelection _scene; SceneSelection _scene;
SceneItemSelection _source; SceneItemSelection _source;
StringVariable _settings = ""; VariableResolvingString _settings = "";
private: private:
void ApplySettings(const std::string &); void ApplySettings(const std::string &);

View File

@@ -87,7 +87,7 @@ bool MacroActionScreenshot::Save(obs_data_t *obj) const
_source.Save(obj); _source.Save(obj);
obs_data_set_int(obj, "saveType", static_cast<int>(_saveType)); obs_data_set_int(obj, "saveType", static_cast<int>(_saveType));
obs_data_set_int(obj, "targetType", static_cast<int>(_targetType)); obs_data_set_int(obj, "targetType", static_cast<int>(_targetType));
_path.Save(obj, "savePath"); obs_data_set_string(obj, "savePath", _path.c_str());
obs_data_set_int(obj, "version", _version); obs_data_set_int(obj, "version", _version);
return true; return true;
} }
@@ -100,7 +100,7 @@ bool MacroActionScreenshot::Load(obs_data_t *obj)
_saveType = static_cast<SaveType>(obs_data_get_int(obj, "saveType")); _saveType = static_cast<SaveType>(obs_data_get_int(obj, "saveType"));
_targetType = _targetType =
static_cast<TargetType>(obs_data_get_int(obj, "targetType")); static_cast<TargetType>(obs_data_get_int(obj, "targetType"));
_path.Load(obj, "savePath"); _path = obs_data_get_string(obj, "savePath");
// TODO: Remove fallback for older versions // TODO: Remove fallback for older versions
if (!obs_data_has_user_value(obj, "version")) { if (!obs_data_has_user_value(obj, "version")) {
@@ -200,7 +200,7 @@ void MacroActionScreenshotEdit::UpdateEntryData()
_scenes->SetScene(_entryData->_scene); _scenes->SetScene(_entryData->_scene);
_saveType->setCurrentIndex(static_cast<int>(_entryData->_saveType)); _saveType->setCurrentIndex(static_cast<int>(_entryData->_saveType));
_targetType->setCurrentIndex(static_cast<int>(_entryData->_targetType)); _targetType->setCurrentIndex(static_cast<int>(_entryData->_targetType));
_savePath->SetPath(_entryData->_path); _savePath->SetPath(QString::fromStdString(_entryData->_path));
SetWidgetVisibility(); SetWidgetVisibility();
} }
@@ -243,7 +243,7 @@ void MacroActionScreenshotEdit::PathChanged(const QString &text)
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_path = text.toStdString(); _entryData->_path = text.toUtf8().constData();
} }
void MacroActionScreenshotEdit::SourceChanged(const SourceSelection &source) void MacroActionScreenshotEdit::SourceChanged(const SourceSelection &source)

View File

@@ -33,7 +33,7 @@ public:
TargetType _targetType = TargetType::SOURCE; TargetType _targetType = TargetType::SOURCE;
SceneSelection _scene; SceneSelection _scene;
SourceSelection _source; SourceSelection _source;
StringVariable _path = obs_module_text("AdvSceneSwitcher.enterPath"); std::string _path = obs_module_text("AdvSceneSwitcher.enterPath");
private: private:
void FrontendScreenshot(OBSWeakSource &); void FrontendScreenshot(OBSWeakSource &);

View File

@@ -12,8 +12,7 @@ bool MacroActionSequence::_registered = MacroActionFactory::Register(
int getNextUnpausedMacroIdx(std::vector<MacroRef> &macros, int startIdx) int getNextUnpausedMacroIdx(std::vector<MacroRef> &macros, int startIdx)
{ {
for (; (int)macros.size() > startIdx; ++startIdx) { for (; (int)macros.size() > startIdx; ++startIdx) {
auto macro = macros[startIdx].GetMacro(); if (macros[startIdx].get() && !macros[startIdx]->Paused()) {
if (macro && !macro->Paused()) {
return startIdx; return startIdx;
} }
} }
@@ -59,7 +58,7 @@ bool MacroActionSequence::PerformAction()
return true; return true;
} }
auto macro = GetNextMacro().GetMacro(); auto macro = GetNextMacro();
if (!macro.get()) { if (!macro.get()) {
return true; return true;
} }
@@ -159,8 +158,8 @@ void MacroActionSequenceEdit::MacroRemove(const QString &)
auto it = _entryData->_macros.begin(); auto it = _entryData->_macros.begin();
while (it != _entryData->_macros.end()) { while (it != _entryData->_macros.end()) {
it->UpdateRef();
if (!it->GetMacro()) { if (it->get() == nullptr) {
it = _entryData->_macros.erase(it); it = _entryData->_macros.erase(it);
} else { } else {
++it; ++it;
@@ -251,11 +250,12 @@ void MacroActionSequenceEdit::UpdateStatusLine()
QString nextMacroName = QString nextMacroName =
obs_module_text("AdvSceneSwitcher.action.sequence.status.none"); obs_module_text("AdvSceneSwitcher.action.sequence.status.none");
if (_entryData) { if (_entryData) {
if (auto macro = _entryData->_lastSequenceMacro.GetMacro()) { if (_entryData->_lastSequenceMacro.get()) {
lastMacroName = QString::fromStdString(macro->Name()); lastMacroName = QString::fromStdString(
_entryData->_lastSequenceMacro->Name());
} }
auto next = _entryData->GetNextMacro(false).GetMacro(); auto next = _entryData->GetNextMacro(false);
if (next) { if (next.get()) {
nextMacroName = QString::fromStdString(next->Name()); nextMacroName = QString::fromStdString(next->Name());
} }
} }

View File

@@ -41,7 +41,7 @@ public:
SourceSelection _source; SourceSelection _source;
SourceSettingButton _button; SourceSettingButton _button;
StringVariable _settings = ""; VariableResolvingString _settings = "";
SourceAction _action = SourceAction::ENABLE; SourceAction _action = SourceAction::ENABLE;
private: private:

View File

@@ -22,11 +22,10 @@ static std::map<TimerAction, std::string> timerActions = {
bool MacroActionTimer::PerformAction() bool MacroActionTimer::PerformAction()
{ {
auto macro = _macro.GetMacro(); if (!_macro.get()) {
if (!macro) {
return true; return true;
} }
for (auto c : macro->Conditions()) { for (auto c : _macro->Conditions()) {
if (c->GetId() != "timer") { if (c->GetId() != "timer") {
continue; continue;
} }
@@ -48,7 +47,7 @@ bool MacroActionTimer::PerformAction()
break; break;
case TimerAction::SET_TIME_REMAINING: case TimerAction::SET_TIME_REMAINING:
timerCondition->_duration.SetTimeRemaining( timerCondition->_duration.SetTimeRemaining(
_duration.Seconds()); _duration.seconds);
break; break;
default: default:
break; break;
@@ -59,27 +58,26 @@ bool MacroActionTimer::PerformAction()
void MacroActionTimer::LogAction() const void MacroActionTimer::LogAction() const
{ {
auto macro = _macro.GetMacro(); if (!_macro.get()) {
if (!macro) {
return; return;
} }
switch (_actionType) { switch (_actionType) {
case TimerAction::PAUSE: case TimerAction::PAUSE:
vblog(LOG_INFO, "paused timers on \"%s\"", vblog(LOG_INFO, "paused timers on \"%s\"",
macro->Name().c_str()); _macro->Name().c_str());
break; break;
case TimerAction::CONTINUE: case TimerAction::CONTINUE:
vblog(LOG_INFO, "continued timers on \"%s\"", vblog(LOG_INFO, "continued timers on \"%s\"",
macro->Name().c_str()); _macro->Name().c_str());
break; break;
case TimerAction::RESET: case TimerAction::RESET:
vblog(LOG_INFO, "reset timers on \"%s\"", vblog(LOG_INFO, "reset timers on \"%s\"",
macro->Name().c_str()); _macro->Name().c_str());
break; break;
case TimerAction::SET_TIME_REMAINING: case TimerAction::SET_TIME_REMAINING:
vblog(LOG_INFO, vblog(LOG_INFO,
"set time remaining of timers on \"%s\" to \"%s\"", "set time remaining of timers on \"%s\" to \"%s\"",
macro->Name().c_str(), _duration.ToString().c_str()); _macro->Name().c_str(), _duration.ToString().c_str());
break; break;
default: default:
break; break;
@@ -107,7 +105,10 @@ bool MacroActionTimer::Load(obs_data_t *obj)
std::string MacroActionTimer::GetShortDesc() const std::string MacroActionTimer::GetShortDesc() const
{ {
return _macro.Name(); if (_macro.get()) {
return _macro->Name();
}
return "";
} }
static inline void populateTypeSelection(QComboBox *list) static inline void populateTypeSelection(QComboBox *list)
@@ -129,8 +130,12 @@ MacroActionTimerEdit::MacroActionTimerEdit(
QWidget::connect(_macros, SIGNAL(currentTextChanged(const QString &)), QWidget::connect(_macros, SIGNAL(currentTextChanged(const QString &)),
this, SLOT(MacroChanged(const QString &))); this, SLOT(MacroChanged(const QString &)));
QWidget::connect(_duration, SIGNAL(DurationChanged(const Duration &)), QWidget::connect(parent, SIGNAL(MacroRemoved(const QString &)), this,
this, SLOT(DurationChanged(const Duration &))); SLOT(MacroRemove(const QString &)));
QWidget::connect(_duration, SIGNAL(DurationChanged(double)), this,
SLOT(DurationChanged(double)));
QWidget::connect(_duration, SIGNAL(UnitChanged(DurationUnit)), this,
SLOT(DurationUnitChanged(DurationUnit)));
QWidget::connect(_timerAction, SIGNAL(currentIndexChanged(int)), this, QWidget::connect(_timerAction, SIGNAL(currentIndexChanged(int)), this,
SLOT(ActionTypeChanged(int))); SLOT(ActionTypeChanged(int)));
@@ -155,7 +160,7 @@ void MacroActionTimerEdit::UpdateEntryData()
return; return;
} }
_macros->SetCurrentMacro(_entryData->_macro); _macros->SetCurrentMacro(_entryData->_macro.get());
_duration->SetDuration(_entryData->_duration); _duration->SetDuration(_entryData->_duration);
_timerAction->setCurrentIndex( _timerAction->setCurrentIndex(
static_cast<int>(_entryData->_actionType)); static_cast<int>(_entryData->_actionType));
@@ -183,14 +188,24 @@ void MacroActionTimerEdit::SetWidgetVisibility()
adjustSize(); adjustSize();
} }
void MacroActionTimerEdit::DurationChanged(const Duration &dur) void MacroActionTimerEdit::DurationChanged(double seconds)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_duration = dur; _entryData->_duration.seconds = seconds;
}
void MacroActionTimerEdit::DurationUnitChanged(DurationUnit unit)
{
if (_loading || !_entryData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_duration.displayUnit = unit;
} }
void MacroActionTimerEdit::MacroChanged(const QString &text) void MacroActionTimerEdit::MacroChanged(const QString &text)
@@ -200,7 +215,14 @@ void MacroActionTimerEdit::MacroChanged(const QString &text)
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_macro = text; _entryData->_macro.UpdateRef(text);
emit HeaderInfoChanged( emit HeaderInfoChanged(
QString::fromStdString(_entryData->GetShortDesc())); QString::fromStdString(_entryData->GetShortDesc()));
} }
void MacroActionTimerEdit::MacroRemove(const QString &)
{
if (_entryData) {
_entryData->_macro.UpdateRef();
}
}

View File

@@ -52,7 +52,9 @@ public:
private slots: private slots:
void MacroChanged(const QString &text); void MacroChanged(const QString &text);
void DurationChanged(const Duration &value); void MacroRemove(const QString &name);
void DurationChanged(double value);
void DurationUnitChanged(DurationUnit unit);
void ActionTypeChanged(int value); void ActionTypeChanged(int value);
signals: signals:
void HeaderInfoChanged(const QString &); void HeaderInfoChanged(const QString &);

View File

@@ -29,8 +29,7 @@ void MacroActionTransition::SetSceneTransition()
obs_source_release(t); obs_source_release(t);
} }
if (_setDuration) { if (_setDuration) {
obs_frontend_set_transition_duration(_duration.Seconds() * obs_frontend_set_transition_duration(_duration.seconds * 1000);
1000);
} }
} }
@@ -44,7 +43,7 @@ void MacroActionTransition::SetTransitionOverride()
} }
if (_setDuration) { if (_setDuration) {
obs_data_set_int(data, "transition_duration", obs_data_set_int(data, "transition_duration",
_duration.Milliseconds()); _duration.seconds * 1000);
} }
obs_data_release(data); obs_data_release(data);
obs_source_release(scene); obs_source_release(scene);
@@ -92,7 +91,7 @@ void MacroActionTransition::SetSourceTransition(bool show)
} }
if (_setDuration) { if (_setDuration) {
obs_sceneitem_set_transition_duration( obs_sceneitem_set_transition_duration(
item, show, _duration.Milliseconds()); item, show, _duration.seconds * 1000);
} }
obs_sceneitem_release(item); obs_sceneitem_release(item);
} }
@@ -231,8 +230,8 @@ MacroActionTransitionEdit::MacroActionTransitionEdit(
SIGNAL(TransitionChanged(const TransitionSelection &)), SIGNAL(TransitionChanged(const TransitionSelection &)),
this, this,
SLOT(TransitionChanged(const TransitionSelection &))); SLOT(TransitionChanged(const TransitionSelection &)));
QWidget::connect(_duration, SIGNAL(DurationChanged(const Duration &)), QWidget::connect(_duration, SIGNAL(DurationChanged(double)), this,
this, SLOT(DurationChanged(const Duration &))); SLOT(DurationChanged(double)));
QWidget::connect(_setTransition, SIGNAL(stateChanged(int)), this, QWidget::connect(_setTransition, SIGNAL(stateChanged(int)), this,
SLOT(SetTransitionChanged(int))); SLOT(SetTransitionChanged(int)));
QWidget::connect(_setDuration, SIGNAL(stateChanged(int)), this, QWidget::connect(_setDuration, SIGNAL(stateChanged(int)), this,
@@ -335,14 +334,14 @@ void MacroActionTransitionEdit::TransitionChanged(const TransitionSelection &t)
QString::fromStdString(_entryData->GetShortDesc())); QString::fromStdString(_entryData->GetShortDesc()));
} }
void MacroActionTransitionEdit::DurationChanged(const Duration &dur) void MacroActionTransitionEdit::DurationChanged(double seconds)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_duration = dur; _entryData->_duration.seconds = seconds;
} }
void MacroActionTransitionEdit::SetWidgetVisibility() void MacroActionTransitionEdit::SetWidgetVisibility()

View File

@@ -70,7 +70,7 @@ private slots:
void SetTransitionChanged(int state); void SetTransitionChanged(int state);
void SetDurationChanged(int state); void SetDurationChanged(int state);
void TransitionChanged(const TransitionSelection &); void TransitionChanged(const TransitionSelection &);
void DurationChanged(const Duration &seconds); void DurationChanged(double seconds);
signals: signals:
void HeaderInfoChanged(const QString &); void HeaderInfoChanged(const QString &);

View File

@@ -1,7 +1,6 @@
#include "macro-action-variable.hpp" #include "macro-action-variable.hpp"
#include "advanced-scene-switcher.hpp" #include "advanced-scene-switcher.hpp"
#include "macro-condition-edit.hpp" #include "macro-condition-edit.hpp"
#include "math-helpers.hpp"
#include "utility.hpp" #include "utility.hpp"
const std::string MacroActionVariable::id = "variable"; const std::string MacroActionVariable::id = "variable";
@@ -30,10 +29,6 @@ static std::map<MacroActionVariable::Type, std::string> actionTypes = {
"AdvSceneSwitcher.action.variable.type.roundToInt"}, "AdvSceneSwitcher.action.variable.type.roundToInt"},
{MacroActionVariable::Type::SUBSTRING, {MacroActionVariable::Type::SUBSTRING,
"AdvSceneSwitcher.action.variable.type.subString"}, "AdvSceneSwitcher.action.variable.type.subString"},
{MacroActionVariable::Type::FIND_AND_REPLACE,
"AdvSceneSwitcher.action.variable.type.findAndReplace"},
{MacroActionVariable::Type::MATH_EXPRESSION,
"AdvSceneSwitcher.action.variable.type.mathExpression"},
}; };
static void apppend(Variable &var, const std::string &value) static void apppend(Variable &var, const std::string &value)
@@ -44,14 +39,14 @@ static void apppend(Variable &var, const std::string &value)
static void modifyNumValue(Variable &var, double val, const bool increment) static void modifyNumValue(Variable &var, double val, const bool increment)
{ {
auto current = var.DoubleValue(); double current;
if (!current.has_value()) { if (!var.DoubleValue(current)) {
return; return;
} }
if (increment) { if (increment) {
var.SetValue(*current + val); var.SetValue(current + val);
} else { } else {
var.SetValue(*current - val); var.SetValue(current - val);
} }
} }
@@ -100,26 +95,9 @@ void MacroActionVariable::HandleRegexSubString(Variable *var)
var->SetValue(match.captured(0).toStdString()); var->SetValue(match.captured(0).toStdString());
} }
void MacroActionVariable::HandleFindAndReplace(Variable *var)
{
auto value = var->Value();
replaceAll(value, _findStr, _replaceStr);
var->SetValue(value);
}
void MacroActionVariable::HandleMathExpression(Variable *var)
{
auto result = EvalMathExpression(_mathExpression);
if (std::holds_alternative<std::string>(result)) {
blog(LOG_WARNING, "%s", std::get<std::string>(result).c_str());
return;
}
var->SetValue(std::get<double>(result));
}
bool MacroActionVariable::PerformAction() bool MacroActionVariable::PerformAction()
{ {
auto var = _variable.lock(); auto var = GetVariableByName(_variableName);
if (!var) { if (!var) {
return true; return true;
} }
@@ -132,7 +110,7 @@ bool MacroActionVariable::PerformAction()
apppend(*var, _strValue); apppend(*var, _strValue);
break; break;
case Type::APPEND_VAR: { case Type::APPEND_VAR: {
auto var2 = _variable2.lock(); auto var2 = GetVariableByName(_variable2Name);
if (!var2) { if (!var2) {
return true; return true;
} }
@@ -162,27 +140,19 @@ bool MacroActionVariable::PerformAction()
break; break;
} }
case Type::ROUND_TO_INT: { case Type::ROUND_TO_INT: {
auto curValue = var->DoubleValue(); double curValue;
if (!curValue.has_value()) { if (!var->DoubleValue(curValue)) {
return true; return true;
} }
var->SetValue(std::to_string(int(std::round(*curValue)))); var->SetValue(std::to_string(int(std::round(curValue))));
return true; return true;
} }
case Type::SUBSTRING: { case Type::SUBSTRING: {
if (_regex.Enabled()) { if (_regex.Enabled()) {
HandleRegexSubString(var.get()); HandleRegexSubString(var);
return true; return true;
} }
HandleIndexSubString(var.get()); HandleIndexSubString(var);
return true;
}
case Type::FIND_AND_REPLACE: {
HandleFindAndReplace(var.get());
return true;
}
case Type::MATH_EXPRESSION: {
HandleMathExpression(var.get());
return true; return true;
} }
} }
@@ -193,10 +163,8 @@ bool MacroActionVariable::PerformAction()
bool MacroActionVariable::Save(obs_data_t *obj) const bool MacroActionVariable::Save(obs_data_t *obj) const
{ {
MacroAction::Save(obj); MacroAction::Save(obj);
obs_data_set_string(obj, "variableName", obs_data_set_string(obj, "variableName", _variableName.c_str());
GetWeakVariableName(_variable).c_str()); obs_data_set_string(obj, "variable2Name", _variable2Name.c_str());
obs_data_set_string(obj, "variable2Name",
GetWeakVariableName(_variable2).c_str());
obs_data_set_string(obj, "strValue", _strValue.c_str()); obs_data_set_string(obj, "strValue", _strValue.c_str());
obs_data_set_double(obj, "numValue", _numValue); obs_data_set_double(obj, "numValue", _numValue);
obs_data_set_int(obj, "condition", static_cast<int>(_type)); obs_data_set_int(obj, "condition", static_cast<int>(_type));
@@ -205,20 +173,15 @@ bool MacroActionVariable::Save(obs_data_t *obj) const
obs_data_set_int(obj, "subStringSize", _subStringSize); obs_data_set_int(obj, "subStringSize", _subStringSize);
obs_data_set_string(obj, "regexPattern", _regexPattern.c_str()); obs_data_set_string(obj, "regexPattern", _regexPattern.c_str());
obs_data_set_int(obj, "regexMatchIdx", _regexMatchIdx); obs_data_set_int(obj, "regexMatchIdx", _regexMatchIdx);
obs_data_set_string(obj, "findStr", _findStr.c_str());
obs_data_set_string(obj, "replaceStr", _replaceStr.c_str());
_regex.Save(obj); _regex.Save(obj);
_mathExpression.Save(obj, "mathExpression");
return true; return true;
} }
bool MacroActionVariable::Load(obs_data_t *obj) bool MacroActionVariable::Load(obs_data_t *obj)
{ {
MacroAction::Load(obj); MacroAction::Load(obj);
_variable = _variableName = obs_data_get_string(obj, "variableName");
GetWeakVariableByName(obs_data_get_string(obj, "variableName")); _variable2Name = obs_data_get_string(obj, "variable2Name");
_variable2 = GetWeakVariableByName(
obs_data_get_string(obj, "variable2Name"));
_strValue = obs_data_get_string(obj, "strValue"); _strValue = obs_data_get_string(obj, "strValue");
_numValue = obs_data_get_double(obj, "numValue"); _numValue = obs_data_get_double(obj, "numValue");
_type = static_cast<Type>(obs_data_get_int(obj, "condition")); _type = static_cast<Type>(obs_data_get_int(obj, "condition"));
@@ -228,9 +191,6 @@ bool MacroActionVariable::Load(obs_data_t *obj)
_regex.Load(obj); _regex.Load(obj);
_regexPattern = obs_data_get_string(obj, "regexPattern"); _regexPattern = obs_data_get_string(obj, "regexPattern");
_regexMatchIdx = obs_data_get_int(obj, "regexMatchIdx"); _regexMatchIdx = obs_data_get_int(obj, "regexMatchIdx");
_findStr = obs_data_get_string(obj, "findStr");
_replaceStr = obs_data_get_string(obj, "replaceStr");
_mathExpression.Load(obj, "mathExpression");
return true; return true;
} }
@@ -242,7 +202,7 @@ bool MacroActionVariable::PostLoad()
std::string MacroActionVariable::GetShortDesc() const std::string MacroActionVariable::GetShortDesc() const
{ {
return GetWeakVariableName(_variable); return _variableName;
} }
void MacroActionVariable::SetSegmentIndexValue(int value) void MacroActionVariable::SetSegmentIndexValue(int value)
@@ -343,12 +303,7 @@ MacroActionVariableEdit::MacroActionVariableEdit(
_subStringSize(new QSpinBox()), _subStringSize(new QSpinBox()),
_regex(new RegexConfigWidget(parent)), _regex(new RegexConfigWidget(parent)),
_regexPattern(new ResizingPlainTextEdit(this, 10, 1, 1)), _regexPattern(new ResizingPlainTextEdit(this, 10, 1, 1)),
_regexMatchIdx(new QSpinBox()), _regexMatchIdx(new QSpinBox())
_findReplaceLayout(new QHBoxLayout()),
_findStr(new ResizingPlainTextEdit(this, 10, 1, 1)),
_replaceStr(new ResizingPlainTextEdit(this, 10, 1, 1)),
_mathExpression(new VariableLineEdit(this)),
_mathExpressionResult(new QLabel())
{ {
_numValue->setMinimum(-9999999999); _numValue->setMinimum(-9999999999);
_numValue->setMaximum(9999999999); _numValue->setMaximum(9999999999);
@@ -393,12 +348,6 @@ MacroActionVariableEdit::MacroActionVariableEdit(
SLOT(RegexPatternChanged())); SLOT(RegexPatternChanged()));
QWidget::connect(_regexMatchIdx, SIGNAL(valueChanged(int)), this, QWidget::connect(_regexMatchIdx, SIGNAL(valueChanged(int)), this,
SLOT(RegexMatchIdxChanged(int))); SLOT(RegexMatchIdxChanged(int)));
QWidget::connect(_findStr, SIGNAL(textChanged()), this,
SLOT(FindStrValueChanged()));
QWidget::connect(_replaceStr, SIGNAL(textChanged()), this,
SLOT(ReplaceStrValueChanged()));
QWidget::connect(_mathExpression, SIGNAL(editingFinished()), this,
SLOT(MathExpressionChanged()));
std::unordered_map<std::string, QWidget *> widgetPlaceholders = { std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
{"{{variables}}", _variables}, {"{{variables}}", _variables},
@@ -410,9 +359,6 @@ MacroActionVariableEdit::MacroActionVariableEdit(
{"{{subStringStart}}", _subStringStart}, {"{{subStringStart}}", _subStringStart},
{"{{subStringSize}}", _subStringSize}, {"{{subStringSize}}", _subStringSize},
{"{{regexMatchIdx}}", _regexMatchIdx}, {"{{regexMatchIdx}}", _regexMatchIdx},
{"{{findStr}}", _findStr},
{"{{replaceStr}}", _replaceStr},
{"{{mathExpression}}", _mathExpression},
}; };
auto entryLayout = new QHBoxLayout; auto entryLayout = new QHBoxLayout;
placeWidgets(obs_module_text("AdvSceneSwitcher.action.variable.entry"), placeWidgets(obs_module_text("AdvSceneSwitcher.action.variable.entry"),
@@ -428,11 +374,6 @@ MacroActionVariableEdit::MacroActionVariableEdit(
"AdvSceneSwitcher.action.variable.entry.substringRegex"), "AdvSceneSwitcher.action.variable.entry.substringRegex"),
_subStringRegexEntryLayout, widgetPlaceholders); _subStringRegexEntryLayout, widgetPlaceholders);
placeWidgets(
obs_module_text(
"AdvSceneSwitcher.action.variable.entry.findAndReplace"),
_findReplaceLayout, widgetPlaceholders, false);
auto regexConfigLayout = new QHBoxLayout; auto regexConfigLayout = new QHBoxLayout;
regexConfigLayout->addWidget(_regex); regexConfigLayout->addWidget(_regex);
regexConfigLayout->addStretch(); regexConfigLayout->addStretch();
@@ -447,8 +388,6 @@ MacroActionVariableEdit::MacroActionVariableEdit(
layout->addLayout(_substringLayout); layout->addLayout(_substringLayout);
layout->addWidget(_segmentValueStatus); layout->addWidget(_segmentValueStatus);
layout->addWidget(_segmentValue); layout->addWidget(_segmentValue);
layout->addLayout(_findReplaceLayout);
layout->addWidget(_mathExpressionResult);
setLayout(layout); setLayout(layout);
_entryData = entryData; _entryData = entryData;
@@ -467,8 +406,8 @@ void MacroActionVariableEdit::UpdateEntryData()
return; return;
} }
_variables->SetVariable(_entryData->_variable); _variables->SetVariable(_entryData->_variableName);
_variables2->SetVariable(_entryData->_variable2); _variables2->SetVariable(_entryData->_variable2Name);
_actions->setCurrentIndex(static_cast<int>(_entryData->_type)); _actions->setCurrentIndex(static_cast<int>(_entryData->_type));
_strValue->setPlainText(QString::fromStdString(_entryData->_strValue)); _strValue->setPlainText(QString::fromStdString(_entryData->_strValue));
_numValue->setValue(_entryData->_numValue); _numValue->setValue(_entryData->_numValue);
@@ -479,10 +418,6 @@ void MacroActionVariableEdit::UpdateEntryData()
_regexPattern->setPlainText( _regexPattern->setPlainText(
QString::fromStdString(_entryData->_regexPattern)); QString::fromStdString(_entryData->_regexPattern));
_regexMatchIdx->setValue(_entryData->_regexMatchIdx + 1); _regexMatchIdx->setValue(_entryData->_regexMatchIdx + 1);
_findStr->setPlainText(QString::fromStdString(_entryData->_findStr));
_replaceStr->setPlainText(
QString::fromStdString(_entryData->_replaceStr));
_mathExpression->setText(_entryData->_mathExpression);
SetWidgetVisibility(); SetWidgetVisibility();
} }
@@ -493,7 +428,7 @@ void MacroActionVariableEdit::VariableChanged(const QString &text)
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_variable = GetWeakVariableByQString(text); _entryData->_variableName = text.toStdString();
} }
void MacroActionVariableEdit::Variable2Changed(const QString &text) void MacroActionVariableEdit::Variable2Changed(const QString &text)
@@ -503,7 +438,7 @@ void MacroActionVariableEdit::Variable2Changed(const QString &text)
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_variable2 = GetWeakVariableByQString(text); _entryData->_variable2Name = text.toStdString();
} }
void MacroActionVariableEdit::ActionChanged(int value) void MacroActionVariableEdit::ActionChanged(int value)
@@ -532,7 +467,6 @@ void MacroActionVariableEdit::StrValueChanged()
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_strValue = _strValue->toPlainText().toStdString(); _entryData->_strValue = _strValue->toPlainText().toStdString();
adjustSize(); adjustSize();
updateGeometry();
} }
void MacroActionVariableEdit::NumValueChanged(double val) void MacroActionVariableEdit::NumValueChanged(double val)
@@ -689,7 +623,6 @@ void MacroActionVariableEdit::RegexPatternChanged()
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_regexPattern = _regexPattern->toPlainText().toStdString(); _entryData->_regexPattern = _regexPattern->toPlainText().toStdString();
adjustSize(); adjustSize();
updateGeometry();
} }
void MacroActionVariableEdit::RegexMatchIdxChanged(int val) void MacroActionVariableEdit::RegexMatchIdxChanged(int val)
@@ -702,52 +635,6 @@ void MacroActionVariableEdit::RegexMatchIdxChanged(int val)
_entryData->_regexMatchIdx = val - 1; _entryData->_regexMatchIdx = val - 1;
} }
void MacroActionVariableEdit::FindStrValueChanged()
{
if (_loading || !_entryData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_findStr = _findStr->toPlainText().toStdString();
adjustSize();
updateGeometry();
}
void MacroActionVariableEdit::ReplaceStrValueChanged()
{
if (_loading || !_entryData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_replaceStr = _replaceStr->toPlainText().toStdString();
adjustSize();
updateGeometry();
}
void MacroActionVariableEdit::MathExpressionChanged()
{
if (_loading || !_entryData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_mathExpression = _mathExpression->text().toStdString();
// In case of invalid expression display an error
auto result = EvalMathExpression(_entryData->_mathExpression);
auto hasError = std::holds_alternative<std::string>(result);
if (hasError) {
_mathExpressionResult->setText(
QString::fromStdString(std::get<std::string>(result)));
}
_mathExpressionResult->setVisible(hasError);
adjustSize();
updateGeometry();
}
void MacroActionVariableEdit::MarkSelectedSegment() void MacroActionVariableEdit::MarkSelectedSegment()
{ {
if (switcher->disableHints) { if (switcher->disableHints) {
@@ -823,12 +710,6 @@ void MacroActionVariableEdit::SetWidgetVisibility()
setLayoutVisible(_subStringRegexEntryLayout, showRegex); setLayoutVisible(_subStringRegexEntryLayout, showRegex);
_regexPattern->setVisible(showRegex); _regexPattern->setVisible(showRegex);
} }
setLayoutVisible(_findReplaceLayout,
_entryData->_type ==
MacroActionVariable::Type::FIND_AND_REPLACE);
_mathExpression->setVisible(_entryData->_type ==
MacroActionVariable::Type::MATH_EXPRESSION);
_mathExpressionResult->hide();
adjustSize(); adjustSize();
updateGeometry(); updateGeometry();

View File

@@ -1,8 +1,8 @@
#pragma once #pragma once
#include "macro-action-edit.hpp" #include "macro-action-edit.hpp"
#include "regex-config.hpp"
#include "resizing-text-edit.hpp" #include "resizing-text-edit.hpp"
#include "variable-line-edit.hpp" #include "regex-config.hpp"
#include "variable.hpp"
class MacroActionVariable : public MacroAction { class MacroActionVariable : public MacroAction {
public: public:
@@ -31,13 +31,11 @@ public:
SET_ACTION_VALUE, SET_ACTION_VALUE,
ROUND_TO_INT, ROUND_TO_INT,
SUBSTRING, SUBSTRING,
FIND_AND_REPLACE,
MATH_EXPRESSION,
}; };
Type _type = Type::SET_FIXED_VALUE; Type _type = Type::SET_FIXED_VALUE;
std::weak_ptr<Variable> _variable; std::string _variableName = "";
std::weak_ptr<Variable> _variable2; std::string _variable2Name = "";
std::string _strValue = ""; std::string _strValue = "";
double _numValue = 0; double _numValue = 0;
int _subStringStart = 0; int _subStringStart = 0;
@@ -45,19 +43,11 @@ public:
RegexConfig _regex = RegexConfig::PartialMatchRegexConfig(); RegexConfig _regex = RegexConfig::PartialMatchRegexConfig();
std::string _regexPattern = ".*"; std::string _regexPattern = ".*";
int _regexMatchIdx = 0; int _regexMatchIdx = 0;
std::string _findStr = obs_module_text(
"AdvSceneSwitcher.action.variable.findAndReplace.find");
std::string _replaceStr = obs_module_text(
"AdvSceneSwitcher.action.variable.findAndReplace.replace");
StringVariable _mathExpression = obs_module_text(
"AdvSceneSwitcher.action.variable.mathExpression.example");
private: private:
void DecrementCurrentSegmentVariableRef(); void DecrementCurrentSegmentVariableRef();
void HandleIndexSubString(Variable *); void HandleIndexSubString(Variable *);
void HandleRegexSubString(Variable *); void HandleRegexSubString(Variable *);
void HandleFindAndReplace(Variable *);
void HandleMathExpression(Variable *);
std::weak_ptr<MacroSegment> _macroSegment; std::weak_ptr<MacroSegment> _macroSegment;
int _segmentIdxLoadValue = -1; int _segmentIdxLoadValue = -1;
@@ -95,9 +85,6 @@ private slots:
void RegexChanged(RegexConfig conf); void RegexChanged(RegexConfig conf);
void RegexPatternChanged(); void RegexPatternChanged();
void RegexMatchIdxChanged(int val); void RegexMatchIdxChanged(int val);
void FindStrValueChanged();
void ReplaceStrValueChanged();
void MathExpressionChanged();
signals: signals:
void HeaderInfoChanged(const QString &); void HeaderInfoChanged(const QString &);
@@ -119,11 +106,6 @@ protected:
RegexConfigWidget *_regex; RegexConfigWidget *_regex;
ResizingPlainTextEdit *_regexPattern; ResizingPlainTextEdit *_regexPattern;
QSpinBox *_regexMatchIdx; QSpinBox *_regexMatchIdx;
QHBoxLayout *_findReplaceLayout;
ResizingPlainTextEdit *_findStr;
ResizingPlainTextEdit *_replaceStr;
VariableLineEdit *_mathExpression;
QLabel *_mathExpressionResult;
std::shared_ptr<MacroActionVariable> _entryData; std::shared_ptr<MacroActionVariable> _entryData;
private: private:

View File

@@ -34,14 +34,14 @@ bool MacroActionWait::PerformAction()
{ {
double sleepDuration; double sleepDuration;
if (_waitType == WaitType::FIXED) { if (_waitType == WaitType::FIXED) {
sleepDuration = _duration.Seconds(); sleepDuration = _duration.seconds;
} else { } else {
double min = (_duration.Seconds() < _duration2.Seconds()) double min = (_duration.seconds < _duration2.seconds)
? _duration.Seconds() ? _duration.seconds
: _duration2.Seconds(); : _duration2.seconds;
double max = (_duration.Seconds() < _duration2.Seconds()) double max = (_duration.seconds < _duration2.seconds)
? _duration2.Seconds() ? _duration2.seconds
: _duration.Seconds(); : _duration.seconds;
std::uniform_real_distribution<double> unif(min, max); std::uniform_real_distribution<double> unif(min, max);
sleepDuration = unif(re); sleepDuration = unif(re);
} }
@@ -62,9 +62,8 @@ bool MacroActionWait::Save(obs_data_t *obj) const
{ {
MacroAction::Save(obj); MacroAction::Save(obj);
_duration.Save(obj); _duration.Save(obj);
_duration2.Save(obj, "duration2"); _duration2.Save(obj, "seconds2", "displayUnit2");
obs_data_set_int(obj, "waitType", static_cast<int>(_waitType)); obs_data_set_int(obj, "waitType", static_cast<int>(_waitType));
obs_data_set_int(obj, "version", 1);
return true; return true;
} }
@@ -72,14 +71,7 @@ bool MacroActionWait::Load(obs_data_t *obj)
{ {
MacroAction::Load(obj); MacroAction::Load(obj);
_duration.Load(obj); _duration.Load(obj);
// TODO: remove this fallback _duration2.Load(obj, "seconds2", "displayUnit2");
if (obs_data_get_int(obj, "version") == 1) {
_duration2.Load(obj, "duration2");
} else {
_duration2.Load(obj, "seconds2");
_duration2.SetUnit(static_cast<Duration::Unit>(
obs_data_get_int(obj, "displayUnit2")));
}
_waitType = static_cast<WaitType>(obs_data_get_int(obj, "waitType")); _waitType = static_cast<WaitType>(obs_data_get_int(obj, "waitType"));
return true; return true;
} }
@@ -101,10 +93,14 @@ MacroActionWaitEdit::MacroActionWaitEdit(
populateTypeSelection(_waitType); populateTypeSelection(_waitType);
QWidget::connect(_duration, SIGNAL(DurationChanged(const Duration &)), QWidget::connect(_duration, SIGNAL(DurationChanged(double)), this,
this, SLOT(DurationChanged(const Duration &))); SLOT(DurationChanged(double)));
QWidget::connect(_duration2, SIGNAL(DurationChanged(const Duration &)), QWidget::connect(_duration, SIGNAL(UnitChanged(DurationUnit)), this,
this, SLOT(Duration2Changed(const Duration &))); SLOT(DurationUnitChanged(DurationUnit)));
QWidget::connect(_duration2, SIGNAL(DurationChanged(double)), this,
SLOT(Duration2Changed(double)));
QWidget::connect(_duration2, SIGNAL(UnitChanged(DurationUnit)), this,
SLOT(Duration2UnitChanged(DurationUnit)));
QWidget::connect(_waitType, SIGNAL(currentIndexChanged(int)), this, QWidget::connect(_waitType, SIGNAL(currentIndexChanged(int)), this,
SLOT(TypeChanged(int))); SLOT(TypeChanged(int)));
@@ -184,22 +180,42 @@ void MacroActionWaitEdit::TypeChanged(int value)
_entryData->_waitType = type; _entryData->_waitType = type;
} }
void MacroActionWaitEdit::DurationChanged(const Duration &dur) void MacroActionWaitEdit::DurationChanged(double seconds)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_duration = dur; _entryData->_duration.seconds = seconds;
} }
void MacroActionWaitEdit::Duration2Changed(const Duration &dur) void MacroActionWaitEdit::DurationUnitChanged(DurationUnit unit)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_duration2 = dur; _entryData->_duration.displayUnit = unit;
}
void MacroActionWaitEdit::Duration2Changed(double seconds)
{
if (_loading || !_entryData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_duration2.seconds = seconds;
}
void MacroActionWaitEdit::Duration2UnitChanged(DurationUnit unit)
{
if (_loading || !_entryData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_duration2.displayUnit = unit;
} }

View File

@@ -49,8 +49,10 @@ public:
} }
private slots: private slots:
void DurationChanged(const Duration &value); void DurationChanged(double value);
void Duration2Changed(const Duration &value); void DurationUnitChanged(DurationUnit unit);
void Duration2Changed(double value);
void Duration2UnitChanged(DurationUnit unit);
void TypeChanged(int value); void TypeChanged(int value);
protected: protected:

View File

@@ -18,7 +18,7 @@ static std::map<MacroActionWebsocket::Type, std::string> actionTypes = {
void MacroActionWebsocket::SendRequest() void MacroActionWebsocket::SendRequest()
{ {
auto connection = _connection.lock(); auto connection = GetConnectionByName(_connection);
if (!connection) { if (!connection) {
return; return;
} }
@@ -46,7 +46,7 @@ void MacroActionWebsocket::LogAction() const
switch (_type) { switch (_type) {
case MacroActionWebsocket::Type::REQUEST: case MacroActionWebsocket::Type::REQUEST:
vblog(LOG_INFO, "sent msg \"%s\" via \"%s\"", _message.c_str(), vblog(LOG_INFO, "sent msg \"%s\" via \"%s\"", _message.c_str(),
GetWeakConnectionName(_connection).c_str()); _connection.c_str());
break; break;
case MacroActionWebsocket::Type::EVENT: case MacroActionWebsocket::Type::EVENT:
vblog(LOG_INFO, "sent event \"%s\" to connected clients", vblog(LOG_INFO, "sent event \"%s\" to connected clients",
@@ -62,8 +62,7 @@ bool MacroActionWebsocket::Save(obs_data_t *obj) const
MacroAction::Save(obj); MacroAction::Save(obj);
obs_data_set_int(obj, "type", static_cast<int>(_type)); obs_data_set_int(obj, "type", static_cast<int>(_type));
_message.Save(obj, "message"); _message.Save(obj, "message");
obs_data_set_string(obj, "connection", obs_data_set_string(obj, "connection", _connection.c_str());
GetWeakConnectionName(_connection).c_str());
return true; return true;
} }
@@ -72,15 +71,14 @@ bool MacroActionWebsocket::Load(obs_data_t *obj)
MacroAction::Load(obj); MacroAction::Load(obj);
_type = static_cast<Type>(obs_data_get_int(obj, "type")); _type = static_cast<Type>(obs_data_get_int(obj, "type"));
_message.Load(obj, "message"); _message.Load(obj, "message");
_connection = _connection = obs_data_get_string(obj, "connection");
GetWeakConnectionByName(obs_data_get_string(obj, "connection"));
return true; return true;
} }
std::string MacroActionWebsocket::GetShortDesc() const std::string MacroActionWebsocket::GetShortDesc() const
{ {
if (_type == Type::REQUEST) { if (_type == Type::REQUEST) {
return GetWeakConnectionName(_connection); return _connection;
} }
return ""; return "";
} }
@@ -208,6 +206,6 @@ void MacroActionWebsocketEdit::ConnectionSelectionChanged(
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_connection = GetWeakConnectionByQString(connection); _entryData->_connection = connection.toStdString();
emit(HeaderInfoChanged(connection)); emit(HeaderInfoChanged(connection));
} }

View File

@@ -28,8 +28,9 @@ public:
}; };
Type _type = Type::REQUEST; Type _type = Type::REQUEST;
StringVariable _message = obs_module_text("AdvSceneSwitcher.enterText"); VariableResolvingString _message =
std::weak_ptr<Connection> _connection; obs_module_text("AdvSceneSwitcher.enterText");
std::string _connection;
private: private:
void SendRequest(); void SendRequest();

View File

@@ -29,10 +29,9 @@ MacroRefAction::MacroRefAction(Macro *m, bool supportsVariableValue)
{ {
} }
bool MacroRefAction::PostLoad() void MacroRefAction::ResolveMacroRef()
{ {
_macro.PostLoad(); _macro.UpdateRef();
return true;
} }
MultiMacroRefAction::MultiMacroRefAction(Macro *m, bool supportsVariableValue) MultiMacroRefAction::MultiMacroRefAction(Macro *m, bool supportsVariableValue)
@@ -40,10 +39,9 @@ MultiMacroRefAction::MultiMacroRefAction(Macro *m, bool supportsVariableValue)
{ {
} }
bool MultiMacroRefAction::PostLoad() void MultiMacroRefAction::ResolveMacroRef()
{ {
for (auto &macro : _macros) { for (auto &m : _macros) {
macro.PostLoad(); m.UpdateRef();
} }
return true;
} }

View File

@@ -15,15 +15,13 @@ public:
class MacroRefAction : virtual public MacroAction { class MacroRefAction : virtual public MacroAction {
public: public:
MacroRefAction(Macro *m, bool supportsVariableValue = false); MacroRefAction(Macro *m, bool supportsVariableValue = false);
bool PostLoad() override; void ResolveMacroRef();
MacroRef _macro; MacroRef _macro;
}; };
class MultiMacroRefAction : virtual public MacroAction { class MultiMacroRefAction : virtual public MacroAction {
public: public:
MultiMacroRefAction(Macro *m, bool supportsVariableValue = false); MultiMacroRefAction(Macro *m, bool supportsVariableValue = false);
bool PostLoad() override; void ResolveMacroRef();
std::vector<MacroRef> _macros; std::vector<MacroRef> _macros;
}; };

View File

@@ -205,16 +205,15 @@ bool MacroConditionAudio::Save(obs_data_t *obj) const
{ {
MacroCondition::Save(obj); MacroCondition::Save(obj);
_audioSource.Save(obj, "audioSource"); _audioSource.Save(obj, "audioSource");
obs_data_set_int(obj, "volume", _volume);
obs_data_set_int(obj, "syncOffset", _syncOffset);
obs_data_set_int(obj, "monitor", _monitorType); obs_data_set_int(obj, "monitor", _monitorType);
_volume.Save(obj, "volume"); obs_data_set_double(obj, "balance", _balance);
_syncOffset.Save(obj, "syncOffset");
_balance.Save(obj, "balance");
obs_data_set_int(obj, "checkType", static_cast<int>(_checkType)); obs_data_set_int(obj, "checkType", static_cast<int>(_checkType));
obs_data_set_int(obj, "outputCondition", obs_data_set_int(obj, "outputCondition",
static_cast<int>(_outputCondition)); static_cast<int>(_outputCondition));
obs_data_set_int(obj, "volumeCondition", obs_data_set_int(obj, "volumeCondition",
static_cast<int>(_volumeCondition)); static_cast<int>(_volumeCondition));
obs_data_set_int(obj, "version", 1);
return true; return true;
} }
@@ -239,17 +238,11 @@ bool MacroConditionAudio::Load(obs_data_t *obj)
{ {
MacroCondition::Load(obj); MacroCondition::Load(obj);
_audioSource.Load(obj, "audioSource"); _audioSource.Load(obj, "audioSource");
_volume = obs_data_get_int(obj, "volume");
_syncOffset = obs_data_get_int(obj, "syncOffset");
_monitorType = static_cast<obs_monitoring_type>( _monitorType = static_cast<obs_monitoring_type>(
obs_data_get_int(obj, "monitor")); obs_data_get_int(obj, "monitor"));
if (!obs_data_has_user_value(obj, "version")) { _balance = obs_data_get_double(obj, "balance");
_volume = obs_data_get_int(obj, "volume");
_syncOffset = obs_data_get_int(obj, "syncOffset");
_balance = obs_data_get_double(obj, "balance");
} else {
_volume.Load(obj, "volume");
_syncOffset.Load(obj, "syncOffset");
_balance.Load(obj, "balance");
}
_checkType = static_cast<Type>(obs_data_get_int(obj, "checkType")); _checkType = static_cast<Type>(obs_data_get_int(obj, "checkType"));
_outputCondition = static_cast<OutputCondition>( _outputCondition = static_cast<OutputCondition>(
obs_data_get_int(obj, "outputCondition")); obs_data_get_int(obj, "outputCondition"));
@@ -327,8 +320,8 @@ MacroConditionAudioEdit::MacroConditionAudioEdit(
_checkTypes(new QComboBox()), _checkTypes(new QComboBox()),
_sources(new SourceSelectionWidget(this, QStringList(), true)), _sources(new SourceSelectionWidget(this, QStringList(), true)),
_condition(new QComboBox()), _condition(new QComboBox()),
_volume(new VariableSpinBox()), _volume(new QSpinBox()),
_syncOffset(new VariableSpinBox()), _syncOffset(new QSpinBox()),
_monitorTypes(new QComboBox), _monitorTypes(new QComboBox),
_balance(new SliderSpinBox(0., 1., "")) _balance(new SliderSpinBox(0., 1., ""))
{ {
@@ -346,21 +339,14 @@ MacroConditionAudioEdit::MacroConditionAudioEdit(
QWidget::connect(_checkTypes, SIGNAL(currentIndexChanged(int)), this, QWidget::connect(_checkTypes, SIGNAL(currentIndexChanged(int)), this,
SLOT(CheckTypeChanged(int))); SLOT(CheckTypeChanged(int)));
QWidget::connect( QWidget::connect(_volume, SIGNAL(valueChanged(int)), this,
_volume, SLOT(VolumeThresholdChanged(int)));
SIGNAL(NumberVariableChanged(const NumberVariable<int> &)), QWidget::connect(_syncOffset, SIGNAL(valueChanged(int)), this,
this, SLOT(SyncOffsetChanged(int)));
SLOT(VolumeThresholdChanged(const NumberVariable<int> &)));
QWidget::connect(
_syncOffset,
SIGNAL(NumberVariableChanged(const NumberVariable<int> &)),
this, SLOT(SyncOffsetChanged(const NumberVariable<int> &)));
QWidget::connect(_monitorTypes, SIGNAL(currentIndexChanged(int)), this, QWidget::connect(_monitorTypes, SIGNAL(currentIndexChanged(int)), this,
SLOT(MonitorTypeChanged(int))); SLOT(MonitorTypeChanged(int)));
QWidget::connect( QWidget::connect(_balance, SIGNAL(DoubleValueChanged(double)), this,
_balance, SLOT(BalanceChanged(double)));
SIGNAL(DoubleValueChanged(const NumberVariable<double> &)),
this, SLOT(BalanceChanged(const NumberVariable<double> &)));
QWidget::connect(_condition, SIGNAL(currentIndexChanged(int)), this, QWidget::connect(_condition, SIGNAL(currentIndexChanged(int)), this,
SLOT(ConditionChanged(int))); SLOT(ConditionChanged(int)));
QWidget::connect(_sources, QWidget::connect(_sources,
@@ -405,8 +391,8 @@ void MacroConditionAudioEdit::UpdateVolmeterSource()
layout->addWidget(_volMeter); layout->addWidget(_volMeter);
QWidget::connect(_volMeter->GetSlider(), SIGNAL(valueChanged(int)), QWidget::connect(_volMeter->GetSlider(), SIGNAL(valueChanged(int)),
_volume, SLOT(SetFixedValue(int))); _volume, SLOT(setValue(int)));
QWidget::connect(_volume, SIGNAL(FixedValueChanged(int)), QWidget::connect(_volume, SIGNAL(valueChanged(int)),
_volMeter->GetSlider(), SLOT(setValue(int))); _volMeter->GetSlider(), SLOT(setValue(int)));
// Slider will default to 0 so set it manually once // Slider will default to 0 so set it manually once
@@ -419,19 +405,16 @@ void MacroConditionAudioEdit::SourceChanged(const SourceSelection &source)
return; return;
} }
{ std::lock_guard<std::mutex> lock(switcher->m);
std::lock_guard<std::mutex> lock(switcher->m); _entryData->_audioSource = source;
_entryData->_audioSource = source; _entryData->ResetVolmeter();
_entryData->ResetVolmeter();
}
UpdateVolmeterSource(); UpdateVolmeterSource();
SetWidgetVisibility(); SetWidgetVisibility();
emit HeaderInfoChanged( emit HeaderInfoChanged(
QString::fromStdString(_entryData->GetShortDesc())); QString::fromStdString(_entryData->GetShortDesc()));
} }
void MacroConditionAudioEdit::VolumeThresholdChanged( void MacroConditionAudioEdit::VolumeThresholdChanged(int vol)
const NumberVariable<int> &vol)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
@@ -441,7 +424,7 @@ void MacroConditionAudioEdit::VolumeThresholdChanged(
_entryData->_volume = vol; _entryData->_volume = vol;
} }
void MacroConditionAudioEdit::SyncOffsetChanged(const NumberVariable<int> &value) void MacroConditionAudioEdit::SyncOffsetChanged(int value)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
@@ -461,7 +444,7 @@ void MacroConditionAudioEdit::MonitorTypeChanged(int value)
_entryData->_monitorType = static_cast<obs_monitoring_type>(value); _entryData->_monitorType = static_cast<obs_monitoring_type>(value);
} }
void MacroConditionAudioEdit::BalanceChanged(const NumberVariable<double> &value) void MacroConditionAudioEdit::BalanceChanged(double value)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
@@ -521,8 +504,8 @@ void MacroConditionAudioEdit::UpdateEntryData()
} }
_sources->SetSource(_entryData->_audioSource); _sources->SetSource(_entryData->_audioSource);
_volume->SetValue(_entryData->_volume); _volume->setValue(_entryData->_volume);
_syncOffset->SetValue(_entryData->_syncOffset); _syncOffset->setValue(_entryData->_syncOffset);
_monitorTypes->setCurrentIndex(_entryData->_monitorType); _monitorTypes->setCurrentIndex(_entryData->_monitorType);
_balance->SetDoubleValue(_entryData->_balance); _balance->SetDoubleValue(_entryData->_balance);
_checkTypes->setCurrentIndex(_checkTypes->findData( _checkTypes->setCurrentIndex(_checkTypes->findData(

View File

@@ -50,10 +50,10 @@ public:
}; };
SourceSelection _audioSource; SourceSelection _audioSource;
NumberVariable<int> _volume = 0; int _volume = 0;
NumberVariable<int> _syncOffset = 0; int64_t _syncOffset = 0;
obs_monitoring_type _monitorType = OBS_MONITORING_TYPE_NONE; obs_monitoring_type _monitorType = OBS_MONITORING_TYPE_NONE;
NumberVariable<double> _balance = 0.5; double _balance = 0.5;
Type _checkType = Type::OUTPUT_VOLUME; Type _checkType = Type::OUTPUT_VOLUME;
OutputCondition _outputCondition = OutputCondition::ABOVE; OutputCondition _outputCondition = OutputCondition::ABOVE;
VolumeCondition _volumeCondition = VolumeCondition::ABOVE; VolumeCondition _volumeCondition = VolumeCondition::ABOVE;
@@ -90,12 +90,12 @@ public:
private slots: private slots:
void SourceChanged(const SourceSelection &); void SourceChanged(const SourceSelection &);
void VolumeThresholdChanged(const NumberVariable<int> &vol); void VolumeThresholdChanged(int vol);
void ConditionChanged(int cond); void ConditionChanged(int cond);
void CheckTypeChanged(int cond); void CheckTypeChanged(int cond);
void SyncOffsetChanged(const NumberVariable<int> &value); void SyncOffsetChanged(int value);
void MonitorTypeChanged(int value); void MonitorTypeChanged(int value);
void BalanceChanged(const NumberVariable<double> &value); void BalanceChanged(double value);
signals: signals:
void HeaderInfoChanged(const QString &); void HeaderInfoChanged(const QString &);
@@ -104,8 +104,8 @@ protected:
QComboBox *_checkTypes; QComboBox *_checkTypes;
SourceSelectionWidget *_sources; SourceSelectionWidget *_sources;
QComboBox *_condition; QComboBox *_condition;
VariableSpinBox *_volume; QSpinBox *_volume;
VariableSpinBox *_syncOffset; QSpinBox *_syncOffset;
QComboBox *_monitorTypes; QComboBox *_monitorTypes;
SliderSpinBox *_balance; SliderSpinBox *_balance;
VolControl *_volMeter = nullptr; VolControl *_volMeter = nullptr;

View File

@@ -77,11 +77,10 @@ bool MacroConditionCursor::Save(obs_data_t *obj) const
MacroCondition::Save(obj); MacroCondition::Save(obj);
obs_data_set_int(obj, "condition", static_cast<int>(_condition)); obs_data_set_int(obj, "condition", static_cast<int>(_condition));
obs_data_set_int(obj, "button", static_cast<int>(_button)); obs_data_set_int(obj, "button", static_cast<int>(_button));
_minX.Save(obj, "minX"); obs_data_set_int(obj, "minX", _minX);
_minY.Save(obj, "minY"); obs_data_set_int(obj, "minY", _minY);
_maxX.Save(obj, "maxX"); obs_data_set_int(obj, "maxX", _maxX);
_maxY.Save(obj, "maxY"); obs_data_set_int(obj, "maxY", _maxY);
obs_data_set_int(obj, "version", 1);
return true; return true;
} }
@@ -90,17 +89,10 @@ bool MacroConditionCursor::Load(obs_data_t *obj)
MacroCondition::Load(obj); MacroCondition::Load(obj);
_condition = static_cast<Condition>(obs_data_get_int(obj, "condition")); _condition = static_cast<Condition>(obs_data_get_int(obj, "condition"));
_button = static_cast<Button>(obs_data_get_int(obj, "button")); _button = static_cast<Button>(obs_data_get_int(obj, "button"));
if (!obs_data_has_user_value(obj, "version")) { _minX = obs_data_get_int(obj, "minX");
_minX = obs_data_get_int(obj, "minX"); _minY = obs_data_get_int(obj, "minY");
_minY = obs_data_get_int(obj, "minY"); _maxX = obs_data_get_int(obj, "maxX");
_maxX = obs_data_get_int(obj, "maxX"); _maxY = obs_data_get_int(obj, "maxY");
_maxY = obs_data_get_int(obj, "maxY");
} else {
_minX.Load(obj, "minX");
_minY.Load(obj, "minY");
_maxX.Load(obj, "maxX");
_maxY.Load(obj, "maxY");
}
return true; return true;
} }
@@ -123,10 +115,10 @@ static inline void populateButtonSelection(QComboBox *list)
MacroConditionCursorEdit::MacroConditionCursorEdit( MacroConditionCursorEdit::MacroConditionCursorEdit(
QWidget *parent, std::shared_ptr<MacroConditionCursor> entryData) QWidget *parent, std::shared_ptr<MacroConditionCursor> entryData)
: QWidget(parent), : QWidget(parent),
_minX(new VariableSpinBox()), _minX(new QSpinBox()),
_minY(new VariableSpinBox()), _minY(new QSpinBox()),
_maxX(new VariableSpinBox()), _maxX(new QSpinBox()),
_maxY(new VariableSpinBox()), _maxY(new QSpinBox()),
_conditions(new QComboBox()), _conditions(new QComboBox()),
_buttons(new QComboBox()), _buttons(new QComboBox()),
_frameToggle(new QPushButton(obs_module_text( _frameToggle(new QPushButton(obs_module_text(
@@ -159,22 +151,14 @@ MacroConditionCursorEdit::MacroConditionCursorEdit(
SLOT(ConditionChanged(int))); SLOT(ConditionChanged(int)));
QWidget::connect(_buttons, SIGNAL(currentIndexChanged(int)), this, QWidget::connect(_buttons, SIGNAL(currentIndexChanged(int)), this,
SLOT(ButtonChanged(int))); SLOT(ButtonChanged(int)));
QWidget::connect( QWidget::connect(_minX, SIGNAL(valueChanged(int)), this,
_minX, SLOT(MinXChanged(int)));
SIGNAL(NumberVariableChanged(const NumberVariable<int> &)), QWidget::connect(_minY, SIGNAL(valueChanged(int)), this,
this, SLOT(MinXChanged(const NumberVariable<int> &))); SLOT(MinYChanged(int)));
QWidget::connect( QWidget::connect(_maxX, SIGNAL(valueChanged(int)), this,
_minY, SLOT(MaxXChanged(int)));
SIGNAL(NumberVariableChanged(const NumberVariable<int> &)), QWidget::connect(_maxY, SIGNAL(valueChanged(int)), this,
this, SLOT(MinYChanged(const NumberVariable<int> &))); SLOT(MaxYChanged(int)));
QWidget::connect(
_maxX,
SIGNAL(NumberVariableChanged(const NumberVariable<int> &)),
this, SLOT(MaxXChanged(const NumberVariable<int> &)));
QWidget::connect(
_maxY,
SIGNAL(NumberVariableChanged(const NumberVariable<int> &)),
this, SLOT(MaxYChanged(const NumberVariable<int> &)));
QWidget::connect(_frameToggle, SIGNAL(clicked()), this, QWidget::connect(_frameToggle, SIGNAL(clicked()), this,
SLOT(ToggleFrame())); SLOT(ToggleFrame()));
@@ -233,7 +217,7 @@ void MacroConditionCursorEdit::ButtonChanged(int index)
_buttons->itemData(index).toInt()); _buttons->itemData(index).toInt());
} }
void MacroConditionCursorEdit::MinXChanged(const NumberVariable<int> &pos) void MacroConditionCursorEdit::MinXChanged(int pos)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
@@ -244,7 +228,7 @@ void MacroConditionCursorEdit::MinXChanged(const NumberVariable<int> &pos)
SetupFrame(); SetupFrame();
} }
void MacroConditionCursorEdit::MinYChanged(const NumberVariable<int> &pos) void MacroConditionCursorEdit::MinYChanged(int pos)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
@@ -255,7 +239,7 @@ void MacroConditionCursorEdit::MinYChanged(const NumberVariable<int> &pos)
SetupFrame(); SetupFrame();
} }
void MacroConditionCursorEdit::MaxXChanged(const NumberVariable<int> &pos) void MacroConditionCursorEdit::MaxXChanged(int pos)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
@@ -266,7 +250,7 @@ void MacroConditionCursorEdit::MaxXChanged(const NumberVariable<int> &pos)
SetupFrame(); SetupFrame();
} }
void MacroConditionCursorEdit::MaxYChanged(const NumberVariable<int> &pos) void MacroConditionCursorEdit::MaxYChanged(int pos)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
@@ -350,20 +334,18 @@ void MacroConditionCursorEdit::SetupFrame()
Qt::WindowStaysOnTopHint); Qt::WindowStaysOnTopHint);
_frame.setAttribute(Qt::WA_TranslucentBackground, true); _frame.setAttribute(Qt::WA_TranslucentBackground, true);
if (!_entryData) { if (_entryData) {
return; QRect rect(_entryData->_minX, _entryData->_minY,
_entryData->_maxX - _entryData->_minX,
_entryData->_maxY - _entryData->_minY);
if (rect.size().height() == 0 || rect.size().width() == 0) {
_frame.setGeometry(0, 0, 1, 1);
return;
}
_frame.setGeometry(getScreenUnionRect().intersected(rect));
} }
QRect rect(_entryData->_minX, _entryData->_minY,
_entryData->_maxX - _entryData->_minX,
_entryData->_maxY - _entryData->_minY);
if (rect.size().height() <= 0 || rect.size().width() <= 0) {
_frame.setGeometry(0, 0, 1, 1);
return;
}
_frame.setGeometry(getScreenUnionRect().intersected(rect));
} }
void MacroConditionCursorEdit::UpdateEntryData() void MacroConditionCursorEdit::UpdateEntryData()
@@ -374,9 +356,9 @@ void MacroConditionCursorEdit::UpdateEntryData()
_conditions->setCurrentIndex(static_cast<int>(_entryData->_condition)); _conditions->setCurrentIndex(static_cast<int>(_entryData->_condition));
_buttons->setCurrentIndex(static_cast<int>(_entryData->_button)); _buttons->setCurrentIndex(static_cast<int>(_entryData->_button));
_minX->SetValue(_entryData->_minX); _minX->setValue(_entryData->_minX);
_minY->SetValue(_entryData->_minY); _minY->setValue(_entryData->_minY);
_maxX->SetValue(_entryData->_maxX); _maxX->setValue(_entryData->_maxX);
_maxY->SetValue(_entryData->_maxY); _maxY->setValue(_entryData->_maxY);
SetWidgetVisibility(); SetWidgetVisibility();
} }

View File

@@ -1,12 +1,11 @@
#pragma once #pragma once
#include "macro.hpp" #include "macro.hpp"
#include "striped-frame.hpp"
#include "variable-spinbox.hpp"
#include <QSpinBox> #include <QSpinBox>
#include <QComboBox> #include <QComboBox>
#include <QPushButton> #include <QPushButton>
#include <QTimer> #include <QTimer>
#include <QFrame>
class MacroConditionCursor : public MacroCondition { class MacroConditionCursor : public MacroCondition {
public: public:
@@ -34,7 +33,7 @@ public:
Condition _condition = Condition::REGION; Condition _condition = Condition::REGION;
Button _button = Button::LEFT; Button _button = Button::LEFT;
NumberVariable<int> _minX = 0, _minY = 0, _maxX = 0, _maxY = 0; int _minX = 0, _minY = 0, _maxX = 0, _maxY = 0;
private: private:
bool CheckClick(); bool CheckClick();
@@ -63,18 +62,18 @@ public:
private slots: private slots:
void ConditionChanged(int idx); void ConditionChanged(int idx);
void ButtonChanged(int idx); void ButtonChanged(int idx);
void MinXChanged(const NumberVariable<int> &pos); void MinXChanged(int pos);
void MinYChanged(const NumberVariable<int> &pos); void MinYChanged(int pos);
void MaxXChanged(const NumberVariable<int> &pos); void MaxXChanged(int pos);
void MaxYChanged(const NumberVariable<int> &pos); void MaxYChanged(int pos);
void UpdateCursorPos(); void UpdateCursorPos();
void ToggleFrame(); void ToggleFrame();
protected: protected:
VariableSpinBox *_minX; QSpinBox *_minX;
VariableSpinBox *_minY; QSpinBox *_minY;
VariableSpinBox *_maxX; QSpinBox *_maxX;
VariableSpinBox *_maxY; QSpinBox *_maxY;
QComboBox *_conditions; QComboBox *_conditions;
QComboBox *_buttons; QComboBox *_buttons;
QPushButton *_frameToggle; QPushButton *_frameToggle;
@@ -87,6 +86,6 @@ private:
void SetWidgetVisibility(); void SetWidgetVisibility();
void SetupFrame(); void SetupFrame();
QTimer _timer; QTimer _timer;
StripedFrame _frame; QFrame _frame;
bool _loading = true; bool _loading = true;
}; };

View File

@@ -165,8 +165,8 @@ bool MacroConditionDate::CheckRegularDate(int64_t msSinceLastCheck)
} }
if (match && _repeat) { if (match && _repeat) {
_dateTime = _dateTime.addSecs(_duration.Seconds()); _dateTime = _dateTime.addSecs(_duration.seconds);
_dateTime2 = _dateTime2.addSecs(_duration.Seconds()); _dateTime2 = _dateTime2.addSecs(_duration.seconds);
} }
return match; return match;
@@ -398,8 +398,10 @@ MacroConditionDateEdit::MacroConditionDateEdit(
SLOT(RepeatChanged(int))); SLOT(RepeatChanged(int)));
QWidget::connect(_updateOnRepeat, SIGNAL(stateChanged(int)), this, QWidget::connect(_updateOnRepeat, SIGNAL(stateChanged(int)), this,
SLOT(UpdateOnRepeatChanged(int))); SLOT(UpdateOnRepeatChanged(int)));
QWidget::connect(_duration, SIGNAL(DurationChanged(const Duration &)), QWidget::connect(_duration, SIGNAL(DurationChanged(double)), this,
this, SLOT(DurationChanged(const Duration &))); SLOT(DurationChanged(double)));
QWidget::connect(_duration, SIGNAL(UnitChanged(DurationUnit)), this,
SLOT(DurationUnitChanged(DurationUnit)));
QWidget::connect(_advancedSettingsTooggle, SIGNAL(clicked()), this, QWidget::connect(_advancedSettingsTooggle, SIGNAL(clicked()), this,
SLOT(AdvancedSettingsToggleClicked())); SLOT(AdvancedSettingsToggleClicked()));
QWidget::connect(_pattern, SIGNAL(editingFinished()), this, QWidget::connect(_pattern, SIGNAL(editingFinished()), this,
@@ -587,14 +589,24 @@ void MacroConditionDateEdit::UpdateOnRepeatChanged(int state)
_entryData->_updateOnRepeat = state; _entryData->_updateOnRepeat = state;
} }
void MacroConditionDateEdit::DurationChanged(const Duration &dur) void MacroConditionDateEdit::DurationChanged(double seconds)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_duration = dur; _entryData->_duration.seconds = seconds;
}
void MacroConditionDateEdit::DurationUnitChanged(DurationUnit unit)
{
if (_loading || !_entryData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_duration.displayUnit = unit;
} }
void MacroConditionDateEdit::AdvancedSettingsToggleClicked() void MacroConditionDateEdit::AdvancedSettingsToggleClicked()

View File

@@ -100,7 +100,8 @@ private slots:
void IgnoreTimeChanged(int state); void IgnoreTimeChanged(int state);
void RepeatChanged(int state); void RepeatChanged(int state);
void UpdateOnRepeatChanged(int state); void UpdateOnRepeatChanged(int state);
void DurationChanged(const Duration &seconds); void DurationChanged(double seconds);
void DurationUnitChanged(DurationUnit unit);
void AdvancedSettingsToggleClicked(); void AdvancedSettingsToggleClicked();
void ShowNextMatch(); void ShowNextMatch();
void UpdateCurrentTime(); void UpdateCurrentTime();

View File

@@ -121,14 +121,15 @@ DurationModifierEdit::DurationModifierEdit(QWidget *parent)
_duration = new DurationSelection(parent); _duration = new DurationSelection(parent);
_toggle = new QPushButton(parent); _toggle = new QPushButton(parent);
_toggle->setMaximumWidth(22); _toggle->setMaximumWidth(22);
const auto path = QString::fromStdString(getDataFilePath( _toggle->setIcon(
"res/images/" + GetThemeTypeName() + "Time.svg")); QIcon(QString::fromStdString(getDataFilePath("res/time.svg"))));
_toggle->setIcon(QIcon(path));
populateDurationModifierTypes(_condition); populateDurationModifierTypes(_condition);
QWidget::connect(_condition, SIGNAL(currentIndexChanged(int)), this, QWidget::connect(_condition, SIGNAL(currentIndexChanged(int)), this,
SLOT(_ModifierChanged(int))); SLOT(_ModifierChanged(int)));
QObject::connect(_duration, &DurationSelection::DurationChanged, this, QObject::connect(_duration, &DurationSelection::DurationChanged, this,
&DurationModifierEdit::DurationChanged); &DurationModifierEdit::DurationChanged);
QObject::connect(_duration, &DurationSelection::UnitChanged, this,
&DurationModifierEdit::UnitChanged);
QWidget::connect(_toggle, SIGNAL(clicked()), this, QWidget::connect(_toggle, SIGNAL(clicked()), this,
SLOT(ToggleClicked())); SLOT(ToggleClicked()));
@@ -149,6 +150,11 @@ void DurationModifierEdit::SetValue(DurationModifier &value)
_duration->setVisible(value.GetType() != DurationModifier::Type::NONE); _duration->setVisible(value.GetType() != DurationModifier::Type::NONE);
} }
void DurationModifierEdit::SetUnit(DurationUnit u)
{
_duration->SetUnit(u);
}
void DurationModifierEdit::SetDuration(const Duration &d) void DurationModifierEdit::SetDuration(const Duration &d)
{ {
_duration->SetDuration(d); _duration->SetDuration(d);
@@ -189,8 +195,10 @@ MacroConditionEdit::MacroConditionEdit(
QWidget::connect(_conditionSelection, QWidget::connect(_conditionSelection,
SIGNAL(currentTextChanged(const QString &)), this, SIGNAL(currentTextChanged(const QString &)), this,
SLOT(ConditionSelectionChanged(const QString &))); SLOT(ConditionSelectionChanged(const QString &)));
QWidget::connect(_dur, SIGNAL(DurationChanged(const Duration &)), this, QWidget::connect(_dur, SIGNAL(DurationChanged(double)), this,
SLOT(DurationChanged(const Duration &))); SLOT(DurationChanged(double)));
QWidget::connect(_dur, SIGNAL(UnitChanged(DurationUnit)), this,
SLOT(DurationUnitChanged(DurationUnit)));
QWidget::connect(_dur, SIGNAL(ModifierChanged(DurationModifier::Type)), QWidget::connect(_dur, SIGNAL(ModifierChanged(DurationModifier::Type)),
this, this,
SLOT(DurationModifierChanged(DurationModifier::Type))); SLOT(DurationModifierChanged(DurationModifier::Type)));
@@ -316,7 +324,7 @@ void MacroConditionEdit::ConditionSelectionChanged(const QString &text)
SetFocusPolicyOfWidgets(); SetFocusPolicyOfWidgets();
} }
void MacroConditionEdit::DurationChanged(const Duration &seconds) void MacroConditionEdit::DurationChanged(double seconds)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
@@ -336,6 +344,16 @@ void MacroConditionEdit::DurationModifierChanged(DurationModifier::Type m)
(*_entryData)->SetDurationModifier(m); (*_entryData)->SetDurationModifier(m);
} }
void MacroConditionEdit::DurationUnitChanged(DurationUnit unit)
{
if (_loading || !_entryData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
(*_entryData)->SetDurationUnit(unit);
}
std::shared_ptr<MacroSegment> MacroConditionEdit::Data() std::shared_ptr<MacroSegment> MacroConditionEdit::Data()
{ {
return *_entryData; return *_entryData;

View File

@@ -35,13 +35,15 @@ class DurationModifierEdit : public QWidget {
public: public:
DurationModifierEdit(QWidget *parent = nullptr); DurationModifierEdit(QWidget *parent = nullptr);
void SetValue(DurationModifier &value); void SetValue(DurationModifier &value);
void SetUnit(DurationUnit u);
void SetDuration(const Duration &d); void SetDuration(const Duration &d);
private slots: private slots:
void _ModifierChanged(int value); void _ModifierChanged(int value);
void ToggleClicked(); void ToggleClicked();
signals: signals:
void DurationChanged(const Duration &value); void DurationChanged(double value);
void UnitChanged(DurationUnit u);
void ModifierChanged(DurationModifier::Type value); void ModifierChanged(DurationModifier::Type value);
private: private:
@@ -67,8 +69,9 @@ public:
private slots: private slots:
void LogicSelectionChanged(int idx); void LogicSelectionChanged(int idx);
void ConditionSelectionChanged(const QString &text); void ConditionSelectionChanged(const QString &text);
void DurationChanged(const Duration &value); void DurationChanged(double seconds);
void DurationModifierChanged(DurationModifier::Type m); void DurationModifierChanged(DurationModifier::Type m);
void DurationUnitChanged(DurationUnit unit);
private: private:
void SetLogicSelection(); void SetLogicSelection();

View File

@@ -65,8 +65,7 @@ bool MacroConditionFile::MatchFileContent(QString &filedata)
bool MacroConditionFile::CheckRemoteFileContent() bool MacroConditionFile::CheckRemoteFileContent()
{ {
std::string path = _file; std::string data = getRemoteData(_file);
std::string data = getRemoteData(path);
SetVariableValue(data); SetVariableValue(data);
QString qdata = QString::fromStdString(data); QString qdata = QString::fromStdString(data);
return MatchFileContent(qdata); return MatchFileContent(qdata);
@@ -100,8 +99,7 @@ bool MacroConditionFile::CheckChangeContent()
QString filedata; QString filedata;
switch (_fileType) { switch (_fileType) {
case FileType::LOCAL: { case FileType::LOCAL: {
std::string path = _file; QFile file(QString::fromStdString(_file));
QFile file(QString::fromStdString(path));
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
return false; return false;
} }
@@ -109,8 +107,7 @@ bool MacroConditionFile::CheckChangeContent()
file.close(); file.close();
} break; } break;
case FileType::REMOTE: { case FileType::REMOTE: {
std::string path = _file; std::string data = getRemoteData(_file);
std::string data = getRemoteData(path);
QString filedata = QString::fromStdString(data); QString filedata = QString::fromStdString(data);
} break; } break;
default: default:
@@ -169,7 +166,7 @@ bool MacroConditionFile::Save(obs_data_t *obj) const
{ {
MacroCondition::Save(obj); MacroCondition::Save(obj);
_regex.Save(obj); _regex.Save(obj);
_file.Save(obj, "file"); obs_data_set_string(obj, "file", _file.c_str());
_text.Save(obj, "text"); _text.Save(obj, "text");
obs_data_set_int(obj, "fileType", static_cast<int>(_fileType)); obs_data_set_int(obj, "fileType", static_cast<int>(_fileType));
obs_data_set_int(obj, "condition", static_cast<int>(_condition)); obs_data_set_int(obj, "condition", static_cast<int>(_condition));
@@ -187,7 +184,7 @@ bool MacroConditionFile::Load(obs_data_t *obj)
_regex.CreateBackwardsCompatibleRegex( _regex.CreateBackwardsCompatibleRegex(
obs_data_get_bool(obj, "useRegex")); obs_data_get_bool(obj, "useRegex"));
} }
_file.Load(obj, "file"); _file = obs_data_get_string(obj, "file");
_text.Load(obj, "text"); _text.Load(obj, "text");
_fileType = static_cast<FileType>(obs_data_get_int(obj, "fileType")); _fileType = static_cast<FileType>(obs_data_get_int(obj, "fileType"));
_condition = _condition =
@@ -199,7 +196,7 @@ bool MacroConditionFile::Load(obs_data_t *obj)
std::string MacroConditionFile::GetShortDesc() const std::string MacroConditionFile::GetShortDesc() const
{ {
return _file.UnresolvedValue(); return _file;
} }
static void populateFileTypes(QComboBox *list) static void populateFileTypes(QComboBox *list)
@@ -295,7 +292,7 @@ void MacroConditionFileEdit::UpdateEntryData()
_fileTypes->setCurrentIndex(static_cast<int>(_entryData->_fileType)); _fileTypes->setCurrentIndex(static_cast<int>(_entryData->_fileType));
_conditions->setCurrentIndex(static_cast<int>(_entryData->_condition)); _conditions->setCurrentIndex(static_cast<int>(_entryData->_condition));
_filePath->SetPath(_entryData->_file); _filePath->SetPath(QString::fromStdString(_entryData->_file));
_matchText->setPlainText(_entryData->_text); _matchText->setPlainText(_entryData->_text);
_regex->SetRegexConfig(_entryData->_regex); _regex->SetRegexConfig(_entryData->_regex);
_checkModificationDate->setChecked(_entryData->_useTime); _checkModificationDate->setChecked(_entryData->_useTime);

View File

@@ -35,8 +35,9 @@ public:
DATE_CHANGE, DATE_CHANGE,
}; };
StringVariable _file = obs_module_text("AdvSceneSwitcher.enterPath"); std::string _file = obs_module_text("AdvSceneSwitcher.enterPath");
StringVariable _text = obs_module_text("AdvSceneSwitcher.enterText"); VariableResolvingString _text =
obs_module_text("AdvSceneSwitcher.enterText");
FileType _fileType = FileType::LOCAL; FileType _fileType = FileType::LOCAL;
ConditionType _condition = ConditionType::MATCH; ConditionType _condition = ConditionType::MATCH;
RegexConfig _regex; RegexConfig _regex;

View File

@@ -30,7 +30,7 @@ public:
SourceSelection _source; SourceSelection _source;
OBSWeakSource _filter; OBSWeakSource _filter;
Condition _condition = Condition::ENABLED; Condition _condition = Condition::ENABLED;
StringVariable _settings = ""; VariableResolvingString _settings = "";
RegexConfig _regex; RegexConfig _regex;
private: private:

View File

@@ -14,7 +14,7 @@ bool MacroConditionIdle::CheckCondition()
{ {
auto seconds = secondsSinceLastInput(); auto seconds = secondsSinceLastInput();
SetVariableValue(std::to_string(seconds)); SetVariableValue(std::to_string(seconds));
return seconds >= _duration.Seconds(); return seconds >= _duration.seconds;
} }
bool MacroConditionIdle::Save(obs_data_t *obj) const bool MacroConditionIdle::Save(obs_data_t *obj) const
@@ -37,8 +37,10 @@ MacroConditionIdleEdit::MacroConditionIdleEdit(
{ {
_duration = new DurationSelection(); _duration = new DurationSelection();
QWidget::connect(_duration, SIGNAL(DurationChanged(const Duration &)), QWidget::connect(_duration, SIGNAL(DurationChanged(double)), this,
this, SLOT(DurationChanged(const Duration &))); SLOT(DurationChanged(double)));
QWidget::connect(_duration, SIGNAL(UnitChanged(DurationUnit)), this,
SLOT(DurationUnitChanged(DurationUnit)));
QHBoxLayout *mainLayout = new QHBoxLayout; QHBoxLayout *mainLayout = new QHBoxLayout;
std::unordered_map<std::string, QWidget *> widgetPlaceholders = { std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
@@ -53,14 +55,24 @@ MacroConditionIdleEdit::MacroConditionIdleEdit(
_loading = false; _loading = false;
} }
void MacroConditionIdleEdit::DurationChanged(const Duration &dur) void MacroConditionIdleEdit::DurationChanged(double seconds)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_duration = dur; _entryData->_duration.seconds = seconds;
}
void MacroConditionIdleEdit::DurationUnitChanged(DurationUnit unit)
{
if (_loading || !_entryData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_duration.displayUnit = unit;
} }
void MacroConditionIdleEdit::UpdateEntryData() void MacroConditionIdleEdit::UpdateEntryData()

View File

@@ -41,7 +41,8 @@ public:
} }
private slots: private slots:
void DurationChanged(const Duration &seconds); void DurationChanged(double seconds);
void DurationUnitChanged(DurationUnit unit);
protected: protected:
DurationSelection *_duration; DurationSelection *_duration;

View File

@@ -44,12 +44,11 @@ bool MacroConditionMacro::CheckStateCondition()
// Note: // Note:
// Depending on the order the macro conditions are checked Matched() might // Depending on the order the macro conditions are checked Matched() might
// still return the state of the previous interval // still return the state of the previous interval
auto macro = _macro.GetMacro(); if (!_macro.get()) {
if (!macro) {
return false; return false;
} }
return macro->Matched(); return _macro->Matched();
} }
bool MacroConditionMacro::CheckMultiStateCondition() bool MacroConditionMacro::CheckMultiStateCondition()
@@ -58,9 +57,8 @@ bool MacroConditionMacro::CheckMultiStateCondition()
// Depending on the order the macro conditions are checked Matched() might // Depending on the order the macro conditions are checked Matched() might
// still return the state of the previous interval // still return the state of the previous interval
int matchedCount = 0; int matchedCount = 0;
for (const auto &m : _macros) { for (const auto &macro : _macros) {
auto macro = m.GetMacro(); if (!macro.get()) {
if (!macro) {
continue; continue;
} }
if (macro->Matched()) { if (macro->Matched()) {
@@ -84,18 +82,17 @@ bool MacroConditionMacro::CheckMultiStateCondition()
bool MacroConditionMacro::CheckCountCondition() bool MacroConditionMacro::CheckCountCondition()
{ {
auto macro = _macro.GetMacro(); if (!_macro.get()) {
if (!macro) {
return false; return false;
} }
switch (_counterCondition) { switch (_counterCondition) {
case CounterCondition::BELOW: case CounterCondition::BELOW:
return macro->RunCount() < _count; return _macro->RunCount() < _count;
case CounterCondition::ABOVE: case CounterCondition::ABOVE:
return macro->RunCount() > _count; return _macro->RunCount() > _count;
case CounterCondition::EQUAL: case CounterCondition::EQUAL:
return macro->RunCount() == _count; return _macro->RunCount() == _count;
default: default:
break; break;
} }
@@ -126,11 +123,10 @@ bool MacroConditionMacro::Save(obs_data_t *obj) const
_macro.Save(obj); _macro.Save(obj);
obs_data_set_int(obj, "type", static_cast<int>(_type)); obs_data_set_int(obj, "type", static_cast<int>(_type));
obs_data_set_int(obj, "condition", static_cast<int>(_counterCondition)); obs_data_set_int(obj, "condition", static_cast<int>(_counterCondition));
_count.Save(obj, "count"); obs_data_set_int(obj, "count", _count);
_multiSateCount.Save(obj, "multiStateCount"); obs_data_set_int(obj, "multiStateCount", _multiSateCount);
obs_data_set_int(obj, "multiStateCondition", obs_data_set_int(obj, "multiStateCondition",
static_cast<int>(_multiSateCondition)); static_cast<int>(_multiSateCondition));
obs_data_set_int(obj, "version", 1);
return true; return true;
} }
@@ -142,6 +138,8 @@ bool MacroConditionMacro::Load(obs_data_t *obj)
_type = static_cast<Type>(obs_data_get_int(obj, "type")); _type = static_cast<Type>(obs_data_get_int(obj, "type"));
_counterCondition = static_cast<CounterCondition>( _counterCondition = static_cast<CounterCondition>(
obs_data_get_int(obj, "condition")); obs_data_get_int(obj, "condition"));
_count = obs_data_get_int(obj, "count");
_multiSateCount = obs_data_get_int(obj, "multiStateCount");
// TODO: Remove this fallback in future version // TODO: Remove this fallback in future version
if (!obs_data_has_user_value(obj, "multiStateCondition")) { if (!obs_data_has_user_value(obj, "multiStateCondition")) {
_multiSateCondition = MultiStateCondition::ABOVE; _multiSateCondition = MultiStateCondition::ABOVE;
@@ -149,27 +147,15 @@ bool MacroConditionMacro::Load(obs_data_t *obj)
_multiSateCondition = static_cast<MultiStateCondition>( _multiSateCondition = static_cast<MultiStateCondition>(
obs_data_get_int(obj, "multiStateCondition")); obs_data_get_int(obj, "multiStateCondition"));
} }
if (!obs_data_has_user_value(obj, "version")) {
_count = obs_data_get_int(obj, "count");
_multiSateCount = obs_data_get_int(obj, "multiStateCount");
} else {
_count.Load(obj, "count");
_multiSateCount.Load(obj, "multiStateCount");
}
return true; return true;
} }
bool MacroConditionMacro::PostLoad()
{
return MacroRefCondition::PostLoad() &&
MultiMacroRefCondtition::PostLoad();
}
std::string MacroConditionMacro::GetShortDesc() const std::string MacroConditionMacro::GetShortDesc() const
{ {
return _macro.Name(); if (_macro.get()) {
return _macro->Name();
}
return "";
} }
static inline void populateTypeSelection(QComboBox *list) static inline void populateTypeSelection(QComboBox *list)
@@ -197,19 +183,19 @@ MacroConditionMacroEdit::MacroConditionMacroEdit(
QWidget *parent, std::shared_ptr<MacroConditionMacro> entryData) QWidget *parent, std::shared_ptr<MacroConditionMacro> entryData)
: QWidget(parent), : QWidget(parent),
_macros(new MacroSelection(parent)), _macros(new MacroSelection(parent)),
_types(new QComboBox()), _types(new QComboBox(parent)),
_counterConditions(new QComboBox()), _counterConditions(new QComboBox(parent)),
_count(new VariableSpinBox()), _count(new QSpinBox(parent)),
_currentCount(new QLabel()), _currentCount(new QLabel(parent)),
_pausedWarning(new QLabel(obs_module_text( _pausedWarning(new QLabel(obs_module_text(
"AdvSceneSwitcher.condition.macro.pausedWarning"))), "AdvSceneSwitcher.condition.macro.pausedWarning"))),
_resetCount(new QPushButton(obs_module_text( _resetCount(new QPushButton(obs_module_text(
"AdvSceneSwitcher.condition.macro.count.reset"))), "AdvSceneSwitcher.condition.macro.count.reset"))),
_settingsLine1(new QHBoxLayout()), _settingsLine1(new QHBoxLayout),
_settingsLine2(new QHBoxLayout()), _settingsLine2(new QHBoxLayout),
_macroList(new MacroList(this, false, false)), _macroList(new MacroList(this, false, false)),
_multiStateConditions(new QComboBox()), _multiStateConditions(new QComboBox(parent)),
_multiStateCount(new VariableSpinBox()) _multiStateCount(new QSpinBox(parent))
{ {
_count->setMaximum(10000000); _count->setMaximum(10000000);
populateTypeSelection(_types); populateTypeSelection(_types);
@@ -224,10 +210,8 @@ MacroConditionMacroEdit::MacroConditionMacroEdit(
SLOT(TypeChanged(int))); SLOT(TypeChanged(int)));
QWidget::connect(_counterConditions, SIGNAL(currentIndexChanged(int)), QWidget::connect(_counterConditions, SIGNAL(currentIndexChanged(int)),
this, SLOT(CountConditionChanged(int))); this, SLOT(CountConditionChanged(int)));
QWidget::connect( QWidget::connect(_count, SIGNAL(valueChanged(int)), this,
_count, SLOT(CountChanged(int)));
SIGNAL(NumberVariableChanged(const NumberVariable<int> &)),
this, SLOT(CountChanged(const NumberVariable<int> &)));
QWidget::connect(_resetCount, SIGNAL(clicked()), this, QWidget::connect(_resetCount, SIGNAL(clicked()), this,
SLOT(ResetClicked())); SLOT(ResetClicked()));
QWidget::connect(_macroList, SIGNAL(Added(const std::string &)), this, QWidget::connect(_macroList, SIGNAL(Added(const std::string &)), this,
@@ -239,13 +223,10 @@ MacroConditionMacroEdit::MacroConditionMacroEdit(
QWidget::connect(_multiStateConditions, QWidget::connect(_multiStateConditions,
SIGNAL(currentIndexChanged(int)), this, SIGNAL(currentIndexChanged(int)), this,
SLOT(MultiStateConditionChanged(int))); SLOT(MultiStateConditionChanged(int)));
QWidget::connect( QWidget::connect(_multiStateCount, SIGNAL(valueChanged(int)), this,
_multiStateCount, SLOT(MultiStateCountChanged(int)));
SIGNAL(NumberVariableChanged(const NumberVariable<int> &)),
this,
SLOT(MultiStateCountChanged(const NumberVariable<int> &)));
auto typesLayout = new QHBoxLayout(); auto typesLayout = new QHBoxLayout;
std::unordered_map<std::string, QWidget *> widgetPlaceholders = { std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
{"{{types}}", _types}, {"{{types}}", _types},
}; };
@@ -253,7 +234,7 @@ MacroConditionMacroEdit::MacroConditionMacroEdit(
"AdvSceneSwitcher.condition.macro.type.selection"), "AdvSceneSwitcher.condition.macro.type.selection"),
typesLayout, widgetPlaceholders); typesLayout, widgetPlaceholders);
auto mainLayout = new QVBoxLayout(this); auto mainLayout = new QVBoxLayout;
mainLayout->addLayout(typesLayout); mainLayout->addLayout(typesLayout);
mainLayout->addLayout(_settingsLine1); mainLayout->addLayout(_settingsLine1);
mainLayout->addLayout(_settingsLine2); mainLayout->addLayout(_settingsLine2);
@@ -263,13 +244,11 @@ MacroConditionMacroEdit::MacroConditionMacroEdit(
_entryData = entryData; _entryData = entryData;
QWidget::connect(&_countTimer, SIGNAL(timeout()), this, connect(&_countTimer, SIGNAL(timeout()), this, SLOT(UpdateCount()));
SLOT(UpdateCount()));
_countTimer.start(1000); _countTimer.start(1000);
_pausedWarning->setVisible(false); _pausedWarning->setVisible(false);
QWidget::connect(&_pausedTimer, SIGNAL(timeout()), this, connect(&_pausedTimer, SIGNAL(timeout()), this, SLOT(UpdatePaused()));
SLOT(UpdatePaused()));
_pausedTimer.start(1000); _pausedTimer.start(1000);
UpdateEntryData(); UpdateEntryData();
@@ -291,7 +270,6 @@ void MacroConditionMacroEdit::ClearLayouts()
void MacroConditionMacroEdit::SetupStateWidgets() void MacroConditionMacroEdit::SetupStateWidgets()
{ {
SetWidgetVisibility();
ClearLayouts(); ClearLayouts();
std::unordered_map<std::string, QWidget *> widgetPlaceholders = { std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
@@ -300,11 +278,12 @@ void MacroConditionMacroEdit::SetupStateWidgets()
placeWidgets( placeWidgets(
obs_module_text("AdvSceneSwitcher.condition.macro.state.entry"), obs_module_text("AdvSceneSwitcher.condition.macro.state.entry"),
_settingsLine1, widgetPlaceholders); _settingsLine1, widgetPlaceholders);
SetWidgetVisibility();
adjustSize();
} }
void MacroConditionMacroEdit::SetupMultiStateWidgets() void MacroConditionMacroEdit::SetupMultiStateWidgets()
{ {
SetWidgetVisibility();
ClearLayouts(); ClearLayouts();
std::unordered_map<std::string, QWidget *> widgetPlaceholders = { std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
@@ -315,11 +294,12 @@ void MacroConditionMacroEdit::SetupMultiStateWidgets()
obs_module_text( obs_module_text(
"AdvSceneSwitcher.condition.macro.multistate.entry"), "AdvSceneSwitcher.condition.macro.multistate.entry"),
_settingsLine1, widgetPlaceholders); _settingsLine1, widgetPlaceholders);
SetWidgetVisibility();
adjustSize();
} }
void MacroConditionMacroEdit::SetupCountWidgets() void MacroConditionMacroEdit::SetupCountWidgets()
{ {
SetWidgetVisibility();
ClearLayouts(); ClearLayouts();
std::unordered_map<std::string, QWidget *> widgetPlaceholders = { std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
@@ -337,6 +317,8 @@ void MacroConditionMacroEdit::SetupCountWidgets()
obs_module_text( obs_module_text(
"AdvSceneSwitcher.condition.macro.count.entry.line2"), "AdvSceneSwitcher.condition.macro.count.entry.line2"),
_settingsLine2, widgetPlaceholders); _settingsLine2, widgetPlaceholders);
SetWidgetVisibility();
adjustSize();
} }
void MacroConditionMacroEdit::SetWidgetVisibility() void MacroConditionMacroEdit::SetWidgetVisibility()
@@ -347,6 +329,7 @@ void MacroConditionMacroEdit::SetWidgetVisibility()
_counterConditions->show(); _counterConditions->show();
_count->show(); _count->show();
_currentCount->show(); _currentCount->show();
_pausedWarning->show();
_resetCount->show(); _resetCount->show();
_macroList->hide(); _macroList->hide();
_multiStateConditions->hide(); _multiStateConditions->hide();
@@ -357,6 +340,7 @@ void MacroConditionMacroEdit::SetWidgetVisibility()
_counterConditions->hide(); _counterConditions->hide();
_count->hide(); _count->hide();
_currentCount->hide(); _currentCount->hide();
_pausedWarning->show();
_resetCount->hide(); _resetCount->hide();
_macroList->hide(); _macroList->hide();
_multiStateConditions->hide(); _multiStateConditions->hide();
@@ -376,8 +360,6 @@ void MacroConditionMacroEdit::SetWidgetVisibility()
default: default:
break; break;
} }
adjustSize();
updateGeometry();
} }
void MacroConditionMacroEdit::UpdateEntryData() void MacroConditionMacroEdit::UpdateEntryData()
@@ -386,7 +368,8 @@ void MacroConditionMacroEdit::UpdateEntryData()
return; return;
} }
switch (_entryData->_type) { auto test = _entryData->_type;
switch (test) {
case MacroConditionMacro::Type::COUNT: case MacroConditionMacro::Type::COUNT:
SetupCountWidgets(); SetupCountWidgets();
break; break;
@@ -400,15 +383,15 @@ void MacroConditionMacroEdit::UpdateEntryData()
break; break;
} }
_macros->SetCurrentMacro(_entryData->_macro); _macros->SetCurrentMacro(_entryData->_macro.get());
_types->setCurrentIndex(static_cast<int>(_entryData->_type)); _types->setCurrentIndex(static_cast<int>(_entryData->_type));
_counterConditions->setCurrentIndex( _counterConditions->setCurrentIndex(
static_cast<int>(_entryData->_counterCondition)); static_cast<int>(_entryData->_counterCondition));
_count->SetValue(_entryData->_count); _count->setValue(_entryData->_count);
_macroList->SetContent(_entryData->_macros); _macroList->SetContent(_entryData->_macros);
_multiStateConditions->setCurrentIndex( _multiStateConditions->setCurrentIndex(
static_cast<int>(_entryData->_multiSateCondition)); static_cast<int>(_entryData->_multiSateCondition));
_multiStateCount->SetValue(_entryData->_multiSateCount); _multiStateCount->setValue(_entryData->_multiSateCount);
} }
void MacroConditionMacroEdit::MacroChanged(const QString &text) void MacroConditionMacroEdit::MacroChanged(const QString &text)
@@ -418,12 +401,12 @@ void MacroConditionMacroEdit::MacroChanged(const QString &text)
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_macro = text; _entryData->_macro.UpdateRef(text);
emit HeaderInfoChanged( emit HeaderInfoChanged(
QString::fromStdString(_entryData->GetShortDesc())); QString::fromStdString(_entryData->GetShortDesc()));
} }
void MacroConditionMacroEdit::CountChanged(const NumberVariable<int> &value) void MacroConditionMacroEdit::CountChanged(int value)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
@@ -450,9 +433,12 @@ void MacroConditionMacroEdit::MacroRemove(const QString &)
return; return;
} }
_entryData->_macro.UpdateRef();
auto it = _entryData->_macros.begin(); auto it = _entryData->_macros.begin();
while (it != _entryData->_macros.end()) { while (it != _entryData->_macros.end()) {
if (!it->GetMacro()) { it->UpdateRef();
if (it->get() == nullptr) {
it = _entryData->_macros.erase(it); it = _entryData->_macros.erase(it);
} else { } else {
++it; ++it;
@@ -487,26 +473,18 @@ void MacroConditionMacroEdit::TypeChanged(int type)
void MacroConditionMacroEdit::ResetClicked() void MacroConditionMacroEdit::ResetClicked()
{ {
if (_loading || !_entryData) { if (_loading || !_entryData || !_entryData->_macro.get()) {
return; return;
} }
auto macro = _entryData->_macro.GetMacro(); _entryData->_macro->ResetRunCount();
if (!macro) {
return;
}
macro->ResetRunCount();
} }
void MacroConditionMacroEdit::UpdateCount() void MacroConditionMacroEdit::UpdateCount()
{ {
if (!_entryData) { if (_entryData && _entryData->_macro.get()) {
return; _currentCount->setText(
} QString::number(_entryData->_macro->RunCount()));
auto macro = _entryData->_macro.GetMacro();
if (macro) {
_currentCount->setText(QString::number(macro->RunCount()));
} else { } else {
_currentCount->setText("-"); _currentCount->setText("-");
} }
@@ -514,11 +492,10 @@ void MacroConditionMacroEdit::UpdateCount()
void MacroConditionMacroEdit::UpdatePaused() void MacroConditionMacroEdit::UpdatePaused()
{ {
auto macro = _entryData->_macro.GetMacro();
_pausedWarning->setVisible( _pausedWarning->setVisible(
_entryData && _entryData &&
_entryData->_type != MacroConditionMacro::Type::MULTI_STATE && _entryData->_type != MacroConditionMacro::Type::MULTI_STATE &&
macro && macro->Paused()); _entryData->_macro.get() && _entryData->_macro->Paused());
adjustSize(); adjustSize();
} }
@@ -533,8 +510,7 @@ void MacroConditionMacroEdit::MultiStateConditionChanged(int cond)
static_cast<MacroConditionMacro::MultiStateCondition>(cond); static_cast<MacroConditionMacro::MultiStateCondition>(cond);
} }
void MacroConditionMacroEdit::MultiStateCountChanged( void MacroConditionMacroEdit::MultiStateCountChanged(int value)
const NumberVariable<int> &value)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;

View File

@@ -2,7 +2,6 @@
#include "macro.hpp" #include "macro.hpp"
#include "macro-selection.hpp" #include "macro-selection.hpp"
#include "macro-list.hpp" #include "macro-list.hpp"
#include "variable-spinbox.hpp"
#include <QComboBox> #include <QComboBox>
#include <QSpinBox> #include <QSpinBox>
@@ -23,7 +22,6 @@ public:
bool CheckCondition(); bool CheckCondition();
bool Save(obs_data_t *obj) const; bool Save(obs_data_t *obj) const;
bool Load(obs_data_t *obj); bool Load(obs_data_t *obj);
bool PostLoad() override;
std::string GetShortDesc() const; std::string GetShortDesc() const;
std::string GetId() const { return id; }; std::string GetId() const { return id; };
static std::shared_ptr<MacroCondition> Create(Macro *m) static std::shared_ptr<MacroCondition> Create(Macro *m)
@@ -44,7 +42,7 @@ public:
EQUAL, EQUAL,
}; };
CounterCondition _counterCondition = CounterCondition::BELOW; CounterCondition _counterCondition = CounterCondition::BELOW;
NumberVariable<int> _count = 0; int _count = 0;
enum class MultiStateCondition { enum class MultiStateCondition {
BELOW, BELOW,
@@ -52,7 +50,7 @@ public:
ABOVE, ABOVE,
}; };
MultiStateCondition _multiSateCondition = MultiStateCondition::ABOVE; MultiStateCondition _multiSateCondition = MultiStateCondition::ABOVE;
NumberVariable<int> _multiSateCount = 0; int _multiSateCount = 0;
private: private:
bool CheckCountCondition(); bool CheckCountCondition();
@@ -83,13 +81,13 @@ private slots:
void MacroChanged(const QString &text); void MacroChanged(const QString &text);
void MacroRemove(const QString &name); void MacroRemove(const QString &name);
void TypeChanged(int type); void TypeChanged(int type);
void CountChanged(const NumberVariable<int> &value); void CountChanged(int value);
void CountConditionChanged(int cond); void CountConditionChanged(int cond);
void ResetClicked(); void ResetClicked();
void UpdateCount(); void UpdateCount();
void UpdatePaused(); void UpdatePaused();
void MultiStateConditionChanged(int cond); void MultiStateConditionChanged(int cond);
void MultiStateCountChanged(const NumberVariable<int> &value); void MultiStateCountChanged(int value);
void Add(const std::string &); void Add(const std::string &);
void Remove(int); void Remove(int);
void Replace(int, const std::string &); void Replace(int, const std::string &);
@@ -100,7 +98,7 @@ protected:
MacroSelection *_macros; MacroSelection *_macros;
QComboBox *_types; QComboBox *_types;
QComboBox *_counterConditions; QComboBox *_counterConditions;
VariableSpinBox *_count; QSpinBox *_count;
QLabel *_currentCount; QLabel *_currentCount;
QLabel *_pausedWarning; QLabel *_pausedWarning;
QPushButton *_resetCount; QPushButton *_resetCount;
@@ -108,7 +106,7 @@ protected:
QHBoxLayout *_settingsLine2; QHBoxLayout *_settingsLine2;
MacroList *_macroList; MacroList *_macroList;
QComboBox *_multiStateConditions; QComboBox *_multiStateConditions;
VariableSpinBox *_multiStateCount; QSpinBox *_multiStateCount;
QTimer _countTimer; QTimer _countTimer;
QTimer _pausedTimer; QTimer _pausedTimer;
std::shared_ptr<MacroConditionMacro> _entryData; std::shared_ptr<MacroConditionMacro> _entryData;

View File

@@ -71,18 +71,18 @@ bool MacroConditionMedia::CheckTime()
match = true; match = true;
break; break;
case Time::TIME_RESTRICTION_SHORTER: case Time::TIME_RESTRICTION_SHORTER:
match = currentTime < _time.Milliseconds(); match = currentTime < _time.seconds * 1000;
break; break;
case Time::TIME_RESTRICTION_LONGER: case Time::TIME_RESTRICTION_LONGER:
match = currentTime > _time.Milliseconds(); match = currentTime > _time.seconds * 1000;
break; break;
case Time::TIME_RESTRICTION_REMAINING_SHORTER: case Time::TIME_RESTRICTION_REMAINING_SHORTER:
match = duration > currentTime && match = duration > currentTime &&
duration - currentTime < _time.Milliseconds(); duration - currentTime < _time.seconds * 1000;
break; break;
case Time::TIME_RESTRICTION_REMAINING_LONGER: case Time::TIME_RESTRICTION_REMAINING_LONGER:
match = duration > currentTime && match = duration > currentTime &&
duration - currentTime > _time.Milliseconds(); duration - currentTime > _time.seconds * 1000;
break; break;
default: default:
break; break;
@@ -429,8 +429,10 @@ MacroConditionMediaEdit::MacroConditionMediaEdit(
SLOT(StateChanged(int))); SLOT(StateChanged(int)));
QWidget::connect(_timeRestrictions, SIGNAL(currentIndexChanged(int)), QWidget::connect(_timeRestrictions, SIGNAL(currentIndexChanged(int)),
this, SLOT(TimeRestrictionChanged(int))); this, SLOT(TimeRestrictionChanged(int)));
QWidget::connect(_time, SIGNAL(DurationChanged(const Duration &)), this, QWidget::connect(_time, SIGNAL(DurationChanged(double)), this,
SLOT(TimeChanged(const Duration &))); SLOT(TimeChanged(double)));
QWidget::connect(_time, SIGNAL(UnitChanged(DurationUnit)), this,
SLOT(TimeUnitChanged(DurationUnit)));
QWidget::connect(_onChange, SIGNAL(stateChanged(int)), this, QWidget::connect(_onChange, SIGNAL(stateChanged(int)), this,
SLOT(OnChangeChanged(int))); SLOT(OnChangeChanged(int)));
@@ -558,14 +560,27 @@ void MacroConditionMediaEdit::TimeRestrictionChanged(int index)
} }
} }
void MacroConditionMediaEdit::TimeChanged(const Duration &dur) void MacroConditionMediaEdit::TimeChanged(double seconds)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_time = dur; _entryData->_time.seconds = seconds;
if (_entryData->_sourceType != MacroConditionMedia::Type::SOURCE) {
_entryData->UpdateMediaSourcesOfSceneList();
}
}
void MacroConditionMediaEdit::TimeUnitChanged(DurationUnit unit)
{
if (_loading || !_entryData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_time.displayUnit = unit;
if (_entryData->_sourceType != MacroConditionMedia::Type::SOURCE) { if (_entryData->_sourceType != MacroConditionMedia::Type::SOURCE) {
_entryData->UpdateMediaSourcesOfSceneList(); _entryData->UpdateMediaSourcesOfSceneList();
} }

View File

@@ -116,7 +116,8 @@ private slots:
void SceneChanged(const SceneSelection &); void SceneChanged(const SceneSelection &);
void StateChanged(int index); void StateChanged(int index);
void TimeRestrictionChanged(int index); void TimeRestrictionChanged(int index);
void TimeChanged(const Duration &seconds); void TimeChanged(double seconds);
void TimeUnitChanged(DurationUnit unit);
void OnChangeChanged(int); void OnChangeChanged(int);
signals: signals:
void HeaderInfoChanged(const QString &); void HeaderInfoChanged(const QString &);

View File

@@ -10,43 +10,41 @@ bool MacroConditionStats::_registered = MacroConditionFactory::Register(
{MacroConditionStats::Create, MacroConditionStatsEdit::Create, {MacroConditionStats::Create, MacroConditionStatsEdit::Create,
"AdvSceneSwitcher.condition.stats"}); "AdvSceneSwitcher.condition.stats"});
static std::map<MacroConditionStats::Type, std::string> statsTypes = { static std::map<StatsType, std::string> statsTypes = {
{MacroConditionStats::Type::FPS, {StatsType::FPS, "AdvSceneSwitcher.condition.stats.type.fps"},
"AdvSceneSwitcher.condition.stats.type.fps"}, {StatsType::CPU_USAGE,
{MacroConditionStats::Type::CPU_USAGE,
"AdvSceneSwitcher.condition.stats.type.CPUUsage"}, "AdvSceneSwitcher.condition.stats.type.CPUUsage"},
{MacroConditionStats::Type::DISK_USAGE, {StatsType::DISK_USAGE,
"AdvSceneSwitcher.condition.stats.type.HDDSpaceAvailable"}, "AdvSceneSwitcher.condition.stats.type.HDDSpaceAvailable"},
{MacroConditionStats::Type::MEM_USAGE, {StatsType::MEM_USAGE,
"AdvSceneSwitcher.condition.stats.type.memoryUsage"}, "AdvSceneSwitcher.condition.stats.type.memoryUsage"},
{MacroConditionStats::Type::AVG_FRAMETIME, {StatsType::AVG_FRAMETIME,
"AdvSceneSwitcher.condition.stats.type.averageTimeToRender"}, "AdvSceneSwitcher.condition.stats.type.averageTimeToRender"},
{MacroConditionStats::Type::RENDER_LAG, {StatsType::RENDER_LAG,
"AdvSceneSwitcher.condition.stats.type.missedFrames"}, "AdvSceneSwitcher.condition.stats.type.missedFrames"},
{MacroConditionStats::Type::ENCODE_LAG, {StatsType::ENCODE_LAG,
"AdvSceneSwitcher.condition.stats.type.skippedFrames"}, "AdvSceneSwitcher.condition.stats.type.skippedFrames"},
{MacroConditionStats::Type::STREAM_DROPPED_FRAMES, {StatsType::STREAM_DROPPED_FRAMES,
"AdvSceneSwitcher.condition.stats.type.droppedFrames.stream"}, "AdvSceneSwitcher.condition.stats.type.droppedFrames.stream"},
{MacroConditionStats::Type::STREAM_BITRATE, {StatsType::STREAM_BITRATE,
"AdvSceneSwitcher.condition.stats.type.bitrate.stream"}, "AdvSceneSwitcher.condition.stats.type.bitrate.stream"},
{MacroConditionStats::Type::STREAM_MB_SENT, {StatsType::STREAM_MB_SENT,
"AdvSceneSwitcher.condition.stats.type.megabytesSent.stream"}, "AdvSceneSwitcher.condition.stats.type.megabytesSent.stream"},
{MacroConditionStats::Type::RECORDING_DROPPED_FRAMES, {StatsType::RECORDING_DROPPED_FRAMES,
"AdvSceneSwitcher.condition.stats.type.droppedFrames.recording"}, "AdvSceneSwitcher.condition.stats.type.droppedFrames.recording"},
{MacroConditionStats::Type::RECORDING_BITRATE, {StatsType::RECORDING_BITRATE,
"AdvSceneSwitcher.condition.stats.type.bitrate.recording"}, "AdvSceneSwitcher.condition.stats.type.bitrate.recording"},
{MacroConditionStats::Type::RECORDING_MB_SENT, {StatsType::RECORDING_MB_SENT,
"AdvSceneSwitcher.condition.stats.type.megabytesSent.recording"}, "AdvSceneSwitcher.condition.stats.type.megabytesSent.recording"},
}; };
static std::map<MacroConditionStats::Condition, std::string> static std::map<StatsCondition, std::string> statsConditionTypes = {
statsConditionTypes = { {StatsCondition::ABOVE,
{MacroConditionStats::Condition::ABOVE, "AdvSceneSwitcher.condition.stats.condition.above"},
"AdvSceneSwitcher.condition.stats.condition.above"}, {StatsCondition::EQUALS,
{MacroConditionStats::Condition::EQUALS, "AdvSceneSwitcher.condition.stats.condition.equals"},
"AdvSceneSwitcher.condition.stats.condition.equals"}, {StatsCondition::BELOW,
{MacroConditionStats::Condition::BELOW, "AdvSceneSwitcher.condition.stats.condition.below"},
"AdvSceneSwitcher.condition.stats.condition.below"},
}; };
MacroConditionStats::MacroConditionStats(Macro *m) MacroConditionStats::MacroConditionStats(Macro *m)
@@ -62,11 +60,11 @@ MacroConditionStats::~MacroConditionStats()
bool MacroConditionStats::CheckFPS() bool MacroConditionStats::CheckFPS()
{ {
switch (_condition) { switch (_condition) {
case Condition::ABOVE: case StatsCondition::ABOVE:
return obs_get_active_fps() > _value; return obs_get_active_fps() > _value;
case Condition::EQUALS: case StatsCondition::EQUALS:
return doubleEquals(obs_get_active_fps(), _value, 0.01); return doubleEquals(obs_get_active_fps(), _value, 0.01);
case Condition::BELOW: case StatsCondition::BELOW:
return obs_get_active_fps() < _value; return obs_get_active_fps() < _value;
default: default:
break; break;
@@ -79,11 +77,11 @@ bool MacroConditionStats::CheckCPU()
double usage = os_cpu_usage_info_query(_cpu_info); double usage = os_cpu_usage_info_query(_cpu_info);
switch (_condition) { switch (_condition) {
case Condition::ABOVE: case StatsCondition::ABOVE:
return usage > _value; return usage > _value;
case Condition::EQUALS: case StatsCondition::EQUALS:
return doubleEquals(usage, _value, 0.1); return doubleEquals(usage, _value, 0.1);
case Condition::BELOW: case StatsCondition::BELOW:
return usage < _value; return usage < _value;
default: default:
break; break;
@@ -97,11 +95,11 @@ bool MacroConditionStats::CheckMemory()
(long double)os_get_proc_resident_size() / (1024.0l * 1024.0l); (long double)os_get_proc_resident_size() / (1024.0l * 1024.0l);
switch (_condition) { switch (_condition) {
case Condition::ABOVE: case StatsCondition::ABOVE:
return rss > _value; return rss > _value;
case Condition::EQUALS: case StatsCondition::EQUALS:
return doubleEquals(rss, _value, 0.1); return doubleEquals(rss, _value, 0.1);
case Condition::BELOW: case StatsCondition::BELOW:
return rss < _value; return rss < _value;
default: default:
break; break;
@@ -114,11 +112,11 @@ bool MacroConditionStats::CheckAvgFrametime()
auto num = (long double)obs_get_average_frame_time_ns() / 1000000.0l; auto num = (long double)obs_get_average_frame_time_ns() / 1000000.0l;
switch (_condition) { switch (_condition) {
case Condition::ABOVE: case StatsCondition::ABOVE:
return num > _value; return num > _value;
case Condition::EQUALS: case StatsCondition::EQUALS:
return doubleEquals(num, _value, 0.1); return doubleEquals(num, _value, 0.1);
case Condition::BELOW: case StatsCondition::BELOW:
return num < _value; return num < _value;
default: default:
break; break;
@@ -144,11 +142,11 @@ bool MacroConditionStats::CheckRenderLag()
num *= 100.0l; num *= 100.0l;
switch (_condition) { switch (_condition) {
case Condition::ABOVE: case StatsCondition::ABOVE:
return num > _value; return num > _value;
case Condition::EQUALS: case StatsCondition::EQUALS:
return doubleEquals(num, _value, 0.1); return doubleEquals(num, _value, 0.1);
case Condition::BELOW: case StatsCondition::BELOW:
return num < _value; return num < _value;
default: default:
break; break;
@@ -175,11 +173,11 @@ bool MacroConditionStats::CheckEncodeLag()
num *= 100.0l; num *= 100.0l;
switch (_condition) { switch (_condition) {
case Condition::ABOVE: case StatsCondition::ABOVE:
return num > _value; return num > _value;
case Condition::EQUALS: case StatsCondition::EQUALS:
return doubleEquals(num, _value, 0.1); return doubleEquals(num, _value, 0.1);
case Condition::BELOW: case StatsCondition::BELOW:
return num < _value; return num < _value;
default: default:
break; break;
@@ -232,11 +230,11 @@ bool MacroConditionStats::CheckStreamDroppedFrames()
obs_output_release(output); obs_output_release(output);
switch (_condition) { switch (_condition) {
case Condition::ABOVE: case StatsCondition::ABOVE:
return _streamInfo.dropped_relative > _value; return _streamInfo.dropped_relative > _value;
case Condition::EQUALS: case StatsCondition::EQUALS:
return doubleEquals(_streamInfo.dropped_relative, _value, 0.1); return doubleEquals(_streamInfo.dropped_relative, _value, 0.1);
case Condition::BELOW: case StatsCondition::BELOW:
return _streamInfo.dropped_relative < _value; return _streamInfo.dropped_relative < _value;
default: default:
break; break;
@@ -251,11 +249,11 @@ bool MacroConditionStats::CheckStreamBitrate()
obs_output_release(output); obs_output_release(output);
switch (_condition) { switch (_condition) {
case Condition::ABOVE: case StatsCondition::ABOVE:
return _streamInfo.kbps > _value; return _streamInfo.kbps > _value;
case Condition::EQUALS: case StatsCondition::EQUALS:
return doubleEquals(_streamInfo.kbps, _value, 1.0); return doubleEquals(_streamInfo.kbps, _value, 1.0);
case Condition::BELOW: case StatsCondition::BELOW:
return _streamInfo.kbps < _value; return _streamInfo.kbps < _value;
default: default:
break; break;
@@ -271,11 +269,11 @@ bool MacroConditionStats::CheckStreamMBSent()
long double num = (long double)totalBytes / (1024.0l * 1024.0l); long double num = (long double)totalBytes / (1024.0l * 1024.0l);
switch (_condition) { switch (_condition) {
case Condition::ABOVE: case StatsCondition::ABOVE:
return num > _value; return num > _value;
case Condition::EQUALS: case StatsCondition::EQUALS:
return doubleEquals(num, _value, 0.1); return doubleEquals(num, _value, 0.1);
case Condition::BELOW: case StatsCondition::BELOW:
return num < _value; return num < _value;
default: default:
break; break;
@@ -290,12 +288,12 @@ bool MacroConditionStats::CheckRecordingDroppedFrames()
obs_output_release(output); obs_output_release(output);
switch (_condition) { switch (_condition) {
case Condition::ABOVE: case StatsCondition::ABOVE:
return _recordingInfo.dropped_relative > _value; return _recordingInfo.dropped_relative > _value;
case Condition::EQUALS: case StatsCondition::EQUALS:
return doubleEquals(_recordingInfo.dropped_relative, _value, return doubleEquals(_recordingInfo.dropped_relative, _value,
0.1); 0.1);
case Condition::BELOW: case StatsCondition::BELOW:
return _recordingInfo.dropped_relative < _value; return _recordingInfo.dropped_relative < _value;
default: default:
break; break;
@@ -310,11 +308,11 @@ bool MacroConditionStats::CheckRecordingBitrate()
obs_output_release(output); obs_output_release(output);
switch (_condition) { switch (_condition) {
case Condition::ABOVE: case StatsCondition::ABOVE:
return _recordingInfo.kbps > _value; return _recordingInfo.kbps > _value;
case Condition::EQUALS: case StatsCondition::EQUALS:
return doubleEquals(_recordingInfo.kbps, _value, 1.0); return doubleEquals(_recordingInfo.kbps, _value, 1.0);
case Condition::BELOW: case StatsCondition::BELOW:
return _recordingInfo.kbps < _value; return _recordingInfo.kbps < _value;
default: default:
break; break;
@@ -330,11 +328,11 @@ bool MacroConditionStats::CheckRecordingMBSent()
long double num = (long double)totalBytes / (1024.0l * 1024.0l); long double num = (long double)totalBytes / (1024.0l * 1024.0l);
switch (_condition) { switch (_condition) {
case Condition::ABOVE: case StatsCondition::ABOVE:
return num > _value; return num > _value;
case Condition::EQUALS: case StatsCondition::EQUALS:
return doubleEquals(num, _value, 0.1); return doubleEquals(num, _value, 0.1);
case Condition::BELOW: case StatsCondition::BELOW:
return num < _value; return num < _value;
default: default:
break; break;
@@ -345,32 +343,32 @@ bool MacroConditionStats::CheckRecordingMBSent()
bool MacroConditionStats::CheckCondition() bool MacroConditionStats::CheckCondition()
{ {
switch (_type) { switch (_type) {
case Type::FPS: case StatsType::FPS:
return CheckFPS(); return CheckFPS();
case Type::CPU_USAGE: case StatsType::CPU_USAGE:
return CheckCPU(); return CheckCPU();
case Type::DISK_USAGE: case StatsType::DISK_USAGE:
// TODO: not implemented // TODO: not implemented
break; break;
case Type::MEM_USAGE: case StatsType::MEM_USAGE:
return CheckMemory(); return CheckMemory();
case Type::AVG_FRAMETIME: case StatsType::AVG_FRAMETIME:
return CheckAvgFrametime(); return CheckAvgFrametime();
case Type::RENDER_LAG: case StatsType::RENDER_LAG:
return CheckRenderLag(); return CheckRenderLag();
case Type::ENCODE_LAG: case StatsType::ENCODE_LAG:
return CheckEncodeLag(); return CheckEncodeLag();
case Type::STREAM_DROPPED_FRAMES: case StatsType::STREAM_DROPPED_FRAMES:
return CheckStreamDroppedFrames(); return CheckStreamDroppedFrames();
case Type::STREAM_BITRATE: case StatsType::STREAM_BITRATE:
return CheckStreamBitrate(); return CheckStreamBitrate();
case Type::STREAM_MB_SENT: case StatsType::STREAM_MB_SENT:
return CheckStreamMBSent(); return CheckStreamMBSent();
case Type::RECORDING_DROPPED_FRAMES: case StatsType::RECORDING_DROPPED_FRAMES:
return CheckRecordingDroppedFrames(); return CheckRecordingDroppedFrames();
case Type::RECORDING_BITRATE: case StatsType::RECORDING_BITRATE:
return CheckRecordingBitrate(); return CheckRecordingBitrate();
case Type::RECORDING_MB_SENT: case StatsType::RECORDING_MB_SENT:
return CheckRecordingMBSent(); return CheckRecordingMBSent();
default: default:
break; break;
@@ -382,10 +380,9 @@ bool MacroConditionStats::CheckCondition()
bool MacroConditionStats::Save(obs_data_t *obj) const bool MacroConditionStats::Save(obs_data_t *obj) const
{ {
MacroCondition::Save(obj); MacroCondition::Save(obj);
_value.Save(obj, "value"); obs_data_set_double(obj, "value", _value);
obs_data_set_int(obj, "type", static_cast<int>(_type)); obs_data_set_int(obj, "type", static_cast<int>(_type));
obs_data_set_int(obj, "condition", static_cast<int>(_condition)); obs_data_set_int(obj, "condition", static_cast<int>(_condition));
obs_data_set_int(obj, "version", 1);
return true; return true;
} }
@@ -393,14 +390,10 @@ bool MacroConditionStats::Load(obs_data_t *obj)
{ {
MacroCondition::Load(obj); MacroCondition::Load(obj);
if (!obs_data_has_user_value(obj, "version")) { _value = obs_data_get_double(obj, "value");
_value = obs_data_get_double(obj, "value"); _type = static_cast<StatsType>(obs_data_get_int(obj, "type"));
} else { _condition =
_value.Load(obj, "value"); static_cast<StatsCondition>(obs_data_get_int(obj, "condition"));
}
_type = static_cast<MacroConditionStats::Type>(
obs_data_get_int(obj, "type"));
_condition = static_cast<Condition>(obs_data_get_int(obj, "condition"));
return true; return true;
} }
@@ -419,7 +412,7 @@ static inline void populateStatsTypes(QComboBox *list)
for (auto entry : statsTypes) { for (auto entry : statsTypes) {
list->addItem(obs_module_text(entry.second.c_str())); list->addItem(obs_module_text(entry.second.c_str()));
// TODO: not implemented // TODO: not implemented
if (entry.first == MacroConditionStats::Type::DISK_USAGE) { if (entry.first == StatsType::DISK_USAGE) {
qobject_cast<QListView *>(list->view()) qobject_cast<QListView *>(list->view())
->setRowHidden(list->count() - 1, true); ->setRowHidden(list->count() - 1, true);
} }
@@ -437,9 +430,9 @@ static inline void populateConditionSelection(QComboBox *list)
MacroConditionStatsEdit::MacroConditionStatsEdit( MacroConditionStatsEdit::MacroConditionStatsEdit(
QWidget *parent, std::shared_ptr<MacroConditionStats> entryData) QWidget *parent, std::shared_ptr<MacroConditionStats> entryData)
: QWidget(parent), : QWidget(parent),
_stats(new QComboBox()), _stats(new QComboBox),
_condition(new QComboBox()), _condition(new QComboBox),
_value(new VariableDoubleSpinBox()) _value(new QDoubleSpinBox)
{ {
_value->setMaximum(999999999999); _value->setMaximum(999999999999);
@@ -449,10 +442,8 @@ MacroConditionStatsEdit::MacroConditionStatsEdit(
setToolTip( setToolTip(
obs_module_text("AdvSceneSwitcher.condition.stats.dockHint")); obs_module_text("AdvSceneSwitcher.condition.stats.dockHint"));
QWidget::connect( QWidget::connect(_value, SIGNAL(valueChanged(double)), this,
_value, SLOT(ValueChanged(double)));
SIGNAL(NumberVariableChanged(const NumberVariable<double> &)),
this, SLOT(ValueChanged(const NumberVariable<double> &)));
QWidget::connect(_stats, SIGNAL(currentIndexChanged(int)), this, QWidget::connect(_stats, SIGNAL(currentIndexChanged(int)), this,
SLOT(StatsTypeChanged(int))); SLOT(StatsTypeChanged(int)));
QWidget::connect(_condition, SIGNAL(currentIndexChanged(int)), this, QWidget::connect(_condition, SIGNAL(currentIndexChanged(int)), this,
@@ -473,7 +464,7 @@ MacroConditionStatsEdit::MacroConditionStatsEdit(
_loading = false; _loading = false;
} }
void MacroConditionStatsEdit::ValueChanged(const NumberVariable<double> &value) void MacroConditionStatsEdit::ValueChanged(double value)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
@@ -491,11 +482,10 @@ void MacroConditionStatsEdit::StatsTypeChanged(int type)
{ {
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_type = _entryData->_type = static_cast<StatsType>(type);
static_cast<MacroConditionStats::Type>(type);
SetWidgetVisibility(); SetWidgetVisibility();
} }
_value->SetFixedValue(0); _value->setValue(0);
emit HeaderInfoChanged( emit HeaderInfoChanged(
QString::fromStdString(_entryData->GetShortDesc())); QString::fromStdString(_entryData->GetShortDesc()));
} }
@@ -507,8 +497,7 @@ void MacroConditionStatsEdit::ConditionChanged(int cond)
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_condition = _entryData->_condition = static_cast<StatsCondition>(cond);
static_cast<MacroConditionStats::Condition>(cond);
} }
void MacroConditionStatsEdit::UpdateEntryData() void MacroConditionStatsEdit::UpdateEntryData()
@@ -517,7 +506,7 @@ void MacroConditionStatsEdit::UpdateEntryData()
return; return;
} }
_value->SetValue(_entryData->_value); _value->setValue(_entryData->_value);
_stats->setCurrentIndex(static_cast<int>(_entryData->_type)); _stats->setCurrentIndex(static_cast<int>(_entryData->_type));
_condition->setCurrentIndex(static_cast<int>(_entryData->_condition)); _condition->setCurrentIndex(static_cast<int>(_entryData->_condition));
SetWidgetVisibility(); SetWidgetVisibility();
@@ -530,55 +519,55 @@ void MacroConditionStatsEdit::SetWidgetVisibility()
} }
switch (_entryData->_type) { switch (_entryData->_type) {
case MacroConditionStats::Type::FPS: case StatsType::FPS:
_value->setMaximum(1000); _value->setMaximum(1000);
_value->setSuffix(""); _value->setSuffix("");
break; break;
case MacroConditionStats::Type::CPU_USAGE: case StatsType::CPU_USAGE:
_value->setMaximum(100); _value->setMaximum(100);
_value->setSuffix("%"); _value->setSuffix("%");
break; break;
case MacroConditionStats::Type::DISK_USAGE: case StatsType::DISK_USAGE:
_value->setMaximum(999999999999); _value->setMaximum(999999999999);
_value->setSuffix("MB"); _value->setSuffix("MB");
break; break;
case MacroConditionStats::Type::MEM_USAGE: case StatsType::MEM_USAGE:
_value->setMaximum(999999999999); _value->setMaximum(999999999999);
_value->setSuffix("MB"); _value->setSuffix("MB");
break; break;
case MacroConditionStats::Type::AVG_FRAMETIME: case StatsType::AVG_FRAMETIME:
_value->setMaximum(999999999999); _value->setMaximum(999999999999);
_value->setSuffix("ms"); _value->setSuffix("ms");
break; break;
case MacroConditionStats::Type::RENDER_LAG: case StatsType::RENDER_LAG:
_value->setMaximum(100); _value->setMaximum(100);
_value->setSuffix("%"); _value->setSuffix("%");
break; break;
case MacroConditionStats::Type::ENCODE_LAG: case StatsType::ENCODE_LAG:
_value->setMaximum(100); _value->setMaximum(100);
_value->setSuffix("%"); _value->setSuffix("%");
break; break;
case MacroConditionStats::Type::STREAM_DROPPED_FRAMES: case StatsType::STREAM_DROPPED_FRAMES:
_value->setMaximum(100); _value->setMaximum(100);
_value->setSuffix("%"); _value->setSuffix("%");
break; break;
case MacroConditionStats::Type::STREAM_BITRATE: case StatsType::STREAM_BITRATE:
_value->setMaximum(999999999999); _value->setMaximum(999999999999);
_value->setSuffix("kb/s"); _value->setSuffix("kb/s");
break; break;
case MacroConditionStats::Type::STREAM_MB_SENT: case StatsType::STREAM_MB_SENT:
_value->setMaximum(999999999999); _value->setMaximum(999999999999);
_value->setSuffix("MB"); _value->setSuffix("MB");
break; break;
case MacroConditionStats::Type::RECORDING_DROPPED_FRAMES: case StatsType::RECORDING_DROPPED_FRAMES:
_value->setMaximum(100); _value->setMaximum(100);
_value->setSuffix("%"); _value->setSuffix("%");
break; break;
case MacroConditionStats::Type::RECORDING_BITRATE: case StatsType::RECORDING_BITRATE:
_value->setMaximum(999999999999); _value->setMaximum(999999999999);
_value->setSuffix("kb/s"); _value->setSuffix("kb/s");
break; break;
case MacroConditionStats::Type::RECORDING_MB_SENT: case StatsType::RECORDING_MB_SENT:
_value->setMaximum(999999999999); _value->setMaximum(999999999999);
_value->setSuffix("MB"); _value->setSuffix("MB");
break; break;

View File

@@ -2,9 +2,31 @@
#include "macro.hpp" #include "macro.hpp"
#include <QWidget> #include <QWidget>
#include <QComboBox> #include <QComboBox>
#include <variable-spinbox.hpp> #include <QDoubleSpinBox>
#include <util/platform.h> #include <util/platform.h>
enum class StatsType {
FPS,
CPU_USAGE,
DISK_USAGE, // not implemented
MEM_USAGE,
AVG_FRAMETIME,
RENDER_LAG,
ENCODE_LAG,
STREAM_DROPPED_FRAMES,
STREAM_BITRATE,
STREAM_MB_SENT,
RECORDING_DROPPED_FRAMES, // not sure if this makes sense
RECORDING_BITRATE,
RECORDING_MB_SENT,
};
enum class StatsCondition {
ABOVE,
EQUALS,
BELOW,
};
class MacroConditionStats : public MacroCondition { class MacroConditionStats : public MacroCondition {
public: public:
MacroConditionStats(Macro *m); MacroConditionStats(Macro *m);
@@ -19,31 +41,9 @@ public:
return std::make_shared<MacroConditionStats>(m); return std::make_shared<MacroConditionStats>(m);
} }
NumberVariable<double> _value = 0.0; double _value = 0;
StatsType _type = StatsType::FPS;
enum class Type { StatsCondition _condition = StatsCondition::ABOVE;
FPS,
CPU_USAGE,
DISK_USAGE, // not implemented
MEM_USAGE,
AVG_FRAMETIME,
RENDER_LAG,
ENCODE_LAG,
STREAM_DROPPED_FRAMES,
STREAM_BITRATE,
STREAM_MB_SENT,
RECORDING_DROPPED_FRAMES, // not sure if this makes sense
RECORDING_BITRATE,
RECORDING_MB_SENT,
};
Type _type = Type::FPS;
enum class Condition {
ABOVE,
EQUALS,
BELOW,
};
Condition _condition = Condition::ABOVE;
private: private:
bool CheckFPS(); bool CheckFPS();
@@ -98,7 +98,7 @@ public:
} }
private slots: private slots:
void ValueChanged(const NumberVariable<double> &value); void ValueChanged(double value);
void StatsTypeChanged(int type); void StatsTypeChanged(int type);
void ConditionChanged(int cond); void ConditionChanged(int cond);
@@ -108,7 +108,7 @@ signals:
protected: protected:
QComboBox *_stats; QComboBox *_stats;
QComboBox *_condition; QComboBox *_condition;
VariableDoubleSpinBox *_value; QDoubleSpinBox *_value;
std::shared_ptr<MacroConditionStats> _entryData; std::shared_ptr<MacroConditionStats> _entryData;
private: private:

View File

@@ -1,222 +0,0 @@
#include "macro-condition-edit.hpp"
#include "macro-condition-run.hpp"
#include "utility.hpp"
#include "advanced-scene-switcher.hpp"
#include <QProcess>
#include <QDesktopServices>
const std::string MacroConditionRun::id = "run";
bool MacroConditionRun::_registered = MacroConditionFactory::Register(
MacroConditionRun::id,
{MacroConditionRun::Create, MacroConditionRunEdit::Create,
"AdvSceneSwitcher.condition.run"});
MacroConditionRun::~MacroConditionRun()
{
if (_thread.joinable()) {
_thread.join();
}
}
bool MacroConditionRun::CheckCondition()
{
if (!_threadDone) {
return false;
}
bool ret = false;
switch (_procStatus) {
case MacroConditionRun::Status::FAILED_TO_START:
SetVariableValue("Failed to start process");
ret = false;
break;
case MacroConditionRun::Status::TIMEOUT:
SetVariableValue("Timeout while running process");
ret = false;
break;
case MacroConditionRun::Status::OK:
ret = _checkExitCode ? _exitCode == _procExitCode : true;
SetVariableValue(std::to_string(_procExitCode));
break;
default:
break;
}
if (_thread.joinable()) {
_thread.join();
}
_threadDone = false;
_thread = std::thread(&MacroConditionRun::RunProcess, this);
return ret;
}
void MacroConditionRun::RunProcess()
{
QProcess process;
process.setWorkingDirectory(
QString::fromStdString(_procConfig.WorkingDir()));
process.start(QString::fromStdString(_procConfig.Path()),
_procConfig.Args());
int timeout = _timeout.Milliseconds();
vblog(LOG_INFO, "run \"%s\" with a timeout of %d ms",
_procConfig.Path().c_str(), timeout);
bool procFinishedInTime = process.waitForFinished(timeout);
if (!procFinishedInTime) {
if (process.error() == QProcess::FailedToStart) {
vblog(LOG_INFO, "failed to start \"%s\"!",
_procConfig.Path().c_str());
_procStatus = Status::FAILED_TO_START;
} else {
vblog(LOG_INFO,
"timeout while running \"%s\"\nAttempting to kill process!",
_procConfig.Path().c_str());
process.kill();
process.waitForFinished();
_procStatus = Status::TIMEOUT;
}
}
bool validExitCode = process.exitStatus() == QProcess::NormalExit;
if ((_checkExitCode && !validExitCode) || !procFinishedInTime) {
_threadDone = true;
return;
}
_procExitCode = process.exitCode();
_procStatus = Status::OK;
_threadDone = true;
}
bool MacroConditionRun::Save(obs_data_t *obj) const
{
MacroCondition::Save(obj);
_procConfig.Save(obj);
obs_data_set_bool(obj, "checkExitCode", _checkExitCode);
obs_data_set_int(obj, "exitCode", _exitCode);
_timeout.Save(obj, "timeout");
return true;
}
bool MacroConditionRun::Load(obs_data_t *obj)
{
MacroCondition::Load(obj);
_procConfig.Load(obj);
_checkExitCode = obs_data_get_bool(obj, "checkExitCode");
_exitCode = obs_data_get_int(obj, "exitCode");
_timeout.Load(obj, "timeout");
return true;
}
std::string MacroConditionRun::GetShortDesc() const
{
return _procConfig.UnresolvedPath();
}
MacroConditionRunEdit::MacroConditionRunEdit(
QWidget *parent, std::shared_ptr<MacroConditionRun> entryData)
: QWidget(parent),
_procConfig(new ProcessConfigEdit(this)),
_checkExitCode(new QCheckBox()),
_exitCode(new QSpinBox()),
_timeout(new DurationSelection(this, false, 0.1))
{
_exitCode->setMinimum(-99999);
_exitCode->setMaximum(999999);
QWidget::connect(_procConfig,
SIGNAL(ConfigChanged(const ProcessConfig &)), this,
SLOT(ProcessConfigChanged(const ProcessConfig &)));
QWidget::connect(_timeout, SIGNAL(DurationChanged(const Duration &)),
this, SLOT(TimeoutChanged(const Duration &)));
QWidget::connect(_checkExitCode, SIGNAL(stateChanged(int)), this,
SLOT(CheckExitCodeChanged(int)));
QWidget::connect(_exitCode, SIGNAL(valueChanged(int)), this,
SLOT(ExitCodeChanged(int)));
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
{"{{checkExitCode}}", _checkExitCode},
{"{{exitCode}}", _exitCode},
{"{{timeout}}", _timeout},
};
auto exitLayout = new QHBoxLayout();
placeWidgets(
obs_module_text("AdvSceneSwitcher.condition.run.entry.exit"),
exitLayout, widgetPlaceholders);
auto timeoutLayout = new QHBoxLayout();
placeWidgets(obs_module_text("AdvSceneSwitcher.condition.run.entry"),
timeoutLayout, widgetPlaceholders);
auto *layout = new QVBoxLayout;
layout->addLayout(timeoutLayout);
layout->addWidget(_procConfig);
layout->addLayout(exitLayout);
setLayout(layout);
_entryData = entryData;
UpdateEntryData();
_loading = false;
}
void MacroConditionRunEdit::UpdateEntryData()
{
if (!_entryData) {
return;
}
_procConfig->SetProcessConfig(_entryData->_procConfig);
_timeout->SetDuration(_entryData->_timeout);
_checkExitCode->setChecked(_entryData->_checkExitCode);
_exitCode->setValue(_entryData->_exitCode);
}
void MacroConditionRunEdit::TimeoutChanged(const Duration &dur)
{
if (_loading || !_entryData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_timeout = dur;
}
void MacroConditionRunEdit::CheckExitCodeChanged(int state)
{
if (_loading || !_entryData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_checkExitCode = state;
}
void MacroConditionRunEdit::ExitCodeChanged(int exitCode)
{
if (_loading || !_entryData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_exitCode = exitCode;
}
void MacroConditionRunEdit::ProcessConfigChanged(const ProcessConfig &conf)
{
if (_loading || !_entryData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_procConfig = conf;
adjustSize();
updateGeometry();
emit HeaderInfoChanged(
QString::fromStdString(_entryData->GetShortDesc()));
}

View File

@@ -1,79 +0,0 @@
#pragma once
#include "macro.hpp"
#include "process-config.hpp"
#include "duration-control.hpp"
#include <QCheckBox>
#include <QSpinBox>
class MacroConditionRun : public MacroCondition {
public:
MacroConditionRun(Macro *m) : MacroCondition(m, true) {}
~MacroConditionRun();
bool CheckCondition();
bool Save(obs_data_t *obj) const;
bool Load(obs_data_t *obj);
std::string GetShortDesc() const;
std::string GetId() const { return id; };
static std::shared_ptr<MacroCondition> Create(Macro *m)
{
return std::make_shared<MacroConditionRun>(m);
}
ProcessConfig _procConfig;
bool _checkExitCode = true;
int _exitCode = 0;
Duration _timeout = Duration(0.1);
private:
enum class Status {
NONE,
FAILED_TO_START,
TIMEOUT,
OK,
};
void RunProcess();
std::thread _thread;
std::atomic_bool _threadDone{true};
Status _procStatus = Status::NONE;
int _procExitCode = 0;
static bool _registered;
static const std::string id;
};
class MacroConditionRunEdit : public QWidget {
Q_OBJECT
public:
MacroConditionRunEdit(QWidget *parent,
std::shared_ptr<MacroConditionRun> cond = nullptr);
void UpdateEntryData();
static QWidget *Create(QWidget *parent,
std::shared_ptr<MacroCondition> cond)
{
return new MacroConditionRunEdit(
parent,
std::dynamic_pointer_cast<MacroConditionRun>(cond));
}
private slots:
void ProcessConfigChanged(const ProcessConfig &);
void TimeoutChanged(const Duration &);
void CheckExitCodeChanged(int);
void ExitCodeChanged(int);
signals:
void HeaderInfoChanged(const QString &);
protected:
ProcessConfigEdit *_procConfig;
QCheckBox *_checkExitCode;
QSpinBox *_exitCode;
DurationSelection *_timeout;
std::shared_ptr<MacroConditionRun> _entryData;
private:
bool _loading = true;
};

View File

@@ -10,14 +10,13 @@ bool MacroConditionSceneOrder::_registered = MacroConditionFactory::Register(
{MacroConditionSceneOrder::Create, MacroConditionSceneOrderEdit::Create, {MacroConditionSceneOrder::Create, MacroConditionSceneOrderEdit::Create,
"AdvSceneSwitcher.condition.sceneOrder"}); "AdvSceneSwitcher.condition.sceneOrder"});
static std::map<MacroConditionSceneOrder::Condition, std::string> static std::map<SceneOrderCondition, std::string> sceneOrderConditionTypes = {
sceneOrderConditionTypes = { {SceneOrderCondition::ABOVE,
{MacroConditionSceneOrder::Condition::ABOVE, "AdvSceneSwitcher.condition.sceneOrder.type.above"},
"AdvSceneSwitcher.condition.sceneOrder.type.above"}, {SceneOrderCondition::BELOW,
{MacroConditionSceneOrder::Condition::BELOW, "AdvSceneSwitcher.condition.sceneOrder.type.below"},
"AdvSceneSwitcher.condition.sceneOrder.type.below"}, {SceneOrderCondition::POSITION,
{MacroConditionSceneOrder::Condition::POSITION, "AdvSceneSwitcher.condition.sceneOrder.type.position"},
"AdvSceneSwitcher.condition.sceneOrder.type.position"},
}; };
struct PosInfo2 { struct PosInfo2 {
@@ -116,13 +115,13 @@ bool MacroConditionSceneOrder::CheckCondition()
bool ret = false; bool ret = false;
switch (_condition) { switch (_condition) {
case Condition::ABOVE: case SceneOrderCondition::ABOVE:
ret = isAbove(positions1, positions2); ret = isAbove(positions1, positions2);
break; break;
case Condition::BELOW: case SceneOrderCondition::BELOW:
ret = isBelow(positions1, positions2); ret = isBelow(positions1, positions2);
break; break;
case Condition::POSITION: case SceneOrderCondition::POSITION:
for (int p : positions1) { for (int p : positions1) {
if (p == _position) if (p == _position)
ret = true; ret = true;
@@ -144,8 +143,6 @@ bool MacroConditionSceneOrder::Save(obs_data_t *obj) const
_source2.Save(obj, "sceneItemSelection2"); _source2.Save(obj, "sceneItemSelection2");
obs_data_set_int(obj, "condition", static_cast<int>(_condition)); obs_data_set_int(obj, "condition", static_cast<int>(_condition));
obs_data_set_int(obj, "position", _position); obs_data_set_int(obj, "position", _position);
_position.Save(obj, "position");
obs_data_set_int(obj, "version", 1);
return true; return true;
} }
@@ -171,12 +168,9 @@ bool MacroConditionSceneOrder::Load(obs_data_t *obj)
} else { } else {
_source2.Load(obj, "sceneItemSelection2"); _source2.Load(obj, "sceneItemSelection2");
} }
_condition = static_cast<Condition>(obs_data_get_int(obj, "condition")); _condition = static_cast<SceneOrderCondition>(
if (!obs_data_has_user_value(obj, "version")) { obs_data_get_int(obj, "condition"));
_position = obs_data_get_int(obj, "position"); _position = obs_data_get_int(obj, "position");
} else {
_position.Load(obj, "position");
}
return true; return true;
} }
@@ -187,7 +181,7 @@ std::string MacroConditionSceneOrder::GetShortDesc() const
} }
std::string header = _scene.ToString() + " - " + _source.ToString(); std::string header = _scene.ToString() + " - " + _source.ToString();
if (!_source2.ToString().empty() && if (!_source2.ToString().empty() &&
_condition != MacroConditionSceneOrder::Condition::POSITION) { _condition != SceneOrderCondition::POSITION) {
header += " - " + _source2.ToString(); header += " - " + _source2.ToString();
} }
return header; return header;
@@ -202,19 +196,19 @@ static inline void populateConditionSelection(QComboBox *list)
MacroConditionSceneOrderEdit::MacroConditionSceneOrderEdit( MacroConditionSceneOrderEdit::MacroConditionSceneOrderEdit(
QWidget *parent, std::shared_ptr<MacroConditionSceneOrder> entryData) QWidget *parent, std::shared_ptr<MacroConditionSceneOrder> entryData)
: QWidget(parent), : QWidget(parent)
_scenes(new SceneSelectionWidget(window(), true, false, false, true)),
_conditions(new QComboBox()),
_sources(new SceneItemSelectionWidget(parent)),
_sources2(new SceneItemSelectionWidget(parent)),
_position(new VariableSpinBox()),
_posInfo(new QLabel(obs_module_text(
"AdvSceneSwitcher.condition.sceneOrder.positionInfo")))
{ {
_scenes = new SceneSelectionWidget(window(), true, false, false, true);
_sources = new SceneItemSelectionWidget(parent);
_sources2 = new SceneItemSelectionWidget(parent);
_conditions = new QComboBox();
_position = new QSpinBox();
_posInfo = new QLabel(obs_module_text(
"AdvSceneSwitcher.condition.sceneOrder.positionInfo"));
populateConditionSelection(_conditions); populateConditionSelection(_conditions);
if (entryData.get()) { if (entryData.get()) {
if (entryData->_condition == if (entryData->_condition == SceneOrderCondition::POSITION) {
MacroConditionSceneOrder::Condition::POSITION) {
_sources->SetPlaceholderType( _sources->SetPlaceholderType(
SceneItemSelectionWidget::Placeholder::ANY); SceneItemSelectionWidget::Placeholder::ANY);
} else { } else {
@@ -238,10 +232,8 @@ MacroConditionSceneOrderEdit::MacroConditionSceneOrderEdit(
SLOT(Source2Changed(const SceneItemSelection &))); SLOT(Source2Changed(const SceneItemSelection &)));
QWidget::connect(_conditions, SIGNAL(currentIndexChanged(int)), this, QWidget::connect(_conditions, SIGNAL(currentIndexChanged(int)), this,
SLOT(ConditionChanged(int))); SLOT(ConditionChanged(int)));
QWidget::connect( QWidget::connect(_position, SIGNAL(valueChanged(int)), this,
_position, SLOT(PositionChanged(int)));
SIGNAL(NumberVariableChanged(const NumberVariable<int> &)),
this, SLOT(PositionChanged(const NumberVariable<int> &)));
auto entryLayout = new QHBoxLayout(); auto entryLayout = new QHBoxLayout();
std::unordered_map<std::string, QWidget *> widgetPlaceholders = { std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
@@ -304,12 +296,11 @@ void MacroConditionSceneOrderEdit::ConditionChanged(int index)
{ {
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_condition = _entryData->_condition =
static_cast<MacroConditionSceneOrder::Condition>(index); static_cast<SceneOrderCondition>(index);
} }
SetWidgetVisibility(_entryData->_condition == SetWidgetVisibility(_entryData->_condition ==
MacroConditionSceneOrder::Condition::POSITION); SceneOrderCondition::POSITION);
if (_entryData->_condition == if (_entryData->_condition == SceneOrderCondition::POSITION) {
MacroConditionSceneOrder::Condition::POSITION) {
_sources->SetPlaceholderType( _sources->SetPlaceholderType(
SceneItemSelectionWidget::Placeholder::ANY); SceneItemSelectionWidget::Placeholder::ANY);
} else { } else {
@@ -321,8 +312,7 @@ void MacroConditionSceneOrderEdit::ConditionChanged(int index)
QString::fromStdString(_entryData->GetShortDesc())); QString::fromStdString(_entryData->GetShortDesc()));
} }
void MacroConditionSceneOrderEdit::PositionChanged( void MacroConditionSceneOrderEdit::PositionChanged(int value)
const NumberVariable<int> &value)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
@@ -349,8 +339,8 @@ void MacroConditionSceneOrderEdit::UpdateEntryData()
_scenes->SetScene(_entryData->_scene); _scenes->SetScene(_entryData->_scene);
_sources->SetSceneItem(_entryData->_source); _sources->SetSceneItem(_entryData->_source);
_sources2->SetSceneItem(_entryData->_source2); _sources2->SetSceneItem(_entryData->_source2);
_position->SetValue(_entryData->_position); _position->setValue(_entryData->_position);
_conditions->setCurrentIndex(static_cast<int>(_entryData->_condition)); _conditions->setCurrentIndex(static_cast<int>(_entryData->_condition));
SetWidgetVisibility(_entryData->_condition == SetWidgetVisibility(_entryData->_condition ==
MacroConditionSceneOrder::Condition::POSITION); SceneOrderCondition::POSITION);
} }

View File

@@ -2,11 +2,16 @@
#include "macro.hpp" #include "macro.hpp"
#include "scene-selection.hpp" #include "scene-selection.hpp"
#include "scene-item-selection.hpp" #include "scene-item-selection.hpp"
#include "variable-spinbox.hpp"
#include <QWidget> #include <QWidget>
#include <QComboBox> #include <QComboBox>
enum class SceneOrderCondition {
ABOVE,
BELOW,
POSITION,
};
class MacroConditionSceneOrder : public MacroCondition { class MacroConditionSceneOrder : public MacroCondition {
public: public:
MacroConditionSceneOrder(Macro *m) : MacroCondition(m) {} MacroConditionSceneOrder(Macro *m) : MacroCondition(m) {}
@@ -23,14 +28,8 @@ public:
SceneSelection _scene; SceneSelection _scene;
SceneItemSelection _source; SceneItemSelection _source;
SceneItemSelection _source2; SceneItemSelection _source2;
NumberVariable<int> _position = 0; int _position = 0;
SceneOrderCondition _condition = SceneOrderCondition::ABOVE;
enum class Condition {
ABOVE,
BELOW,
POSITION,
};
Condition _condition = Condition::ABOVE;
private: private:
static bool _registered; static bool _registered;
@@ -59,7 +58,7 @@ private slots:
void SourceChanged(const SceneItemSelection &); void SourceChanged(const SceneItemSelection &);
void Source2Changed(const SceneItemSelection &); void Source2Changed(const SceneItemSelection &);
void ConditionChanged(int cond); void ConditionChanged(int cond);
void PositionChanged(const NumberVariable<int> &); void PositionChanged(int cond);
signals: signals:
void HeaderInfoChanged(const QString &); void HeaderInfoChanged(const QString &);
@@ -68,7 +67,7 @@ protected:
QComboBox *_conditions; QComboBox *_conditions;
SceneItemSelectionWidget *_sources; SceneItemSelectionWidget *_sources;
SceneItemSelectionWidget *_sources2; SceneItemSelectionWidget *_sources2;
VariableSpinBox *_position; QSpinBox *_position;
QLabel *_posInfo; QLabel *_posInfo;
std::shared_ptr<MacroConditionSceneOrder> _entryData; std::shared_ptr<MacroConditionSceneOrder> _entryData;

View File

@@ -17,15 +17,13 @@ bool MacroConditionSceneTransform::CheckCondition()
bool ret = false; bool ret = false;
auto items = _source.GetSceneItems(_scene); auto items = _source.GetSceneItems(_scene);
std::string json;
for (auto &item : items) { for (auto &item : items) {
json = getSceneItemTransform(item); auto json = getSceneItemTransform(item);
if (matchJson(json, _settings, _regex)) { if (matchJson(json, _settings, _regex)) {
ret = true; ret = true;
} }
obs_sceneitem_release(item); obs_sceneitem_release(item);
} }
SetVariableValue(json);
return ret; return ret;
} }

View File

@@ -10,7 +10,7 @@
class MacroConditionSceneTransform : public MacroCondition { class MacroConditionSceneTransform : public MacroCondition {
public: public:
MacroConditionSceneTransform(Macro *m) : MacroCondition(m, true) {} MacroConditionSceneTransform(Macro *m) : MacroCondition(m) {}
bool CheckCondition(); bool CheckCondition();
bool Save(obs_data_t *obj) const; bool Save(obs_data_t *obj) const;
bool Load(obs_data_t *obj); bool Load(obs_data_t *obj);
@@ -24,7 +24,7 @@ public:
SceneSelection _scene; SceneSelection _scene;
SceneItemSelection _source; SceneItemSelection _source;
RegexConfig _regex; RegexConfig _regex;
StringVariable _settings = ""; VariableResolvingString _settings = "";
private: private:
static bool _registered; static bool _registered;

View File

@@ -29,7 +29,7 @@ public:
SourceSelection _source; SourceSelection _source;
SourceCondition _condition = SourceCondition::ACTIVE; SourceCondition _condition = SourceCondition::ACTIVE;
StringVariable _settings = ""; VariableResolvingString _settings = "";
RegexConfig _regex; RegexConfig _regex;
private: private:

View File

@@ -35,12 +35,12 @@ bool MacroConditionTimer::CheckCondition()
void MacroConditionTimer::SetRandomTimeRemaining() void MacroConditionTimer::SetRandomTimeRemaining()
{ {
double min, max; double min, max;
if (_duration.Seconds() <= _duration2.Seconds()) { if (_duration.seconds <= _duration2.seconds) {
min = _duration.Seconds(); min = _duration.seconds;
max = _duration2.Seconds(); max = _duration2.seconds;
} else { } else {
min = _duration2.Seconds(); min = _duration2.seconds;
max = _duration.Seconds(); max = _duration.seconds;
} }
std::uniform_real_distribution<double> unif(min, max); std::uniform_real_distribution<double> unif(min, max);
@@ -53,18 +53,17 @@ bool MacroConditionTimer::Save(obs_data_t *obj) const
MacroCondition::Save(obj); MacroCondition::Save(obj);
obs_data_set_int(obj, "type", static_cast<int>(_type)); obs_data_set_int(obj, "type", static_cast<int>(_type));
_duration.Save(obj); _duration.Save(obj);
_duration2.Save(obj, "duration2"); _duration2.Save(obj, "seconds2", "displayUnit2");
if (_saveRemaining) { if (_saveRemaining) {
obs_data_set_double(obj, "remaining", obs_data_set_double(obj, "remaining",
_paused ? _remaining _paused ? _remaining
: _duration.TimeRemaining()); : _duration.TimeRemaining());
} else { } else {
obs_data_set_double(obj, "remaining", _duration.Seconds()); obs_data_set_double(obj, "remaining", _duration.seconds);
} }
obs_data_set_bool(obj, "saveRemaining", _saveRemaining); obs_data_set_bool(obj, "saveRemaining", _saveRemaining);
obs_data_set_bool(obj, "paused", _paused); obs_data_set_bool(obj, "paused", _paused);
obs_data_set_bool(obj, "oneshot", _oneshot); obs_data_set_bool(obj, "oneshot", _oneshot);
obs_data_set_int(obj, "version", 1);
return true; return true;
} }
@@ -73,14 +72,7 @@ bool MacroConditionTimer::Load(obs_data_t *obj)
MacroCondition::Load(obj); MacroCondition::Load(obj);
_type = static_cast<TimerType>(obs_data_get_int(obj, "type")); _type = static_cast<TimerType>(obs_data_get_int(obj, "type"));
_duration.Load(obj); _duration.Load(obj);
// TODO: remove this fallback _duration2.Load(obj, "seconds2", "displayUnit2");
if (obs_data_get_int(obj, "version") == 1) {
_duration2.Load(obj, "duration2");
} else {
_duration2.Load(obj, "seconds2");
_duration2.SetUnit(static_cast<Duration::Unit>(
obs_data_get_int(obj, "displayUnit2")));
}
_remaining = obs_data_get_double(obj, "remaining"); _remaining = obs_data_get_double(obj, "remaining");
_paused = obs_data_get_bool(obj, "paused"); _paused = obs_data_get_bool(obj, "paused");
_saveRemaining = obs_data_get_bool(obj, "saveRemaining"); _saveRemaining = obs_data_get_bool(obj, "saveRemaining");
@@ -111,7 +103,7 @@ void MacroConditionTimer::Continue()
void MacroConditionTimer::Reset() void MacroConditionTimer::Reset()
{ {
_remaining = _duration.Seconds(); _remaining = _duration.seconds;
_duration.Reset(); _duration.Reset();
if (_type == TimerType::RANDOM) { if (_type == TimerType::RANDOM) {
SetRandomTimeRemaining(); SetRandomTimeRemaining();
@@ -144,10 +136,14 @@ MacroConditionTimerEdit::MacroConditionTimerEdit(
QWidget::connect(_timerTypes, SIGNAL(currentIndexChanged(int)), this, QWidget::connect(_timerTypes, SIGNAL(currentIndexChanged(int)), this,
SLOT(TimerTypeChanged(int))); SLOT(TimerTypeChanged(int)));
QWidget::connect(_duration, SIGNAL(DurationChanged(const Duration &)), QWidget::connect(_duration, SIGNAL(DurationChanged(double)), this,
this, SLOT(DurationChanged(const Duration &))); SLOT(DurationChanged(double)));
QWidget::connect(_duration2, SIGNAL(DurationChanged(const Duration &)), QWidget::connect(_duration, SIGNAL(UnitChanged(DurationUnit)), this,
this, SLOT(Duration2Changed(const Duration &))); SLOT(DurationUnitChanged(DurationUnit)));
QWidget::connect(_duration2, SIGNAL(DurationChanged(double)), this,
SLOT(Duration2Changed(double)));
QWidget::connect(_duration2, SIGNAL(UnitChanged(DurationUnit)), this,
SLOT(Duration2UnitChanged(DurationUnit)));
QWidget::connect(_pauseConinue, SIGNAL(clicked()), this, QWidget::connect(_pauseConinue, SIGNAL(clicked()), this,
SLOT(PauseContinueClicked())); SLOT(PauseContinueClicked()));
QWidget::connect(_reset, SIGNAL(clicked()), this, SLOT(ResetClicked())); QWidget::connect(_reset, SIGNAL(clicked()), this, SLOT(ResetClicked()));
@@ -205,24 +201,44 @@ void MacroConditionTimerEdit::TimerTypeChanged(int type)
SetWidgetVisibility(); SetWidgetVisibility();
} }
void MacroConditionTimerEdit::DurationChanged(const Duration &dur) void MacroConditionTimerEdit::DurationChanged(double seconds)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_duration = dur; _entryData->_duration.seconds = seconds;
} }
void MacroConditionTimerEdit::Duration2Changed(const Duration &dur) void MacroConditionTimerEdit::DurationUnitChanged(DurationUnit unit)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_duration2 = dur; _entryData->_duration.displayUnit = unit;
}
void MacroConditionTimerEdit::Duration2Changed(double seconds)
{
if (_loading || !_entryData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_duration2.seconds = seconds;
}
void MacroConditionTimerEdit::Duration2UnitChanged(DurationUnit unit)
{
if (_loading || !_entryData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_duration2.displayUnit = unit;
} }
void MacroConditionTimerEdit::SaveRemainingChanged(int state) void MacroConditionTimerEdit::SaveRemainingChanged(int state)

View File

@@ -63,8 +63,10 @@ public:
private slots: private slots:
void TimerTypeChanged(int type); void TimerTypeChanged(int type);
void DurationChanged(const Duration &seconds); void DurationChanged(double seconds);
void Duration2Changed(const Duration &seconds); void DurationUnitChanged(DurationUnit unit);
void Duration2Changed(double seconds);
void Duration2UnitChanged(DurationUnit unit);
void SaveRemainingChanged(int state); void SaveRemainingChanged(int state);
void AutoResetChanged(int state); void AutoResetChanged(int state);
void PauseContinueClicked(); void PauseContinueClicked();

View File

@@ -70,7 +70,7 @@ bool MacroConditionTransition::CheckCondition()
break; break;
} }
case TransitionCondition::DURATION: case TransitionCondition::DURATION:
ret = _duration.Milliseconds() == ret = _duration.seconds * 1000 ==
obs_frontend_get_transition_duration(); obs_frontend_get_transition_duration();
break; break;
case TransitionCondition::STARTED: case TransitionCondition::STARTED:
@@ -198,8 +198,8 @@ MacroConditionTransitionEdit::MacroConditionTransitionEdit(
SLOT(TransitionChanged(const TransitionSelection &))); SLOT(TransitionChanged(const TransitionSelection &)));
QWidget::connect(_scenes, SIGNAL(SceneChanged(const SceneSelection &)), QWidget::connect(_scenes, SIGNAL(SceneChanged(const SceneSelection &)),
this, SLOT(SceneChanged(const SceneSelection &))); this, SLOT(SceneChanged(const SceneSelection &)));
QWidget::connect(_duration, SIGNAL(DurationChanged(const Duration &)), QWidget::connect(_duration, SIGNAL(DurationChanged(double)), this,
this, SLOT(DurationChanged(const Duration &))); SLOT(DurationChanged(double)));
QHBoxLayout *mainLayout = new QHBoxLayout; QHBoxLayout *mainLayout = new QHBoxLayout;
std::unordered_map<std::string, QWidget *> widgetPlaceholders = { std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
@@ -260,14 +260,14 @@ void MacroConditionTransitionEdit::SceneChanged(const SceneSelection &s)
_entryData->_scene = s; _entryData->_scene = s;
} }
void MacroConditionTransitionEdit::DurationChanged(const Duration &dur) void MacroConditionTransitionEdit::DurationChanged(double seconds)
{ {
if (_loading || !_entryData) { if (_loading || !_entryData) {
return; return;
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_duration = dur; _entryData->_duration.seconds = seconds;
} }
void MacroConditionTransitionEdit::SetWidgetVisibility() void MacroConditionTransitionEdit::SetWidgetVisibility()

View File

@@ -68,7 +68,7 @@ private slots:
void ConditionChanged(int cond); void ConditionChanged(int cond);
void TransitionChanged(const TransitionSelection &); void TransitionChanged(const TransitionSelection &);
void SceneChanged(const SceneSelection &); void SceneChanged(const SceneSelection &);
void DurationChanged(const Duration &seconds); void DurationChanged(double seconds);
signals: signals:
void HeaderInfoChanged(const QString &); void HeaderInfoChanged(const QString &);

View File

@@ -36,13 +36,15 @@ const static std::map<MacroConditionVariable::Type, std::string>
static bool isNumber(const Variable &var) static bool isNumber(const Variable &var)
{ {
return var.DoubleValue().has_value(); double _;
return var.DoubleValue(_);
} }
static bool compareNumber(const Variable &var, double value, bool less) static bool compareNumber(const Variable &var, double value, bool less)
{ {
auto varValue = var.DoubleValue(); double varValue;
if (!varValue.has_value()) {
if (!var.DoubleValue(varValue)) {
return false; return false;
} }
if (less) { if (less) {
@@ -76,15 +78,15 @@ bool MacroConditionVariable::ValueChanged(const Variable &var)
bool MacroConditionVariable::CompareVariables() bool MacroConditionVariable::CompareVariables()
{ {
auto var1 = _variable.lock(); auto var1 = GetVariableByName(_variableName);
auto var2 = _variable2.lock(); auto var2 = GetVariableByName(_variable2Name);
if (!var1 || !var2) { if (!var1 || !var2) {
return false; return false;
} }
auto val1 = var1->DoubleValue(); double val1, val2;
auto val2 = var2->DoubleValue(); bool validNumbers = var1->DoubleValue(val1);
bool validNumbers = val1.has_value() && val2.has_value(); validNumbers = validNumbers && var2->DoubleValue(val2);
switch (_type) { switch (_type) {
case MacroConditionVariable::Type::EQUALS_VARIABLE: case MacroConditionVariable::Type::EQUALS_VARIABLE:
@@ -105,7 +107,7 @@ bool MacroConditionVariable::CompareVariables()
bool MacroConditionVariable::CheckCondition() bool MacroConditionVariable::CheckCondition()
{ {
auto var = _variable.lock(); auto var = GetVariableByName(_variableName);
if (!var) { if (!var) {
return false; return false;
} }
@@ -137,10 +139,8 @@ bool MacroConditionVariable::CheckCondition()
bool MacroConditionVariable::Save(obs_data_t *obj) const bool MacroConditionVariable::Save(obs_data_t *obj) const
{ {
MacroCondition::Save(obj); MacroCondition::Save(obj);
obs_data_set_string(obj, "variableName", obs_data_set_string(obj, "variableName", _variableName.c_str());
GetWeakVariableName(_variable).c_str()); obs_data_set_string(obj, "variable2Name", _variable2Name.c_str());
obs_data_set_string(obj, "variable2Name",
GetWeakVariableName(_variable2).c_str());
obs_data_set_string(obj, "strValue", _strValue.c_str()); obs_data_set_string(obj, "strValue", _strValue.c_str());
obs_data_set_double(obj, "numValue", _numValue); obs_data_set_double(obj, "numValue", _numValue);
obs_data_set_int(obj, "condition", static_cast<int>(_type)); obs_data_set_int(obj, "condition", static_cast<int>(_type));
@@ -151,10 +151,8 @@ bool MacroConditionVariable::Save(obs_data_t *obj) const
bool MacroConditionVariable::Load(obs_data_t *obj) bool MacroConditionVariable::Load(obs_data_t *obj)
{ {
MacroCondition::Load(obj); MacroCondition::Load(obj);
_variable = _variableName = obs_data_get_string(obj, "variableName");
GetWeakVariableByName(obs_data_get_string(obj, "variableName")); _variable2Name = obs_data_get_string(obj, "variable2Name");
_variable2 = GetWeakVariableByName(
obs_data_get_string(obj, "variable2Name"));
_strValue = obs_data_get_string(obj, "strValue"); _strValue = obs_data_get_string(obj, "strValue");
_numValue = obs_data_get_double(obj, "numValue"); _numValue = obs_data_get_double(obj, "numValue");
_type = static_cast<Type>(obs_data_get_int(obj, "condition")); _type = static_cast<Type>(obs_data_get_int(obj, "condition"));
@@ -169,7 +167,7 @@ bool MacroConditionVariable::Load(obs_data_t *obj)
std::string MacroConditionVariable::GetShortDesc() const std::string MacroConditionVariable::GetShortDesc() const
{ {
return GetWeakVariableName(_variable); return _variableName;
} }
static inline void populateConditionSelection(QComboBox *list) static inline void populateConditionSelection(QComboBox *list)
@@ -240,8 +238,8 @@ void MacroConditionVariableEdit::UpdateEntryData()
return; return;
} }
_variables->SetVariable(_entryData->_variable); _variables->SetVariable(_entryData->_variableName);
_variables2->SetVariable(_entryData->_variable2); _variables2->SetVariable(_entryData->_variable2Name);
_conditions->setCurrentIndex(static_cast<int>(_entryData->_type)); _conditions->setCurrentIndex(static_cast<int>(_entryData->_type));
_strValue->setPlainText(QString::fromStdString(_entryData->_strValue)); _strValue->setPlainText(QString::fromStdString(_entryData->_strValue));
_numValue->setValue(_entryData->_numValue); _numValue->setValue(_entryData->_numValue);
@@ -256,7 +254,7 @@ void MacroConditionVariableEdit::VariableChanged(const QString &text)
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_variable = GetWeakVariableByQString(text); _entryData->_variableName = text.toStdString();
} }
void MacroConditionVariableEdit::Variable2Changed(const QString &text) void MacroConditionVariableEdit::Variable2Changed(const QString &text)
@@ -267,7 +265,7 @@ void MacroConditionVariableEdit::Variable2Changed(const QString &text)
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_variable2 = GetWeakVariableByQString(text); _entryData->_variable2Name = text.toStdString();
} }
void MacroConditionVariableEdit::ConditionChanged(int value) void MacroConditionVariableEdit::ConditionChanged(int value)

View File

@@ -35,8 +35,8 @@ public:
}; };
Type _type = Type::EQUALS; Type _type = Type::EQUALS;
std::weak_ptr<Variable> _variable; std::string _variableName = "";
std::weak_ptr<Variable> _variable2; std::string _variable2Name = "";
std::string _strValue = ""; std::string _strValue = "";
double _numValue = 0; double _numValue = 0;
RegexConfig _regex; RegexConfig _regex;

View File

@@ -38,7 +38,7 @@ bool MacroConditionWebsocket::CheckCondition()
messages = &switcher->websocketMessages; messages = &switcher->websocketMessages;
break; break;
case MacroConditionWebsocket::Type::EVENT: { case MacroConditionWebsocket::Type::EVENT: {
auto connection = _connection.lock(); auto connection = GetConnectionByName(_connection);
if (!connection) { if (!connection) {
return false; return false;
} }
@@ -76,8 +76,7 @@ bool MacroConditionWebsocket::Save(obs_data_t *obj) const
obs_data_set_int(obj, "type", static_cast<int>(_type)); obs_data_set_int(obj, "type", static_cast<int>(_type));
_message.Save(obj, "message"); _message.Save(obj, "message");
_regex.Save(obj); _regex.Save(obj);
obs_data_set_string(obj, "connection", obs_data_set_string(obj, "connection", _connection.c_str());
GetWeakConnectionName(_connection).c_str());
return true; return true;
} }
@@ -92,8 +91,7 @@ bool MacroConditionWebsocket::Load(obs_data_t *obj)
_regex.CreateBackwardsCompatibleRegex( _regex.CreateBackwardsCompatibleRegex(
obs_data_get_bool(obj, "useRegex"), false); obs_data_get_bool(obj, "useRegex"), false);
} }
_connection = _connection = obs_data_get_string(obj, "connection");
GetWeakConnectionByName(obs_data_get_string(obj, "connection"));
return true; return true;
} }
@@ -102,7 +100,7 @@ std::string MacroConditionWebsocket::GetShortDesc() const
if (_type == Type::REQUEST) { if (_type == Type::REQUEST) {
return ""; return "";
} }
return GetWeakConnectionName(_connection); return _connection;
} }
static inline void populateConditionSelection(QComboBox *list) static inline void populateConditionSelection(QComboBox *list)
@@ -239,7 +237,7 @@ void MacroConditionWebsocketEdit::ConnectionSelectionChanged(
} }
std::lock_guard<std::mutex> lock(switcher->m); std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_connection = GetWeakConnectionByQString(connection); _entryData->_connection = connection.toStdString();
emit(HeaderInfoChanged(connection)); emit(HeaderInfoChanged(connection));
} }

View File

@@ -25,9 +25,10 @@ public:
}; };
Type _type = Type::REQUEST; Type _type = Type::REQUEST;
StringVariable _message = obs_module_text("AdvSceneSwitcher.enterText"); VariableResolvingString _message =
obs_module_text("AdvSceneSwitcher.enterText");
RegexConfig _regex; RegexConfig _regex;
std::weak_ptr<Connection> _connection; std::string _connection;
private: private:
static bool _registered; static bool _registered;

View File

@@ -12,30 +12,24 @@ const std::map<LogicType, LogicTypeInfo> MacroCondition::logicTypes = {
}; };
void DurationModifier::Save(obs_data_t *obj, const char *condName, void DurationModifier::Save(obs_data_t *obj, const char *condName,
const char *duration) const const char *secondsName, const char *unitName) const
{ {
obs_data_set_int(obj, condName, static_cast<int>(_type)); obs_data_set_int(obj, condName, static_cast<int>(_type));
_dur.Save(obj, duration); _dur.Save(obj, secondsName, unitName);
} }
void DurationModifier::Load(obs_data_t *obj, const char *condName, void DurationModifier::Load(obs_data_t *obj, const char *condName,
const char *duration) const char *secondsName, const char *unitName)
{ {
// For backwards compatability check if duration value exist without // For backwards compatability check if duration value exist without
// time constraint condition - if so assume DurationCondition::MORE // time constraint condition - if so assume DurationCondition::MORE
if (!obs_data_has_user_value(obj, condName) && if (!obs_data_has_user_value(obj, condName) &&
obs_data_has_user_value(obj, duration)) { obs_data_has_user_value(obj, secondsName)) {
obs_data_set_int(obj, condName, static_cast<int>(Type::MORE)); obs_data_set_int(obj, condName, static_cast<int>(Type::MORE));
} }
_type = static_cast<Type>(obs_data_get_int(obj, condName)); _type = static_cast<Type>(obs_data_get_int(obj, condName));
_dur.Load(obj, duration); _dur.Load(obj, secondsName, unitName);
// TODO: remove this fallback
if (obs_data_has_user_value(obj, "displayUnit")) {
_dur.SetUnit(static_cast<Duration::Unit>(
obs_data_get_int(obj, "displayUnit")));
}
} }
bool DurationModifier::DurationReached() bool DurationModifier::DurationReached()
@@ -133,7 +127,7 @@ void MacroCondition::CheckDurationModifier(bool &val)
case DurationModifier::Type::WITHIN: case DurationModifier::Type::WITHIN:
if (val) { if (val) {
_duration.SetTimeRemaining( _duration.SetTimeRemaining(
_duration.GetDuration().Seconds()); _duration.GetDuration().seconds);
} }
val = val || _duration.DurationReached(); val = val || _duration.DurationReached();
break; break;
@@ -147,9 +141,14 @@ void MacroCondition::SetDurationModifier(DurationModifier::Type m)
_duration.SetModifier(m); _duration.SetModifier(m);
} }
void MacroCondition::SetDuration(const Duration &duration) void MacroCondition::SetDurationUnit(DurationUnit u)
{ {
_duration.SetValue(duration); _duration.SetUnit(u);
}
void MacroCondition::SetDuration(double seconds)
{
_duration.SetValue(seconds);
} }
MacroRefCondition::MacroRefCondition(Macro *m, bool supportsVariableValue) MacroRefCondition::MacroRefCondition(Macro *m, bool supportsVariableValue)
@@ -157,10 +156,9 @@ MacroRefCondition::MacroRefCondition(Macro *m, bool supportsVariableValue)
{ {
} }
bool MacroRefCondition::PostLoad() void MacroRefCondition::ResolveMacroRef()
{ {
_macro.PostLoad(); _macro.UpdateRef();
return true;
} }
MultiMacroRefCondtition::MultiMacroRefCondtition(Macro *m, MultiMacroRefCondtition::MultiMacroRefCondtition(Macro *m,
@@ -169,10 +167,9 @@ MultiMacroRefCondtition::MultiMacroRefCondtition(Macro *m,
{ {
} }
bool MultiMacroRefCondtition::PostLoad() void MultiMacroRefCondtition::ResolveMacroRef()
{ {
for (auto &macro : _macros) { for (auto &m : _macros) {
macro.PostLoad(); m.UpdateRef();
} }
return true;
} }

View File

@@ -39,12 +39,15 @@ public:
}; };
void Save(obs_data_t *obj, const char *condName = "time_constraint", void Save(obs_data_t *obj, const char *condName = "time_constraint",
const char *duration = "seconds") const; const char *secondsName = "seconds",
const char *unitName = "displayUnit") const;
void Load(obs_data_t *obj, const char *condName = "time_constraint", void Load(obs_data_t *obj, const char *condName = "time_constraint",
const char *duration = "seconds"); const char *secondsName = "seconds",
const char *unitName = "displayUnit");
void SetModifier(Type cond) { _type = cond; } void SetModifier(Type cond) { _type = cond; }
void SetTimeRemaining(const double &val) { _dur.SetTimeRemaining(val); } void SetTimeRemaining(const double &val) { _dur.SetTimeRemaining(val); }
void SetValue(const Duration &value) { _dur = value; } void SetValue(double value) { _dur.seconds = value; }
void SetUnit(DurationUnit u) { _dur.displayUnit = u; }
Type GetType() { return _type; } Type GetType() { return _type; }
Duration GetDuration() { return _dur; } Duration GetDuration() { return _dur; }
bool DurationReached(); bool DurationReached();
@@ -70,7 +73,8 @@ public:
void CheckDurationModifier(bool &val); void CheckDurationModifier(bool &val);
DurationModifier GetDurationModifier() { return _duration; } DurationModifier GetDurationModifier() { return _duration; }
void SetDurationModifier(DurationModifier::Type m); void SetDurationModifier(DurationModifier::Type m);
void SetDuration(const Duration &duration); void SetDurationUnit(DurationUnit u);
void SetDuration(double seconds);
private: private:
LogicType _logic = LogicType::ROOT_NONE; LogicType _logic = LogicType::ROOT_NONE;
@@ -80,15 +84,13 @@ private:
class MacroRefCondition : virtual public MacroCondition { class MacroRefCondition : virtual public MacroCondition {
public: public:
MacroRefCondition(Macro *m, bool supportsVariableValue = false); MacroRefCondition(Macro *m, bool supportsVariableValue = false);
bool PostLoad() override; void ResolveMacroRef();
MacroRef _macro; MacroRef _macro;
}; };
class MultiMacroRefCondtition : virtual public MacroCondition { class MultiMacroRefCondtition : virtual public MacroCondition {
public: public:
MultiMacroRefCondtition(Macro *m, bool supportsVariableValue = false); MultiMacroRefCondtition(Macro *m, bool supportsVariableValue = false);
bool PostLoad() override; void ResolveMacroRef();
std::vector<MacroRef> _macros; std::vector<MacroRef> _macros;
}; };

Some files were not shown because too many files have changed in this diff Show More