Compare commits

..

26 Commits

Author SHA1 Message Date
WarmUpTill
e3ff6f34fc Update OpenCV to 4.10.0
This adds support for the MSVC toolset 19.40.x
2024-06-11 19:01:01 +02:00
WarmUpTill
ed75a221fe Fix crashes in combination with older MSVC redistributable versions
Since the switch of Windows 2022 GitHub actions runner image to version
20240603.1.1 the Visual Studio version was bumped to 17.10.34928.147.
This results in MSVC version 19.40.33811.0 being used at build time.
Combining this with e.g. the MSVC redistributable version 14.34.31938.0
results in segfaults when calling std::mutex::lock.

See also:
https://developercommunity.visualstudio.com/t/Invalid-code-generation-in-release-1940/10678572
2024-06-09 00:39:54 +02:00
WarmUpTill
7b48cb2b8d Fix locale error 2024-06-09 00:39:51 +02:00
WarmUpTill
9d4c8ab475 Fix stylesheet of StatusControl not being set to stopped state 2024-06-07 23:05:08 +02:00
WarmUpTill
3d61ea7d25 Add option to reevaluate condition state in "Macro" action 2024-06-07 21:44:21 +02:00
WarmUpTill
99c8a46296 Add option to ignore pause during condition check 2024-06-07 21:44:21 +02:00
WarmUpTill
7e1d20031c Add HelpIcon
A QLabel consisting of a question mark icon and tooltip
2024-06-07 21:44:21 +02:00
WarmUpTill
0e4b000fb1 Set default action of tpye "Macro" to "Run" 2024-06-07 21:44:21 +02:00
WarmUpTill
fc2451ae08 Rename MacroProperties to MacroSettings 2024-06-07 21:44:21 +02:00
WarmUpTill
be44577967 Add option to set input variable values to Macro action 2024-06-07 21:44:21 +02:00
WarmUpTill
3480ff238e Add macro input variable support 2024-06-07 21:44:21 +02:00
WarmUpTill
ee68427036 Add HighligthMacroSettingsButton() 2024-06-07 21:44:21 +02:00
WarmUpTill
37c32dd1ed Move StringList from base to lib 2024-06-07 21:44:21 +02:00
WarmUpTill
c05a92d417 Refactor widget highlighting 2024-06-07 21:44:21 +02:00
WarmUpTill
d72a0c0d38 Add VariableSelectionDialog 2024-06-07 21:44:21 +02:00
WarmUpTill
235b31fccc Add GUARD_LOADING_AND_LOCK
Helper macro to reduce repetition
2024-06-07 21:44:21 +02:00
WarmUpTill
286f781f4d Add ListEditor helper widget 2024-06-07 21:44:21 +02:00
WarmUpTill
b7516cac5b Fix crash when adding resources to resources tab
A crash could occur if the plugin window was closed and reopened and a
new resource was added to either the Variable, Action queue, Websocket,
or Twitch tab.

No context object was provided to the signal handlers.
The signal provider is intentionally not deleted when the UI is closed.
Because of this, the signal connections were never cleared when the
underlying tab widget was destroyed.
So, in the case of closing and reopening the settings window, the old
connection with the outdated widget pointers would be called again.
2024-06-05 01:05:31 +02:00
WarmUpTill
45967a090f Add tempvar support to filter condition 2024-06-05 01:05:31 +02:00
WarmUpTill
687fb4623e Add tempvar support to source condition 2024-06-05 01:05:31 +02:00
WarmUpTill
4157ae4ed2 Add option to check source height and width 2024-06-05 01:05:31 +02:00
WarmUpTill
5e1469b0d8 Don't restore last opened tab if that tab is no longer visible 2024-06-05 01:05:31 +02:00
WarmUpTill
b3bde6c59f Fix imported variables / actions not being added to respective tabs 2024-06-05 01:05:31 +02:00
WarmUpTill
032f5e2fe9 Improve visibility of plugin stop warning flash in status dock 2024-06-05 01:05:31 +02:00
WarmUpTill
91c053dfd8 Re-add tooltips for the "last used" cells on the variable tab 2024-06-05 01:05:31 +02:00
Przemek Pawlas
1f1ef4ca03 Add variable values swap action 2024-05-25 19:04:09 +02:00
81 changed files with 1470 additions and 649 deletions

View File

@@ -120,10 +120,10 @@ target_sources(
lib/macro/macro-export-import-dialog.hpp lib/macro/macro-export-import-dialog.hpp
lib/macro/macro-helpers.cpp lib/macro/macro-helpers.cpp
lib/macro/macro-helpers.hpp lib/macro/macro-helpers.hpp
lib/macro/macro-input.cpp
lib/macro/macro-input.hpp
lib/macro/macro-list.cpp lib/macro/macro-list.cpp
lib/macro/macro-list.hpp lib/macro/macro-list.hpp
lib/macro/macro-properties.cpp
lib/macro/macro-properties.hpp
lib/macro/macro-ref.cpp lib/macro/macro-ref.cpp
lib/macro/macro-ref.hpp lib/macro/macro-ref.hpp
lib/macro/macro-run-button.cpp lib/macro/macro-run-button.cpp
@@ -138,6 +138,8 @@ target_sources(
lib/macro/macro-segment.hpp lib/macro/macro-segment.hpp
lib/macro/macro-selection.cpp lib/macro/macro-selection.cpp
lib/macro/macro-selection.hpp lib/macro/macro-selection.hpp
lib/macro/macro-settings.cpp
lib/macro/macro-settings.hpp
lib/macro/macro-tab.cpp lib/macro/macro-tab.cpp
lib/macro/macro-tree.cpp lib/macro/macro-tree.cpp
lib/macro/macro-tree.hpp lib/macro/macro-tree.hpp
@@ -166,10 +168,14 @@ target_sources(
lib/utils/file-selection.hpp lib/utils/file-selection.hpp
lib/utils/filter-combo-box.cpp lib/utils/filter-combo-box.cpp
lib/utils/filter-combo-box.hpp lib/utils/filter-combo-box.hpp
lib/utils/help-icon.hpp
lib/utils/help-icon.cpp
lib/utils/item-selection-helpers.cpp lib/utils/item-selection-helpers.cpp
lib/utils/item-selection-helpers.hpp lib/utils/item-selection-helpers.hpp
lib/utils/layout-helpers.cpp lib/utils/layout-helpers.cpp
lib/utils/layout-helpers.hpp lib/utils/layout-helpers.hpp
lib/utils/list-editor.cpp
lib/utils/list-editor.hpp
lib/utils/log-helper.cpp lib/utils/log-helper.cpp
lib/utils/log-helper.hpp lib/utils/log-helper.hpp
lib/utils/math-helpers.cpp lib/utils/math-helpers.cpp
@@ -221,6 +227,8 @@ target_sources(
lib/utils/splitter-helpers.hpp lib/utils/splitter-helpers.hpp
lib/utils/status-control.cpp lib/utils/status-control.cpp
lib/utils/status-control.hpp lib/utils/status-control.hpp
lib/utils/string-list.cpp
lib/utils/string-list.hpp
lib/utils/switch-button.cpp lib/utils/switch-button.cpp
lib/utils/switch-button.hpp lib/utils/switch-button.hpp
lib/utils/sync-helpers.cpp lib/utils/sync-helpers.cpp
@@ -337,6 +345,9 @@ if(OS_WINDOWS)
if(MSVC) if(MSVC)
target_compile_options(${LIB_NAME} PUBLIC /MP /d2FH4- /wd4267 /wd4267 target_compile_options(${LIB_NAME} PUBLIC /MP /d2FH4- /wd4267 /wd4267
/bigobj) /bigobj)
# Workaround for MSVC incompatibility in CI environment
add_compile_definitions(${target_name} _DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR)
endif() endif()
target_sources(${LIB_NAME} PRIVATE lib/win/advanced-scene-switcher-win.cpp) target_sources(${LIB_NAME} PRIVATE lib/win/advanced-scene-switcher-win.cpp)
add_definitions(-D_WEBSOCKETPP_CPP11_STL_) add_definitions(-D_WEBSOCKETPP_CPP11_STL_)

View File

@@ -99,8 +99,8 @@ AdvSceneSwitcher.actionQueueTab.isRunning.header="Is running"
AdvSceneSwitcher.actionQueueTab.runOnStartup.header="Run on startup" AdvSceneSwitcher.actionQueueTab.runOnStartup.header="Run on startup"
AdvSceneSwitcher.actionQueueTab.yes="Yes" AdvSceneSwitcher.actionQueueTab.yes="Yes"
AdvSceneSwitcher.actionQueueTab.no="No" AdvSceneSwitcher.actionQueueTab.no="No"
AdvSceneSwitcher.actionQueueTab.removeSingleConnectionPopup.text="Are you sure you want to remove \"%1\"?" AdvSceneSwitcher.actionQueueTab.removeSingleQueuePopup.text="Are you sure you want to remove \"%1\"?"
AdvSceneSwitcher.actionQueueTab.removeMultipleConnectionsPopup.text="Are you sure you want to remove %1 action queues?" AdvSceneSwitcher.actionQueueTab.removeMultipleQueuesPopup.text="Are you sure you want to remove %1 action queues?"
; Websocket Connections Tab ; Websocket Connections Tab
AdvSceneSwitcher.websocketConnectionTab.title="Websocket Connections" AdvSceneSwitcher.websocketConnectionTab.title="Websocket Connections"
@@ -182,6 +182,10 @@ AdvSceneSwitcher.macroTab.segment.paste="Paste"
AdvSceneSwitcher.macroTab.highlightSettings="Visual settings" AdvSceneSwitcher.macroTab.highlightSettings="Visual settings"
AdvSceneSwitcher.macroTab.hotkeySettings="Hotkey settings" AdvSceneSwitcher.macroTab.hotkeySettings="Hotkey settings"
AdvSceneSwitcher.macroTab.generalSettings="General settings" AdvSceneSwitcher.macroTab.generalSettings="General settings"
AdvSceneSwitcher.macroTab.inputSettings="Input settings"
AdvSceneSwitcher.macroTab.inputSettings.description="This section will allow you to specify variables, which will be treated as input parameters for the selected macro.\nWhen executing the macro using the \"Macro\" action type, you will have the option to set the values for those variables."
AdvSceneSwitcher.macroTab.inputSettings.invalid="<Invalid selection>"
AdvSceneSwitcher.macroTab.inputSettings.noInputs="No inputs are defined for the selected macro!\nOpen the settings of the macro to define inputs.\nThe settings button is highlighted above."
AdvSceneSwitcher.macroTab.dockSettings="Dock settings" AdvSceneSwitcher.macroTab.dockSettings="Dock settings"
AdvSceneSwitcher.macroTab.highlightExecutedMacros="Highlight recently executed macros" AdvSceneSwitcher.macroTab.highlightExecutedMacros="Highlight recently executed macros"
AdvSceneSwitcher.macroTab.highlightTrueConditions="Highlight conditions of currently selected macro that evaluated to true recently" AdvSceneSwitcher.macroTab.highlightTrueConditions="Highlight conditions of currently selected macro that evaluated to true recently"
@@ -226,7 +230,7 @@ AdvSceneSwitcher.macroTab.tooltip.elseActionTopButton="Move selected action to t
AdvSceneSwitcher.macroTab.tooltip.elseActionUpButton="Move selected action up in the else section" AdvSceneSwitcher.macroTab.tooltip.elseActionUpButton="Move selected action up in the else section"
AdvSceneSwitcher.macroTab.tooltip.elseActionDownButton="Move selected action down in the else section" AdvSceneSwitcher.macroTab.tooltip.elseActionDownButton="Move selected action down in the else section"
AdvSceneSwitcher.macroTab.tooltip.elseActionBottomButton="Move selected action to the bottom in the else section" AdvSceneSwitcher.macroTab.tooltip.elseActionBottomButton="Move selected action to the bottom in the else section"
AdvSceneSwitcher.macroTab.tooltip.openMacroPropertiesButton="Open macro properties" AdvSceneSwitcher.macroTab.tooltip.openMacroSettingsButton="Open macro settings"
AdvSceneSwitcher.macroDock.pause="Pause" AdvSceneSwitcher.macroDock.pause="Pause"
AdvSceneSwitcher.macroDock.unpause="Unpause" AdvSceneSwitcher.macroDock.unpause="Unpause"
@@ -453,11 +457,16 @@ AdvSceneSwitcher.condition.source.type.settingsMatch="Settings match"
AdvSceneSwitcher.condition.source.type.settingsChanged="Settings changed" AdvSceneSwitcher.condition.source.type.settingsChanged="Settings changed"
AdvSceneSwitcher.condition.source.type.individualSettingMatches="Setting value matches" AdvSceneSwitcher.condition.source.type.individualSettingMatches="Setting value matches"
AdvSceneSwitcher.condition.source.type.individualSettingChanged="Setting value changed" AdvSceneSwitcher.condition.source.type.individualSettingChanged="Setting value changed"
AdvSceneSwitcher.condition.source.type.width="Width"
AdvSceneSwitcher.condition.source.type.height="Height"
AdvSceneSwitcher.condition.source.sizeCompare.less="Smaller than"
AdvSceneSwitcher.condition.source.sizeCompare.equal="Equals"
AdvSceneSwitcher.condition.source.sizeCompare.more="Bigger than"
AdvSceneSwitcher.condition.source.refresh="Refresh" AdvSceneSwitcher.condition.source.refresh="Refresh"
AdvSceneSwitcher.condition.source.refreshTooltip="Repopulate the source settings selection with the settings of the source which's name matches the variable value." AdvSceneSwitcher.condition.source.refreshTooltip="Repopulate the source settings selection with the settings of the source which's name matches the variable value."
AdvSceneSwitcher.condition.source.sceneVisibilityHint="Scene specific visibility can be checked using the \"Scene item visibility\" condition" AdvSceneSwitcher.condition.source.sceneVisibilityHint="Scene specific visibility can be checked using the \"Scene item visibility\" condition"
AdvSceneSwitcher.condition.source.getSettings="Get current settings" AdvSceneSwitcher.condition.source.getSettings="Get current settings"
AdvSceneSwitcher.condition.source.entry.line1="{{sources}}{{conditions}}{{settingSelection}}{{refresh}}" AdvSceneSwitcher.condition.source.entry.line1="{{sources}}{{conditions}}{{settingSelection}}{{refresh}}{{sizeCompareMethods}}{{size}}"
AdvSceneSwitcher.condition.source.entry.line2="{{settings}}" AdvSceneSwitcher.condition.source.entry.line2="{{settings}}"
AdvSceneSwitcher.condition.source.entry.line3="{{regex}}{{getSettings}}" AdvSceneSwitcher.condition.source.entry.line3="{{regex}}{{getSettings}}"
AdvSceneSwitcher.condition.virtualCamera="Virtual camera" AdvSceneSwitcher.condition.virtualCamera="Virtual camera"
@@ -829,9 +838,13 @@ AdvSceneSwitcher.action.macro.type.run="Run macro"
AdvSceneSwitcher.action.macro.type.run.conditions.ignore="Do not consider condition state" AdvSceneSwitcher.action.macro.type.run.conditions.ignore="Do not consider condition state"
AdvSceneSwitcher.action.macro.type.run.conditions.true="Only if conditions evaluate to true" AdvSceneSwitcher.action.macro.type.run.conditions.true="Only if conditions evaluate to true"
AdvSceneSwitcher.action.macro.type.run.conditions.false="Only if conditions evaluate to false" AdvSceneSwitcher.action.macro.type.run.conditions.false="Only if conditions evaluate to false"
AdvSceneSwitcher.action.macro.type.run.updateConditionMatchState="Reevaluate the condition state before executing this action"
AdvSceneSwitcher.action.macro.type.run.updateConditionMatchState.help="The plugin operates in phases:\n * The phase evaluating the macro conditions\n * The phase running macro actions\nMacros executed before this particular action might have side effects on the condition state of macros.\nCheck this option if you want those side effects to be taken into account when evaluating the condition state."
AdvSceneSwitcher.action.macro.type.run.actionType.regular="actions" AdvSceneSwitcher.action.macro.type.run.actionType.regular="actions"
AdvSceneSwitcher.action.macro.type.run.actionType.else="else-actions" AdvSceneSwitcher.action.macro.type.run.actionType.else="else-actions"
AdvSceneSwitcher.action.macro.type.run.skipWhenPaused="Skip execution when macro is paused" AdvSceneSwitcher.action.macro.type.run.skipWhenPaused="Skip execution when macro is paused"
AdvSceneSwitcher.action.macro.type.run.setInputs="Set inputs"
AdvSceneSwitcher.action.macro.type.run.setInputs.description="Input variables can be defined in the macro settings.\nDefining input variables will allow you to modify the values of variables before an action is executed."
AdvSceneSwitcher.action.macro.type.stop="Stop actions" AdvSceneSwitcher.action.macro.type.stop="Stop actions"
AdvSceneSwitcher.action.macro.type.disableAction="Disable action" AdvSceneSwitcher.action.macro.type.disableAction="Disable action"
AdvSceneSwitcher.action.macro.type.enableAction="Enable action" AdvSceneSwitcher.action.macro.type.enableAction="Enable action"
@@ -987,6 +1000,7 @@ AdvSceneSwitcher.action.variable.type.setToTempvar.help="This action type will a
AdvSceneSwitcher.action.variable.type.sceneItemName="Set to scene item name at index" AdvSceneSwitcher.action.variable.type.sceneItemName="Set to scene item name at index"
AdvSceneSwitcher.action.variable.type.padValue="Pad current value" AdvSceneSwitcher.action.variable.type.padValue="Pad current value"
AdvSceneSwitcher.action.variable.type.truncateValue="Truncate current value" AdvSceneSwitcher.action.variable.type.truncateValue="Truncate current value"
AdvSceneSwitcher.action.variable.type.swapValues="Swap variable values"
AdvSceneSwitcher.action.variable.truncateOrPadDirection.left="Left" AdvSceneSwitcher.action.variable.truncateOrPadDirection.left="Left"
AdvSceneSwitcher.action.variable.truncateOrPadDirection.right="Right" AdvSceneSwitcher.action.variable.truncateOrPadDirection.right="Right"
AdvSceneSwitcher.action.variable.askForValuePromptDefault="Assign value to variable \"%1\":" AdvSceneSwitcher.action.variable.askForValuePromptDefault="Assign value to variable \"%1\":"
@@ -1117,6 +1131,7 @@ AdvSceneSwitcher.variable.save="Save / load behavior"
AdvSceneSwitcher.variable.save.dontSave="Don't save variable value" AdvSceneSwitcher.variable.save.dontSave="Don't save variable value"
AdvSceneSwitcher.variable.save.save="Save variable value" AdvSceneSwitcher.variable.save.save="Save variable value"
AdvSceneSwitcher.variable.save.default="Set to value" AdvSceneSwitcher.variable.save.default="Set to value"
AdvSceneSwitcher.variable.selectionDialog="Select variable:"
AdvSceneSwitcher.tooltip.availableVariables="Variables are supported, use ${VarName} to retrieve the value of VarName" AdvSceneSwitcher.tooltip.availableVariables="Variables are supported, use ${VarName} to retrieve the value of VarName"
@@ -1752,6 +1767,14 @@ AdvSceneSwitcher.tempVar.folder.removedFiles="Removed files"
AdvSceneSwitcher.tempVar.folder.newDirs="New directories" AdvSceneSwitcher.tempVar.folder.newDirs="New directories"
AdvSceneSwitcher.tempVar.folder.removedDirs="Removed directories" AdvSceneSwitcher.tempVar.folder.removedDirs="Removed directories"
AdvSceneSwitcher.tempVar.source.width="Source width"
AdvSceneSwitcher.tempVar.source.height="Source height"
AdvSceneSwitcher.tempVar.source.setting="Setting value"
AdvSceneSwitcher.tempVar.source.settings="Settings string"
AdvSceneSwitcher.tempVar.filter.setting="Setting value"
AdvSceneSwitcher.tempVar.filter.settings="Settings string"
AdvSceneSwitcher.selectScene="--select scene--" AdvSceneSwitcher.selectScene="--select scene--"
AdvSceneSwitcher.selectPreviousScene="Previous Scene" AdvSceneSwitcher.selectPreviousScene="Previous Scene"
AdvSceneSwitcher.selectCurrentScene="Current Scene" AdvSceneSwitcher.selectCurrentScene="Current Scene"

2
deps/opencv vendored

View File

@@ -960,7 +960,7 @@
</spacer> </spacer>
</item> </item>
<item> <item>
<widget class="QPushButton" name="macroProperties"> <widget class="QPushButton" name="macroSettings">
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>22</width> <width>22</width>
@@ -968,7 +968,7 @@
</size> </size>
</property> </property>
<property name="toolTip"> <property name="toolTip">
<string>AdvSceneSwitcher.macroTab.tooltip.openMacroPropertiesButton</string> <string>AdvSceneSwitcher.macroTab.tooltip.openMacroSettingsButton</string>
</property> </property>
<property name="text"> <property name="text">
<string/> <string/>
@@ -5033,7 +5033,7 @@
<tabstop>runMacro</tabstop> <tabstop>runMacro</tabstop>
<tabstop>runMacroInParallel</tabstop> <tabstop>runMacroInParallel</tabstop>
<tabstop>runMacroOnChange</tabstop> <tabstop>runMacroOnChange</tabstop>
<tabstop>macroProperties</tabstop> <tabstop>macroSettings</tabstop>
<tabstop>conditionsList</tabstop> <tabstop>conditionsList</tabstop>
<tabstop>conditionAdd</tabstop> <tabstop>conditionAdd</tabstop>
<tabstop>conditionRemove</tabstop> <tabstop>conditionRemove</tabstop>

View File

@@ -750,6 +750,36 @@ QWidget *GetSettingsWindow()
return SettingsWindowIsOpened() ? AdvSceneSwitcher::window : nullptr; return SettingsWindowIsOpened() ? AdvSceneSwitcher::window : nullptr;
} }
void AdvSceneSwitcher::HighligthMacroSettingsButton(bool enable)
{
static QObject *highlight = nullptr;
if ((highlight && enable) || (!highlight && !enable)) {
return;
}
if (highlight && !enable) {
highlight->deleteLater();
highlight = nullptr;
return;
}
if (!HighlightUIElementsEnabled()) {
return;
}
highlight = HighlightWidget(ui->macroSettings, Qt::green);
}
void HighligthMacroSettingsButton(bool enable)
{
auto window = GetSettingsWindow();
if (!window) {
return;
}
static_cast<AdvSceneSwitcher *>(window)->HighligthMacroSettingsButton(
enable);
}
void SetupActionQueues(); void SetupActionQueues();
extern "C" EXPORT void InitSceneSwitcher(obs_module_t *module, extern "C" EXPORT void InitSceneSwitcher(obs_module_t *module,

View File

@@ -96,6 +96,7 @@ public:
void SetConditionData(Macro &m); void SetConditionData(Macro &m);
void SwapActions(Macro *m, int pos1, int pos2); void SwapActions(Macro *m, int pos1, int pos2);
void SwapConditions(Macro *m, int pos1, int pos2); void SwapConditions(Macro *m, int pos1, int pos2);
void HighligthMacroSettingsButton(bool enable = true);
public slots: public slots:
void on_macroAdd_clicked(); void on_macroAdd_clicked();
@@ -178,7 +179,7 @@ public slots:
void MoveMacroConditionDown(int idx); void MoveMacroConditionDown(int idx);
void HighlightControls(); void HighlightControls();
void HighlightOnChange(); void HighlightOnChange();
void on_macroProperties_clicked(); void on_macroSettings_clicked();
void CopyMacroSegment(); void CopyMacroSegment();
void PasteMacroSegment(); void PasteMacroSegment();
@@ -410,5 +411,6 @@ public slots:
void OpenSettingsWindow(); void OpenSettingsWindow();
QWidget *GetSettingsWindow(); QWidget *GetSettingsWindow();
void HighligthMacroSettingsButton(bool enable);
} // namespace advss } // namespace advss

View File

@@ -431,7 +431,7 @@ void SwitcherData::LoadSettings(obs_data_t *obj)
} }
LoadMacros(obj); LoadMacros(obj);
LoadGlobalMacroProperties(obj); LoadGlobalMacroSettings(obj);
loadWindowTitleSwitches(obj); loadWindowTitleSwitches(obj);
loadScreenRegionSwitches(obj); loadScreenRegionSwitches(obj);
loadPauseSwitches(obj); loadPauseSwitches(obj);
@@ -466,7 +466,7 @@ void SwitcherData::SaveSettings(obs_data_t *obj)
saveSceneGroups(obj); saveSceneGroups(obj);
SaveMacros(obj); SaveMacros(obj);
SaveGlobalMacroProperties(obj); SaveGlobalMacroSettings(obj);
SaveVariables(obj); SaveVariables(obj);
saveWindowTitleSwitches(obj); saveWindowTitleSwitches(obj);
saveScreenRegionSwitches(obj); saveScreenRegionSwitches(obj);

View File

@@ -12,7 +12,7 @@
namespace advss { namespace advss {
static QMetaObject::Connection addPulse; static QObject *addPulse = nullptr;
SceneGroupEditWidget *typeEdit = nullptr; SceneGroupEditWidget *typeEdit = nullptr;
std::deque<SceneGroup> &GetSceneGroups() std::deque<SceneGroup> &GetSceneGroups()
@@ -170,7 +170,8 @@ void AdvSceneSwitcher::on_sceneGroupAdd_clicked()
item->setData(Qt::UserRole, text); item->setData(Qt::UserRole, text);
ui->sceneGroups->setCurrentItem(item); ui->sceneGroups->setCurrentItem(item);
ui->sceneGroupAdd->disconnect(addPulse); addPulse->deleteLater();
addPulse = nullptr;
ui->sceneGroupHelp->setVisible(false); ui->sceneGroupHelp->setVisible(false);
emit SceneGroupAdded(QString::fromStdString(name)); emit SceneGroupAdded(QString::fromStdString(name));
@@ -512,8 +513,8 @@ void AdvSceneSwitcher::SetupSceneGroupTab()
if (switcher->sceneGroups.size() == 0) { if (switcher->sceneGroups.size() == 0) {
if (!switcher->disableHints) { if (!switcher->disableHints) {
addPulse = PulseWidget(ui->sceneGroupAdd, addPulse = HighlightWidget(ui->sceneGroupAdd,
QColor(Qt::green)); QColor(Qt::green));
} }
ui->sceneGroupHelp->setVisible(true); ui->sceneGroupHelp->setVisible(true);
} else { } else {

View File

@@ -12,7 +12,7 @@
namespace advss { namespace advss {
bool SceneTrigger::pause = false; bool SceneTrigger::pause = false;
static QMetaObject::Connection addPulse; static QObject *addPulse = nullptr;
void AdvSceneSwitcher::on_triggerAdd_clicked() void AdvSceneSwitcher::on_triggerAdd_clicked()
{ {
@@ -22,7 +22,7 @@ void AdvSceneSwitcher::on_triggerAdd_clicked()
listAddClicked(ui->sceneTriggers, listAddClicked(ui->sceneTriggers,
new SceneTriggerWidget(this, new SceneTriggerWidget(this,
&switcher->sceneTriggers.back()), &switcher->sceneTriggers.back()),
ui->triggerAdd, &addPulse); ui->triggerAdd, addPulse);
ui->triggerHelp->setVisible(false); ui->triggerHelp->setVisible(false);
} }
@@ -370,8 +370,8 @@ void AdvSceneSwitcher::SetupTriggerTab()
if (switcher->sceneTriggers.size() == 0) { if (switcher->sceneTriggers.size() == 0) {
if (!switcher->disableHints) { if (!switcher->disableHints) {
addPulse = addPulse = HighlightWidget(ui->triggerAdd,
PulseWidget(ui->triggerAdd, QColor(Qt::green)); QColor(Qt::green));
} }
ui->triggerHelp->setVisible(true); ui->triggerHelp->setVisible(true);
} else { } else {

View File

@@ -12,7 +12,7 @@
namespace advss { namespace advss {
bool AudioSwitch::pause = false; bool AudioSwitch::pause = false;
static QMetaObject::Connection addPulse; static QObject *addPulse = nullptr;
void AdvSceneSwitcher::on_audioAdd_clicked() void AdvSceneSwitcher::on_audioAdd_clicked()
{ {
@@ -22,7 +22,7 @@ void AdvSceneSwitcher::on_audioAdd_clicked()
AudioSwitchWidget *sw = AudioSwitchWidget *sw =
new AudioSwitchWidget(this, &switcher->audioSwitches.back()); new AudioSwitchWidget(this, &switcher->audioSwitches.back());
listAddClicked(ui->audioSwitches, sw, ui->audioAdd, &addPulse); listAddClicked(ui->audioSwitches, sw, ui->audioAdd, addPulse);
ui->audioHelp->setVisible(false); ui->audioHelp->setVisible(false);
} }
@@ -232,7 +232,8 @@ void AdvSceneSwitcher::SetupAudioTab()
if (switcher->audioSwitches.size() == 0) { if (switcher->audioSwitches.size() == 0) {
if (!switcher->disableHints) { if (!switcher->disableHints) {
addPulse = PulseWidget(ui->audioAdd, QColor(Qt::green)); addPulse = HighlightWidget(ui->audioAdd,
QColor(Qt::green));
} }
ui->audioHelp->setVisible(true); ui->audioHelp->setVisible(true);
} else { } else {

View File

@@ -9,7 +9,7 @@
namespace advss { namespace advss {
bool ExecutableSwitch::pause = false; bool ExecutableSwitch::pause = false;
static QMetaObject::Connection addPulse; static QObject *addPulse = nullptr;
void AdvSceneSwitcher::on_executableAdd_clicked() void AdvSceneSwitcher::on_executableAdd_clicked()
{ {
@@ -19,7 +19,7 @@ void AdvSceneSwitcher::on_executableAdd_clicked()
listAddClicked(ui->executables, listAddClicked(ui->executables,
new ExecutableSwitchWidget( new ExecutableSwitchWidget(
this, &switcher->executableSwitches.back()), this, &switcher->executableSwitches.back()),
ui->executableAdd, &addPulse); ui->executableAdd, addPulse);
ui->exeHelp->setVisible(false); ui->exeHelp->setVisible(false);
} }
@@ -177,8 +177,8 @@ void AdvSceneSwitcher::SetupExecutableTab()
if (switcher->executableSwitches.size() == 0) { if (switcher->executableSwitches.size() == 0) {
if (!switcher->disableHints) { if (!switcher->disableHints) {
addPulse = PulseWidget(ui->executableAdd, addPulse = HighlightWidget(ui->executableAdd,
QColor(Qt::green)); QColor(Qt::green));
} }
ui->exeHelp->setVisible(true); ui->exeHelp->setVisible(true);
} else { } else {

View File

@@ -18,7 +18,7 @@
namespace advss { namespace advss {
bool FileSwitch::pause = false; bool FileSwitch::pause = false;
static QMetaObject::Connection addPulse; static QObject *addPulse = nullptr;
static std::hash<std::string> strHash; static std::hash<std::string> strHash;
void AdvSceneSwitcher::on_browseButton_clicked() void AdvSceneSwitcher::on_browseButton_clicked()
@@ -291,7 +291,7 @@ void AdvSceneSwitcher::on_fileAdd_clicked()
listAddClicked(ui->fileSwitches, listAddClicked(ui->fileSwitches,
new FileSwitchWidget(this, new FileSwitchWidget(this,
&switcher->fileSwitches.back()), &switcher->fileSwitches.back()),
ui->fileAdd, &addPulse); ui->fileAdd, addPulse);
ui->fileHelp->setVisible(false); ui->fileHelp->setVisible(false);
} }
@@ -441,7 +441,8 @@ void AdvSceneSwitcher::SetupFileTab()
if (switcher->fileSwitches.size() == 0) { if (switcher->fileSwitches.size() == 0) {
if (!switcher->disableHints) { if (!switcher->disableHints) {
addPulse = PulseWidget(ui->fileAdd, QColor(Qt::green)); addPulse =
HighlightWidget(ui->fileAdd, QColor(Qt::green));
} }
ui->fileHelp->setVisible(true); ui->fileHelp->setVisible(true);
} else { } else {

View File

@@ -9,7 +9,7 @@
namespace advss { namespace advss {
bool MediaSwitch::pause = false; bool MediaSwitch::pause = false;
static QMetaObject::Connection addPulse; static QObject *addPulse = nullptr;
constexpr auto media_played_to_end_idx = 8; constexpr auto media_played_to_end_idx = 8;
constexpr auto media_any_idx = 9; constexpr auto media_any_idx = 9;
@@ -22,7 +22,7 @@ void AdvSceneSwitcher::on_mediaAdd_clicked()
listAddClicked(ui->mediaSwitches, listAddClicked(ui->mediaSwitches,
new MediaSwitchWidget(this, new MediaSwitchWidget(this,
&switcher->mediaSwitches.back()), &switcher->mediaSwitches.back()),
ui->mediaAdd, &addPulse); ui->mediaAdd, addPulse);
ui->mediaHelp->setVisible(false); ui->mediaHelp->setVisible(false);
} }
@@ -252,7 +252,8 @@ void AdvSceneSwitcher::SetupMediaTab()
if (switcher->mediaSwitches.size() == 0) { if (switcher->mediaSwitches.size() == 0) {
if (!switcher->disableHints) { if (!switcher->disableHints) {
addPulse = PulseWidget(ui->mediaAdd, QColor(Qt::green)); addPulse = HighlightWidget(ui->mediaAdd,
QColor(Qt::green));
} }
ui->mediaHelp->setVisible(true); ui->mediaHelp->setVisible(true);
} else { } else {

View File

@@ -10,7 +10,7 @@
namespace advss { namespace advss {
static QMetaObject::Connection addPulse; static QObject *addPulse = nullptr;
void AdvSceneSwitcher::on_pauseAdd_clicked() void AdvSceneSwitcher::on_pauseAdd_clicked()
{ {
@@ -20,7 +20,7 @@ void AdvSceneSwitcher::on_pauseAdd_clicked()
listAddClicked(ui->pauseEntries, listAddClicked(ui->pauseEntries,
new PauseEntryWidget(this, new PauseEntryWidget(this,
&switcher->pauseEntries.back()), &switcher->pauseEntries.back()),
ui->pauseAdd, &addPulse); ui->pauseAdd, addPulse);
ui->pauseHelp->setVisible(false); ui->pauseHelp->setVisible(false);
} }
@@ -264,7 +264,8 @@ void AdvSceneSwitcher::SetupPauseTab()
if (switcher->pauseEntries.size() == 0) { if (switcher->pauseEntries.size() == 0) {
if (!switcher->disableHints) { if (!switcher->disableHints) {
addPulse = PulseWidget(ui->pauseAdd, QColor(Qt::green)); addPulse = HighlightWidget(ui->pauseAdd,
QColor(Qt::green));
} }
ui->pauseHelp->setVisible(true); ui->pauseHelp->setVisible(true);
} else { } else {

View File

@@ -9,7 +9,7 @@
namespace advss { namespace advss {
bool RandomSwitch::pause = false; bool RandomSwitch::pause = false;
static QMetaObject::Connection addPulse; static QObject *addPulse = nullptr;
void AdvSceneSwitcher::on_randomAdd_clicked() void AdvSceneSwitcher::on_randomAdd_clicked()
{ {
@@ -19,7 +19,7 @@ void AdvSceneSwitcher::on_randomAdd_clicked()
listAddClicked(ui->randomSwitches, listAddClicked(ui->randomSwitches,
new RandomSwitchWidget(this, new RandomSwitchWidget(this,
&switcher->randomSwitches.back()), &switcher->randomSwitches.back()),
ui->randomAdd, &addPulse); ui->randomAdd, addPulse);
ui->randomHelp->setVisible(false); ui->randomHelp->setVisible(false);
} }
@@ -131,8 +131,8 @@ void AdvSceneSwitcher::SetupRandomTab()
if (switcher->randomSwitches.size() == 0) { if (switcher->randomSwitches.size() == 0) {
if (!switcher->disableHints) { if (!switcher->disableHints) {
addPulse = addPulse = HighlightWidget(ui->randomAdd,
PulseWidget(ui->randomAdd, QColor(Qt::green)); QColor(Qt::green));
} }
ui->randomHelp->setVisible(true); ui->randomHelp->setVisible(true);
} else { } else {
@@ -147,8 +147,8 @@ void AdvSceneSwitcher::SetupRandomTab()
}"); }");
if (switcher->switchIfNotMatching != NoMatchBehavior::RANDOM_SWITCH) { if (switcher->switchIfNotMatching != NoMatchBehavior::RANDOM_SWITCH) {
if (!switcher->disableHints) { if (!switcher->disableHints) {
PulseWidget(ui->randomDisabledWarning, QColor(Qt::red), HighlightWidget(ui->randomDisabledWarning,
QColor(0, 0, 0, 0)); QColor(Qt::red), QColor(0, 0, 0, 0));
} }
} else { } else {
ui->randomDisabledWarning->setVisible(false); ui->randomDisabledWarning->setVisible(false);

View File

@@ -11,7 +11,7 @@
namespace advss { namespace advss {
bool ScreenRegionSwitch::pause = false; bool ScreenRegionSwitch::pause = false;
static QMetaObject::Connection addPulse; static QObject *addPulse = nullptr;
void AdvSceneSwitcher::ClearFrames(QListWidget *list) void AdvSceneSwitcher::ClearFrames(QListWidget *list)
{ {
@@ -79,7 +79,7 @@ void AdvSceneSwitcher::on_screenRegionAdd_clicked()
listAddClicked(ui->screenRegionSwitches, listAddClicked(ui->screenRegionSwitches,
new ScreenRegionWidget( new ScreenRegionWidget(
this, &switcher->screenRegionSwitches.back()), this, &switcher->screenRegionSwitches.back()),
ui->screenRegionAdd, &addPulse); ui->screenRegionAdd, addPulse);
ui->regionHelp->setVisible(false); ui->regionHelp->setVisible(false);
} }
@@ -248,8 +248,8 @@ void AdvSceneSwitcher::SetupRegionTab()
if (switcher->screenRegionSwitches.size() == 0) { if (switcher->screenRegionSwitches.size() == 0) {
if (!switcher->disableHints) { if (!switcher->disableHints) {
addPulse = PulseWidget(ui->screenRegionAdd, addPulse = HighlightWidget(ui->screenRegionAdd,
QColor(Qt::green)); QColor(Qt::green));
} }
ui->regionHelp->setVisible(true); ui->regionHelp->setVisible(true);
} else { } else {

View File

@@ -16,7 +16,7 @@ namespace advss {
constexpr auto max_extend_text_size = 150; constexpr auto max_extend_text_size = 150;
bool SceneSequenceSwitch::pause = false; bool SceneSequenceSwitch::pause = false;
static QMetaObject::Connection addPulse; static QObject *addPulse = nullptr;
void AdvSceneSwitcher::on_sceneSequenceAdd_clicked() void AdvSceneSwitcher::on_sceneSequenceAdd_clicked()
{ {
@@ -26,7 +26,7 @@ void AdvSceneSwitcher::on_sceneSequenceAdd_clicked()
listAddClicked(ui->sceneSequenceSwitches, listAddClicked(ui->sceneSequenceSwitches,
new SequenceWidget( new SequenceWidget(
this, &switcher->sceneSequenceSwitches.back()), this, &switcher->sceneSequenceSwitches.back()),
ui->sceneSequenceAdd, &addPulse); ui->sceneSequenceAdd, addPulse);
ui->sequenceHelp->setVisible(false); ui->sequenceHelp->setVisible(false);
} }
@@ -299,8 +299,8 @@ void AdvSceneSwitcher::SetupSequenceTab()
if (switcher->sceneSequenceSwitches.size() == 0) { if (switcher->sceneSequenceSwitches.size() == 0) {
if (!switcher->disableHints) { if (!switcher->disableHints) {
addPulse = PulseWidget(ui->sceneSequenceAdd, addPulse = HighlightWidget(ui->sceneSequenceAdd,
QColor(Qt::green)); QColor(Qt::green));
} }
ui->sequenceHelp->setVisible(true); ui->sequenceHelp->setVisible(true);
} else { } else {

View File

@@ -7,7 +7,7 @@
namespace advss { namespace advss {
bool TimeSwitch::pause = false; bool TimeSwitch::pause = false;
static QMetaObject::Connection addPulse; static QObject *addPulse = nullptr;
void AdvSceneSwitcher::on_timeAdd_clicked() void AdvSceneSwitcher::on_timeAdd_clicked()
{ {
@@ -17,7 +17,7 @@ void AdvSceneSwitcher::on_timeAdd_clicked()
listAddClicked(ui->timeSwitches, listAddClicked(ui->timeSwitches,
new TimeSwitchWidget(this, new TimeSwitchWidget(this,
&switcher->timeSwitches.back()), &switcher->timeSwitches.back()),
ui->timeAdd, &addPulse); ui->timeAdd, addPulse);
ui->timeHelp->setVisible(false); ui->timeHelp->setVisible(false);
} }
@@ -197,7 +197,8 @@ void AdvSceneSwitcher::SetupTimeTab()
if (switcher->timeSwitches.size() == 0) { if (switcher->timeSwitches.size() == 0) {
if (!switcher->disableHints) { if (!switcher->disableHints) {
addPulse = PulseWidget(ui->timeAdd, QColor(Qt::green)); addPulse =
HighlightWidget(ui->timeAdd, QColor(Qt::green));
} }
ui->timeHelp->setVisible(true); ui->timeHelp->setVisible(true);
} else { } else {

View File

@@ -14,7 +14,7 @@
namespace advss { namespace advss {
bool VideoSwitch::pause = false; bool VideoSwitch::pause = false;
static QMetaObject::Connection addPulse; static QObject *addPulse = nullptr;
void AdvSceneSwitcher::on_videoAdd_clicked() void AdvSceneSwitcher::on_videoAdd_clicked()
{ {
@@ -24,7 +24,7 @@ void AdvSceneSwitcher::on_videoAdd_clicked()
VideoSwitchWidget *sw = VideoSwitchWidget *sw =
new VideoSwitchWidget(this, &switcher->videoSwitches.back()); new VideoSwitchWidget(this, &switcher->videoSwitches.back());
listAddClicked(ui->videoSwitches, sw, ui->videoAdd, &addPulse); listAddClicked(ui->videoSwitches, sw, ui->videoAdd, addPulse);
ui->videoHelp->setVisible(false); ui->videoHelp->setVisible(false);
} }
@@ -202,7 +202,8 @@ void AdvSceneSwitcher::SetupVideoTab()
if (switcher->videoSwitches.size() == 0) { if (switcher->videoSwitches.size() == 0) {
if (!switcher->disableHints) { if (!switcher->disableHints) {
addPulse = PulseWidget(ui->videoAdd, QColor(Qt::green)); addPulse = HighlightWidget(ui->videoAdd,
QColor(Qt::green));
} }
ui->videoHelp->setVisible(true); ui->videoHelp->setVisible(true);
} else { } else {

View File

@@ -11,7 +11,7 @@
namespace advss { namespace advss {
bool WindowSwitch::pause = false; bool WindowSwitch::pause = false;
static QMetaObject::Connection addPulse; static QObject *addPulse = nullptr;
void AdvSceneSwitcher::on_windowAdd_clicked() void AdvSceneSwitcher::on_windowAdd_clicked()
{ {
@@ -21,7 +21,7 @@ void AdvSceneSwitcher::on_windowAdd_clicked()
listAddClicked(ui->windowSwitches, listAddClicked(ui->windowSwitches,
new WindowSwitchWidget(this, new WindowSwitchWidget(this,
&switcher->windowSwitches.back()), &switcher->windowSwitches.back()),
ui->windowAdd, &addPulse); ui->windowAdd, addPulse);
ui->windowHelp->setVisible(false); ui->windowHelp->setVisible(false);
} }
@@ -335,8 +335,8 @@ void AdvSceneSwitcher::SetupTitleTab()
if (switcher->windowSwitches.size() == 0) { if (switcher->windowSwitches.size() == 0) {
if (!switcher->disableHints) { if (!switcher->disableHints) {
addPulse = addPulse = HighlightWidget(ui->windowAdd,
PulseWidget(ui->windowAdd, QColor(Qt::green)); QColor(Qt::green));
} }
ui->windowHelp->setVisible(true); ui->windowHelp->setVisible(true);
} else { } else {

View File

@@ -1,7 +1,7 @@
#include "macro-action-edit.hpp" #include "macro-action-edit.hpp"
#include "advanced-scene-switcher.hpp" #include "advanced-scene-switcher.hpp"
#include "macro-helpers.hpp" #include "macro-helpers.hpp"
#include "macro-properties.hpp" #include "macro-settings.hpp"
#include "macro.hpp" #include "macro.hpp"
#include "plugin-state-helpers.hpp" #include "plugin-state-helpers.hpp"
#include "section.hpp" #include "section.hpp"

View File

@@ -1,4 +1,5 @@
#include "macro-action-macro.hpp" #include "macro-action-macro.hpp"
#include "help-icon.hpp"
#include "layout-helpers.hpp" #include "layout-helpers.hpp"
#include "macro.hpp" #include "macro.hpp"
@@ -168,6 +169,15 @@ void MacroActionMacro::ResolveVariablesToFixedValues()
_actionIndex.ResolveVariables(); _actionIndex.ResolveVariables();
} }
static void runActionsHelper(Macro *macro, bool runElseActions, bool setInputs,
const StringList &inputs)
{
if (setInputs) {
macro->GetInputVariables().SetValues(inputs);
}
macro->PerformActions(!runElseActions, false, true);
}
void MacroActionMacro::RunActions(Macro *actionMacro) const void MacroActionMacro::RunActions(Macro *actionMacro) const
{ {
if (_runOptions.skipWhenPaused && actionMacro->Paused()) { if (_runOptions.skipWhenPaused && actionMacro->Paused()) {
@@ -175,8 +185,8 @@ void MacroActionMacro::RunActions(Macro *actionMacro) const
} }
if (_runOptions.logic == RunOptions::Logic::IGNORE_CONDITIONS) { if (_runOptions.logic == RunOptions::Logic::IGNORE_CONDITIONS) {
actionMacro->PerformActions(!_runOptions.runElseActions, false, runActionsHelper(actionMacro, _runOptions.runElseActions,
true); _runOptions.setInputs, _runOptions.inputs);
return; return;
} }
@@ -185,12 +195,16 @@ void MacroActionMacro::RunActions(Macro *actionMacro) const
return; return;
} }
if (_runOptions.reevaluateConditionState) {
conditionMacro->CeckMatch(true);
}
if ((_runOptions.logic == RunOptions::Logic::CONDITIONS && if ((_runOptions.logic == RunOptions::Logic::CONDITIONS &&
conditionMacro->Matched()) || conditionMacro->Matched()) ||
(_runOptions.logic == RunOptions::Logic::INVERT_CONDITIONS && (_runOptions.logic == RunOptions::Logic::INVERT_CONDITIONS &&
!conditionMacro->Matched())) { !conditionMacro->Matched())) {
actionMacro->PerformActions(!_runOptions.runElseActions, false, runActionsHelper(actionMacro, _runOptions.runElseActions,
true); _runOptions.setInputs, _runOptions.inputs);
} }
} }
@@ -228,11 +242,19 @@ MacroActionMacroEdit::MacroActionMacroEdit(
_actions(new QComboBox()), _actions(new QComboBox()),
_conditionMacros(new MacroSelection(parent)), _conditionMacros(new MacroSelection(parent)),
_conditionBehaviors(new QComboBox()), _conditionBehaviors(new QComboBox()),
_reevaluateConditionState(new QCheckBox(
obs_module_text("AdvSceneSwitcher.action.macro.type.run."
"updateConditionMatchState"))),
_actionTypes(new QComboBox()), _actionTypes(new QComboBox()),
_skipWhenPaused(new QCheckBox(obs_module_text( _skipWhenPaused(new QCheckBox(obs_module_text(
"AdvSceneSwitcher.action.macro.type.run.skipWhenPaused"))), "AdvSceneSwitcher.action.macro.type.run.skipWhenPaused"))),
_setInputs(new QCheckBox(obs_module_text(
"AdvSceneSwitcher.action.macro.type.run.setInputs"))),
_inputs(new MacroInputEdit()),
_entryLayout(new QHBoxLayout()), _entryLayout(new QHBoxLayout()),
_conditionLayout(new QHBoxLayout()) _conditionLayout(new QHBoxLayout()),
_reevaluateConditionStateLayout(new QHBoxLayout()),
_setInputsLayout(new QHBoxLayout())
{ {
populateActionSelection(_actions); populateActionSelection(_actions);
populateConditionBehaviorSelection(_conditionBehaviors); populateConditionBehaviorSelection(_conditionBehaviors);
@@ -256,10 +278,30 @@ MacroActionMacroEdit::MacroActionMacroEdit(
SLOT(ActionTypeChanged(int))); SLOT(ActionTypeChanged(int)));
QWidget::connect(_skipWhenPaused, SIGNAL(stateChanged(int)), this, QWidget::connect(_skipWhenPaused, SIGNAL(stateChanged(int)), this,
SLOT(SkipWhenPausedChanged(int))); SLOT(SkipWhenPausedChanged(int)));
QWidget::connect(_setInputs, SIGNAL(stateChanged(int)), this,
SLOT(SetInputsChanged(int)));
QWidget::connect(_inputs,
SIGNAL(MacroInputValuesChanged(const StringList &)),
this, SLOT(InputsChanged(const StringList &)));
QWidget::connect(_reevaluateConditionState, SIGNAL(stateChanged(int)),
this, SLOT(ReevaluateConditionStateChanged(int)));
_setInputsLayout->addWidget(_setInputs);
_setInputsLayout->addWidget(new HelpIcon(obs_module_text(
"AdvSceneSwitcher.action.macro.type.run.setInputs.description")));
_setInputsLayout->addStretch();
_reevaluateConditionStateLayout->addWidget(_reevaluateConditionState);
_reevaluateConditionStateLayout->addWidget(new HelpIcon(obs_module_text(
"AdvSceneSwitcher.action.macro.type.run.updateConditionMatchState.help")));
_reevaluateConditionStateLayout->addStretch();
auto layout = new QVBoxLayout(); auto layout = new QVBoxLayout();
layout->addLayout(_entryLayout); layout->addLayout(_entryLayout);
layout->addLayout(_conditionLayout); layout->addLayout(_conditionLayout);
layout->addLayout(_reevaluateConditionStateLayout);
layout->addLayout(_setInputsLayout);
layout->addWidget(_inputs);
layout->addWidget(_skipWhenPaused); layout->addWidget(_skipWhenPaused);
setLayout(layout); setLayout(layout);
_entryData = entryData; _entryData = entryData;
@@ -267,6 +309,13 @@ MacroActionMacroEdit::MacroActionMacroEdit(
_loading = false; _loading = false;
} }
void HighligthMacroSettingsButton(bool enable);
MacroActionMacroEdit::~MacroActionMacroEdit()
{
HighligthMacroSettingsButton(false);
}
void MacroActionMacroEdit::UpdateEntryData() void MacroActionMacroEdit::UpdateEntryData()
{ {
if (!_entryData) { if (!_entryData) {
@@ -279,88 +328,89 @@ void MacroActionMacroEdit::UpdateEntryData()
_conditionMacros->SetCurrentMacro(_entryData->_runOptions.macro); _conditionMacros->SetCurrentMacro(_entryData->_runOptions.macro);
_conditionBehaviors->setCurrentIndex( _conditionBehaviors->setCurrentIndex(
static_cast<int>(_entryData->_runOptions.logic)); static_cast<int>(_entryData->_runOptions.logic));
_reevaluateConditionState->setChecked(
_entryData->_runOptions.reevaluateConditionState);
_actionTypes->setCurrentIndex( _actionTypes->setCurrentIndex(
_entryData->_runOptions.runElseActions ? 1 : 0); _entryData->_runOptions.runElseActions ? 1 : 0);
_skipWhenPaused->setChecked(_entryData->_runOptions.skipWhenPaused); _skipWhenPaused->setChecked(_entryData->_runOptions.skipWhenPaused);
_setInputs->setChecked(_entryData->_runOptions.setInputs);
SetupMacroInput(_entryData->_macro.GetMacro().get());
SetWidgetVisibility(); SetWidgetVisibility();
} }
void MacroActionMacroEdit::MacroChanged(const QString &text) void MacroActionMacroEdit::MacroChanged(const QString &text)
{ {
if (_loading || !_entryData) { GUARD_LOADING_AND_LOCK();
return;
}
auto lock = LockContext();
_entryData->_macro = text; _entryData->_macro = text;
_actionIndex->SetMacro(_entryData->_macro.GetMacro()); const auto &macro = _entryData->_macro.GetMacro();
_actionIndex->SetMacro(macro);
SetupMacroInput(macro.get());
emit HeaderInfoChanged( emit HeaderInfoChanged(
QString::fromStdString(_entryData->GetShortDesc())); QString::fromStdString(_entryData->GetShortDesc()));
SetWidgetVisibility();
} }
void MacroActionMacroEdit::ActionChanged(int value) void MacroActionMacroEdit::ActionChanged(int value)
{ {
if (_loading || !_entryData) { GUARD_LOADING_AND_LOCK();
return;
}
auto lock = LockContext();
_entryData->_action = static_cast<MacroActionMacro::Action>(value); _entryData->_action = static_cast<MacroActionMacro::Action>(value);
SetWidgetVisibility(); SetWidgetVisibility();
} }
void MacroActionMacroEdit::ActionIndexChanged(const IntVariable &value) void MacroActionMacroEdit::ActionIndexChanged(const IntVariable &value)
{ {
if (_loading || !_entryData) { GUARD_LOADING_AND_LOCK();
return;
}
auto lock = LockContext();
_entryData->_actionIndex = value; _entryData->_actionIndex = value;
} }
void MacroActionMacroEdit::ConditionMacroChanged(const QString &text) void MacroActionMacroEdit::ConditionMacroChanged(const QString &text)
{ {
if (_loading || !_entryData) { GUARD_LOADING_AND_LOCK();
return;
}
auto lock = LockContext();
_entryData->_runOptions.macro = text; _entryData->_runOptions.macro = text;
} }
void MacroActionMacroEdit::ConditionBehaviorChanged(int value) void MacroActionMacroEdit::ConditionBehaviorChanged(int value)
{ {
if (_loading || !_entryData) { GUARD_LOADING_AND_LOCK();
return;
}
auto lock = LockContext();
_entryData->_runOptions.logic = _entryData->_runOptions.logic =
static_cast<MacroActionMacro::RunOptions::Logic>(value); static_cast<MacroActionMacro::RunOptions::Logic>(value);
SetWidgetVisibility(); SetWidgetVisibility();
} }
void MacroActionMacroEdit::ReevaluateConditionStateChanged(int value)
{
GUARD_LOADING_AND_LOCK();
_entryData->_runOptions.reevaluateConditionState = value;
SetWidgetVisibility();
}
void MacroActionMacroEdit::ActionTypeChanged(int value) void MacroActionMacroEdit::ActionTypeChanged(int value)
{ {
if (_loading || !_entryData) { GUARD_LOADING_AND_LOCK();
return;
}
auto lock = LockContext();
_entryData->_runOptions.runElseActions = value; _entryData->_runOptions.runElseActions = value;
} }
void MacroActionMacroEdit::SkipWhenPausedChanged(int value) void MacroActionMacroEdit::SkipWhenPausedChanged(int value)
{ {
if (_loading || !_entryData) { GUARD_LOADING_AND_LOCK();
return;
}
auto lock = LockContext();
_entryData->_runOptions.skipWhenPaused = value; _entryData->_runOptions.skipWhenPaused = value;
} }
void MacroActionMacroEdit::SetInputsChanged(int value)
{
GUARD_LOADING_AND_LOCK();
_entryData->_runOptions.setInputs = value;
SetWidgetVisibility();
}
void MacroActionMacroEdit::InputsChanged(const StringList &inputs)
{
GUARD_LOADING_AND_LOCK();
_entryData->_runOptions.inputs = inputs;
adjustSize();
updateGeometry();
}
void MacroActionMacroEdit::SetWidgetVisibility() void MacroActionMacroEdit::SetWidgetVisibility()
{ {
_entryLayout->removeWidget(_actions); _entryLayout->removeWidget(_actions);
@@ -418,10 +468,22 @@ void MacroActionMacroEdit::SetWidgetVisibility()
SetLayoutVisible(_conditionLayout, SetLayoutVisible(_conditionLayout,
_entryData->_action == MacroActionMacro::Action::RUN); _entryData->_action == MacroActionMacro::Action::RUN);
_conditionMacros->setVisible( const bool needsAdditionalConditionWidgets =
_entryData->_action == MacroActionMacro::Action::RUN && _entryData->_action == MacroActionMacro::Action::RUN &&
_entryData->_runOptions.logic != _entryData->_runOptions.logic !=
MacroActionMacro::RunOptions::Logic::IGNORE_CONDITIONS); MacroActionMacro::RunOptions::Logic::IGNORE_CONDITIONS;
_conditionMacros->setVisible(needsAdditionalConditionWidgets);
SetLayoutVisible(_reevaluateConditionStateLayout,
needsAdditionalConditionWidgets);
SetLayoutVisible(_setInputsLayout,
_entryData->_action == MacroActionMacro::Action::RUN);
_inputs->setVisible(_entryData->_action ==
MacroActionMacro::Action::RUN &&
_entryData->_runOptions.setInputs);
HighligthMacroSettingsButton(_entryData->_action ==
MacroActionMacro::Action::RUN &&
_entryData->_runOptions.setInputs &&
!_inputs->HasInputsToSet());
_actionTypes->setVisible(_entryData->_action == _actionTypes->setVisible(_entryData->_action ==
MacroActionMacro::Action::RUN); MacroActionMacro::Action::RUN);
_skipWhenPaused->setVisible(_entryData->_action == _skipWhenPaused->setVisible(_entryData->_action ==
@@ -431,12 +493,27 @@ void MacroActionMacroEdit::SetWidgetVisibility()
updateGeometry(); updateGeometry();
} }
void MacroActionMacroEdit::SetupMacroInput(Macro *macro) const
{
if (macro) {
_inputs->SetInputVariablesAndValues(
macro->GetInputVariables(),
_entryData->_runOptions.inputs);
} else {
_inputs->SetInputVariablesAndValues({}, {});
}
}
void MacroActionMacro::RunOptions::Save(obs_data_t *obj) const void MacroActionMacro::RunOptions::Save(obs_data_t *obj) const
{ {
OBSDataAutoRelease data = obs_data_create(); OBSDataAutoRelease data = obs_data_create();
obs_data_set_int(data, "logic", static_cast<int>(logic)); obs_data_set_int(data, "logic", static_cast<int>(logic));
obs_data_set_bool(data, "reevaluateConditionState",
reevaluateConditionState);
obs_data_set_bool(data, "runElseActions", runElseActions); obs_data_set_bool(data, "runElseActions", runElseActions);
obs_data_set_bool(data, "skipWhenPaused", skipWhenPaused); obs_data_set_bool(data, "skipWhenPaused", skipWhenPaused);
obs_data_set_bool(data, "setInputs", setInputs);
inputs.Save(data, "inputs");
macro.Save(data); macro.Save(data);
obs_data_set_obj(obj, "runOptions", data); obs_data_set_obj(obj, "runOptions", data);
} }
@@ -448,8 +525,12 @@ void MacroActionMacro::RunOptions::Load(obs_data_t *obj)
} }
OBSDataAutoRelease data = obs_data_get_obj(obj, "runOptions"); OBSDataAutoRelease data = obs_data_get_obj(obj, "runOptions");
logic = static_cast<Logic>(obs_data_get_int(data, "logic")); logic = static_cast<Logic>(obs_data_get_int(data, "logic"));
reevaluateConditionState =
obs_data_get_bool(data, "reevaluateConditionState");
runElseActions = obs_data_get_bool(data, "runElseActions"); runElseActions = obs_data_get_bool(data, "runElseActions");
skipWhenPaused = obs_data_get_bool(data, "skipWhenPaused"); skipWhenPaused = obs_data_get_bool(data, "skipWhenPaused");
setInputs = obs_data_get_bool(data, "setInputs");
inputs.Load(data, "inputs");
macro.Load(data); macro.Load(data);
} }

View File

@@ -1,5 +1,6 @@
#pragma once #pragma once
#include "macro-action-edit.hpp" #include "macro-action-edit.hpp"
#include "macro-input.hpp"
#include "macro-selection.hpp" #include "macro-selection.hpp"
#include "macro-segment-selection.hpp" #include "macro-segment-selection.hpp"
@@ -8,7 +9,7 @@
namespace advss { namespace advss {
class MacroActionMacro : public MacroRefAction { class MacroActionMacro final : public MacroRefAction {
public: public:
MacroActionMacro(Macro *m) : MacroAction(m), MacroRefAction(m) {} MacroActionMacro(Macro *m) : MacroAction(m), MacroRefAction(m) {}
bool PerformAction(); bool PerformAction();
@@ -31,8 +32,11 @@ public:
INVERT_CONDITIONS, INVERT_CONDITIONS,
}; };
Logic logic; Logic logic;
bool reevaluateConditionState = false;
bool runElseActions = false; bool runElseActions = false;
bool skipWhenPaused = true; bool skipWhenPaused = true;
bool setInputs = false;
StringList inputs;
MacroRef macro; MacroRef macro;
}; };
@@ -46,7 +50,7 @@ public:
ENABLE_ACTION, ENABLE_ACTION,
TOGGLE_ACTION, TOGGLE_ACTION,
}; };
Action _action = Action::PAUSE; Action _action = Action::RUN;
IntVariable _actionIndex = 1; IntVariable _actionIndex = 1;
RunOptions _runOptions = {}; RunOptions _runOptions = {};
@@ -57,13 +61,14 @@ private:
static const std::string id; static const std::string id;
}; };
class MacroActionMacroEdit : public QWidget { class MacroActionMacroEdit final : public QWidget {
Q_OBJECT Q_OBJECT
public: public:
MacroActionMacroEdit( MacroActionMacroEdit(
QWidget *parent, QWidget *parent,
std::shared_ptr<MacroActionMacro> entryData = nullptr); std::shared_ptr<MacroActionMacro> entryData = nullptr);
~MacroActionMacroEdit();
void UpdateEntryData(); void UpdateEntryData();
static QWidget *Create(QWidget *parent, static QWidget *Create(QWidget *parent,
std::shared_ptr<MacroAction> action) std::shared_ptr<MacroAction> action)
@@ -79,24 +84,33 @@ private slots:
void ActionIndexChanged(const IntVariable &value); void ActionIndexChanged(const IntVariable &value);
void ConditionMacroChanged(const QString &text); void ConditionMacroChanged(const QString &text);
void ConditionBehaviorChanged(int value); void ConditionBehaviorChanged(int value);
void ReevaluateConditionStateChanged(int value);
void ActionTypeChanged(int value); void ActionTypeChanged(int value);
void SkipWhenPausedChanged(int value); void SkipWhenPausedChanged(int value);
void SetInputsChanged(int value);
void InputsChanged(const StringList &);
signals: signals:
void HeaderInfoChanged(const QString &); void HeaderInfoChanged(const QString &);
private: private:
void SetWidgetVisibility(); void SetWidgetVisibility();
void SetupMacroInput(Macro *) const;
MacroSelection *_macros; MacroSelection *_macros;
MacroSegmentSelection *_actionIndex; MacroSegmentSelection *_actionIndex;
QComboBox *_actions; QComboBox *_actions;
MacroSelection *_conditionMacros; MacroSelection *_conditionMacros;
QComboBox *_conditionBehaviors; QComboBox *_conditionBehaviors;
QCheckBox *_reevaluateConditionState;
QComboBox *_actionTypes; QComboBox *_actionTypes;
QCheckBox *_skipWhenPaused; QCheckBox *_skipWhenPaused;
QCheckBox *_setInputs;
MacroInputEdit *_inputs;
QHBoxLayout *_entryLayout; QHBoxLayout *_entryLayout;
QHBoxLayout *_conditionLayout; QHBoxLayout *_conditionLayout;
QHBoxLayout *_reevaluateConditionStateLayout;
QHBoxLayout *_setInputsLayout;
std::shared_ptr<MacroActionMacro> _entryData; std::shared_ptr<MacroActionMacro> _entryData;
bool _loading = true; bool _loading = true;

View File

@@ -6,7 +6,6 @@
#include "macro.hpp" #include "macro.hpp"
#include "non-modal-dialog.hpp" #include "non-modal-dialog.hpp"
#include "source-helpers.hpp" #include "source-helpers.hpp"
#include "ui-helpers.hpp"
#include "utility.hpp" #include "utility.hpp"
namespace advss { namespace advss {
@@ -59,6 +58,8 @@ const static std::map<MacroActionVariable::Type, std::string> actionTypes = {
"AdvSceneSwitcher.action.variable.type.padValue"}, "AdvSceneSwitcher.action.variable.type.padValue"},
{MacroActionVariable::Type::TRUNCATE, {MacroActionVariable::Type::TRUNCATE,
"AdvSceneSwitcher.action.variable.type.truncateValue"}, "AdvSceneSwitcher.action.variable.type.truncateValue"},
{MacroActionVariable::Type::SWAP_VALUES,
"AdvSceneSwitcher.action.variable.type.swapValues"},
}; };
static void apppend(Variable &var, const std::string &value) static void apppend(Variable &var, const std::string &value)
@@ -393,6 +394,17 @@ bool MacroActionVariable::PerformAction()
var->SetValue( var->SetValue(
truncate(var->Value(), _direction, _stringLength)); truncate(var->Value(), _direction, _stringLength));
return true; return true;
case Type::SWAP_VALUES: {
auto var2 = _variable2.lock();
if (!var2) {
return true;
}
auto tempValue = var->Value();
var->SetValue(var2->Value());
var2->SetValue(tempValue);
return true;
}
} }
return true; return true;
@@ -631,7 +643,8 @@ MacroActionVariableEdit::MacroActionVariableEdit(
_scenes(new SceneSelectionWidget(this, true, false, true, true, _scenes(new SceneSelectionWidget(this, true, false, true, true,
true)), true)),
_tempVars(new TempVariableSelection(this)), _tempVars(new TempVariableSelection(this)),
_tempVarsHelp(new QLabel()), _tempVarsHelp(new HelpIcon(obs_module_text(
"AdvSceneSwitcher.action.variable.type.setToTempvar.help"))),
_sceneItemIndex(new VariableSpinBox()), _sceneItemIndex(new VariableSpinBox()),
_direction(new QComboBox()), _direction(new QComboBox()),
_stringLength(new VariableSpinBox()), _stringLength(new VariableSpinBox()),
@@ -659,15 +672,6 @@ MacroActionVariableEdit::MacroActionVariableEdit(
populateTypeSelection(_actions); populateTypeSelection(_actions);
populateDirectionSelection(_direction); populateDirectionSelection(_direction);
QString path = GetThemeTypeName() == "Light"
? ":/res/images/help.svg"
: ":/res/images/help_light.svg";
QIcon icon(path);
QPixmap pixmap = icon.pixmap(QSize(16, 16));
_tempVarsHelp->setPixmap(pixmap);
_tempVarsHelp->setToolTip(obs_module_text(
"AdvSceneSwitcher.action.variable.type.setToTempvar.help"));
QWidget::connect(_variables, SIGNAL(SelectionChanged(const QString &)), QWidget::connect(_variables, SIGNAL(SelectionChanged(const QString &)),
this, SLOT(VariableChanged(const QString &))); this, SLOT(VariableChanged(const QString &)));
QWidget::connect(_variables2, SIGNAL(SelectionChanged(const QString &)), QWidget::connect(_variables2, SIGNAL(SelectionChanged(const QString &)),
@@ -1318,8 +1322,9 @@ void MacroActionVariableEdit::SetWidgetVisibility()
AddStretchIfNecessary(_entryLayout); AddStretchIfNecessary(_entryLayout);
} }
_variables2->setVisible(_entryData->_type == _variables2->setVisible(
MacroActionVariable::Type::APPEND_VAR); _entryData->_type == MacroActionVariable::Type::APPEND_VAR ||
_entryData->_type == MacroActionVariable::Type::SWAP_VALUES);
_strValue->setVisible( _strValue->setVisible(
_entryData->_type == _entryData->_type ==
MacroActionVariable::Type::SET_FIXED_VALUE || MacroActionVariable::Type::SET_FIXED_VALUE ||

View File

@@ -1,5 +1,6 @@
#pragma once #pragma once
#include "macro-action-edit.hpp" #include "macro-action-edit.hpp"
#include "help-icon.hpp"
#include "macro-segment-selection.hpp" #include "macro-segment-selection.hpp"
#include "regex-config.hpp" #include "regex-config.hpp"
#include "resizing-text-edit.hpp" #include "resizing-text-edit.hpp"
@@ -48,6 +49,7 @@ public:
SCENE_ITEM_NAME, SCENE_ITEM_NAME,
PAD, PAD,
TRUNCATE, TRUNCATE,
SWAP_VALUES,
}; };
Type _type = Type::SET_FIXED_VALUE; Type _type = Type::SET_FIXED_VALUE;
@@ -185,7 +187,7 @@ private:
VariableLineEdit *_envVariable; VariableLineEdit *_envVariable;
SceneSelectionWidget *_scenes; SceneSelectionWidget *_scenes;
TempVariableSelection *_tempVars; TempVariableSelection *_tempVars;
QLabel *_tempVarsHelp; HelpIcon *_tempVarsHelp;
VariableSpinBox *_sceneItemIndex; VariableSpinBox *_sceneItemIndex;
QComboBox *_direction; QComboBox *_direction;
VariableSpinBox *_stringLength; VariableSpinBox *_stringLength;

View File

@@ -1,6 +1,6 @@
#include "macro-condition-edit.hpp" #include "macro-condition-edit.hpp"
#include "advanced-scene-switcher.hpp" #include "advanced-scene-switcher.hpp"
#include "macro-properties.hpp" #include "macro-settings.hpp"
#include "macro.hpp" #include "macro.hpp"
#include "path-helpers.hpp" #include "path-helpers.hpp"
#include "plugin-state-helpers.hpp" #include "plugin-state-helpers.hpp"

View File

@@ -167,7 +167,7 @@ void MacroDock::Highlight()
} }
if (_lastHighlightCheckTime.time_since_epoch().count() != 0 && if (_lastHighlightCheckTime.time_since_epoch().count() != 0 &&
macro->WasExecutedSince(_lastHighlightCheckTime)) { macro->WasExecutedSince(_lastHighlightCheckTime)) {
PulseWidget(this, Qt::green, QColor(0, 0, 0, 0), true); HighlightWidget(this, Qt::green, QColor(0, 0, 0, 0), true);
} }
_lastHighlightCheckTime = std::chrono::high_resolution_clock::now(); _lastHighlightCheckTime = std::chrono::high_resolution_clock::now();
} }

247
lib/macro/macro-input.cpp Normal file
View File

@@ -0,0 +1,247 @@
#include "macro-input.hpp"
#include "layout-helpers.hpp"
#include "log-helper.hpp"
#include "obs-module-helper.hpp"
#include "variable-line-edit.hpp"
#include <algorithm>
#include <obs.hpp>
namespace advss {
void MacroInputVariables::Save(obs_data_t *obj) const
{
OBSDataArrayAutoRelease array = obs_data_array_create();
for (auto &var : _inputVariables) {
OBSDataAutoRelease arrayObj = obs_data_create();
auto variable = var.lock();
if (variable) {
obs_data_set_string(arrayObj, "variableName",
variable->Name().c_str());
} else {
obs_data_set_bool(arrayObj, "invalidVariable", true);
}
obs_data_array_push_back(array, arrayObj);
}
obs_data_set_array(obj, "inputVariables", array);
}
void MacroInputVariables::Load(obs_data_t *obj)
{
OBSDataArrayAutoRelease array =
obs_data_get_array(obj, "inputVariables");
const size_t count = obs_data_array_count(array);
for (size_t i = 0; i < count; i++) {
OBSDataAutoRelease arrayObj = obs_data_array_item(array, i);
const bool isInvalid =
obs_data_get_bool(arrayObj, "invalidVariable");
if (isInvalid) {
_inputVariables.emplace_back();
} else {
const auto name =
obs_data_get_string(arrayObj, "variableName");
_inputVariables.emplace_back(
GetWeakVariableByName(name));
}
}
}
void MacroInputVariables::SetValues(const StringList &values)
{
if (_inputVariables.size() != (size_t)values.size()) {
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
blog(LOG_WARNING,
"%s - sizes do not match (variables: %ld, values %d)",
__func__, _inputVariables.size(), values.size());
#else
blog(LOG_WARNING,
"%s - sizes do not match (variables: %ld, values %lld)",
__func__, _inputVariables.size(), values.size());
#endif
}
for (size_t index = 0;
index < _inputVariables.size() && index < (size_t)values.size();
index++) {
auto variable = _inputVariables.at(index).lock();
if (!variable) {
continue;
}
variable->SetValue(values.at(index));
}
}
MacroInputSelection::MacroInputSelection(QWidget *parent) : ListEditor(parent)
{
_list->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
}
void MacroInputSelection::SetInputs(const MacroInputVariables &inputs)
{
_currentSelection = inputs;
for (const auto &var : inputs._inputVariables) {
auto variable = var.lock();
const auto name =
variable
? QString::fromStdString(variable->Name())
: obs_module_text(
"AdvSceneSwitcher.macroTab.inputSettings.invalid");
QVariant v = QVariant::fromValue(name);
auto item = new QListWidgetItem(name, _list);
item->setData(Qt::UserRole, name);
}
UpdateListSize();
}
void MacroInputSelection::Add()
{
std::string varName;
bool accepted = VariableSelectionDialog::AskForVariable(this, varName);
if (!accepted || varName.empty()) {
return;
}
_currentSelection._inputVariables.emplace_back(
GetWeakVariableByName(varName));
QVariant v = QVariant::fromValue(QString::fromStdString(varName));
auto item = new QListWidgetItem(QString::fromStdString(varName), _list);
item->setData(Qt::UserRole, QString::fromStdString(varName));
UpdateListSize();
}
void MacroInputSelection::Remove()
{
auto item = _list->currentItem();
int idx = _list->currentRow();
if (!item || idx == -1) {
return;
}
_currentSelection._inputVariables.erase(
std::next(_currentSelection._inputVariables.begin(), idx));
delete item;
UpdateListSize();
}
void MacroInputSelection::Up()
{
int idx = _list->currentRow();
if (idx < 1) {
return;
}
_list->insertItem(idx - 1, _list->takeItem(idx));
_list->setCurrentRow(idx - 1);
std::iter_swap(
std::next(_currentSelection._inputVariables.begin(), idx),
std::next(_currentSelection._inputVariables.begin(), idx - 1));
}
void MacroInputSelection::Down()
{
int idx = _list->currentRow();
if (idx < 0 || idx >= _list->count()) {
return;
}
_list->insertItem(idx + 1, _list->takeItem(idx));
_list->setCurrentRow(idx + 1);
std::iter_swap(
std::next(_currentSelection._inputVariables.begin(), idx + 1),
std::next(_currentSelection._inputVariables.begin(), idx));
}
void MacroInputSelection::Clicked(QListWidgetItem *item)
{
std::string varName;
bool accepted = VariableSelectionDialog::AskForVariable(this, varName);
if (!accepted || varName.empty()) {
return;
}
item->setText(QString::fromStdString(varName));
int idx = _list->currentRow();
_currentSelection._inputVariables.at(idx) =
GetWeakVariableByName(varName);
}
MacroInputEdit::MacroInputEdit(QWidget *parent)
: QWidget(parent),
_layout(new QGridLayout())
{
setLayout(_layout);
}
void MacroInputEdit::SetInputVariablesAndValues(
const MacroInputVariables &inputs, const StringList &values)
{
_variables = inputs;
_values = values;
if ((size_t)_values.size() < _variables._inputVariables.size()) {
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
for (int i = 0;
_variables._inputVariables.size() - (size_t)_values.size();
i++) {
_values.push_back({});
}
#else
_values.resize(_variables._inputVariables.size());
#endif
}
SetupWidgets();
}
bool MacroInputEdit::HasInputsToSet() const
{
return !_variables._inputVariables.empty();
}
void HighligthMacroSettingsButton(bool enable);
void MacroInputEdit::SetupWidgets()
{
ClearLayout(_layout);
auto &vars = _variables._inputVariables;
if (vars.empty()) {
_layout->addWidget(new QLabel(obs_module_text(
"AdvSceneSwitcher.macroTab.inputSettings.noInputs")));
adjustSize();
updateGeometry();
return;
}
for (size_t index = 0; index < vars.size(); index++) {
auto variable = vars.at(index).lock();
QLabel *label = new QLabel(
variable
? QString::fromStdString(variable->Name())
: obs_module_text(
"AdvSceneSwitcher.macroTab.inputSettings.invalid"));
_layout->addWidget(label, index, 0);
auto valueEdit = new VariableLineEdit(this);
valueEdit->setEnabled(!!variable);
valueEdit->setText(_values.at(index));
connect(valueEdit, &VariableLineEdit::editingFinished,
[this, valueEdit, index]() {
_values[index] =
valueEdit->text().toStdString();
emit MacroInputValuesChanged(_values);
});
_layout->addWidget(valueEdit, index, 1);
}
adjustSize();
updateGeometry();
}
} // namespace advss

63
lib/macro/macro-input.hpp Normal file
View File

@@ -0,0 +1,63 @@
#pragma once
#include "list-editor.hpp"
#include "string-list.hpp"
#include "variable.hpp"
#include <QGridLayout>
#include <memory>
#include <vector>
namespace advss {
class MacroInputVariables {
public:
void Save(obs_data_t *obj) const;
void Load(obs_data_t *obj);
void SetValues(const StringList &values);
private:
std::vector<std::weak_ptr<Variable>> _inputVariables;
friend class MacroInputSelection;
friend class MacroInputEdit;
};
class MacroInputSelection final : public ListEditor {
Q_OBJECT
public:
MacroInputSelection(QWidget *parent = nullptr);
void SetInputs(const MacroInputVariables &inputs);
MacroInputVariables GetInputs() const { return _currentSelection; }
private slots:
void Add();
void Remove();
void Up();
void Down();
void Clicked(QListWidgetItem *);
private:
MacroInputVariables _currentSelection;
};
class MacroInputEdit final : public QWidget {
Q_OBJECT
public:
MacroInputEdit(QWidget *parent = nullptr);
void SetInputVariablesAndValues(const MacroInputVariables &inputs,
const StringList &values);
bool HasInputsToSet() const;
signals:
void MacroInputValuesChanged(const StringList &);
private:
void SetupWidgets();
MacroInputVariables _variables;
StringList _values;
QGridLayout *_layout;
};
} // namespace advss

View File

@@ -7,68 +7,16 @@
namespace advss { namespace advss {
MacroList::MacroList(QWidget *parent, bool allowDuplicates, bool reorder) MacroList::MacroList(QWidget *parent, bool allowDuplicates, bool reorder)
: QWidget(parent), : ListEditor(parent, reorder),
_list(new QListWidget()), _allowDuplicates(allowDuplicates)
_add(new QPushButton()),
_remove(new QPushButton()),
_up(new QPushButton()),
_down(new QPushButton()),
_controlsLayout(new QHBoxLayout()),
_allowDuplicates(allowDuplicates),
_reorder(reorder)
{ {
_add->setMaximumWidth(22);
_add->setProperty("themeID",
QVariant(QString::fromUtf8("addIconSmall")));
_add->setFlat(true);
_remove->setMaximumWidth(22);
_remove->setProperty("themeID",
QVariant(QString::fromUtf8("removeIconSmall")));
_remove->setFlat(true);
_up->setMaximumWidth(22);
_up->setProperty("themeID",
QVariant(QString::fromUtf8("upArrowIconSmall")));
_up->setFlat(true);
_down->setMaximumWidth(22);
_down->setProperty("themeID",
QVariant(QString::fromUtf8("downArrowIconSmall")));
_down->setFlat(true);
QWidget::connect(_add, SIGNAL(clicked()), this, SLOT(Add()));
QWidget::connect(_remove, SIGNAL(clicked()), this, SLOT(Remove()));
QWidget::connect(_up, SIGNAL(clicked()), this, SLOT(Up()));
QWidget::connect(_down, SIGNAL(clicked()), this, SLOT(Down()));
QWidget::connect(_list, SIGNAL(itemDoubleClicked(QListWidgetItem *)),
this, SLOT(MacroItemClicked(QListWidgetItem *)));
QWidget::connect(window(), QWidget::connect(window(),
SIGNAL(MacroRenamed(const QString &, const QString &)), SIGNAL(MacroRenamed(const QString &, const QString &)),
this, this,
SLOT(MacroRename(const QString &, const QString &))); SLOT(MacroRename(const QString &, const QString &)));
QWidget::connect(window(), SIGNAL(MacroRemoved(const QString &)), this, QWidget::connect(window(), SIGNAL(MacroRemoved(const QString &)), this,
SLOT(MacroRemove(const QString &))); SLOT(MacroRemove(const QString &)));
UpdateListSize();
_controlsLayout->addWidget(_add);
_controlsLayout->addWidget(_remove);
if (reorder) {
QFrame *line = new QFrame();
line->setFrameShape(QFrame::VLine);
line->setFrameShadow(QFrame::Sunken);
_controlsLayout->addWidget(line);
}
_controlsLayout->addWidget(_up);
_controlsLayout->addWidget(_down);
_controlsLayout->addStretch();
auto mainLayout = new QVBoxLayout;
mainLayout->setContentsMargins(0, 0, 0, 0);
mainLayout->addWidget(_list);
mainLayout->addLayout(_controlsLayout);
setLayout(mainLayout);
_up->setVisible(reorder);
_down->setVisible(reorder);
SetMacroListSize();
} }
void MacroList::SetContent(const std::vector<MacroRef> &macros) void MacroList::SetContent(const std::vector<MacroRef> &macros)
@@ -89,7 +37,7 @@ void MacroList::SetContent(const std::vector<MacroRef> &macros)
new QListWidgetItem(listEntryName, _list); new QListWidgetItem(listEntryName, _list);
item->setData(Qt::UserRole, listEntryName); item->setData(Qt::UserRole, listEntryName);
} }
SetMacroListSize(); UpdateListSize();
} }
void MacroList::AddControl(QWidget *widget) void MacroList::AddControl(QWidget *widget)
@@ -122,7 +70,7 @@ void MacroList::MacroRemove(const QString &name)
delete _list->item(idx); delete _list->item(idx);
idx = FindEntry(name.toStdString()); idx = FindEntry(name.toStdString());
} }
SetMacroListSize(); UpdateListSize();
} }
void MacroList::Add() void MacroList::Add()
@@ -142,7 +90,7 @@ void MacroList::Add()
auto item = auto item =
new QListWidgetItem(QString::fromStdString(macroName), _list); new QListWidgetItem(QString::fromStdString(macroName), _list);
item->setData(Qt::UserRole, QString::fromStdString(macroName)); item->setData(Qt::UserRole, QString::fromStdString(macroName));
SetMacroListSize(); UpdateListSize();
emit Added(macroName); emit Added(macroName);
} }
@@ -154,7 +102,7 @@ void MacroList::Remove()
return; return;
} }
delete item; delete item;
SetMacroListSize(); UpdateListSize();
emit Removed(idx); emit Removed(idx);
} }
@@ -178,7 +126,7 @@ void MacroList::Down()
} }
} }
void MacroList::MacroItemClicked(QListWidgetItem *item) void MacroList::Clicked(QListWidgetItem *item)
{ {
std::string macroName; std::string macroName;
bool accepted = MacroSelectionDialog::AskForMacro(this, macroName); bool accepted = MacroSelectionDialog::AskForMacro(this, macroName);
@@ -216,10 +164,4 @@ int MacroList::FindEntry(const std::string &macro)
return idx; return idx;
} }
void MacroList::SetMacroListSize()
{
SetHeightToContentHeight(_list);
adjustSize();
}
} // namespace advss } // namespace advss

View File

@@ -1,13 +1,10 @@
#pragma once #pragma once
#include "list-editor.hpp"
#include "macro-ref.hpp" #include "macro-ref.hpp"
#include <QListWidget>
#include <QPushButton>
#include <QHBoxLayout>
namespace advss { namespace advss {
class ADVSS_EXPORT MacroList : public QWidget { class ADVSS_EXPORT MacroList final : public ListEditor {
Q_OBJECT Q_OBJECT
public: public:
MacroList(QWidget *parent, bool allowDuplicates, bool reorder); MacroList(QWidget *parent, bool allowDuplicates, bool reorder);
@@ -22,7 +19,7 @@ private slots:
void Remove(); void Remove();
void Up(); void Up();
void Down(); void Down();
void MacroItemClicked(QListWidgetItem *); void Clicked(QListWidgetItem *);
signals: signals:
void Added(const std::string &); void Added(const std::string &);
@@ -33,16 +30,8 @@ signals:
private: private:
int FindEntry(const std::string &macro); int FindEntry(const std::string &macro);
void SetMacroListSize();
QListWidget *_list;
QPushButton *_add;
QPushButton *_remove;
QPushButton *_up;
QPushButton *_down;
QHBoxLayout *_controlsLayout;
const bool _allowDuplicates; const bool _allowDuplicates;
const bool _reorder;
}; };
} // namespace advss } // namespace advss

View File

@@ -130,7 +130,7 @@ void MacroSegmentList::Highlight(int idx, QColor color)
if (!widget) { if (!widget) {
return; return;
} }
PulseWidget(widget, color, QColor(0, 0, 0, 0), true); HighlightWidget(widget, color, QColor(0, 0, 0, 0), true);
} }
void MacroSegmentList::SetCollapsed(bool collapse) void MacroSegmentList::SetCollapsed(bool collapse)

View File

@@ -175,7 +175,7 @@ void MacroSegmentSelection::MarkSelectedSegment()
index - 1, QColor(Qt::lightGray)); index - 1, QColor(Qt::lightGray));
} }
PulseWidget(this, QColor(Qt::lightGray), QColor(0, 0, 0, 0), true); HighlightWidget(this, QColor(Qt::lightGray), QColor(0, 0, 0, 0), true);
} }
} // namespace advss } // namespace advss

View File

@@ -1,4 +1,4 @@
#include "macro-properties.hpp" #include "macro-settings.hpp"
#include "layout-helpers.hpp" #include "layout-helpers.hpp"
#include "obs-module-helper.hpp" #include "obs-module-helper.hpp"
#include "macro.hpp" #include "macro.hpp"
@@ -10,9 +10,9 @@
namespace advss { namespace advss {
static MacroProperties macroProperties; static GlobalMacroSettings macroSettings;
void MacroProperties::Save(obs_data_t *obj) const void GlobalMacroSettings::Save(obs_data_t *obj) const
{ {
auto data = obs_data_create(); auto data = obs_data_create();
obs_data_set_bool(data, "highlightExecuted", _highlightExecuted); obs_data_set_bool(data, "highlightExecuted", _highlightExecuted);
@@ -20,13 +20,16 @@ void MacroProperties::Save(obs_data_t *obj) const
obs_data_set_bool(data, "highlightActions", _highlightActions); obs_data_set_bool(data, "highlightActions", _highlightActions);
obs_data_set_bool(data, "newMacroRegisterHotkey", obs_data_set_bool(data, "newMacroRegisterHotkey",
_newMacroRegisterHotkeys); _newMacroRegisterHotkeys);
obs_data_set_obj(obj, "macroProperties", data); obs_data_set_obj(obj, "macroSettings", data);
obs_data_release(data); obs_data_release(data);
} }
void MacroProperties::Load(obs_data_t *obj) void GlobalMacroSettings::Load(obs_data_t *obj)
{ {
auto data = obs_data_get_obj(obj, "macroProperties"); auto data = obs_data_get_obj(
obj, obs_data_has_user_value(obj, "macroProperties")
? "macroProperties"
: "macroSettings");
obs_data_set_default_bool(data, "highlightExecuted", true); obs_data_set_default_bool(data, "highlightExecuted", true);
obs_data_set_default_bool(data, "highlightConditions", true); obs_data_set_default_bool(data, "highlightConditions", true);
obs_data_set_default_bool(data, "highlightActions", true); obs_data_set_default_bool(data, "highlightActions", true);
@@ -38,9 +41,9 @@ void MacroProperties::Load(obs_data_t *obj)
obs_data_release(data); obs_data_release(data);
} }
MacroPropertiesDialog::MacroPropertiesDialog(QWidget *parent, MacroSettingsDialog::MacroSettingsDialog(QWidget *parent,
const MacroProperties &prop, const GlobalMacroSettings &settings,
Macro *macro) Macro *macro)
: QDialog(parent), : QDialog(parent),
_executed(new QCheckBox(obs_module_text( _executed(new QCheckBox(obs_module_text(
"AdvSceneSwitcher.macroTab.highlightExecutedMacros"))), "AdvSceneSwitcher.macroTab.highlightExecutedMacros"))),
@@ -56,6 +59,7 @@ MacroPropertiesDialog::MacroPropertiesDialog(QWidget *parent,
"AdvSceneSwitcher.macroTab.currentSkipExecutionOnStartup"))), "AdvSceneSwitcher.macroTab.currentSkipExecutionOnStartup"))),
_currentStopActionsIfNotDone(new QCheckBox(obs_module_text( _currentStopActionsIfNotDone(new QCheckBox(obs_module_text(
"AdvSceneSwitcher.macroTab.currentStopActionsIfNotDone"))), "AdvSceneSwitcher.macroTab.currentStopActionsIfNotDone"))),
_currentInputs(new MacroInputSelection()),
_currentMacroRegisterDock(new QCheckBox(obs_module_text( _currentMacroRegisterDock(new QCheckBox(obs_module_text(
"AdvSceneSwitcher.macroTab.currentRegisterDock"))), "AdvSceneSwitcher.macroTab.currentRegisterDock"))),
_currentMacroDockAddRunButton(new QCheckBox(obs_module_text( _currentMacroDockAddRunButton(new QCheckBox(obs_module_text(
@@ -101,6 +105,16 @@ MacroPropertiesDialog::MacroPropertiesDialog(QWidget *parent,
generalLayout->addWidget(_currentStopActionsIfNotDone); generalLayout->addWidget(_currentStopActionsIfNotDone);
generalOptions->setLayout(generalLayout); generalOptions->setLayout(generalLayout);
auto inputOptions = new QGroupBox(
obs_module_text("AdvSceneSwitcher.macroTab.inputSettings"));
auto description = new QLabel(obs_module_text(
"AdvSceneSwitcher.macroTab.inputSettings.description"));
description->setWordWrap(true);
auto inputLayout = new QVBoxLayout();
inputLayout->addWidget(description);
inputLayout->addWidget(_currentInputs);
inputOptions->setLayout(inputLayout);
int row = 0; int row = 0;
_dockLayout->addWidget(_currentMacroRegisterDock, row, 1, 1, 2); _dockLayout->addWidget(_currentMacroRegisterDock, row, 1, 1, 2);
row++; row++;
@@ -157,13 +171,13 @@ MacroPropertiesDialog::MacroPropertiesDialog(QWidget *parent,
connect(buttonbox, &QDialogButtonBox::rejected, this, &QDialog::reject); connect(buttonbox, &QDialogButtonBox::rejected, this, &QDialog::reject);
connect(_currentMacroRegisterDock, &QCheckBox::stateChanged, this, connect(_currentMacroRegisterDock, &QCheckBox::stateChanged, this,
&MacroPropertiesDialog::DockEnableChanged); &MacroSettingsDialog::DockEnableChanged);
connect(_currentMacroDockAddRunButton, &QCheckBox::stateChanged, this, connect(_currentMacroDockAddRunButton, &QCheckBox::stateChanged, this,
&MacroPropertiesDialog::RunButtonEnableChanged); &MacroSettingsDialog::RunButtonEnableChanged);
connect(_currentMacroDockAddPauseButton, &QCheckBox::stateChanged, this, connect(_currentMacroDockAddPauseButton, &QCheckBox::stateChanged, this,
&MacroPropertiesDialog::PauseButtonEnableChanged); &MacroSettingsDialog::PauseButtonEnableChanged);
connect(_currentMacroDockAddStatusLabel, &QCheckBox::stateChanged, this, connect(_currentMacroDockAddStatusLabel, &QCheckBox::stateChanged, this,
&MacroPropertiesDialog::StatusLabelEnableChanged); &MacroSettingsDialog::StatusLabelEnableChanged);
auto scrollArea = new QScrollArea(this); auto scrollArea = new QScrollArea(this);
scrollArea->setWidgetResizable(true); scrollArea->setWidgetResizable(true);
@@ -174,6 +188,7 @@ MacroPropertiesDialog::MacroPropertiesDialog(QWidget *parent,
layout->addWidget(highlightOptions); layout->addWidget(highlightOptions);
layout->addWidget(hotkeyOptions); layout->addWidget(hotkeyOptions);
layout->addWidget(generalOptions); layout->addWidget(generalOptions);
layout->addWidget(inputOptions);
layout->addWidget(_dockOptions); layout->addWidget(_dockOptions);
layout->setContentsMargins(0, 0, 0, 0); layout->setContentsMargins(0, 0, 0, 0);
scrollArea->setWidget(contentWidget); scrollArea->setWidget(contentWidget);
@@ -183,14 +198,15 @@ MacroPropertiesDialog::MacroPropertiesDialog(QWidget *parent,
dialogLayout->addWidget(buttonbox); dialogLayout->addWidget(buttonbox);
setLayout(dialogLayout); setLayout(dialogLayout);
_executed->setChecked(prop._highlightExecuted); _executed->setChecked(settings._highlightExecuted);
_conditions->setChecked(prop._highlightConditions); _conditions->setChecked(settings._highlightConditions);
_actions->setChecked(prop._highlightActions); _actions->setChecked(settings._highlightActions);
_newMacroRegisterHotkeys->setChecked(prop._newMacroRegisterHotkeys); _newMacroRegisterHotkeys->setChecked(settings._newMacroRegisterHotkeys);
if (!macro || macro->IsGroup()) { if (!macro || macro->IsGroup()) {
hotkeyOptions->hide(); hotkeyOptions->hide();
generalOptions->hide(); generalOptions->hide();
inputOptions->hide();
_dockOptions->hide(); _dockOptions->hide();
return; return;
} }
@@ -198,6 +214,7 @@ MacroPropertiesDialog::MacroPropertiesDialog(QWidget *parent,
_currentMacroRegisterHotkeys->setChecked(macro->PauseHotkeysEnabled()); _currentMacroRegisterHotkeys->setChecked(macro->PauseHotkeysEnabled());
_currentSkipOnStartup->setChecked(macro->SkipExecOnStart()); _currentSkipOnStartup->setChecked(macro->SkipExecOnStart());
_currentStopActionsIfNotDone->setChecked(macro->StopActionsIfNotDone()); _currentStopActionsIfNotDone->setChecked(macro->StopActionsIfNotDone());
_currentInputs->SetInputs(macro->GetInputVariables());
const bool dockEnabled = macro->DockEnabled(); const bool dockEnabled = macro->DockEnabled();
_currentMacroRegisterDock->setChecked(dockEnabled); _currentMacroRegisterDock->setChecked(dockEnabled);
_currentMacroDockAddRunButton->setChecked(macro->DockHasRunButton()); _currentMacroDockAddRunButton->setChecked(macro->DockHasRunButton());
@@ -245,7 +262,7 @@ MacroPropertiesDialog::MacroPropertiesDialog(QWidget *parent,
20); 20);
} }
void MacroPropertiesDialog::DockEnableChanged(int enabled) void MacroSettingsDialog::DockEnableChanged(int enabled)
{ {
_currentMacroDockAddRunButton->setVisible(enabled); _currentMacroDockAddRunButton->setVisible(enabled);
_currentMacroDockAddPauseButton->setVisible(enabled); _currentMacroDockAddPauseButton->setVisible(enabled);
@@ -270,37 +287,37 @@ void MacroPropertiesDialog::DockEnableChanged(int enabled)
Resize(); Resize();
} }
void MacroPropertiesDialog::RunButtonEnableChanged(int enabled) void MacroSettingsDialog::RunButtonEnableChanged(int enabled)
{ {
SetGridLayoutRowVisible(_dockLayout, _runButtonTextRow, enabled); SetGridLayoutRowVisible(_dockLayout, _runButtonTextRow, enabled);
Resize(); Resize();
} }
void MacroPropertiesDialog::PauseButtonEnableChanged(int enabled) void MacroSettingsDialog::PauseButtonEnableChanged(int enabled)
{ {
SetGridLayoutRowVisible(_dockLayout, _pauseButtonTextRow, enabled); SetGridLayoutRowVisible(_dockLayout, _pauseButtonTextRow, enabled);
SetGridLayoutRowVisible(_dockLayout, _unpauseButtonTextRow, enabled); SetGridLayoutRowVisible(_dockLayout, _unpauseButtonTextRow, enabled);
Resize(); Resize();
} }
void MacroPropertiesDialog::StatusLabelEnableChanged(int enabled) void MacroSettingsDialog::StatusLabelEnableChanged(int enabled)
{ {
SetGridLayoutRowVisible(_dockLayout, _conditionsTrueTextRow, enabled); SetGridLayoutRowVisible(_dockLayout, _conditionsTrueTextRow, enabled);
SetGridLayoutRowVisible(_dockLayout, _conditionsFalseTextRow, enabled); SetGridLayoutRowVisible(_dockLayout, _conditionsFalseTextRow, enabled);
Resize(); Resize();
} }
void MacroPropertiesDialog::Resize() void MacroSettingsDialog::Resize()
{ {
_dockOptions->adjustSize(); _dockOptions->adjustSize();
_dockOptions->updateGeometry(); _dockOptions->updateGeometry();
} }
bool MacroPropertiesDialog::AskForSettings(QWidget *parent, bool MacroSettingsDialog::AskForSettings(QWidget *parent,
MacroProperties &userInput, GlobalMacroSettings &userInput,
Macro *macro) Macro *macro)
{ {
MacroPropertiesDialog dialog(parent, userInput, macro); MacroSettingsDialog dialog(parent, userInput, macro);
dialog.setWindowTitle(obs_module_text("AdvSceneSwitcher.windowTitle")); dialog.setWindowTitle(obs_module_text("AdvSceneSwitcher.windowTitle"));
if (dialog.exec() != DialogCode::Accepted) { if (dialog.exec() != DialogCode::Accepted) {
return false; return false;
@@ -337,23 +354,23 @@ bool MacroPropertiesDialog::AskForSettings(QWidget *parent,
dialog._conditionsTrueStatusText->text().toStdString()); dialog._conditionsTrueStatusText->text().toStdString());
macro->SetConditionsFalseStatusText( macro->SetConditionsFalseStatusText(
dialog._conditionsFalseStatusText->text().toStdString()); dialog._conditionsFalseStatusText->text().toStdString());
macro->SetInputVariables(dialog._currentInputs->GetInputs());
return true; return true;
} }
MacroProperties &GetGlobalMacroProperties() GlobalMacroSettings &GetGlobalMacroSettings()
{ {
return macroProperties; return macroSettings;
} }
void SaveGlobalMacroProperties(obs_data_t *obj) void SaveGlobalMacroSettings(obs_data_t *obj)
{ {
macroProperties.Save(obj); macroSettings.Save(obj);
} }
void LoadGlobalMacroProperties(obs_data_t *obj) void LoadGlobalMacroSettings(obs_data_t *obj)
{ {
macroProperties.Load(obj); macroSettings.Load(obj);
} }
} // namespace advss } // namespace advss

View File

@@ -1,5 +1,6 @@
#pragma once #pragma once
#include "variable-line-edit.hpp" #include "variable-line-edit.hpp"
#include "macro-input.hpp"
#include <QWidget> #include <QWidget>
#include <QDialog> #include <QDialog>
@@ -13,7 +14,7 @@ namespace advss {
class Macro; class Macro;
class MacroProperties { class GlobalMacroSettings {
public: public:
void Save(obs_data_t *obj) const; void Save(obs_data_t *obj) const;
void Load(obs_data_t *obj); void Load(obs_data_t *obj);
@@ -25,13 +26,14 @@ public:
}; };
// Dialog for configuring global and individual macro specific settings // Dialog for configuring global and individual macro specific settings
class MacroPropertiesDialog : public QDialog { class MacroSettingsDialog : public QDialog {
Q_OBJECT Q_OBJECT
public: public:
MacroPropertiesDialog(QWidget *parent, const MacroProperties &, MacroSettingsDialog(QWidget *parent, const GlobalMacroSettings &,
Macro *macro); Macro *macro);
static bool AskForSettings(QWidget *parent, MacroProperties &userInput, static bool AskForSettings(QWidget *parent,
GlobalMacroSettings &userInput,
Macro *macro); Macro *macro);
private slots: private slots:
void DockEnableChanged(int); void DockEnableChanged(int);
@@ -50,6 +52,7 @@ private:
QCheckBox *_currentMacroRegisterHotkeys; QCheckBox *_currentMacroRegisterHotkeys;
QCheckBox *_currentSkipOnStartup; QCheckBox *_currentSkipOnStartup;
QCheckBox *_currentStopActionsIfNotDone; QCheckBox *_currentStopActionsIfNotDone;
MacroInputSelection *_currentInputs;
QCheckBox *_currentMacroRegisterDock; QCheckBox *_currentMacroRegisterDock;
QCheckBox *_currentMacroDockAddRunButton; QCheckBox *_currentMacroDockAddRunButton;
QCheckBox *_currentMacroDockAddPauseButton; QCheckBox *_currentMacroDockAddPauseButton;
@@ -70,8 +73,8 @@ private:
int _conditionsFalseTextRow = -1; int _conditionsFalseTextRow = -1;
}; };
MacroProperties &GetGlobalMacroProperties(); GlobalMacroSettings &GetGlobalMacroSettings();
void SaveGlobalMacroProperties(obs_data_t *obj); void SaveGlobalMacroSettings(obs_data_t *obj);
void LoadGlobalMacroProperties(obs_data_t *obj); void LoadGlobalMacroSettings(obs_data_t *obj);
} // namespace advss } // namespace advss

View File

@@ -3,7 +3,7 @@
#include "macro-action-edit.hpp" #include "macro-action-edit.hpp"
#include "macro-condition-edit.hpp" #include "macro-condition-edit.hpp"
#include "macro-export-import-dialog.hpp" #include "macro-export-import-dialog.hpp"
#include "macro-properties.hpp" #include "macro-settings.hpp"
#include "macro-segment-copy-paste.hpp" #include "macro-segment-copy-paste.hpp"
#include "macro-tree.hpp" #include "macro-tree.hpp"
#include "macro.hpp" #include "macro.hpp"
@@ -23,7 +23,7 @@
namespace advss { namespace advss {
static QMetaObject::Connection addPulse; static QObject *addPulse = nullptr;
static QTimer onChangeHighlightTimer; static QTimer onChangeHighlightTimer;
static bool macroNameExists(const std::string &name) static bool macroNameExists(const std::string &name)
@@ -86,7 +86,7 @@ bool AdvSceneSwitcher::AddNewMacro(std::shared_ptr<Macro> &res,
} }
res = std::make_shared<Macro>( res = std::make_shared<Macro>(
name, GetGlobalMacroProperties()._newMacroRegisterHotkeys); name, GetGlobalMacroSettings()._newMacroRegisterHotkeys);
return true; return true;
} }
@@ -99,7 +99,8 @@ void AdvSceneSwitcher::on_macroAdd_clicked()
} }
ui->macros->Add(newMacro); ui->macros->Add(newMacro);
ui->macroAdd->disconnect(addPulse); addPulse->deleteLater();
addPulse = nullptr;
emit MacroAdded(QString::fromStdString(name)); emit MacroAdded(QString::fromStdString(name));
} }
@@ -462,7 +463,7 @@ void AdvSceneSwitcher::ImportMacros()
RunPostLoadSteps(); RunPostLoadSteps();
ui->macros->Reset(GetMacros(), ui->macros->Reset(GetMacros(),
GetGlobalMacroProperties()._highlightExecuted); GetGlobalMacroSettings()._highlightExecuted);
} }
void AdvSceneSwitcher::on_macroName_editingFinished() void AdvSceneSwitcher::on_macroName_editingFinished()
@@ -742,8 +743,8 @@ void AdvSceneSwitcher::MacroSelectionChanged()
void AdvSceneSwitcher::HighlightOnChange() void AdvSceneSwitcher::HighlightOnChange()
{ {
if (!GetGlobalMacroProperties()._highlightActions && if (!GetGlobalMacroSettings()._highlightActions &&
!GetGlobalMacroProperties()._highlightExecuted) { !GetGlobalMacroSettings()._highlightExecuted) {
return; return;
} }
@@ -753,20 +754,20 @@ void AdvSceneSwitcher::HighlightOnChange()
} }
if (macro->OnChangePreventedActionsRecently()) { if (macro->OnChangePreventedActionsRecently()) {
PulseWidget(ui->runMacroOnChange, Qt::yellow, Qt::transparent, HighlightWidget(ui->runMacroOnChange, Qt::yellow,
true); Qt::transparent, true);
} }
} }
void AdvSceneSwitcher::on_macroProperties_clicked() void AdvSceneSwitcher::on_macroSettings_clicked()
{ {
MacroProperties prop = GetGlobalMacroProperties(); GlobalMacroSettings prop = GetGlobalMacroSettings();
bool accepted = MacroPropertiesDialog::AskForSettings( bool accepted = MacroSettingsDialog::AskForSettings(
this, prop, GetSelectedMacro().get()); this, prop, GetSelectedMacro().get());
if (!accepted) { if (!accepted) {
return; return;
} }
GetGlobalMacroProperties() = prop; GetGlobalMacroSettings() = prop;
emit HighlightMacrosChanged(prop._highlightExecuted); emit HighlightMacrosChanged(prop._highlightExecuted);
} }
@@ -816,11 +817,11 @@ static void runSegmentHighligtChecks(AdvSceneSwitcher *ss)
return; return;
} }
const auto &properties = GetGlobalMacroProperties(); const auto &settings = GetGlobalMacroSettings();
if (properties._highlightConditions) { if (settings._highlightConditions) {
runSegmentHighligtChecksHelper(ss->ui->conditionsList); runSegmentHighligtChecksHelper(ss->ui->conditionsList);
} }
if (properties._highlightActions) { if (settings._highlightActions) {
runSegmentHighligtChecksHelper(ss->ui->actionsList); runSegmentHighligtChecksHelper(ss->ui->actionsList);
runSegmentHighligtChecksHelper(ss->ui->elseActionsList); runSegmentHighligtChecksHelper(ss->ui->elseActionsList);
} }
@@ -832,10 +833,10 @@ void AdvSceneSwitcher::SetupMacroTab()
ui->macros->installEventFilter(this); ui->macros->installEventFilter(this);
if (GetMacros().size() == 0 && !switcher->disableHints) { if (GetMacros().size() == 0 && !switcher->disableHints) {
addPulse = PulseWidget(ui->macroAdd, QColor(Qt::green)); addPulse = HighlightWidget(ui->macroAdd, QColor(Qt::green));
} }
ui->macros->Reset(GetMacros(), ui->macros->Reset(GetMacros(),
GetGlobalMacroProperties()._highlightExecuted); GetGlobalMacroSettings()._highlightExecuted);
connect(ui->macros, SIGNAL(MacroSelectionAboutToChange()), this, connect(ui->macros, SIGNAL(MacroSelectionAboutToChange()), this,
SLOT(MacroSelectionAboutToChange())); SLOT(MacroSelectionAboutToChange()));
connect(ui->macros, SIGNAL(MacroSelectionChanged()), this, connect(ui->macros, SIGNAL(MacroSelectionChanged()), this,
@@ -1106,7 +1107,8 @@ void AdvSceneSwitcher::CopyMacro()
Macro::PrepareMoveToGroup(macro->Parent(), newMacro); Macro::PrepareMoveToGroup(macro->Parent(), newMacro);
ui->macros->Add(newMacro, macro); ui->macros->Add(newMacro, macro);
ui->macroAdd->disconnect(addPulse); addPulse->deleteLater();
addPulse = nullptr;
emit MacroAdded(QString::fromStdString(name)); emit MacroAdded(QString::fromStdString(name));
} }

View File

@@ -108,7 +108,7 @@ void MacroTreeItem::HighlightIfExecuted()
if (_lastHighlightCheckTime.time_since_epoch().count() != 0 && if (_lastHighlightCheckTime.time_since_epoch().count() != 0 &&
_macro->WasExecutedSince(_lastHighlightCheckTime)) { _macro->WasExecutedSince(_lastHighlightCheckTime)) {
PulseWidget(this, Qt::green, QColor(0, 0, 0, 0), true); HighlightWidget(this, Qt::green, QColor(0, 0, 0, 0), true);
} }
_lastHighlightCheckTime = std::chrono::high_resolution_clock::now(); _lastHighlightCheckTime = std::chrono::high_resolution_clock::now();
} }

View File

@@ -101,7 +101,7 @@ void Macro::PrepareMoveToGroup(std::shared_ptr<Macro> group,
} }
} }
bool Macro::CeckMatch() bool Macro::CeckMatch(bool ignorePause)
{ {
if (_isGroup) { if (_isGroup) {
return false; return false;
@@ -109,7 +109,7 @@ bool Macro::CeckMatch()
_matched = false; _matched = false;
for (auto &c : _conditions) { for (auto &c : _conditions) {
if (_paused) { if (_paused && !ignorePause) {
vblog(LOG_INFO, "Macro %s is paused", _name.c_str()); vblog(LOG_INFO, "Macro %s is paused", _name.c_str());
return false; return false;
} }
@@ -185,6 +185,7 @@ bool Macro::CeckMatch()
if (!_conditionSateChanged && _performActionsOnChange) { if (!_conditionSateChanged && _performActionsOnChange) {
_onPreventedActionExecution = true; _onPreventedActionExecution = true;
} }
_lastMatched = _matched; _lastMatched = _matched;
_lastCheckTime = std::chrono::high_resolution_clock::now(); _lastCheckTime = std::chrono::high_resolution_clock::now();
return _matched; return _matched;
@@ -348,6 +349,11 @@ void Macro::SetMatchOnChange(bool onChange)
_performActionsOnChange = onChange; _performActionsOnChange = onChange;
} }
void Macro::SetStopActionsIfNotDone(bool stopActionsIfNotDone)
{
_stopActionsIfNotDone = stopActionsIfNotDone;
}
void Macro::SetPaused(bool pause) void Macro::SetPaused(bool pause)
{ {
if (_paused && !pause) { if (_paused && !pause) {
@@ -382,6 +388,16 @@ void Macro::Stop()
} }
} }
MacroInputVariables Macro::GetInputVariables() const
{
return _inputVariables;
}
void Macro::SetInputVariables(const MacroInputVariables &inputVariables)
{
_inputVariables = inputVariables;
}
std::vector<TempVariable> Macro::GetTempVars(MacroSegment *filter) const std::vector<TempVariable> Macro::GetTempVars(MacroSegment *filter) const
{ {
std::vector<TempVariable> res; std::vector<TempVariable> res;
@@ -610,6 +626,8 @@ bool Macro::Save(obs_data_t *obj) const
} }
obs_data_set_array(obj, "elseActions", elseActions); obs_data_set_array(obj, "elseActions", elseActions);
_inputVariables.Save(obj);
return true; return true;
} }
@@ -748,6 +766,8 @@ bool Macro::Load(obs_data_t *obj)
} }
UpdateElseActionIndices(); UpdateElseActionIndices();
_inputVariables.Load(obj);
return true; return true;
} }

View File

@@ -2,6 +2,7 @@
#include "macro-action.hpp" #include "macro-action.hpp"
#include "macro-condition.hpp" #include "macro-condition.hpp"
#include "macro-helpers.hpp" #include "macro-helpers.hpp"
#include "macro-input.hpp"
#include "macro-ref.hpp" #include "macro-ref.hpp"
#include "variable-string.hpp" #include "variable-string.hpp"
#include "temp-variable.hpp" #include "temp-variable.hpp"
@@ -25,35 +26,44 @@ public:
Macro(const std::string &name = "", const bool addHotkey = false); Macro(const std::string &name = "", const bool addHotkey = false);
virtual ~Macro(); virtual ~Macro();
bool CeckMatch();
bool PerformActions(bool match, bool forceParallel = false,
bool ignorePause = false);
bool Matched() const { return _matched; }
bool ShouldRunActions() const;
int64_t MsSinceLastCheck() const;
std::string Name() const { return _name; } std::string Name() const { return _name; }
void SetName(const std::string &name); void SetName(const std::string &name);
void SetRunInParallel(bool parallel) { _runInParallel = parallel; }
bool RunInParallel() const { return _runInParallel; } bool CeckMatch(bool ignorePause = false);
bool Matched() const { return _matched; }
int64_t MsSinceLastCheck() const;
bool ShouldRunActions() const;
bool PerformActions(bool match, bool forceParallel = false,
bool ignorePause = false);
void SetPaused(bool pause = true); void SetPaused(bool pause = true);
bool Paused() const { return _paused; } bool Paused() const { return _paused; }
bool WasPausedSince( bool WasPausedSince(
const std::chrono::high_resolution_clock::time_point &) const; const std::chrono::high_resolution_clock::time_point &) const;
void Stop();
bool GetStop() const { return _stop; }
void ResetTimers();
void SetMatchOnChange(bool onChange); void SetMatchOnChange(bool onChange);
bool MatchOnChange() const { return _performActionsOnChange; } bool MatchOnChange() const { return _performActionsOnChange; }
void SetSkipExecOnStart(bool skip) { _skipExecOnStart = skip; } void SetSkipExecOnStart(bool skip) { _skipExecOnStart = skip; }
bool SkipExecOnStart() const { return _skipExecOnStart; } bool SkipExecOnStart() const { return _skipExecOnStart; }
void SetStopActionsIfNotDone(bool stopActionsIfNotDone)
{ void SetStopActionsIfNotDone(bool stopActionsIfNotDone);
_stopActionsIfNotDone = stopActionsIfNotDone;
}
bool StopActionsIfNotDone() const { return _stopActionsIfNotDone; } bool StopActionsIfNotDone() const { return _stopActionsIfNotDone; }
int RunCount() const { return _runCount; }; int RunCount() const { return _runCount; };
void ResetRunCount() { _runCount = 0; }; void ResetRunCount() { _runCount = 0; };
void ResetTimers();
void AddHelperThread(std::thread &&); void AddHelperThread(std::thread &&);
bool GetStop() const { return _stop; } void SetRunInParallel(bool parallel) { _runInParallel = parallel; }
void Stop(); bool RunInParallel() const { return _runInParallel; }
// Input variables
MacroInputVariables GetInputVariables() const;
void SetInputVariables(const MacroInputVariables &);
// Temporary variable helpers // Temporary variable helpers
std::vector<TempVariable> GetTempVars(MacroSegment *filter) const; std::vector<TempVariable> GetTempVars(MacroSegment *filter) const;
@@ -98,19 +108,21 @@ public:
bool SwitchesScene() const; bool SwitchesScene() const;
// UI helpers // UI helpers
const QList<int> &GetActionConditionSplitterPosition() const;
void SetActionConditionSplitterPosition(const QList<int>); void SetActionConditionSplitterPosition(const QList<int>);
const QList<int> &GetElseActionSplitterPosition() const; const QList<int> &GetActionConditionSplitterPosition() const;
void SetElseActionSplitterPosition(const QList<int>); void SetElseActionSplitterPosition(const QList<int>);
const QList<int> &GetElseActionSplitterPosition() const;
bool HasValidSplitterPositions() const; bool HasValidSplitterPositions() const;
bool WasExecutedSince( bool WasExecutedSince(
const std::chrono::high_resolution_clock::time_point &) const; const std::chrono::high_resolution_clock::time_point &) const;
bool OnChangePreventedActionsRecently(); bool OnChangePreventedActionsRecently();
void ResetUIHelpers(); void ResetUIHelpers();
// Hotkeys
void EnablePauseHotkeys(bool); void EnablePauseHotkeys(bool);
bool PauseHotkeysEnabled() const; bool PauseHotkeysEnabled() const;
// Docks
void EnableDock(bool); void EnableDock(bool);
bool DockEnabled() const { return _registerDock; } bool DockEnabled() const { return _registerDock; }
void SetDockHasRunButton(bool value); void SetDockHasRunButton(bool value);
@@ -182,6 +194,8 @@ private:
obs_hotkey_id _unpauseHotkey = OBS_INVALID_HOTKEY_ID; obs_hotkey_id _unpauseHotkey = OBS_INVALID_HOTKEY_ID;
obs_hotkey_id _togglePauseHotkey = OBS_INVALID_HOTKEY_ID; obs_hotkey_id _togglePauseHotkey = OBS_INVALID_HOTKEY_ID;
MacroInputVariables _inputVariables;
// UI helpers // UI helpers
bool _onPreventedActionExecution = false; bool _onPreventedActionExecution = false;

View File

@@ -220,14 +220,15 @@ static void setupTab(QTabWidget *tab)
} }
QWidget::connect(ActionQueueSignalManager::Instance(), QWidget::connect(ActionQueueSignalManager::Instance(),
&ActionQueueSignalManager::Rename, &ActionQueueSignalManager::Rename, tab,
[](const QString &oldName, const QString &newName) { [](const QString &oldName, const QString &newName) {
RenameItemTableRow(tabWidget->Table(), oldName, RenameItemTableRow(tabWidget->Table(), oldName,
newName); newName);
}); });
QWidget::connect( QWidget::connect(
ActionQueueSignalManager::Instance(), ActionQueueSignalManager::Instance(),
&ActionQueueSignalManager::Add, [tab](const QString &name) { &ActionQueueSignalManager::Add, tab,
[tab](const QString &name) {
AddItemTableRow( AddItemTableRow(
tabWidget->Table(), tabWidget->Table(),
getCellLabels(GetWeakActionQueueByQString(name) getCellLabels(GetWeakActionQueueByQString(name)
@@ -238,7 +239,7 @@ static void setupTab(QTabWidget *tab)
setTabVisible(tab, true); setTabVisible(tab, true);
}); });
QWidget::connect(ActionQueueSignalManager::Instance(), QWidget::connect(ActionQueueSignalManager::Instance(),
&ActionQueueSignalManager::Remove, &ActionQueueSignalManager::Remove, tab,
[](const QString &name) { [](const QString &name) {
RemoveItemTableRow(tabWidget->Table(), name); RemoveItemTableRow(tabWidget->Table(), name);
if (tabWidget->Table()->rowCount() == 0) { if (tabWidget->Table()->rowCount() == 0) {

View File

@@ -1,6 +1,7 @@
#include "action-queue.hpp" #include "action-queue.hpp"
#include "obs-module-helper.hpp" #include "obs-module-helper.hpp"
#include "plugin-state-helpers.hpp" #include "plugin-state-helpers.hpp"
#include "ui-helpers.hpp"
namespace advss { namespace advss {
@@ -379,11 +380,24 @@ static bool queueWithNameExists(const std::string &name)
return !GetWeakActionQueueByName(name).expired(); return !GetWeakActionQueueByName(name).expired();
} }
static void signalImportedQueues(void *varsPtr)
{
auto queues = std::unique_ptr<std::vector<std::shared_ptr<Item>>>(
static_cast<std::vector<std::shared_ptr<Item>> *>(varsPtr));
for (const auto &queue : *queues) {
ActionQueueSignalManager::Instance()->Add(
QString::fromStdString(queue->Name()));
}
}
void ImportQueues(obs_data_t *data) void ImportQueues(obs_data_t *data)
{ {
OBSDataArrayAutoRelease array = OBSDataArrayAutoRelease array =
obs_data_get_array(data, "actionQueues"); obs_data_get_array(data, "actionQueues");
size_t count = obs_data_array_count(array); size_t count = obs_data_array_count(array);
auto importedQueues = new std::vector<std::shared_ptr<Item>>;
for (size_t i = 0; i < count; i++) { for (size_t i = 0; i < count; i++) {
OBSDataAutoRelease arrayElement = obs_data_array_item(array, i); OBSDataAutoRelease arrayElement = obs_data_array_item(array, i);
auto queue = ActionQueue::Create(); auto queue = ActionQueue::Create();
@@ -392,7 +406,10 @@ void ImportQueues(obs_data_t *data)
continue; continue;
} }
queues.emplace_back(queue); queues.emplace_back(queue);
importedQueues->emplace_back(queue);
} }
QeueUITask(signalImportedQueues, importedQueues);
} }
std::weak_ptr<ActionQueue> GetWeakActionQueueByName(const std::string &name) std::weak_ptr<ActionQueue> GetWeakActionQueueByName(const std::string &name)

View File

@@ -16,7 +16,7 @@
#include "switch-video.hpp" #include "switch-video.hpp"
#include "switch-network.hpp" #include "switch-network.hpp"
#include "macro-properties.hpp" #include "macro-settings.hpp"
#include "duration-control.hpp" #include "duration-control.hpp"
#include "priority-helper.hpp" #include "priority-helper.hpp"
#include "plugin-state-helpers.hpp" #include "plugin-state-helpers.hpp"

19
lib/utils/help-icon.cpp Normal file
View File

@@ -0,0 +1,19 @@
#include "help-icon.hpp"
#include "ui-helpers.hpp"
namespace advss {
HelpIcon::HelpIcon(const QString &tooltip, QWidget *parent) : QLabel(parent)
{
auto path = GetThemeTypeName() == "Light"
? ":/res/images/help.svg"
: ":/res/images/help_light.svg";
QIcon icon(path);
QPixmap pixmap = icon.pixmap(QSize(16, 16));
setPixmap(pixmap);
if (!tooltip.isEmpty()) {
setToolTip(tooltip);
}
}
} // namespace advss

15
lib/utils/help-icon.hpp Normal file
View File

@@ -0,0 +1,15 @@
#pragma once
#include "export-symbol-helper.hpp"
#include <QLabel>
namespace advss {
class ADVSS_EXPORT HelpIcon : public QLabel {
Q_OBJECT
public:
HelpIcon(const QString &tooltip = "", QWidget *parent = nullptr);
};
} // namespace advss

View File

@@ -81,6 +81,7 @@ public:
"AdvSceneSwitcher.item.nameNotAvailable", "AdvSceneSwitcher.item.nameNotAvailable",
std::string_view configureTooltip = "", QWidget *parent = 0); std::string_view configureTooltip = "", QWidget *parent = 0);
virtual ~ItemSelection() = default; virtual ~ItemSelection() = default;
Item *GetCurrentItem();
void SetItem(const std::string &); void SetItem(const std::string &);
void ShowRenameContextMenu(bool value); void ShowRenameContextMenu(bool value);
@@ -99,8 +100,6 @@ signals:
void ItemRenamed(const QString &oldName, const QString &name); void ItemRenamed(const QString &oldName, const QString &name);
private: private:
Item *GetCurrentItem();
FilterComboBox *_selection; FilterComboBox *_selection;
QPushButton *_modify; QPushButton *_modify;
CreateItemFunc _create; CreateItemFunc _create;

77
lib/utils/list-editor.cpp Normal file
View File

@@ -0,0 +1,77 @@
#include "list-editor.hpp"
#include "ui-helpers.hpp"
namespace advss {
ListEditor::ListEditor(QWidget *parent, bool reorder)
: QWidget(parent),
_list(new QListWidget()),
_add(new QPushButton()),
_remove(new QPushButton()),
_up(new QPushButton()),
_down(new QPushButton()),
_controlsLayout(new QHBoxLayout()),
_mainLayout(new QVBoxLayout())
{
_add->setMaximumWidth(22);
_add->setProperty("themeID",
QVariant(QString::fromUtf8("addIconSmall")));
_add->setFlat(true);
_remove->setMaximumWidth(22);
_remove->setProperty("themeID",
QVariant(QString::fromUtf8("removeIconSmall")));
_remove->setFlat(true);
_up->setMaximumWidth(22);
_up->setProperty("themeID",
QVariant(QString::fromUtf8("upArrowIconSmall")));
_up->setFlat(true);
_down->setMaximumWidth(22);
_down->setProperty("themeID",
QVariant(QString::fromUtf8("downArrowIconSmall")));
_down->setFlat(true);
QWidget::connect(_add, SIGNAL(clicked()), this, SLOT(Add()));
QWidget::connect(_remove, SIGNAL(clicked()), this, SLOT(Remove()));
QWidget::connect(_up, SIGNAL(clicked()), this, SLOT(Up()));
QWidget::connect(_down, SIGNAL(clicked()), this, SLOT(Down()));
QWidget::connect(_list, SIGNAL(itemDoubleClicked(QListWidgetItem *)),
this, SLOT(Clicked(QListWidgetItem *)));
_controlsLayout->setContentsMargins(0, 0, 0, 0);
_controlsLayout->addWidget(_add);
_controlsLayout->addWidget(_remove);
if (reorder) {
auto line = new QFrame();
line->setFrameShape(QFrame::VLine);
line->setFrameShadow(QFrame::Sunken);
_controlsLayout->addWidget(line);
_controlsLayout->addWidget(_up);
_controlsLayout->addWidget(_down);
}
_controlsLayout->addStretch();
_mainLayout->setContentsMargins(0, 0, 0, 0);
_mainLayout->addWidget(_list);
_mainLayout->addLayout(_controlsLayout);
setLayout(_mainLayout);
}
void ListEditor::showEvent(QShowEvent *e)
{
QWidget::showEvent(e);
// This is necessary as the list viewport might not be updated yet while
// the list was hidden.
// Thus, previous calls to UpdateListSize() might not have resized the
// widget correctly, for example due to not regarding the horizontal
// scrollbar yet.
UpdateListSize();
}
void ListEditor::UpdateListSize()
{
SetHeightToContentHeight(_list);
adjustSize();
updateGeometry();
}
} // namespace advss

38
lib/utils/list-editor.hpp Normal file
View File

@@ -0,0 +1,38 @@
#pragma once
#include "export-symbol-helper.hpp"
#include <QPushButton>
#include <QListWidget>
#include <QLayout>
namespace advss {
class ADVSS_EXPORT ListEditor : public QWidget {
Q_OBJECT
public:
ListEditor(QWidget *parent = nullptr, bool reorder = true);
protected:
void showEvent(QShowEvent *);
private slots:
virtual void Add() = 0;
virtual void Remove() = 0;
virtual void Up(){};
virtual void Down(){};
virtual void Clicked(QListWidgetItem *) {}
protected:
void UpdateListSize();
QListWidget *_list;
QPushButton *_add;
QPushButton *_remove;
QPushButton *_up;
QPushButton *_down;
QHBoxLayout *_controlsLayout;
QVBoxLayout *_mainLayout;
};
} // namespace advss

View File

@@ -81,9 +81,13 @@ void ResourceTable::SetHelpVisible(bool visible) const
void ResourceTable::HighlightAddButton(bool enable) void ResourceTable::HighlightAddButton(bool enable)
{ {
_add->disconnect(_highlightConnection); if (_highlightConnection) {
_highlightConnection->deleteLater();
_highlightConnection = nullptr;
}
if (enable && HighlightUIElementsEnabled()) { if (enable && HighlightUIElementsEnabled()) {
_highlightConnection = PulseWidget(_add, QColor(Qt::green)); _highlightConnection = HighlightWidget(_add, QColor(Qt::green));
} }
} }

View File

@@ -37,7 +37,7 @@ private:
QPushButton *_remove; QPushButton *_remove;
QLabel *_help; QLabel *_help;
QMetaObject::Connection _highlightConnection; QObject *_highlightConnection = nullptr;
}; };
EXPORT void AddItemTableRow(QTableWidget *table, const QStringList &cells); EXPORT void AddItemTableRow(QTableWidget *table, const QStringList &cells);

View File

@@ -8,6 +8,7 @@
#include <obs-frontend-api.h> #include <obs-frontend-api.h>
#include <QAction> #include <QAction>
#include <QMainWindow> #include <QMainWindow>
#include <QPalette>
#include <QToolBar> #include <QToolBar>
namespace advss { namespace advss {
@@ -15,6 +16,50 @@ namespace advss {
void OpenSettingsWindow(); void OpenSettingsWindow();
StatusDock *dock = nullptr; StatusDock *dock = nullptr;
static QString colorToString(const QColor &color)
{
return QString("rgba(") + QString::number(color.red()) + "," +
QString::number(color.green()) + "," +
QString::number(color.blue()) + "," +
QString::number(color.alpha()) + ")";
}
static QString getDefaultBackgroundColorString()
{
static QString defaultColorString;
static bool cacheReady = false;
if (cacheReady) {
return defaultColorString;
}
QWidget tempWidget;
const auto defaultColor =
tempWidget.palette().brush(QPalette::Window).color();
defaultColorString = colorToString(defaultColor);
cacheReady = true;
return defaultColorString;
}
static QString getDefaultTextColorString()
{
static QString defaultColorString;
static bool cacheReady = false;
if (cacheReady) {
return defaultColorString;
}
QLabel tempWidget;
const auto defaultColor =
tempWidget.palette().brush(QPalette::Text).color();
defaultColorString = colorToString(defaultColor);
cacheReady = true;
return defaultColorString;
}
StatusControl::StatusControl(QWidget *parent, bool noLayout) StatusControl::StatusControl(QWidget *parent, bool noLayout)
: QWidget(parent), : QWidget(parent),
_button(new QPushButton("-", this)), _button(new QPushButton("-", this)),
@@ -28,30 +73,22 @@ StatusControl::StatusControl(QWidget *parent, bool noLayout)
_statusPrefix->setWordWrap(true); _statusPrefix->setWordWrap(true);
_statusPrefix->setSizePolicy(QSizePolicy::Expanding, _statusPrefix->setSizePolicy(QSizePolicy::Expanding,
QSizePolicy::Expanding); QSizePolicy::Expanding);
_status->setStyleSheet("QLabel{ \
border-style: outset; \
border-width: 2px; \
border-radius: 7px; \
border-color: rgb(0,0,0,0) \
}");
_status->setSizePolicy(QSizePolicy::Maximum,
QSizePolicy::MinimumExpanding);
QWidget::connect(_button, SIGNAL(clicked()), this, QWidget::connect(_button, SIGNAL(clicked()), this,
SLOT(ButtonClicked())); SLOT(ButtonClicked()));
if (!noLayout) { if (!noLayout) {
QHBoxLayout *statusLayout = new QHBoxLayout();
statusLayout->addWidget(_statusPrefix);
statusLayout->addStretch();
statusLayout->addWidget(_status);
statusLayout->setStretch(0, 10);
_buttonLayout->setContentsMargins(0, 0, 0, 0); _buttonLayout->setContentsMargins(0, 0, 0, 0);
_buttonLayout->addWidget(_button); _buttonLayout->addWidget(_button);
QVBoxLayout *layout = new QVBoxLayout(); QVBoxLayout *layout = new QVBoxLayout();
layout->addLayout(statusLayout); _statusPrefix->setAlignment(Qt::AlignCenter);
_status->setAlignment(Qt::AlignCenter);
layout->addWidget(_statusPrefix);
layout->addWidget(_status);
layout->addLayout(_buttonLayout); layout->addLayout(_buttonLayout);
setLayout(layout); setLayout(layout);
} else {
_status->setSizePolicy(QSizePolicy::Maximum,
QSizePolicy::MinimumExpanding);
} }
if (PluginIsRunning()) { if (PluginIsRunning()) {
@@ -94,7 +131,8 @@ void StatusControl::SetStarted()
_button->setText( _button->setText(
obs_module_text("AdvSceneSwitcher.generalTab.status.stop")); obs_module_text("AdvSceneSwitcher.generalTab.status.stop"));
_status->setText(obs_module_text("AdvSceneSwitcher.status.active")); _status->setText(obs_module_text("AdvSceneSwitcher.status.active"));
_status->disconnect(_pulse); _pulse->deleteLater();
SetStatusStyleSheet(false);
_setToStopped = false; _setToStopped = false;
} }
@@ -103,13 +141,31 @@ void StatusControl::SetStopped()
_button->setText( _button->setText(
obs_module_text("AdvSceneSwitcher.generalTab.status.start")); obs_module_text("AdvSceneSwitcher.generalTab.status.start"));
_status->setText(obs_module_text("AdvSceneSwitcher.status.inactive")); _status->setText(obs_module_text("AdvSceneSwitcher.status.inactive"));
SetStatusStyleSheet(true);
if (HighlightUIElementsEnabled()) { if (HighlightUIElementsEnabled()) {
_pulse = PulseWidget(_status, QColor(Qt::red), _pulse = HighlightWidget(_status, QColor(Qt::red),
QColor(0, 0, 0, 0)); QColor(0, 0, 0, 0));
} }
_setToStopped = true; _setToStopped = true;
} }
void StatusControl::SetStatusStyleSheet(bool stopped) const
{
auto style = QString("QLabel{ "
"background-color: ");
if (stopped) {
style += getDefaultBackgroundColorString() + "; ";
} else {
style += "transparent; ";
}
style += "border-style: outset; "
"border-width: 2px; "
"border-radius: 7px; "
"border-color: " +
getDefaultTextColorString() + "; }";
_status->setStyleSheet(style);
}
StatusDock::StatusDock(QWidget *parent) : OBSDock(parent) StatusDock::StatusDock(QWidget *parent) : OBSDock(parent)
{ {
setWindowTitle(obs_module_text("AdvSceneSwitcher.windowTitle")); setWindowTitle(obs_module_text("AdvSceneSwitcher.windowTitle"));

View File

@@ -26,13 +26,14 @@ private slots:
private: private:
void SetStopped(); void SetStopped();
void SetStarted(); void SetStarted();
void SetStatusStyleSheet(bool stopped) const;
QPushButton *_button; QPushButton *_button;
QHBoxLayout *_buttonLayout; QHBoxLayout *_buttonLayout;
QLabel *_status; QLabel *_status;
QLabel *_statusPrefix; QLabel *_statusPrefix;
QTimer _timer; QTimer _timer;
QMetaObject::Connection _pulse; QObject *_pulse = nullptr;
bool _setToStopped = true; bool _setToStopped = true;
}; };

View File

@@ -49,60 +49,12 @@ void StringList::ResolveVariables()
StringListEdit::StringListEdit(QWidget *parent, const QString &addString, StringListEdit::StringListEdit(QWidget *parent, const QString &addString,
const QString &addStringDescription, const QString &addStringDescription,
int maxStringSize, bool allowEmtpy) int maxStringSize, bool allowEmtpy)
: QWidget(parent), : ListEditor(parent),
_list(new QListWidget()),
_add(new QPushButton()),
_remove(new QPushButton()),
_up(new QPushButton()),
_down(new QPushButton()),
_addString(addString), _addString(addString),
_addStringDescription(addStringDescription), _addStringDescription(addStringDescription),
_maxStringSize(maxStringSize), _maxStringSize(maxStringSize),
_allowEmpty(allowEmtpy) _allowEmpty(allowEmtpy)
{ {
_add->setMaximumWidth(22);
_add->setProperty("themeID",
QVariant(QString::fromUtf8("addIconSmall")));
_add->setFlat(true);
_remove->setMaximumWidth(22);
_remove->setProperty("themeID",
QVariant(QString::fromUtf8("removeIconSmall")));
_remove->setFlat(true);
_up->setMaximumWidth(22);
_up->setProperty("themeID",
QVariant(QString::fromUtf8("upArrowIconSmall")));
_up->setFlat(true);
_down->setMaximumWidth(22);
_down->setProperty("themeID",
QVariant(QString::fromUtf8("downArrowIconSmall")));
_down->setFlat(true);
QWidget::connect(_add, SIGNAL(clicked()), this, SLOT(Add()));
QWidget::connect(_remove, SIGNAL(clicked()), this, SLOT(Remove()));
QWidget::connect(_up, SIGNAL(clicked()), this, SLOT(Up()));
QWidget::connect(_down, SIGNAL(clicked()), this, SLOT(Down()));
QWidget::connect(_list, SIGNAL(itemDoubleClicked(QListWidgetItem *)),
this, SLOT(Clicked(QListWidgetItem *)));
auto controlLayout = new QHBoxLayout;
controlLayout->setContentsMargins(0, 0, 0, 0);
controlLayout->addWidget(_add);
controlLayout->addWidget(_remove);
QFrame *line = new QFrame();
line->setFrameShape(QFrame::VLine);
line->setFrameShadow(QFrame::Sunken);
controlLayout->addWidget(line);
controlLayout->addWidget(_up);
controlLayout->addWidget(_down);
controlLayout->addStretch();
auto mainLayout = new QVBoxLayout;
mainLayout->setContentsMargins(0, 0, 0, 0);
mainLayout->addWidget(_list);
mainLayout->addLayout(controlLayout);
setLayout(mainLayout);
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
} }
void StringListEdit::SetStringList(const StringList &list) void StringListEdit::SetStringList(const StringList &list)
@@ -115,7 +67,7 @@ void StringListEdit::SetStringList(const StringList &list)
_list); _list);
item->setData(Qt::UserRole, string); item->setData(Qt::UserRole, string);
} }
SetListSize(); UpdateListSize();
} }
void StringListEdit::SetMaxStringSize(int size) void StringListEdit::SetMaxStringSize(int size)
@@ -123,17 +75,6 @@ void StringListEdit::SetMaxStringSize(int size)
_maxStringSize = size; _maxStringSize = size;
} }
void StringListEdit::showEvent(QShowEvent *e)
{
QWidget::showEvent(e);
// This is necessary as the list viewport might not be updated yet
// while the list was hidden.
// Thus, previous calls to SetListSize() might not have resized the
// widget correctly, for example due to not regarding the horizontal
// scrollbar yet.
SetListSize();
}
void StringListEdit::Add() void StringListEdit::Add()
{ {
std::string name; std::string name;
@@ -153,7 +94,7 @@ void StringListEdit::Add()
_stringList << string; _stringList << string;
// Delay resizing to make sure the list viewport was already updated // Delay resizing to make sure the list viewport was already updated
QTimer::singleShot(0, this, [this]() { SetListSize(); }); QTimer::singleShot(0, this, [this]() { UpdateListSize(); });
StringListChanged(_stringList); StringListChanged(_stringList);
} }
@@ -173,7 +114,7 @@ void StringListEdit::Remove()
delete item; delete item;
// Delay resizing to make sure the list viewport was already updated // Delay resizing to make sure the list viewport was already updated
QTimer::singleShot(0, this, [this]() { SetListSize(); }); QTimer::singleShot(0, this, [this]() { UpdateListSize(); });
StringListChanged(_stringList); StringListChanged(_stringList);
} }
@@ -222,16 +163,9 @@ void StringListEdit::Clicked(QListWidgetItem *item)
_stringList[idx] = string; _stringList[idx] = string;
// Delay resizing to make sure the list viewport was already updated // Delay resizing to make sure the list viewport was already updated
QTimer::singleShot(0, this, [this]() { SetListSize(); }); QTimer::singleShot(0, this, [this]() { UpdateListSize(); });
StringListChanged(_stringList); StringListChanged(_stringList);
} }
void StringListEdit::SetListSize()
{
SetHeightToContentHeight(_list);
adjustSize();
updateGeometry();
}
} // namespace advss } // namespace advss

View File

@@ -1,27 +1,25 @@
#pragma once #pragma once
#include "variable-string.hpp" #include "export-symbol-helper.hpp"
#include "list-editor.hpp"
#include "obs-module-helper.hpp" #include "obs-module-helper.hpp"
#include "variable-string.hpp"
#include <obs-data.h> #include <obs-data.h>
#include <QPushButton>
#include <QListWidget>
#include <QStringList>
namespace advss { namespace advss {
class StringList : public QList<StringVariable> { class StringList : public QList<StringVariable> {
public: public:
bool Save(obs_data_t *obj, const char *name, EXPORT bool Save(obs_data_t *obj, const char *name,
const char *elementName = "string") const; const char *elementName = "string") const;
bool Load(obs_data_t *obj, const char *name, EXPORT bool Load(obs_data_t *obj, const char *name,
const char *elementName = "string"); const char *elementName = "string");
void ResolveVariables(); EXPORT void ResolveVariables();
friend class StringListEdit; friend class StringListEdit;
}; };
class StringListEdit : public QWidget { class ADVSS_EXPORT StringListEdit final : public ListEditor {
Q_OBJECT Q_OBJECT
public: public:
@@ -31,9 +29,6 @@ public:
void SetStringList(const StringList &); void SetStringList(const StringList &);
void SetMaxStringSize(int); void SetMaxStringSize(int);
protected:
void showEvent(QShowEvent *);
private slots: private slots:
void Add(); void Add();
void Remove(); void Remove();
@@ -44,16 +39,8 @@ signals:
void StringListChanged(const StringList &); void StringListChanged(const StringList &);
private: private:
void SetListSize();
StringList _stringList; StringList _stringList;
QListWidget *_list;
QPushButton *_add;
QPushButton *_remove;
QPushButton *_up;
QPushButton *_down;
QString _addString; QString _addString;
QString _addStringDescription; QString _addStringDescription;
int _maxStringSize = 170; int _maxStringSize = 170;

View File

@@ -5,6 +5,13 @@
namespace advss { namespace advss {
// Helper used in macro segment edit widgets
#define GUARD_LOADING_AND_LOCK() \
if (_loading || !_entryData) { \
return; \
} \
auto lock = LockContext();
[[nodiscard]] EXPORT std::mutex *GetMutex(); [[nodiscard]] EXPORT std::mutex *GetMutex();
[[nodiscard]] EXPORT std::lock_guard<std::mutex> LockContext(); [[nodiscard]] EXPORT std::lock_guard<std::mutex> LockContext();
[[nodiscard]] EXPORT std::unique_lock<std::mutex> *GetLoopLock(); [[nodiscard]] EXPORT std::unique_lock<std::mutex> *GetLoopLock();

View File

@@ -161,7 +161,7 @@ void SetTabOrder(QTabWidget *tabWidget)
void SetCurrentTab(QTabWidget *tabWidget) void SetCurrentTab(QTabWidget *tabWidget)
{ {
if (lastOpenedTab >= 0) { if (lastOpenedTab >= 0 && tabWidget->isTabVisible(lastOpenedTab)) {
tabWidget->setCurrentIndex(lastOpenedTab); tabWidget->setCurrentIndex(lastOpenedTab);
} }
} }

View File

@@ -13,8 +13,8 @@
namespace advss { namespace advss {
QMetaObject::Connection PulseWidget(QWidget *widget, QColor startColor, QObject *HighlightWidget(QWidget *widget, QColor startColor, QColor endColor,
QColor endColor, bool once) bool once)
{ {
QGraphicsColorizeEffect *effect = new QGraphicsColorizeEffect(widget); QGraphicsColorizeEffect *effect = new QGraphicsColorizeEffect(widget);
widget->setGraphicsEffect(effect); widget->setGraphicsEffect(effect);
@@ -24,33 +24,22 @@ QMetaObject::Connection PulseWidget(QWidget *widget, QColor startColor,
animation->setEndValue(endColor); animation->setEndValue(endColor);
animation->setDuration(1000); animation->setDuration(1000);
QMetaObject::Connection con; // Clean up the effect when the animation is deleted
QWidget::connect(animation, &QPropertyAnimation::destroyed, [widget]() {
if (widget) {
widget->setGraphicsEffect(nullptr);
}
});
if (once) { if (once) {
auto widgetPtr = widget;
con = QWidget::connect(
animation, &QPropertyAnimation::finished,
[widgetPtr]() {
if (widgetPtr) {
widgetPtr->setGraphicsEffect(nullptr);
}
});
animation->start(QPropertyAnimation::DeleteWhenStopped); animation->start(QPropertyAnimation::DeleteWhenStopped);
} else { return animation;
auto widgetPtr = widget;
con = QWidget::connect(
animation, &QPropertyAnimation::finished,
[animation, widgetPtr]() {
QTimer *timer = new QTimer(widgetPtr);
QWidget::connect(timer, &QTimer::timeout,
[animation] {
animation->start();
});
timer->setSingleShot(true);
timer->start(1000);
});
animation->start();
} }
return con;
QWidget::connect(animation, &QPropertyAnimation::finished,
[animation]() { animation->start(); });
animation->start();
return animation;
} }
static int getHorizontalScrollBarHeight(QListWidget *list) static int getHorizontalScrollBarHeight(QListWidget *list)
@@ -166,4 +155,9 @@ std::string GetThemeTypeName()
#endif #endif
} }
void QeueUITask(void (*task)(void *param), void *param)
{
obs_queue_task(OBS_TASK_UI, task, param, false);
}
} // namespace advss } // namespace advss

View File

@@ -12,9 +12,11 @@
namespace advss { namespace advss {
EXPORT QMetaObject::Connection PulseWidget(QWidget *widget, QColor startColor, // Returns QObject* to QPropertyAnimation object
QColor endColor = QColor(0, 0, 0, 0), // Delete it to stop the animation
bool once = false); EXPORT QObject *HighlightWidget(QWidget *widget, QColor startColor,
QColor endColor = QColor(0, 0, 0, 0),
bool once = false);
EXPORT void SetHeightToContentHeight(QListWidget *list); EXPORT void SetHeightToContentHeight(QListWidget *list);
EXPORT void SetButtonIcon(QPushButton *button, const char *path); EXPORT void SetButtonIcon(QPushButton *button, const char *path);
@@ -29,4 +31,6 @@ EXPORT void DisplayTrayMessage(const QString &title, const QString &msg,
EXPORT std::string GetThemeTypeName(); EXPORT std::string GetThemeTypeName();
void QeueUITask(void (*task)(void *param), void *param);
} // namespace advss } // namespace advss

View File

@@ -76,15 +76,15 @@ std::string ToString(double value)
} }
void listAddClicked(QListWidget *list, QWidget *newWidget, void listAddClicked(QListWidget *list, QWidget *newWidget,
QPushButton *addButton, QPushButton *addButton, QObject *addHighlight)
QMetaObject::Connection *addHighlight)
{ {
if (!list || !newWidget) { if (!list || !newWidget) {
return; return;
} }
if (addButton && addHighlight) { if (addHighlight) {
addButton->disconnect(*addHighlight); addHighlight->deleteLater();
addHighlight = nullptr;
} }
QListWidgetItem *item; QListWidgetItem *item;

View File

@@ -24,7 +24,7 @@ std::string ToString(double value);
void listAddClicked(QListWidget *list, QWidget *newWidget, void listAddClicked(QListWidget *list, QWidget *newWidget,
QPushButton *addButton = nullptr, QPushButton *addButton = nullptr,
QMetaObject::Connection *addHighlight = nullptr); QObject *addHighlight = nullptr);
bool listMoveUp(QListWidget *list); bool listMoveUp(QListWidget *list);
bool listMoveDown(QListWidget *list); bool listMoveDown(QListWidget *list);

View File

@@ -154,6 +154,15 @@ static void updateVariableStatus(QTableWidget *table)
UpdateItemTableRow(table, row, UpdateItemTableRow(table, row,
getCellLabels(variable.get(), false)); getCellLabels(variable.get(), false));
// Special tooltip handling for the "last used" cell
const auto lastUsedItem = table->item(row, 4);
if (!lastUsedItem) {
continue;
}
const auto lastUsedTooltip =
formatLastChangedTooltip(variable.get());
lastUsedItem->setToolTip(lastUsedTooltip);
} }
} }
@@ -264,14 +273,14 @@ static void setupTab(QTabWidget *tab)
} }
QWidget::connect(VariableSignalManager::Instance(), QWidget::connect(VariableSignalManager::Instance(),
&VariableSignalManager::Rename, &VariableSignalManager::Rename, tab,
[](const QString &oldName, const QString &newName) { [](const QString &oldName, const QString &newName) {
RenameItemTableRow(tabWidget->Table(), oldName, RenameItemTableRow(tabWidget->Table(), oldName,
newName); newName);
}); });
QWidget::connect( QWidget::connect(
VariableSignalManager::Instance(), &VariableSignalManager::Add, VariableSignalManager::Instance(), &VariableSignalManager::Add,
[tab](const QString &name) { tab, [tab](const QString &name) {
AddItemTableRow( AddItemTableRow(
tabWidget->Table(), tabWidget->Table(),
getCellLabels(GetVariableByQString(name))); getCellLabels(GetVariableByQString(name)));
@@ -280,7 +289,7 @@ static void setupTab(QTabWidget *tab)
setTabVisible(tab, true); setTabVisible(tab, true);
}); });
QWidget::connect(VariableSignalManager::Instance(), QWidget::connect(VariableSignalManager::Instance(),
&VariableSignalManager::Remove, &VariableSignalManager::Remove, tab,
[](const QString &name) { [](const QString &name) {
RemoveItemTableRow(tabWidget->Table(), name); RemoveItemTableRow(tabWidget->Table(), name);
if (tabWidget->Table()->rowCount() == 0) { if (tabWidget->Table()->rowCount() == 0) {

View File

@@ -1,6 +1,7 @@
#include "variable.hpp" #include "variable.hpp"
#include "math-helpers.hpp" #include "math-helpers.hpp"
#include "obs-module-helper.hpp" #include "obs-module-helper.hpp"
#include "ui-helpers.hpp"
#include "utility.hpp" #include "utility.hpp"
#include <QGridLayout> #include <QGridLayout>
@@ -267,6 +268,53 @@ void VariableSelection::SetVariable(const std::weak_ptr<Variable> &variable_)
} }
} }
VariableSelectionDialog::VariableSelectionDialog(QWidget *parent)
: QDialog(parent),
_variableSelection(new VariableSelection(this))
{
setModal(true);
setWindowModality(Qt::WindowModality::ApplicationModal);
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
setMinimumWidth(350);
setMinimumHeight(70);
auto buttonbox = new QDialogButtonBox(QDialogButtonBox::Ok |
QDialogButtonBox::Cancel);
buttonbox->setCenterButtons(true);
connect(buttonbox, &QDialogButtonBox::accepted, this, &QDialog::accept);
connect(buttonbox, &QDialogButtonBox::rejected, this, &QDialog::reject);
auto selectionLayout = new QHBoxLayout();
selectionLayout->addWidget(new QLabel(
obs_module_text("AdvSceneSwitcher.variable.selectionDialog")));
selectionLayout->addWidget(_variableSelection);
selectionLayout->addStretch();
auto layout = new QVBoxLayout();
layout->addLayout(selectionLayout);
layout->addWidget(buttonbox);
setLayout(layout);
}
QWidget *GetSettingsWindow();
bool VariableSelectionDialog::AskForVariable(QWidget *parent,
std::string &varName)
{
VariableSelectionDialog dialog(GetSettingsWindow());
dialog.setWindowTitle(obs_module_text("AdvSceneSwitcher.windowTitle"));
if (dialog.exec() != DialogCode::Accepted) {
return false;
}
auto item = dialog._variableSelection->GetCurrentItem();
if (!item) {
return false;
}
varName = item->Name();
return true;
}
VariableSignalManager::VariableSignalManager(QObject *parent) : QObject(parent) VariableSignalManager::VariableSignalManager(QObject *parent) : QObject(parent)
{ {
} }
@@ -375,11 +423,23 @@ void LoadVariables(obs_data_t *obj)
obs_data_array_release(variablesArray); obs_data_array_release(variablesArray);
} }
static void signalImportedVariables(void *varsPtr)
{
auto vars = std::unique_ptr<std::vector<std::shared_ptr<Item>>>(
static_cast<std::vector<std::shared_ptr<Item>> *>(varsPtr));
for (const auto &var : *vars) {
VariableSignalManager::Instance()->Add(
QString::fromStdString(var->Name()));
}
}
void ImportVariables(obs_data_t *data) void ImportVariables(obs_data_t *data)
{ {
obs_data_array_t *array = obs_data_get_array(data, "variables"); obs_data_array_t *array = obs_data_get_array(data, "variables");
size_t count = obs_data_array_count(array); size_t count = obs_data_array_count(array);
auto importedVars = new std::vector<std::shared_ptr<Item>>;
for (size_t i = 0; i < count; i++) { for (size_t i = 0; i < count; i++) {
obs_data_t *arrayElement = obs_data_array_item(array, i); obs_data_t *arrayElement = obs_data_array_item(array, i);
auto var = Variable::Create(); auto var = Variable::Create();
@@ -391,9 +451,12 @@ void ImportVariables(obs_data_t *data)
} }
GetVariables().emplace_back(var); GetVariables().emplace_back(var);
importedVars->emplace_back(var);
} }
obs_data_array_release(array); obs_data_array_release(array);
QeueUITask(signalImportedVariables, importedVars);
} }
std::chrono::high_resolution_clock::time_point GetLastVariableChangeTime() std::chrono::high_resolution_clock::time_point GetLastVariableChangeTime()

View File

@@ -82,6 +82,17 @@ public:
void SetVariable(const std::weak_ptr<Variable> &); void SetVariable(const std::weak_ptr<Variable> &);
}; };
class VariableSelectionDialog : public QDialog {
Q_OBJECT
public:
VariableSelectionDialog(QWidget *parent);
static bool AskForVariable(QWidget *parent, std::string &variableName);
private:
VariableSelection *_variableSelection;
};
class ADVSS_EXPORT VariableSignalManager : public QObject { class ADVSS_EXPORT VariableSignalManager : public QObject {
Q_OBJECT Q_OBJECT
public: public:

View File

@@ -168,8 +168,6 @@ target_sources(
utils/source-settings-helpers.hpp utils/source-settings-helpers.hpp
utils/source-setting.cpp utils/source-setting.cpp
utils/source-setting.hpp utils/source-setting.hpp
utils/string-list.cpp
utils/string-list.hpp
utils/striped-frame.cpp utils/striped-frame.cpp
utils/striped-frame.hpp utils/striped-frame.hpp
utils/text-helpers.cpp utils/text-helpers.cpp

View File

@@ -1,6 +1,5 @@
#include "macro-action-run.hpp" #include "macro-action-run.hpp"
#include "layout-helpers.hpp" #include "layout-helpers.hpp"
#include "ui-helpers.hpp"
#include <QProcess> #include <QProcess>
#include <QDesktopServices> #include <QDesktopServices>
@@ -130,16 +129,10 @@ MacroActionRunEdit::MacroActionRunEdit(
_waitLayout(new QHBoxLayout()), _waitLayout(new QHBoxLayout()),
_wait(new QCheckBox()), _wait(new QCheckBox()),
_timeout(new DurationSelection(this, true, 0.1)), _timeout(new DurationSelection(this, true, 0.1)),
_waitHelp(new QLabel()) _waitHelp(new HelpIcon(obs_module_text(
"AdvSceneSwitcher.action.run.wait.help.tooltip")))
{ {
QString helpIconPath = GetThemeTypeName() == "Light"
? ":/res/images/help.svg"
: ":/res/images/help_light.svg";
QIcon helpIcon(helpIconPath);
_waitHelp->setPixmap(helpIcon.pixmap(QSize(16, 16)));
_waitHelp->hide(); _waitHelp->hide();
_waitHelp->setToolTip(obs_module_text(
"AdvSceneSwitcher.action.run.wait.help.tooltip"));
QWidget::connect(_procConfig, QWidget::connect(_procConfig,
SIGNAL(ConfigChanged(const ProcessConfig &)), this, SIGNAL(ConfigChanged(const ProcessConfig &)), this,

View File

@@ -1,5 +1,6 @@
#pragma once #pragma once
#include "macro-action-edit.hpp" #include "macro-action-edit.hpp"
#include "help-icon.hpp"
#include "process-config.hpp" #include "process-config.hpp"
#include "duration-control.hpp" #include "duration-control.hpp"
@@ -60,7 +61,7 @@ private:
QHBoxLayout *_waitLayout; QHBoxLayout *_waitLayout;
QCheckBox *_wait; QCheckBox *_wait;
DurationSelection *_timeout; DurationSelection *_timeout;
QLabel *_waitHelp; HelpIcon *_waitHelp;
std::shared_ptr<MacroActionRun> _entryData; std::shared_ptr<MacroActionRun> _entryData;
bool _loading = true; bool _loading = true;

View File

@@ -1,8 +1,8 @@
#include "macro-action-window.hpp" #include "macro-action-window.hpp"
#include "help-icon.hpp"
#include "layout-helpers.hpp" #include "layout-helpers.hpp"
#include "platform-funcs.hpp" #include "platform-funcs.hpp"
#include "selection-helpers.hpp" #include "selection-helpers.hpp"
#include "ui-helpers.hpp"
namespace advss { namespace advss {
@@ -177,14 +177,7 @@ MacroActionWindowEdit::MacroActionWindowEdit(
"AdvSceneSwitcher.action.window.type.setFocusWindow.limitation")); "AdvSceneSwitcher.action.window.type.setFocusWindow.limitation"));
_infoLayout->addWidget(focusLimitation); _infoLayout->addWidget(focusLimitation);
const QString path = GetThemeTypeName() == "Light" auto focusLimitationDetails = new HelpIcon(obs_module_text(
? ":/res/images/help.svg"
: ":/res/images/help_light.svg";
const QIcon icon(path);
const QPixmap pixmap = icon.pixmap(QSize(16, 16));
auto focusLimitationDetails = new QLabel();
focusLimitationDetails->setPixmap(pixmap);
focusLimitationDetails->setToolTip(obs_module_text(
"AdvSceneSwitcher.action.window.type.setFocusWindow.limitation.details")); "AdvSceneSwitcher.action.window.type.setFocusWindow.limitation.details"));
_infoLayout->addWidget(focusLimitationDetails); _infoLayout->addWidget(focusLimitationDetails);
_infoLayout->addStretch(); _infoLayout->addStretch();

View File

@@ -1,6 +1,5 @@
#include "macro-condition-clipboard.hpp" #include "macro-condition-clipboard.hpp"
#include "layout-helpers.hpp" #include "layout-helpers.hpp"
#include "ui-helpers.hpp"
#include <QApplication> #include <QApplication>
#include <QClipboard> #include <QClipboard>
@@ -197,19 +196,11 @@ MacroConditionClipboardEdit::MacroConditionClipboardEdit(
_conditions(new QComboBox(this)), _conditions(new QComboBox(this)),
_text(new VariableTextEdit(this)), _text(new VariableTextEdit(this)),
_regex(new RegexConfigWidget(parent)), _regex(new RegexConfigWidget(parent)),
_urlInfo(new QLabel()) _urlInfo(new HelpIcon(obs_module_text(
"AdvSceneSwitcher.condition.clipboard.urlTooltip")))
{ {
populateCompareModeselection(_conditions); populateCompareModeselection(_conditions);
QString path = GetThemeTypeName() == "Light"
? ":/res/images/help.svg"
: ":/res/images/help_light.svg";
QIcon icon(path);
QPixmap pixmap = icon.pixmap(QSize(16, 16));
_urlInfo->setPixmap(pixmap);
_urlInfo->hide(); _urlInfo->hide();
_urlInfo->setToolTip(obs_module_text(
"AdvSceneSwitcher.condition.clipboard.urlTooltip"));
QWidget::connect(_conditions, SIGNAL(currentIndexChanged(int)), this, QWidget::connect(_conditions, SIGNAL(currentIndexChanged(int)), this,
SLOT(ConditionChanged(int))); SLOT(ConditionChanged(int)));

View File

@@ -1,6 +1,7 @@
#pragma once #pragma once
#include "macro-condition-edit.hpp" #include "macro-condition-edit.hpp"
#include "filter-combo-box.hpp" #include "filter-combo-box.hpp"
#include "help-icon.hpp"
#include "message-buffer.hpp" #include "message-buffer.hpp"
#include "message-dispatcher.hpp" #include "message-dispatcher.hpp"
#include "regex-config.hpp" #include "regex-config.hpp"
@@ -83,7 +84,7 @@ private:
QComboBox *_conditions; QComboBox *_conditions;
VariableTextEdit *_text; VariableTextEdit *_text;
RegexConfigWidget *_regex; RegexConfigWidget *_regex;
QLabel *_urlInfo; HelpIcon *_urlInfo;
std::shared_ptr<MacroConditionClipboard> _entryData; std::shared_ptr<MacroConditionClipboard> _entryData;
bool _loading = true; bool _loading = true;

View File

@@ -47,17 +47,19 @@ bool MacroConditionFilter::CheckConditionHelper(const OBSWeakSource &filter)
case Condition::DISABLED: case Condition::DISABLED:
ret = !obs_source_enabled(filterSource); ret = !obs_source_enabled(filterSource);
break; break;
case Condition::SETTINGS_MATCH: case Condition::SETTINGS_MATCH: {
ret = CompareSourceSettings(filter, _settings, _regex); ret = CompareSourceSettings(filter, _settings, _regex);
if (IsReferencedInVars()) { const auto settings = GetSourceSettings(filter);
SetVariableValue(GetSourceSettings(filter)); SetVariableValue(settings);
} SetTempVarValue("settings", settings);
break; break;
}
case Condition::SETTINGS_CHANGED: { case Condition::SETTINGS_CHANGED: {
std::string settings = GetSourceSettings(filter); const auto settings = GetSourceSettings(filter);
ret = !_currentSettings.empty() && settings != _currentSettings; ret = !_currentSettings.empty() && settings != _currentSettings;
_currentSettings = settings; _currentSettings = settings;
SetVariableValue(settings); SetVariableValue(settings);
SetTempVarValue("settings", settings);
break; break;
} }
case Condition::INDIVIDUAL_SETTING_MATCH: { case Condition::INDIVIDUAL_SETTING_MATCH: {
@@ -68,6 +70,7 @@ bool MacroConditionFilter::CheckConditionHelper(const OBSWeakSource &filter)
ret = _regex.Enabled() ? _regex.Matches(*value, _settings) ret = _regex.Enabled() ? _regex.Matches(*value, _settings)
: value == std::string(_settings); : value == std::string(_settings);
SetVariableValue(*value); SetVariableValue(*value);
SetTempVarValue("setting", *value);
break; break;
} }
case Condition::INDIVIDUAL_SETTING_CHANGED: { case Condition::INDIVIDUAL_SETTING_CHANGED: {
@@ -78,6 +81,7 @@ bool MacroConditionFilter::CheckConditionHelper(const OBSWeakSource &filter)
ret = _currentSettingsValue != value; ret = _currentSettingsValue != value;
_currentSettingsValue = *value; _currentSettingsValue = *value;
SetVariableValue(*value); SetVariableValue(*value);
SetTempVarValue("setting", *value);
break; break;
} }
default: default:
@@ -122,7 +126,8 @@ bool MacroConditionFilter::Load(obs_data_t *obj)
MacroCondition::Load(obj); MacroCondition::Load(obj);
_source.Load(obj); _source.Load(obj);
_filter.Load(obj, _source, "filter"); _filter.Load(obj, _source, "filter");
_condition = static_cast<Condition>(obs_data_get_int(obj, "condition")); SetCondition(
static_cast<Condition>(obs_data_get_int(obj, "condition")));
_settings.Load(obj, "settings"); _settings.Load(obj, "settings");
_regex.Load(obj); _regex.Load(obj);
// TOOD: remove in future version // TOOD: remove in future version
@@ -142,6 +147,37 @@ std::string MacroConditionFilter::GetShortDesc() const
return ""; return "";
} }
void MacroConditionFilter::SetCondition(Condition cond)
{
_condition = cond;
SetupTempVars();
}
void MacroConditionFilter::SetupTempVars()
{
MacroCondition::SetupTempVars();
switch (_condition) {
case Condition::ENABLED:
break;
case Condition::DISABLED:
break;
case Condition::SETTINGS_MATCH:
case Condition::SETTINGS_CHANGED:
AddTempvar("settings",
obs_module_text(
"AdvSceneSwitcher.tempVar.filter.settings"));
break;
case Condition::INDIVIDUAL_SETTING_MATCH:
case Condition::INDIVIDUAL_SETTING_CHANGED:
AddTempvar("setting",
obs_module_text(
"AdvSceneSwitcher.tempVar.filter.setting"));
break;
default:
break;
}
}
static inline void populateConditionSelection(QComboBox *list) static inline void populateConditionSelection(QComboBox *list)
{ {
for (const auto &[_, name] : filterConditionTypes) { for (const auto &[_, name] : filterConditionTypes) {
@@ -263,8 +299,8 @@ void MacroConditionFilterEdit::ConditionChanged(int index)
} }
auto lock = LockContext(); auto lock = LockContext();
_entryData->_condition = _entryData->SetCondition(
static_cast<MacroConditionFilter::Condition>(index); static_cast<MacroConditionFilter::Condition>(index));
SetWidgetVisibility(); SetWidgetVisibility();
} }
@@ -283,7 +319,7 @@ void MacroConditionFilterEdit::GetSettingsClicked()
} }
QString value; QString value;
if (_entryData->_condition == if (_entryData->GetCondition() ==
MacroConditionFilter::Condition::SETTINGS_MATCH) { MacroConditionFilter::Condition::SETTINGS_MATCH) {
value = FormatJsonString(GetSourceSettings(filters.at(0))); value = FormatJsonString(GetSourceSettings(filters.at(0)));
} else { } else {
@@ -346,21 +382,22 @@ void MacroConditionFilterEdit::RefreshVariableSourceSelectionValue()
void MacroConditionFilterEdit::SetWidgetVisibility() void MacroConditionFilterEdit::SetWidgetVisibility()
{ {
const bool showSettingsControls = const bool showSettingsControls =
_entryData->_condition == _entryData->GetCondition() ==
MacroConditionFilter::Condition::SETTINGS_MATCH || MacroConditionFilter::Condition::SETTINGS_MATCH ||
_entryData->_condition == _entryData->GetCondition() ==
MacroConditionFilter::Condition::INDIVIDUAL_SETTING_MATCH; MacroConditionFilter::Condition::INDIVIDUAL_SETTING_MATCH;
_settings->setVisible(showSettingsControls); _settings->setVisible(showSettingsControls);
_getSettings->setVisible(showSettingsControls); _getSettings->setVisible(showSettingsControls);
_regex->setVisible(showSettingsControls); _regex->setVisible(showSettingsControls);
_settingSelection->setVisible( _settingSelection->setVisible(
_entryData->_condition == MacroConditionFilter::Condition:: _entryData->GetCondition() ==
INDIVIDUAL_SETTING_MATCH || MacroConditionFilter::Condition::INDIVIDUAL_SETTING_MATCH ||
_entryData->_condition == MacroConditionFilter::Condition:: _entryData->GetCondition() ==
INDIVIDUAL_SETTING_CHANGED); MacroConditionFilter::Condition::
INDIVIDUAL_SETTING_CHANGED);
_refreshSettingSelection->setVisible( _refreshSettingSelection->setVisible(
_entryData->_condition == MacroConditionFilter::Condition:: _entryData->GetCondition() ==
INDIVIDUAL_SETTING_MATCH && MacroConditionFilter::Condition::INDIVIDUAL_SETTING_MATCH &&
(_entryData->_source.GetType() == (_entryData->_source.GetType() ==
SourceSelection::Type::VARIABLE || SourceSelection::Type::VARIABLE ||
_entryData->_filter.GetType() == _entryData->_filter.GetType() ==
@@ -377,7 +414,8 @@ void MacroConditionFilterEdit::UpdateEntryData()
_sources->SetSource(_entryData->_source); _sources->SetSource(_entryData->_source);
_filters->SetFilter(_entryData->_source, _entryData->_filter); _filters->SetFilter(_entryData->_source, _entryData->_filter);
_conditions->setCurrentIndex(static_cast<int>(_entryData->_condition)); _conditions->setCurrentIndex(
static_cast<int>(_entryData->GetCondition()));
_settings->setPlainText(_entryData->_settings); _settings->setPlainText(_entryData->_settings);
_regex->SetRegexConfig(_entryData->_regex); _regex->SetRegexConfig(_entryData->_regex);
const auto filters = const auto filters =

View File

@@ -33,17 +33,20 @@ public:
INDIVIDUAL_SETTING_MATCH, INDIVIDUAL_SETTING_MATCH,
INDIVIDUAL_SETTING_CHANGED, INDIVIDUAL_SETTING_CHANGED,
}; };
void SetCondition(Condition);
Condition GetCondition() const { return _condition; }
SourceSelection _source; SourceSelection _source;
FilterSelection _filter; FilterSelection _filter;
Condition _condition = Condition::ENABLED;
StringVariable _settings = ""; StringVariable _settings = "";
RegexConfig _regex; RegexConfig _regex;
SourceSetting _setting; SourceSetting _setting;
private: private:
void SetupTempVars();
bool CheckConditionHelper(const OBSWeakSource &); bool CheckConditionHelper(const OBSWeakSource &);
Condition _condition = Condition::ENABLED;
std::string _currentSettings; std::string _currentSettings;
std::string _currentSettingsValue; std::string _currentSettingsValue;

View File

@@ -1,7 +1,7 @@
#include "macro-condition-folder.hpp" #include "macro-condition-folder.hpp"
#include "help-icon.hpp"
#include "macro-helpers.hpp" #include "macro-helpers.hpp"
#include "layout-helpers.hpp" #include "layout-helpers.hpp"
#include "ui-helpers.hpp"
#include <QDir> #include <QDir>
#include <QFileInfo> #include <QFileInfo>
@@ -282,16 +282,6 @@ MacroConditionFolderEdit::MacroConditionFolderEdit(
_regex(new RegexConfigWidget(this, false)), _regex(new RegexConfigWidget(this, false)),
_filter(new VariableLineEdit(this)) _filter(new VariableLineEdit(this))
{ {
QString path = GetThemeTypeName() == "Light"
? ":/res/images/help.svg"
: ":/res/images/help_light.svg";
QIcon icon(path);
QPixmap pixmap = icon.pixmap(QSize(16, 16));
auto tooltipLabel = new QLabel(this);
tooltipLabel->setPixmap(pixmap);
tooltipLabel->setToolTip(
obs_module_text("AdvSceneSwitcher.condition.folder.tooltip"));
populateConditions(_conditions); populateConditions(_conditions);
QWidget::connect(_conditions, SIGNAL(currentIndexChanged(int)), this, QWidget::connect(_conditions, SIGNAL(currentIndexChanged(int)), this,
@@ -306,6 +296,9 @@ MacroConditionFolderEdit::MacroConditionFolderEdit(
QWidget::connect(_filter, SIGNAL(editingFinished()), this, QWidget::connect(_filter, SIGNAL(editingFinished()), this,
SLOT(FilterChanged())); SLOT(FilterChanged()));
auto tooltipLabel = new HelpIcon(
obs_module_text("AdvSceneSwitcher.condition.folder.tooltip"));
const std::unordered_map<std::string, QWidget *> widgetPlaceholders = { const std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
{"{{conditions}}", _conditions}, {"{{folder}}", _folder}, {"{{conditions}}", _conditions}, {"{{folder}}", _folder},
{"{{tooltip}}", tooltipLabel}, {"{{regex}}", _regex}, {"{{tooltip}}", tooltipLabel}, {"{{regex}}", _regex},

View File

@@ -14,8 +14,8 @@ bool MacroConditionSource::_registered = MacroConditionFactory::Register(
{MacroConditionSource::Create, MacroConditionSourceEdit::Create, {MacroConditionSource::Create, MacroConditionSourceEdit::Create,
"AdvSceneSwitcher.condition.source"}); "AdvSceneSwitcher.condition.source"});
const static std::map<MacroConditionSource::Condition, std::string> static const std::map<MacroConditionSource::Condition, std::string>
sourceCnditionTypes = { sourceConditionTypes = {
{MacroConditionSource::Condition::ACTIVE, {MacroConditionSource::Condition::ACTIVE,
"AdvSceneSwitcher.condition.source.type.active"}, "AdvSceneSwitcher.condition.source.type.active"},
{MacroConditionSource::Condition::SHOWING, {MacroConditionSource::Condition::SHOWING,
@@ -28,8 +28,38 @@ const static std::map<MacroConditionSource::Condition, std::string>
"AdvSceneSwitcher.condition.source.type.individualSettingMatches"}, "AdvSceneSwitcher.condition.source.type.individualSettingMatches"},
{MacroConditionSource::Condition::INDIVIDUAL_SETTING_CHANGED, {MacroConditionSource::Condition::INDIVIDUAL_SETTING_CHANGED,
"AdvSceneSwitcher.condition.source.type.individualSettingChanged"}, "AdvSceneSwitcher.condition.source.type.individualSettingChanged"},
{MacroConditionSource::Condition::HEIGHT,
"AdvSceneSwitcher.condition.source.type.height"},
{MacroConditionSource::Condition::WIDTH,
"AdvSceneSwitcher.condition.source.type.width"},
}; };
static const std::map<MacroConditionSource::SizeComparision, std::string>
compareMethods = {
{MacroConditionSource::SizeComparision::LESS,
"AdvSceneSwitcher.condition.source.sizeCompare.less"},
{MacroConditionSource::SizeComparision::EQUAL,
"AdvSceneSwitcher.condition.source.sizeCompare.equal"},
{MacroConditionSource::SizeComparision::MORE,
"AdvSceneSwitcher.condition.source.sizeCompare.more"},
};
static bool compareSourceSize(MacroConditionSource::SizeComparision method,
int sourceValue, int compareValue)
{
switch (method) {
case MacroConditionSource::SizeComparision::LESS:
return sourceValue < compareValue;
case MacroConditionSource::SizeComparision::EQUAL:
return sourceValue == compareValue;
case MacroConditionSource::SizeComparision::MORE:
return sourceValue > compareValue;
default:
break;
}
return false;
}
bool MacroConditionSource::CheckCondition() bool MacroConditionSource::CheckCondition()
{ {
if (!_source.GetSource()) { if (!_source.GetSource()) {
@@ -47,23 +77,24 @@ bool MacroConditionSource::CheckCondition()
case Condition::SHOWING: case Condition::SHOWING:
ret = obs_source_showing(s); ret = obs_source_showing(s);
break; break;
case Condition::ALL_SETTINGS_MATCH: case Condition::ALL_SETTINGS_MATCH: {
ret = CompareSourceSettings(_source.GetSource(), _settings, ret = CompareSourceSettings(_source.GetSource(), _settings,
_regex); _regex);
if (IsReferencedInVars()) { const auto settings = GetSourceSettings(_source.GetSource());
SetVariableValue( SetVariableValue(settings);
GetSourceSettings(_source.GetSource())); SetTempVarValue("settings", settings);
}
break; break;
}
case Condition::SETTINGS_CHANGED: { case Condition::SETTINGS_CHANGED: {
std::string settings = GetSourceSettings(_source.GetSource()); const auto settings = GetSourceSettings(_source.GetSource());
ret = !_currentSettings.empty() && settings != _currentSettings; ret = !_currentSettings.empty() && settings != _currentSettings;
_currentSettings = settings; _currentSettings = settings;
SetVariableValue(settings); SetVariableValue(settings);
SetTempVarValue("settings", settings);
break; break;
} }
case Condition::INDIVIDUAL_SETTING_MATCH: { case Condition::INDIVIDUAL_SETTING_MATCH: {
auto value = const auto value =
GetSourceSettingValue(_source.GetSource(), _setting); GetSourceSettingValue(_source.GetSource(), _setting);
if (!value) { if (!value) {
return false; return false;
@@ -71,10 +102,11 @@ bool MacroConditionSource::CheckCondition()
ret = _regex.Enabled() ? _regex.Matches(*value, _settings) ret = _regex.Enabled() ? _regex.Matches(*value, _settings)
: value == std::string(_settings); : value == std::string(_settings);
SetVariableValue(*value); SetVariableValue(*value);
SetTempVarValue("setting", *value);
break; break;
} }
case Condition::INDIVIDUAL_SETTING_CHANGED: { case Condition::INDIVIDUAL_SETTING_CHANGED: {
auto value = const auto value =
GetSourceSettingValue(_source.GetSource(), _setting); GetSourceSettingValue(_source.GetSource(), _setting);
if (!value) { if (!value) {
return false; return false;
@@ -82,6 +114,19 @@ bool MacroConditionSource::CheckCondition()
ret = _currentSettingsValue != *value; ret = _currentSettingsValue != *value;
_currentSettingsValue = *value; _currentSettingsValue = *value;
SetVariableValue(*value); SetVariableValue(*value);
SetTempVarValue("setting", *value);
break;
}
case Condition::HEIGHT: {
const auto height = obs_source_get_height(s);
ret = compareSourceSize(_comparision, height, _size);
SetTempVarValue("height", std::to_string(height));
break;
}
case Condition::WIDTH: {
const auto width = obs_source_get_width(s);
ret = compareSourceSize(_comparision, width, _size);
SetTempVarValue("width", std::to_string(width));
break; break;
} }
default: default:
@@ -103,6 +148,9 @@ bool MacroConditionSource::Save(obs_data_t *obj) const
_settings.Save(obj, "settings"); _settings.Save(obj, "settings");
_regex.Save(obj); _regex.Save(obj);
_setting.Save(obj); _setting.Save(obj);
_size.Save(obj, "size");
obs_data_set_int(obj, "sizeComparisionMethod",
static_cast<int>(_comparision));
return true; return true;
} }
@@ -110,7 +158,8 @@ bool MacroConditionSource::Load(obs_data_t *obj)
{ {
MacroCondition::Load(obj); MacroCondition::Load(obj);
_source.Load(obj); _source.Load(obj);
_condition = static_cast<Condition>(obs_data_get_int(obj, "condition")); SetCondition(
static_cast<Condition>(obs_data_get_int(obj, "condition")));
_settings.Load(obj, "settings"); _settings.Load(obj, "settings");
_regex.Load(obj); _regex.Load(obj);
// TOOD: remove in future version // TOOD: remove in future version
@@ -119,6 +168,9 @@ bool MacroConditionSource::Load(obs_data_t *obj)
obs_data_get_bool(obj, "regex")); obs_data_get_bool(obj, "regex"));
} }
_setting.Load(obj); _setting.Load(obj);
_size.Load(obj, "size");
_comparision = static_cast<SizeComparision>(
obs_data_get_int(obj, "sizeComparisionMethod"));
return true; return true;
} }
@@ -127,9 +179,52 @@ std::string MacroConditionSource::GetShortDesc() const
return _source.ToString(); return _source.ToString();
} }
static inline void populateConditionSelection(QComboBox *list) void MacroConditionSource::SetCondition(Condition cond)
{ {
for (const auto &[_, name] : sourceCnditionTypes) { _condition = cond;
SetupTempVars();
}
void MacroConditionSource::SetupTempVars()
{
MacroCondition::SetupTempVars();
switch (_condition) {
case Condition::ACTIVE:
break;
case Condition::SHOWING:
break;
case Condition::ALL_SETTINGS_MATCH:
case Condition::SETTINGS_CHANGED:
AddTempvar("settings",
obs_module_text(
"AdvSceneSwitcher.tempVar.source.settings"));
break;
case Condition::INDIVIDUAL_SETTING_MATCH:
case Condition::INDIVIDUAL_SETTING_CHANGED:
AddTempvar("setting",
obs_module_text(
"AdvSceneSwitcher.tempVar.source.setting"));
break;
case Condition::HEIGHT:
AddTempvar("height",
obs_module_text(
"AdvSceneSwitcher.tempVar.source.height"));
break;
case Condition::WIDTH:
AddTempvar("width",
obs_module_text(
"AdvSceneSwitcher.tempVar.source.width"));
break;
default:
break;
}
}
template<class T>
static inline void populateSelection(QComboBox *list,
const std::map<T, std::string> &map)
{
for (const auto &[_, name] : map) {
list->addItem(obs_module_text(name.c_str())); list->addItem(obs_module_text(name.c_str()));
} }
} }
@@ -144,10 +239,13 @@ MacroConditionSourceEdit::MacroConditionSourceEdit(
_settings(new VariableTextEdit(this)), _settings(new VariableTextEdit(this)),
_regex(new RegexConfigWidget(parent)), _regex(new RegexConfigWidget(parent)),
_settingSelection(new SourceSettingSelection()), _settingSelection(new SourceSettingSelection()),
_refreshSettingSelection(new QPushButton( _refreshSettingSelection(new QPushButton(obs_module_text(
obs_module_text("AdvSceneSwitcher.condition.source.refresh"))) "AdvSceneSwitcher.condition.source.refresh"))),
_size(new VariableSpinBox(this)),
_sizeCompareMethods(new QComboBox())
{ {
populateConditionSelection(_conditions); populateSelection(_conditions, sourceConditionTypes);
populateSelection(_sizeCompareMethods, compareMethods);
auto sources = GetSourceNames(); auto sources = GetSourceNames();
sources.sort(); sources.sort();
auto scenes = GetSceneNames(); auto scenes = GetSceneNames();
@@ -155,6 +253,7 @@ MacroConditionSourceEdit::MacroConditionSourceEdit(
_sources->SetSourceNameList(sources + scenes); _sources->SetSourceNameList(sources + scenes);
_refreshSettingSelection->setToolTip(obs_module_text( _refreshSettingSelection->setToolTip(obs_module_text(
"AdvSceneSwitcher.condition.source.refreshTooltip")); "AdvSceneSwitcher.condition.source.refreshTooltip"));
_size->setMaximum(999999);
QWidget::connect(_sources, QWidget::connect(_sources,
SIGNAL(SourceChanged(const SourceSelection &)), this, SIGNAL(SourceChanged(const SourceSelection &)), this,
@@ -173,31 +272,36 @@ MacroConditionSourceEdit::MacroConditionSourceEdit(
SLOT(SettingSelectionChanged(const SourceSetting &))); SLOT(SettingSelectionChanged(const SourceSetting &)));
QWidget::connect(_refreshSettingSelection, SIGNAL(clicked()), this, QWidget::connect(_refreshSettingSelection, SIGNAL(clicked()), this,
SLOT(RefreshVariableSourceSelectionValue())); SLOT(RefreshVariableSourceSelectionValue()));
QWidget::connect(
std::unordered_map<std::string, QWidget *> widgetPlaceholders = { _size,
{"{{sources}}", _sources}, SIGNAL(NumberVariableChanged(const NumberVariable<int> &)),
{"{{conditions}}", _conditions}, this, SLOT(SizeChanged(const NumberVariable<int> &)));
{"{{settings}}", _settings}, QWidget::connect(_sizeCompareMethods, SIGNAL(currentIndexChanged(int)),
{"{{getSettings}}", _getSettings}, this, SLOT(CompareMethodChanged(int)));
{"{{regex}}", _regex},
{"{{settingSelection}}", _settingSelection},
{"{{refresh}}", _refreshSettingSelection}};
auto line1Layout = new QHBoxLayout; auto line1Layout = new QHBoxLayout;
line1Layout->setContentsMargins(0, 0, 0, 0); line1Layout->setContentsMargins(0, 0, 0, 0);
PlaceWidgets(obs_module_text( PlaceWidgets(obs_module_text(
"AdvSceneSwitcher.condition.source.entry.line1"), "AdvSceneSwitcher.condition.source.entry.line1"),
line1Layout, widgetPlaceholders); line1Layout,
{{"{{sources}}", _sources},
{"{{conditions}}", _conditions},
{"{{settingSelection}}", _settingSelection},
{"{{refresh}}", _refreshSettingSelection},
{"{{size}}", _size},
{"{{sizeCompareMethods}}", _sizeCompareMethods}});
auto line2Layout = new QHBoxLayout; auto line2Layout = new QHBoxLayout;
line2Layout->setContentsMargins(0, 0, 0, 0); line2Layout->setContentsMargins(0, 0, 0, 0);
PlaceWidgets(obs_module_text( PlaceWidgets(obs_module_text(
"AdvSceneSwitcher.condition.source.entry.line2"), "AdvSceneSwitcher.condition.source.entry.line2"),
line2Layout, widgetPlaceholders, false); line2Layout, {{"{{settings}}", _settings}}, false);
auto line3Layout = new QHBoxLayout; auto line3Layout = new QHBoxLayout;
line3Layout->setContentsMargins(0, 0, 0, 0); line3Layout->setContentsMargins(0, 0, 0, 0);
PlaceWidgets(obs_module_text( PlaceWidgets(obs_module_text(
"AdvSceneSwitcher.condition.source.entry.line3"), "AdvSceneSwitcher.condition.source.entry.line3"),
line3Layout, widgetPlaceholders); line3Layout,
{{"{{getSettings}}", _getSettings}, {"{{regex}}", _regex}},
true);
auto mainLayout = new QVBoxLayout; auto mainLayout = new QVBoxLayout;
mainLayout->addLayout(line1Layout); mainLayout->addLayout(line1Layout);
mainLayout->addLayout(line2Layout); mainLayout->addLayout(line2Layout);
@@ -232,8 +336,8 @@ void MacroConditionSourceEdit::ConditionChanged(int index)
} }
auto lock = LockContext(); auto lock = LockContext();
_entryData->_condition = _entryData->SetCondition(
static_cast<MacroConditionSource::Condition>(index); static_cast<MacroConditionSource::Condition>(index));
SetWidgetVisibility(); SetWidgetVisibility();
} }
@@ -244,7 +348,7 @@ void MacroConditionSourceEdit::GetSettingsClicked()
} }
QString value; QString value;
if (_entryData->_condition == if (_entryData->GetCondition() ==
MacroConditionSource::Condition::ALL_SETTINGS_MATCH) { MacroConditionSource::Condition::ALL_SETTINGS_MATCH) {
value = FormatJsonString( value = FormatJsonString(
GetSourceSettings(_entryData->_source.GetSource())); GetSourceSettings(_entryData->_source.GetSource()));
@@ -303,37 +407,67 @@ void MacroConditionSourceEdit::RefreshVariableSourceSelectionValue()
_settingSelection->SetSource(_entryData->_source.GetSource()); _settingSelection->SetSource(_entryData->_source.GetSource());
} }
void MacroConditionSourceEdit::SizeChanged(const NumberVariable<int> &value)
{
if (_loading || !_entryData) {
return;
}
auto lock = LockContext();
_entryData->_size = value;
}
void MacroConditionSourceEdit::CompareMethodChanged(int index)
{
if (_loading || !_entryData) {
return;
}
auto lock = LockContext();
_entryData->_comparision =
static_cast<MacroConditionSource::SizeComparision>(index);
}
void MacroConditionSourceEdit::SetWidgetVisibility() void MacroConditionSourceEdit::SetWidgetVisibility()
{ {
const bool settingsMatch = const bool settingsMatch =
_entryData->_condition == _entryData->GetCondition() ==
MacroConditionSource::Condition::ALL_SETTINGS_MATCH || MacroConditionSource::Condition::ALL_SETTINGS_MATCH ||
_entryData->_condition == _entryData->GetCondition() ==
MacroConditionSource::Condition::INDIVIDUAL_SETTING_MATCH; MacroConditionSource::Condition::INDIVIDUAL_SETTING_MATCH;
_settings->setVisible(settingsMatch); _settings->setVisible(settingsMatch);
_getSettings->setVisible(settingsMatch); _getSettings->setVisible(settingsMatch);
_regex->setVisible(settingsMatch); _regex->setVisible(settingsMatch);
_settingSelection->setVisible( _settingSelection->setVisible(
_entryData->_condition == MacroConditionSource::Condition:: _entryData->GetCondition() ==
INDIVIDUAL_SETTING_MATCH || MacroConditionSource::Condition::INDIVIDUAL_SETTING_MATCH ||
_entryData->_condition == MacroConditionSource::Condition:: _entryData->GetCondition() ==
INDIVIDUAL_SETTING_CHANGED); MacroConditionSource::Condition::
INDIVIDUAL_SETTING_CHANGED);
setToolTip( setToolTip(
(_entryData->_condition == (_entryData->GetCondition() ==
MacroConditionSource::Condition::ACTIVE || MacroConditionSource::Condition::ACTIVE ||
_entryData->_condition == _entryData->GetCondition() ==
MacroConditionSource::Condition::SHOWING) MacroConditionSource::Condition::SHOWING)
? obs_module_text( ? obs_module_text(
"AdvSceneSwitcher.condition.source.sceneVisibilityHint") "AdvSceneSwitcher.condition.source.sceneVisibilityHint")
: ""); : "");
_refreshSettingSelection->setVisible( _refreshSettingSelection->setVisible(
_entryData->_condition == MacroConditionSource::Condition:: _entryData->GetCondition() ==
INDIVIDUAL_SETTING_MATCH && MacroConditionSource::Condition::INDIVIDUAL_SETTING_MATCH &&
_entryData->_source.GetType() == _entryData->_source.GetType() ==
SourceSelection::Type::VARIABLE); SourceSelection::Type::VARIABLE);
const bool isSizeCheck =
_entryData->GetCondition() ==
MacroConditionSource::Condition::WIDTH ||
_entryData->GetCondition() ==
MacroConditionSource::Condition::HEIGHT;
_size->setVisible(isSizeCheck);
_sizeCompareMethods->setVisible(isSizeCheck);
adjustSize(); adjustSize();
updateGeometry(); updateGeometry();
} }
@@ -345,11 +479,15 @@ void MacroConditionSourceEdit::UpdateEntryData()
} }
_sources->SetSource(_entryData->_source); _sources->SetSource(_entryData->_source);
_conditions->setCurrentIndex(static_cast<int>(_entryData->_condition)); _conditions->setCurrentIndex(
static_cast<int>(_entryData->GetCondition()));
_settings->setPlainText(_entryData->_settings); _settings->setPlainText(_entryData->_settings);
_regex->SetRegexConfig(_entryData->_regex); _regex->SetRegexConfig(_entryData->_regex);
_settingSelection->SetSource(_entryData->_source.GetSource()); _settingSelection->SetSource(_entryData->_source.GetSource());
_settingSelection->SetSetting(_entryData->_setting); _settingSelection->SetSetting(_entryData->_setting);
_size->SetValue(_entryData->_size);
_sizeCompareMethods->setCurrentIndex(
static_cast<int>(_entryData->_comparision));
SetWidgetVisibility(); SetWidgetVisibility();
} }

View File

@@ -31,15 +31,25 @@ public:
SETTINGS_CHANGED, SETTINGS_CHANGED,
INDIVIDUAL_SETTING_MATCH, INDIVIDUAL_SETTING_MATCH,
INDIVIDUAL_SETTING_CHANGED, INDIVIDUAL_SETTING_CHANGED,
HEIGHT,
WIDTH,
}; };
void SetCondition(Condition);
Condition GetCondition() const { return _condition; }
enum class SizeComparision { LESS, EQUAL, MORE };
SourceSelection _source; SourceSelection _source;
Condition _condition = Condition::ACTIVE;
StringVariable _settings = ""; StringVariable _settings = "";
SourceSetting _setting; SourceSetting _setting;
RegexConfig _regex; RegexConfig _regex;
IntVariable _size;
SizeComparision _comparision = SizeComparision::EQUAL;
private: private:
void SetupTempVars();
Condition _condition = Condition::ACTIVE;
std::string _currentSettings; std::string _currentSettings;
std::string _currentSettingsValue; std::string _currentSettingsValue;
@@ -71,6 +81,8 @@ private slots:
void RegexChanged(const RegexConfig &); void RegexChanged(const RegexConfig &);
void SettingSelectionChanged(const SourceSetting &); void SettingSelectionChanged(const SourceSetting &);
void RefreshVariableSourceSelectionValue(); void RefreshVariableSourceSelectionValue();
void SizeChanged(const NumberVariable<int> &value);
void CompareMethodChanged(int);
signals: signals:
void HeaderInfoChanged(const QString &); void HeaderInfoChanged(const QString &);
@@ -82,6 +94,8 @@ protected:
RegexConfigWidget *_regex; RegexConfigWidget *_regex;
SourceSettingSelection *_settingSelection; SourceSettingSelection *_settingSelection;
QPushButton *_refreshSettingSelection; QPushButton *_refreshSettingSelection;
VariableSpinBox *_size;
QComboBox *_sizeCompareMethods;
std::shared_ptr<MacroConditionSource> _entryData; std::shared_ptr<MacroConditionSource> _entryData;

View File

@@ -529,68 +529,26 @@ void OSCMessageElementEdit::TypeChanged(int idx)
} }
OSCMessageEdit::OSCMessageEdit(QWidget *parent) OSCMessageEdit::OSCMessageEdit(QWidget *parent)
: QWidget(parent), : ListEditor(parent),
_address(new VariableLineEdit(this)), _address(new VariableLineEdit(this))
_elements(new QListWidget()),
_add(new QPushButton()),
_remove(new QPushButton()),
_up(new QPushButton()),
_down(new QPushButton())
{ {
_elements->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); _list->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
_elements->setAutoScroll(false); _list->setAutoScroll(false);
_add->setMaximumWidth(22);
_add->setProperty("themeID",
QVariant(QString::fromUtf8("addIconSmall")));
_add->setFlat(true);
_remove->setMaximumWidth(22);
_remove->setProperty("themeID",
QVariant(QString::fromUtf8("removeIconSmall")));
_remove->setFlat(true);
_up->setMaximumWidth(22);
_up->setProperty("themeID",
QVariant(QString::fromUtf8("upArrowIconSmall")));
_up->setFlat(true);
_down->setMaximumWidth(22);
_down->setProperty("themeID",
QVariant(QString::fromUtf8("downArrowIconSmall")));
_down->setFlat(true);
QWidget::connect(_address, SIGNAL(editingFinished()), this, QWidget::connect(_address, SIGNAL(editingFinished()), this,
SLOT(AddressChanged())); SLOT(AddressChanged()));
QWidget::connect(_add, SIGNAL(clicked()), this, SLOT(Add()));
QWidget::connect(_remove, SIGNAL(clicked()), this, SLOT(Remove()));
QWidget::connect(_up, SIGNAL(clicked()), this, SLOT(Up()));
QWidget::connect(_down, SIGNAL(clicked()), this, SLOT(Down()));
auto controlsLayout = new QHBoxLayout(); _mainLayout->insertWidget(0, _address);
controlsLayout->addWidget(_add);
controlsLayout->addWidget(_remove);
QFrame *line = new QFrame();
line->setFrameShape(QFrame::VLine);
line->setFrameShadow(QFrame::Sunken);
controlsLayout->addWidget(line);
controlsLayout->addWidget(_up);
controlsLayout->addWidget(_down);
controlsLayout->addStretch();
auto layout = new QVBoxLayout;
layout->setContentsMargins(0, 0, 0, 0);
layout->addWidget(_address);
layout->addWidget(_elements);
layout->addLayout(controlsLayout);
setLayout(layout);
} }
void OSCMessageEdit::InsertElement(const OSCMessageElement &element) void OSCMessageEdit::InsertElement(const OSCMessageElement &element)
{ {
auto item = new QListWidgetItem(_elements); auto item = new QListWidgetItem(_list);
_elements->addItem(item); _list->addItem(item);
auto elementEdit = new OSCMessageElementEdit(this); auto elementEdit = new OSCMessageElementEdit(this);
elementEdit->SetMessageElement(element); elementEdit->SetMessageElement(element);
item->setSizeHint(elementEdit->minimumSizeHint()); item->setSizeHint(elementEdit->minimumSizeHint());
_elements->setItemWidget(item, elementEdit); _list->setItemWidget(item, elementEdit);
QWidget::connect(elementEdit, QWidget::connect(elementEdit,
SIGNAL(ElementValueChanged(const OSCMessageElement &)), SIGNAL(ElementValueChanged(const OSCMessageElement &)),
this, this,
@@ -607,7 +565,7 @@ void OSCMessageEdit::SetMessage(const OSCMessage &message)
InsertElement(element); InsertElement(element);
} }
_currentSelection = message; _currentSelection = message;
SetWidgetSize(); UpdateListSize();
} }
void OSCMessageEdit::AddressChanged() void OSCMessageEdit::AddressChanged()
@@ -621,13 +579,13 @@ void OSCMessageEdit::Add()
OSCMessageElement element; OSCMessageElement element;
InsertElement(element); InsertElement(element);
emit MessageChanged(_currentSelection); emit MessageChanged(_currentSelection);
SetWidgetSize(); UpdateListSize();
} }
void OSCMessageEdit::Remove() void OSCMessageEdit::Remove()
{ {
auto item = _elements->currentItem(); auto item = _list->currentItem();
int idx = _elements->currentRow(); int idx = _list->currentRow();
if (!item || idx == -1) { if (!item || idx == -1) {
return; return;
} }
@@ -635,7 +593,7 @@ void OSCMessageEdit::Remove()
_currentSelection._elements.erase(_currentSelection._elements.begin() + _currentSelection._elements.erase(_currentSelection._elements.begin() +
idx); idx);
emit MessageChanged(_currentSelection); emit MessageChanged(_currentSelection);
SetWidgetSize(); UpdateListSize();
} }
static bool moveUp(QListWidget *list) static bool moveUp(QListWidget *list)
@@ -658,8 +616,8 @@ static bool moveUp(QListWidget *list)
void OSCMessageEdit::Up() void OSCMessageEdit::Up()
{ {
int idx = _elements->currentRow(); int idx = _list->currentRow();
if (!moveUp(_elements)) { if (!moveUp(_list)) {
return; return;
} }
@@ -667,7 +625,7 @@ void OSCMessageEdit::Up()
_currentSelection._elements.begin() + idx - 1); _currentSelection._elements.begin() + idx - 1);
emit MessageChanged(_currentSelection); emit MessageChanged(_currentSelection);
SetWidgetSize(); UpdateListSize();
} }
static bool moveDown(QListWidget *list) static bool moveDown(QListWidget *list)
@@ -690,8 +648,8 @@ static bool moveDown(QListWidget *list)
void OSCMessageEdit::Down() void OSCMessageEdit::Down()
{ {
int idx = _elements->currentRow(); int idx = _list->currentRow();
if (!moveDown(_elements)) { if (!moveDown(_list)) {
return; return;
} }
@@ -699,7 +657,7 @@ void OSCMessageEdit::Down()
_currentSelection._elements.begin() + idx + 1); _currentSelection._elements.begin() + idx + 1);
emit MessageChanged(_currentSelection); emit MessageChanged(_currentSelection);
SetWidgetSize(); UpdateListSize();
} }
static QListWidgetItem *getItemFromWidget(QListWidget *list, QWidget *widget) static QListWidgetItem *getItemFromWidget(QListWidget *list, QWidget *widget)
@@ -727,7 +685,7 @@ int OSCMessageEdit::GetIndexOfSignal()
if (!widget) { if (!widget) {
return -1; return -1;
} }
return _elements->row(getItemFromWidget(_elements, widget)); return _list->row(getItemFromWidget(_list, widget));
} }
void OSCMessageEdit::ElementFocussed() void OSCMessageEdit::ElementFocussed()
@@ -736,7 +694,7 @@ void OSCMessageEdit::ElementFocussed()
if (idx == -1) { if (idx == -1) {
return; return;
} }
_elements->setCurrentRow(idx); _list->setCurrentRow(idx);
} }
void OSCMessageEdit::ElementValueChanged(const OSCMessageElement &element) void OSCMessageEdit::ElementValueChanged(const OSCMessageElement &element)
@@ -747,15 +705,8 @@ void OSCMessageEdit::ElementValueChanged(const OSCMessageElement &element)
} }
_currentSelection._elements.at(idx) = element; _currentSelection._elements.at(idx) = element;
_elements->setCurrentRow(idx); _list->setCurrentRow(idx);
emit MessageChanged(_currentSelection); emit MessageChanged(_currentSelection);
} }
void OSCMessageEdit::SetWidgetSize()
{
SetHeightToContentHeight(_elements);
adjustSize();
updateGeometry();
}
} // namespace advss } // namespace advss

View File

@@ -1,4 +1,5 @@
#pragma once #pragma once
#include "list-editor.hpp"
#include "variable-string.hpp" #include "variable-string.hpp"
#include "variable-number.hpp" #include "variable-number.hpp"
#include "variable-line-edit.hpp" #include "variable-line-edit.hpp"
@@ -6,7 +7,6 @@
#include <variant> #include <variant>
#include <unordered_map> #include <unordered_map>
#include <QListWidget>
namespace advss { namespace advss {
@@ -137,7 +137,7 @@ private:
VariableLineEdit *_binaryText; VariableLineEdit *_binaryText;
}; };
class OSCMessageEdit : public QWidget { class OSCMessageEdit final : public ListEditor {
Q_OBJECT Q_OBJECT
public: public:
OSCMessageEdit(QWidget *); OSCMessageEdit(QWidget *);
@@ -157,15 +157,9 @@ signals:
private: private:
void InsertElement(const OSCMessageElement &); void InsertElement(const OSCMessageElement &);
void SetWidgetSize();
int GetIndexOfSignal(); int GetIndexOfSignal();
VariableLineEdit *_address; VariableLineEdit *_address;
QListWidget *_elements;
QPushButton *_add;
QPushButton *_remove;
QPushButton *_up;
QPushButton *_down;
OSCMessage _currentSelection; OSCMessage _currentSelection;
}; };

View File

@@ -1,7 +1,6 @@
#include "source-setting.hpp" #include "source-setting.hpp"
#include "obs-module-helper.hpp" #include "obs-module-helper.hpp"
#include "math-helpers.hpp" #include "math-helpers.hpp"
#include "ui-helpers.hpp"
#include "utility.hpp" #include "utility.hpp"
#include <nlohmann/json.hpp> #include <nlohmann/json.hpp>
@@ -233,14 +232,8 @@ SourceSettingSelection::SourceSettingSelection(QWidget *parent)
: QWidget(parent), : QWidget(parent),
_settings(new FilterComboBox( _settings(new FilterComboBox(
this, obs_module_text("AdvSceneSwitcher.setting.select"))), this, obs_module_text("AdvSceneSwitcher.setting.select"))),
_tooltip(new QLabel()) _tooltip(new HelpIcon())
{ {
QString path = GetThemeTypeName() == "Light"
? ":/res/images/help.svg"
: ":/res/images/help_light.svg";
QIcon icon(path);
QPixmap pixmap = icon.pixmap(QSize(16, 16));
_tooltip->setPixmap(pixmap);
_tooltip->hide(); _tooltip->hide();
_settings->setSizeAdjustPolicy(QComboBox::AdjustToContents); _settings->setSizeAdjustPolicy(QComboBox::AdjustToContents);

View File

@@ -1,5 +1,6 @@
#pragma once #pragma once
#include "filter-combo-box.hpp" #include "filter-combo-box.hpp"
#include "help-icon.hpp"
#include <obs.hpp> #include <obs.hpp>
#include <optional> #include <optional>
@@ -52,7 +53,7 @@ private:
void Populate(const OBSWeakSource &); void Populate(const OBSWeakSource &);
FilterComboBox *_settings; FilterComboBox *_settings;
QLabel *_tooltip; HelpIcon *_tooltip;
}; };
} // namespace advss } // namespace advss

View File

@@ -207,14 +207,14 @@ static void setupTab(QTabWidget *tab)
} }
QWidget::connect(ConnectionSelectionSignalManager::Instance(), QWidget::connect(ConnectionSelectionSignalManager::Instance(),
&ConnectionSelectionSignalManager::Rename, &ConnectionSelectionSignalManager::Rename, tab,
[](const QString &oldName, const QString &newName) { [](const QString &oldName, const QString &newName) {
RenameItemTableRow(tabWidget->Table(), oldName, RenameItemTableRow(tabWidget->Table(), oldName,
newName); newName);
}); });
QWidget::connect( QWidget::connect(
ConnectionSelectionSignalManager::Instance(), ConnectionSelectionSignalManager::Instance(),
&ConnectionSelectionSignalManager::Add, &ConnectionSelectionSignalManager::Add, tab,
[tab](const QString &name) { [tab](const QString &name) {
AddItemTableRow( AddItemTableRow(
tabWidget->Table(), tabWidget->Table(),
@@ -224,7 +224,7 @@ static void setupTab(QTabWidget *tab)
setTabVisible(tab, true); setTabVisible(tab, true);
}); });
QWidget::connect(ConnectionSelectionSignalManager::Instance(), QWidget::connect(ConnectionSelectionSignalManager::Instance(),
&ConnectionSelectionSignalManager::Remove, &ConnectionSelectionSignalManager::Remove, tab,
[](const QString &name) { [](const QString &name) {
RemoveItemTableRow(tabWidget->Table(), name); RemoveItemTableRow(tabWidget->Table(), name);
if (tabWidget->Table()->rowCount() == 0) { if (tabWidget->Table()->rowCount() == 0) {

View File

@@ -529,7 +529,8 @@ TwitchTokenSettingsDialog::TwitchTokenSettingsDialog(
HideToken(); HideToken();
if (_name->text().isEmpty()) { if (_name->text().isEmpty()) {
PulseWidget(_requestToken, Qt::green, QColor(0, 0, 0, 0), true); HighlightWidget(_requestToken, Qt::green, QColor(0, 0, 0, 0),
true);
} }
_currentToken = settings; _currentToken = settings;
@@ -573,7 +574,8 @@ void TwitchTokenSettingsDialog::HideToken()
void TwitchTokenSettingsDialog::TokenOptionChanged(int) void TwitchTokenSettingsDialog::TokenOptionChanged(int)
{ {
if (!_name->text().isEmpty()) { if (!_name->text().isEmpty()) {
PulseWidget(_requestToken, Qt::green, QColor(0, 0, 0, 0), true); HighlightWidget(_requestToken, Qt::green, QColor(0, 0, 0, 0),
true);
} }
_name->setText(""); _name->setText("");
SetTokenInfoVisible(false); SetTokenInfoVisible(false);

View File

@@ -196,7 +196,7 @@ static void setupTab(QTabWidget *tab)
QWidget::connect( QWidget::connect(
TwitchConnectionSignalManager::Instance(), TwitchConnectionSignalManager::Instance(),
&TwitchConnectionSignalManager::Add, &TwitchConnectionSignalManager::Add, tab,
[tab](const QString &name) { [tab](const QString &name) {
AddItemTableRow( AddItemTableRow(
tabWidget->Table(), tabWidget->Table(),
@@ -208,7 +208,7 @@ static void setupTab(QTabWidget *tab)
setTabVisible(tab, true); setTabVisible(tab, true);
}); });
QWidget::connect(TwitchConnectionSignalManager::Instance(), QWidget::connect(TwitchConnectionSignalManager::Instance(),
&TwitchConnectionSignalManager::Remove, &TwitchConnectionSignalManager::Remove, tab,
[](const QString &name) { [](const QString &name) {
RemoveItemTableRow(tabWidget->Table(), name); RemoveItemTableRow(tabWidget->Table(), name);
if (tabWidget->Table()->rowCount() == 0) { if (tabWidget->Table()->rowCount() == 0) {

View File

@@ -1,11 +1,13 @@
#include "ui-helpers.hpp" #include "ui-helpers.hpp"
class QObejct;
namespace advss { namespace advss {
QMetaObject::Connection PulseWidget(QWidget *widget, QColor startColor, QObject *HighlightWidget(QWidget *widget, QColor startColor, QColor endColor,
QColor endColor, bool once) bool once)
{ {
return {}; return nullptr;
} }
void SetHeightToContentHeight(QListWidget *list) {} void SetHeightToContentHeight(QListWidget *list) {}
@@ -33,4 +35,11 @@ std::string GetThemeTypeName()
return "Dark"; return "Dark";
} }
void QeueUITask(void (*task)(void *param), void *) {}
QWidget *GetSettingsWindow()
{
return nullptr;
}
} // namespace advss } // namespace advss