From d6e4ee0203d6eb5ad5fdbfb34905e30680aec727 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Wed, 13 Sep 2023 10:39:44 +0200 Subject: [PATCH] Add option to run "else" actions using the "Run macros" button If there are else actions to run holding control and clicking the "Run macros" button will allow you to test them. --- CMakeLists.txt | 2 + data/locale/en-US.ini | 1 + forms/advanced-scene-switcher.ui | 7 ++- src/advanced-scene-switcher.hpp | 1 - src/macro-core/macro-tab.cpp | 16 +------ src/utils/macro-run-button.cpp | 82 ++++++++++++++++++++++++++++++++ src/utils/macro-run-button.hpp | 29 +++++++++++ 7 files changed, 121 insertions(+), 17 deletions(-) create mode 100644 src/utils/macro-run-button.cpp create mode 100644 src/utils/macro-run-button.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 3833e83a..969abb2b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -268,6 +268,8 @@ target_sources( src/utils/macro-export-import-dialog.hpp src/utils/macro-list.cpp src/utils/macro-list.hpp + src/utils/macro-run-button.cpp + src/utils/macro-run-button.hpp src/utils/macro-segment-selection.cpp src/utils/macro-segment-selection.hpp src/utils/math-helpers.cpp diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 81179a02..1cae4792 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -79,6 +79,7 @@ AdvSceneSwitcher.macroTab.edit.action="Action type:" AdvSceneSwitcher.macroTab.add="Add new macro" AdvSceneSwitcher.macroTab.name="Name:" AdvSceneSwitcher.macroTab.run="Run macro" +AdvSceneSwitcher.macroTab.runElse="Run macro (else)" AdvSceneSwitcher.macroTab.runFail="Running \"%1\" failed!\nEither one of the actions failed or the macro is running already." AdvSceneSwitcher.macroTab.runInParallel="Run macro in parallel to other macros" AdvSceneSwitcher.macroTab.onChange="Perform actions only on condition change" diff --git a/forms/advanced-scene-switcher.ui b/forms/advanced-scene-switcher.ui index 3e418ba9..9a37330c 100644 --- a/forms/advanced-scene-switcher.ui +++ b/forms/advanced-scene-switcher.ui @@ -843,7 +843,7 @@ - + AdvSceneSwitcher.macroTab.run @@ -4849,6 +4849,11 @@
macro-segment-list.hpp
1 + + advss::MacroRunButton + QPushButton +
macro-run-button.hpp
+
diff --git a/src/advanced-scene-switcher.hpp b/src/advanced-scene-switcher.hpp index 967fb9ef..161d330c 100644 --- a/src/advanced-scene-switcher.hpp +++ b/src/advanced-scene-switcher.hpp @@ -101,7 +101,6 @@ public slots: void on_macroUp_clicked(); void on_macroDown_clicked(); void on_macroName_editingFinished(); - void on_runMacro_clicked(); void on_runMacroInParallel_stateChanged(int value); void on_runMacroOnChange_stateChanged(int value); void on_conditionAdd_clicked(); diff --git a/src/macro-core/macro-tab.cpp b/src/macro-core/macro-tab.cpp index 3f6e8d46..4bb78bd8 100644 --- a/src/macro-core/macro-tab.cpp +++ b/src/macro-core/macro-tab.cpp @@ -451,21 +451,6 @@ void AdvSceneSwitcher::on_macroName_editingFinished() RenameMacro(macro, newName); } -void AdvSceneSwitcher::on_runMacro_clicked() -{ - auto macro = GetSelectedMacro(); - if (!macro) { - return; - } - - bool ret = macro->PerformActions(true, true, true); - if (!ret) { - QString err = - obs_module_text("AdvSceneSwitcher.macroTab.runFail"); - DisplayMessage(err.arg(QString::fromStdString(macro->Name()))); - } -} - void AdvSceneSwitcher::on_runMacroInParallel_stateChanged(int value) { auto macro = GetSelectedMacro(); @@ -792,6 +777,7 @@ void AdvSceneSwitcher::SetupMacroTab() SLOT(MacroSelectionAboutToChange())); connect(ui->macros, SIGNAL(MacroSelectionChanged()), this, SLOT(MacroSelectionChanged())); + ui->runMacro->SetMacroTree(ui->macros); ui->conditionsList->SetHelpMsg( obs_module_text("AdvSceneSwitcher.macroTab.editConditionHelp")); diff --git a/src/utils/macro-run-button.cpp b/src/utils/macro-run-button.cpp new file mode 100644 index 00000000..88ad59eb --- /dev/null +++ b/src/utils/macro-run-button.cpp @@ -0,0 +1,82 @@ +#include "macro-run-button.hpp" +#include "macro-tree.hpp" +#include "macro.hpp" +#include "obs-module-helper.hpp" +#include "utility.hpp" + +#include + +namespace advss { + +MacroRunButton::MacroRunButton(QWidget *parent) : QPushButton(parent) +{ + if (window()) { + window()->installEventFilter(this); + } + QWidget::connect(this, SIGNAL(pressed()), this, SLOT(Pressed())); +} + +void MacroRunButton::SetMacroTree(MacroTree *macros) +{ + _macros = macros; + QWidget::connect(macros, SIGNAL(MacroSelectionChanged()), this, + SLOT(MacroSelectionChanged())); + QWidget::connect(&_timer, &QTimer::timeout, this, + [this]() { MacroSelectionChanged(); }); + _timer.start(1000); +} + +void MacroRunButton::MacroSelectionChanged() +{ + auto macro = _macros->GetCurrentMacro(); + if (!macro) { + _macroHasElseActions = false; + return; + } + _macroHasElseActions = macro->ElseActions().size() > 0; +} + +bool MacroRunButton::eventFilter(QObject *obj, QEvent *event) +{ + if (!_macroHasElseActions) { + setText(obs_module_text("AdvSceneSwitcher.macroTab.run")); + _runElseActionsKeyHeld = false; + return QPushButton::eventFilter(obj, event); + } + + if (event->type() == QEvent::KeyPress) { + QKeyEvent *keyEvent = static_cast(event); + if (keyEvent->key() == Qt::Key_Control) { + setText(obs_module_text( + "AdvSceneSwitcher.macroTab.runElse")); + _runElseActionsKeyHeld = true; + } + } else if (event->type() == QEvent::KeyRelease) { + QKeyEvent *keyEvent = static_cast(event); + if (keyEvent->key() == Qt::Key_Control) { + setText(obs_module_text( + "AdvSceneSwitcher.macroTab.run")); + _runElseActionsKeyHeld = false; + } + } + return QPushButton::eventFilter(obj, event); +} + +void MacroRunButton::Pressed() +{ + auto macro = _macros->GetCurrentMacro(); + if (!macro) { + return; + } + + bool ret = _runElseActionsKeyHeld + ? macro->PerformActions(false, true, true) + : macro->PerformActions(true, true, true); + if (!ret) { + QString err = + obs_module_text("AdvSceneSwitcher.macroTab.runFail"); + DisplayMessage(err.arg(QString::fromStdString(macro->Name()))); + } +} + +} // namespace advss diff --git a/src/utils/macro-run-button.hpp b/src/utils/macro-run-button.hpp new file mode 100644 index 00000000..c68bd2bc --- /dev/null +++ b/src/utils/macro-run-button.hpp @@ -0,0 +1,29 @@ +#pragma once +#include +#include + +namespace advss { + +class MacroTree; + +class MacroRunButton : public QPushButton { + Q_OBJECT +public: + MacroRunButton(QWidget *parent = nullptr); + void SetMacroTree(MacroTree *); + +protected: + bool eventFilter(QObject *obj, QEvent *event) override; + +private slots: + void MacroSelectionChanged(); + void Pressed(); + +private: + MacroTree *_macros = nullptr; + bool _macroHasElseActions = false; + bool _runElseActionsKeyHeld = false; + QTimer _timer; +}; + +} // namespace advss