diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 7f768d31..3a6d61d7 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -615,7 +615,11 @@ AdvSceneSwitcher.action.filter.type.disable="Disable" AdvSceneSwitcher.action.filter.type.toggle="Toggle" AdvSceneSwitcher.action.filter.type.settings="Set settings" AdvSceneSwitcher.action.filter.entry="On{{sources}}{{actions}}{{filters}}" +AdvSceneSwitcher.action.filter.entry.settings="{{settings}}{{settingsInputMethod}}{{settingValue}}{{tempVar}}" AdvSceneSwitcher.action.filter.getSettings="Get current settings" +AdvSceneSwitcher.action.filter.inputMethod.individualManual="Set to fixed value" +AdvSceneSwitcher.action.filter.inputMethod.individualTempvar="Set to macro property" +AdvSceneSwitcher.action.filter.inputMethod.json="Set setting JSON string" AdvSceneSwitcher.action.source="Source" AdvSceneSwitcher.action.source.type.enable="Enable" AdvSceneSwitcher.action.source.type.disable="Disable" @@ -630,6 +634,7 @@ AdvSceneSwitcher.action.source.type.openFilterDialog="Open filter dialog" AdvSceneSwitcher.action.source.type.openPropertiesDialog="Open properties dialog" AdvSceneSwitcher.action.source.noSettingsButtons="No buttons found!" AdvSceneSwitcher.action.source.entry="{{actions}}{{sources}}{{settingsButtons}}{{deinterlaceMode}}{{deinterlaceOrder}}" +AdvSceneSwitcher.action.source.entry.settings="{{settings}}{{settingsInputMethod}}{{settingValue}}{{tempVar}}" AdvSceneSwitcher.action.source.warning="Warning: Enabling and disabling sources globally cannot be controlled by the OBS UI\nYou might be looking for \"Scene item visibility\"" AdvSceneSwitcher.action.source.getSettings="Get current settings" AdvSceneSwitcher.action.source.deinterlaceMode.disable="Disable" @@ -643,6 +648,9 @@ AdvSceneSwitcher.action.source.deinterlaceMode.yadif="Yadif" AdvSceneSwitcher.action.source.deinterlaceMode.yadif2x="Yadif 2x" AdvSceneSwitcher.action.source.deinterlaceOrder.topFieldFirst="Top Field First" AdvSceneSwitcher.action.source.deinterlaceOrder.bottomFieldFirst="Bottom Field First" +AdvSceneSwitcher.action.source.inputMethod.individualManual="Set to fixed value" +AdvSceneSwitcher.action.source.inputMethod.individualTempvar="Set to macro property" +AdvSceneSwitcher.action.source.inputMethod.json="Set setting JSON string" AdvSceneSwitcher.action.media="Media" AdvSceneSwitcher.action.media.type.play="Play" AdvSceneSwitcher.action.media.type.pause="Pause" diff --git a/src/macro-core/macro-action-filter.cpp b/src/macro-core/macro-action-filter.cpp index 88d45ade..a9f5b6e0 100644 --- a/src/macro-core/macro-action-filter.cpp +++ b/src/macro-core/macro-action-filter.cpp @@ -21,9 +21,22 @@ const static std::map actionTypes = { "AdvSceneSwitcher.action.filter.type.settings"}, }; -static void performActionHelper(MacroActionFilter::Action action, - const OBSWeakSource &filter, - const StringVariable &settings) +const static std::map + inputMethods = { + {MacroActionFilter::SettingsInputMethod::INDIVIDUAL_MANUAL, + "AdvSceneSwitcher.action.filter.inputMethod.individualManual"}, + {MacroActionFilter::SettingsInputMethod::INDIVIDUAL_TEMPVAR, + "AdvSceneSwitcher.action.filter.inputMethod.individualTempvar"}, + {MacroActionFilter::SettingsInputMethod::JSON_STRING, + "AdvSceneSwitcher.action.filter.inputMethod.json"}, +}; + +static void performActionHelper( + MacroActionFilter::Action action, const OBSWeakSource &filter, + MacroActionFilter::SettingsInputMethod settingsInputMethod, + const SourceSetting &setting, const std::string &manualSettingValue, + const TempVariableRef &tempVar, Macro *macro, + const StringVariable &settingsString) { OBSSourceAutoRelease source = obs_weak_source_get_source(filter); switch (action) { @@ -37,7 +50,26 @@ static void performActionHelper(MacroActionFilter::Action action, obs_source_set_enabled(source, !obs_source_enabled(source)); break; case MacroActionFilter::Action::SETTINGS: - SetSourceSettings(source, settings); + switch (settingsInputMethod) { + case MacroActionFilter::SettingsInputMethod::INDIVIDUAL_MANUAL: + SetSourceSetting(source, setting, manualSettingValue); + break; + case MacroActionFilter::SettingsInputMethod::INDIVIDUAL_TEMPVAR: { + auto var = tempVar.GetTempVariable(macro); + if (!var) { + break; + } + auto value = var->Value(); + if (!value) { + break; + } + SetSourceSetting(source, setting, *value); + break; + } + case MacroActionFilter::SettingsInputMethod::JSON_STRING: + SetSourceSettings(source, settingsString); + break; + } break; default: break; @@ -48,7 +80,9 @@ bool MacroActionFilter::PerformAction() { auto filters = _filter.GetFilters(_source); for (const auto &filter : filters) { - performActionHelper(_action, filter, _settings); + performActionHelper(_action, filter, _settingsInputMethod, + _setting, _manualSettingValue, _tempVar, + GetMacro(), _settingsString); } return true; } @@ -73,7 +107,12 @@ bool MacroActionFilter::Save(obs_data_t *obj) const _source.Save(obj); _filter.Save(obj, "filter"); obs_data_set_int(obj, "action", static_cast(_action)); - _settings.Save(obj, "settings"); + obs_data_set_int(obj, "inputMethod", + static_cast(_settingsInputMethod)); + _setting.Save(obj); + _manualSettingValue.Save(obj, "manualSettingValue"); + _tempVar.Save(obj); + _settingsString.Save(obj, "settings"); obs_data_set_int(obj, "version", 1); return true; } @@ -94,7 +133,17 @@ bool MacroActionFilter::Load(obs_data_t *obj) } else { _action = static_cast(obs_data_get_int(obj, "action")); } - _settings.Load(obj, "settings"); + // TODO: Remove fallback in future version + if (obs_data_has_user_value(obj, "inputMethod")) { + _settingsInputMethod = static_cast( + obs_data_get_int(obj, "inputMethod")); + } else { + _settingsInputMethod = SettingsInputMethod::JSON_STRING; + } + _setting.Load(obj); + _settingsString.Load(obj, "settings"); + _manualSettingValue.Load(obj, "manualSettingValue"); + _tempVar.Load(obj, GetMacro()); return true; } @@ -113,6 +162,15 @@ static inline void populateActionSelection(QComboBox *list) } } +static inline void populateSettingsInputMethods(QComboBox *list) +{ + list->clear(); + for (const auto &[value, name] : inputMethods) { + list->addItem(obs_module_text(name.c_str()), + static_cast(value)); + } +} + MacroActionFilterEdit::MacroActionFilterEdit( QWidget *parent, std::shared_ptr entryData) : QWidget(parent), @@ -121,7 +179,12 @@ MacroActionFilterEdit::MacroActionFilterEdit( _actions(new QComboBox()), _getSettings(new QPushButton(obs_module_text( "AdvSceneSwitcher.action.filter.getSettings"))), - _settings(new VariableTextEdit(this)) + _settingsLayout(new QHBoxLayout()), + _settingsInputMethods(new QComboBox(this)), + _manualSettingValue(new VariableTextEdit(this, 5, 1, 1)), + _tempVars(new TempVariableSelection(this)), + _filterSettings(new SourceSettingSelection(this)), + _settingsString(new VariableTextEdit(this)) { _filters->setSizeAdjustPolicy(QComboBox::AdjustToContents); @@ -130,6 +193,8 @@ MacroActionFilterEdit::MacroActionFilterEdit( sources.sort(); _sources->SetSourceNameList(sources); + populateSettingsInputMethods(_settingsInputMethods); + QWidget::connect(_actions, SIGNAL(currentIndexChanged(int)), this, SLOT(ActionChanged(int))); QWidget::connect(_sources, @@ -140,27 +205,48 @@ MacroActionFilterEdit::MacroActionFilterEdit( SLOT(FilterChanged(const FilterSelection &))); QWidget::connect(_getSettings, SIGNAL(clicked()), this, SLOT(GetSettingsClicked())); - QWidget::connect(_settings, SIGNAL(textChanged()), this, - SLOT(SettingsChanged())); + QWidget::connect(_settingsString, SIGNAL(textChanged()), this, + SLOT(SettingsStringChanged())); + QWidget::connect(_tempVars, + SIGNAL(SelectionChanged(const TempVariableRef &)), + this, SLOT(SelectionChanged(const TempVariableRef &))); + QWidget::connect(_settingsInputMethods, + SIGNAL(currentIndexChanged(int)), this, + SLOT(SettingsInputMethodChanged(int))); + QWidget::connect(_manualSettingValue, SIGNAL(textChanged()), this, + SLOT(ManualSettingsValueChanged())); + QWidget::connect(_filterSettings, + SIGNAL(SelectionChanged(const SourceSetting &)), this, + SLOT(SelectionChanged(const SourceSetting &))); - QHBoxLayout *entryLayout = new QHBoxLayout; + auto entrylayout = new QHBoxLayout; std::unordered_map widgetPlaceholders = { - {"{{sources}}", _sources}, {"{{filters}}", _filters}, - {"{{actions}}", _actions}, {"{{settings}}", _settings}, + {"{{sources}}", _sources}, + {"{{filters}}", _filters}, + {"{{actions}}", _actions}, + {"{{settings}}", _filterSettings}, + {"{{settingsInputMethod}}", _settingsInputMethods}, + {"{{settingValue}}", _manualSettingValue}, + {"{{tempVar}}", _tempVars}, {"{{getSettings}}", _getSettings}, }; PlaceWidgets(obs_module_text("AdvSceneSwitcher.action.filter.entry"), - entryLayout, widgetPlaceholders); + entrylayout, widgetPlaceholders); + _settingsLayout->setContentsMargins(0, 0, 0, 0); + PlaceWidgets(obs_module_text( + "AdvSceneSwitcher.action.filter.entry.settings"), + _settingsLayout, widgetPlaceholders); - QHBoxLayout *buttonLayout = new QHBoxLayout; + auto buttonLayout = new QHBoxLayout; buttonLayout->addWidget(_getSettings); buttonLayout->addStretch(); buttonLayout->setContentsMargins(0, 0, 0, 0); - QVBoxLayout *mainLayout = new QVBoxLayout; - mainLayout->addLayout(entryLayout); - mainLayout->addWidget(_settings); + auto mainLayout = new QVBoxLayout; + mainLayout->addLayout(entrylayout); + mainLayout->addLayout(_settingsLayout); + mainLayout->addWidget(_settingsString); mainLayout->addLayout(buttonLayout); setLayout(mainLayout); @@ -178,12 +264,16 @@ void MacroActionFilterEdit::UpdateEntryData() _actions->setCurrentIndex(static_cast(_entryData->_action)); _sources->SetSource(_entryData->_source); _filters->SetFilter(_entryData->_source, _entryData->_filter); - _settings->setPlainText(_entryData->_settings); - SetWidgetVisibility(_entryData->_action == - MacroActionFilter::Action::SETTINGS); - - adjustSize(); - updateGeometry(); + _settingsString->setPlainText(_entryData->_settingsString); + const auto filters = + _entryData->_filter.GetFilters(_entryData->_source); + _filterSettings->SetSource(filters.empty() ? nullptr : filters.at(0)); + _filterSettings->SetSetting(_entryData->_setting); + _settingsInputMethods->setCurrentIndex(_settingsInputMethods->findData( + static_cast(_entryData->_settingsInputMethod))); + _tempVars->SetVariable(_entryData->_tempVar); + _manualSettingValue->setPlainText(_entryData->_manualSettingValue); + SetWidgetVisibility(); } void MacroActionFilterEdit::SourceChanged(const SourceSelection &source) @@ -202,8 +292,13 @@ void MacroActionFilterEdit::FilterChanged(const FilterSelection &filter) return; } - auto lock = LockContext(); - _entryData->_filter = filter; + { + auto lock = LockContext(); + _entryData->_filter = filter; + } + const auto filters = + _entryData->_filter.GetFilters(_entryData->_source); + _filterSettings->SetSource(filters.empty() ? nullptr : filters.at(0)); emit HeaderInfoChanged( QString::fromStdString(_entryData->GetShortDesc())); } @@ -216,8 +311,7 @@ void MacroActionFilterEdit::ActionChanged(int value) auto lock = LockContext(); _entryData->_action = static_cast(value); - SetWidgetVisibility(_entryData->_action == - MacroActionFilter::Action::SETTINGS); + SetWidgetVisibility(); } void MacroActionFilterEdit::GetSettingsClicked() @@ -227,27 +321,115 @@ void MacroActionFilterEdit::GetSettingsClicked() return; } - _settings->setPlainText(FormatJsonString(GetSourceSettings( - _entryData->_filter.GetFilters(_entryData->_source).at(0)))); + switch (_entryData->_settingsInputMethod) { + case MacroActionFilter::SettingsInputMethod::INDIVIDUAL_MANUAL: { + const auto filters = + _entryData->_filter.GetFilters(_entryData->_source); + _manualSettingValue->setPlainText(GetSourceSettingValue( + filters.empty() ? nullptr : filters.at(0), + _entryData->_setting)); + break; + } + case MacroActionFilter::SettingsInputMethod::INDIVIDUAL_TEMPVAR: + break; + case MacroActionFilter::SettingsInputMethod::JSON_STRING: { + const auto filters = + _entryData->_filter.GetFilters(_entryData->_source); + _settingsString->setPlainText( + FormatJsonString(GetSourceSettings( + filters.empty() ? nullptr : filters.at(0)))); + break; + } + } } -void MacroActionFilterEdit::SettingsChanged() +void MacroActionFilterEdit::SettingsStringChanged() { if (_loading || !_entryData) { return; } auto lock = LockContext(); - _entryData->_settings = _settings->toPlainText().toStdString(); + _entryData->_settingsString = + _settingsString->toPlainText().toStdString(); adjustSize(); updateGeometry(); } -void MacroActionFilterEdit::SetWidgetVisibility(bool showSettings) +void MacroActionFilterEdit::SettingsInputMethodChanged(int idx) { - _settings->setVisible(showSettings); - _getSettings->setVisible(showSettings); + if (_loading || !_entryData) { + return; + } + + auto lock = LockContext(); + _entryData->_settingsInputMethod = + static_cast( + _settingsInputMethods->itemData(idx).toInt()); + SetWidgetVisibility(); +} + +void MacroActionFilterEdit::SelectionChanged(const TempVariableRef &var) +{ + if (_loading || !_entryData) { + return; + } + + auto lock = LockContext(); + _entryData->_tempVar = var; +} + +void MacroActionFilterEdit::SelectionChanged(const SourceSetting &setting) +{ + if (_loading || !_entryData) { + return; + } + + auto lock = LockContext(); + _entryData->_setting = setting; +} + +void MacroActionFilterEdit::ManualSettingsValueChanged() +{ + if (_loading || !_entryData) { + return; + } + + auto lock = LockContext(); + _entryData->_manualSettingValue = + _manualSettingValue->toPlainText().toStdString(); + + adjustSize(); + updateGeometry(); +} + +void MacroActionFilterEdit::SetWidgetVisibility() +{ + SetLayoutVisible(_settingsLayout, + _entryData->_action == + MacroActionFilter::Action::SETTINGS); + _filterSettings->setVisible( + _entryData->_action == MacroActionFilter::Action::SETTINGS && + _entryData->_settingsInputMethod != + MacroActionFilter::SettingsInputMethod::JSON_STRING); + _settingsString->setVisible( + _entryData->_action == MacroActionFilter::Action::SETTINGS && + _entryData->_settingsInputMethod == + MacroActionFilter::SettingsInputMethod::JSON_STRING); + _getSettings->setVisible(_entryData->_action == + MacroActionFilter::Action::SETTINGS); + _tempVars->setVisible(_entryData->_action == + MacroActionFilter::Action::SETTINGS && + _entryData->_settingsInputMethod == + MacroActionFilter::SettingsInputMethod:: + INDIVIDUAL_TEMPVAR); + _manualSettingValue->setVisible( + _entryData->_action == MacroActionFilter::Action::SETTINGS && + _entryData->_settingsInputMethod == + MacroActionFilter::SettingsInputMethod:: + INDIVIDUAL_MANUAL); + adjustSize(); updateGeometry(); } diff --git a/src/macro-core/macro-action-filter.hpp b/src/macro-core/macro-action-filter.hpp index ac1f7562..8b092d5e 100644 --- a/src/macro-core/macro-action-filter.hpp +++ b/src/macro-core/macro-action-filter.hpp @@ -3,6 +3,7 @@ #include "variable-text-edit.hpp" #include "source-selection.hpp" #include "filter-selection.hpp" +#include "source-setting.hpp" #include #include @@ -31,10 +32,21 @@ public: SETTINGS, }; + enum class SettingsInputMethod { + INDIVIDUAL_MANUAL, + INDIVIDUAL_TEMPVAR, + JSON_STRING, + }; + SettingsInputMethod _settingsInputMethod = + SettingsInputMethod::INDIVIDUAL_MANUAL; + SourceSelection _source; FilterSelection _filter; Action _action = Action::ENABLE; - StringVariable _settings = ""; + StringVariable _settingsString = ""; + TempVariableRef _tempVar; + StringVariable _manualSettingValue = ""; + SourceSetting _setting; private: static bool _registered; @@ -62,7 +74,11 @@ private slots: void FilterChanged(const FilterSelection &); void ActionChanged(int value); void GetSettingsClicked(); - void SettingsChanged(); + void SettingsStringChanged(); + void SettingsInputMethodChanged(int); + void SelectionChanged(const TempVariableRef &); + void SelectionChanged(const SourceSetting &); + void ManualSettingsValueChanged(); signals: void HeaderInfoChanged(const QString &); @@ -71,11 +87,17 @@ protected: FilterSelectionWidget *_filters; QComboBox *_actions; QPushButton *_getSettings; - VariableTextEdit *_settings; + QHBoxLayout *_settingsLayout; + QComboBox *_settingsInputMethods; + VariableTextEdit *_manualSettingValue; + TempVariableSelection *_tempVars; + SourceSettingSelection *_filterSettings; + VariableTextEdit *_settingsString; + std::shared_ptr _entryData; private: - void SetWidgetVisibility(bool); + void SetWidgetVisibility(); bool _loading = true; }; diff --git a/src/macro-core/macro-action-source.cpp b/src/macro-core/macro-action-source.cpp index 3034a430..8146f283 100644 --- a/src/macro-core/macro-action-source.cpp +++ b/src/macro-core/macro-action-source.cpp @@ -64,6 +64,16 @@ const static std::map "AdvSceneSwitcher.action.source.deinterlaceOrder.bottomFieldFirst"}, }; +const static std::map + inputMethods = { + {MacroActionSource::SettingsInputMethod::INDIVIDUAL_MANUAL, + "AdvSceneSwitcher.action.source.inputMethod.individualManual"}, + {MacroActionSource::SettingsInputMethod::INDIVIDUAL_TEMPVAR, + "AdvSceneSwitcher.action.source.inputMethod.individualTempvar"}, + {MacroActionSource::SettingsInputMethod::JSON_STRING, + "AdvSceneSwitcher.action.source.inputMethod.json"}, +}; + static std::vector getSourceButtons(OBSWeakSource source) { auto s = obs_weak_source_get_source(source); @@ -79,6 +89,7 @@ static std::vector getSourceButtons(OBSWeakSource source) buttons.emplace_back(button); } while (obs_property_next(&it)); obs_source_release(s); + obs_properties_destroy(sourceProperties); return buttons; } @@ -133,7 +144,26 @@ bool MacroActionSource::PerformAction() obs_source_set_enabled(s, false); break; case Action::SETTINGS: - SetSourceSettings(s, _settings); + switch (_settingsInputMethod) { + case SettingsInputMethod::INDIVIDUAL_MANUAL: + SetSourceSetting(s, _setting, _manualSettingValue); + break; + case SettingsInputMethod::INDIVIDUAL_TEMPVAR: { + auto var = _tempVar.GetTempVariable(GetMacro()); + if (!var) { + break; + } + auto value = var->Value(); + if (!value) { + break; + } + SetSourceSetting(s, _setting, *value); + break; + } + case SettingsInputMethod::JSON_STRING: + SetSourceSettings(s, _settingsString); + break; + } break; case Action::REFRESH_SETTINGS: refreshSourceSettings(s); @@ -188,7 +218,12 @@ bool MacroActionSource::Save(obs_data_t *obj) const _source.Save(obj); obs_data_set_int(obj, "action", static_cast(_action)); _button.Save(obj); - _settings.Save(obj, "settings"); + obs_data_set_int(obj, "inputMethod", + static_cast(_settingsInputMethod)); + _setting.Save(obj); + _manualSettingValue.Save(obj, "manualSettingValue"); + _tempVar.Save(obj); + _settingsString.Save(obj, "settings"); obs_data_set_int(obj, "deinterlaceMode", static_cast(_deinterlaceMode)); obs_data_set_int(obj, "deinterlaceOrder", @@ -202,7 +237,17 @@ bool MacroActionSource::Load(obs_data_t *obj) _source.Load(obj); _action = static_cast(obs_data_get_int(obj, "action")); _button.Load(obj); - _settings.Load(obj, "settings"); + // TODO: Remove fallback in future version + if (obs_data_has_user_value(obj, "inputMethod")) { + _settingsInputMethod = static_cast( + obs_data_get_int(obj, "inputMethod")); + } else { + _settingsInputMethod = SettingsInputMethod::JSON_STRING; + } + _setting.Load(obj); + _settingsString.Load(obj, "settings"); + _manualSettingValue.Load(obj, "manualSettingValue"); + _tempVar.Load(obj, GetMacro()); _deinterlaceMode = static_cast( obs_data_get_int(obj, "deinterlaceMode")); _deinterlaceOrder = static_cast( @@ -265,19 +310,34 @@ static inline void populateDeinterlaceFieldOrderSelection(QComboBox *list) } } +static inline void populateSettingsInputMethods(QComboBox *list) +{ + list->clear(); + for (const auto &[value, name] : inputMethods) { + list->addItem(obs_module_text(name.c_str()), + static_cast(value)); + } +} + MacroActionSourceEdit::MacroActionSourceEdit( QWidget *parent, std::shared_ptr entryData) : QWidget(parent), _sources(new SourceSelectionWidget(this, QStringList(), true)), _actions(new QComboBox()), _settingsButtons(new QComboBox()), + _settingsLayout(new QHBoxLayout()), + _settingsInputMethods(new QComboBox(this)), + _manualSettingValue(new VariableTextEdit(this, 5, 1, 1)), + _tempVars(new TempVariableSelection(this)), + _sourceSettings(new SourceSettingSelection(this)), + _settingsString(new VariableTextEdit(this)), _getSettings(new QPushButton(obs_module_text( "AdvSceneSwitcher.action.source.getSettings"))), - _settings(new VariableTextEdit(this)), _deinterlaceMode(new QComboBox()), _deinterlaceOrder(new QComboBox()), _warning(new QLabel( obs_module_text("AdvSceneSwitcher.action.source.warning"))) + { populateActionSelection(_actions); auto sources = GetSourceNames(); @@ -285,6 +345,7 @@ MacroActionSourceEdit::MacroActionSourceEdit( _sources->SetSourceNameList(sources); populateDeinterlaceModeSelection(_deinterlaceMode); populateDeinterlaceFieldOrderSelection(_deinterlaceOrder); + populateSettingsInputMethods(_settingsInputMethods); QWidget::connect(_actions, SIGNAL(currentIndexChanged(int)), this, SLOT(ActionChanged(int))); @@ -295,20 +356,33 @@ MacroActionSourceEdit::MacroActionSourceEdit( SLOT(SourceChanged(const SourceSelection &))); QWidget::connect(_getSettings, SIGNAL(clicked()), this, SLOT(GetSettingsClicked())); - QWidget::connect(_settings, SIGNAL(textChanged()), this, - SLOT(SettingsChanged())); + QWidget::connect(_settingsString, SIGNAL(textChanged()), this, + SLOT(SettingsStringChanged())); QWidget::connect(_deinterlaceMode, SIGNAL(currentIndexChanged(int)), this, SLOT(DeinterlaceModeChanged(int))); QWidget::connect(_deinterlaceOrder, SIGNAL(currentIndexChanged(int)), this, SLOT(DeinterlaceOrderChanged(int))); + QWidget::connect(_tempVars, + SIGNAL(SelectionChanged(const TempVariableRef &)), + this, SLOT(SelectionChanged(const TempVariableRef &))); + QWidget::connect(_settingsInputMethods, + SIGNAL(currentIndexChanged(int)), this, + SLOT(SettingsInputMethodChanged(int))); + QWidget::connect(_manualSettingValue, SIGNAL(textChanged()), this, + SLOT(ManualSettingsValueChanged())); + QWidget::connect(_sourceSettings, + SIGNAL(SelectionChanged(const SourceSetting &)), this, + SLOT(SelectionChanged(const SourceSetting &))); - QVBoxLayout *mainLayout = new QVBoxLayout; - QHBoxLayout *entryLayout = new QHBoxLayout; - QHBoxLayout *buttonLayout = new QHBoxLayout; + auto entryLayout = new QHBoxLayout; + entryLayout->setContentsMargins(0, 0, 0, 0); std::unordered_map widgetPlaceholders = { {"{{sources}}", _sources}, {"{{actions}}", _actions}, - {"{{settings}}", _settings}, + {"{{settings}}", _sourceSettings}, + {"{{settingsInputMethod}}", _settingsInputMethods}, + {"{{settingValue}}", _manualSettingValue}, + {"{{tempVar}}", _tempVars}, {"{{getSettings}}", _getSettings}, {"{{settingsButtons}}", _settingsButtons}, {"{{deinterlaceMode}}", _deinterlaceMode}, @@ -316,9 +390,17 @@ MacroActionSourceEdit::MacroActionSourceEdit( }; PlaceWidgets(obs_module_text("AdvSceneSwitcher.action.source.entry"), entryLayout, widgetPlaceholders); + _settingsLayout->setContentsMargins(0, 0, 0, 0); + PlaceWidgets(obs_module_text( + "AdvSceneSwitcher.action.source.entry.settings"), + _settingsLayout, widgetPlaceholders); + auto mainLayout = new QVBoxLayout; mainLayout->addLayout(entryLayout); + mainLayout->addLayout(_settingsLayout); mainLayout->addWidget(_warning); - mainLayout->addWidget(_settings); + mainLayout->addWidget(_settingsString); + auto buttonLayout = new QHBoxLayout; + buttonLayout->setContentsMargins(0, 0, 0, 0); buttonLayout->addWidget(_getSettings); buttonLayout->addStretch(); mainLayout->addLayout(buttonLayout); @@ -339,13 +421,20 @@ void MacroActionSourceEdit::UpdateEntryData() _entryData->_source.GetSource()); _actions->setCurrentIndex(static_cast(_entryData->_action)); _sources->SetSource(_entryData->_source); + _sourceSettings->SetSource(_entryData->_source.GetSource()); + _sourceSettings->SetSetting(_entryData->_setting); _settingsButtons->setCurrentText( QString::fromStdString(_entryData->_button.ToString())); - _settings->setPlainText(_entryData->_settings); + _settingsString->setPlainText(_entryData->_settingsString); _deinterlaceMode->setCurrentIndex(_deinterlaceMode->findData( static_cast(_entryData->_deinterlaceMode))); _deinterlaceOrder->setCurrentIndex(_deinterlaceOrder->findData( static_cast(_entryData->_deinterlaceOrder))); + _settingsInputMethods->setCurrentIndex(_settingsInputMethods->findData( + static_cast(_entryData->_settingsInputMethod))); + _tempVars->SetVariable(_entryData->_tempVar); + _manualSettingValue->setPlainText(_entryData->_manualSettingValue); + SetWidgetVisibility(); } @@ -361,6 +450,7 @@ void MacroActionSourceEdit::SourceChanged(const SourceSelection &source) } populateSourceButtonSelection(_settingsButtons, _entryData->_source.GetSource()); + _sourceSettings->SetSource(_entryData->_source.GetSource()); emit HeaderInfoChanged( QString::fromStdString(_entryData->GetShortDesc())); } @@ -393,18 +483,29 @@ void MacroActionSourceEdit::GetSettingsClicked() return; } - _settings->setPlainText(FormatJsonString( - GetSourceSettings(_entryData->_source.GetSource()))); + switch (_entryData->_settingsInputMethod) { + case MacroActionSource::SettingsInputMethod::INDIVIDUAL_MANUAL: + _manualSettingValue->setPlainText(GetSourceSettingValue( + _entryData->_source.GetSource(), _entryData->_setting)); + break; + case MacroActionSource::SettingsInputMethod::INDIVIDUAL_TEMPVAR: + break; + case MacroActionSource::SettingsInputMethod::JSON_STRING: + _settingsString->setPlainText(FormatJsonString( + GetSourceSettings(_entryData->_source.GetSource()))); + break; + } } -void MacroActionSourceEdit::SettingsChanged() +void MacroActionSourceEdit::SettingsStringChanged() { if (_loading || !_entryData) { return; } auto lock = LockContext(); - _entryData->_settings = _settings->toPlainText().toStdString(); + _entryData->_settingsString = + _settingsString->toPlainText().toStdString(); adjustSize(); updateGeometry(); @@ -433,15 +534,81 @@ void MacroActionSourceEdit::DeinterlaceOrderChanged(int idx) _deinterlaceOrder->itemData(idx).toInt()); } +void MacroActionSourceEdit::SelectionChanged(const TempVariableRef &var) +{ + if (_loading || !_entryData) { + return; + } + + auto lock = LockContext(); + _entryData->_tempVar = var; +} + +void MacroActionSourceEdit::SettingsInputMethodChanged(int idx) +{ + if (_loading || !_entryData) { + return; + } + + auto lock = LockContext(); + _entryData->_settingsInputMethod = + static_cast( + _settingsInputMethods->itemData(idx).toInt()); + SetWidgetVisibility(); +} + +void MacroActionSourceEdit::SelectionChanged(const SourceSetting &setting) +{ + if (_loading || !_entryData) { + return; + } + + auto lock = LockContext(); + _entryData->_setting = setting; +} + +void MacroActionSourceEdit::ManualSettingsValueChanged() +{ + if (_loading || !_entryData) { + return; + } + + auto lock = LockContext(); + _entryData->_manualSettingValue = + _manualSettingValue->toPlainText().toStdString(); + + adjustSize(); + updateGeometry(); +} + void MacroActionSourceEdit::SetWidgetVisibility() { - const bool showSettings = _entryData->_action == - MacroActionSource::Action::SETTINGS; + SetLayoutVisible(_settingsLayout, + _entryData->_action == + MacroActionSource::Action::SETTINGS); + _sourceSettings->setVisible( + _entryData->_action == MacroActionSource::Action::SETTINGS && + _entryData->_settingsInputMethod != + MacroActionSource::SettingsInputMethod::JSON_STRING); + _settingsString->setVisible( + _entryData->_action == MacroActionSource::Action::SETTINGS && + _entryData->_settingsInputMethod == + MacroActionSource::SettingsInputMethod::JSON_STRING); + _getSettings->setVisible(_entryData->_action == + MacroActionSource::Action::SETTINGS); + _tempVars->setVisible(_entryData->_action == + MacroActionSource::Action::SETTINGS && + _entryData->_settingsInputMethod == + MacroActionSource::SettingsInputMethod:: + INDIVIDUAL_TEMPVAR); + _manualSettingValue->setVisible( + _entryData->_action == MacroActionSource::Action::SETTINGS && + _entryData->_settingsInputMethod == + MacroActionSource::SettingsInputMethod:: + INDIVIDUAL_MANUAL); const bool showWarning = _entryData->_action == MacroActionSource::Action::ENABLE || _entryData->_action == MacroActionSource::Action::DISABLE; - _settings->setVisible(showSettings); - _getSettings->setVisible(showSettings); _warning->setVisible(showWarning); _settingsButtons->setVisible( _entryData->_action == diff --git a/src/macro-core/macro-action-source.hpp b/src/macro-core/macro-action-source.hpp index 0d762c41..297142db 100644 --- a/src/macro-core/macro-action-source.hpp +++ b/src/macro-core/macro-action-source.hpp @@ -2,6 +2,7 @@ #include "macro-action-edit.hpp" #include "variable-text-edit.hpp" #include "source-selection.hpp" +#include "source-setting.hpp" #include #include @@ -35,10 +36,13 @@ public: SourceSelection _source; SourceSettingButton _button; - StringVariable _settings = ""; + StringVariable _settingsString = ""; + StringVariable _manualSettingValue = ""; obs_deinterlace_mode _deinterlaceMode = OBS_DEINTERLACE_MODE_DISABLE; obs_deinterlace_field_order _deinterlaceOrder = OBS_DEINTERLACE_FIELD_ORDER_TOP; + TempVariableRef _tempVar; + SourceSetting _setting; enum class Action { ENABLE, @@ -52,7 +56,15 @@ public: OPEN_FILTER_DIALOG, OPEN_PROPERTIES_DIALOG, }; - Action _action = Action::ENABLE; + Action _action = Action::SETTINGS; + + enum class SettingsInputMethod { + INDIVIDUAL_MANUAL, + INDIVIDUAL_TEMPVAR, + JSON_STRING, + }; + SettingsInputMethod _settingsInputMethod = + SettingsInputMethod::INDIVIDUAL_MANUAL; private: static bool _registered; @@ -80,9 +92,13 @@ private slots: void ActionChanged(int value); void ButtonChanged(int idx); void GetSettingsClicked(); - void SettingsChanged(); + void SettingsStringChanged(); void DeinterlaceModeChanged(int); void DeinterlaceOrderChanged(int); + void SelectionChanged(const TempVariableRef &); + void SettingsInputMethodChanged(int); + void SelectionChanged(const SourceSetting &); + void ManualSettingsValueChanged(); signals: void HeaderInfoChanged(const QString &); @@ -90,11 +106,17 @@ protected: SourceSelectionWidget *_sources; QComboBox *_actions; QComboBox *_settingsButtons; + QHBoxLayout *_settingsLayout; + QComboBox *_settingsInputMethods; + VariableTextEdit *_manualSettingValue; + TempVariableSelection *_tempVars; + SourceSettingSelection *_sourceSettings; + VariableTextEdit *_settingsString; QPushButton *_getSettings; - VariableTextEdit *_settings; QComboBox *_deinterlaceMode; QComboBox *_deinterlaceOrder; QLabel *_warning; + std::shared_ptr _entryData; private: