Add option to check for settings change to source and filter condition

This commit is contained in:
WarmUpTill 2023-08-19 08:31:40 +02:00 committed by WarmUpTill
parent 9c848938f8
commit b88209f63d
5 changed files with 70 additions and 37 deletions

View File

@ -341,6 +341,7 @@ 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.settingsChanged="Settings 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}}"
@ -354,6 +355,7 @@ AdvSceneSwitcher.condition.filter="Filter"
AdvSceneSwitcher.condition.filter.type.active="Is enabled"
AdvSceneSwitcher.condition.filter.type.showing="Is disabled"
AdvSceneSwitcher.condition.filter.type.settings="Settings match"
AdvSceneSwitcher.condition.filter.type.settingsChanged="Settings changed"
AdvSceneSwitcher.condition.filter.getSettings="Get current settings"
AdvSceneSwitcher.condition.filter.entry.line1="On{{sources}}{{filters}}{{conditions}}"
AdvSceneSwitcher.condition.filter.entry.line2="{{settings}}"

View File

@ -18,8 +18,10 @@ const static std::map<MacroConditionFilter::Condition, std::string>
"AdvSceneSwitcher.condition.filter.type.active"},
{MacroConditionFilter::Condition::DISABLED,
"AdvSceneSwitcher.condition.filter.type.showing"},
{MacroConditionFilter::Condition::SETTINGS,
{MacroConditionFilter::Condition::SETTINGS_MATCH,
"AdvSceneSwitcher.condition.filter.type.settings"},
{MacroConditionFilter::Condition::SETTINGS_CHANGED,
"AdvSceneSwitcher.condition.filter.type.settingsChanged"},
};
bool MacroConditionFilter::CheckCondition()
@ -38,13 +40,20 @@ bool MacroConditionFilter::CheckCondition()
case Condition::DISABLED:
ret = !obs_source_enabled(filterSource);
break;
case Condition::SETTINGS:
case Condition::SETTINGS_MATCH:
ret = CompareSourceSettings(filterWeakSource, _settings,
_regex);
if (IsReferencedInVars()) {
SetVariableValue(GetSourceSettings(filterWeakSource));
}
break;
case Condition::SETTINGS_CHANGED: {
std::string settings = GetSourceSettings(_source.GetSource());
ret = !_currentSettings.empty() && settings != _currentSettings;
_currentSettings = settings;
SetVariableValue(settings);
break;
}
default:
break;
}
@ -95,8 +104,8 @@ std::string MacroConditionFilter::GetShortDesc() const
static inline void populateConditionSelection(QComboBox *list)
{
for (auto entry : filterConditionTypes) {
list->addItem(obs_module_text(entry.second.c_str()));
for (const auto &[_, name] : filterConditionTypes) {
list->addItem(obs_module_text(name.c_str()));
}
}
@ -194,8 +203,9 @@ void MacroConditionFilterEdit::ConditionChanged(int index)
auto lock = LockContext();
_entryData->_condition =
static_cast<MacroConditionFilter::Condition>(index);
SetSettingsSelectionVisible(_entryData->_condition ==
MacroConditionFilter::Condition::SETTINGS);
SetSettingsSelectionVisible(
_entryData->_condition ==
MacroConditionFilter::Condition::SETTINGS_MATCH);
}
void MacroConditionFilterEdit::GetSettingsClicked()
@ -259,8 +269,9 @@ void MacroConditionFilterEdit::UpdateEntryData()
_conditions->setCurrentIndex(static_cast<int>(_entryData->_condition));
_settings->setPlainText(_entryData->_settings);
_regex->SetRegexConfig(_entryData->_regex);
SetSettingsSelectionVisible(_entryData->_condition ==
MacroConditionFilter::Condition::SETTINGS);
SetSettingsSelectionVisible(
_entryData->_condition ==
MacroConditionFilter::Condition::SETTINGS_MATCH);
adjustSize();
updateGeometry();

View File

@ -27,7 +27,8 @@ public:
enum class Condition {
ENABLED,
DISABLED,
SETTINGS,
SETTINGS_MATCH,
SETTINGS_CHANGED,
};
SourceSelection _source;
@ -37,6 +38,8 @@ public:
RegexConfig _regex;
private:
std::string _currentSettings;
static bool _registered;
static const std::string id;
};

View File

@ -10,13 +10,16 @@ bool MacroConditionSource::_registered = MacroConditionFactory::Register(
{MacroConditionSource::Create, MacroConditionSourceEdit::Create,
"AdvSceneSwitcher.condition.source"});
const static std::map<SourceCondition, std::string> sourceConditionTypes = {
{SourceCondition::ACTIVE,
"AdvSceneSwitcher.condition.source.type.active"},
{SourceCondition::SHOWING,
"AdvSceneSwitcher.condition.source.type.showing"},
{SourceCondition::SETTINGS,
"AdvSceneSwitcher.condition.source.type.settings"},
const static std::map<MacroConditionSource::Condition, std::string>
sourceCnditionTypes = {
{MacroConditionSource::Condition::ACTIVE,
"AdvSceneSwitcher.condition.source.type.active"},
{MacroConditionSource::Condition::SHOWING,
"AdvSceneSwitcher.condition.source.type.showing"},
{MacroConditionSource::Condition::SETTINGS_MATCH,
"AdvSceneSwitcher.condition.source.type.settings"},
{MacroConditionSource::Condition::SETTINGS_CHANGED,
"AdvSceneSwitcher.condition.source.type.settingsChanged"},
};
bool MacroConditionSource::CheckCondition()
@ -29,13 +32,13 @@ bool MacroConditionSource::CheckCondition()
auto s = obs_weak_source_get_source(_source.GetSource());
switch (_condition) {
case SourceCondition::ACTIVE:
case Condition::ACTIVE:
ret = obs_source_active(s);
break;
case SourceCondition::SHOWING:
case Condition::SHOWING:
ret = obs_source_showing(s);
break;
case SourceCondition::SETTINGS:
case Condition::SETTINGS_MATCH:
ret = CompareSourceSettings(_source.GetSource(), _settings,
_regex);
if (IsReferencedInVars()) {
@ -43,6 +46,13 @@ bool MacroConditionSource::CheckCondition()
GetSourceSettings(_source.GetSource()));
}
break;
case Condition::SETTINGS_CHANGED: {
std::string settings = GetSourceSettings(_source.GetSource());
ret = !_currentSettings.empty() && settings != _currentSettings;
_currentSettings = settings;
SetVariableValue(settings);
break;
}
default:
break;
}
@ -70,8 +80,7 @@ bool MacroConditionSource::Load(obs_data_t *obj)
{
MacroCondition::Load(obj);
_source.Load(obj);
_condition = static_cast<SourceCondition>(
obs_data_get_int(obj, "condition"));
_condition = static_cast<Condition>(obs_data_get_int(obj, "condition"));
_settings.Load(obj, "settings");
_regex.Load(obj);
// TOOD: remove in future version
@ -89,8 +98,8 @@ std::string MacroConditionSource::GetShortDesc() const
static inline void populateConditionSelection(QComboBox *list)
{
for (auto entry : sourceConditionTypes) {
list->addItem(obs_module_text(entry.second.c_str()));
for (const auto &[_, name] : sourceCnditionTypes) {
list->addItem(obs_module_text(name.c_str()));
}
}
@ -173,7 +182,8 @@ void MacroConditionSourceEdit::ConditionChanged(int index)
}
auto lock = LockContext();
_entryData->_condition = static_cast<SourceCondition>(index);
_entryData->_condition =
static_cast<MacroConditionSource::Condition>(index);
SetWidgetVisibility();
}
@ -220,14 +230,18 @@ void MacroConditionSourceEdit::RegexChanged(RegexConfig conf)
void MacroConditionSourceEdit::SetWidgetVisibility()
{
_settings->setVisible(_entryData->_condition ==
SourceCondition::SETTINGS);
_getSettings->setVisible(_entryData->_condition ==
SourceCondition::SETTINGS);
_regex->setVisible(_entryData->_condition == SourceCondition::SETTINGS);
MacroConditionSource::Condition::SETTINGS_MATCH);
_getSettings->setVisible(
_entryData->_condition ==
MacroConditionSource::Condition::SETTINGS_MATCH);
_regex->setVisible(_entryData->_condition ==
MacroConditionSource::Condition::SETTINGS_MATCH);
setToolTip(
(_entryData->_condition == SourceCondition::ACTIVE ||
_entryData->_condition == SourceCondition::SHOWING)
(_entryData->_condition ==
MacroConditionSource::Condition::ACTIVE ||
_entryData->_condition ==
MacroConditionSource::Condition::SHOWING)
? obs_module_text(
"AdvSceneSwitcher.condition.source.sceneVisibilityHint")
: "");

View File

@ -10,12 +10,6 @@
namespace advss {
enum class SourceCondition {
ACTIVE,
SHOWING,
SETTINGS,
};
class MacroConditionSource : public MacroCondition {
public:
MacroConditionSource(Macro *m) : MacroCondition(m, true) {}
@ -29,12 +23,21 @@ public:
return std::make_shared<MacroConditionSource>(m);
}
enum class Condition {
ACTIVE,
SHOWING,
SETTINGS_MATCH,
SETTINGS_CHANGED,
};
SourceSelection _source;
SourceCondition _condition = SourceCondition::ACTIVE;
Condition _condition = Condition::ACTIVE;
StringVariable _settings = "";
RegexConfig _regex;
private:
std::string _currentSettings;
static bool _registered;
static const std::string id;
};