From bcdfe798319823b8a7338ed63ed29e91ef91d335 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Sat, 2 Jul 2022 19:48:48 +0200 Subject: [PATCH] Add action to refresh sources --- data/locale/en-US.ini | 2 ++ src/headers/macro-action-source.hpp | 3 +- src/macro-action-source.cpp | 48 +++++++++++++++++++++++++---- 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 851c9a0b..6d379741 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -384,6 +384,8 @@ AdvSceneSwitcher.action.source="Source" AdvSceneSwitcher.action.source.type.enable="Enable" AdvSceneSwitcher.action.source.type.disable="Disable" AdvSceneSwitcher.action.source.type.settings="Set settings" +AdvSceneSwitcher.action.source.type.refreshSettings="Refresh source settings" +AdvSceneSwitcher.action.source.type.refreshSettings.tooltip="Can be used to refresh browser, media, etc. sources" AdvSceneSwitcher.action.source.entry="{{actions}} {{sources}}" AdvSceneSwitcher.action.source.warning="Warning: Enabling and disabling sources globally cannot be controlled by the OBS UI" AdvSceneSwitcher.action.source.getSettings="Get current settings" diff --git a/src/headers/macro-action-source.hpp b/src/headers/macro-action-source.hpp index dc363b4b..ed599348 100644 --- a/src/headers/macro-action-source.hpp +++ b/src/headers/macro-action-source.hpp @@ -11,6 +11,7 @@ enum class SourceAction { ENABLE, DISABLE, SETTINGS, + REFRESH_SETTINGS, }; class MacroActionSource : public MacroAction { @@ -69,6 +70,6 @@ protected: std::shared_ptr _entryData; private: - void SetWidgetVisibility(bool); + void SetWidgetVisibility(); bool _loading = true; }; diff --git a/src/macro-action-source.cpp b/src/macro-action-source.cpp index 079a3c0b..3517483b 100644 --- a/src/macro-action-source.cpp +++ b/src/macro-action-source.cpp @@ -14,8 +14,31 @@ const static std::map actionTypes = { {SourceAction::DISABLE, "AdvSceneSwitcher.action.source.type.disable"}, {SourceAction::SETTINGS, "AdvSceneSwitcher.action.source.type.settings"}, + {SourceAction::REFRESH_SETTINGS, + "AdvSceneSwitcher.action.source.type.refreshSettings"}, }; +void refreshSourceSettings(obs_source_t *s) +{ + if (!s) { + return; + } + + obs_data_t *data = obs_source_get_settings(s); + obs_source_update(s, data); + obs_data_release(data); + + // Refresh of browser sources based on: + // https://github.com/obsproject/obs-websocket/pull/666/files + if (strcmp(obs_source_get_id(s), "browser_source") == 0) { + obs_properties_t *sourceProperties = obs_source_properties(s); + obs_property_t *property = + obs_properties_get(sourceProperties, "refreshnocache"); + obs_property_button_clicked(property, s); + obs_properties_destroy(sourceProperties); + } +} + bool MacroActionSource::PerformAction() { auto s = obs_weak_source_get_source(_source); @@ -29,6 +52,9 @@ bool MacroActionSource::PerformAction() case SourceAction::SETTINGS: setSourceSettings(s, _settings); break; + case SourceAction::REFRESH_SETTINGS: + refreshSourceSettings(s); + break; default: break; } @@ -77,8 +103,15 @@ std::string MacroActionSource::GetShortDesc() static inline void populateActionSelection(QComboBox *list) { - for (auto entry : actionTypes) { - list->addItem(obs_module_text(entry.second.c_str())); + for (auto &[actionType, name] : actionTypes) { + list->addItem(obs_module_text(name.c_str())); + if (actionType == SourceAction::REFRESH_SETTINGS) { + list->setItemData( + list->count() - 1, + obs_module_text( + "AdvSceneSwitcher.action.source.type.refreshSettings.tooltip"), + Qt::ToolTipRole); + } } } @@ -140,7 +173,7 @@ void MacroActionSourceEdit::UpdateEntryData() _sources->setCurrentText( GetWeakSourceName(_entryData->_source).c_str()); _settings->setPlainText(QString::fromStdString(_entryData->_settings)); - SetWidgetVisibility(_entryData->_action == SourceAction::SETTINGS); + SetWidgetVisibility(); adjustSize(); updateGeometry(); @@ -166,7 +199,7 @@ void MacroActionSourceEdit::ActionChanged(int value) std::lock_guard lock(switcher->m); _entryData->_action = static_cast(value); - SetWidgetVisibility(_entryData->_action == SourceAction::SETTINGS); + SetWidgetVisibility(); } void MacroActionSourceEdit::GetSettingsClicked() @@ -192,10 +225,13 @@ void MacroActionSourceEdit::SettingsChanged() updateGeometry(); } -void MacroActionSourceEdit::SetWidgetVisibility(bool showSettings) +void MacroActionSourceEdit::SetWidgetVisibility() { + const bool showSettings = _entryData->_action == SourceAction::SETTINGS; + const bool showWarning = _entryData->_action == SourceAction::ENABLE || + _entryData->_action == SourceAction::DISABLE; _settings->setVisible(showSettings); _getSettings->setVisible(showSettings); - _warning->setVisible(!showSettings); + _warning->setVisible(showWarning); adjustSize(); }