From 49a042039eb6e2a856895cbf915a8042c5e7b03f Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Fri, 28 May 2021 20:09:29 +0200 Subject: [PATCH] Add ability to set source settings to macro action "source" --- data/locale/en-US.ini | 2 + src/headers/macro-action-source.hpp | 12 ++++- src/macro-action-source.cpp | 68 +++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 1 deletion(-) diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 592df4f7..5c845ea1 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -186,8 +186,10 @@ 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.type.settings="Set settings" AdvSceneSwitcher.action.source.entry="{{actions}} {{sources}}" AdvSceneSwitcher.action.source.warning="Warning: Enabling and disabling sources globally cannot be controlled by the OBS UI" +AdvSceneSwitcher.action.source.getSettings="Get current settings" AdvSceneSwitcher.action.media="Media" AdvSceneSwitcher.action.media.type.play="Play" AdvSceneSwitcher.action.media.type.pause="Pause" diff --git a/src/headers/macro-action-source.hpp b/src/headers/macro-action-source.hpp index 0e9f5c02..8b0e5178 100644 --- a/src/headers/macro-action-source.hpp +++ b/src/headers/macro-action-source.hpp @@ -1,11 +1,15 @@ #pragma once +#include "macro-action-edit.hpp" + #include #include -#include "macro-action-edit.hpp" +#include +#include enum class SourceAction { ENABLE, DISABLE, + SETTINGS, }; class MacroActionSource : public MacroAction { @@ -21,6 +25,7 @@ public: } OBSWeakSource _source; + std::string _settings = ""; SourceAction _action = SourceAction::ENABLE; private: @@ -47,14 +52,19 @@ public: private slots: void SourceChanged(const QString &text); void ActionChanged(int value); + void GetSettingsClicked(); + void SettingsChanged(); protected: QComboBox *_sources; QComboBox *_actions; + QPushButton *_getSettings; + QPlainTextEdit *_settings; QLabel *_warning; std::shared_ptr _entryData; private: + void SetWidgetVisibility(bool); QHBoxLayout *_mainLayout; bool _loading = true; }; diff --git a/src/macro-action-source.cpp b/src/macro-action-source.cpp index 09e27f8c..a3fd8936 100644 --- a/src/macro-action-source.cpp +++ b/src/macro-action-source.cpp @@ -12,8 +12,26 @@ bool MacroActionSource::_registered = MacroActionFactory::Register( const static std::map actionTypes = { {SourceAction::ENABLE, "AdvSceneSwitcher.action.source.type.enable"}, {SourceAction::DISABLE, "AdvSceneSwitcher.action.source.type.disable"}, + {SourceAction::SETTINGS, + "AdvSceneSwitcher.action.source.type.settings"}, }; +void setSourceSettings(obs_source_t *s, const std::string &settings) +{ + if (settings.empty()) { + return; + } + + obs_data_t *data = obs_data_create_from_json(settings.c_str()); + if (!data) { + blog(LOG_WARNING, "invalid source settings provided: \n%s", + settings.c_str()); + return; + } + obs_source_update(s, data); + obs_data_release(data); +} + bool MacroActionSource::PerformAction() { auto s = obs_weak_source_get_source(_source); @@ -24,6 +42,9 @@ bool MacroActionSource::PerformAction() case SourceAction::DISABLE: obs_source_set_enabled(s, false); break; + case SourceAction::SETTINGS: + setSourceSettings(s, _settings); + break; default: break; } @@ -48,6 +69,7 @@ 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)); + obs_data_set_string(obj, "settings", _settings.c_str()); return true; } @@ -57,6 +79,7 @@ bool MacroActionSource::Load(obs_data_t *obj) const char *sourceName = obs_data_get_string(obj, "source"); _source = GetWeakSourceByName(sourceName); _action = static_cast(obs_data_get_int(obj, "action")); + _settings = obs_data_get_string(obj, "settings"); return true; } @@ -73,6 +96,9 @@ MacroActionSourceEdit::MacroActionSourceEdit( { _sources = new QComboBox(); _actions = new QComboBox(); + _getSettings = new QPushButton( + obs_module_text("AdvSceneSwitcher.action.source.getSettings")); + _settings = new QPlainTextEdit(); _warning = new QLabel( obs_module_text("AdvSceneSwitcher.action.source.warning")); @@ -83,17 +109,28 @@ MacroActionSourceEdit::MacroActionSourceEdit( SLOT(ActionChanged(int))); QWidget::connect(_sources, SIGNAL(currentTextChanged(const QString &)), this, SLOT(SourceChanged(const QString &))); + QWidget::connect(_getSettings, SIGNAL(clicked()), this, + SLOT(GetSettingsClicked())); + QWidget::connect(_settings, SIGNAL(textChanged()), this, + SLOT(SettingsChanged())); QVBoxLayout *mainLayout = new QVBoxLayout; QHBoxLayout *entryLayout = new QHBoxLayout; + QHBoxLayout *buttonLayout = new QHBoxLayout; std::unordered_map widgetPlaceholders = { {"{{sources}}", _sources}, {"{{actions}}", _actions}, + {"{{settings}}", _settings}, + {"{{getSettings}}", _getSettings}, }; placeWidgets(obs_module_text("AdvSceneSwitcher.action.source.entry"), entryLayout, widgetPlaceholders); mainLayout->addLayout(entryLayout); mainLayout->addWidget(_warning); + mainLayout->addWidget(_settings); + buttonLayout->addWidget(_getSettings); + buttonLayout->addStretch(); + mainLayout->addLayout(buttonLayout); setLayout(mainLayout); _entryData = entryData; @@ -110,6 +147,8 @@ void MacroActionSourceEdit::UpdateEntryData() _actions->setCurrentIndex(static_cast(_entryData->_action)); _sources->setCurrentText( GetWeakSourceName(_entryData->_source).c_str()); + _settings->setPlainText(QString::fromStdString(_entryData->_settings)); + SetWidgetVisibility(_entryData->_action == SourceAction::SETTINGS); } void MacroActionSourceEdit::SourceChanged(const QString &text) @@ -130,4 +169,33 @@ void MacroActionSourceEdit::ActionChanged(int value) std::lock_guard lock(switcher->m); _entryData->_action = static_cast(value); + SetWidgetVisibility(_entryData->_action == SourceAction::SETTINGS); +} + +void MacroActionSourceEdit::GetSettingsClicked() +{ + if (_loading || !_entryData || !_entryData->_source) { + return; + } + + _settings->setPlainText( + QString::fromStdString(getSourceSettings(_entryData->_source))); +} + +void MacroActionSourceEdit::SettingsChanged() +{ + if (_loading || !_entryData) { + return; + } + + std::lock_guard lock(switcher->m); + _entryData->_settings = _settings->toPlainText().toStdString(); +} + +void MacroActionSourceEdit::SetWidgetVisibility(bool showSettings) +{ + _settings->setVisible(showSettings); + _getSettings->setVisible(showSettings); + _warning->setVisible(!showSettings); + adjustSize(); }