diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index a92bef24..857f9990 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -1085,6 +1085,7 @@ AdvSceneSwitcher.action.macro.type.stop="Stop actions" AdvSceneSwitcher.action.macro.type.disableAction="Disable action" AdvSceneSwitcher.action.macro.type.enableAction="Enable action" AdvSceneSwitcher.action.macro.type.toggleAction="Toggle action" +AdvSceneSwitcher.action.macro.type.getInfo="Get macro info" AdvSceneSwitcher.action.macro.type.nestedMacro="Nested macro" AdvSceneSwitcher.action.macro.actionSelectionType.index="at index" AdvSceneSwitcher.action.macro.actionSelectionType.label="with label" @@ -2297,6 +2298,18 @@ AdvSceneSwitcher.tempVar.macro.runCount="Run count" AdvSceneSwitcher.tempVar.macro.runCount.description="The number of times a macro was executed." AdvSceneSwitcher.tempVar.macro.matchedCount="Matched count" AdvSceneSwitcher.tempVar.macro.matchedCount.description="The number of macros of which the condition state was true." +AdvSceneSwitcher.tempVar.macro.info.conditionCount="Condition count" +AdvSceneSwitcher.tempVar.macro.info.conditionCount.description="The number of conditions in the macro." +AdvSceneSwitcher.tempVar.macro.info.actionCount="Action count" +AdvSceneSwitcher.tempVar.macro.info.actionCount.description="The number of actions in the macro." +AdvSceneSwitcher.tempVar.macro.info.elseActionCount="Else-action count" +AdvSceneSwitcher.tempVar.macro.info.elseActionCount.description="The number of else-actions in the macro." +AdvSceneSwitcher.tempVar.macro.info.paused="Paused" +AdvSceneSwitcher.tempVar.macro.info.paused.description="Whether the macro is currently paused. Value is \"true\" or \"false\"." +AdvSceneSwitcher.tempVar.macro.info.runCount="Run count" +AdvSceneSwitcher.tempVar.macro.info.runCount.description="The number of times the macro has been executed." +AdvSceneSwitcher.tempVar.macro.info.secondsSinceLastRun="Seconds since last run" +AdvSceneSwitcher.tempVar.macro.info.secondsSinceLastRun.description="The number of seconds elapsed since the macro was last executed. Value is -1 if the macro has never been executed." AdvSceneSwitcher.tempVar.process.name="Process name" diff --git a/lib/macro/macro-action-macro.cpp b/lib/macro/macro-action-macro.cpp index 9f98fc7a..991c0c9f 100644 --- a/lib/macro/macro-action-macro.cpp +++ b/lib/macro/macro-action-macro.cpp @@ -4,6 +4,8 @@ #include "macro.hpp" #include "macro-action-factory.hpp" +#include + namespace advss { const std::string MacroActionMacro::id = "macro"; @@ -118,6 +120,36 @@ bool MacroActionMacro::PerformAction() case Action::TOGGLE_ACTION: AdjustActionState(macro); break; + case Action::GET_INFO: { + SetTempVarValue( + "conditionCount", + std::to_string(macro->Conditions().size())); + SetTempVarValue( + "actionCount", + std::to_string(macro->Actions().size())); + SetTempVarValue( + "elseActionCount", + std::to_string(macro->ElseActions().size())); + SetTempVarValue("paused", + macro->Paused() ? "true" : "false"); + SetTempVarValue("runCount", + std::to_string(macro->RunCount())); + const auto lastRun = macro->GetLastExecutionTime(); + const bool hasRun = + lastRun.time_since_epoch().count() != 0; + const auto secondsSinceLastRun = + hasRun ? std::chrono::duration_cast< + std::chrono::seconds>( + std::chrono:: + high_resolution_clock:: + now() - + lastRun) + .count() + : -1; + SetTempVarValue("secondsSinceLastRun", + std::to_string(secondsSinceLastRun)); + break; + } default: break; } @@ -175,6 +207,9 @@ void MacroActionMacro::LogAction() const case Action::NESTED_MACRO: ablog(LOG_INFO, "run nested macro"); break; + case Action::GET_INFO: + ablog(LOG_INFO, "get info for \"%s\"", macro->Name().c_str()); + break; default: break; } @@ -202,8 +237,8 @@ bool MacroActionMacro::Save(obs_data_t *obj) const bool MacroActionMacro::Load(obs_data_t *obj) { MacroAction::Load(obj); - _action = static_cast( - obs_data_get_int(obj, "action")); + SetAction(static_cast( + obs_data_get_int(obj, "action"))); _macro.Load(obj); _actionSelectionType = static_cast( obs_data_get_int(obj, "actionSelectionType")); @@ -303,6 +338,56 @@ void MacroActionMacro::RunActions(Macro *actionMacro) const } } +void MacroActionMacro::SetAction(Action action) +{ + _action = action; + SetupTempVars(); +} + +void MacroActionMacro::SetupTempVars() +{ + MacroAction::SetupTempVars(); + + if (_action != Action::GET_INFO) { + return; + } + + AddTempvar( + "conditionCount", + obs_module_text( + "AdvSceneSwitcher.tempVar.macro.info.conditionCount"), + obs_module_text( + "AdvSceneSwitcher.tempVar.macro.info.conditionCount.description")); + AddTempvar( + "actionCount", + obs_module_text( + "AdvSceneSwitcher.tempVar.macro.info.actionCount"), + obs_module_text( + "AdvSceneSwitcher.tempVar.macro.info.actionCount.description")); + AddTempvar( + "elseActionCount", + obs_module_text( + "AdvSceneSwitcher.tempVar.macro.info.elseActionCount"), + obs_module_text( + "AdvSceneSwitcher.tempVar.macro.info.elseActionCount.description")); + AddTempvar( + "paused", + obs_module_text("AdvSceneSwitcher.tempVar.macro.info.paused"), + obs_module_text( + "AdvSceneSwitcher.tempVar.macro.info.paused.description")); + AddTempvar( + "runCount", + obs_module_text("AdvSceneSwitcher.tempVar.macro.info.runCount"), + obs_module_text( + "AdvSceneSwitcher.tempVar.macro.info.runCount.description")); + AddTempvar( + "secondsSinceLastRun", + obs_module_text( + "AdvSceneSwitcher.tempVar.macro.info.secondsSinceLastRun"), + obs_module_text( + "AdvSceneSwitcher.tempVar.macro.info.secondsSinceLastRun.description")); +} + static void populateActionSelection(QComboBox *list) { static const std::vector> @@ -327,6 +412,8 @@ static void populateActionSelection(QComboBox *list) "AdvSceneSwitcher.action.macro.type.enableAction"}, {MacroActionMacro::Action::TOGGLE_ACTION, "AdvSceneSwitcher.action.macro.type.toggleAction"}, + {MacroActionMacro::Action::GET_INFO, + "AdvSceneSwitcher.action.macro.type.getInfo"}, }; for (const auto &[value, name] : actions) { @@ -496,7 +583,7 @@ void MacroActionMacroEdit::UpdateEntryData() } _actions->setCurrentIndex( - _actions->findData(static_cast(_entryData->_action))); + _actions->findData(static_cast(_entryData->GetAction()))); _actionSelectionType->setCurrentIndex(_actionSelectionType->findData( static_cast(_entryData->_actionSelectionType))); _actionIndex->SetValue(_entryData->_actionIndex); @@ -545,8 +632,8 @@ void MacroActionMacroEdit::MacroChanged(const QString &text) void MacroActionMacroEdit::ActionChanged(int idx) { GUARD_LOADING_AND_LOCK(); - _entryData->_action = static_cast( - _actions->itemData(idx).toInt()); + _entryData->SetAction(static_cast( + _actions->itemData(idx).toInt())); SetWidgetVisibility(); } @@ -665,7 +752,7 @@ void MacroActionMacroEdit::SetWidgetVisibility() }; - const auto action = _entryData->_action; + const auto action = _entryData->GetAction(); const char *layoutText = ""; switch (action) { case MacroActionMacro::Action::PAUSE: @@ -674,6 +761,7 @@ void MacroActionMacroEdit::SetWidgetVisibility() case MacroActionMacro::Action::RESET_COUNTER: case MacroActionMacro::Action::STOP: case MacroActionMacro::Action::NESTED_MACRO: + case MacroActionMacro::Action::GET_INFO: layoutText = "AdvSceneSwitcher.action.macro.layout.other"; break; case MacroActionMacro::Action::RUN_ACTIONS: diff --git a/lib/macro/macro-action-macro.hpp b/lib/macro/macro-action-macro.hpp index f2453bb5..d6334b30 100644 --- a/lib/macro/macro-action-macro.hpp +++ b/lib/macro/macro-action-macro.hpp @@ -56,11 +56,14 @@ public: TOGGLE_ACTION, TOGGLE_PAUSE, NESTED_MACRO, + GET_INFO, }; + void SetAction(Action); + Action GetAction() const { return _action; } + enum class SelectionType { INDEX, LABEL, ID }; - Action _action = Action::NESTED_MACRO; SelectionType _actionSelectionType = SelectionType::INDEX; bool _useElseSection = false; IntVariable _actionIndex = 1; @@ -72,9 +75,12 @@ public: int _customWidgetHeight = 0; private: + void SetupTempVars(); void RunActions(Macro *actionMacro) const; void AdjustActionState(Macro *) const; + Action _action = Action::NESTED_MACRO; + static bool _registered; static const std::string id; }; diff --git a/lib/macro/macro-edit.cpp b/lib/macro/macro-edit.cpp index 9acdb107..f8b09ce2 100644 --- a/lib/macro/macro-edit.cpp +++ b/lib/macro/macro-edit.cpp @@ -366,7 +366,7 @@ static void runSegmentHighlightChecksHelper(MacroSegmentList *list) // highlight its segments if required auto macroAction = dynamic_cast(data.get()); if (macroAction && - macroAction->_action == + macroAction->GetAction() == MacroActionMacro::Action::NESTED_MACRO) { continue; } diff --git a/tests/stubs/macro-action-macro.cpp b/tests/stubs/macro-action-macro.cpp index 09ba2dec..b0f08488 100644 --- a/tests/stubs/macro-action-macro.cpp +++ b/tests/stubs/macro-action-macro.cpp @@ -52,6 +52,8 @@ void MacroActionMacro::RunActions(Macro *actionMacro) const {} void MacroActionMacro::AdjustActionState(Macro *macro) const {} +void MacroActionMacro::SetupTempVars() {} + MacroActionMacroEdit::MacroActionMacroEdit( QWidget *parent, std::shared_ptr entryData) : ResizableWidget(parent),