From 4157ae4ed2576dec5803e2b7f85674291add8301 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Tue, 28 May 2024 21:17:53 +0200 Subject: [PATCH] Add option to check source height and width --- data/locale/en-US.ini | 7 +- plugins/base/macro-condition-source.cpp | 125 ++++++++++++++++++++---- plugins/base/macro-condition-source.hpp | 10 ++ 3 files changed, 122 insertions(+), 20 deletions(-) diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index b5dba574..beaba493 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -453,11 +453,16 @@ 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.type.width="Width" +AdvSceneSwitcher.condition.source.type.height="Height" +AdvSceneSwitcher.condition.source.sizeCompare.less="Smaller than" +AdvSceneSwitcher.condition.source.sizeCompare.equal="Equals" +AdvSceneSwitcher.condition.source.sizeCompare.more="Bigger than" AdvSceneSwitcher.condition.source.refresh="Refresh" AdvSceneSwitcher.condition.source.refreshTooltip="Repopulate the source settings selection with the settings of the source which's name matches the variable value." 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}}{{settingSelection}}{{refresh}}" +AdvSceneSwitcher.condition.source.entry.line1="{{sources}}{{conditions}}{{settingSelection}}{{refresh}}{{sizeCompareMethods}}{{size}}" AdvSceneSwitcher.condition.source.entry.line2="{{settings}}" AdvSceneSwitcher.condition.source.entry.line3="{{regex}}{{getSettings}}" AdvSceneSwitcher.condition.virtualCamera="Virtual camera" diff --git a/plugins/base/macro-condition-source.cpp b/plugins/base/macro-condition-source.cpp index ae08ed30..8ef87601 100644 --- a/plugins/base/macro-condition-source.cpp +++ b/plugins/base/macro-condition-source.cpp @@ -14,8 +14,8 @@ bool MacroConditionSource::_registered = MacroConditionFactory::Register( {MacroConditionSource::Create, MacroConditionSourceEdit::Create, "AdvSceneSwitcher.condition.source"}); -const static std::map - sourceCnditionTypes = { +static const std::map + sourceConditionTypes = { {MacroConditionSource::Condition::ACTIVE, "AdvSceneSwitcher.condition.source.type.active"}, {MacroConditionSource::Condition::SHOWING, @@ -28,8 +28,38 @@ const static std::map "AdvSceneSwitcher.condition.source.type.individualSettingMatches"}, {MacroConditionSource::Condition::INDIVIDUAL_SETTING_CHANGED, "AdvSceneSwitcher.condition.source.type.individualSettingChanged"}, + {MacroConditionSource::Condition::HEIGHT, + "AdvSceneSwitcher.condition.source.type.height"}, + {MacroConditionSource::Condition::WIDTH, + "AdvSceneSwitcher.condition.source.type.width"}, }; +static const std::map + compareMethods = { + {MacroConditionSource::SizeComparision::LESS, + "AdvSceneSwitcher.condition.source.sizeCompare.less"}, + {MacroConditionSource::SizeComparision::EQUAL, + "AdvSceneSwitcher.condition.source.sizeCompare.equal"}, + {MacroConditionSource::SizeComparision::MORE, + "AdvSceneSwitcher.condition.source.sizeCompare.more"}, +}; + +static bool compareSourceSize(MacroConditionSource::SizeComparision method, + int sourceValue, int compareValue) +{ + switch (method) { + case MacroConditionSource::SizeComparision::LESS: + return sourceValue < compareValue; + case MacroConditionSource::SizeComparision::EQUAL: + return sourceValue == compareValue; + case MacroConditionSource::SizeComparision::MORE: + return sourceValue > compareValue; + default: + break; + } + return false; +} + bool MacroConditionSource::CheckCondition() { if (!_source.GetSource()) { @@ -84,6 +114,14 @@ bool MacroConditionSource::CheckCondition() SetVariableValue(*value); break; } + case Condition::HEIGHT: + ret = compareSourceSize(_comparision, obs_source_get_height(s), + _size); + break; + case Condition::WIDTH: + ret = compareSourceSize(_comparision, obs_source_get_width(s), + _size); + break; default: break; } @@ -103,6 +141,9 @@ bool MacroConditionSource::Save(obs_data_t *obj) const _settings.Save(obj, "settings"); _regex.Save(obj); _setting.Save(obj); + _size.Save(obj, "size"); + obs_data_set_int(obj, "sizeComparisionMethod", + static_cast(_comparision)); return true; } @@ -119,6 +160,9 @@ bool MacroConditionSource::Load(obs_data_t *obj) obs_data_get_bool(obj, "regex")); } _setting.Load(obj); + _size.Load(obj, "size"); + _comparision = static_cast( + obs_data_get_int(obj, "sizeComparisionMethod")); return true; } @@ -127,9 +171,11 @@ std::string MacroConditionSource::GetShortDesc() const return _source.ToString(); } -static inline void populateConditionSelection(QComboBox *list) +template +static inline void populateSelection(QComboBox *list, + const std::map &map) { - for (const auto &[_, name] : sourceCnditionTypes) { + for (const auto &[_, name] : map) { list->addItem(obs_module_text(name.c_str())); } } @@ -144,10 +190,13 @@ MacroConditionSourceEdit::MacroConditionSourceEdit( _settings(new VariableTextEdit(this)), _regex(new RegexConfigWidget(parent)), _settingSelection(new SourceSettingSelection()), - _refreshSettingSelection(new QPushButton( - obs_module_text("AdvSceneSwitcher.condition.source.refresh"))) + _refreshSettingSelection(new QPushButton(obs_module_text( + "AdvSceneSwitcher.condition.source.refresh"))), + _size(new VariableSpinBox(this)), + _sizeCompareMethods(new QComboBox()) { - populateConditionSelection(_conditions); + populateSelection(_conditions, sourceConditionTypes); + populateSelection(_sizeCompareMethods, compareMethods); auto sources = GetSourceNames(); sources.sort(); auto scenes = GetSceneNames(); @@ -155,6 +204,7 @@ MacroConditionSourceEdit::MacroConditionSourceEdit( _sources->SetSourceNameList(sources + scenes); _refreshSettingSelection->setToolTip(obs_module_text( "AdvSceneSwitcher.condition.source.refreshTooltip")); + _size->setMaximum(999999); QWidget::connect(_sources, SIGNAL(SourceChanged(const SourceSelection &)), this, @@ -173,31 +223,36 @@ MacroConditionSourceEdit::MacroConditionSourceEdit( SLOT(SettingSelectionChanged(const SourceSetting &))); QWidget::connect(_refreshSettingSelection, SIGNAL(clicked()), this, SLOT(RefreshVariableSourceSelectionValue())); - - std::unordered_map widgetPlaceholders = { - {"{{sources}}", _sources}, - {"{{conditions}}", _conditions}, - {"{{settings}}", _settings}, - {"{{getSettings}}", _getSettings}, - {"{{regex}}", _regex}, - {"{{settingSelection}}", _settingSelection}, - {"{{refresh}}", _refreshSettingSelection}}; + QWidget::connect( + _size, + SIGNAL(NumberVariableChanged(const NumberVariable &)), + this, SLOT(SizeChanged(const NumberVariable &))); + QWidget::connect(_sizeCompareMethods, SIGNAL(currentIndexChanged(int)), + this, SLOT(CompareMethodChanged(int))); auto line1Layout = new QHBoxLayout; line1Layout->setContentsMargins(0, 0, 0, 0); PlaceWidgets(obs_module_text( "AdvSceneSwitcher.condition.source.entry.line1"), - line1Layout, widgetPlaceholders); + line1Layout, + {{"{{sources}}", _sources}, + {"{{conditions}}", _conditions}, + {"{{settingSelection}}", _settingSelection}, + {"{{refresh}}", _refreshSettingSelection}, + {"{{size}}", _size}, + {"{{sizeCompareMethods}}", _sizeCompareMethods}}); auto line2Layout = new QHBoxLayout; line2Layout->setContentsMargins(0, 0, 0, 0); PlaceWidgets(obs_module_text( "AdvSceneSwitcher.condition.source.entry.line2"), - line2Layout, widgetPlaceholders, false); + line2Layout, {{"{{settings}}", _settings}}, false); auto line3Layout = new QHBoxLayout; line3Layout->setContentsMargins(0, 0, 0, 0); PlaceWidgets(obs_module_text( "AdvSceneSwitcher.condition.source.entry.line3"), - line3Layout, widgetPlaceholders); + line3Layout, + {{"{{getSettings}}", _getSettings}, {"{{regex}}", _regex}}, + true); auto mainLayout = new QVBoxLayout; mainLayout->addLayout(line1Layout); mainLayout->addLayout(line2Layout); @@ -303,6 +358,27 @@ void MacroConditionSourceEdit::RefreshVariableSourceSelectionValue() _settingSelection->SetSource(_entryData->_source.GetSource()); } +void MacroConditionSourceEdit::SizeChanged(const NumberVariable &value) +{ + if (_loading || !_entryData) { + return; + } + + auto lock = LockContext(); + _entryData->_size = value; +} + +void MacroConditionSourceEdit::CompareMethodChanged(int index) +{ + if (_loading || !_entryData) { + return; + } + + auto lock = LockContext(); + _entryData->_comparision = + static_cast(index); +} + void MacroConditionSourceEdit::SetWidgetVisibility() { const bool settingsMatch = @@ -334,6 +410,14 @@ void MacroConditionSourceEdit::SetWidgetVisibility() _entryData->_source.GetType() == SourceSelection::Type::VARIABLE); + const bool isSizeCheck = + _entryData->_condition == + MacroConditionSource::Condition::WIDTH || + _entryData->_condition == + MacroConditionSource::Condition::HEIGHT; + _size->setVisible(isSizeCheck); + _sizeCompareMethods->setVisible(isSizeCheck); + adjustSize(); updateGeometry(); } @@ -350,6 +434,9 @@ void MacroConditionSourceEdit::UpdateEntryData() _regex->SetRegexConfig(_entryData->_regex); _settingSelection->SetSource(_entryData->_source.GetSource()); _settingSelection->SetSetting(_entryData->_setting); + _size->SetValue(_entryData->_size); + _sizeCompareMethods->setCurrentIndex( + static_cast(_entryData->_comparision)); SetWidgetVisibility(); } diff --git a/plugins/base/macro-condition-source.hpp b/plugins/base/macro-condition-source.hpp index eb1e642e..2f442f78 100644 --- a/plugins/base/macro-condition-source.hpp +++ b/plugins/base/macro-condition-source.hpp @@ -31,13 +31,19 @@ public: SETTINGS_CHANGED, INDIVIDUAL_SETTING_MATCH, INDIVIDUAL_SETTING_CHANGED, + HEIGHT, + WIDTH, }; + enum class SizeComparision { LESS, EQUAL, MORE }; + SourceSelection _source; Condition _condition = Condition::ACTIVE; StringVariable _settings = ""; SourceSetting _setting; RegexConfig _regex; + IntVariable _size; + SizeComparision _comparision = SizeComparision::EQUAL; private: std::string _currentSettings; @@ -71,6 +77,8 @@ private slots: void RegexChanged(const RegexConfig &); void SettingSelectionChanged(const SourceSetting &); void RefreshVariableSourceSelectionValue(); + void SizeChanged(const NumberVariable &value); + void CompareMethodChanged(int); signals: void HeaderInfoChanged(const QString &); @@ -82,6 +90,8 @@ protected: RegexConfigWidget *_regex; SourceSettingSelection *_settingSelection; QPushButton *_refreshSettingSelection; + VariableSpinBox *_size; + QComboBox *_sizeCompareMethods; std::shared_ptr _entryData;