From 4eafbb8f18253aad4eaf45c07407ae6a2883bdc7 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Sat, 24 Dec 2022 01:38:01 +0100 Subject: [PATCH] Improve plugin state action Add options to check for ... * Initial plugin start * Plugin restart * Scene collection change --- data/locale/en-US.ini | 7 +- src/advanced-scene-switcher.cpp | 3 + .../macro-condition-plugin-state.cpp | 95 ++++++++++++++----- .../macro-condition-plugin-state.hpp | 22 +++-- src/switcher-data-structs.hpp | 2 + 5 files changed, 94 insertions(+), 35 deletions(-) diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index ad2426bd..7ded066c 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -218,9 +218,12 @@ AdvSceneSwitcher.condition.process.entry.focus="Current foreground process: {{fo AdvSceneSwitcher.condition.idle="Idle" AdvSceneSwitcher.condition.idle.entry="No keyboard or mouse inputs for {{duration}}" AdvSceneSwitcher.condition.pluginState="Plugin state" -AdvSceneSwitcher.condition.pluginState.state.sceneSwitched="Automated scene change was triggered in this interval" -AdvSceneSwitcher.condition.pluginState.state.running="Advanced scene switcher is running" +AdvSceneSwitcher.condition.pluginState.state.start="Plugin started" +AdvSceneSwitcher.condition.pluginState.state.restart="Plugin restarted" +AdvSceneSwitcher.condition.pluginState.state.running="Plugin is running" AdvSceneSwitcher.condition.pluginState.state.shutdown="OBS is shutting down" +AdvSceneSwitcher.condition.pluginState.state.sceneCollection="Scene collection loaded" +AdvSceneSwitcher.condition.pluginState.state.sceneSwitched="Scene changed by previous macro" AdvSceneSwitcher.condition.pluginState.entry="{{condition}}" AdvSceneSwitcher.condition.timer="Timer" AdvSceneSwitcher.condition.timer.type.fixed="Fixed" diff --git a/src/advanced-scene-switcher.cpp b/src/advanced-scene-switcher.cpp index 5c64444e..6c396b2e 100644 --- a/src/advanced-scene-switcher.cpp +++ b/src/advanced-scene-switcher.cpp @@ -151,6 +151,7 @@ void SwitcherData::Thread() std::chrono::milliseconds duration; auto startTime = std::chrono::high_resolution_clock::now(); auto endTime = std::chrono::high_resolution_clock::now(); + switcher->firstIntervalAfterStop = true; while (true) { std::unique_lock lock(m); @@ -251,6 +252,8 @@ void SwitcherData::Thread() } writeSceneInfoToFile(); + switcher->firstInterval = false; + switcher->firstIntervalAfterStop = false; } blog(LOG_INFO, "stopped"); diff --git a/src/macro-core/macro-condition-plugin-state.cpp b/src/macro-core/macro-condition-plugin-state.cpp index 79289cd1..6f2c3f1a 100644 --- a/src/macro-core/macro-condition-plugin-state.cpp +++ b/src/macro-core/macro-condition-plugin-state.cpp @@ -3,6 +3,8 @@ #include "utility.hpp" #include "advanced-scene-switcher.hpp" +const uint32_t MacroConditionPluginState::_version = 1; + const std::string MacroConditionPluginState::id = "plugin_state"; bool MacroConditionPluginState::_registered = MacroConditionFactory::Register( @@ -11,18 +13,25 @@ bool MacroConditionPluginState::_registered = MacroConditionFactory::Register( MacroConditionPluginStateEdit::Create, "AdvSceneSwitcher.condition.pluginState"}); -static std::map pluginStateConditionTypes = { - {PluginStateCondition::SCENE_SWITCHED, - "AdvSceneSwitcher.condition.pluginState.state.sceneSwitched"}, - {PluginStateCondition::RUNNING, - "AdvSceneSwitcher.condition.pluginState.state.running"}, - {PluginStateCondition::SHUTDOWN, - "AdvSceneSwitcher.condition.pluginState.state.shutdown"}, +static std::map + pluginStateConditionTypes = { + {MacroConditionPluginState::Condition::PLUGIN_START, + "AdvSceneSwitcher.condition.pluginState.state.start"}, + {MacroConditionPluginState::Condition::PLUGIN_RESTART, + "AdvSceneSwitcher.condition.pluginState.state.restart"}, + {MacroConditionPluginState::Condition::PLUGIN_RUNNING, + "AdvSceneSwitcher.condition.pluginState.state.running"}, + {MacroConditionPluginState::Condition::OBS_SHUTDOWN, + "AdvSceneSwitcher.condition.pluginState.state.shutdown"}, + {MacroConditionPluginState::Condition::SCENE_COLLECTION_CHANGE, + "AdvSceneSwitcher.condition.pluginState.state.sceneCollection"}, + {MacroConditionPluginState::Condition::PLUGIN_SCENE_CHANGE, + "AdvSceneSwitcher.condition.pluginState.state.sceneSwitched"}, }; MacroConditionPluginState::~MacroConditionPluginState() { - if (_condition == PluginStateCondition::SHUTDOWN) { + if (_condition == Condition::OBS_SHUTDOWN) { switcher->shutdownConditionCount--; } } @@ -30,14 +39,22 @@ MacroConditionPluginState::~MacroConditionPluginState() bool MacroConditionPluginState::CheckCondition() { switch (_condition) { - case PluginStateCondition::SCENE_SWITCHED: + case Condition::PLUGIN_SCENE_CHANGE: return switcher->macroSceneSwitched; - case PluginStateCondition::RUNNING: + case Condition::PLUGIN_RUNNING: return true; - case PluginStateCondition::SHUTDOWN: + case Condition::OBS_SHUTDOWN: return switcher->obsIsShuttingDown; - default: - break; + case Condition::PLUGIN_START: + return switcher->firstInterval; + case Condition::PLUGIN_RESTART: + return switcher->firstIntervalAfterStop; + case Condition::SCENE_COLLECTION_CHANGE: + if (_firstCheckAfterSceneCollectionChange) { + _firstCheckAfterSceneCollectionChange = false; + return true; + } + return false; } return false; } @@ -46,15 +63,39 @@ bool MacroConditionPluginState::Save(obs_data_t *obj) const { MacroCondition::Save(obj); obs_data_set_int(obj, "condition", static_cast(_condition)); + obs_data_set_int(obj, "version", _version); return true; } bool MacroConditionPluginState::Load(obs_data_t *obj) { MacroCondition::Load(obj); - _condition = static_cast( - obs_data_get_int(obj, "condition")); - if (_condition == PluginStateCondition::SHUTDOWN) { + + // TODO: Remove fallback for older version + if (!obs_data_has_user_value(obj, "version")) { + enum class PluginStateCondition { + SCENE_SWITCHED, + RUNNING, + SHUTDOWN, + }; + auto oldValue = static_cast( + obs_data_get_int(obj, "condition")); + switch (oldValue) { + case PluginStateCondition::SCENE_SWITCHED: + _condition = Condition::PLUGIN_SCENE_CHANGE; + break; + case PluginStateCondition::RUNNING: + _condition = Condition::PLUGIN_RUNNING; + break; + case PluginStateCondition::SHUTDOWN: + _condition = Condition::OBS_SHUTDOWN; + break; + } + } else { + _condition = static_cast( + obs_data_get_int(obj, "condition")); + } + if (_condition == Condition::OBS_SHUTDOWN) { switcher->shutdownConditionCount++; } return true; @@ -62,8 +103,9 @@ bool MacroConditionPluginState::Load(obs_data_t *obj) static inline void populateConditionSelection(QComboBox *list) { - for (auto entry : pluginStateConditionTypes) { - list->addItem(obs_module_text(entry.second.c_str())); + for (const auto &[action, name] : pluginStateConditionTypes) { + list->addItem(obs_module_text(name.c_str()), + static_cast(action)); } } @@ -86,9 +128,7 @@ MacroConditionPluginStateEdit::MacroConditionPluginStateEdit( switchLayout, widgetPlaceholders); QVBoxLayout *mainLayout = new QVBoxLayout; - mainLayout->addLayout(switchLayout); - setLayout(mainLayout); _entryData = entryData; @@ -96,18 +136,22 @@ MacroConditionPluginStateEdit::MacroConditionPluginStateEdit( _loading = false; } -void MacroConditionPluginStateEdit::ConditionChanged(int cond) +void MacroConditionPluginStateEdit::ConditionChanged(int idx) { if (_loading || !_entryData) { return; } std::lock_guard lock(switcher->m); - if (_entryData->_condition == PluginStateCondition::SHUTDOWN) { + if (_entryData->_condition == + MacroConditionPluginState::Condition::OBS_SHUTDOWN) { switcher->shutdownConditionCount--; } - _entryData->_condition = static_cast(cond); - if (_entryData->_condition == PluginStateCondition::SHUTDOWN) { + _entryData->_condition = + static_cast( + _condition->itemData(idx).toInt()); + if (_entryData->_condition == + MacroConditionPluginState::Condition::OBS_SHUTDOWN) { switcher->shutdownConditionCount++; } } @@ -118,5 +162,6 @@ void MacroConditionPluginStateEdit::UpdateEntryData() return; } - _condition->setCurrentIndex(static_cast(_entryData->_condition)); + _condition->setCurrentIndex( + _condition->findData(static_cast(_entryData->_condition))); } diff --git a/src/macro-core/macro-condition-plugin-state.hpp b/src/macro-core/macro-condition-plugin-state.hpp index e76a164e..42c0d3b8 100644 --- a/src/macro-core/macro-condition-plugin-state.hpp +++ b/src/macro-core/macro-condition-plugin-state.hpp @@ -3,12 +3,6 @@ #include #include -enum class PluginStateCondition { - SCENE_SWITCHED, - RUNNING, - SHUTDOWN, -}; - class MacroConditionPluginState : public MacroCondition { public: MacroConditionPluginState(Macro *m) : MacroCondition(m) {} @@ -22,9 +16,21 @@ public: return std::make_shared(m); } - PluginStateCondition _condition = PluginStateCondition::SCENE_SWITCHED; + enum class Condition { + PLUGIN_START, + PLUGIN_RESTART, + PLUGIN_RUNNING, + OBS_SHUTDOWN, + SCENE_COLLECTION_CHANGE, + PLUGIN_SCENE_CHANGE, + }; + + Condition _condition = Condition::PLUGIN_SCENE_CHANGE; private: + bool _firstCheckAfterSceneCollectionChange = true; + + const static uint32_t _version; static bool _registered; static const std::string id; }; @@ -47,7 +53,7 @@ public: } private slots: - void ConditionChanged(int cond); + void ConditionChanged(int idx); protected: QComboBox *_condition; diff --git a/src/switcher-data-structs.hpp b/src/switcher-data-structs.hpp index b45f0022..024c765e 100644 --- a/src/switcher-data-structs.hpp +++ b/src/switcher-data-structs.hpp @@ -137,6 +137,8 @@ struct SwitcherData { bool macroSceneSwitched = false; bool replayBufferSaved = false; bool obsIsShuttingDown = false; + bool firstInterval = true; + bool firstIntervalAfterStop = true; int shutdownConditionCount = 0; Curlhelper curl;