diff --git a/data/locale/de-DE.ini b/data/locale/de-DE.ini index a1a0cf15..84af4322 100644 --- a/data/locale/de-DE.ini +++ b/data/locale/de-DE.ini @@ -484,7 +484,7 @@ 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.stop="Aktionen stoppen" -AdvSceneSwitcher.action.macro.entry="{{actions}} {{macros}}" +AdvSceneSwitcher.action.macro.entry="{{actions}}{{actionIndex}}{{macros}}" AdvSceneSwitcher.action.pluginState="Plugin-Status" AdvSceneSwitcher.action.pluginState.type.stop="Erweiterten Automatischen Szenenwechsler stoppen" AdvSceneSwitcher.action.pluginState.type.noMatch="Ändern des Nichtübereinstimmungsverhaltens:" diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index dcc41b62..4665c135 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -569,7 +569,10 @@ AdvSceneSwitcher.action.macro.type.unpause="Unpause" AdvSceneSwitcher.action.macro.type.resetCounter="Reset counter" AdvSceneSwitcher.action.macro.type.run="Run actions" AdvSceneSwitcher.action.macro.type.stop="Stop actions" -AdvSceneSwitcher.action.macro.entry="{{actions}} {{macros}}" +AdvSceneSwitcher.action.macro.type.disableAction="Disable action" +AdvSceneSwitcher.action.macro.type.enableAction="Enable action" +AdvSceneSwitcher.action.macro.type.toggleAction="Toggle action" +AdvSceneSwitcher.action.macro.entry="{{actions}}{{actionIndex}}{{macros}}" AdvSceneSwitcher.action.pluginState="Plugin state" AdvSceneSwitcher.action.pluginState.type.stop="Stop the Advanced Scene Switcher plugin" AdvSceneSwitcher.action.pluginState.type.noMatch="Change the no-match behaviour:" diff --git a/data/locale/es-ES.ini b/data/locale/es-ES.ini index 76b7a516..282c20ba 100644 --- a/data/locale/es-ES.ini +++ b/data/locale/es-ES.ini @@ -400,7 +400,7 @@ AdvSceneSwitcher.action.macro.type.unpause="Reanudar" AdvSceneSwitcher.action.macro.type.resetCounter="Reiniciar contador" AdvSceneSwitcher.action.macro.type.run="Ejecutar" AdvSceneSwitcher.action.macro.type.stop="Detener" -AdvSceneSwitcher.action.macro.entry="{{actions}} {{macros}}" +AdvSceneSwitcher.action.macro.entry="{{actions}}{{actionIndex}}{{macros}}" AdvSceneSwitcher.action.pluginState="Estado del complemento" AdvSceneSwitcher.action.pluginState.type.stop="Detener el complemento Advanced Scene Switcher" AdvSceneSwitcher.action.pluginState.type.noMatch="Cambiar el comportamiento de no coincidencia:" diff --git a/data/locale/tr-TR.ini b/data/locale/tr-TR.ini index 9f4ae5d4..92200066 100644 --- a/data/locale/tr-TR.ini +++ b/data/locale/tr-TR.ini @@ -328,7 +328,7 @@ 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.entry="{{actions}} {{macros}}" +AdvSceneSwitcher.action.macro.entry="{{actions}}{{actionIndex}}{{macros}}" 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 a31c9ac1..619f07d3 100644 --- a/data/locale/zh-CN.ini +++ b/data/locale/zh-CN.ini @@ -535,7 +535,7 @@ AdvSceneSwitcher.action.macro.type.unpause="取消暂停" AdvSceneSwitcher.action.macro.type.resetCounter="复位计数器" AdvSceneSwitcher.action.macro.type.run="运行操作" AdvSceneSwitcher.action.macro.type.stop="停止操作" -AdvSceneSwitcher.action.macro.entry="{{actions}} {{macros}}" +AdvSceneSwitcher.action.macro.entry="{{actions}}{{actionIndex}}{{macros}}" AdvSceneSwitcher.action.pluginState="插件状态" AdvSceneSwitcher.action.pluginState.type.stop="停止高级场景切换插件" AdvSceneSwitcher.action.pluginState.type.noMatch="没有匹配项时:" diff --git a/src/macro-core/macro-action-edit.cpp b/src/macro-core/macro-action-edit.cpp index ddd59c01..2b61aaca 100644 --- a/src/macro-core/macro-action-edit.cpp +++ b/src/macro-core/macro-action-edit.cpp @@ -92,6 +92,8 @@ MacroActionEdit::MacroActionEdit(QWidget *parent, SLOT(ActionEnableChanged(bool))); QWidget::connect(window(), SIGNAL(HighlightActionsChanged(bool)), this, SLOT(EnableHighlight(bool))); + QWidget::connect(&_actionStateTimer, SIGNAL(timeout()), this, + SLOT(UpdateActionState())); populateActionSelection(_actionSelection); @@ -99,12 +101,12 @@ MacroActionEdit::MacroActionEdit(QWidget *parent, _section->AddHeaderWidget(_actionSelection); _section->AddHeaderWidget(_headerInfo); - QVBoxLayout *actionLayout = new QVBoxLayout; + auto actionLayout = new QVBoxLayout; actionLayout->setContentsMargins({7, 7, 7, 7}); actionLayout->addWidget(_section); _contentLayout->addLayout(actionLayout); - QHBoxLayout *mainLayout = new QHBoxLayout; + auto mainLayout = new QHBoxLayout; mainLayout->setContentsMargins(0, 0, 0, 0); mainLayout->setSpacing(0); mainLayout->addWidget(_frame); @@ -113,6 +115,7 @@ MacroActionEdit::MacroActionEdit(QWidget *parent, _entryData = entryData; UpdateEntryData(id); + _actionStateTimer.start(300); _loading = false; } @@ -164,7 +167,7 @@ void MacroActionEdit::SetEntryData(std::shared_ptr *data) _entryData = data; } -void advss::MacroActionEdit::SetDisableEffect(bool value) +void MacroActionEdit::SetDisableEffect(bool value) { if (value) { auto effect = new QGraphicsOpacityEffect(this); @@ -186,6 +189,21 @@ void MacroActionEdit::ActionEnableChanged(bool value) SetDisableEffect(!value); } +void MacroActionEdit::UpdateActionState() +{ + if (_loading || !_entryData) { + return; + } + + SetEnableAppearance((*_entryData)->Enabled()); +} + +void MacroActionEdit::SetEnableAppearance(bool value) +{ + _enable->setChecked(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 268740c1..4cdf09d2 100644 --- a/src/macro-core/macro-action-edit.hpp +++ b/src/macro-core/macro-action-edit.hpp @@ -47,15 +47,18 @@ public: private slots: void ActionSelectionChanged(const QString &text); void ActionEnableChanged(bool); + void UpdateActionState(); private: std::shared_ptr Data(); void SetDisableEffect(bool); + void SetEnableAppearance(bool); FilterComboBox *_actionSelection; SwitchButton *_enable; std::shared_ptr *_entryData; + QTimer _actionStateTimer; bool _loading = true; }; diff --git a/src/macro-core/macro-action-macro.cpp b/src/macro-core/macro-action-macro.cpp index a20fa544..6f620036 100644 --- a/src/macro-core/macro-action-macro.cpp +++ b/src/macro-core/macro-action-macro.cpp @@ -11,14 +11,23 @@ bool MacroActionMacro::_registered = MacroActionFactory::Register( {MacroActionMacro::Create, MacroActionMacroEdit::Create, "AdvSceneSwitcher.action.macro"}); -const static std::map actionTypes = { - {PerformMacroAction::PAUSE, "AdvSceneSwitcher.action.macro.type.pause"}, - {PerformMacroAction::UNPAUSE, +const static std::map actionTypes = { + {MacroActionMacro::Action::PAUSE, + "AdvSceneSwitcher.action.macro.type.pause"}, + {MacroActionMacro::Action::UNPAUSE, "AdvSceneSwitcher.action.macro.type.unpause"}, - {PerformMacroAction::RESET_COUNTER, + {MacroActionMacro::Action::RESET_COUNTER, "AdvSceneSwitcher.action.macro.type.resetCounter"}, - {PerformMacroAction::RUN, "AdvSceneSwitcher.action.macro.type.run"}, - {PerformMacroAction::STOP, "AdvSceneSwitcher.action.macro.type.stop"}, + {MacroActionMacro::Action::RUN, + "AdvSceneSwitcher.action.macro.type.run"}, + {MacroActionMacro::Action::STOP, + "AdvSceneSwitcher.action.macro.type.stop"}, + {MacroActionMacro::Action::DISABLE_ACTION, + "AdvSceneSwitcher.action.macro.type.disableAction"}, + {MacroActionMacro::Action::ENABLE_ACTION, + "AdvSceneSwitcher.action.macro.type.enableAction"}, + {MacroActionMacro::Action::TOGGLE_ACTION, + "AdvSceneSwitcher.action.macro.type.toggleAction"}, }; bool MacroActionMacro::PerformAction() @@ -29,23 +38,42 @@ bool MacroActionMacro::PerformAction() } switch (_action) { - case PerformMacroAction::PAUSE: + case Action::PAUSE: macro->SetPaused(); break; - case PerformMacroAction::UNPAUSE: + case Action::UNPAUSE: macro->SetPaused(false); break; - case PerformMacroAction::RESET_COUNTER: + case Action::RESET_COUNTER: macro->ResetRunCount(); break; - case PerformMacroAction::RUN: + case Action::RUN: if (!macro->Paused()) { macro->PerformActions(); } break; - case PerformMacroAction::STOP: + case Action::STOP: macro->Stop(); break; + case Action::DISABLE_ACTION: + if (IsValidMacroSegmentIndex(macro.get(), _actionIndex - 1, + false)) { + macro->Actions().at(_actionIndex - 1)->SetEnabled(false); + } + break; + case Action::ENABLE_ACTION: + if (IsValidMacroSegmentIndex(macro.get(), _actionIndex - 1, + false)) { + macro->Actions().at(_actionIndex - 1)->SetEnabled(true); + } + break; + case Action::TOGGLE_ACTION: + if (IsValidMacroSegmentIndex(macro.get(), _actionIndex - 1, + false)) { + auto action = macro->Actions().at(_actionIndex - 1); + action->SetEnabled(!action->Enabled()); + } + break; default: break; } @@ -59,23 +87,35 @@ void MacroActionMacro::LogAction() const return; } switch (_action) { - case PerformMacroAction::PAUSE: + case Action::PAUSE: vblog(LOG_INFO, "paused \"%s\"", macro->Name().c_str()); break; - case PerformMacroAction::UNPAUSE: + case Action::UNPAUSE: vblog(LOG_INFO, "unpaused \"%s\"", macro->Name().c_str()); break; - case PerformMacroAction::RESET_COUNTER: + case Action::RESET_COUNTER: vblog(LOG_INFO, "reset counter for \"%s\"", macro->Name().c_str()); break; - case PerformMacroAction::RUN: + case Action::RUN: vblog(LOG_INFO, "run nested macro \"%s\"", macro->Name().c_str()); break; - case PerformMacroAction::STOP: + case Action::STOP: vblog(LOG_INFO, "stopped macro \"%s\"", macro->Name().c_str()); break; + case Action::DISABLE_ACTION: + vblog(LOG_INFO, "disabled action %d of macro \"%s\"", + _actionIndex.GetValue(), macro->Name().c_str()); + break; + case Action::ENABLE_ACTION: + vblog(LOG_INFO, "enabled action %d of macro \"%s\"", + _actionIndex.GetValue(), macro->Name().c_str()); + break; + case Action::TOGGLE_ACTION: + vblog(LOG_INFO, "toggled action %d of macro \"%s\"", + _actionIndex.GetValue(), macro->Name().c_str()); + break; default: break; } @@ -85,6 +125,7 @@ bool MacroActionMacro::Save(obs_data_t *obj) const { MacroAction::Save(obj); _macro.Save(obj); + _actionIndex.Save(obj, "actionIndex"); obs_data_set_int(obj, "action", static_cast(_action)); return true; } @@ -93,7 +134,8 @@ bool MacroActionMacro::Load(obs_data_t *obj) { MacroAction::Load(obj); _macro.Load(obj); - _action = static_cast( + _actionIndex.Load(obj, "actionIndex"); + _action = static_cast( obs_data_get_int(obj, "action")); return true; } @@ -112,25 +154,28 @@ static inline void populateActionSelection(QComboBox *list) MacroActionMacroEdit::MacroActionMacroEdit( QWidget *parent, std::shared_ptr entryData) - : QWidget(parent) + : QWidget(parent), + _macros(new MacroSelection(parent)), + _actionIndex(new MacroSegmentSelection( + this, MacroSegmentSelection::Type::ACTION)), + _actions(new QComboBox()) { - _macros = new MacroSelection(parent); - _actions = new QComboBox(); - populateActionSelection(_actions); QWidget::connect(_macros, SIGNAL(currentTextChanged(const QString &)), this, SLOT(MacroChanged(const QString &))); QWidget::connect(_actions, SIGNAL(currentIndexChanged(int)), this, SLOT(ActionChanged(int))); + QWidget::connect(_actionIndex, + SIGNAL(SelectionChanged(const IntVariable &)), this, + SLOT(ActionIndexChanged(const IntVariable &))); - QHBoxLayout *mainLayout = new QHBoxLayout; - std::unordered_map widgetPlaceholders = { - {"{{actions}}", _actions}, - {"{{macros}}", _macros}, - }; + auto mainLayout = new QHBoxLayout; PlaceWidgets(obs_module_text("AdvSceneSwitcher.action.macro.entry"), - mainLayout, widgetPlaceholders); + mainLayout, + {{"{{actions}}", _actions}, + {"{{actionIndex}}", _actionIndex}, + {"{{macros}}", _macros}}); setLayout(mainLayout); _entryData = entryData; @@ -144,11 +189,10 @@ void MacroActionMacroEdit::UpdateEntryData() return; } _actions->setCurrentIndex(static_cast(_entryData->_action)); + _actionIndex->SetValue(_entryData->_actionIndex); + _actionIndex->SetMacro(_entryData->_macro.GetMacro()); _macros->SetCurrentMacro(_entryData->_macro); - if (_entryData->_action == PerformMacroAction::RUN || - _entryData->_action == PerformMacroAction::STOP) { - _macros->HideSelectedMacro(); - } + SetWidgetVisibility(); } void MacroActionMacroEdit::MacroChanged(const QString &text) @@ -159,6 +203,7 @@ void MacroActionMacroEdit::MacroChanged(const QString &text) auto lock = LockContext(); _entryData->_macro = text; + _actionIndex->SetMacro(_entryData->_macro.GetMacro()); emit HeaderInfoChanged( QString::fromStdString(_entryData->GetShortDesc())); } @@ -170,14 +215,36 @@ void MacroActionMacroEdit::ActionChanged(int value) } auto lock = LockContext(); - _entryData->_action = static_cast(value); + _entryData->_action = static_cast(value); + SetWidgetVisibility(); +} - if (_entryData->_action == PerformMacroAction::RUN || - _entryData->_action == PerformMacroAction::STOP) { +void MacroActionMacroEdit::ActionIndexChanged(const IntVariable &value) +{ + if (_loading || !_entryData) { + return; + } + + auto lock = LockContext(); + _entryData->_actionIndex = value; +} + +void MacroActionMacroEdit::SetWidgetVisibility() +{ + if (_entryData->_action == MacroActionMacro::Action::RUN || + _entryData->_action == MacroActionMacro::Action::STOP) { _macros->HideSelectedMacro(); } else { _macros->ShowAllMacros(); } + + const bool isModifyingActionState = + _entryData->_action == + MacroActionMacro::Action::DISABLE_ACTION || + _entryData->_action == + MacroActionMacro::Action::ENABLE_ACTION || + _entryData->_action == MacroActionMacro::Action::TOGGLE_ACTION; + _actionIndex->setVisible(isModifyingActionState); } } // namespace advss diff --git a/src/macro-core/macro-action-macro.hpp b/src/macro-core/macro-action-macro.hpp index 0cc175e3..d64c06e6 100644 --- a/src/macro-core/macro-action-macro.hpp +++ b/src/macro-core/macro-action-macro.hpp @@ -1,19 +1,12 @@ #pragma once #include "macro-action-edit.hpp" #include "macro-selection.hpp" +#include "macro-segment-selection.hpp" #include namespace advss { -enum class PerformMacroAction { - PAUSE, - UNPAUSE, - RESET_COUNTER, - RUN, - STOP, -}; - class MacroActionMacro : public MacroRefAction { public: MacroActionMacro(Macro *m) : MacroAction(m), MacroRefAction(m) {} @@ -28,7 +21,18 @@ public: return std::make_shared(m); } - PerformMacroAction _action = PerformMacroAction::PAUSE; + enum class Action { + PAUSE, + UNPAUSE, + RESET_COUNTER, + RUN, + STOP, + DISABLE_ACTION, + ENABLE_ACTION, + TOGGLE_ACTION, + }; + Action _action = Action::PAUSE; + IntVariable _actionIndex = 1; private: static bool _registered; @@ -54,16 +58,19 @@ public: private slots: void MacroChanged(const QString &text); void ActionChanged(int value); + void ActionIndexChanged(const IntVariable &value); signals: void HeaderInfoChanged(const QString &); protected: MacroSelection *_macros; + MacroSegmentSelection *_actionIndex; QComboBox *_actions; std::shared_ptr _entryData; private: - QHBoxLayout *_mainLayout; + void SetWidgetVisibility(); + bool _loading = true; };