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

View File

@@ -191,8 +191,6 @@ target_sources(
src/macro-core/macro-condition-recording.hpp
src/macro-core/macro-condition-replay-buffer.cpp
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.hpp
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.cpp
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.hpp
src/macro-core/macro-ref.cpp
@@ -254,15 +250,8 @@ target_sources(
src/utils/file-selection.hpp
src/utils/macro-list.cpp
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.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.hpp
src/utils/resizing-text-edit.cpp
@@ -279,24 +268,12 @@ target_sources(
src/utils/slider-spinbox.hpp
src/utils/source-selection.cpp
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.hpp
src/utils/utility.cpp
src/utils/utility.hpp
src/utils/variable.cpp
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.hpp
src/utils/volume-control.cpp
@@ -343,8 +320,7 @@ target_include_directories(
${LIB_NAME}
PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/deps/asio/asio/include"
"${CMAKE_CURRENT_SOURCE_DIR}/deps/websocketpp"
"${CMAKE_CURRENT_SOURCE_DIR}/deps/obs-websocket/lib"
"${CMAKE_CURRENT_SOURCE_DIR}/deps/exprtk")
"${CMAKE_CURRENT_SOURCE_DIR}/deps/obs-websocket/lib")
# --- End of section ---
@@ -355,8 +331,7 @@ if(OS_WINDOWS)
target_compile_definitions(${LIB_NAME} PRIVATE UNICODE _UNICODE)
if(MSVC)
target_compile_options(${LIB_NAME} PUBLIC /MP /d2FH4- /wd4267 /wd4267
/bigobj)
target_compile_options(${LIB_NAME} PUBLIC /MP /d2FH4- /wd4267 /wd4267)
endif()
target_sources(${LIB_NAME} PRIVATE src/win/advanced-scene-switcher-win.cpp)
add_definitions(-D_WEBSOCKETPP_CPP11_STL_)
@@ -473,4 +448,3 @@ endif()
# --- End of section ---
add_subdirectory(src/macro-external)
add_subdirectory(tests)

View File

@@ -22,5 +22,9 @@
</array>
<key>LSMinimumSystemVersion</key>
<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>
</plist>

View File

@@ -25,7 +25,7 @@ DirExistsWarning=no
Name: "english"; MessagesFile: "compiler:Default.isl"
[Files]
Source: "..\release\*"; Excludes: "*.zip"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "..\release\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "..\LICENSE"; Flags: dontcopy
; 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.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.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.type.moveUp="Nach oben 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.conditionNoVariableSupport="Das Abrufen von Variablenwerten aus %1 Bedingungen wird nicht unterstützt!"
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

View File

@@ -95,19 +95,11 @@ AdvSceneSwitcher.macroTab.maximize="Maximize"
AdvSceneSwitcher.macroTab.minimize="Minimize"
AdvSceneSwitcher.macroTab.highlightSettings="Visual settings"
AdvSceneSwitcher.macroTab.hotkeySettings="Hotkey settings"
AdvSceneSwitcher.macroTab.dockSettings="Dock settings"
AdvSceneSwitcher.macroTab.highlightExecutedMacros="Highlight recently executed macros"
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.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.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
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.greaterThanVariable="is greater than variable"
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
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.entry="{{actions}}"
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.type.show="Show"
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.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.entry="Press {{keys}} for {{duration}}"
AdvSceneSwitcher.action.hotkey.entry="Press {{keys}} for {{duration}} milliseconds"
AdvSceneSwitcher.action.sceneOrder="Scene item order"
AdvSceneSwitcher.action.sceneOrder.type.moveUp="Move up"
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.event="Send scene switcher {{type}} to connected clients"
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.post="POST"
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.roundToInt="Round to nearest integer"
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.all="All"
AdvSceneSwitcher.action.variable.invalidSelection="Invalid selection!"
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.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.substringRegex="Assign value of{{regexMatchIdx}}match using regular expression:"
AdvSceneSwitcher.action.variable.entry.findAndReplace="{{findStr}}{{replaceStr}}"
AdvSceneSwitcher.action.projector="Projector"
AdvSceneSwitcher.action.projector.type.source="Source"
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.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.selectPreviousScene="Previous 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.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.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.type.moveUp="Mover hacia arriba"
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.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.entry="Bas {{keys}} uygun {{duration}}"
AdvSceneSwitcher.action.hotkey.entry="Bas {{keys}} uygun {{duration}} millisaniye"
AdvSceneSwitcher.action.sceneOrder="Sahne öğesi sırası"
AdvSceneSwitcher.action.sceneOrder.type.moveUp="Yukarı taşı"
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.onlyOBS="仅向OBS发送按键"
AdvSceneSwitcher.action.hotkey.disabled="无法模拟按键-功能已禁用!"
AdvSceneSwitcher.action.hotkey.entry="按下 {{keys}} for {{duration}}"
AdvSceneSwitcher.action.hotkey.entry="按下 {{keys}} for {{duration}} 毫秒"
AdvSceneSwitcher.action.sceneOrder="场景项目顺序"
AdvSceneSwitcher.action.sceneOrder.type.moveUp="上移"
AdvSceneSwitcher.action.sceneOrder.type.moveDown="下移"
@@ -541,7 +541,7 @@ AdvSceneSwitcher.action.variable.type.append="追加"
AdvSceneSwitcher.action.variable.type.appendVar="追加变量"
AdvSceneSwitcher.action.variable.type.increment="增加"
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

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"?>
<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)
{
if (!switcher) {
return "";
}
return switcher->translate(text);
}

View File

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

View File

@@ -60,24 +60,44 @@ void AdvSceneSwitcher::on_noMatchRandomSwitch_clicked()
ui->randomDisabledWarning->setVisible(false);
}
void AdvSceneSwitcher::NoMatchDelayDurationChanged(const Duration &dur)
void AdvSceneSwitcher::NoMatchDelayDurationChanged(double sec)
{
if (loading) {
return;
}
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) {
return;
}
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)
@@ -538,8 +558,8 @@ void SwitcherData::loadSettings(obs_data_t *obj)
// selections to be available.
loadSceneGroups(obj);
loadVariables(obj);
loadConnections(obj);
loadMacros(obj);
loadConnections(obj);
loadWindowTitleSwitches(obj);
loadScreenRegionSwitches(obj);
loadPauseSwitches(obj);
@@ -602,9 +622,9 @@ void SwitcherData::saveGeneralSettings(obs_data_t *obj)
obs_data_set_string(obj, "non_matching_scene",
nonMatchingSceneName.c_str());
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);
sceneColletionStop = false;
@@ -652,9 +672,9 @@ void SwitcherData::loadGeneralSettings(obs_data_t *obj)
std::string nonMatchingSceneName =
obs_data_get_string(obj, "non_matching_scene");
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");
startupBehavior =
@@ -950,9 +970,10 @@ void AdvSceneSwitcher::setupGeneralTab()
noMatchDelay->setToolTip(obs_module_text(
"AdvSceneSwitcher.generalTab.generalBehavior.onNoMetDelayTooltip"));
ui->noMatchLayout->addWidget(noMatchDelay);
QWidget::connect(noMatchDelay,
SIGNAL(DurationChanged(const Duration &)), this,
SLOT(NoMatchDelayDurationChanged(const Duration &)));
QWidget::connect(noMatchDelay, SIGNAL(DurationChanged(double)), this,
SLOT(NoMatchDelayDurationChanged(double)));
QWidget::connect(noMatchDelay, SIGNAL(UnitChanged(DurationUnit)), this,
SLOT(NoMatchDelayUnitChanged(DurationUnit)));
ui->checkInterval->setValue(switcher->interval);
@@ -962,9 +983,10 @@ void AdvSceneSwitcher::setupGeneralTab()
"AdvSceneSwitcher.generalTab.generalBehavior.cooldownHint"));
ui->cooldownLayout->addWidget(cooldownTime);
ui->cooldownLayout->addStretch();
QWidget::connect(cooldownTime,
SIGNAL(DurationChanged(const Duration &)), this,
SLOT(CooldownDurationChanged(const Duration &)));
QWidget::connect(cooldownTime, SIGNAL(DurationChanged(double)), this,
SLOT(CooldownDurationChanged(double)));
QWidget::connect(cooldownTime, SIGNAL(UnitChanged(DurationUnit)), this,
SLOT(CooldownUnitChanged(DurationUnit)));
ui->verboseLogging->setChecked(switcher->verbose);
ui->saveWindowGeo->setChecked(switcher->saveWindowGeo);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -224,7 +224,7 @@ bool MacroActionHotkey::PerformAction()
}
if (!keys.empty()) {
int dur = _duration.Milliseconds();
int dur = _duration;
if (_onlySendToObs || !canSimulateKeyPresses) {
std::thread t([keys, dur]() { InjectKeys(keys, dur); });
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, "left_meta", _leftMeta);
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_int(obj, "version", 1);
return true;
}
@@ -272,11 +271,7 @@ bool MacroActionHotkey::Load(obs_data_t *obj)
_rightAlt = obs_data_get_bool(obj, "right_alt");
_leftMeta = obs_data_get_bool(obj, "left_meta");
_rightMeta = obs_data_get_bool(obj, "right_meta");
if (!obs_data_has_user_value(obj, "version")) {
_duration = obs_data_get_int(obj, "duration") / 1000.0;
} else {
_duration.Load(obj);
}
_duration = obs_data_get_int(obj, "duration");
_onlySendToObs = obs_data_get_bool(obj, "onlyOBS");
return true;
}
@@ -393,30 +388,32 @@ static inline void populateKeySelection(QComboBox *list)
MacroActionHotkeyEdit::MacroActionHotkeyEdit(
QWidget *parent, std::shared_ptr<MacroActionHotkey> entryData)
: 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")))
: 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 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);
QWidget::connect(_keys, SIGNAL(currentIndexChanged(int)), this,
@@ -437,8 +434,8 @@ MacroActionHotkeyEdit::MacroActionHotkeyEdit(
SLOT(LMetaChanged(int)));
QWidget::connect(_rightMeta, SIGNAL(stateChanged(int)), this,
SLOT(RMetaChanged(int)));
QWidget::connect(_duration, SIGNAL(DurationChanged(const Duration &)),
this, SLOT(DurationChanged(const Duration &)));
QWidget::connect(_duration, SIGNAL(valueChanged(int)), this,
SLOT(DurationChanged(int)));
QWidget::connect(_onlySendToOBS, SIGNAL(stateChanged(int)), this,
SLOT(OnlySendToOBSChanged(int)));
@@ -496,7 +493,7 @@ void MacroActionHotkeyEdit::UpdateEntryData()
_rightAlt->setChecked(_entryData->_rightAlt);
_leftMeta->setChecked(_entryData->_leftMeta);
_rightMeta->setChecked(_entryData->_rightMeta);
_duration->SetDuration(_entryData->_duration);
_duration->setValue(_entryData->_duration);
_onlySendToOBS->setChecked(_entryData->_onlySendToObs ||
!canSimulateKeyPresses);
SetWarningVisibility();
@@ -582,14 +579,14 @@ void MacroActionHotkeyEdit::RMetaChanged(int state)
_entryData->_rightMeta = state;
}
void MacroActionHotkeyEdit::DurationChanged(const Duration &dur)
void MacroActionHotkeyEdit::DurationChanged(int ms)
{
if (_loading || !_entryData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_duration = dur;
_entryData->_duration = ms;
}
void MacroActionHotkeyEdit::OnlySendToOBSChanged(int state)

View File

@@ -1,7 +1,6 @@
#pragma once
#include "macro-action-edit.hpp"
#include "hotkey.hpp"
#include "duration-control.hpp"
#include <QComboBox>
#include <QCheckBox>
@@ -31,7 +30,7 @@ public:
bool _rightAlt = false;
bool _leftMeta = false;
bool _rightMeta = false;
Duration _duration = 0.3;
int _duration = 300; // in ms
#ifdef __APPLE__
bool _onlySendToObs = true;
#else
@@ -69,7 +68,7 @@ private slots:
void RAltChanged(int state);
void LMetaChanged(int state);
void RMetaChanged(int state);
void DurationChanged(const Duration &);
void DurationChanged(int ms);
void OnlySendToOBSChanged(int state);
protected:
@@ -82,7 +81,7 @@ protected:
QCheckBox *_rightAlt;
QCheckBox *_leftMeta;
QCheckBox *_rightMeta;
DurationSelection *_duration;
QSpinBox *_duration;
QCheckBox *_onlySendToOBS;
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;
}
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()
{
switcher->curl.SetOpt(CURLOPT_URL, _url.c_str());
switcher->curl.SetOpt(CURLOPT_HTTPGET, 1L);
switcher->curl.SetOpt(CURLOPT_TIMEOUT_MS, _timeout.Milliseconds());
SetupHeaders();
switcher->curl.SetOpt(CURLOPT_TIMEOUT_MS, _timeout.seconds * 1000);
std::string response;
if (IsReferencedInVars()) {
@@ -64,8 +49,7 @@ void MacroActionHttp::Post()
{
switcher->curl.SetOpt(CURLOPT_URL, _url.c_str());
switcher->curl.SetOpt(CURLOPT_POSTFIELDS, _data.c_str());
switcher->curl.SetOpt(CURLOPT_TIMEOUT_MS, _timeout.Milliseconds());
SetupHeaders();
switcher->curl.SetOpt(CURLOPT_TIMEOUT_MS, _timeout.seconds * 1000);
switcher->curl.Perform();
}
@@ -106,10 +90,8 @@ void MacroActionHttp::LogAction() const
bool MacroActionHttp::Save(obs_data_t *obj) const
{
MacroAction::Save(obj);
_url.Save(obj, "url");
obs_data_set_string(obj, "url", _url.c_str());
_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));
_timeout.Save(obj);
return true;
@@ -118,10 +100,8 @@ bool MacroActionHttp::Save(obs_data_t *obj) const
bool MacroActionHttp::Load(obs_data_t *obj)
{
MacroAction::Load(obj);
_url.Load(obj, "url");
_url = obs_data_get_string(obj, "url");
_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"));
_timeout.Load(obj);
return true;
@@ -129,7 +109,7 @@ bool MacroActionHttp::Load(obs_data_t *obj)
std::string MacroActionHttp::GetShortDesc() const
{
return _url.UnresolvedValue();
return _url;
}
static inline void populateMethodSelection(QComboBox *list)
@@ -142,15 +122,9 @@ static inline void populateMethodSelection(QComboBox *list)
MacroActionHttpEdit::MacroActionHttpEdit(
QWidget *parent, std::shared_ptr<MacroActionHttp> entryData)
: QWidget(parent),
_url(new VariableLineEdit(this)),
_url(new QLineEdit()),
_methods(new QComboBox()),
_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))
{
populateMethodSelection(_methods);
@@ -161,13 +135,8 @@ MacroActionHttpEdit::MacroActionHttpEdit(
SLOT(DataChanged()));
QWidget::connect(_methods, SIGNAL(currentIndexChanged(int)), this,
SLOT(MethodChanged(int)));
QWidget::connect(_setHeaders, SIGNAL(stateChanged(int)), this,
SLOT(SetHeadersChanged(int)));
QWidget::connect(_headerList,
SIGNAL(StringListChanged(const StringList &)), this,
SLOT(HeadersChanged(const StringList &)));
QWidget::connect(_timeout, SIGNAL(DurationChanged(const Duration &)),
this, SLOT(TimeoutChanged(const Duration &)));
QWidget::connect(_timeout, SIGNAL(DurationChanged(double)), this,
SLOT(TimeoutChanged(double)));
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
{"{{url}}", _url},
@@ -184,14 +153,8 @@ MacroActionHttpEdit::MacroActionHttpEdit(
obs_module_text("AdvSceneSwitcher.action.http.entry.line2"),
timeoutLayout, widgetPlaceholders);
_headerListLayout->addWidget(new QLabel(
obs_module_text("AdvSceneSwitcher.action.http.headers")));
_headerListLayout->addWidget(_headerList);
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addLayout(actionLayout);
mainLayout->addWidget(_setHeaders);
mainLayout->addLayout(_headerListLayout);
mainLayout->addWidget(_data);
mainLayout->addLayout(timeoutLayout);
setLayout(mainLayout);
@@ -207,10 +170,8 @@ void MacroActionHttpEdit::UpdateEntryData()
return;
}
_url->setText(_entryData->_url);
_url->setText(QString::fromStdString(_entryData->_url));
_data->setPlainText(_entryData->_data);
_setHeaders->setChecked(_entryData->_setHeaders);
_headerList->SetStringList(_entryData->_headers);
_methods->setCurrentIndex(static_cast<int>(_entryData->_method));
_timeout->SetDuration(_entryData->_timeout);
SetWidgetVisibility();
@@ -238,43 +199,28 @@ void MacroActionHttpEdit::MethodChanged(int value)
SetWidgetVisibility();
}
void MacroActionHttpEdit::TimeoutChanged(const Duration &dur)
void MacroActionHttpEdit::TimeoutChanged(double seconds)
{
if (_loading || !_entryData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_timeout = dur;
}
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();
_entryData->_timeout.seconds = seconds;
}
void MacroActionHttpEdit::SetWidgetVisibility()
{
_data->setVisible(_entryData->_method == MacroActionHttp::Method::POST);
setLayoutVisible(_headerListLayout, _entryData->_setHeaders);
switch (_entryData->_method) {
case MacroActionHttp::Method::GET:
_data->hide();
break;
case MacroActionHttp::Method::POST:
_data->show();
break;
default:
break;
}
adjustSize();
updateGeometry();

View File

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

View File

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

View File

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

View File

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

View File

@@ -58,7 +58,8 @@ public:
private slots:
void SourceChanged(const SourceSelection &);
void ActionChanged(int value);
void DurationChanged(const Duration &value);
void DurationChanged(double value);
void DurationUnitChanged(DurationUnit unit);
signals:
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, "value", _value);
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;
}
@@ -114,7 +114,7 @@ bool MacroActionPluginState::Load(obs_data_t *obj)
_value = obs_data_get_int(obj, "value");
const char *sceneName = obs_data_get_string(obj, "scene");
_scene = GetWeakSourceByName(sceneName);
_settingsPath.Load(obj, "settingsPath");
_settingsPath = obs_data_get_string(obj, "settingsPath");
return true;
}
@@ -185,7 +185,7 @@ void MacroActionPluginStateEdit::UpdateEntryData()
populateValueSelection(_values, _entryData->_action);
_values->setCurrentIndex(_entryData->_value);
_scenes->setCurrentText(GetWeakSourceName(_entryData->_scene).c_str());
_settings->SetPath(_entryData->_settingsPath);
_settings->SetPath(QString::fromStdString(_entryData->_settingsPath));
SetWidgetVisibility();
}

View File

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

View File

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

View File

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

View File

@@ -1,8 +1,10 @@
#include "macro-action-run.hpp"
#include "advanced-scene-switcher.hpp"
#include "name-dialog.hpp"
#include "utility.hpp"
#include <QProcess>
#include <QFileDialog>
#include <QDesktopServices>
const std::string MacroActionRun::id = "run";
@@ -13,53 +15,137 @@ bool MacroActionRun::_registered = MacroActionFactory::Register(
bool MacroActionRun::PerformAction()
{
bool procStarted = QProcess::startDetached(
QString::fromStdString(_procConfig.Path()), _procConfig.Args(),
QString::fromStdString(_procConfig.WorkingDir()));
if (!procStarted && _procConfig.Args().empty()) {
if (!QProcess::startDetached(
QString::fromStdString(_path), _args,
QString::fromStdString(_workingDirectory)) &&
_args.empty()) {
vblog(LOG_INFO, "run \"%s\" using QDesktopServices",
_procConfig.Path().c_str());
QDesktopServices::openUrl(QUrl::fromLocalFile(
QString::fromStdString(_procConfig.Path())));
_path.c_str());
QDesktopServices::openUrl(
QUrl::fromLocalFile(QString::fromStdString(_path)));
}
return true;
}
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
{
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;
}
bool MacroActionRun::Load(obs_data_t *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;
}
std::string MacroActionRun::GetShortDesc() const
{
return _procConfig.UnresolvedPath();
return _path;
}
MacroActionRunEdit::MacroActionRunEdit(
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,
SIGNAL(ConfigChanged(const ProcessConfig &)), this,
SLOT(ProcessConfigChanged(const ProcessConfig &)));
_addArg->setMaximumWidth(22);
_addArg->setProperty("themeID",
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;
layout->addWidget(_procConfig);
setLayout(layout);
QWidget::connect(_filePath, SIGNAL(PathChanged(const QString &)), this,
SLOT(PathChanged(const QString &)));
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;
UpdateEntryData();
@@ -71,19 +157,142 @@ void MacroActionRunEdit::UpdateEntryData()
if (!_entryData) {
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) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_procConfig = conf;
adjustSize();
updateGeometry();
_entryData->_path = text.toUtf8().constData();
emit HeaderInfoChanged(
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
#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 {
public:
@@ -16,7 +21,9 @@ public:
return std::make_shared<MacroActionRun>(m);
}
ProcessConfig _procConfig;
std::string _path = obs_module_text("AdvSceneSwitcher.enterPath");
std::string _workingDirectory = "";
QStringList _args;
private:
static bool _registered;
@@ -39,7 +46,13 @@ public:
}
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:
void HeaderInfoChanged(const QString &);
@@ -47,6 +60,14 @@ protected:
std::shared_ptr<MacroActionRun> _entryData;
private:
ProcessConfigEdit *_procConfig;
void SetArgListSize();
FileSelection *_filePath;
QListWidget *_argList;
QPushButton *_addArg;
QPushButton *_removeArg;
QPushButton *_argUp;
QPushButton *_argDown;
FileSelection *_workingDirectory;
bool _loading = true;
};

View File

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

View File

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

View File

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

View File

@@ -87,7 +87,7 @@ bool MacroActionScreenshot::Save(obs_data_t *obj) const
_source.Save(obj);
obs_data_set_int(obj, "saveType", static_cast<int>(_saveType));
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);
return true;
}
@@ -100,7 +100,7 @@ bool MacroActionScreenshot::Load(obs_data_t *obj)
_saveType = static_cast<SaveType>(obs_data_get_int(obj, "saveType"));
_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
if (!obs_data_has_user_value(obj, "version")) {
@@ -200,7 +200,7 @@ void MacroActionScreenshotEdit::UpdateEntryData()
_scenes->SetScene(_entryData->_scene);
_saveType->setCurrentIndex(static_cast<int>(_entryData->_saveType));
_targetType->setCurrentIndex(static_cast<int>(_entryData->_targetType));
_savePath->SetPath(_entryData->_path);
_savePath->SetPath(QString::fromStdString(_entryData->_path));
SetWidgetVisibility();
}
@@ -243,7 +243,7 @@ void MacroActionScreenshotEdit::PathChanged(const QString &text)
}
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_path = text.toStdString();
_entryData->_path = text.toUtf8().constData();
}
void MacroActionScreenshotEdit::SourceChanged(const SourceSelection &source)

View File

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

View File

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

View File

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

View File

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

View File

@@ -52,7 +52,9 @@ public:
private slots:
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);
signals:
void HeaderInfoChanged(const QString &);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -29,10 +29,9 @@ MacroRefAction::MacroRefAction(Macro *m, bool supportsVariableValue)
{
}
bool MacroRefAction::PostLoad()
void MacroRefAction::ResolveMacroRef()
{
_macro.PostLoad();
return true;
_macro.UpdateRef();
}
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) {
macro.PostLoad();
for (auto &m : _macros) {
m.UpdateRef();
}
return true;
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -71,18 +71,18 @@ bool MacroConditionMedia::CheckTime()
match = true;
break;
case Time::TIME_RESTRICTION_SHORTER:
match = currentTime < _time.Milliseconds();
match = currentTime < _time.seconds * 1000;
break;
case Time::TIME_RESTRICTION_LONGER:
match = currentTime > _time.Milliseconds();
match = currentTime > _time.seconds * 1000;
break;
case Time::TIME_RESTRICTION_REMAINING_SHORTER:
match = duration > currentTime &&
duration - currentTime < _time.Milliseconds();
duration - currentTime < _time.seconds * 1000;
break;
case Time::TIME_RESTRICTION_REMAINING_LONGER:
match = duration > currentTime &&
duration - currentTime > _time.Milliseconds();
duration - currentTime > _time.seconds * 1000;
break;
default:
break;
@@ -429,8 +429,10 @@ MacroConditionMediaEdit::MacroConditionMediaEdit(
SLOT(StateChanged(int)));
QWidget::connect(_timeRestrictions, SIGNAL(currentIndexChanged(int)),
this, SLOT(TimeRestrictionChanged(int)));
QWidget::connect(_time, SIGNAL(DurationChanged(const Duration &)), this,
SLOT(TimeChanged(const Duration &)));
QWidget::connect(_time, SIGNAL(DurationChanged(double)), this,
SLOT(TimeChanged(double)));
QWidget::connect(_time, SIGNAL(UnitChanged(DurationUnit)), this,
SLOT(TimeUnitChanged(DurationUnit)));
QWidget::connect(_onChange, SIGNAL(stateChanged(int)), this,
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) {
return;
}
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) {
_entryData->UpdateMediaSourcesOfSceneList();
}

View File

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

View File

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

View File

@@ -2,9 +2,31 @@
#include "macro.hpp"
#include <QWidget>
#include <QComboBox>
#include <variable-spinbox.hpp>
#include <QDoubleSpinBox>
#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 {
public:
MacroConditionStats(Macro *m);
@@ -19,31 +41,9 @@ public:
return std::make_shared<MacroConditionStats>(m);
}
NumberVariable<double> _value = 0.0;
enum class Type {
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;
double _value = 0;
StatsType _type = StatsType::FPS;
StatsCondition _condition = StatsCondition::ABOVE;
private:
bool CheckFPS();
@@ -98,7 +98,7 @@ public:
}
private slots:
void ValueChanged(const NumberVariable<double> &value);
void ValueChanged(double value);
void StatsTypeChanged(int type);
void ConditionChanged(int cond);
@@ -108,7 +108,7 @@ signals:
protected:
QComboBox *_stats;
QComboBox *_condition;
VariableDoubleSpinBox *_value;
QDoubleSpinBox *_value;
std::shared_ptr<MacroConditionStats> _entryData;
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,
"AdvSceneSwitcher.condition.sceneOrder"});
static std::map<MacroConditionSceneOrder::Condition, std::string>
sceneOrderConditionTypes = {
{MacroConditionSceneOrder::Condition::ABOVE,
"AdvSceneSwitcher.condition.sceneOrder.type.above"},
{MacroConditionSceneOrder::Condition::BELOW,
"AdvSceneSwitcher.condition.sceneOrder.type.below"},
{MacroConditionSceneOrder::Condition::POSITION,
"AdvSceneSwitcher.condition.sceneOrder.type.position"},
static std::map<SceneOrderCondition, std::string> sceneOrderConditionTypes = {
{SceneOrderCondition::ABOVE,
"AdvSceneSwitcher.condition.sceneOrder.type.above"},
{SceneOrderCondition::BELOW,
"AdvSceneSwitcher.condition.sceneOrder.type.below"},
{SceneOrderCondition::POSITION,
"AdvSceneSwitcher.condition.sceneOrder.type.position"},
};
struct PosInfo2 {
@@ -116,13 +115,13 @@ bool MacroConditionSceneOrder::CheckCondition()
bool ret = false;
switch (_condition) {
case Condition::ABOVE:
case SceneOrderCondition::ABOVE:
ret = isAbove(positions1, positions2);
break;
case Condition::BELOW:
case SceneOrderCondition::BELOW:
ret = isBelow(positions1, positions2);
break;
case Condition::POSITION:
case SceneOrderCondition::POSITION:
for (int p : positions1) {
if (p == _position)
ret = true;
@@ -144,8 +143,6 @@ bool MacroConditionSceneOrder::Save(obs_data_t *obj) const
_source2.Save(obj, "sceneItemSelection2");
obs_data_set_int(obj, "condition", static_cast<int>(_condition));
obs_data_set_int(obj, "position", _position);
_position.Save(obj, "position");
obs_data_set_int(obj, "version", 1);
return true;
}
@@ -171,12 +168,9 @@ bool MacroConditionSceneOrder::Load(obs_data_t *obj)
} else {
_source2.Load(obj, "sceneItemSelection2");
}
_condition = static_cast<Condition>(obs_data_get_int(obj, "condition"));
if (!obs_data_has_user_value(obj, "version")) {
_position = obs_data_get_int(obj, "position");
} else {
_position.Load(obj, "position");
}
_condition = static_cast<SceneOrderCondition>(
obs_data_get_int(obj, "condition"));
_position = obs_data_get_int(obj, "position");
return true;
}
@@ -187,7 +181,7 @@ std::string MacroConditionSceneOrder::GetShortDesc() const
}
std::string header = _scene.ToString() + " - " + _source.ToString();
if (!_source2.ToString().empty() &&
_condition != MacroConditionSceneOrder::Condition::POSITION) {
_condition != SceneOrderCondition::POSITION) {
header += " - " + _source2.ToString();
}
return header;
@@ -202,19 +196,19 @@ static inline void populateConditionSelection(QComboBox *list)
MacroConditionSceneOrderEdit::MacroConditionSceneOrderEdit(
QWidget *parent, std::shared_ptr<MacroConditionSceneOrder> entryData)
: 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")))
: QWidget(parent)
{
_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);
if (entryData.get()) {
if (entryData->_condition ==
MacroConditionSceneOrder::Condition::POSITION) {
if (entryData->_condition == SceneOrderCondition::POSITION) {
_sources->SetPlaceholderType(
SceneItemSelectionWidget::Placeholder::ANY);
} else {
@@ -238,10 +232,8 @@ MacroConditionSceneOrderEdit::MacroConditionSceneOrderEdit(
SLOT(Source2Changed(const SceneItemSelection &)));
QWidget::connect(_conditions, SIGNAL(currentIndexChanged(int)), this,
SLOT(ConditionChanged(int)));
QWidget::connect(
_position,
SIGNAL(NumberVariableChanged(const NumberVariable<int> &)),
this, SLOT(PositionChanged(const NumberVariable<int> &)));
QWidget::connect(_position, SIGNAL(valueChanged(int)), this,
SLOT(PositionChanged(int)));
auto entryLayout = new QHBoxLayout();
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
@@ -304,12 +296,11 @@ void MacroConditionSceneOrderEdit::ConditionChanged(int index)
{
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_condition =
static_cast<MacroConditionSceneOrder::Condition>(index);
static_cast<SceneOrderCondition>(index);
}
SetWidgetVisibility(_entryData->_condition ==
MacroConditionSceneOrder::Condition::POSITION);
if (_entryData->_condition ==
MacroConditionSceneOrder::Condition::POSITION) {
SceneOrderCondition::POSITION);
if (_entryData->_condition == SceneOrderCondition::POSITION) {
_sources->SetPlaceholderType(
SceneItemSelectionWidget::Placeholder::ANY);
} else {
@@ -321,8 +312,7 @@ void MacroConditionSceneOrderEdit::ConditionChanged(int index)
QString::fromStdString(_entryData->GetShortDesc()));
}
void MacroConditionSceneOrderEdit::PositionChanged(
const NumberVariable<int> &value)
void MacroConditionSceneOrderEdit::PositionChanged(int value)
{
if (_loading || !_entryData) {
return;
@@ -349,8 +339,8 @@ void MacroConditionSceneOrderEdit::UpdateEntryData()
_scenes->SetScene(_entryData->_scene);
_sources->SetSceneItem(_entryData->_source);
_sources2->SetSceneItem(_entryData->_source2);
_position->SetValue(_entryData->_position);
_position->setValue(_entryData->_position);
_conditions->setCurrentIndex(static_cast<int>(_entryData->_condition));
SetWidgetVisibility(_entryData->_condition ==
MacroConditionSceneOrder::Condition::POSITION);
SceneOrderCondition::POSITION);
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -25,9 +25,10 @@ public:
};
Type _type = Type::REQUEST;
StringVariable _message = obs_module_text("AdvSceneSwitcher.enterText");
VariableResolvingString _message =
obs_module_text("AdvSceneSwitcher.enterText");
RegexConfig _regex;
std::weak_ptr<Connection> _connection;
std::string _connection;
private:
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,
const char *duration) const
const char *secondsName, const char *unitName) const
{
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,
const char *duration)
const char *secondsName, const char *unitName)
{
// For backwards compatability check if duration value exist without
// time constraint condition - if so assume DurationCondition::MORE
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));
}
_type = static_cast<Type>(obs_data_get_int(obj, condName));
_dur.Load(obj, duration);
// TODO: remove this fallback
if (obs_data_has_user_value(obj, "displayUnit")) {
_dur.SetUnit(static_cast<Duration::Unit>(
obs_data_get_int(obj, "displayUnit")));
}
_dur.Load(obj, secondsName, unitName);
}
bool DurationModifier::DurationReached()
@@ -133,7 +127,7 @@ void MacroCondition::CheckDurationModifier(bool &val)
case DurationModifier::Type::WITHIN:
if (val) {
_duration.SetTimeRemaining(
_duration.GetDuration().Seconds());
_duration.GetDuration().seconds);
}
val = val || _duration.DurationReached();
break;
@@ -147,9 +141,14 @@ void MacroCondition::SetDurationModifier(DurationModifier::Type 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)
@@ -157,10 +156,9 @@ MacroRefCondition::MacroRefCondition(Macro *m, bool supportsVariableValue)
{
}
bool MacroRefCondition::PostLoad()
void MacroRefCondition::ResolveMacroRef()
{
_macro.PostLoad();
return true;
_macro.UpdateRef();
}
MultiMacroRefCondtition::MultiMacroRefCondtition(Macro *m,
@@ -169,10 +167,9 @@ MultiMacroRefCondtition::MultiMacroRefCondtition(Macro *m,
{
}
bool MultiMacroRefCondtition::PostLoad()
void MultiMacroRefCondtition::ResolveMacroRef()
{
for (auto &macro : _macros) {
macro.PostLoad();
for (auto &m : _macros) {
m.UpdateRef();
}
return true;
}

View File

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

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