From 6a998934d0dfdcca24a782dec5117188c8947a27 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Tue, 18 May 2021 19:11:23 +0200 Subject: [PATCH] Add macro action "source" --- CMakeLists.txt | 2 + data/locale/en-US.ini | 4 + src/headers/macro-action-source.hpp | 58 +++++++++++ src/macro-action-source.cpp | 144 ++++++++++++++++++++++++++++ 4 files changed, 208 insertions(+) create mode 100644 src/headers/macro-action-source.hpp create mode 100644 src/macro-action-source.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 39e4f3ab..25eff11f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -88,6 +88,7 @@ set(advanced-scene-switcher_HEADERS src/headers/macro-action-run.hpp src/headers/macro-action-scene-switch.hpp src/headers/macro-action-scene-visibility.hpp + src/headers/macro-action-source.hpp src/headers/macro-action-streaming.hpp src/headers/macro-action-wait.hpp src/headers/macro-condition-edit.hpp @@ -146,6 +147,7 @@ set(advanced-scene-switcher_SOURCES src/macro-action-run.cpp src/macro-action-scene-switch.cpp src/macro-action-scene-visibility.cpp + src/macro-action-source.cpp src/macro-action-streaming.cpp src/macro-action-wait.cpp src/macro-condition-edit.cpp diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 4ba0c843..fc22765b 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -163,6 +163,10 @@ AdvSceneSwitcher.action.filter="Filter" AdvSceneSwitcher.action.filter.type.enable="Enable" AdvSceneSwitcher.action.filter.type.disable="Disable" AdvSceneSwitcher.action.filter.entry="On {{sources}} {{actions}} {{filters}}" +AdvSceneSwitcher.action.source="Source" +AdvSceneSwitcher.action.source.type.enable="Enable" +AdvSceneSwitcher.action.source.type.disable="Disable" +AdvSceneSwitcher.action.source.entry="{{actions}} {{sources}}" ; Transition Tab diff --git a/src/headers/macro-action-source.hpp b/src/headers/macro-action-source.hpp new file mode 100644 index 00000000..47e375d1 --- /dev/null +++ b/src/headers/macro-action-source.hpp @@ -0,0 +1,58 @@ +#pragma once +#include +#include "macro-action-edit.hpp" + +enum class SourceAction { + ENABLE, + DISABLE, +}; + +class MacroActionSource : public MacroAction { +public: + bool PerformAction(); + void LogAction(); + bool Save(obs_data_t *obj); + bool Load(obs_data_t *obj); + int GetId() { return id; }; + static std::shared_ptr Create() + { + return std::make_shared(); + } + + OBSWeakSource _source; + SourceAction _action = SourceAction::ENABLE; + +private: + static bool _registered; + static const int id; +}; + +class MacroActionSourceEdit : public QWidget { + Q_OBJECT + +public: + MacroActionSourceEdit( + QWidget *parent, + std::shared_ptr entryData = nullptr); + void UpdateEntryData(); + static QWidget *Create(QWidget *parent, + std::shared_ptr action) + { + return new MacroActionSourceEdit( + parent, + std::dynamic_pointer_cast(action)); + } + +private slots: + void SourceChanged(const QString &text); + void ActionChanged(int value); + +protected: + QComboBox *_sources; + QComboBox *_actions; + std::shared_ptr _entryData; + +private: + QHBoxLayout *_mainLayout; + bool _loading = true; +}; diff --git a/src/macro-action-source.cpp b/src/macro-action-source.cpp new file mode 100644 index 00000000..74681138 --- /dev/null +++ b/src/macro-action-source.cpp @@ -0,0 +1,144 @@ +#include "headers/macro-action-source.hpp" +#include "headers/advanced-scene-switcher.hpp" +#include "headers/utility.hpp" + +const int MacroActionSource::id = 9; + +bool MacroActionSource::_registered = MacroActionFactory::Register( + MacroActionSource::id, + {MacroActionSource::Create, MacroActionSourceEdit::Create, + "AdvSceneSwitcher.action.source"}); + +const static std::map actionTypes = { + {SourceAction::ENABLE, "AdvSceneSwitcher.action.source.type.enable"}, + {SourceAction::DISABLE, "AdvSceneSwitcher.action.source.type.disable"}, +}; + +bool MacroActionSource::PerformAction() +{ + auto s = obs_weak_source_get_source(_source); + switch (_action) { + case SourceAction::ENABLE: + obs_source_set_enabled(s, true); + break; + case SourceAction::DISABLE: + obs_source_set_enabled(s, false); + break; + default: + break; + } + obs_source_release(s); + return true; +} + +void MacroActionSource::LogAction() +{ + auto it = actionTypes.find(_action); + if (it != actionTypes.end()) { + vblog(LOG_INFO, "performed action \"%s\" for Source \"%s\"", + it->second.c_str(), GetWeakSourceName(_source).c_str()); + } else { + blog(LOG_WARNING, "ignored unknown source action %d", + static_cast(_action)); + } +} + +bool MacroActionSource::Save(obs_data_t *obj) +{ + MacroAction::Save(obj); + obs_data_set_string(obj, "source", GetWeakSourceName(_source).c_str()); + obs_data_set_int(obj, "action", static_cast(_action)); + return true; +} + +bool MacroActionSource::Load(obs_data_t *obj) +{ + MacroAction::Load(obj); + const char *sourceName = obs_data_get_string(obj, "source"); + _source = GetWeakSourceByName(sourceName); + _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())); + } +} + +static inline void populateSources(QComboBox *list) +{ + auto enumSourcesWithSources = [](void *param, obs_source_t *source) { + if (!source) { + return true; + } + QComboBox *list = reinterpret_cast(param); + list->addItem(obs_source_get_name(source)); + return true; + }; + + list->clear(); + list->addItem(obs_module_text("AdvSceneSwitcher.selectSource")); + obs_enum_sources(enumSourcesWithSources, list); +} + +MacroActionSourceEdit::MacroActionSourceEdit( + QWidget *parent, std::shared_ptr entryData) + : QWidget(parent) +{ + _sources = new QComboBox(); + _actions = new QComboBox(); + + populateActionSelection(_actions); + populateSources(_sources); + + QWidget::connect(_actions, SIGNAL(currentIndexChanged(int)), this, + SLOT(ActionChanged(int))); + QWidget::connect(_sources, SIGNAL(currentTextChanged(const QString &)), + this, SLOT(SourceChanged(const QString &))); + + QHBoxLayout *mainLayout = new QHBoxLayout; + std::unordered_map widgetPlaceholders = { + {"{{sources}}", _sources}, + {"{{actions}}", _actions}, + }; + placeWidgets(obs_module_text("AdvSceneSwitcher.action.source.entry"), + mainLayout, widgetPlaceholders); + setLayout(mainLayout); + + _entryData = entryData; + UpdateEntryData(); + _loading = false; +} + +void MacroActionSourceEdit::UpdateEntryData() +{ + if (!_entryData) { + return; + } + + _actions->setCurrentIndex(static_cast(_entryData->_action)); + _sources->setCurrentText( + GetWeakSourceName(_entryData->_source).c_str()); +} + +void MacroActionSourceEdit::SourceChanged(const QString &text) +{ + if (_loading || !_entryData) { + return; + } + + std::lock_guard lock(switcher->m); + _entryData->_source = GetWeakSourceByQString(text); +} + +void MacroActionSourceEdit::ActionChanged(int value) +{ + if (_loading || !_entryData) { + return; + } + + std::lock_guard lock(switcher->m); + _entryData->_action = static_cast(value); +}