Add option to check single settings values in Source condition

This commit is contained in:
WarmUpTill 2023-12-30 01:02:42 +01:00 committed by WarmUpTill
parent 2cc8a15118
commit 481da80d4c
8 changed files with 97 additions and 36 deletions

View File

@ -263,9 +263,8 @@ AdvSceneSwitcher.condition.macro.count.entry.line2="Aktuelle Anzahl: {{currentCo
AdvSceneSwitcher.condition.source="Quelle"
AdvSceneSwitcher.condition.source.type.active="Ist aktiv"
AdvSceneSwitcher.condition.source.type.showing="Wird angezeigt"
AdvSceneSwitcher.condition.source.type.settings="Einstellungen stimmen überein"
AdvSceneSwitcher.condition.source.type.settingsMatch="Einstellungen stimmen überein"
AdvSceneSwitcher.condition.source.getSettings="Aktuelle Einstellungen abfragen"
AdvSceneSwitcher.condition.source.entry.line1="{{sources}} {{conditions}}"
AdvSceneSwitcher.condition.source.entry.line2="{{settings}}"
AdvSceneSwitcher.condition.source.entry.line3="{{regex}} {{getSettings}}"
AdvSceneSwitcher.condition.virtualCamera="Virtuelle Kamera"

View File

@ -350,11 +350,13 @@ AdvSceneSwitcher.condition.macro.paused.entry="Macro{{macros}}is paused"
AdvSceneSwitcher.condition.source="Source"
AdvSceneSwitcher.condition.source.type.active="Is active"
AdvSceneSwitcher.condition.source.type.showing="Is showing"
AdvSceneSwitcher.condition.source.type.settings="Settings match"
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.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}}"
AdvSceneSwitcher.condition.source.entry.line1="{{sources}}{{conditions}}{{settingSelection}}"
AdvSceneSwitcher.condition.source.entry.line2="{{settings}}"
AdvSceneSwitcher.condition.source.entry.line3="{{regex}}{{getSettings}}"
AdvSceneSwitcher.condition.virtualCamera="Virtual camera"

View File

@ -215,9 +215,8 @@ AdvSceneSwitcher.condition.macro.count.entry.line2="Recuento actual: {{currentCo
AdvSceneSwitcher.condition.source="Fuente"
AdvSceneSwitcher.condition.source.type.active="Está activo"
AdvSceneSwitcher.condition.source.type.showing="Se muestra"
AdvSceneSwitcher.condition.source.type.settings="Coincidencia de configuración"
AdvSceneSwitcher.condition.source.type.settingsMatch="Coincidencia de configuración"
AdvSceneSwitcher.condition.source.getSettings="Obtener la configuración actual"
AdvSceneSwitcher.condition.source.entry.line1="{{sources}} {{conditions}}"
AdvSceneSwitcher.condition.source.entry.line2="{{settings}}"
AdvSceneSwitcher.condition.source.entry.line3="{{regex}} {{getSettings}}"
AdvSceneSwitcher.condition.virtualCamera="Cámara virtual"

View File

@ -330,7 +330,7 @@ AdvSceneSwitcher.condition.macro.actionState.enabled.entry="L'action{{actionInde
AdvSceneSwitcher.condition.source="Source"
AdvSceneSwitcher.condition.source.type.active="Est actif"
AdvSceneSwitcher.condition.source.type.showing="Est affiché"
AdvSceneSwitcher.condition.source.type.settings="Correspond aux paramètres"
AdvSceneSwitcher.condition.source.type.settingsMatch="Correspond aux paramètres"
AdvSceneSwitcher.condition.source.type.settingsChanged="Paramètres modifiés"
AdvSceneSwitcher.condition.source.sceneVisibilityHint="La visibilité spécifique à la scène peut être vérifiée en utilisant la condition \"Visibilité de l'élément de la scène\""
AdvSceneSwitcher.condition.source.getSettings="Obtenir les paramètres actuels"

View File

@ -191,9 +191,8 @@ AdvSceneSwitcher.condition.macro.count.entry.line2="Mevcut sayı: {{currentCount
AdvSceneSwitcher.condition.source="Kaynak"
AdvSceneSwitcher.condition.source.type.active="Aktiftir"
AdvSceneSwitcher.condition.source.type.showing="gösteriyor"
AdvSceneSwitcher.condition.source.type.settings="Ayarlar eşleştirildi"
AdvSceneSwitcher.condition.source.type.settingsMatch="Ayarlar eşleştirildi"
AdvSceneSwitcher.condition.source.getSettings="Mevcut ayarları al"
AdvSceneSwitcher.condition.source.entry.line1="{{sources}} {{conditions}}"
AdvSceneSwitcher.condition.source.entry.line2="{{settings}}"
AdvSceneSwitcher.condition.source.entry.line3="{{regex}} {{getSettings}}"
AdvSceneSwitcher.condition.virtualCamera="Sanal kamera"

View File

@ -309,9 +309,8 @@ AdvSceneSwitcher.condition.macro.count.entry.line2="当前计数: {{currentCount
AdvSceneSwitcher.condition.source="源"
AdvSceneSwitcher.condition.source.type.active="是激活状态"
AdvSceneSwitcher.condition.source.type.showing="是显示状态"
AdvSceneSwitcher.condition.source.type.settings="设置完全匹配"
AdvSceneSwitcher.condition.source.type.settingsMatch="设置完全匹配"
AdvSceneSwitcher.condition.source.getSettings="获取当前设置"
AdvSceneSwitcher.condition.source.entry.line1="{{sources}} {{conditions}}"
AdvSceneSwitcher.condition.source.entry.line2="{{settings}}"
AdvSceneSwitcher.condition.source.entry.line3="{{regex}} {{getSettings}}"
AdvSceneSwitcher.condition.virtualCamera="虚拟摄像机"

View File

@ -16,10 +16,14 @@ const static std::map<MacroConditionSource::Condition, std::string>
"AdvSceneSwitcher.condition.source.type.active"},
{MacroConditionSource::Condition::SHOWING,
"AdvSceneSwitcher.condition.source.type.showing"},
{MacroConditionSource::Condition::SETTINGS_MATCH,
"AdvSceneSwitcher.condition.source.type.settings"},
{MacroConditionSource::Condition::ALL_SETTINGS_MATCH,
"AdvSceneSwitcher.condition.source.type.settingsMatch"},
{MacroConditionSource::Condition::SETTINGS_CHANGED,
"AdvSceneSwitcher.condition.source.type.settingsChanged"},
{MacroConditionSource::Condition::INDIVIDUAL_SETTING_MATCH,
"AdvSceneSwitcher.condition.source.type.individualSettingMatches"},
{MacroConditionSource::Condition::INDIVIDUAL_SETTING_CHANGED,
"AdvSceneSwitcher.condition.source.type.individualSettingChanged"},
};
bool MacroConditionSource::CheckCondition()
@ -29,7 +33,8 @@ bool MacroConditionSource::CheckCondition()
}
bool ret = false;
auto s = obs_weak_source_get_source(_source.GetSource());
OBSSourceAutoRelease s =
obs_weak_source_get_source(_source.GetSource());
switch (_condition) {
case Condition::ACTIVE:
@ -38,7 +43,7 @@ bool MacroConditionSource::CheckCondition()
case Condition::SHOWING:
ret = obs_source_showing(s);
break;
case Condition::SETTINGS_MATCH:
case Condition::ALL_SETTINGS_MATCH:
ret = CompareSourceSettings(_source.GetSource(), _settings,
_regex);
if (IsReferencedInVars()) {
@ -53,12 +58,26 @@ bool MacroConditionSource::CheckCondition()
SetVariableValue(settings);
break;
}
case Condition::INDIVIDUAL_SETTING_MATCH: {
std::string value =
GetSourceSettingValue(_source.GetSource(), _setting);
ret = _regex.Enabled() ? _regex.Matches(value, _settings)
: value == std::string(_settings);
SetVariableValue(value);
break;
}
case Condition::INDIVIDUAL_SETTING_CHANGED: {
std::string value =
GetSourceSettingValue(_source.GetSource(), _setting);
ret = _currentSettingsValue != value;
_currentSettingsValue = value;
SetVariableValue(value);
break;
}
default:
break;
}
obs_source_release(s);
if (GetVariableValue().empty()) {
SetVariableValue(ret ? "true" : "false");
}
@ -73,6 +92,7 @@ bool MacroConditionSource::Save(obs_data_t *obj) const
obs_data_set_int(obj, "condition", static_cast<int>(_condition));
_settings.Save(obj, "settings");
_regex.Save(obj);
_setting.Save(obj);
return true;
}
@ -88,6 +108,7 @@ bool MacroConditionSource::Load(obs_data_t *obj)
_regex.CreateBackwardsCompatibleRegex(
obs_data_get_bool(obj, "regex"));
}
_setting.Load(obj);
return true;
}
@ -109,9 +130,10 @@ MacroConditionSourceEdit::MacroConditionSourceEdit(
_sources(new SourceSelectionWidget(this, QStringList(), true)),
_conditions(new QComboBox()),
_getSettings(new QPushButton(obs_module_text(
"AdvSceneSwitcher.condition.filter.getSettings"))),
"AdvSceneSwitcher.condition.source.getSettings"))),
_settings(new VariableTextEdit(this)),
_regex(new RegexConfigWidget(parent))
_regex(new RegexConfigWidget(parent)),
_settingSelection(new SourceSettingSelection())
{
populateConditionSelection(_conditions);
auto sources = GetSourceNames();
@ -131,12 +153,18 @@ MacroConditionSourceEdit::MacroConditionSourceEdit(
SLOT(SettingsChanged()));
QWidget::connect(_regex, SIGNAL(RegexConfigChanged(RegexConfig)), this,
SLOT(RegexChanged(RegexConfig)));
QWidget::connect(_settingSelection,
SIGNAL(SelectionChanged(const SourceSetting &)), this,
SLOT(SettingSelectionChanged(const SourceSetting &)));
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
{"{{sources}}", _sources}, {"{{conditions}}", _conditions},
{"{{settings}}", _settings}, {"{{getSettings}}", _getSettings},
{"{{sources}}", _sources},
{"{{conditions}}", _conditions},
{"{{settings}}", _settings},
{"{{getSettings}}", _getSettings},
{"{{regex}}", _regex},
};
{"{{settingSelection}}", _settingSelection}};
auto line1Layout = new QHBoxLayout;
line1Layout->setContentsMargins(0, 0, 0, 0);
PlaceWidgets(obs_module_text(
@ -169,8 +197,11 @@ void MacroConditionSourceEdit::SourceChanged(const SourceSelection &source)
return;
}
auto lock = LockContext();
_entryData->_source = source;
{
auto lock = LockContext();
_entryData->_source = source;
}
_settingSelection->SetSource(_entryData->_source.GetSource());
emit HeaderInfoChanged(
QString::fromStdString(_entryData->GetShortDesc()));
}
@ -193,12 +224,20 @@ void MacroConditionSourceEdit::GetSettingsClicked()
return;
}
QString json = FormatJsonString(
GetSourceSettings(_entryData->_source.GetSource()));
if (_entryData->_regex.Enabled()) {
json = EscapeForRegex(json);
QString value;
if (_entryData->_condition ==
MacroConditionSource::Condition::ALL_SETTINGS_MATCH) {
value = FormatJsonString(
GetSourceSettings(_entryData->_source.GetSource()));
} else {
value = QString::fromStdString(GetSourceSettingValue(
_entryData->_source.GetSource(), _entryData->_setting));
}
_settings->setPlainText(json);
if (_entryData->_regex.Enabled()) {
value = EscapeForRegex(value);
}
_settings->setPlainText(value);
}
void MacroConditionSourceEdit::SettingsChanged()
@ -227,15 +266,30 @@ void MacroConditionSourceEdit::RegexChanged(RegexConfig conf)
updateGeometry();
}
void MacroConditionSourceEdit::SettingSelectionChanged(
const SourceSetting &setting)
{
if (_loading || !_entryData) {
return;
}
auto lock = LockContext();
_entryData->_setting = setting;
}
void MacroConditionSourceEdit::SetWidgetVisibility()
{
_settings->setVisible(_entryData->_condition ==
MacroConditionSource::Condition::SETTINGS_MATCH);
_getSettings->setVisible(
const bool settingsMatch =
_entryData->_condition ==
MacroConditionSource::Condition::SETTINGS_MATCH);
_regex->setVisible(_entryData->_condition ==
MacroConditionSource::Condition::SETTINGS_MATCH);
MacroConditionSource::Condition::ALL_SETTINGS_MATCH ||
_entryData->_condition ==
MacroConditionSource::Condition::INDIVIDUAL_SETTING_MATCH;
_settings->setVisible(settingsMatch);
_getSettings->setVisible(settingsMatch);
_regex->setVisible(settingsMatch);
_settingSelection->setVisible(
_entryData->_condition ==
MacroConditionSource::Condition::INDIVIDUAL_SETTING_MATCH);
setToolTip(
(_entryData->_condition ==
@ -260,6 +314,8 @@ void MacroConditionSourceEdit::UpdateEntryData()
_conditions->setCurrentIndex(static_cast<int>(_entryData->_condition));
_settings->setPlainText(_entryData->_settings);
_regex->SetRegexConfig(_entryData->_regex);
_settingSelection->SetSource(_entryData->_source.GetSource());
_settingSelection->SetSetting(_entryData->_setting);
SetWidgetVisibility();
}

View File

@ -3,6 +3,7 @@
#include "variable-text-edit.hpp"
#include "regex-config.hpp"
#include "source-selection.hpp"
#include "source-setting.hpp"
#include <QComboBox>
#include <QPushButton>
@ -26,17 +27,21 @@ public:
enum class Condition {
ACTIVE,
SHOWING,
SETTINGS_MATCH,
ALL_SETTINGS_MATCH,
SETTINGS_CHANGED,
INDIVIDUAL_SETTING_MATCH,
INDIVIDUAL_SETTING_CHANGED,
};
SourceSelection _source;
Condition _condition = Condition::ACTIVE;
StringVariable _settings = "";
SourceSetting _setting;
RegexConfig _regex;
private:
std::string _currentSettings;
std::string _currentSettingsValue;
static bool _registered;
static const std::string id;
@ -64,6 +69,7 @@ private slots:
void GetSettingsClicked();
void SettingsChanged();
void RegexChanged(RegexConfig);
void SettingSelectionChanged(const SourceSetting &);
signals:
void HeaderInfoChanged(const QString &);
@ -73,6 +79,7 @@ protected:
QPushButton *_getSettings;
VariableTextEdit *_settings;
RegexConfigWidget *_regex;
SourceSettingSelection *_settingSelection;
std::shared_ptr<MacroConditionSource> _entryData;