Add action to refresh sources

This commit is contained in:
WarmUpTill 2022-07-02 19:48:48 +02:00 committed by WarmUpTill
parent ec93babed6
commit bcdfe79831
3 changed files with 46 additions and 7 deletions

View File

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

View File

@ -11,6 +11,7 @@ enum class SourceAction {
ENABLE,
DISABLE,
SETTINGS,
REFRESH_SETTINGS,
};
class MacroActionSource : public MacroAction {
@ -69,6 +70,6 @@ protected:
std::shared_ptr<MacroActionSource> _entryData;
private:
void SetWidgetVisibility(bool);
void SetWidgetVisibility();
bool _loading = true;
};

View File

@ -14,8 +14,31 @@ const static std::map<SourceAction, std::string> 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<std::mutex> lock(switcher->m);
_entryData->_action = static_cast<SourceAction>(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();
}