From 29f9cba236ab24e7638beabe9b736a9bebd84691 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Sat, 5 Aug 2023 22:49:39 +0200 Subject: [PATCH] Add option to skip execution of given macro on OBS startup --- data/locale/en-US.ini | 2 ++ src/macro-core/macro-properties.cpp | 12 ++++++++++++ src/macro-core/macro-properties.hpp | 1 + src/macro-core/macro.cpp | 24 ++++++++++++++++-------- src/macro-core/macro.hpp | 3 +++ 5 files changed, 34 insertions(+), 8 deletions(-) diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index a72697b8..8900837c 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -104,12 +104,14 @@ AdvSceneSwitcher.macroTab.maximize="Maximize" AdvSceneSwitcher.macroTab.minimize="Minimize" AdvSceneSwitcher.macroTab.highlightSettings="Visual settings" AdvSceneSwitcher.macroTab.hotkeySettings="Hotkey settings" +AdvSceneSwitcher.macroTab.generalSettings="General settings" AdvSceneSwitcher.macroTab.dockSettings="Dock settings" AdvSceneSwitcher.macroTab.highlightExecutedMacros="Highlight recently executed macros" AdvSceneSwitcher.macroTab.highlightTrueConditions="Highlight conditions of currently selected macro that evaluated to true recently" AdvSceneSwitcher.macroTab.highlightPerformedActions="Highlight recently performed actions of currently selected macro" AdvSceneSwitcher.macroTab.newMacroRegisterHotkey="Register hotkeys to control the pause state of new macros" AdvSceneSwitcher.macroTab.currentDisableHotkeys="Register hotkeys to control the pause state of selected macro" +AdvSceneSwitcher.macroTab.currentSkipExecutionOnStartup="Skip execution of actions of current macro on startup" AdvSceneSwitcher.macroTab.currentRegisterDock="Register dock widget to control the pause state of selected macro or run it manually" AdvSceneSwitcher.macroTab.currentDockAddRunButton="Add button to run the macro" AdvSceneSwitcher.macroTab.currentDockAddPauseButton="Add button to pause or unpause the macro" diff --git a/src/macro-core/macro-properties.cpp b/src/macro-core/macro-properties.cpp index 4c6863ae..52bc22b7 100644 --- a/src/macro-core/macro-properties.cpp +++ b/src/macro-core/macro-properties.cpp @@ -44,6 +44,8 @@ MacroPropertiesDialog::MacroPropertiesDialog(QWidget *parent, "AdvSceneSwitcher.macroTab.newMacroRegisterHotkey"))), _currentMacroRegisterHotkeys(new QCheckBox(obs_module_text( "AdvSceneSwitcher.macroTab.currentDisableHotkeys"))), + _currentSkipOnStartup(new QCheckBox(obs_module_text( + "AdvSceneSwitcher.macroTab.currentSkipExecutionOnStartup"))), _currentMacroRegisterDock(new QCheckBox(obs_module_text( "AdvSceneSwitcher.macroTab.currentRegisterDock"))), _currentMacroDockAddRunButton(new QCheckBox(obs_module_text( @@ -82,6 +84,12 @@ MacroPropertiesDialog::MacroPropertiesDialog(QWidget *parent, hotkeyLayout->addWidget(_currentMacroRegisterHotkeys); hotkeyOptions->setLayout(hotkeyLayout); + auto generalOptions = new QGroupBox( + obs_module_text("AdvSceneSwitcher.macroTab.generalSettings")); + auto generalLayout = new QVBoxLayout; + generalLayout->addWidget(_currentSkipOnStartup); + generalOptions->setLayout(generalLayout); + int row = 0; _dockLayout->addWidget(_currentMacroRegisterDock, row, 1, 1, 2); row++; @@ -149,6 +157,7 @@ MacroPropertiesDialog::MacroPropertiesDialog(QWidget *parent, auto layout = new QVBoxLayout; layout->addWidget(highlightOptions); layout->addWidget(hotkeyOptions); + layout->addWidget(generalOptions); layout->addWidget(_dockOptions); layout->addWidget(buttonbox); setLayout(layout); @@ -159,10 +168,12 @@ MacroPropertiesDialog::MacroPropertiesDialog(QWidget *parent, _newMacroRegisterHotkeys->setChecked(prop._newMacroRegisterHotkeys); if (!macro || macro->IsGroup()) { hotkeyOptions->hide(); + generalOptions->hide(); _dockOptions->hide(); return; } _currentMacroRegisterHotkeys->setChecked(macro->PauseHotkeysEnabled()); + _currentSkipOnStartup->setChecked(macro->SkipExecOnStart()); const bool dockEnabled = macro->DockEnabled(); _currentMacroRegisterDock->setChecked(dockEnabled); _currentMacroDockAddRunButton->setChecked(macro->DockHasRunButton()); @@ -268,6 +279,7 @@ bool MacroPropertiesDialog::AskForSettings(QWidget *parent, macro->EnablePauseHotkeys( dialog._currentMacroRegisterHotkeys->isChecked()); + macro->SetSkipExecOnStart(dialog._currentSkipOnStartup->isChecked()); macro->EnableDock(dialog._currentMacroRegisterDock->isChecked()); macro->SetDockHasRunButton( dialog._currentMacroDockAddRunButton->isChecked()); diff --git a/src/macro-core/macro-properties.hpp b/src/macro-core/macro-properties.hpp index b381290c..fef5613d 100644 --- a/src/macro-core/macro-properties.hpp +++ b/src/macro-core/macro-properties.hpp @@ -47,6 +47,7 @@ private: QCheckBox *_newMacroRegisterHotkeys; // Current macro specific settings QCheckBox *_currentMacroRegisterHotkeys; + QCheckBox *_currentSkipOnStartup; QCheckBox *_currentMacroRegisterDock; QCheckBox *_currentMacroDockAddRunButton; QCheckBox *_currentMacroDockAddPauseButton; diff --git a/src/macro-core/macro.cpp b/src/macro-core/macro.cpp index 62aa74cb..b9b5861e 100644 --- a/src/macro-core/macro.cpp +++ b/src/macro-core/macro.cpp @@ -31,7 +31,7 @@ Macro::~Macro() Stop(); ClearHotkeys(); - // Keep the dock widgets in case of shutdown so they can be rostored by + // Keep the dock widgets in case of shutdown so they can be restored by // OBS on startup if (!switcher->obsIsShuttingDown) { RemoveDock(); @@ -361,6 +361,7 @@ bool Macro::Save(obs_data_t *obj) const obs_data_set_bool(obj, "pause", _paused); obs_data_set_bool(obj, "parallel", _runInParallel); obs_data_set_bool(obj, "onChange", _matchOnChange); + obs_data_set_bool(obj, "skipExecOnStart", _skipExecOnStart); obs_data_set_bool(obj, "group", _isGroup); if (_isGroup) { @@ -453,6 +454,7 @@ bool Macro::Load(obs_data_t *obj) _paused = obs_data_get_bool(obj, "pause"); _runInParallel = obs_data_get_bool(obj, "parallel"); _matchOnChange = obs_data_get_bool(obj, "onChange"); + _skipExecOnStart = obs_data_get_bool(obj, "skipExecOnStart"); _isGroup = obs_data_get_bool(obj, "group"); if (_isGroup) { @@ -1026,7 +1028,7 @@ bool SwitcherData::CheckMacros() bool SwitcherData::RunMacros() { - // Create copy of macor list as elements might be removed, inserted, or + // Create copy of macro list as elements might be removed, inserted, or // reordered while macros are currently being executed. // For example, this can happen if a macro is performing a wait action, // as the main lock will be unlocked during this time. @@ -1047,12 +1049,18 @@ bool SwitcherData::RunMacros() } for (auto &m : runPhaseMacros) { - if (m && m->Matched()) { - vblog(LOG_INFO, "running macro: %s", m->Name().c_str()); - if (!m->PerformActions()) { - blog(LOG_WARNING, "abort macro: %s", - m->Name().c_str()); - } + if (!m || !m->Matched()) { + continue; + } + if (firstInterval && m->SkipExecOnStart()) { + blog(LOG_INFO, + "skip execution of macro \"%s\" at startup", + m->Name().c_str()); + continue; + } + vblog(LOG_INFO, "running macro: %s", m->Name().c_str()); + if (!m->PerformActions()) { + blog(LOG_WARNING, "abort macro: %s", m->Name().c_str()); } } if (GetLock()) { diff --git a/src/macro-core/macro.hpp b/src/macro-core/macro.hpp index efbdde24..6266fa92 100644 --- a/src/macro-core/macro.hpp +++ b/src/macro-core/macro.hpp @@ -37,6 +37,8 @@ public: bool Paused() const { return _paused; } void SetMatchOnChange(bool onChange) { _matchOnChange = onChange; } bool MatchOnChange() const { return _matchOnChange; } + void SetSkipExecOnStart(bool skip) { _skipExecOnStart = skip; } + bool SkipExecOnStart() const { return _skipExecOnStart; } int RunCount() const { return _runCount; }; void ResetRunCount() { _runCount = 0; }; void ResetTimers(); @@ -141,6 +143,7 @@ private: bool _matched = false; bool _lastMatched = false; bool _matchOnChange = true; + bool _skipExecOnStart = false; bool _paused = false; int _runCount = 0; bool _registerHotkeys = true;