diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index f2641368..64345e5c 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -949,6 +949,8 @@ AdvSceneSwitcher.action.source.type.openPropertiesDialog="Open properties dialog AdvSceneSwitcher.action.source.type.closeInteractionDialog="Close interaction dialog" AdvSceneSwitcher.action.source.type.closeFilterDialog="Close filter dialog" AdvSceneSwitcher.action.source.type.closePropertiesDialog="Close properties dialog" +AdvSceneSwitcher.action.source.type.getSetting="Get setting value" +AdvSceneSwitcher.action.source.type.getSettings="Get settings JSON" AdvSceneSwitcher.action.source.entry="{{actions}}{{sources}}{{settingsButtons}}{{deinterlaceMode}}{{deinterlaceOrder}}{{refresh}}" 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\"" diff --git a/plugins/base/macro-action-source.cpp b/plugins/base/macro-action-source.cpp index b2e072fe..cc88ca8a 100644 --- a/plugins/base/macro-action-source.cpp +++ b/plugins/base/macro-action-source.cpp @@ -45,6 +45,10 @@ const static std::map actionTypes = { "AdvSceneSwitcher.action.source.type.closeFilterDialog"}, {MacroActionSource::Action::CLOSE_PROPERTIES_DIALOG, "AdvSceneSwitcher.action.source.type.closePropertiesDialog"}, + {MacroActionSource::Action::GET_SETTING, + "AdvSceneSwitcher.action.source.type.getSetting"}, + {MacroActionSource::Action::GET_SETTINGS, + "AdvSceneSwitcher.action.source.type.getSettings"}, }; const static std::map deinterlaceModes = { @@ -273,6 +277,22 @@ bool MacroActionSource::PerformAction() "OBSBasicProperties"); }); break; + case Action::GET_SETTING: { + const auto value = + GetSourceSettingValue(_source.GetSource(), _setting); + if (value) { + SetTempVarValue("setting", *value); + } + break; + } + case Action::GET_SETTINGS: { + const auto settings = + GetSourceSettings(_source.GetSource(), true); + if (settings) { + SetTempVarValue("settings", *settings); + } + break; + } default: break; } @@ -360,6 +380,31 @@ void MacroActionSource::ResolveVariablesToFixedValues() _manualSettingValue.ResolveVariables(); } +void MacroActionSource::SetupTempVars() +{ + MacroAction::SetupTempVars(); + switch (_action) { + case Action::GET_SETTING: + AddTempvar("setting", + obs_module_text( + "AdvSceneSwitcher.tempVar.source.setting")); + break; + case Action::GET_SETTINGS: + AddTempvar("settings", + obs_module_text( + "AdvSceneSwitcher.tempVar.source.settings")); + break; + default: + break; + } +} + +void MacroActionSource::SetAction(Action action) +{ + _action = action; + SetupTempVars(); +} + static inline void populateActionSelection(QComboBox *list) { for (auto &[actionType, name] : actionTypes) { @@ -502,7 +547,7 @@ void MacroActionSourceEdit::UpdateEntryData() const auto weakSource = _entryData->_source.GetSource(); _settingsButtons->SetSelection(weakSource, _entryData->_button); - _actions->setCurrentIndex(static_cast(_entryData->_action)); + _actions->setCurrentIndex(static_cast(_entryData->GetAction())); _sources->SetSource(_entryData->_source); _sourceSettings->SetSelection(weakSource, _entryData->_setting); _settingsString->setPlainText(_entryData->_settingsString); @@ -537,7 +582,7 @@ void MacroActionSourceEdit::SourceChanged(const SourceSelection &source) void MacroActionSourceEdit::ActionChanged(int value) { GUARD_LOADING_AND_LOCK(); - _entryData->_action = static_cast(value); + _entryData->SetAction(static_cast(value)); SetWidgetVisibility(); } @@ -664,19 +709,29 @@ static QString GetIndividualListEntryName() void MacroActionSourceEdit::SetWidgetVisibility() { + const auto action = _entryData->GetAction(); + + const bool isSetSettings = action == + MacroActionSource::Action::SETTINGS; + const bool isGetSetting = action == + MacroActionSource::Action::GET_SETTING; + const bool isGetSettings = action == + MacroActionSource::Action::GET_SETTINGS; + SetLayoutVisible(_settingsLayout, - _entryData->_action == - MacroActionSource::Action::SETTINGS); + isSetSettings || isGetSetting || isGetSettings); + _settingsInputMethods->setVisible(isSetSettings); _sourceSettings->setVisible( - _entryData->_action == MacroActionSource::Action::SETTINGS && - _entryData->_settingsInputMethod != - MacroActionSource::SettingsInputMethod::JSON_STRING); + (isSetSettings && + _entryData->_settingsInputMethod != + MacroActionSource::SettingsInputMethod::JSON_STRING) || + isGetSetting); _settingsString->setVisible( - _entryData->_action == MacroActionSource::Action::SETTINGS && + isSetSettings && _entryData->_settingsInputMethod == MacroActionSource::SettingsInputMethod::JSON_STRING); _getSettings->setVisible( - _entryData->_action == MacroActionSource::Action::SETTINGS && + isSetSettings && _entryData->_settingsInputMethod != MacroActionSource::SettingsInputMethod:: INDIVIDUAL_TEMPVAR); @@ -685,13 +740,12 @@ void MacroActionSourceEdit::SetWidgetVisibility() GetIndividualListEntryName(), _entryData->_setting.IsList()); - _tempVars->setVisible(_entryData->_action == - MacroActionSource::Action::SETTINGS && + _tempVars->setVisible(isSetSettings && _entryData->_settingsInputMethod == MacroActionSource::SettingsInputMethod:: INDIVIDUAL_TEMPVAR); - if (_entryData->_action == MacroActionSource::Action::SETTINGS && + if (isSetSettings && (_entryData->_settingsInputMethod == MacroActionSource::SettingsInputMethod::INDIVIDUAL_MANUAL || _entryData->_settingsInputMethod == @@ -704,35 +758,31 @@ void MacroActionSourceEdit::SetWidgetVisibility() _manualSettingValue->hide(); } - const bool showWarning = - _entryData->_action == MacroActionSource::Action::ENABLE || - _entryData->_action == MacroActionSource::Action::DISABLE; + const bool showWarning = action == MacroActionSource::Action::ENABLE || + action == MacroActionSource::Action::DISABLE; _warning->setVisible(showWarning); _settingsButtons->setVisible( - _entryData->_action == - MacroActionSource::Action::SETTINGS_BUTTON); + action == MacroActionSource::Action::SETTINGS_BUTTON); _deinterlaceMode->setVisible( - _entryData->_action == - MacroActionSource::Action::DEINTERLACE_MODE); + action == MacroActionSource::Action::DEINTERLACE_MODE); _deinterlaceOrder->setVisible( - _entryData->_action == - MacroActionSource::Action::DEINTERLACE_FIELD_ORDER); + action == MacroActionSource::Action::DEINTERLACE_FIELD_ORDER); _refreshSettingSelection->setVisible( - (_entryData->_settingsInputMethod == - MacroActionSource::SettingsInputMethod:: - INDIVIDUAL_MANUAL || - _entryData->_settingsInputMethod == - MacroActionSource::SettingsInputMethod:: - INDIVIDUAL_LIST_ENTRY) && + ((isSetSettings && + (_entryData->_settingsInputMethod == + MacroActionSource::SettingsInputMethod:: + INDIVIDUAL_MANUAL || + _entryData->_settingsInputMethod == + MacroActionSource::SettingsInputMethod:: + INDIVIDUAL_LIST_ENTRY)) || + isGetSetting) && _entryData->_source.GetType() == SourceSelection::Type::VARIABLE); _acceptDialog->setVisible( - _entryData->_action == - MacroActionSource::Action::CLOSE_FILTER_DIALOG || - _entryData->_action == - MacroActionSource::Action::CLOSE_PROPERTIES_DIALOG); + action == MacroActionSource::Action::CLOSE_FILTER_DIALOG || + action == MacroActionSource::Action::CLOSE_PROPERTIES_DIALOG); adjustSize(); updateGeometry(); diff --git a/plugins/base/macro-action-source.hpp b/plugins/base/macro-action-source.hpp index 8e17592a..ebb4c42f 100644 --- a/plugins/base/macro-action-source.hpp +++ b/plugins/base/macro-action-source.hpp @@ -24,17 +24,7 @@ public: static std::shared_ptr Create(Macro *m); std::shared_ptr Copy() const; void ResolveVariablesToFixedValues(); - - SourceSelection _source; - SourceSettingButton _button; - 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; - bool _acceptDialog = false; + void SetupTempVars(); enum class Action { ENABLE, @@ -50,8 +40,23 @@ public: CLOSE_INTERACTION_DIALOG, CLOSE_FILTER_DIALOG, CLOSE_PROPERTIES_DIALOG, + GET_SETTING, + GET_SETTINGS, }; - Action _action = Action::SETTINGS; + + void SetAction(Action); + Action GetAction() const { return _action; } + + SourceSelection _source; + SourceSettingButton _button; + 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; + bool _acceptDialog = false; enum class SettingsInputMethod { INDIVIDUAL_MANUAL, @@ -63,6 +68,8 @@ public: SettingsInputMethod::INDIVIDUAL_MANUAL; private: + Action _action = Action::SETTINGS; + static bool _registered; static const std::string id; };