diff --git a/src/macro-core/macro-condition-filter.cpp b/src/macro-core/macro-condition-filter.cpp index 899afce0..cf3aa27e 100644 --- a/src/macro-core/macro-condition-filter.cpp +++ b/src/macro-core/macro-condition-filter.cpp @@ -12,18 +12,33 @@ bool MacroConditionFilter::_registered = MacroConditionFactory::Register( {MacroConditionFilter::Create, MacroConditionFilterEdit::Create, "AdvSceneSwitcher.condition.filter"}); -static std::map filterConditionTypes = { - {FilterCondition::ENABLED, - "AdvSceneSwitcher.condition.filter.type.active"}, - {FilterCondition::DISABLED, - "AdvSceneSwitcher.condition.filter.type.showing"}, - {FilterCondition::SETTINGS, - "AdvSceneSwitcher.condition.filter.type.settings"}, +static std::map + filterConditionTypes = { + {MacroConditionFilter::Condition::ENABLED, + "AdvSceneSwitcher.condition.filter.type.active"}, + {MacroConditionFilter::Condition::DISABLED, + "AdvSceneSwitcher.condition.filter.type.showing"}, + {MacroConditionFilter::Condition::SETTINGS, + "AdvSceneSwitcher.condition.filter.type.settings"}, }; +void MacroConditionFilter::ResolveVariables() +{ + if (_source.GetType() == SourceSelection::Type::SOURCE) { + return; + } + + std::string name = GetWeakSourceName(_filter); + if (!name.empty()) { + _filterName = name; + } + _filter = GetWeakFilterByName(_source.GetSource(), _filterName.c_str()); +} + bool MacroConditionFilter::CheckCondition() { - if (!_source) { + ResolveVariables(); + if (!_source.GetSource()) { return false; } @@ -31,13 +46,13 @@ bool MacroConditionFilter::CheckCondition() auto s = obs_weak_source_get_source(_filter); switch (_condition) { - case FilterCondition::ENABLED: + case Condition::ENABLED: ret = obs_source_enabled(s); break; - case FilterCondition::DISABLED: + case Condition::DISABLED: ret = !obs_source_enabled(s); break; - case FilterCondition::SETTINGS: + case Condition::SETTINGS: ret = compareSourceSettings(_filter, _settings, _regex); break; default: @@ -45,15 +60,14 @@ bool MacroConditionFilter::CheckCondition() } obs_source_release(s); - return ret; } bool MacroConditionFilter::Save(obs_data_t *obj) const { MacroCondition::Save(obj); - obs_data_set_string(obj, "source", GetWeakSourceName(_source).c_str()); - obs_data_set_string(obj, "filter", GetWeakSourceName(_filter).c_str()); + _source.Save(obj); + obs_data_set_string(obj, "filter", _filterName.c_str()); obs_data_set_int(obj, "condition", static_cast(_condition)); _settings.Save(obj, "settings"); _regex.Save(obj); @@ -63,12 +77,11 @@ bool MacroConditionFilter::Save(obs_data_t *obj) const bool MacroConditionFilter::Load(obs_data_t *obj) { MacroCondition::Load(obj); - const char *sourceName = obs_data_get_string(obj, "source"); - _source = GetWeakSourceByName(sourceName); - const char *filterName = obs_data_get_string(obj, "filter"); - _filter = GetWeakFilterByQString(_source, filterName); - _condition = static_cast( - obs_data_get_int(obj, "condition")); + _source.Load(obj); + _filterName = obs_data_get_string(obj, "filter"); + _filter = GetWeakFilterByQString(_source.GetSource(), + _filterName.c_str()); + _condition = static_cast(obs_data_get_int(obj, "condition")); _settings.Load(obj, "settings"); _regex.Load(obj); // TOOD: remove in future version @@ -81,9 +94,8 @@ bool MacroConditionFilter::Load(obs_data_t *obj) std::string MacroConditionFilter::GetShortDesc() const { - if (_filter && _source) { - return GetWeakSourceName(_source) + " - " + - GetWeakSourceName(_filter); + if (_filter && !_source.ToString().empty()) { + return _source.ToString() + " - " + GetWeakSourceName(_filter); } return ""; } @@ -98,7 +110,7 @@ static inline void populateConditionSelection(QComboBox *list) MacroConditionFilterEdit::MacroConditionFilterEdit( QWidget *parent, std::shared_ptr entryData) : QWidget(parent), - _sources(new QComboBox()), + _sources(new SourceSelectionWidget(this, QStringList(), true)), _filters(new QComboBox()), _conditions(new QComboBox()), _getSettings(new QPushButton(obs_module_text( @@ -108,10 +120,13 @@ MacroConditionFilterEdit::MacroConditionFilterEdit( { _filters->setSizeAdjustPolicy(QComboBox::AdjustToContents); populateConditionSelection(_conditions); - populateSourcesWithFilterSelection(_sources); + auto sources = GetSourcesWithFilterNames(); + sources.sort(); + _sources->SetSourceNameList(sources); - QWidget::connect(_sources, SIGNAL(currentTextChanged(const QString &)), - this, SLOT(SourceChanged(const QString &))); + QWidget::connect(_sources, + SIGNAL(SourceChanged(const SourceSelection &)), this, + SLOT(SourceChanged(const SourceSelection &))); QWidget::connect(_filters, SIGNAL(currentTextChanged(const QString &)), this, SLOT(FilterChanged(const QString &))); QWidget::connect(_conditions, SIGNAL(currentIndexChanged(int)), this, @@ -152,17 +167,17 @@ MacroConditionFilterEdit::MacroConditionFilterEdit( _loading = false; } -void MacroConditionFilterEdit::SourceChanged(const QString &text) +void MacroConditionFilterEdit::SourceChanged(const SourceSelection &source) { if (_loading || !_entryData) { return; } { std::lock_guard lock(switcher->m); - _entryData->_source = GetWeakSourceByQString(text); + _entryData->_source = source; } _filters->clear(); - populateFilterSelection(_filters, _entryData->_source); + populateFilterSelection(_filters, _entryData->_source.GetSource()); _filters->adjustSize(); } @@ -173,7 +188,9 @@ void MacroConditionFilterEdit::FilterChanged(const QString &text) } std::lock_guard lock(switcher->m); - _entryData->_filter = GetWeakFilterByQString(_entryData->_source, text); + _entryData->_filterName = text.toStdString(); + _entryData->_filter = + GetWeakFilterByQString(_entryData->_source.GetSource(), text); emit HeaderInfoChanged( QString::fromStdString(_entryData->GetShortDesc())); } @@ -185,14 +202,15 @@ void MacroConditionFilterEdit::ConditionChanged(int index) } std::lock_guard lock(switcher->m); - _entryData->_condition = static_cast(index); + _entryData->_condition = + static_cast(index); SetSettingsSelectionVisible(_entryData->_condition == - FilterCondition::SETTINGS); + MacroConditionFilter::Condition::SETTINGS); } void MacroConditionFilterEdit::GetSettingsClicked() { - if (_loading || !_entryData || !_entryData->_source) { + if (_loading || !_entryData || !_entryData->_source.GetSource()) { return; } @@ -243,16 +261,15 @@ void MacroConditionFilterEdit::UpdateEntryData() return; } - _sources->setCurrentText( - GetWeakSourceName(_entryData->_source).c_str()); - populateFilterSelection(_filters, _entryData->_source); + _sources->SetSource(_entryData->_source); + populateFilterSelection(_filters, _entryData->_source.GetSource()); _filters->setCurrentText( GetWeakSourceName(_entryData->_filter).c_str()); _conditions->setCurrentIndex(static_cast(_entryData->_condition)); _settings->setPlainText(_entryData->_settings); _regex->SetRegexConfig(_entryData->_regex); SetSettingsSelectionVisible(_entryData->_condition == - FilterCondition::SETTINGS); + MacroConditionFilter::Condition::SETTINGS); adjustSize(); updateGeometry(); diff --git a/src/macro-core/macro-condition-filter.hpp b/src/macro-core/macro-condition-filter.hpp index c5a5b124..6e30cc03 100644 --- a/src/macro-core/macro-condition-filter.hpp +++ b/src/macro-core/macro-condition-filter.hpp @@ -2,17 +2,12 @@ #include "macro.hpp" #include "variable-text-edit.hpp" #include "regex-config.hpp" +#include "source-selection.hpp" #include #include #include -enum class FilterCondition { - ENABLED, - DISABLED, - SETTINGS, -}; - class MacroConditionFilter : public MacroCondition { public: MacroConditionFilter(Macro *m) : MacroCondition(m) {} @@ -26,15 +21,26 @@ public: return std::make_shared(m); } - OBSWeakSource _source; + enum class Condition { + ENABLED, + DISABLED, + SETTINGS, + }; + + SourceSelection _source; OBSWeakSource _filter; - FilterCondition _condition = FilterCondition::ENABLED; + Condition _condition = Condition::ENABLED; VariableResolvingString _settings = ""; RegexConfig _regex; private: + void ResolveVariables(); + std::string _filterName = ""; + static bool _registered; static const std::string id; + + friend class MacroConditionFilterEdit; }; class MacroConditionFilterEdit : public QWidget { @@ -54,7 +60,7 @@ public: } private slots: - void SourceChanged(const QString &text); + void SourceChanged(const SourceSelection &); void FilterChanged(const QString &text); void ConditionChanged(int cond); void GetSettingsClicked(); @@ -64,7 +70,7 @@ signals: void HeaderInfoChanged(const QString &); protected: - QComboBox *_sources; + SourceSelectionWidget *_sources; QComboBox *_filters; QComboBox *_conditions; QPushButton *_getSettings;