diff --git a/src/macro-core/macro-action-edit.cpp b/src/macro-core/macro-action-edit.cpp index 5475d32c..ddd59c01 100644 --- a/src/macro-core/macro-action-edit.cpp +++ b/src/macro-core/macro-action-edit.cpp @@ -3,8 +3,11 @@ #include "macro-action-edit.hpp" #include "macro-action-scene-switch.hpp" #include "section.hpp" +#include "switch-button.hpp" #include "utility.hpp" +#include + namespace advss { std::map &MacroActionFactory::GetMap() @@ -79,16 +82,20 @@ MacroActionEdit::MacroActionEdit(QWidget *parent, const std::string &id) : MacroSegmentEdit(switcher->macroProperties._highlightActions, parent), _actionSelection(new FilterComboBox()), + _enable(new SwitchButton()), _entryData(entryData) { QWidget::connect(_actionSelection, SIGNAL(currentTextChanged(const QString &)), this, SLOT(ActionSelectionChanged(const QString &))); + QWidget::connect(_enable, SIGNAL(checked(bool)), this, + SLOT(ActionEnableChanged(bool))); QWidget::connect(window(), SIGNAL(HighlightActionsChanged(bool)), this, SLOT(EnableHighlight(bool))); populateActionSelection(_actionSelection); + _section->AddHeaderWidget(_enable); _section->AddHeaderWidget(_actionSelection); _section->AddHeaderWidget(_headerInfo); @@ -140,6 +147,9 @@ void MacroActionEdit::UpdateEntryData(const std::string &id) { _actionSelection->setCurrentText( obs_module_text(MacroActionFactory::GetActionName(id).c_str())); + const bool enabled = (*_entryData)->Enabled(); + _enable->setChecked(enabled); + SetDisableEffect(!enabled); auto widget = MacroActionFactory::CreateWidget(id, this, *_entryData); QWidget::connect(widget, SIGNAL(HeaderInfoChanged(const QString &)), this, SLOT(HeaderInfoChanged(const QString &))); @@ -154,6 +164,28 @@ void MacroActionEdit::SetEntryData(std::shared_ptr *data) _entryData = data; } +void advss::MacroActionEdit::SetDisableEffect(bool value) +{ + if (value) { + auto effect = new QGraphicsOpacityEffect(this); + effect->setOpacity(0.5); + _section->setGraphicsEffect(effect); + } else { + _section->setGraphicsEffect(nullptr); + } +} + +void MacroActionEdit::ActionEnableChanged(bool value) +{ + if (_loading || !_entryData) { + return; + } + + std::lock_guard lock(switcher->m); + (*_entryData)->SetEnabled(value); + SetDisableEffect(!value); +} + std::shared_ptr MacroActionEdit::Data() { return *_entryData; diff --git a/src/macro-core/macro-action-edit.hpp b/src/macro-core/macro-action-edit.hpp index 4ba4cfcf..268740c1 100644 --- a/src/macro-core/macro-action-edit.hpp +++ b/src/macro-core/macro-action-edit.hpp @@ -6,6 +6,8 @@ namespace advss { +class SwitchButton; + struct MacroActionInfo { using TCreateMethod = std::shared_ptr (*)(Macro *m); using TCreateWidgetMethod = QWidget *(*)(QWidget *parent, @@ -44,11 +46,14 @@ public: private slots: void ActionSelectionChanged(const QString &text); + void ActionEnableChanged(bool); private: std::shared_ptr Data(); + void SetDisableEffect(bool); FilterComboBox *_actionSelection; + SwitchButton *_enable; std::shared_ptr *_entryData; bool _loading = true; diff --git a/src/macro-core/macro-action.cpp b/src/macro-core/macro-action.cpp index cb21952d..c23b0dbe 100644 --- a/src/macro-core/macro-action.cpp +++ b/src/macro-core/macro-action.cpp @@ -11,12 +11,15 @@ bool MacroAction::Save(obs_data_t *obj) const { MacroSegment::Save(obj); obs_data_set_string(obj, "id", GetId().c_str()); + obs_data_set_bool(obj, "enabled", _enabled); return true; } bool MacroAction::Load(obs_data_t *obj) { MacroSegment::Load(obj); + obs_data_set_default_bool(obj, "enabled", true); + _enabled = obs_data_get_bool(obj, "enabled"); return true; } @@ -25,6 +28,16 @@ void MacroAction::LogAction() const vblog(LOG_INFO, "performed action %s", GetId().c_str()); } +void MacroAction::SetEnabled(bool value) +{ + _enabled = value; +} + +bool MacroAction::Enabled() const +{ + return _enabled; +} + MacroRefAction::MacroRefAction(Macro *m, bool supportsVariableValue) : MacroAction(m, supportsVariableValue) { diff --git a/src/macro-core/macro-action.hpp b/src/macro-core/macro-action.hpp index 7898e302..21e8df7b 100644 --- a/src/macro-core/macro-action.hpp +++ b/src/macro-core/macro-action.hpp @@ -12,6 +12,11 @@ public: virtual bool Save(obs_data_t *obj) const = 0; virtual bool Load(obs_data_t *obj) = 0; virtual void LogAction() const; + void SetEnabled(bool); + bool Enabled() const; + +private: + bool _enabled = true; }; class MacroRefAction : virtual public MacroAction { diff --git a/src/macro-core/macro.cpp b/src/macro-core/macro.cpp index ec62e365..62aa74cb 100644 --- a/src/macro-core/macro.cpp +++ b/src/macro-core/macro.cpp @@ -255,13 +255,20 @@ void Macro::RunActions(bool &retVal, bool ignorePause) { bool ret = true; for (auto &a : _actions) { - a->LogAction(); - ret = ret && a->PerformAction(); + if (a->Enabled()) { + a->LogAction(); + ret = ret && a->PerformAction(); + } else { + vblog(LOG_INFO, "skipping disabled action %s", + a->GetId().c_str()); + } if (!ret || (_paused && !ignorePause) || _stop || _die) { retVal = ret; break; } - a->SetHighlight(); + if (a->Enabled()) { + a->SetHighlight(); + } } _done = true; }