From 9853b3d25cfc1f826ff8ae36b9244970086d1840 Mon Sep 17 00:00:00 2001 From: WarmUpTill <19472752+WarmUpTill@users.noreply.github.com> Date: Thu, 9 Apr 2026 20:15:02 +0200 Subject: [PATCH] Add "Run macro" option --- data/locale/de-DE.ini | 2 +- data/locale/en-US.ini | 6 ++++- data/locale/es-ES.ini | 2 +- data/locale/fr-FR.ini | 2 +- data/locale/ja-JP.ini | 2 +- data/locale/pt-BR.ini | 2 +- data/locale/tr-TR.ini | 2 +- data/locale/zh-CN.ini | 2 +- lib/macro/macro-action-macro.cpp | 42 +++++++++++++++++++++++++++++--- lib/macro/macro-action-macro.hpp | 4 +++ 10 files changed, 54 insertions(+), 12 deletions(-) diff --git a/data/locale/de-DE.ini b/data/locale/de-DE.ini index e0a9b69d..f05d4ebc 100644 --- a/data/locale/de-DE.ini +++ b/data/locale/de-DE.ini @@ -452,7 +452,7 @@ AdvSceneSwitcher.action.macro="Makro" AdvSceneSwitcher.action.macro.type.pause="Pausieren" AdvSceneSwitcher.action.macro.type.unpause="Nicht mehr pausieren" AdvSceneSwitcher.action.macro.type.resetCounter="Zähler zurücksetzen" -AdvSceneSwitcher.action.macro.type.run="Aktionen ausführen" +AdvSceneSwitcher.action.macro.type.runActions="Aktionen ausführen" AdvSceneSwitcher.action.macro.type.stop="Aktionen stoppen" AdvSceneSwitcher.action.pluginState="Plugin-Status" AdvSceneSwitcher.action.pluginState.type.stop="Erweiterten Automatischen Szenenwechsler stoppen" diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 857f9990..0f567c2d 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -1070,7 +1070,7 @@ AdvSceneSwitcher.action.macro.type.pause="Pause" AdvSceneSwitcher.action.macro.type.unpause="Unpause" AdvSceneSwitcher.action.macro.type.togglePause="Toggle pause" AdvSceneSwitcher.action.macro.type.resetCounter="Reset counter" -AdvSceneSwitcher.action.macro.type.run="Run macro" +AdvSceneSwitcher.action.macro.type.runActions="Run macro actions" 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.false="Only if conditions evaluate to false" @@ -1086,6 +1086,9 @@ AdvSceneSwitcher.action.macro.type.disableAction="Disable action" AdvSceneSwitcher.action.macro.type.enableAction="Enable action" AdvSceneSwitcher.action.macro.type.toggleAction="Toggle action" AdvSceneSwitcher.action.macro.type.getInfo="Get macro info" +AdvSceneSwitcher.action.macro.type.runMacro="Run macro" +AdvSceneSwitcher.action.macro.type.runMacro.noConditionsWarning="Warning: The selected macro has no conditions!" +AdvSceneSwitcher.action.macro.type.runMacro.help="Unlike \"Run macro actions\", this option will immediately re-evaluate the conditions of the selected macro and then run either its actions or else-actions depending on the result." AdvSceneSwitcher.action.macro.type.nestedMacro="Nested macro" AdvSceneSwitcher.action.macro.actionSelectionType.index="at index" AdvSceneSwitcher.action.macro.actionSelectionType.label="with label" @@ -1096,6 +1099,7 @@ AdvSceneSwitcher.action.macro.type.nestedMacro.elseActionHelp="This section allo AdvSceneSwitcher.action.macro.layout.run="{{actions}}{{actionSections}}of{{macros}}" AdvSceneSwitcher.action.macro.layout.run.condition="{{conditionBehaviors}}of{{conditionMacros}}" AdvSceneSwitcher.action.macro.layout.actionState="{{actions}}{{actionSelectionType}}{{actionIndex}}{{label}}{{regex}}{{actionTypes}}in{{actionSections}}section of{{macros}}" +AdvSceneSwitcher.action.macro.layout.runMacro="{{actions}}{{runMacroHelp}}{{macros}}" AdvSceneSwitcher.action.macro.layout.other="{{actions}}{{macros}}" AdvSceneSwitcher.action.pluginState="Plugin state" AdvSceneSwitcher.action.pluginState.type.stop="Stop the Advanced Scene Switcher plugin" diff --git a/data/locale/es-ES.ini b/data/locale/es-ES.ini index 515eaaff..d9a7b48a 100644 --- a/data/locale/es-ES.ini +++ b/data/locale/es-ES.ini @@ -372,7 +372,7 @@ AdvSceneSwitcher.action.macro="Macro" AdvSceneSwitcher.action.macro.type.pause="Pausa" AdvSceneSwitcher.action.macro.type.unpause="Reanudar" AdvSceneSwitcher.action.macro.type.resetCounter="Reiniciar contador" -AdvSceneSwitcher.action.macro.type.run="Ejecutar" +AdvSceneSwitcher.action.macro.type.runActions="Ejecutar" AdvSceneSwitcher.action.macro.type.stop="Detener" AdvSceneSwitcher.action.pluginState="Estado del complemento" AdvSceneSwitcher.action.pluginState.type.stop="Detener el complemento Advanced Scene Switcher" diff --git a/data/locale/fr-FR.ini b/data/locale/fr-FR.ini index 6af447bc..8c175605 100644 --- a/data/locale/fr-FR.ini +++ b/data/locale/fr-FR.ini @@ -551,7 +551,7 @@ AdvSceneSwitcher.action.macro="Macro" AdvSceneSwitcher.action.macro.type.pause="Pause" AdvSceneSwitcher.action.macro.type.unpause="Reprendre" AdvSceneSwitcher.action.macro.type.resetCounter="Réinitialiser le compteur" -AdvSceneSwitcher.action.macro.type.run="Exécuter les actions" +AdvSceneSwitcher.action.macro.type.runActions="Exécuter les actions" AdvSceneSwitcher.action.macro.type.stop="Arrêter les actions" AdvSceneSwitcher.action.macro.type.disableAction="Désactiver l'action" AdvSceneSwitcher.action.macro.type.enableAction="Activer l'action" diff --git a/data/locale/ja-JP.ini b/data/locale/ja-JP.ini index f3d5e233..0606efc7 100644 --- a/data/locale/ja-JP.ini +++ b/data/locale/ja-JP.ini @@ -923,7 +923,7 @@ AdvSceneSwitcher.action.macro.type.pause="一時停止" AdvSceneSwitcher.action.macro.type.unpause="一時停止解除" AdvSceneSwitcher.action.macro.type.togglePause="一時停止を切り替え" AdvSceneSwitcher.action.macro.type.resetCounter="カウンターリセット" -AdvSceneSwitcher.action.macro.type.run="マクロを実行" +AdvSceneSwitcher.action.macro.type.runActions="マクロを実行" AdvSceneSwitcher.action.macro.type.run.conditions.ignore="条件の状態を考慮しない" AdvSceneSwitcher.action.macro.type.run.conditions.true="条件が true と評価された場合のみ" AdvSceneSwitcher.action.macro.type.run.conditions.false="条件が false と評価された場合のみ" diff --git a/data/locale/pt-BR.ini b/data/locale/pt-BR.ini index 92c29e04..03d74e7b 100644 --- a/data/locale/pt-BR.ini +++ b/data/locale/pt-BR.ini @@ -840,7 +840,7 @@ AdvSceneSwitcher.action.macro="Macro" AdvSceneSwitcher.action.macro.type.pause="Pausar" AdvSceneSwitcher.action.macro.type.unpause="Retomar" AdvSceneSwitcher.action.macro.type.resetCounter="Reiniciar contador" -AdvSceneSwitcher.action.macro.type.run="Executar macro" +AdvSceneSwitcher.action.macro.type.runActions="Executar macro" AdvSceneSwitcher.action.macro.type.run.conditions.ignore="Não considerar o estado da condição" AdvSceneSwitcher.action.macro.type.run.conditions.true="Apenas se as condições forem verdadeiras" AdvSceneSwitcher.action.macro.type.run.conditions.false="Apenas se as condições forem falsas" diff --git a/data/locale/tr-TR.ini b/data/locale/tr-TR.ini index f1c59095..b9a6d7b9 100644 --- a/data/locale/tr-TR.ini +++ b/data/locale/tr-TR.ini @@ -301,7 +301,7 @@ AdvSceneSwitcher.action.macro="Makro" AdvSceneSwitcher.action.macro.type.pause="Duraklat" AdvSceneSwitcher.action.macro.type.unpause="Duraklatma" AdvSceneSwitcher.action.macro.type.resetCounter="Sayacı sıfırla" -AdvSceneSwitcher.action.macro.type.run="Çalıştır" +AdvSceneSwitcher.action.macro.type.runActions="Çalıştır" AdvSceneSwitcher.action.pluginState="Eklenti durumu" AdvSceneSwitcher.action.pluginState.type.stop="Advanced Scene Switcher eklentisini durdurun" AdvSceneSwitcher.action.pluginState.type.noMatch="Eşleşmeme davranışını değiştirin:" diff --git a/data/locale/zh-CN.ini b/data/locale/zh-CN.ini index 7918c560..c241334c 100644 --- a/data/locale/zh-CN.ini +++ b/data/locale/zh-CN.ini @@ -900,7 +900,7 @@ AdvSceneSwitcher.action.macro="宏" AdvSceneSwitcher.action.macro.type.pause="停用" AdvSceneSwitcher.action.macro.type.unpause="启用" AdvSceneSwitcher.action.macro.type.resetCounter="重置计数器" -AdvSceneSwitcher.action.macro.type.run="运行宏" +AdvSceneSwitcher.action.macro.type.runActions="运行宏" AdvSceneSwitcher.action.macro.type.run.conditions.ignore="忽略条件结果" AdvSceneSwitcher.action.macro.type.run.conditions.true="仅当条件结果为真时" AdvSceneSwitcher.action.macro.type.run.conditions.false="仅当条件结果为假时" diff --git a/lib/macro/macro-action-macro.cpp b/lib/macro/macro-action-macro.cpp index 991c0c9f..725921db 100644 --- a/lib/macro/macro-action-macro.cpp +++ b/lib/macro/macro-action-macro.cpp @@ -120,6 +120,15 @@ bool MacroActionMacro::PerformAction() case Action::TOGGLE_ACTION: AdjustActionState(macro); break; + case Action::RUN_MACRO: { + if (_runOptions.skipWhenPaused && macro->Paused()) { + break; + } + const bool conditionsMatched = + macro->CheckConditions(true); + macro->PerformActions(conditionsMatched, false, true); + break; + } case Action::GET_INFO: { SetTempVarValue( "conditionCount", @@ -210,6 +219,9 @@ void MacroActionMacro::LogAction() const case Action::GET_INFO: ablog(LOG_INFO, "get info for \"%s\"", macro->Name().c_str()); break; + case Action::RUN_MACRO: + ablog(LOG_INFO, "run macro \"%s\"", macro->Name().c_str()); + break; default: break; } @@ -403,7 +415,9 @@ static void populateActionSelection(QComboBox *list) {MacroActionMacro::Action::NESTED_MACRO, "AdvSceneSwitcher.action.macro.type.nestedMacro"}, {MacroActionMacro::Action::RUN_ACTIONS, - "AdvSceneSwitcher.action.macro.type.run"}, + "AdvSceneSwitcher.action.macro.type.runActions"}, + {MacroActionMacro::Action::RUN_MACRO, + "AdvSceneSwitcher.action.macro.type.runMacro"}, {MacroActionMacro::Action::STOP, "AdvSceneSwitcher.action.macro.type.stop"}, {MacroActionMacro::Action::DISABLE_ACTION, @@ -483,6 +497,10 @@ MacroActionMacroEdit::MacroActionMacroEdit( _actionSections(new QComboBox(this)), _skipWhenPaused(new QCheckBox(obs_module_text( "AdvSceneSwitcher.action.macro.type.run.skipWhenPaused"))), + _noConditionsWarning(new QLabel(obs_module_text( + "AdvSceneSwitcher.action.macro.type.runMacro.noConditionsWarning"))), + _runMacroHelp(new HelpIcon(obs_module_text( + "AdvSceneSwitcher.action.macro.type.runMacro.help"))), _setInputs(new QCheckBox(obs_module_text( "AdvSceneSwitcher.action.macro.type.run.setInputs"))), _inputs(new MacroInputEdit()), @@ -556,6 +574,7 @@ MacroActionMacroEdit::MacroActionMacroEdit( layout->addLayout(_setInputsLayout); layout->addWidget(_inputs); layout->addWidget(_skipWhenPaused); + layout->addWidget(_noConditionsWarning); layout->addWidget(_nestedMacro); setLayout(layout); _entryData = entryData; @@ -725,6 +744,7 @@ void MacroActionMacroEdit::InputsChanged(const StringList &inputs) void MacroActionMacroEdit::SetWidgetVisibility() { _entryLayout->removeWidget(_actions); + _entryLayout->removeWidget(_runMacroHelp); _entryLayout->removeWidget(_actionIndex); _entryLayout->removeWidget(_macros); _entryLayout->removeWidget(_actionSections); @@ -740,6 +760,7 @@ void MacroActionMacroEdit::SetWidgetVisibility() const std::unordered_map placeholders = { {"{{actions}}", _actions}, + {"{{runMacroHelp}}", _runMacroHelp}, {"{{actionIndex}}", _actionIndex}, {"{{macros}}", _macros}, {"{{actionSections}}", _actionSections}, @@ -764,6 +785,9 @@ void MacroActionMacroEdit::SetWidgetVisibility() case MacroActionMacro::Action::GET_INFO: layoutText = "AdvSceneSwitcher.action.macro.layout.other"; break; + case MacroActionMacro::Action::RUN_MACRO: + layoutText = "AdvSceneSwitcher.action.macro.layout.runMacro"; + break; case MacroActionMacro::Action::RUN_ACTIONS: layoutText = "AdvSceneSwitcher.action.macro.layout.run"; break; @@ -790,7 +814,8 @@ void MacroActionMacroEdit::SetWidgetVisibility() } if (action == MacroActionMacro::Action::RUN_ACTIONS || - action == MacroActionMacro::Action::STOP) { + action == MacroActionMacro::Action::STOP || + action == MacroActionMacro::Action::RUN_MACRO) { _macros->HideSelectedMacro(); } else { _macros->ShowAllMacros(); @@ -835,8 +860,17 @@ void MacroActionMacroEdit::SetWidgetVisibility() _actionSections->setVisible( action == MacroActionMacro::Action::RUN_ACTIONS || isModifyingActionState); - _skipWhenPaused->setVisible(action == - MacroActionMacro::Action::RUN_ACTIONS); + _skipWhenPaused->setVisible( + action == MacroActionMacro::Action::RUN_ACTIONS || + action == MacroActionMacro::Action::RUN_MACRO); + + if (action == MacroActionMacro::Action::RUN_MACRO) { + auto macro = _entryData->_macro.GetMacro(); + _noConditionsWarning->setVisible(!macro || + macro->Conditions().empty()); + } else { + _noConditionsWarning->setVisible(false); + } _nestedMacro->setVisible(action == MacroActionMacro::Action::NESTED_MACRO); diff --git a/lib/macro/macro-action-macro.hpp b/lib/macro/macro-action-macro.hpp index d6334b30..057b8ab4 100644 --- a/lib/macro/macro-action-macro.hpp +++ b/lib/macro/macro-action-macro.hpp @@ -11,6 +11,7 @@ #include #include +#include namespace advss { @@ -57,6 +58,7 @@ public: TOGGLE_PAUSE, NESTED_MACRO, GET_INFO, + RUN_MACRO, }; void SetAction(Action); @@ -131,6 +133,8 @@ private: QCheckBox *_reevaluateConditionState; QComboBox *_actionSections; QCheckBox *_skipWhenPaused; + QLabel *_noConditionsWarning; + HelpIcon *_runMacroHelp; QCheckBox *_setInputs; MacroInputEdit *_inputs; QHBoxLayout *_entryLayout;