diff --git a/data/locale/de-DE.ini b/data/locale/de-DE.ini index a31c0867..3812d4a9 100644 --- a/data/locale/de-DE.ini +++ b/data/locale/de-DE.ini @@ -99,7 +99,6 @@ AdvSceneSwitcher.macroList.deleted="gelöscht" AdvSceneSwitcher.macroList.duplicate="\"%1\" ist bereits ausgewählt!" ; Macro Logic -AdvSceneSwitcher.logic.none="Eintrag ignorieren" AdvSceneSwitcher.logic.and="Und" AdvSceneSwitcher.logic.or="Oder" AdvSceneSwitcher.logic.andNot="Und nicht" diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 1c58b335..567161c2 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -306,7 +306,6 @@ AdvSceneSwitcher.macroList.deleted="deleted" AdvSceneSwitcher.macroList.duplicate="\"%1\" is alreay selected!" # Macro Logic -AdvSceneSwitcher.logic.none="Ignore entry" AdvSceneSwitcher.logic.and="And" AdvSceneSwitcher.logic.or="Or" AdvSceneSwitcher.logic.andNot="And not" diff --git a/data/locale/es-ES.ini b/data/locale/es-ES.ini index c1516c19..d7d7a49f 100644 --- a/data/locale/es-ES.ini +++ b/data/locale/es-ES.ini @@ -83,7 +83,6 @@ AdvSceneSwitcher.macroTab.highlightTrueConditions="Resaltar condiciones de la ma AdvSceneSwitcher.macroTab.highlightPerformedActions="Resaltar acciones realizadas recientemente de la macro seleccionada actualmente" ; Lógica de macros -AdvSceneSwitcher.logic.none="Omitir entrada" AdvSceneSwitcher.logic.and="Y" AdvSceneSwitcher.logic.or="O" AdvSceneSwitcher.logic.andNot="Y no" diff --git a/data/locale/fr-FR.ini b/data/locale/fr-FR.ini index 21173201..9973533b 100644 --- a/data/locale/fr-FR.ini +++ b/data/locale/fr-FR.ini @@ -131,7 +131,6 @@ AdvSceneSwitcher.macroList.deleted="supprimé" AdvSceneSwitcher.macroList.duplicate="\"%1\" est déjà sélectionné !" ; Macro Logic -AdvSceneSwitcher.logic.none="Ignorer l'entrée" AdvSceneSwitcher.logic.and="Et" AdvSceneSwitcher.logic.or="Ou" AdvSceneSwitcher.logic.andNot="Et pas" diff --git a/data/locale/ja-JP.ini b/data/locale/ja-JP.ini index 23444e06..5fc8c5eb 100644 --- a/data/locale/ja-JP.ini +++ b/data/locale/ja-JP.ini @@ -275,7 +275,6 @@ AdvSceneSwitcher.macroList.deleted="削除" AdvSceneSwitcher.macroList.duplicate="\"%1\" はすでに選択されています!" # Macro Logic -AdvSceneSwitcher.logic.none="入力無視" ; AdvSceneSwitcher.logic.and="And" ; AdvSceneSwitcher.logic.or="Or" ; AdvSceneSwitcher.logic.andNot="And not" diff --git a/data/locale/pt-BR.ini b/data/locale/pt-BR.ini index 38fe61b3..21476e55 100644 --- a/data/locale/pt-BR.ini +++ b/data/locale/pt-BR.ini @@ -239,7 +239,6 @@ AdvSceneSwitcher.macroList.deleted="excluída" AdvSceneSwitcher.macroList.duplicate="\"%1\" já está selecionada!" ; Macro Logic -AdvSceneSwitcher.logic.none="Ignorar entrada" AdvSceneSwitcher.logic.and="E" AdvSceneSwitcher.logic.or="Ou" AdvSceneSwitcher.logic.andNot="E não" diff --git a/data/locale/ru-RU.ini b/data/locale/ru-RU.ini index d1425056..18ace96f 100644 --- a/data/locale/ru-RU.ini +++ b/data/locale/ru-RU.ini @@ -70,7 +70,6 @@ AdvSceneSwitcher.macroTab.name="Имя:" AdvSceneSwitcher.macroTab.defaultname="Макрос %1" AdvSceneSwitcher.macroTab.copy="Создать копию" ; Macro Logic -AdvSceneSwitcher.logic.none="Игнорировать вход" AdvSceneSwitcher.logic.and="И" AdvSceneSwitcher.logic.or="Или" AdvSceneSwitcher.logic.andNot="И не" diff --git a/data/locale/tr-TR.ini b/data/locale/tr-TR.ini index 9d7a3743..fd1310ea 100644 --- a/data/locale/tr-TR.ini +++ b/data/locale/tr-TR.ini @@ -78,7 +78,6 @@ AdvSceneSwitcher.macroTab.expandAll="Hepsini Genişlet" AdvSceneSwitcher.macroTab.collapseAll="Hepsini Küçült" ; Macro Logic -AdvSceneSwitcher.logic.none="Girişi yoksay" AdvSceneSwitcher.logic.and="Ve" AdvSceneSwitcher.logic.or="Ya da" AdvSceneSwitcher.logic.andNot="ve değil" diff --git a/data/locale/zh-CN.ini b/data/locale/zh-CN.ini index ee2b7183..83fc970c 100644 --- a/data/locale/zh-CN.ini +++ b/data/locale/zh-CN.ini @@ -259,7 +259,6 @@ AdvSceneSwitcher.macroList.deleted="删除" AdvSceneSwitcher.macroList.duplicate="\"%1\" 已选择!" ; Macro Logic -AdvSceneSwitcher.logic.none="忽略条件" AdvSceneSwitcher.logic.and="且" AdvSceneSwitcher.logic.or="或" AdvSceneSwitcher.logic.andNot="且不" diff --git a/lib/macro/macro-condition-edit.cpp b/lib/macro/macro-condition-edit.cpp index 85edcf62..fef70ad6 100644 --- a/lib/macro/macro-condition-edit.cpp +++ b/lib/macro/macro-condition-edit.cpp @@ -5,6 +5,7 @@ #include "path-helpers.hpp" #include "plugin-state-helpers.hpp" #include "section.hpp" +#include "switch-button.hpp" #include "ui-helpers.hpp" #include "utility.hpp" @@ -102,12 +103,15 @@ MacroConditionEdit::MacroConditionEdit( QWidget *parent, std::shared_ptr *entryData, bool isRootCondition) : MacroSegmentEdit(parent), + _enable(new SwitchButton()), _logicSelection(new QComboBox()), _conditionSelection(new FilterComboBox()), _dur(new DurationModifierEdit()), _entryData(entryData), _isRoot(isRootCondition) { + QWidget::connect(_enable, SIGNAL(checked(bool)), this, + SLOT(ConditionEnableChanged(bool))); QWidget::connect(_logicSelection, SIGNAL(currentIndexChanged(int)), this, SLOT(LogicSelectionChanged(int))); QWidget::connect(_conditionSelection, @@ -122,6 +126,7 @@ MacroConditionEdit::MacroConditionEdit( Logic::PopulateLogicTypeSelection(_logicSelection, isRootCondition); populateConditionSelection(_conditionSelection); + _section->AddHeaderWidget(_enable); _section->AddHeaderWidget(_logicSelection); _section->AddHeaderWidget(_conditionSelection); _section->AddHeaderWidget(_headerInfo); @@ -154,8 +159,17 @@ void MacroConditionEdit::LogicSelectionChanged(int idx) const auto logic = static_cast( _logicSelection->itemData(idx).toInt()); (*_entryData)->SetLogicType(logic); +} - SetEnableAppearance(logic != Logic::Type::NONE); +void MacroConditionEdit::ConditionEnableChanged(bool value) +{ + if (_loading || !_entryData) { + return; + } + + auto lock = LockContext(); + (*_entryData)->SetEnabled(value); + SetDisableEffect(!value); } bool MacroConditionEdit::IsRootNode() const @@ -168,7 +182,9 @@ void MacroConditionEdit::SetLogicSelection() const auto logic = (*_entryData)->GetLogicType(); _logicSelection->setCurrentIndex( _logicSelection->findData(static_cast(logic))); - SetEnableAppearance(logic != Logic::Type::NONE); + const bool enabled = (*_entryData)->Enabled(); + _enable->setChecked(enabled); + SetEnableAppearance(enabled); } void MacroConditionEdit::SetRootNode(bool root) @@ -239,10 +255,12 @@ void MacroConditionEdit::ConditionSelectionChanged(const QString &text) { auto lock = LockContext(); auto logic = (*_entryData)->GetLogicType(); + const bool enabled = (*_entryData)->Enabled(); _entryData->reset(); *_entryData = MacroConditionFactory::Create(id, macro); (*_entryData)->SetIndex(idx); (*_entryData)->SetLogicType(logic); + (*_entryData)->SetEnabled(enabled); (*_entryData)->PostLoad(); RunAndClearPostLoadSteps(); } diff --git a/lib/macro/macro-condition-edit.hpp b/lib/macro/macro-condition-edit.hpp index b3450518..7c50b885 100644 --- a/lib/macro/macro-condition-edit.hpp +++ b/lib/macro/macro-condition-edit.hpp @@ -8,6 +8,8 @@ namespace advss { +class SwitchButton; + class DurationModifierEdit : public QWidget { Q_OBJECT public: @@ -47,11 +49,13 @@ private slots: void ConditionSelectionChanged(const QString &text); void DurationChanged(const Duration &value); void DurationModifierChanged(DurationModifier::Type m); + void ConditionEnableChanged(bool); private: void SetLogicSelection(); std::shared_ptr Data() const; + SwitchButton *_enable; QComboBox *_logicSelection; FilterComboBox *_conditionSelection; DurationModifierEdit *_dur; diff --git a/lib/macro/macro-condition.cpp b/lib/macro/macro-condition.cpp index f855f405..dc26f9dc 100644 --- a/lib/macro/macro-condition.cpp +++ b/lib/macro/macro-condition.cpp @@ -31,6 +31,10 @@ bool MacroCondition::Load(obs_data_t *obj) { MacroSegment::Load(obj); _logic.Load(obj, "logic"); + if (_logic.GetType() == Logic::Type::NONE) { + SetEnabled(false); + _logic.SetType(Logic::Type::AND); + } _durationModifier.Load(obj); return true; } @@ -50,7 +54,8 @@ void MacroCondition::ValidateLogicSelection(bool isRootCondition, return; } - _logic.SetType(Logic::Type::NONE); + _logic.SetType(Logic::Type::AND); + SetEnabled(false); blog(LOG_WARNING, "setting invalid logic selection to 'ignore' for macro %s", context); diff --git a/lib/macro/macro-segment.cpp b/lib/macro/macro-segment.cpp index 2103bc6e..64d8d89a 100644 --- a/lib/macro/macro-segment.cpp +++ b/lib/macro/macro-segment.cpp @@ -80,7 +80,7 @@ bool MacroSegment::Save(obs_data_t *obj) const obs_data_set_bool(data, "useCustomLabel", _useCustomLabel); obs_data_set_string(data, "customLabel", _customLabel.c_str()); obs_data_set_bool(data, "enabled", _enabled); - obs_data_set_int(data, "version", 1); + obs_data_set_int(data, "version", 2); OBSDataArrayAutoRelease mappingsArray = obs_data_array_create(); for (const auto &mapping : _varMappings) { @@ -112,6 +112,12 @@ bool MacroSegment::Load(obs_data_t *obj) _enabled = obs_data_get_bool(obj, "enabled"); } + // Reset the previously unused "enabled" value for conditions to "true" + if (obs_data_get_int(data, "version") < 2 && + obs_data_has_user_value(obj, "logic")) { + _enabled = true; + } + _varMappings.clear(); OBSDataArrayAutoRelease mappingsArray = obs_data_get_array(data, "varMappings"); diff --git a/lib/macro/macro.cpp b/lib/macro/macro.cpp index 55e68c9b..2369b780 100644 --- a/lib/macro/macro.cpp +++ b/lib/macro/macro.cpp @@ -157,6 +157,15 @@ bool Macro::CheckConditionHelper( return conditionMatched; }; + if (!condition->Enabled()) { + vblog(LOG_INFO, "ignoring condition '%s' for '%s'", + condition->GetId().c_str(), _name.c_str()); + if (!_useShortCircuitEvaluation) { + (void)evaluateCondition(); + } + return _matched; + } + const auto logicType = condition->GetLogicType(); if (logicType == Logic::Type::NONE) { vblog(LOG_INFO, "ignoring condition '%s' for '%s'", diff --git a/lib/utils/condition-logic.cpp b/lib/utils/condition-logic.cpp index 67deac74..efa915da 100644 --- a/lib/utils/condition-logic.cpp +++ b/lib/utils/condition-logic.cpp @@ -8,7 +8,6 @@ namespace advss { const std::map Logic::localeMap = { - {Logic::Type::NONE, {"AdvSceneSwitcher.logic.none"}}, {Logic::Type::AND, {"AdvSceneSwitcher.logic.and"}}, {Logic::Type::OR, {"AdvSceneSwitcher.logic.or"}}, {Logic::Type::AND_NOT, {"AdvSceneSwitcher.logic.andNot"}}, @@ -67,7 +66,7 @@ void Logic::PopulateLogicTypeSelection(QComboBox *list, bool isRootCondition) return typeValue < rootOffset; }} : std::function{[](int typeValue) { - return typeValue >= rootOffset; + return typeValue > rootOffset; }}; for (const auto &[type, name] : localeMap) { const int typeValue = static_cast(type);