diff --git a/data/locale/de-DE.ini b/data/locale/de-DE.ini index 34625319..8733e552 100644 --- a/data/locale/de-DE.ini +++ b/data/locale/de-DE.ini @@ -444,7 +444,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}}{{filters}}{{refresh}}" +AdvSceneSwitcher.action.filter.entry="Auf{{sources}}{{actions}}{{filters}}{{filters}}{{refresh}}{{settingsButtons}}" AdvSceneSwitcher.action.filter.getSettings="Aktuelle Einstellungen abfragen" AdvSceneSwitcher.action.source="Quelle" AdvSceneSwitcher.action.source.type.enable="Aktivieren" @@ -453,7 +453,6 @@ AdvSceneSwitcher.action.source.type.settings="Einstellungen festlegen" AdvSceneSwitcher.action.source.type.refreshSettings="Aktualisieren der Quelleneinstellungen" 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.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" @@ -570,6 +569,7 @@ AdvSceneSwitcher.action.variable.actionNoVariableSupport="Das Abrufen von Variab AdvSceneSwitcher.action.variable.conditionNoVariableSupport="Das Abrufen von Variablenwerten aus %1 Bedingungen wird nicht unterstützt!" AdvSceneSwitcher.action.variable.currentSegmentValue="Aktueller Wert:" +AdvSceneSwitcher.noSettingsButtons="Keine Buttons gefunden!" ; Transition Tab AdvSceneSwitcher.transitionTab.title="Szenenübergänge" diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index ef2f9815..92029e4c 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -707,9 +707,10 @@ 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.type.pressSettingsButton="Press settings button" 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="On{{sources}}{{actions}}{{filters}}{{refresh}}{{settingsButtons}}" 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" @@ -727,7 +728,6 @@ AdvSceneSwitcher.action.source.type.deinterlaceOrder="Set deinterlace field orde AdvSceneSwitcher.action.source.type.openInteractionDialog="Open interaction dialog" 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}}{{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\"" @@ -1761,6 +1761,8 @@ AdvSceneSwitcher.audio.monitor.none="Monitor Off" AdvSceneSwitcher.audio.monitor.monitorOnly="Monitor Only (mute output)" AdvSceneSwitcher.audio.monitor.both="Monitor and Output" +AdvSceneSwitcher.noSettingsButtons="No buttons found!" + ; Legacy tabs below - please don't waste your time adding translations for these :) ; Transition Tab AdvSceneSwitcher.transitionTab.title="Transition" diff --git a/data/locale/es-ES.ini b/data/locale/es-ES.ini index ecdb9bf5..d16fdb79 100644 --- a/data/locale/es-ES.ini +++ b/data/locale/es-ES.ini @@ -365,7 +365,7 @@ 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}}{{refresh}}" +AdvSceneSwitcher.action.filter.entry="En{{sources}}{{actions}}{{filters}}{{refresh}}{{settingsButtons}}" AdvSceneSwitcher.action.filter.getSettings="Obtener la configuración actual" AdvSceneSwitcher.action.source="Fuente" AdvSceneSwitcher.action.source.type.enable="Habilitar" diff --git a/data/locale/fr-FR.ini b/data/locale/fr-FR.ini index 49cf656e..df2b4e8a 100644 --- a/data/locale/fr-FR.ini +++ b/data/locale/fr-FR.ini @@ -521,7 +521,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}}{{refresh}}" +AdvSceneSwitcher.action.filter.entry="Sur{{sources}}{{actions}}{{filters}}{{refresh}}{{settingsButtons}}" AdvSceneSwitcher.action.filter.getSettings="Obtenir les paramètres actuels" AdvSceneSwitcher.action.source="Source" AdvSceneSwitcher.action.source.type.enable="Activer" @@ -533,7 +533,6 @@ AdvSceneSwitcher.action.source.type.refreshSettings.tooltip="Peut être utilisé AdvSceneSwitcher.action.source.type.deinterlaceMode="Définir le mode de désentrelacement" AdvSceneSwitcher.action.source.type.deinterlaceOrder="Définir l'ordre de désentrelacement des champs" AdvSceneSwitcher.action.source.type.openInteractionDialog="Ouvrir la boîte de dialogue d'interaction" -AdvSceneSwitcher.action.source.noSettingsButtons="Aucun bouton trouvé !" AdvSceneSwitcher.action.source.warning="Avertissement : Activer et désactiver les sources globalement ne peut pas être contrôlé par l'interface utilisateur d'OBS\nVous pourriez rechercher \"Visibilité de l'élément de scène\"" AdvSceneSwitcher.action.source.getSettings="Obtenir les paramètres actuels" AdvSceneSwitcher.action.source.deinterlaceMode.disable="Désactiver" @@ -738,6 +737,8 @@ AdvSceneSwitcher.action.twitch.type.channel.info.category.set="Définir la caté AdvSceneSwitcher.action.twitch.type.commercial.start="Démarrer une publicité d'une durée de" AdvSceneSwitcher.action.twitch.categorySelectionDisabled="Impossible de sélectionner une catégorie sans avoir d'abord sélectionné un compte Twitch !" +AdvSceneSwitcher.noSettingsButtons="Aucun bouton trouvé !" + ; Transition Tab AdvSceneSwitcher.transitionTab.title="Transition" AdvSceneSwitcher.transitionTab.transitionForAToB="Utiliser une transition pour le passage automatisé de la scène A à la scène B" diff --git a/data/locale/tr-TR.ini b/data/locale/tr-TR.ini index af14d4c6..7821c99b 100644 --- a/data/locale/tr-TR.ini +++ b/data/locale/tr-TR.ini @@ -295,7 +295,7 @@ 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}}{{refresh}}" +AdvSceneSwitcher.action.filter.entry="Açık{{sources}}{{actions}}{{filters}}{{refresh}}{{settingsButtons}}" AdvSceneSwitcher.action.filter.getSettings="Mevcut ayarları al" AdvSceneSwitcher.action.source="Kaynak" AdvSceneSwitcher.action.source.type.enable="Etkin" diff --git a/data/locale/zh-CN.ini b/data/locale/zh-CN.ini index 8ca35706..56f8bdaf 100644 --- a/data/locale/zh-CN.ini +++ b/data/locale/zh-CN.ini @@ -500,7 +500,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}}{{refresh}}" +AdvSceneSwitcher.action.filter.entry="置{{sources}}{{actions}}{{filters}}{{refresh}}{{settingsButtons}}" AdvSceneSwitcher.action.filter.getSettings="获取当前设置" AdvSceneSwitcher.action.source="源" AdvSceneSwitcher.action.source.type.enable="启用" @@ -509,7 +509,6 @@ AdvSceneSwitcher.action.source.type.settings="配置设置" AdvSceneSwitcher.action.source.type.refreshSettings="刷新源设置" AdvSceneSwitcher.action.source.type.pressSettingsButton="按下设置按钮" AdvSceneSwitcher.action.source.type.refreshSettings.tooltip="可用于刷新浏览器、媒体、源、etc" -AdvSceneSwitcher.action.source.noSettingsButtons="未找到按钮!" AdvSceneSwitcher.action.source.warning="警告:OBS UI无法控制全局启用和禁用源,注意,通过这个设置禁用,我测试,你必须通过这个在启用才行,不然点击小眼睛你无法显示!" AdvSceneSwitcher.action.source.getSettings="获取当前设置" AdvSceneSwitcher.action.media="媒体" @@ -661,6 +660,8 @@ AdvSceneSwitcher.action.midi.entry="发送消息到 {{device}}:" AdvSceneSwitcher.action.midi.entry.listen="将MIDI消息选择设置为 {{listenDevices}} 上传入的消息: {{listenButton}}" AdvSceneSwitcher.action.osc="打开声音控制" +AdvSceneSwitcher.noSettingsButtons="未找到按钮!" + ; Transition Tab AdvSceneSwitcher.transitionTab.title="转场特效" AdvSceneSwitcher.transitionTab.transitionForAToB="当自动从场景A切换到场景B时使用的转场特效" diff --git a/plugins/base/CMakeLists.txt b/plugins/base/CMakeLists.txt index de4495f5..b7de6ad4 100644 --- a/plugins/base/CMakeLists.txt +++ b/plugins/base/CMakeLists.txt @@ -160,6 +160,8 @@ target_sources( utils/scene-item-selection.hpp utils/scene-item-transform-helpers.cpp utils/scene-item-transform-helpers.hpp + utils/source-properties-button.cpp + utils/source-properties-button.hpp utils/source-settings-helpers.cpp utils/source-settings-helpers.hpp utils/source-setting.cpp diff --git a/plugins/base/macro-action-filter.cpp b/plugins/base/macro-action-filter.cpp index 2398086f..441b25b9 100644 --- a/plugins/base/macro-action-filter.cpp +++ b/plugins/base/macro-action-filter.cpp @@ -22,6 +22,8 @@ const static std::map actionTypes = { "AdvSceneSwitcher.action.filter.type.toggle"}, {MacroActionFilter::Action::SETTINGS, "AdvSceneSwitcher.action.filter.type.settings"}, + {MacroActionFilter::Action::SETTINGS_BUTTON, + "AdvSceneSwitcher.action.filter.type.pressSettingsButton"}, }; const static std::map @@ -39,7 +41,7 @@ static void performActionHelper( MacroActionFilter::SettingsInputMethod settingsInputMethod, const SourceSetting &setting, const std::string &manualSettingValue, const TempVariableRef &tempVar, Macro *macro, - const StringVariable &settingsString) + const StringVariable &settingsString, const SourceSettingButton &button) { OBSSourceAutoRelease source = obs_weak_source_get_source(filter); switch (action) { @@ -74,6 +76,9 @@ static void performActionHelper( break; } break; + case MacroActionFilter::Action::SETTINGS_BUTTON: + PressSourceButton(button, source); + break; default: break; } @@ -85,7 +90,7 @@ bool MacroActionFilter::PerformAction() for (const auto &filter : filters) { performActionHelper(_action, filter, _settingsInputMethod, _setting, _manualSettingValue, _tempVar, - GetMacro(), _settingsString); + GetMacro(), _settingsString, _button); } return true; } @@ -116,6 +121,7 @@ bool MacroActionFilter::Save(obs_data_t *obj) const _manualSettingValue.Save(obj, "manualSettingValue"); _tempVar.Save(obj); _settingsString.Save(obj, "settings"); + _button.Save(obj); obs_data_set_int(obj, "version", 1); return true; } @@ -147,6 +153,7 @@ bool MacroActionFilter::Load(obs_data_t *obj) _settingsString.Load(obj, "settings"); _manualSettingValue.Load(obj, "manualSettingValue"); _tempVar.Load(obj, GetMacro()); + _button.Load(obj); return true; } @@ -207,7 +214,8 @@ MacroActionFilterEdit::MacroActionFilterEdit( _filterSettings(new SourceSettingSelection(this)), _settingsString(new VariableTextEdit(this)), _refreshSettingSelection(new QPushButton( - obs_module_text("AdvSceneSwitcher.action.filter.refresh"))) + obs_module_text("AdvSceneSwitcher.action.filter.refresh"))), + _settingsButtons(new QComboBox()) { _filters->setSizeAdjustPolicy(QComboBox::AdjustToContents); @@ -245,10 +253,10 @@ MacroActionFilterEdit::MacroActionFilterEdit( SLOT(SelectionChanged(const SourceSetting &))); QWidget::connect(_refreshSettingSelection, SIGNAL(clicked()), this, SLOT(RefreshVariableSourceSelectionValue())); + QWidget::connect(_settingsButtons, SIGNAL(currentIndexChanged(int)), + this, SLOT(ButtonChanged(int))); - auto entrylayout = new QHBoxLayout; - - std::unordered_map widgetPlaceholders = { + const std::unordered_map widgetPlaceholders = { {"{{sources}}", _sources}, {"{{filters}}", _filters}, {"{{actions}}", _actions}, @@ -256,8 +264,10 @@ MacroActionFilterEdit::MacroActionFilterEdit( {"{{settingsInputMethod}}", _settingsInputMethods}, {"{{settingValue}}", _manualSettingValue}, {"{{tempVar}}", _tempVars}, - {"{{refresh}}", _refreshSettingSelection}}; + {"{{refresh}}", _refreshSettingSelection}, + {"{{settingsButtons}}", _settingsButtons}}; + auto entrylayout = new QHBoxLayout; PlaceWidgets(obs_module_text("AdvSceneSwitcher.action.filter.entry"), entrylayout, widgetPlaceholders); _settingsLayout->setContentsMargins(0, 0, 0, 0); @@ -294,12 +304,16 @@ void MacroActionFilterEdit::UpdateEntryData() _settingsString->setPlainText(_entryData->_settingsString); const auto filters = _entryData->_filter.GetFilters(_entryData->_source); - _filterSettings->SetSource(filters.empty() ? nullptr : filters.at(0)); + OBSWeakSource firstFilter = filters.empty() ? nullptr : filters.at(0); + _filterSettings->SetSource(firstFilter); _filterSettings->SetSetting(_entryData->_setting); _settingsInputMethods->setCurrentIndex(_settingsInputMethods->findData( static_cast(_entryData->_settingsInputMethod))); _tempVars->SetVariable(_entryData->_tempVar); _manualSettingValue->setPlainText(_entryData->_manualSettingValue); + PopulateSourceButtonSelection(_settingsButtons, firstFilter); + _settingsButtons->setCurrentText( + QString::fromStdString(_entryData->_button.ToString())); SetWidgetVisibility(); } @@ -325,7 +339,9 @@ void MacroActionFilterEdit::FilterChanged(const FilterSelection &filter) } const auto filters = _entryData->_filter.GetFilters(_entryData->_source); - _filterSettings->SetSource(filters.empty() ? nullptr : filters.at(0)); + OBSWeakSource firstFilter = filters.empty() ? nullptr : filters.at(0); + _filterSettings->SetSource(firstFilter); + PopulateSourceButtonSelection(_settingsButtons, firstFilter); SetWidgetVisibility(); emit HeaderInfoChanged( QString::fromStdString(_entryData->GetShortDesc())); @@ -441,6 +457,17 @@ void MacroActionFilterEdit::RefreshVariableSourceSelectionValue() _filterSettings->SetSource(filters.empty() ? nullptr : filters.at(0)); } +void MacroActionFilterEdit::ButtonChanged(int idx) +{ + if (_loading || !_entryData) { + return; + } + + auto lock = LockContext(); + _entryData->_button = qvariant_cast( + _settingsButtons->itemData(idx)); +} + void MacroActionFilterEdit::SetWidgetVisibility() { SetLayoutVisible(_settingsLayout, @@ -479,6 +506,9 @@ void MacroActionFilterEdit::SetWidgetVisibility() SourceSelection::Type::VARIABLE || _entryData->_filter.GetType() == FilterSelection::Type::VARIABLE)); + _settingsButtons->setVisible( + _entryData->_action == + MacroActionFilter::Action::SETTINGS_BUTTON); adjustSize(); updateGeometry(); diff --git a/plugins/base/macro-action-filter.hpp b/plugins/base/macro-action-filter.hpp index 3c3fae4f..a24825af 100644 --- a/plugins/base/macro-action-filter.hpp +++ b/plugins/base/macro-action-filter.hpp @@ -3,6 +3,7 @@ #include "variable-text-edit.hpp" #include "source-selection.hpp" #include "filter-selection.hpp" +#include "source-properties-button.hpp" #include "source-setting.hpp" #include @@ -29,6 +30,7 @@ public: DISABLE, TOGGLE, SETTINGS, + SETTINGS_BUTTON, }; enum class SettingsInputMethod { @@ -46,6 +48,7 @@ public: TempVariableRef _tempVar; StringVariable _manualSettingValue = ""; SourceSetting _setting; + SourceSettingButton _button; private: static bool _registered; @@ -79,10 +82,14 @@ private slots: void SelectionChanged(const SourceSetting &); void ManualSettingsValueChanged(); void RefreshVariableSourceSelectionValue(); + void ButtonChanged(int idx); + signals: void HeaderInfoChanged(const QString &); -protected: +private: + void SetWidgetVisibility(); + SourceSelectionWidget *_sources; FilterSelectionWidget *_filters; QComboBox *_actions; @@ -94,11 +101,9 @@ protected: SourceSettingSelection *_filterSettings; VariableTextEdit *_settingsString; QPushButton *_refreshSettingSelection; + QComboBox *_settingsButtons; std::shared_ptr _entryData; - -private: - void SetWidgetVisibility(); bool _loading = true; }; diff --git a/plugins/base/macro-action-source.cpp b/plugins/base/macro-action-source.cpp index 35d7d066..b1cda0dd 100644 --- a/plugins/base/macro-action-source.cpp +++ b/plugins/base/macro-action-source.cpp @@ -6,8 +6,6 @@ #include -Q_DECLARE_METATYPE(advss::SourceSettingButton); - namespace advss { const std::string MacroActionSource::id = "source"; @@ -79,38 +77,6 @@ const static std::map "AdvSceneSwitcher.action.source.inputMethod.json"}, }; -static std::vector getSourceButtons(OBSWeakSource source) -{ - auto s = obs_weak_source_get_source(source); - std::vector buttons; - obs_properties_t *sourceProperties = obs_source_properties(s); - auto it = obs_properties_first(sourceProperties); - do { - if (!it || obs_property_get_type(it) != OBS_PROPERTY_BUTTON) { - continue; - } - SourceSettingButton button = {obs_property_name(it), - obs_property_description(it)}; - buttons.emplace_back(button); - } while (obs_property_next(&it)); - obs_source_release(s); - obs_properties_destroy(sourceProperties); - return buttons; -} - -static void pressSourceButton(const SourceSettingButton &button, - obs_source_t *source) -{ - obs_properties_t *sourceProperties = obs_source_properties(source); - obs_property_t *property = - obs_properties_get(sourceProperties, button.id.c_str()); - if (!obs_property_button_clicked(property, source)) { - blog(LOG_WARNING, "Failed to press settings button '%s' for %s", - button.id.c_str(), obs_source_get_name(source)); - } - obs_properties_destroy(sourceProperties); -} - static void refreshSourceSettings(obs_source_t *s) { if (!s) { @@ -174,7 +140,7 @@ bool MacroActionSource::PerformAction() refreshSourceSettings(s); break; case Action::SETTINGS_BUTTON: - pressSourceButton(_button, s); + PressSourceButton(_button, s); break; case Action::DEINTERLACE_MODE: obs_source_set_deinterlace_mode(s, _deinterlaceMode); @@ -297,23 +263,6 @@ static inline void populateActionSelection(QComboBox *list) } } -static inline void populateSourceButtonSelection(QComboBox *list, - OBSWeakSource source) -{ - list->clear(); - auto buttons = getSourceButtons(source); - if (buttons.empty()) { - list->addItem(obs_module_text( - "AdvSceneSwitcher.action.source.noSettingsButtons")); - } - - for (const auto &button : buttons) { - QVariant value; - value.setValue(button); - list->addItem(QString::fromStdString(button.ToString()), value); - } -} - static inline void populateDeinterlaceModeSelection(QComboBox *list) { list->clear(); @@ -445,7 +394,7 @@ void MacroActionSourceEdit::UpdateEntryData() return; } - populateSourceButtonSelection(_settingsButtons, + PopulateSourceButtonSelection(_settingsButtons, _entryData->_source.GetSource()); _actions->setCurrentIndex(static_cast(_entryData->_action)); _sources->SetSource(_entryData->_source); @@ -476,7 +425,7 @@ void MacroActionSourceEdit::SourceChanged(const SourceSelection &source) auto lock = LockContext(); _entryData->_source = source; } - populateSourceButtonSelection(_settingsButtons, + PopulateSourceButtonSelection(_settingsButtons, _entryData->_source.GetSource()); _sourceSettings->SetSource(_entryData->_source.GetSource()); SetWidgetVisibility(); @@ -672,31 +621,4 @@ void MacroActionSourceEdit::SetWidgetVisibility() updateGeometry(); } -bool SourceSettingButton::Save(obs_data_t *obj) const -{ - auto data = obs_data_create(); - obs_data_set_string(data, "id", id.c_str()); - obs_data_set_string(data, "description", description.c_str()); - obs_data_set_obj(obj, "sourceSettingButton", data); - obs_data_release(data); - return true; -} - -bool SourceSettingButton::Load(obs_data_t *obj) -{ - auto data = obs_data_get_obj(obj, "sourceSettingButton"); - id = obs_data_get_string(data, "id"); - description = obs_data_get_string(data, "description"); - obs_data_release(data); - return true; -} - -std::string SourceSettingButton::ToString() const -{ - if (id.empty()) { - return ""; - } - return "[" + id + "] " + description; -} - } // namespace advss diff --git a/plugins/base/macro-action-source.hpp b/plugins/base/macro-action-source.hpp index 44443324..53f79ada 100644 --- a/plugins/base/macro-action-source.hpp +++ b/plugins/base/macro-action-source.hpp @@ -1,6 +1,7 @@ #pragma once #include "macro-action-edit.hpp" #include "variable-text-edit.hpp" +#include "source-properties-button.hpp" #include "source-selection.hpp" #include "source-setting.hpp" @@ -11,15 +12,6 @@ namespace advss { -struct SourceSettingButton { - bool Save(obs_data_t *obj) const; - bool Load(obs_data_t *obj); - std::string ToString() const; - - std::string id = ""; - std::string description = ""; -}; - class MacroActionSource : public MacroAction { public: MacroActionSource(Macro *m) : MacroAction(m) {} @@ -103,7 +95,9 @@ private slots: signals: void HeaderInfoChanged(const QString &); -protected: +private: + void SetWidgetVisibility(); + SourceSelectionWidget *_sources; QComboBox *_actions; QComboBox *_settingsButtons; @@ -120,9 +114,6 @@ protected: QPushButton *_refreshSettingSelection; std::shared_ptr _entryData; - -private: - void SetWidgetVisibility(); bool _loading = true; }; diff --git a/plugins/base/utils/source-properties-button.cpp b/plugins/base/utils/source-properties-button.cpp new file mode 100644 index 00000000..649fe66a --- /dev/null +++ b/plugins/base/utils/source-properties-button.cpp @@ -0,0 +1,78 @@ +#include "source-properties-button.hpp" +#include "log-helper.hpp" +#include "obs-module-helper.hpp" + +namespace advss { + +bool SourceSettingButton::Save(obs_data_t *obj) const +{ + OBSDataAutoRelease data = obs_data_create(); + obs_data_set_string(data, "id", id.c_str()); + obs_data_set_string(data, "description", description.c_str()); + obs_data_set_obj(obj, "sourceSettingButton", data); + return true; +} + +bool SourceSettingButton::Load(obs_data_t *obj) +{ + OBSDataAutoRelease data = obs_data_get_obj(obj, "sourceSettingButton"); + id = obs_data_get_string(data, "id"); + description = obs_data_get_string(data, "description"); + return true; +} + +std::string SourceSettingButton::ToString() const +{ + if (id.empty()) { + return ""; + } + return "[" + id + "] " + description; +} + +std::vector GetSourceButtons(OBSWeakSource source) +{ + OBSSourceAutoRelease s = obs_weak_source_get_source(source); + std::vector buttons; + obs_properties_t *sourceProperties = obs_source_properties(s); + auto it = obs_properties_first(sourceProperties); + do { + if (!it || obs_property_get_type(it) != OBS_PROPERTY_BUTTON) { + continue; + } + SourceSettingButton button = {obs_property_name(it), + obs_property_description(it)}; + buttons.emplace_back(button); + } while (obs_property_next(&it)); + obs_properties_destroy(sourceProperties); + return buttons; +} + +void PressSourceButton(const SourceSettingButton &button, obs_source_t *source) +{ + obs_properties_t *sourceProperties = obs_source_properties(source); + obs_property_t *property = + obs_properties_get(sourceProperties, button.id.c_str()); + if (!obs_property_button_clicked(property, source)) { + blog(LOG_WARNING, "Failed to press settings button '%s' for %s", + button.id.c_str(), obs_source_get_name(source)); + } + obs_properties_destroy(sourceProperties); +} + +void PopulateSourceButtonSelection(QComboBox *list, OBSWeakSource source) +{ + list->clear(); + auto buttons = GetSourceButtons(source); + if (buttons.empty()) { + list->addItem( + obs_module_text("AdvSceneSwitcher.noSettingsButtons")); + } + + for (const auto &button : buttons) { + QVariant value; + value.setValue(button); + list->addItem(QString::fromStdString(button.ToString()), value); + } +} + +} // namespace advss diff --git a/plugins/base/utils/source-properties-button.hpp b/plugins/base/utils/source-properties-button.hpp new file mode 100644 index 00000000..f31804e0 --- /dev/null +++ b/plugins/base/utils/source-properties-button.hpp @@ -0,0 +1,25 @@ +#pragma once +#include +#include +#include +#include +#include + +namespace advss { + +struct SourceSettingButton { + bool Save(obs_data_t *obj) const; + bool Load(obs_data_t *obj); + std::string ToString() const; + + std::string id = ""; + std::string description = ""; +}; + +std::vector GetSourceButtons(OBSWeakSource source); +void PressSourceButton(const SourceSettingButton &button, obs_source_t *source); +void PopulateSourceButtonSelection(QComboBox *list, OBSWeakSource source); + +} // namespace advss + +Q_DECLARE_METATYPE(advss::SourceSettingButton);