Add option to enable / disable / toggle macro highlighting

This commit is contained in:
WarmUpTill 2025-08-18 19:05:31 +02:00 committed by WarmUpTill
parent 756d7bbd3c
commit d20a975c4f
5 changed files with 116 additions and 57 deletions

View File

@ -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"

View File

@ -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

View File

@ -47,4 +47,7 @@ EXPORT bool InitialLoadIsComplete();
EXPORT bool IsFirstInterval();
EXPORT bool IsFirstIntervalAfterStop();
EXPORT void SetMacroHighlightingEnabled(bool enable);
EXPORT bool IsMacroHighlightingEnabled();
} // namespace advss

View File

@ -21,17 +21,6 @@ bool MacroActionPluginState::_registered = MacroActionFactory::Register(
{MacroActionPluginState::Create, MacroActionPluginStateEdit::Create,
"AdvSceneSwitcher.action.pluginState"});
const static std::map<PluginStateAction, std::string> 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<NoMatchBehavior, std::string> 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<int>(_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<PluginStateAction>(obs_data_get_int(obj, "action"));
_action = static_cast<MacroActionPluginState::Action>(
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<MacroActionPluginState::Action, std::string> 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<MacroActionPluginState> 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<std::string, QWidget *> 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<PluginStateAction>(value);
_entryData->_action =
static_cast<MacroActionPluginState::Action>(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<NoMatchBehavior>(_entryData->_value) ==
NoMatchBehavior::SWITCH) {
_scenes->show();
}
break;
case PluginStateAction::IMPORT_SETTINGS:
case MacroActionPluginState::Action::IMPORT_SETTINGS:
_settings->show();
_settingsWarning->show();
break;

View File

@ -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<MacroAction> 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<MacroActionPluginState> _entryData;
private:
void SetWidgetVisibility();
std::shared_ptr<MacroActionPluginState> _entryData;
bool _loading = true;
};