From d20a975c4fc5caad5217fdc7812a3d83ce0f8111 Mon Sep 17 00:00:00 2001 From: WarmUpTill <19472752+WarmUpTill@users.noreply.github.com> Date: Mon, 18 Aug 2025 19:05:31 +0200 Subject: [PATCH] Add option to enable / disable / toggle macro highlighting --- data/locale/en-US.ini | 3 + lib/utils/plugin-state-helpers.cpp | 27 +++++ lib/utils/plugin-state-helpers.hpp | 3 + plugins/base/macro-action-plugin-state.cpp | 113 +++++++++++++-------- plugins/base/macro-action-plugin-state.hpp | 27 ++--- 5 files changed, 116 insertions(+), 57 deletions(-) diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 41b19da1..22d88b66 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -982,6 +982,9 @@ AdvSceneSwitcher.action.pluginState.type.import="Import settings from" AdvSceneSwitcher.action.pluginState.importWarning="Note: Action will be ignored while settings window is opened." AdvSceneSwitcher.action.pluginState.type.terminate="Shut down OBS" AdvSceneSwitcher.action.pluginState.terminateConfirm="OBS will be shut down automatically in 10 seconds!\nDo you want to continue shutting down OBS?" +AdvSceneSwitcher.action.pluginState.type.enableMacroHighlighting="Enable macro highlighting" +AdvSceneSwitcher.action.pluginState.type.disableMacroHighlighting="Disable macro highlighting" +AdvSceneSwitcher.action.pluginState.type.toggleMacroHighlighting="Toggle macro highlighting" AdvSceneSwitcher.action.pluginState.entry="{{actions}}{{values}}{{scenes}}{{settings}}{{settingsWarning}}" AdvSceneSwitcher.action.virtualCamera="Virtual camera" AdvSceneSwitcher.action.virtualCamera.type.stop="Stop virtual camera" diff --git a/lib/utils/plugin-state-helpers.cpp b/lib/utils/plugin-state-helpers.cpp index f8889502..c1c98ce3 100644 --- a/lib/utils/plugin-state-helpers.cpp +++ b/lib/utils/plugin-state-helpers.cpp @@ -1,4 +1,5 @@ #include "plugin-state-helpers.hpp" +#include "advanced-scene-switcher.hpp" #include "switcher-data.hpp" namespace advss { @@ -231,4 +232,30 @@ bool IsFirstIntervalAfterStop() return GetSwitcher()->firstIntervalAfterStop; } +void SetMacroHighlightingEnabled(bool enable) +{ + auto &settings = GetGlobalMacroSettings(); + settings._highlightActions = enable; + settings._highlightConditions = enable; + settings._highlightExecuted = enable; + + obs_queue_task( + OBS_TASK_UI, + [](void *) { + if (!SettingsWindowIsOpened()) { + return; + } + AdvSceneSwitcher::window->HighlightMacrosChanged( + GetGlobalMacroSettings()._highlightExecuted); + }, + nullptr, false); +} + +bool IsMacroHighlightingEnabled() +{ + const auto &settings = GetGlobalMacroSettings(); + return settings._highlightActions || settings._highlightConditions || + settings._highlightExecuted; +} + } // namespace advss diff --git a/lib/utils/plugin-state-helpers.hpp b/lib/utils/plugin-state-helpers.hpp index 5135524c..58afcbe0 100644 --- a/lib/utils/plugin-state-helpers.hpp +++ b/lib/utils/plugin-state-helpers.hpp @@ -47,4 +47,7 @@ EXPORT bool InitialLoadIsComplete(); EXPORT bool IsFirstInterval(); EXPORT bool IsFirstIntervalAfterStop(); +EXPORT void SetMacroHighlightingEnabled(bool enable); +EXPORT bool IsMacroHighlightingEnabled(); + } // namespace advss diff --git a/plugins/base/macro-action-plugin-state.cpp b/plugins/base/macro-action-plugin-state.cpp index e1f680ef..4b2e8d3f 100644 --- a/plugins/base/macro-action-plugin-state.cpp +++ b/plugins/base/macro-action-plugin-state.cpp @@ -21,17 +21,6 @@ bool MacroActionPluginState::_registered = MacroActionFactory::Register( {MacroActionPluginState::Create, MacroActionPluginStateEdit::Create, "AdvSceneSwitcher.action.pluginState"}); -const static std::map actionTypes = { - {PluginStateAction::STOP, - "AdvSceneSwitcher.action.pluginState.type.stop"}, - {PluginStateAction::NO_MATCH_BEHAVIOUR, - "AdvSceneSwitcher.action.pluginState.type.noMatch"}, - {PluginStateAction::IMPORT_SETTINGS, - "AdvSceneSwitcher.action.pluginState.type.import"}, - {PluginStateAction::TERMINATE, - "AdvSceneSwitcher.action.pluginState.type.terminate"}, -}; - const static std::map noMatchValues = { {NoMatchBehavior::NO_SWITCH, "AdvSceneSwitcher.generalTab.generalBehavior.onNoMatch.dontSwitch"}, @@ -142,18 +131,18 @@ static void terminateOBS(void *) bool MacroActionPluginState::PerformAction() { switch (_action) { - case PluginStateAction::STOP: + case Action::STOP: stopPlugin(); break; - case PluginStateAction::NO_MATCH_BEHAVIOUR: + case Action::NO_MATCH_BEHAVIOUR: setNoMatchBehaviour(_value, _scene); break; - case PluginStateAction::IMPORT_SETTINGS: + case Action::IMPORT_SETTINGS: importSettings(_settingsPath); // There is no point in continuing // The settings will be invalid return false; - case PluginStateAction::TERMINATE: { + case Action::TERMINATE: { std::thread thread([]() { obs_queue_task(OBS_TASK_UI, terminateOBS, nullptr, false); @@ -161,6 +150,15 @@ bool MacroActionPluginState::PerformAction() thread.detach(); break; } + case Action::ENABLE_MACRO_HIGHLIGHTING: + SetMacroHighlightingEnabled(true); + break; + case Action::DISABLE_MACRO_HIGHLIGHTING: + SetMacroHighlightingEnabled(false); + break; + case Action::TOGGLE_MACRO_HIGHLIGHTING: + SetMacroHighlightingEnabled(!IsMacroHighlightingEnabled()); + break; default: break; } @@ -170,19 +168,28 @@ bool MacroActionPluginState::PerformAction() void MacroActionPluginState::LogAction() const { switch (_action) { - case PluginStateAction::STOP: + case Action::STOP: blog(LOG_INFO, "stop() called by macro"); break; - case PluginStateAction::NO_MATCH_BEHAVIOUR: + case Action::NO_MATCH_BEHAVIOUR: ablog(LOG_INFO, "setting no match to %d", _value); break; - case PluginStateAction::IMPORT_SETTINGS: + case Action::IMPORT_SETTINGS: ablog(LOG_INFO, "importing settings from %s", _settingsPath.c_str()); break; - case PluginStateAction::TERMINATE: + case Action::TERMINATE: ablog(LOG_INFO, "sending terminate signal to OBS in 10s"); break; + case Action::ENABLE_MACRO_HIGHLIGHTING: + ablog(LOG_INFO, "enable macro highlighting"); + break; + case Action::DISABLE_MACRO_HIGHLIGHTING: + ablog(LOG_INFO, "disable macro highlighting"); + break; + case Action::TOGGLE_MACRO_HIGHLIGHTING: + ablog(LOG_INFO, "toggle macro highlighting"); + break; default: blog(LOG_WARNING, "ignored unknown pluginState action %d", static_cast(_action)); @@ -203,8 +210,8 @@ bool MacroActionPluginState::Save(obs_data_t *obj) const bool MacroActionPluginState::Load(obs_data_t *obj) { MacroAction::Load(obj); - _action = - static_cast(obs_data_get_int(obj, "action")); + _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); @@ -229,15 +236,32 @@ void MacroActionPluginState::ResolveVariablesToFixedValues() static inline void populateActionSelection(QComboBox *list) { + const static std::map actionTypes = { + {MacroActionPluginState::Action::STOP, + "AdvSceneSwitcher.action.pluginState.type.stop"}, + {MacroActionPluginState::Action::NO_MATCH_BEHAVIOUR, + "AdvSceneSwitcher.action.pluginState.type.noMatch"}, + {MacroActionPluginState::Action::IMPORT_SETTINGS, + "AdvSceneSwitcher.action.pluginState.type.import"}, + {MacroActionPluginState::Action::TERMINATE, + "AdvSceneSwitcher.action.pluginState.type.terminate"}, + {MacroActionPluginState::Action::ENABLE_MACRO_HIGHLIGHTING, + "AdvSceneSwitcher.action.pluginState.type.enableMacroHighlighting"}, + {MacroActionPluginState::Action::DISABLE_MACRO_HIGHLIGHTING, + "AdvSceneSwitcher.action.pluginState.type.disableMacroHighlighting"}, + {MacroActionPluginState::Action::TOGGLE_MACRO_HIGHLIGHTING, + "AdvSceneSwitcher.action.pluginState.type.toggleMacroHighlighting"}, + }; + for (const auto &[_, name] : actionTypes) { list->addItem(obs_module_text(name.c_str())); } } static inline void populateValueSelection(QComboBox *list, - PluginStateAction action) + MacroActionPluginState::Action action) { - if (action == PluginStateAction::NO_MATCH_BEHAVIOUR) { + if (action == MacroActionPluginState::Action::NO_MATCH_BEHAVIOUR) { for (const auto &[_, name] : noMatchValues) { list->addItem(obs_module_text(name.c_str())); } @@ -246,15 +270,14 @@ static inline void populateValueSelection(QComboBox *list, MacroActionPluginStateEdit::MacroActionPluginStateEdit( QWidget *parent, std::shared_ptr entryData) - : QWidget(parent) + : QWidget(parent), + _actions(new QComboBox(this)), + _values(new QComboBox(this)), + _scenes(new QComboBox(this)), + _settings(new FileSelection()), + _settingsWarning(new QLabel(obs_module_text( + "AdvSceneSwitcher.action.pluginState.importWarning"))) { - _actions = new QComboBox(); - _values = new QComboBox(); - _scenes = new QComboBox(); - _settings = new FileSelection(); - _settingsWarning = new QLabel(obs_module_text( - "AdvSceneSwitcher.action.pluginState.importWarning")); - populateActionSelection(_actions); PopulateSceneSelection(_scenes); @@ -267,18 +290,16 @@ MacroActionPluginStateEdit::MacroActionPluginStateEdit( QWidget::connect(_settings, SIGNAL(PathChanged(const QString &)), this, SLOT(PathChanged(const QString &))); - QHBoxLayout *mainLayout = new QHBoxLayout; - std::unordered_map widgetPlaceholders = { - {"{{actions}}", _actions}, - {"{{values}}", _values}, - {"{{scenes}}", _scenes}, - {"{{settings}}", _settings}, - {"{{settingsWarning}}", _settingsWarning}, - }; + auto layout = new QHBoxLayout; PlaceWidgets( obs_module_text("AdvSceneSwitcher.action.pluginState.entry"), - mainLayout, widgetPlaceholders); - setLayout(mainLayout); + layout, + {{"{{actions}}", _actions}, + {"{{values}}", _values}, + {"{{scenes}}", _scenes}, + {"{{settings}}", _settings}, + {"{{settingsWarning}}", _settingsWarning}}); + setLayout(layout); _entryData = entryData; UpdateEntryData(); @@ -302,7 +323,8 @@ void MacroActionPluginStateEdit::ActionChanged(int value) { { GUARD_LOADING_AND_LOCK(); - _entryData->_action = static_cast(value); + _entryData->_action = + static_cast(value); SetWidgetVisibility(); } @@ -339,17 +361,18 @@ void MacroActionPluginStateEdit::SetWidgetVisibility() _scenes->hide(); _settings->hide(); _settingsWarning->hide(); + switch (_entryData->_action) { - case PluginStateAction::STOP: + case MacroActionPluginState::Action::STOP: break; - case PluginStateAction::NO_MATCH_BEHAVIOUR: + case MacroActionPluginState::Action::NO_MATCH_BEHAVIOUR: _values->show(); if (static_cast(_entryData->_value) == NoMatchBehavior::SWITCH) { _scenes->show(); } break; - case PluginStateAction::IMPORT_SETTINGS: + case MacroActionPluginState::Action::IMPORT_SETTINGS: _settings->show(); _settingsWarning->show(); break; diff --git a/plugins/base/macro-action-plugin-state.hpp b/plugins/base/macro-action-plugin-state.hpp index 15483f19..d2dbafeb 100644 --- a/plugins/base/macro-action-plugin-state.hpp +++ b/plugins/base/macro-action-plugin-state.hpp @@ -7,13 +7,6 @@ namespace advss { -enum class PluginStateAction { - STOP, - NO_MATCH_BEHAVIOUR, - IMPORT_SETTINGS, - TERMINATE, -}; - class MacroActionPluginState : public MacroAction { public: MacroActionPluginState(Macro *m) : MacroAction(m) {} @@ -26,7 +19,17 @@ public: std::shared_ptr Copy() const; void ResolveVariablesToFixedValues(); - PluginStateAction _action = PluginStateAction::STOP; + enum class Action { + STOP, + NO_MATCH_BEHAVIOUR, + IMPORT_SETTINGS, + TERMINATE, + ENABLE_MACRO_HIGHLIGHTING, + DISABLE_MACRO_HIGHLIGHTING, + TOGGLE_MACRO_HIGHLIGHTING, + }; + + Action _action = Action::STOP; int _value = 0; StringVariable _settingsPath; OBSWeakSource _scene; @@ -59,16 +62,16 @@ private slots: void SceneChanged(const QString &text); void PathChanged(const QString &text); -protected: +private: + void SetWidgetVisibility(); + QComboBox *_actions; QComboBox *_values; QComboBox *_scenes; FileSelection *_settings; QLabel *_settingsWarning; - std::shared_ptr _entryData; -private: - void SetWidgetVisibility(); + std::shared_ptr _entryData; bool _loading = true; };