Skip to content

Commit b88209f

Browse files
committed
Add option to check for settings change to source and filter condition
1 parent 9c84893 commit b88209f

File tree

5 files changed

+70
-37
lines changed

5 files changed

+70
-37
lines changed

data/locale/en-US.ini

+2
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,7 @@ AdvSceneSwitcher.condition.source="Source"
341341
AdvSceneSwitcher.condition.source.type.active="Is active"
342342
AdvSceneSwitcher.condition.source.type.showing="Is showing"
343343
AdvSceneSwitcher.condition.source.type.settings="Settings match"
344+
AdvSceneSwitcher.condition.source.type.settingsChanged="Settings changed"
344345
AdvSceneSwitcher.condition.source.sceneVisibilityHint="Scene specific visibility can be checked using the \"Scene item visibility\" condition"
345346
AdvSceneSwitcher.condition.source.getSettings="Get current settings"
346347
AdvSceneSwitcher.condition.source.entry.line1="{{sources}}{{conditions}}"
@@ -354,6 +355,7 @@ AdvSceneSwitcher.condition.filter="Filter"
354355
AdvSceneSwitcher.condition.filter.type.active="Is enabled"
355356
AdvSceneSwitcher.condition.filter.type.showing="Is disabled"
356357
AdvSceneSwitcher.condition.filter.type.settings="Settings match"
358+
AdvSceneSwitcher.condition.filter.type.settingsChanged="Settings changed"
357359
AdvSceneSwitcher.condition.filter.getSettings="Get current settings"
358360
AdvSceneSwitcher.condition.filter.entry.line1="On{{sources}}{{filters}}{{conditions}}"
359361
AdvSceneSwitcher.condition.filter.entry.line2="{{settings}}"

src/macro-core/macro-condition-filter.cpp

+19-8
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ const static std::map<MacroConditionFilter::Condition, std::string>
1818
"AdvSceneSwitcher.condition.filter.type.active"},
1919
{MacroConditionFilter::Condition::DISABLED,
2020
"AdvSceneSwitcher.condition.filter.type.showing"},
21-
{MacroConditionFilter::Condition::SETTINGS,
21+
{MacroConditionFilter::Condition::SETTINGS_MATCH,
2222
"AdvSceneSwitcher.condition.filter.type.settings"},
23+
{MacroConditionFilter::Condition::SETTINGS_CHANGED,
24+
"AdvSceneSwitcher.condition.filter.type.settingsChanged"},
2325
};
2426

2527
bool MacroConditionFilter::CheckCondition()
@@ -38,13 +40,20 @@ bool MacroConditionFilter::CheckCondition()
3840
case Condition::DISABLED:
3941
ret = !obs_source_enabled(filterSource);
4042
break;
41-
case Condition::SETTINGS:
43+
case Condition::SETTINGS_MATCH:
4244
ret = CompareSourceSettings(filterWeakSource, _settings,
4345
_regex);
4446
if (IsReferencedInVars()) {
4547
SetVariableValue(GetSourceSettings(filterWeakSource));
4648
}
4749
break;
50+
case Condition::SETTINGS_CHANGED: {
51+
std::string settings = GetSourceSettings(_source.GetSource());
52+
ret = !_currentSettings.empty() && settings != _currentSettings;
53+
_currentSettings = settings;
54+
SetVariableValue(settings);
55+
break;
56+
}
4857
default:
4958
break;
5059
}
@@ -95,8 +104,8 @@ std::string MacroConditionFilter::GetShortDesc() const
95104

96105
static inline void populateConditionSelection(QComboBox *list)
97106
{
98-
for (auto entry : filterConditionTypes) {
99-
list->addItem(obs_module_text(entry.second.c_str()));
107+
for (const auto &[_, name] : filterConditionTypes) {
108+
list->addItem(obs_module_text(name.c_str()));
100109
}
101110
}
102111

@@ -194,8 +203,9 @@ void MacroConditionFilterEdit::ConditionChanged(int index)
194203
auto lock = LockContext();
195204
_entryData->_condition =
196205
static_cast<MacroConditionFilter::Condition>(index);
197-
SetSettingsSelectionVisible(_entryData->_condition ==
198-
MacroConditionFilter::Condition::SETTINGS);
206+
SetSettingsSelectionVisible(
207+
_entryData->_condition ==
208+
MacroConditionFilter::Condition::SETTINGS_MATCH);
199209
}
200210

201211
void MacroConditionFilterEdit::GetSettingsClicked()
@@ -259,8 +269,9 @@ void MacroConditionFilterEdit::UpdateEntryData()
259269
_conditions->setCurrentIndex(static_cast<int>(_entryData->_condition));
260270
_settings->setPlainText(_entryData->_settings);
261271
_regex->SetRegexConfig(_entryData->_regex);
262-
SetSettingsSelectionVisible(_entryData->_condition ==
263-
MacroConditionFilter::Condition::SETTINGS);
272+
SetSettingsSelectionVisible(
273+
_entryData->_condition ==
274+
MacroConditionFilter::Condition::SETTINGS_MATCH);
264275

265276
adjustSize();
266277
updateGeometry();

src/macro-core/macro-condition-filter.hpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ class MacroConditionFilter : public MacroCondition {
2727
enum class Condition {
2828
ENABLED,
2929
DISABLED,
30-
SETTINGS,
30+
SETTINGS_MATCH,
31+
SETTINGS_CHANGED,
3132
};
3233

3334
SourceSelection _source;
@@ -37,6 +38,8 @@ class MacroConditionFilter : public MacroCondition {
3738
RegexConfig _regex;
3839

3940
private:
41+
std::string _currentSettings;
42+
4043
static bool _registered;
4144
static const std::string id;
4245
};

src/macro-core/macro-condition-source.cpp

+35-21
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,16 @@ bool MacroConditionSource::_registered = MacroConditionFactory::Register(
1010
{MacroConditionSource::Create, MacroConditionSourceEdit::Create,
1111
"AdvSceneSwitcher.condition.source"});
1212

13-
const static std::map<SourceCondition, std::string> sourceConditionTypes = {
14-
{SourceCondition::ACTIVE,
15-
"AdvSceneSwitcher.condition.source.type.active"},
16-
{SourceCondition::SHOWING,
17-
"AdvSceneSwitcher.condition.source.type.showing"},
18-
{SourceCondition::SETTINGS,
19-
"AdvSceneSwitcher.condition.source.type.settings"},
13+
const static std::map<MacroConditionSource::Condition, std::string>
14+
sourceCnditionTypes = {
15+
{MacroConditionSource::Condition::ACTIVE,
16+
"AdvSceneSwitcher.condition.source.type.active"},
17+
{MacroConditionSource::Condition::SHOWING,
18+
"AdvSceneSwitcher.condition.source.type.showing"},
19+
{MacroConditionSource::Condition::SETTINGS_MATCH,
20+
"AdvSceneSwitcher.condition.source.type.settings"},
21+
{MacroConditionSource::Condition::SETTINGS_CHANGED,
22+
"AdvSceneSwitcher.condition.source.type.settingsChanged"},
2023
};
2124

2225
bool MacroConditionSource::CheckCondition()
@@ -29,20 +32,27 @@ bool MacroConditionSource::CheckCondition()
2932
auto s = obs_weak_source_get_source(_source.GetSource());
3033

3134
switch (_condition) {
32-
case SourceCondition::ACTIVE:
35+
case Condition::ACTIVE:
3336
ret = obs_source_active(s);
3437
break;
35-
case SourceCondition::SHOWING:
38+
case Condition::SHOWING:
3639
ret = obs_source_showing(s);
3740
break;
38-
case SourceCondition::SETTINGS:
41+
case Condition::SETTINGS_MATCH:
3942
ret = CompareSourceSettings(_source.GetSource(), _settings,
4043
_regex);
4144
if (IsReferencedInVars()) {
4245
SetVariableValue(
4346
GetSourceSettings(_source.GetSource()));
4447
}
4548
break;
49+
case Condition::SETTINGS_CHANGED: {
50+
std::string settings = GetSourceSettings(_source.GetSource());
51+
ret = !_currentSettings.empty() && settings != _currentSettings;
52+
_currentSettings = settings;
53+
SetVariableValue(settings);
54+
break;
55+
}
4656
default:
4757
break;
4858
}
@@ -70,8 +80,7 @@ bool MacroConditionSource::Load(obs_data_t *obj)
7080
{
7181
MacroCondition::Load(obj);
7282
_source.Load(obj);
73-
_condition = static_cast<SourceCondition>(
74-
obs_data_get_int(obj, "condition"));
83+
_condition = static_cast<Condition>(obs_data_get_int(obj, "condition"));
7584
_settings.Load(obj, "settings");
7685
_regex.Load(obj);
7786
// TOOD: remove in future version
@@ -89,8 +98,8 @@ std::string MacroConditionSource::GetShortDesc() const
8998

9099
static inline void populateConditionSelection(QComboBox *list)
91100
{
92-
for (auto entry : sourceConditionTypes) {
93-
list->addItem(obs_module_text(entry.second.c_str()));
101+
for (const auto &[_, name] : sourceCnditionTypes) {
102+
list->addItem(obs_module_text(name.c_str()));
94103
}
95104
}
96105

@@ -173,7 +182,8 @@ void MacroConditionSourceEdit::ConditionChanged(int index)
173182
}
174183

175184
auto lock = LockContext();
176-
_entryData->_condition = static_cast<SourceCondition>(index);
185+
_entryData->_condition =
186+
static_cast<MacroConditionSource::Condition>(index);
177187
SetWidgetVisibility();
178188
}
179189

@@ -220,14 +230,18 @@ void MacroConditionSourceEdit::RegexChanged(RegexConfig conf)
220230
void MacroConditionSourceEdit::SetWidgetVisibility()
221231
{
222232
_settings->setVisible(_entryData->_condition ==
223-
SourceCondition::SETTINGS);
224-
_getSettings->setVisible(_entryData->_condition ==
225-
SourceCondition::SETTINGS);
226-
_regex->setVisible(_entryData->_condition == SourceCondition::SETTINGS);
233+
MacroConditionSource::Condition::SETTINGS_MATCH);
234+
_getSettings->setVisible(
235+
_entryData->_condition ==
236+
MacroConditionSource::Condition::SETTINGS_MATCH);
237+
_regex->setVisible(_entryData->_condition ==
238+
MacroConditionSource::Condition::SETTINGS_MATCH);
227239

228240
setToolTip(
229-
(_entryData->_condition == SourceCondition::ACTIVE ||
230-
_entryData->_condition == SourceCondition::SHOWING)
241+
(_entryData->_condition ==
242+
MacroConditionSource::Condition::ACTIVE ||
243+
_entryData->_condition ==
244+
MacroConditionSource::Condition::SHOWING)
231245
? obs_module_text(
232246
"AdvSceneSwitcher.condition.source.sceneVisibilityHint")
233247
: "");

src/macro-core/macro-condition-source.hpp

+10-7
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,6 @@
1010

1111
namespace advss {
1212

13-
enum class SourceCondition {
14-
ACTIVE,
15-
SHOWING,
16-
SETTINGS,
17-
};
18-
1913
class MacroConditionSource : public MacroCondition {
2014
public:
2115
MacroConditionSource(Macro *m) : MacroCondition(m, true) {}
@@ -29,12 +23,21 @@ class MacroConditionSource : public MacroCondition {
2923
return std::make_shared<MacroConditionSource>(m);
3024
}
3125

26+
enum class Condition {
27+
ACTIVE,
28+
SHOWING,
29+
SETTINGS_MATCH,
30+
SETTINGS_CHANGED,
31+
};
32+
3233
SourceSelection _source;
33-
SourceCondition _condition = SourceCondition::ACTIVE;
34+
Condition _condition = Condition::ACTIVE;
3435
StringVariable _settings = "";
3536
RegexConfig _regex;
3637

3738
private:
39+
std::string _currentSettings;
40+
3841
static bool _registered;
3942
static const std::string id;
4043
};

0 commit comments

Comments
 (0)