Add option to press buttons in the properties dialog of filters

This commit is contained in:
WarmUpTill 2024-03-27 14:52:09 +01:00 committed by WarmUpTill
parent 14dd390680
commit 6b4bcc074a
13 changed files with 174 additions and 117 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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时使用的转场特效"

View File

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

View File

@ -22,6 +22,8 @@ const static std::map<MacroActionFilter::Action, std::string> 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<MacroActionFilter::SettingsInputMethod, std::string>
@ -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<std::string, QWidget *> widgetPlaceholders = {
const std::unordered_map<std::string, QWidget *> 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<int>(_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<SourceSettingButton>(
_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();

View File

@ -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 <QComboBox>
@ -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<MacroActionFilter> _entryData;
private:
void SetWidgetVisibility();
bool _loading = true;
};

View File

@ -6,8 +6,6 @@
#include <obs-frontend-api.h>
Q_DECLARE_METATYPE(advss::SourceSettingButton);
namespace advss {
const std::string MacroActionSource::id = "source";
@ -79,38 +77,6 @@ const static std::map<MacroActionSource::SettingsInputMethod, std::string>
"AdvSceneSwitcher.action.source.inputMethod.json"},
};
static std::vector<SourceSettingButton> getSourceButtons(OBSWeakSource source)
{
auto s = obs_weak_source_get_source(source);
std::vector<SourceSettingButton> 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<int>(_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

View File

@ -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<MacroActionSource> _entryData;
private:
void SetWidgetVisibility();
bool _loading = true;
};

View File

@ -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<SourceSettingButton> GetSourceButtons(OBSWeakSource source)
{
OBSSourceAutoRelease s = obs_weak_source_get_source(source);
std::vector<SourceSettingButton> 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

View File

@ -0,0 +1,25 @@
#pragma once
#include <obs.hpp>
#include <QComboBox>
#include <qmetatype.h>
#include <string>
#include <vector>
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<SourceSettingButton> 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);