Add option to expose current settings of source as temp var

This commit is contained in:
WarmUpTill 2026-03-19 20:05:11 +01:00 committed by WarmUpTill
parent 3eb79e3adb
commit f66bec8caf
3 changed files with 102 additions and 43 deletions

View File

@ -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\""

View File

@ -45,6 +45,10 @@ const static std::map<MacroActionSource::Action, std::string> 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<obs_deinterlace_mode, std::string> 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<int>(_entryData->_action));
_actions->setCurrentIndex(static_cast<int>(_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<MacroActionSource::Action>(value);
_entryData->SetAction(static_cast<MacroActionSource::Action>(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();

View File

@ -24,17 +24,7 @@ public:
static std::shared_ptr<MacroAction> Create(Macro *m);
std::shared_ptr<MacroAction> 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;
};