From cc067de021384294eb9085b260adb43ad622a206 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Sat, 19 Jun 2021 16:09:20 +0200 Subject: [PATCH] Expand macro action plugin-state to support changing no-match behaviour --- data/locale/en-US.ini | 3 +- src/headers/macro-action-plugin-state.hpp | 8 +++ src/macro-action-plugin-state.cpp | 85 +++++++++++++++++++++++ 3 files changed, 95 insertions(+), 1 deletion(-) diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 43506e32..6552dddb 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -245,7 +245,8 @@ AdvSceneSwitcher.action.macro.type.resetCounter="Reset counter" AdvSceneSwitcher.action.macro.entry="{{actions}} {{macros}}" AdvSceneSwitcher.action.pluginState="Plugin state" AdvSceneSwitcher.action.pluginState.type.stop="Stop the Advanced Scene Switcher plugin" -AdvSceneSwitcher.action.pluginState.entry="{{actions}}" +AdvSceneSwitcher.action.pluginState.type.noMatch="Change the no-match behaviour:" +AdvSceneSwitcher.action.pluginState.entry="{{actions}} {{values}} {{scenes}}" AdvSceneSwitcher.action.virtualCamera="Virtual camera" AdvSceneSwitcher.action.virtualCamera.type.stop="Stop virtual camera" AdvSceneSwitcher.action.virtualCamera.type.start="Start virtual camera" diff --git a/src/headers/macro-action-plugin-state.hpp b/src/headers/macro-action-plugin-state.hpp index fd4dcb7c..d0e30a4c 100644 --- a/src/headers/macro-action-plugin-state.hpp +++ b/src/headers/macro-action-plugin-state.hpp @@ -4,6 +4,7 @@ enum class PluginStateAction { STOP, + NO_MATCH_BEHAVIOUR, }; class MacroActionPluginState : public MacroAction { @@ -19,6 +20,8 @@ public: } PluginStateAction _action = PluginStateAction::STOP; + int _value = 0; + OBSWeakSource _scene; private: static bool _registered; @@ -44,12 +47,17 @@ public: private slots: void ActionChanged(int value); + void ValueChanged(int value); + void SceneChanged(const QString &text); protected: QComboBox *_actions; + QComboBox *_values; + QComboBox *_scenes; std::shared_ptr _entryData; private: + void SetWidgetVisibility(PluginStateAction, int); QHBoxLayout *_mainLayout; bool _loading = true; }; diff --git a/src/macro-action-plugin-state.cpp b/src/macro-action-plugin-state.cpp index c2c011a5..85eeea96 100644 --- a/src/macro-action-plugin-state.cpp +++ b/src/macro-action-plugin-state.cpp @@ -14,6 +14,17 @@ bool MacroActionPluginState::_registered = MacroActionFactory::Register( const static std::map actionTypes = { {PluginStateAction::STOP, "AdvSceneSwitcher.action.pluginState.type.stop"}, + {PluginStateAction::NO_MATCH_BEHAVIOUR, + "AdvSceneSwitcher.action.pluginState.type.noMatch"}, +}; + +const static std::map noMatchValues = { + {NO_SWITCH, + "AdvSceneSwitcher.generalTab.generalBehavior.onNoMet.dontSwitch"}, + {SWITCH, + "AdvSceneSwitcher.generalTab.generalBehavior.onNoMet.switchTo"}, + {RANDOM_SWITCH, + "AdvSceneSwitcher.generalTab.generalBehavior.onNoMet.switchToRandom"}, }; void stopPlugin() @@ -22,12 +33,23 @@ void stopPlugin() t.detach(); } +void setNoMatchBehaviour(int value, OBSWeakSource &scene) +{ + switcher->switchIfNotMatching = static_cast(value); + if (switcher->switchIfNotMatching == SWITCH) { + switcher->nonMatchingScene = scene; + } +} + bool MacroActionPluginState::PerformAction() { switch (_action) { case PluginStateAction::STOP: stopPlugin(); break; + case PluginStateAction::NO_MATCH_BEHAVIOUR: + setNoMatchBehaviour(_value, _scene); + break; default: break; } @@ -52,6 +74,8 @@ bool MacroActionPluginState::Save(obs_data_t *obj) { MacroAction::Save(obj); obs_data_set_int(obj, "action", static_cast(_action)); + obs_data_set_int(obj, "value", _value); + obs_data_set_string(obj, "scene", GetWeakSourceName(_scene).c_str()); return true; } @@ -60,6 +84,9 @@ bool MacroActionPluginState::Load(obs_data_t *obj) MacroAction::Load(obj); _action = static_cast(obs_data_get_int(obj, "action")); + _value = obs_data_get_int(obj, "value"); + const char *sceneName = obs_data_get_string(obj, "scene"); + _scene = GetWeakSourceByName(sceneName); return true; } @@ -70,20 +97,39 @@ static inline void populateActionSelection(QComboBox *list) } } +static inline void populateValueSelection(QComboBox *list, + PluginStateAction action) +{ + if (action == PluginStateAction::NO_MATCH_BEHAVIOUR) { + for (auto entry : noMatchValues) { + list->addItem(obs_module_text(entry.second.c_str())); + } + } +} + MacroActionPluginStateEdit::MacroActionPluginStateEdit( QWidget *parent, std::shared_ptr entryData) : QWidget(parent) { _actions = new QComboBox(); + _values = new QComboBox(); + _scenes = new QComboBox(); populateActionSelection(_actions); + populateSceneSelection(_scenes); QWidget::connect(_actions, SIGNAL(currentIndexChanged(int)), this, SLOT(ActionChanged(int))); + QWidget::connect(_values, SIGNAL(currentIndexChanged(int)), this, + SLOT(ValueChanged(int))); + QWidget::connect(_scenes, SIGNAL(currentTextChanged(const QString &)), + this, SLOT(SceneChanged(const QString &))); QHBoxLayout *mainLayout = new QHBoxLayout; std::unordered_map widgetPlaceholders = { {"{{actions}}", _actions}, + {"{{values}}", _values}, + {"{{scenes}}", _scenes}, }; placeWidgets( obs_module_text("AdvSceneSwitcher.action.pluginState.entry"), @@ -101,6 +147,10 @@ void MacroActionPluginStateEdit::UpdateEntryData() return; } _actions->setCurrentIndex(static_cast(_entryData->_action)); + populateValueSelection(_values, _entryData->_action); + _values->setCurrentIndex(_entryData->_value); + _scenes->setCurrentText(GetWeakSourceName(_entryData->_scene).c_str()); + SetWidgetVisibility(_entryData->_action, _entryData->_value); } void MacroActionPluginStateEdit::ActionChanged(int value) @@ -111,4 +161,39 @@ void MacroActionPluginStateEdit::ActionChanged(int value) std::lock_guard lock(switcher->m); _entryData->_action = static_cast(value); + SetWidgetVisibility(_entryData->_action, _entryData->_value); +} + +void MacroActionPluginStateEdit::ValueChanged(int value) +{ + if (_loading || !_entryData) { + return; + } + + std::lock_guard lock(switcher->m); + _entryData->_value = value; + SetWidgetVisibility(_entryData->_action, _entryData->_value); +} + +void MacroActionPluginStateEdit::SceneChanged(const QString &text) +{ + if (_loading || !_entryData) { + return; + } + + std::lock_guard lock(switcher->m); + _entryData->_scene = GetWeakSourceByQString(text); +} + +void MacroActionPluginStateEdit::SetWidgetVisibility(PluginStateAction action, + int value) +{ + _values->hide(); + _scenes->hide(); + if (action == PluginStateAction::NO_MATCH_BEHAVIOUR) { + _values->show(); + if ((NoMatch)value == SWITCH) { + _scenes->show(); + } + } }