From d8d73f0cd46030fe6b5fd788e6c6e33283aca3d8 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Sat, 10 Feb 2024 21:32:26 +0100 Subject: [PATCH] Show refresh button if source / filter selection is a variable --- data/locale/de-DE.ini | 5 +-- data/locale/en-US.ini | 16 ++++++-- data/locale/es-ES.ini | 5 +-- data/locale/fr-FR.ini | 4 +- data/locale/tr-TR.ini | 5 +-- data/locale/zh-CN.ini | 5 +-- plugins/base/macro-action-filter.cpp | 36 +++++++++++++++--- plugins/base/macro-action-filter.hpp | 2 + plugins/base/macro-action-source.cpp | 31 +++++++++++++--- plugins/base/macro-action-source.hpp | 3 ++ plugins/base/macro-condition-filter.cpp | 49 ++++++++++++++++++++----- plugins/base/macro-condition-filter.hpp | 2 + plugins/base/macro-condition-source.cpp | 49 +++++++++++++++++++------ plugins/base/macro-condition-source.hpp | 2 + plugins/base/utils/source-setting.cpp | 14 ++++--- plugins/base/utils/source-setting.hpp | 5 ++- 16 files changed, 175 insertions(+), 58 deletions(-) diff --git a/data/locale/de-DE.ini b/data/locale/de-DE.ini index c959b7c6..d913a81a 100644 --- a/data/locale/de-DE.ini +++ b/data/locale/de-DE.ini @@ -276,7 +276,7 @@ AdvSceneSwitcher.condition.filter.type.active="Ist aktiviert" AdvSceneSwitcher.condition.filter.type.showing="Ist deaktiviert" AdvSceneSwitcher.condition.filter.type.settingsMatch="Einstellungen passen" AdvSceneSwitcher.condition.filter.getSettings="Aktuelle Einstellungen abrufen" -AdvSceneSwitcher.condition.filter.entry.line1="Auf{{sources}}{{filters}}{{conditions}}{{settingSelection}}" +AdvSceneSwitcher.condition.filter.entry.line1="Auf{{sources}}{{filters}}{{conditions}}{{settingSelection}}{{refresh}}" AdvSceneSwitcher.condition.filter.entry.line2="{{settings}}" AdvSceneSwitcher.condition.filter.entry.line3="{{regex}} {{getSettings}}" AdvSceneSwitcher.condition.sceneOrder="Reihenfolge der Szenenelemente" @@ -445,7 +445,7 @@ AdvSceneSwitcher.action.filter="Filter" AdvSceneSwitcher.action.filter.type.enable="Aktivieren" AdvSceneSwitcher.action.filter.type.disable="Deaktivieren" AdvSceneSwitcher.action.filter.type.settings="Einstellungen festlegen" -AdvSceneSwitcher.action.filter.entry="Auf {{sources}} {{actions}} {{filters}}" +AdvSceneSwitcher.action.filter.entry="Auf{{sources}}{{actions}}{{filters}}{{filters}}{{refresh}}" AdvSceneSwitcher.action.filter.getSettings="Aktuelle Einstellungen abfragen" AdvSceneSwitcher.action.source="Quelle" AdvSceneSwitcher.action.source.type.enable="Aktivieren" @@ -455,7 +455,6 @@ AdvSceneSwitcher.action.source.type.refreshSettings="Aktualisieren der Quellenei AdvSceneSwitcher.action.source.type.pressSettingsButton="Drücken der Einstellungstaste" AdvSceneSwitcher.action.source.type.refreshSettings.tooltip="Kann verwendet werden, um Browser-, Medien- usw. Quellen zu aktualisieren" AdvSceneSwitcher.action.source.noSettingsButtons="Keine Buttons gefunden!" -AdvSceneSwitcher.action.source.entry="{{actions}}{{sources}}{{settingsButtons}}{{deinterlaceMode}}{{deinterlaceOrder}}" AdvSceneSwitcher.action.source.warning="Warnung: Das globale Aktivieren und Deaktivieren von Quellen kann nicht über die OBS-Benutzeroberfläche gesteuert werden" AdvSceneSwitcher.action.source.getSettings="Aktuelle Einstellungen abfragen" AdvSceneSwitcher.action.media="Medien" diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index ed6f8bce..4b7eb76a 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -380,9 +380,11 @@ AdvSceneSwitcher.condition.source.type.settingsMatch="Settings match" AdvSceneSwitcher.condition.source.type.settingsChanged="Settings changed" AdvSceneSwitcher.condition.source.type.individualSettingMatches="Setting value matches" AdvSceneSwitcher.condition.source.type.individualSettingChanged="Setting value changed" +AdvSceneSwitcher.condition.source.refresh="Refresh" +AdvSceneSwitcher.condition.source.refreshTooltip="Repopulate the source settings selection with the settings of the source which's name matches the variable value." AdvSceneSwitcher.condition.source.sceneVisibilityHint="Scene specific visibility can be checked using the \"Scene item visibility\" condition" AdvSceneSwitcher.condition.source.getSettings="Get current settings" -AdvSceneSwitcher.condition.source.entry.line1="{{sources}}{{conditions}}{{settingSelection}}" +AdvSceneSwitcher.condition.source.entry.line1="{{sources}}{{conditions}}{{settingSelection}}{{refresh}}" AdvSceneSwitcher.condition.source.entry.line2="{{settings}}" AdvSceneSwitcher.condition.source.entry.line3="{{regex}}{{getSettings}}" AdvSceneSwitcher.condition.virtualCamera="Virtual camera" @@ -396,8 +398,10 @@ AdvSceneSwitcher.condition.filter.type.settingsMatch="Settings match" AdvSceneSwitcher.condition.filter.type.settingsChanged="Settings changed" AdvSceneSwitcher.condition.filter.type.individualSettingMatches="Settings value matches" AdvSceneSwitcher.condition.filter.type.individualSettingChanged="Settings value changed" +AdvSceneSwitcher.condition.filter.refresh="Refresh" +AdvSceneSwitcher.condition.filter.refreshTooltip="Repopulate the filter settings selection with the settings of the filter which's name matches the variable value." AdvSceneSwitcher.condition.filter.getSettings="Get current settings" -AdvSceneSwitcher.condition.filter.entry.line1="On{{sources}}{{filters}}{{conditions}}{{settingSelection}}" +AdvSceneSwitcher.condition.filter.entry.line1="On{{sources}}{{filters}}{{conditions}}{{settingSelection}}{{refresh}}" AdvSceneSwitcher.condition.filter.entry.line2="{{settings}}" AdvSceneSwitcher.condition.filter.entry.line3="{{regex}}{{getSettings}}" AdvSceneSwitcher.condition.sceneOrder="Scene item order" @@ -665,7 +669,9 @@ AdvSceneSwitcher.action.filter.type.enable="Enable" 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.refresh="Refresh" +AdvSceneSwitcher.action.filter.refreshTooltip="Repopulate the filter settings selection with the settings of the filter which's name matches the variable value." +AdvSceneSwitcher.action.filter.entry="On{{sources}}{{actions}}{{filters}}{{refresh}}" 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" @@ -684,7 +690,7 @@ AdvSceneSwitcher.action.source.type.openInteractionDialog="Open interaction dial 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="{{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\"" AdvSceneSwitcher.action.source.getSettings="Get current settings" @@ -702,6 +708,8 @@ AdvSceneSwitcher.action.source.deinterlaceOrder.bottomFieldFirst="Bottom Field F 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.source.refresh="Refresh" +AdvSceneSwitcher.action.source.refreshTooltip="Repopulate the source settings selection with the settings of the source which's name matches the variable value." AdvSceneSwitcher.action.media="Media" AdvSceneSwitcher.action.media.type.play="Play" AdvSceneSwitcher.action.media.type.pause="Pause" diff --git a/data/locale/es-ES.ini b/data/locale/es-ES.ini index 928a82be..32e041bd 100644 --- a/data/locale/es-ES.ini +++ b/data/locale/es-ES.ini @@ -228,7 +228,7 @@ AdvSceneSwitcher.condition.filter.type.active="Está habilitado" AdvSceneSwitcher.condition.filter.type.showing="Está deshabilitado" AdvSceneSwitcher.condition.filter.type.settingsMatch="Coincidencia de configuración" AdvSceneSwitcher.condition.filter.getSettings="Obtener la configuración actual" -AdvSceneSwitcher.condition.filter.entry.line1="En{{sources}}{{filters}}{{conditions}}{{settingSelection}}" +AdvSceneSwitcher.condition.filter.entry.line1="En{{sources}}{{filters}}{{conditions}}{{settingSelection}}{{refresh}}" AdvSceneSwitcher.condition.filter.entry.line2="{{settings}}" AdvSceneSwitcher.condition.filter.entry.line3="{{regex}} {{getSettings}}" AdvSceneSwitcher.condition.sceneOrder="Orden de elementos de escena" @@ -367,13 +367,12 @@ AdvSceneSwitcher.action.filter="Filtro" AdvSceneSwitcher.action.filter.type.enable="Habilitar" AdvSceneSwitcher.action.filter.type.disable="Deshabilitar" AdvSceneSwitcher.action.filter.type.settings="Establecer configuración" -AdvSceneSwitcher.action.filter.entry="En {{sources}} {{actions}} {{filters}}" +AdvSceneSwitcher.action.filter.entry="En{{sources}}{{actions}}{{filters}}{{refresh}}" AdvSceneSwitcher.action.filter.getSettings="Obtener la configuración actual" AdvSceneSwitcher.action.source="Fuente" AdvSceneSwitcher.action.source.type.enable="Habilitar" AdvSceneSwitcher.action.source.type.disable="Deshabilitar" AdvSceneSwitcher.action.source.type.settings="Establecer configuración" -AdvSceneSwitcher.action.source.entry="{{actions}}{{sources}}{{settingsButtons}}{{deinterlaceMode}}{{deinterlaceOrder}}" AdvSceneSwitcher.action.source.warning="Advertencia: la IU de OBS no puede controlar la habilitación y deshabilitación global de fuentes" AdvSceneSwitcher.action.source.getSettings="Obtener la configuración actual" AdvSceneSwitcher.action.media="Medios" diff --git a/data/locale/fr-FR.ini b/data/locale/fr-FR.ini index be020b04..01efc250 100644 --- a/data/locale/fr-FR.ini +++ b/data/locale/fr-FR.ini @@ -343,7 +343,7 @@ AdvSceneSwitcher.condition.filter.type.showing="Est désactivé" AdvSceneSwitcher.condition.filter.type.settingsMatch="Correspond aux paramètres" AdvSceneSwitcher.condition.filter.type.settingsChanged="Paramètres modifiés" AdvSceneSwitcher.condition.filter.getSettings="Obtenir les paramètres actuels" -AdvSceneSwitcher.condition.filter.entry.line1="Sur{{sources}}{{filters}}{{conditions}}{{settingSelection}}" +AdvSceneSwitcher.condition.filter.entry.line1="Sur{{sources}}{{filters}}{{conditions}}{{settingSelection}}{{refresh}}" AdvSceneSwitcher.condition.sceneOrder="Ordre des éléments de la scène" AdvSceneSwitcher.condition.sceneOrder.type.above="Est au-dessus de" AdvSceneSwitcher.condition.sceneOrder.type.below="Est en dessous de" @@ -523,7 +523,7 @@ AdvSceneSwitcher.action.filter.type.enable="Activer" AdvSceneSwitcher.action.filter.type.disable="Désactiver" AdvSceneSwitcher.action.filter.type.toggle="Basculer" AdvSceneSwitcher.action.filter.type.settings="Définir les paramètres" -AdvSceneSwitcher.action.filter.entry="Sur{{sources}}{{actions}}{{filters}}" +AdvSceneSwitcher.action.filter.entry="Sur{{sources}}{{actions}}{{filters}}{{refresh}}" AdvSceneSwitcher.action.filter.getSettings="Obtenir les paramètres actuels" AdvSceneSwitcher.action.source="Source" AdvSceneSwitcher.action.source.type.enable="Activer" diff --git a/data/locale/tr-TR.ini b/data/locale/tr-TR.ini index 83f6f133..14c3f12d 100644 --- a/data/locale/tr-TR.ini +++ b/data/locale/tr-TR.ini @@ -204,7 +204,7 @@ AdvSceneSwitcher.condition.filter.type.active="Etkinleştirildi" AdvSceneSwitcher.condition.filter.type.showing="Etkisizleştirildi" AdvSceneSwitcher.condition.filter.type.settingsMatch="Ayarlar eşleşti" AdvSceneSwitcher.condition.filter.getSettings="Mevcut ayarları al" -AdvSceneSwitcher.condition.filter.entry.line1="Açık{{sources}}{{filters}}{{conditions}}{{settingSelection}}" +AdvSceneSwitcher.condition.filter.entry.line1="Açık{{sources}}{{filters}}{{conditions}}{{settingSelection}}{{refresh}}" AdvSceneSwitcher.condition.filter.entry.line2="{{settings}}" AdvSceneSwitcher.condition.filter.entry.line3="{{regex}} {{getSettings}}" AdvSceneSwitcher.condition.sceneOrder="Sahne öğesi sırası" @@ -297,13 +297,12 @@ AdvSceneSwitcher.action.filter="Filtrele" AdvSceneSwitcher.action.filter.type.enable="Etkin" AdvSceneSwitcher.action.filter.type.disable="Etkisiz" AdvSceneSwitcher.action.filter.type.settings="Ayarları yap" -AdvSceneSwitcher.action.filter.entry="Açık {{sources}} {{actions}} {{filters}}" +AdvSceneSwitcher.action.filter.entry="Açık{{sources}}{{actions}}{{filters}}{{refresh}}" AdvSceneSwitcher.action.filter.getSettings="Mevcut ayarları al" AdvSceneSwitcher.action.source="Kaynak" AdvSceneSwitcher.action.source.type.enable="Etkin" AdvSceneSwitcher.action.source.type.disable="Etkisiz" AdvSceneSwitcher.action.source.type.settings="Ayarları yap" -AdvSceneSwitcher.action.source.entry="{{actions}}{{sources}}{{settingsButtons}}{{deinterlaceMode}}{{deinterlaceOrder}}" AdvSceneSwitcher.action.source.warning="Uyarı: Kaynakların global olarak etkinleştirilmesi ve devre dışı bırakılması, OBS UI tarafından kontrol edilemez" AdvSceneSwitcher.action.source.getSettings="Mevcut Ayarları yap" AdvSceneSwitcher.action.media="Medya" diff --git a/data/locale/zh-CN.ini b/data/locale/zh-CN.ini index ca6f04a8..8ee7cd0d 100644 --- a/data/locale/zh-CN.ini +++ b/data/locale/zh-CN.ini @@ -322,7 +322,7 @@ AdvSceneSwitcher.condition.filter.type.active="已启用" AdvSceneSwitcher.condition.filter.type.showing="已关闭" AdvSceneSwitcher.condition.filter.type.settingsMatch="设置完全匹配" AdvSceneSwitcher.condition.filter.getSettings="获取当前设置" -AdvSceneSwitcher.condition.filter.entry.line1="在{{sources}}的{{filters}}是{{conditions}}{{settingSelection}}" +AdvSceneSwitcher.condition.filter.entry.line1="在{{sources}}的{{filters}}是{{conditions}}{{settingSelection}}{{refresh}}" AdvSceneSwitcher.condition.filter.entry.line2="{{settings}}" AdvSceneSwitcher.condition.filter.entry.line3="{{regex}} {{getSettings}}" AdvSceneSwitcher.condition.sceneOrder="场景项目顺序" @@ -502,7 +502,7 @@ AdvSceneSwitcher.action.filter="滤镜" AdvSceneSwitcher.action.filter.type.enable="开启" AdvSceneSwitcher.action.filter.type.disable="关闭" AdvSceneSwitcher.action.filter.type.settings="参数设置" -AdvSceneSwitcher.action.filter.entry="置 {{sources}} {{actions}} {{filters}}" +AdvSceneSwitcher.action.filter.entry="置{{sources}}{{actions}}{{filters}}{{refresh}}" AdvSceneSwitcher.action.filter.getSettings="获取当前设置" AdvSceneSwitcher.action.source="源" AdvSceneSwitcher.action.source.type.enable="启用" @@ -512,7 +512,6 @@ AdvSceneSwitcher.action.source.type.refreshSettings="刷新源设置" AdvSceneSwitcher.action.source.type.pressSettingsButton="按下设置按钮" AdvSceneSwitcher.action.source.type.refreshSettings.tooltip="可用于刷新浏览器、媒体、源、etc" AdvSceneSwitcher.action.source.noSettingsButtons="未找到按钮!" -AdvSceneSwitcher.action.source.entry="{{actions}}{{sources}}{{settingsButtons}}{{deinterlaceMode}}{{deinterlaceOrder}}" AdvSceneSwitcher.action.source.warning="警告:OBS UI无法控制全局启用和禁用源,注意,通过这个设置禁用,我测试,你必须通过这个在启用才行,不然点击小眼睛你无法显示!" AdvSceneSwitcher.action.source.getSettings="获取当前设置" AdvSceneSwitcher.action.media="媒体" diff --git a/plugins/base/macro-action-filter.cpp b/plugins/base/macro-action-filter.cpp index 8e1c4b60..a7b8bc5f 100644 --- a/plugins/base/macro-action-filter.cpp +++ b/plugins/base/macro-action-filter.cpp @@ -187,7 +187,9 @@ MacroActionFilterEdit::MacroActionFilterEdit( _manualSettingValue(new VariableTextEdit(this, 5, 1, 1)), _tempVars(new TempVariableSelection(this)), _filterSettings(new SourceSettingSelection(this)), - _settingsString(new VariableTextEdit(this)) + _settingsString(new VariableTextEdit(this)), + _refreshSettingSelection(new QPushButton( + obs_module_text("AdvSceneSwitcher.action.filter.refresh"))) { _filters->setSizeAdjustPolicy(QComboBox::AdjustToContents); @@ -195,6 +197,8 @@ MacroActionFilterEdit::MacroActionFilterEdit( auto sources = GetSourcesWithFilterNames(); sources.sort(); _sources->SetSourceNameList(sources); + _refreshSettingSelection->setToolTip(obs_module_text( + "AdvSceneSwitcher.action.filter.refreshTooltip")); populateSettingsInputMethods(_settingsInputMethods); @@ -221,6 +225,8 @@ MacroActionFilterEdit::MacroActionFilterEdit( QWidget::connect(_filterSettings, SIGNAL(SelectionChanged(const SourceSetting &)), this, SLOT(SelectionChanged(const SourceSetting &))); + QWidget::connect(_refreshSettingSelection, SIGNAL(clicked()), this, + SLOT(RefreshVariableSourceSelectionValue())); auto entrylayout = new QHBoxLayout; @@ -232,8 +238,8 @@ MacroActionFilterEdit::MacroActionFilterEdit( {"{{settingsInputMethod}}", _settingsInputMethods}, {"{{settingValue}}", _manualSettingValue}, {"{{tempVar}}", _tempVars}, - {"{{getSettings}}", _getSettings}, - }; + {"{{refresh}}", _refreshSettingSelection}}; + PlaceWidgets(obs_module_text("AdvSceneSwitcher.action.filter.entry"), entrylayout, widgetPlaceholders); _settingsLayout->setContentsMargins(0, 0, 0, 0); @@ -302,6 +308,7 @@ void MacroActionFilterEdit::FilterChanged(const FilterSelection &filter) const auto filters = _entryData->_filter.GetFilters(_entryData->_source); _filterSettings->SetSource(filters.empty() ? nullptr : filters.at(0)); + SetWidgetVisibility(); emit HeaderInfoChanged( QString::fromStdString(_entryData->GetShortDesc())); } @@ -328,9 +335,11 @@ void MacroActionFilterEdit::GetSettingsClicked() case MacroActionFilter::SettingsInputMethod::INDIVIDUAL_MANUAL: { const auto filters = _entryData->_filter.GetFilters(_entryData->_source); - _manualSettingValue->setPlainText(GetSourceSettingValue( - filters.empty() ? nullptr : filters.at(0), - _entryData->_setting)); + _manualSettingValue->setPlainText( + GetSourceSettingValue(filters.empty() ? nullptr + : filters.at(0), + _entryData->_setting) + .value_or("")); break; } case MacroActionFilter::SettingsInputMethod::INDIVIDUAL_TEMPVAR: @@ -407,6 +416,13 @@ void MacroActionFilterEdit::ManualSettingsValueChanged() updateGeometry(); } +void MacroActionFilterEdit::RefreshVariableSourceSelectionValue() +{ + const auto filters = + _entryData->_filter.GetFilters(_entryData->_source); + _filterSettings->SetSource(filters.empty() ? nullptr : filters.at(0)); +} + void MacroActionFilterEdit::SetWidgetVisibility() { SetLayoutVisible(_settingsLayout, @@ -438,6 +454,14 @@ void MacroActionFilterEdit::SetWidgetVisibility() _manualSettingValue->hide(); } + _refreshSettingSelection->setVisible( + _entryData->_settingsInputMethod == + MacroActionFilter::SettingsInputMethod::INDIVIDUAL_MANUAL && + (_entryData->_source.GetType() == + SourceSelection::Type::VARIABLE || + _entryData->_filter.GetType() == + FilterSelection::Type::VARIABLE)); + adjustSize(); updateGeometry(); } diff --git a/plugins/base/macro-action-filter.hpp b/plugins/base/macro-action-filter.hpp index 8b092d5e..fcfa420a 100644 --- a/plugins/base/macro-action-filter.hpp +++ b/plugins/base/macro-action-filter.hpp @@ -79,6 +79,7 @@ private slots: void SelectionChanged(const TempVariableRef &); void SelectionChanged(const SourceSetting &); void ManualSettingsValueChanged(); + void RefreshVariableSourceSelectionValue(); signals: void HeaderInfoChanged(const QString &); @@ -93,6 +94,7 @@ protected: TempVariableSelection *_tempVars; SourceSettingSelection *_filterSettings; VariableTextEdit *_settingsString; + QPushButton *_refreshSettingSelection; std::shared_ptr _entryData; diff --git a/plugins/base/macro-action-source.cpp b/plugins/base/macro-action-source.cpp index b1b859b5..668ad970 100644 --- a/plugins/base/macro-action-source.cpp +++ b/plugins/base/macro-action-source.cpp @@ -341,8 +341,9 @@ MacroActionSourceEdit::MacroActionSourceEdit( _deinterlaceMode(new QComboBox()), _deinterlaceOrder(new QComboBox()), _warning(new QLabel( - obs_module_text("AdvSceneSwitcher.action.source.warning"))) - + obs_module_text("AdvSceneSwitcher.action.source.warning"))), + _refreshSettingSelection(new QPushButton( + obs_module_text("AdvSceneSwitcher.action.source.refresh"))) { populateActionSelection(_actions); auto sources = GetSourceNames(); @@ -351,6 +352,8 @@ MacroActionSourceEdit::MacroActionSourceEdit( populateDeinterlaceModeSelection(_deinterlaceMode); populateDeinterlaceFieldOrderSelection(_deinterlaceOrder); populateSettingsInputMethods(_settingsInputMethods); + _refreshSettingSelection->setToolTip(obs_module_text( + "AdvSceneSwitcher.action.source.refreshTooltip")); QWidget::connect(_actions, SIGNAL(currentIndexChanged(int)), this, SLOT(ActionChanged(int))); @@ -378,6 +381,8 @@ MacroActionSourceEdit::MacroActionSourceEdit( QWidget::connect(_sourceSettings, SIGNAL(SelectionChanged(const SourceSetting &)), this, SLOT(SelectionChanged(const SourceSetting &))); + QWidget::connect(_refreshSettingSelection, SIGNAL(clicked()), this, + SLOT(RefreshVariableSourceSelectionValue())); auto entryLayout = new QHBoxLayout; entryLayout->setContentsMargins(0, 0, 0, 0); @@ -392,7 +397,8 @@ MacroActionSourceEdit::MacroActionSourceEdit( {"{{settingsButtons}}", _settingsButtons}, {"{{deinterlaceMode}}", _deinterlaceMode}, {"{{deinterlaceOrder}}", _deinterlaceOrder}, - }; + {"{{refresh}}", _refreshSettingSelection}}; + PlaceWidgets(obs_module_text("AdvSceneSwitcher.action.source.entry"), entryLayout, widgetPlaceholders); _settingsLayout->setContentsMargins(0, 0, 0, 0); @@ -456,6 +462,7 @@ void MacroActionSourceEdit::SourceChanged(const SourceSelection &source) populateSourceButtonSelection(_settingsButtons, _entryData->_source.GetSource()); _sourceSettings->SetSource(_entryData->_source.GetSource()); + SetWidgetVisibility(); emit HeaderInfoChanged( QString::fromStdString(_entryData->GetShortDesc())); } @@ -490,8 +497,10 @@ void MacroActionSourceEdit::GetSettingsClicked() switch (_entryData->_settingsInputMethod) { case MacroActionSource::SettingsInputMethod::INDIVIDUAL_MANUAL: - _manualSettingValue->setPlainText(GetSourceSettingValue( - _entryData->_source.GetSource(), _entryData->_setting)); + _manualSettingValue->setPlainText( + GetSourceSettingValue(_entryData->_source.GetSource(), + _entryData->_setting) + .value_or("")); break; case MacroActionSource::SettingsInputMethod::INDIVIDUAL_TEMPVAR: break; @@ -586,6 +595,11 @@ void MacroActionSourceEdit::ManualSettingsValueChanged() updateGeometry(); } +void MacroActionSourceEdit::RefreshVariableSourceSelectionValue() +{ + _sourceSettings->SetSource(_entryData->_source.GetSource()); +} + void MacroActionSourceEdit::SetWidgetVisibility() { SetLayoutVisible(_settingsLayout, @@ -630,6 +644,13 @@ void MacroActionSourceEdit::SetWidgetVisibility() _deinterlaceOrder->setVisible( _entryData->_action == MacroActionSource::Action::DEINTERLACE_FIELD_ORDER); + + _refreshSettingSelection->setVisible( + _entryData->_settingsInputMethod == + MacroActionSource::SettingsInputMethod::INDIVIDUAL_MANUAL && + _entryData->_source.GetType() == + SourceSelection::Type::VARIABLE); + adjustSize(); updateGeometry(); } diff --git a/plugins/base/macro-action-source.hpp b/plugins/base/macro-action-source.hpp index 297142db..e90bc830 100644 --- a/plugins/base/macro-action-source.hpp +++ b/plugins/base/macro-action-source.hpp @@ -99,6 +99,8 @@ private slots: void SettingsInputMethodChanged(int); void SelectionChanged(const SourceSetting &); void ManualSettingsValueChanged(); + void RefreshVariableSourceSelectionValue(); + signals: void HeaderInfoChanged(const QString &); @@ -116,6 +118,7 @@ protected: QComboBox *_deinterlaceMode; QComboBox *_deinterlaceOrder; QLabel *_warning; + QPushButton *_refreshSettingSelection; std::shared_ptr _entryData; diff --git a/plugins/base/macro-condition-filter.cpp b/plugins/base/macro-condition-filter.cpp index 5f82a706..1f793197 100644 --- a/plugins/base/macro-condition-filter.cpp +++ b/plugins/base/macro-condition-filter.cpp @@ -61,17 +61,23 @@ bool MacroConditionFilter::CheckConditionHelper(const OBSWeakSource &filter) break; } case Condition::INDIVIDUAL_SETTING_MATCH: { - std::string value = GetSourceSettingValue(filter, _setting); - ret = _regex.Enabled() ? _regex.Matches(value, _settings) + auto value = GetSourceSettingValue(filter, _setting); + if (!value) { + return false; + } + ret = _regex.Enabled() ? _regex.Matches(*value, _settings) : value == std::string(_settings); - SetVariableValue(value); + SetVariableValue(*value); break; } case Condition::INDIVIDUAL_SETTING_CHANGED: { - std::string value = GetSourceSettingValue(filter, _setting); + auto value = GetSourceSettingValue(filter, _setting); + if (!value) { + return false; + } ret = _currentSettingsValue != value; - _currentSettingsValue = value; - SetVariableValue(value); + _currentSettingsValue = *value; + SetVariableValue(*value); break; } default: @@ -153,12 +159,16 @@ MacroConditionFilterEdit::MacroConditionFilterEdit( "AdvSceneSwitcher.condition.filter.getSettings"))), _settings(new VariableTextEdit(this)), _regex(new RegexConfigWidget(parent)), - _settingSelection(new SourceSettingSelection()) + _settingSelection(new SourceSettingSelection()), + _refreshSettingSelection(new QPushButton( + obs_module_text("AdvSceneSwitcher.condition.filter.refresh"))) { populateConditionSelection(_conditions); auto sources = GetSourcesWithFilterNames(); sources.sort(); _sources->SetSourceNameList(sources); + _refreshSettingSelection->setToolTip(obs_module_text( + "AdvSceneSwitcher.condition.filter.refreshTooltip")); QWidget::connect(_sources, SIGNAL(SourceChanged(const SourceSelection &)), this, @@ -178,6 +188,8 @@ MacroConditionFilterEdit::MacroConditionFilterEdit( QWidget::connect(_settingSelection, SIGNAL(SelectionChanged(const SourceSetting &)), this, SLOT(SettingSelectionChanged(const SourceSetting &))); + QWidget::connect(_refreshSettingSelection, SIGNAL(clicked()), this, + SLOT(RefreshVariableSourceSelectionValue())); std::unordered_map widgetPlaceholders = { {"{{sources}}", _sources}, @@ -187,8 +199,8 @@ MacroConditionFilterEdit::MacroConditionFilterEdit( {"{{getSettings}}", _getSettings}, {"{{regex}}", _regex}, {"{{settingSelection}}", _settingSelection}, + {"{{refresh}}", _refreshSettingSelection}}; - }; auto line1Layout = new QHBoxLayout; line1Layout->setContentsMargins(0, 0, 0, 0); PlaceWidgets(obs_module_text( @@ -239,6 +251,7 @@ void MacroConditionFilterEdit::FilterChanged(const FilterSelection &filter) const auto filters = _entryData->_filter.GetFilters(_entryData->_source); _settingSelection->SetSource(filters.empty() ? nullptr : filters.at(0)); + SetWidgetVisibility(); emit HeaderInfoChanged( QString::fromStdString(_entryData->GetShortDesc())); } @@ -274,8 +287,10 @@ void MacroConditionFilterEdit::GetSettingsClicked() MacroConditionFilter::Condition::SETTINGS_MATCH) { value = FormatJsonString(GetSourceSettings(filters.at(0))); } else { - value = QString::fromStdString(GetSourceSettingValue( - filters.at(0), _entryData->_setting)); + value = QString::fromStdString( + GetSourceSettingValue(filters.at(0), + _entryData->_setting) + .value_or("")); } if (_entryData->_regex.Enabled()) { @@ -321,6 +336,13 @@ void MacroConditionFilterEdit::SettingSelectionChanged( _entryData->_setting = setting; } +void MacroConditionFilterEdit::RefreshVariableSourceSelectionValue() +{ + const auto filters = + _entryData->_filter.GetFilters(_entryData->_source); + _settingSelection->SetSource(filters.empty() ? nullptr : filters.at(0)); +} + void MacroConditionFilterEdit::SetWidgetVisibility() { const bool showSettingsControls = @@ -336,6 +358,13 @@ void MacroConditionFilterEdit::SetWidgetVisibility() INDIVIDUAL_SETTING_MATCH || _entryData->_condition == MacroConditionFilter::Condition:: INDIVIDUAL_SETTING_CHANGED); + _refreshSettingSelection->setVisible( + _entryData->_condition == MacroConditionFilter::Condition:: + INDIVIDUAL_SETTING_MATCH && + (_entryData->_source.GetType() == + SourceSelection::Type::VARIABLE || + _entryData->_filter.GetType() == + FilterSelection::Type::VARIABLE)); adjustSize(); updateGeometry(); } diff --git a/plugins/base/macro-condition-filter.hpp b/plugins/base/macro-condition-filter.hpp index 66738ee2..c6518c4f 100644 --- a/plugins/base/macro-condition-filter.hpp +++ b/plugins/base/macro-condition-filter.hpp @@ -75,6 +75,7 @@ private slots: void SettingsChanged(); void RegexChanged(const RegexConfig &); void SettingSelectionChanged(const SourceSetting &); + void RefreshVariableSourceSelectionValue(); signals: void HeaderInfoChanged(const QString &); @@ -88,6 +89,7 @@ private: VariableTextEdit *_settings; RegexConfigWidget *_regex; SourceSettingSelection *_settingSelection; + QPushButton *_refreshSettingSelection; std::shared_ptr _entryData; bool _loading = true; diff --git a/plugins/base/macro-condition-source.cpp b/plugins/base/macro-condition-source.cpp index 59af59c3..ae08ed30 100644 --- a/plugins/base/macro-condition-source.cpp +++ b/plugins/base/macro-condition-source.cpp @@ -63,19 +63,25 @@ bool MacroConditionSource::CheckCondition() break; } case Condition::INDIVIDUAL_SETTING_MATCH: { - std::string value = + auto value = GetSourceSettingValue(_source.GetSource(), _setting); - ret = _regex.Enabled() ? _regex.Matches(value, _settings) + if (!value) { + return false; + } + ret = _regex.Enabled() ? _regex.Matches(*value, _settings) : value == std::string(_settings); - SetVariableValue(value); + SetVariableValue(*value); break; } case Condition::INDIVIDUAL_SETTING_CHANGED: { - std::string value = + auto value = GetSourceSettingValue(_source.GetSource(), _setting); - ret = _currentSettingsValue != value; - _currentSettingsValue = value; - SetVariableValue(value); + if (!value) { + return false; + } + ret = _currentSettingsValue != *value; + _currentSettingsValue = *value; + SetVariableValue(*value); break; } default: @@ -137,7 +143,9 @@ MacroConditionSourceEdit::MacroConditionSourceEdit( "AdvSceneSwitcher.condition.source.getSettings"))), _settings(new VariableTextEdit(this)), _regex(new RegexConfigWidget(parent)), - _settingSelection(new SourceSettingSelection()) + _settingSelection(new SourceSettingSelection()), + _refreshSettingSelection(new QPushButton( + obs_module_text("AdvSceneSwitcher.condition.source.refresh"))) { populateConditionSelection(_conditions); auto sources = GetSourceNames(); @@ -145,6 +153,8 @@ MacroConditionSourceEdit::MacroConditionSourceEdit( auto scenes = GetSceneNames(); scenes.sort(); _sources->SetSourceNameList(sources + scenes); + _refreshSettingSelection->setToolTip(obs_module_text( + "AdvSceneSwitcher.condition.source.refreshTooltip")); QWidget::connect(_sources, SIGNAL(SourceChanged(const SourceSelection &)), this, @@ -161,6 +171,8 @@ MacroConditionSourceEdit::MacroConditionSourceEdit( QWidget::connect(_settingSelection, SIGNAL(SelectionChanged(const SourceSetting &)), this, SLOT(SettingSelectionChanged(const SourceSetting &))); + QWidget::connect(_refreshSettingSelection, SIGNAL(clicked()), this, + SLOT(RefreshVariableSourceSelectionValue())); std::unordered_map widgetPlaceholders = { {"{{sources}}", _sources}, @@ -168,7 +180,8 @@ MacroConditionSourceEdit::MacroConditionSourceEdit( {"{{settings}}", _settings}, {"{{getSettings}}", _getSettings}, {"{{regex}}", _regex}, - {"{{settingSelection}}", _settingSelection}}; + {"{{settingSelection}}", _settingSelection}, + {"{{refresh}}", _refreshSettingSelection}}; auto line1Layout = new QHBoxLayout; line1Layout->setContentsMargins(0, 0, 0, 0); @@ -207,6 +220,7 @@ void MacroConditionSourceEdit::SourceChanged(const SourceSelection &source) _entryData->_source = source; } _settingSelection->SetSource(_entryData->_source.GetSource()); + SetWidgetVisibility(); emit HeaderInfoChanged( QString::fromStdString(_entryData->GetShortDesc())); } @@ -235,8 +249,10 @@ void MacroConditionSourceEdit::GetSettingsClicked() value = FormatJsonString( GetSourceSettings(_entryData->_source.GetSource())); } else { - value = QString::fromStdString(GetSourceSettingValue( - _entryData->_source.GetSource(), _entryData->_setting)); + value = QString::fromStdString( + GetSourceSettingValue(_entryData->_source.GetSource(), + _entryData->_setting) + .value_or("")); } if (_entryData->_regex.Enabled()) { @@ -282,6 +298,11 @@ void MacroConditionSourceEdit::SettingSelectionChanged( _entryData->_setting = setting; } +void MacroConditionSourceEdit::RefreshVariableSourceSelectionValue() +{ + _settingSelection->SetSource(_entryData->_source.GetSource()); +} + void MacroConditionSourceEdit::SetWidgetVisibility() { const bool settingsMatch = @@ -307,6 +328,12 @@ void MacroConditionSourceEdit::SetWidgetVisibility() "AdvSceneSwitcher.condition.source.sceneVisibilityHint") : ""); + _refreshSettingSelection->setVisible( + _entryData->_condition == MacroConditionSource::Condition:: + INDIVIDUAL_SETTING_MATCH && + _entryData->_source.GetType() == + SourceSelection::Type::VARIABLE); + adjustSize(); updateGeometry(); } diff --git a/plugins/base/macro-condition-source.hpp b/plugins/base/macro-condition-source.hpp index 0b3e40ae..eb1e642e 100644 --- a/plugins/base/macro-condition-source.hpp +++ b/plugins/base/macro-condition-source.hpp @@ -70,6 +70,7 @@ private slots: void SettingsChanged(); void RegexChanged(const RegexConfig &); void SettingSelectionChanged(const SourceSetting &); + void RefreshVariableSourceSelectionValue(); signals: void HeaderInfoChanged(const QString &); @@ -80,6 +81,7 @@ protected: VariableTextEdit *_settings; RegexConfigWidget *_regex; SourceSettingSelection *_settingSelection; + QPushButton *_refreshSettingSelection; std::shared_ptr _entryData; diff --git a/plugins/base/utils/source-setting.cpp b/plugins/base/utils/source-setting.cpp index 01f789ff..02bda5fe 100644 --- a/plugins/base/utils/source-setting.cpp +++ b/plugins/base/utils/source-setting.cpp @@ -14,7 +14,9 @@ namespace advss { SourceSetting::SourceSetting(const std::string &id, const std::string &description, const std::string &longDescription) - : _id(id), _description(description), _longDescription(longDescription) + : _id(id), + _description(description), + _longDescription(longDescription) { } @@ -69,22 +71,22 @@ std::vector GetSoruceSettings(obs_source_t *source) return settings; } -std::string GetSourceSettingValue(const OBSWeakSource &ws, - const SourceSetting &setting) +std::optional GetSourceSettingValue(const OBSWeakSource &ws, + const SourceSetting &setting) { OBSSourceAutoRelease source = obs_weak_source_get_source(ws); OBSDataAutoRelease data = obs_source_get_settings(source); if (!data) { - return ""; + return {}; } OBSDataAutoRelease dataWithDefaults = obs_data_get_defaults(data); obs_data_apply(dataWithDefaults, data); auto json = obs_data_get_json(dataWithDefaults); if (!json) { - return ""; + return {}; } auto value = GetJsonField(json, setting.GetID()); - return value.value_or(""); + return value; } void SetSourceSetting(obs_source_t *source, const SourceSetting &setting, diff --git a/plugins/base/utils/source-setting.hpp b/plugins/base/utils/source-setting.hpp index 78597cd1..371a1f05 100644 --- a/plugins/base/utils/source-setting.hpp +++ b/plugins/base/utils/source-setting.hpp @@ -2,6 +2,7 @@ #include "filter-combo-box.hpp" #include +#include #include #include #include @@ -28,8 +29,8 @@ private: }; std::vector GetSoruceSettings(obs_source_t *source); -std::string GetSourceSettingValue(const OBSWeakSource &source, - const SourceSetting &setting); +std::optional GetSourceSettingValue(const OBSWeakSource &source, + const SourceSetting &setting); void SetSourceSetting(obs_source_t *source, const SourceSetting &setting, const std::string &value);