diff --git a/CMakeLists.txt b/CMakeLists.txt index 44d1871e..48ac403d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -84,6 +84,7 @@ set(advanced-scene-switcher_HEADERS src/headers/macro-action-filter.hpp src/headers/macro-action-macro.hpp src/headers/macro-action-media.hpp + src/headers/macro-action-plugin-state.hpp src/headers/macro-action-recording.hpp src/headers/macro-action-replay-buffer.hpp src/headers/macro-action-run.hpp @@ -151,6 +152,7 @@ set(advanced-scene-switcher_SOURCES src/macro-action-filter.cpp src/macro-action-macro.cpp src/macro-action-media.cpp + src/macro-action-plugin-state.cpp src/macro-action-recording.cpp src/macro-action-replay-buffer.cpp src/macro-action-run.cpp diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index c189551a..592df4f7 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -201,7 +201,9 @@ AdvSceneSwitcher.action.macro.type.pause="Pause" AdvSceneSwitcher.action.macro.type.unpause="Unpause" 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}}" ; Transition Tab AdvSceneSwitcher.transitionTab.title="Transition" diff --git a/src/headers/macro-action-plugin-state.hpp b/src/headers/macro-action-plugin-state.hpp new file mode 100644 index 00000000..fd4dcb7c --- /dev/null +++ b/src/headers/macro-action-plugin-state.hpp @@ -0,0 +1,55 @@ +#pragma once +#include +#include "macro-action-edit.hpp" + +enum class PluginStateAction { + STOP, +}; + +class MacroActionPluginState : public MacroAction { +public: + bool PerformAction(); + void LogAction(); + bool Save(obs_data_t *obj); + bool Load(obs_data_t *obj); + std::string GetId() { return id; }; + static std::shared_ptr Create() + { + return std::make_shared(); + } + + PluginStateAction _action = PluginStateAction::STOP; + +private: + static bool _registered; + static const std::string id; +}; + +class MacroActionPluginStateEdit : public QWidget { + Q_OBJECT + +public: + MacroActionPluginStateEdit( + QWidget *parent, + std::shared_ptr entryData = nullptr); + void UpdateEntryData(); + static QWidget *Create(QWidget *parent, + std::shared_ptr action) + { + return new MacroActionPluginStateEdit( + parent, + std::dynamic_pointer_cast( + action)); + } + +private slots: + void ActionChanged(int value); + +protected: + QComboBox *_actions; + std::shared_ptr _entryData; + +private: + QHBoxLayout *_mainLayout; + bool _loading = true; +}; diff --git a/src/macro-action-plugin-state.cpp b/src/macro-action-plugin-state.cpp new file mode 100644 index 00000000..4f368862 --- /dev/null +++ b/src/macro-action-plugin-state.cpp @@ -0,0 +1,114 @@ +#include "headers/macro-action-plugin-state.hpp" +#include "headers/advanced-scene-switcher.hpp" +#include "headers/utility.hpp" + +#include + +const std::string MacroActionPluginState::id = "plugin_state"; + +bool MacroActionPluginState::_registered = MacroActionFactory::Register( + MacroActionPluginState::id, + {MacroActionPluginState::Create, MacroActionPluginStateEdit::Create, + "AdvSceneSwitcher.action.PluginState"}); + +const static std::map actionTypes = { + {PluginStateAction::STOP, + "AdvSceneSwitcher.action.pluginState.type.stop"}, +}; + +void stopPlugin() +{ + std::thread t([]() { switcher->Stop(); }); + t.detach(); +} + +bool MacroActionPluginState::PerformAction() +{ + switch (_action) { + case PluginStateAction::STOP: + stopPlugin(); + break; + default: + break; + } + return true; +} + +void MacroActionPluginState::LogAction() +{ + auto it = actionTypes.find(_action); + switch (_action) { + case PluginStateAction::STOP: + blog(LOG_INFO, "stop() called by macro", it->second.c_str()); + break; + default: + blog(LOG_WARNING, "ignored unknown pluginState action %d", + static_cast(_action)); + break; + } +} + +bool MacroActionPluginState::Save(obs_data_t *obj) +{ + MacroAction::Save(obj); + obs_data_set_int(obj, "action", static_cast(_action)); + return true; +} + +bool MacroActionPluginState::Load(obs_data_t *obj) +{ + MacroAction::Load(obj); + _action = + static_cast(obs_data_get_int(obj, "action")); + return true; +} + +static inline void populateActionSelection(QComboBox *list) +{ + for (auto entry : actionTypes) { + list->addItem(obs_module_text(entry.second.c_str())); + } +} + +MacroActionPluginStateEdit::MacroActionPluginStateEdit( + QWidget *parent, std::shared_ptr entryData) + : QWidget(parent) +{ + _actions = new QComboBox(); + + populateActionSelection(_actions); + + QWidget::connect(_actions, SIGNAL(currentIndexChanged(int)), this, + SLOT(ActionChanged(int))); + + QHBoxLayout *mainLayout = new QHBoxLayout; + std::unordered_map widgetPlaceholders = { + {"{{actions}}", _actions}, + }; + placeWidgets( + obs_module_text("AdvSceneSwitcher.action.pluginState.entry"), + mainLayout, widgetPlaceholders); + setLayout(mainLayout); + + _entryData = entryData; + UpdateEntryData(); + _loading = false; +} + +void MacroActionPluginStateEdit::UpdateEntryData() +{ + if (!_entryData) { + return; + } + _actions->setCurrentIndex(static_cast(_entryData->_action)); +} + +void MacroActionPluginStateEdit::ActionChanged(int value) +{ + if (_loading || !_entryData) { + return; + } + + std::lock_guard lock(switcher->m); + _entryData->_action = static_cast(value); +}