From ae8d0bf5cb544c3519e08e1eb2018dad72cee872 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Sat, 4 Nov 2023 23:34:00 +0100 Subject: [PATCH] Add support for setting variable to value of temporary variable --- data/locale/de-DE.ini | 2 +- data/locale/en-US.ini | 3 +- data/locale/zh-CN.ini | 2 +- src/macro-core/macro-action-variable.cpp | 43 +++++++++++++++++++++--- src/macro-core/macro-action-variable.hpp | 4 +++ 5 files changed, 47 insertions(+), 7 deletions(-) diff --git a/data/locale/de-DE.ini b/data/locale/de-DE.ini index 5c8299a4..d4931024 100644 --- a/data/locale/de-DE.ini +++ b/data/locale/de-DE.ini @@ -576,7 +576,7 @@ AdvSceneSwitcher.action.variable.invalidSelection="Ungültige Auswahl!" AdvSceneSwitcher.action.variable.actionNoVariableSupport="Das Abrufen von Variablenwerten aus %1 Aktionen wird nicht unterstützt!" AdvSceneSwitcher.action.variable.conditionNoVariableSupport="Das Abrufen von Variablenwerten aus %1 Bedingungen wird nicht unterstützt!" AdvSceneSwitcher.action.variable.currentSegmentValue="Aktueller Wert:" -AdvSceneSwitcher.action.variable.entry="{{actions}}{{variables}}{{variables2}}{{strValue}}{{numValue}}{{segmentIndex}}{{mathExpression}}{{envVariableName}}{{scenes}}" +AdvSceneSwitcher.action.variable.entry="{{actions}}{{variables}}{{variables2}}{{strValue}}{{numValue}}{{segmentIndex}}{{mathExpression}}{{envVariableName}}{{scenes}}{{tempVars}}" ; Transition Tab diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index bce45fd6..8196636e 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -803,6 +803,7 @@ AdvSceneSwitcher.action.variable.type.environmentVariable="Set to environment va AdvSceneSwitcher.action.variable.type.sceneItemCount="Set to scene item count of scene" AdvSceneSwitcher.action.variable.type.stringLength="Set to length of string" AdvSceneSwitcher.action.variable.type.extractJson="Extract json field with name" +AdvSceneSwitcher.action.variable.type.setToTempvar="Set to macro property" AdvSceneSwitcher.action.variable.askForValuePromptDefault="Assign value to variable \"%1\":" AdvSceneSwitcher.action.variable.askForValuePrompt="Assign value to variable:" AdvSceneSwitcher.action.variable.mathExpression.example="( 1 + 2 * 3 ) / 4" @@ -814,7 +815,7 @@ AdvSceneSwitcher.action.variable.invalidSelection="Invalid selection!" AdvSceneSwitcher.action.variable.actionNoVariableSupport="Getting variable values from %1 actions is not supported!" AdvSceneSwitcher.action.variable.conditionNoVariableSupport="Getting variable values from %1 conditions is not supported!" AdvSceneSwitcher.action.variable.currentSegmentValue="Current value:" -AdvSceneSwitcher.action.variable.entry="{{actions}}{{variables}}{{variables2}}{{strValue}}{{numValue}}{{segmentIndex}}{{mathExpression}}{{envVariableName}}{{scenes}}" +AdvSceneSwitcher.action.variable.entry="{{actions}}{{variables}}{{variables2}}{{strValue}}{{numValue}}{{segmentIndex}}{{mathExpression}}{{envVariableName}}{{scenes}}{{tempVars}}" AdvSceneSwitcher.action.variable.entry.substringIndex="Substring start:{{subStringStart}}Substring size:{{subStringSize}}" AdvSceneSwitcher.action.variable.entry.substringRegex="Assign value of{{regexMatchIdx}}match using regular expression:" AdvSceneSwitcher.action.variable.entry.findAndReplace="{{findStr}}{{replaceStr}}" diff --git a/data/locale/zh-CN.ini b/data/locale/zh-CN.ini index 92b85adc..7f934670 100644 --- a/data/locale/zh-CN.ini +++ b/data/locale/zh-CN.ini @@ -653,7 +653,7 @@ AdvSceneSwitcher.action.variable.invalidSelection="无效选择!" AdvSceneSwitcher.action.variable.actionNoVariableSupport="不支持从 %1 个操作获取变量值!" AdvSceneSwitcher.action.variable.conditionNoVariableSupport="不支持从 %1 条件中获取变量值!" AdvSceneSwitcher.action.variable.currentSegmentValue="当前值:" -AdvSceneSwitcher.action.variable.entry="{{actions}}{{variables}}{{variables2}}{{strValue}}{{numValue}}{{segmentIndex}}{{mathExpression}}{{envVariableName}}{{scenes}}" +AdvSceneSwitcher.action.variable.entry="{{actions}}{{variables}}{{variables2}}{{strValue}}{{numValue}}{{segmentIndex}}{{mathExpression}}{{envVariableName}}{{scenes}}{{tempVars}}" AdvSceneSwitcher.action.variable.entry.substringIndex="子字符串开始:{{subStringStart}} 子字符串大小:{{subStringSize}}" AdvSceneSwitcher.action.variable.entry.substringRegex="使用正则表达式为 {{regexMatchIdx}} 匹配的值:" AdvSceneSwitcher.action.variable.entry.findAndReplace="{{findStr}}{{replaceStr}}" diff --git a/src/macro-core/macro-action-variable.cpp b/src/macro-core/macro-action-variable.cpp index bda508fe..4e067502 100644 --- a/src/macro-core/macro-action-variable.cpp +++ b/src/macro-core/macro-action-variable.cpp @@ -49,6 +49,8 @@ const static std::map actionTypes = { "AdvSceneSwitcher.action.variable.type.stringLength"}, {MacroActionVariable::Type::EXTRACT_JSON, "AdvSceneSwitcher.action.variable.type.extractJson"}, + {MacroActionVariable::Type::SET_TO_TEMPVAR, + "AdvSceneSwitcher.action.variable.type.setToTempvar"}, }; static void apppend(Variable &var, const std::string &value) @@ -254,6 +256,18 @@ bool MacroActionVariable::PerformAction() var->SetValue(*value); return true; } + case Type::SET_TO_TEMPVAR: { + auto tempVar = _tempVar.GetTempVariable(GetMacro()); + if (!tempVar) { + return true; + } + auto value = tempVar->Value(); + if (!value) { + return true; + } + var->SetValue(*value); + return true; + } } return true; @@ -284,6 +298,7 @@ bool MacroActionVariable::Save(obs_data_t *obj) const _inputPlaceholder.Save(obj, "inputPlaceholder"); _envVariableName.Save(obj, "environmentVariableName"); _scene.Save(obj); + _tempVar.Save(obj); return true; } @@ -312,6 +327,7 @@ bool MacroActionVariable::Load(obs_data_t *obj) _inputPlaceholder.Load(obj, "inputPlaceholder"); _envVariableName.Load(obj, "environmentVariableName"); _scene.Load(obj); + _tempVar.Load(obj, GetMacro()); return true; } @@ -354,7 +370,7 @@ void MacroActionVariable::SetSegmentIndexValue(int value) _macroSegment = segment; if (segment) { - segment->IncrementVariableRef(); + IncrementVariableRef(segment.get()); } } @@ -396,7 +412,7 @@ void MacroActionVariable::DecrementCurrentSegmentVariableRef() return; } - segment->DecrementVariableRef(); + DecrementVariableRef(segment.get()); } static inline void populateTypeSelection(QComboBox *list) @@ -439,7 +455,9 @@ MacroActionVariableEdit::MacroActionVariableEdit( _useInputPlaceholder(new QCheckBox()), _inputPlaceholder(new VariableLineEdit(this)), _envVariable(new VariableLineEdit(this)), - _scenes(new SceneSelectionWidget(this, true, false, true, true, true)) + _scenes(new SceneSelectionWidget(this, true, false, true, true, + true)), + _tempVars(new TempVariableSelection(this)) { _numValue->setMinimum(-9999999999); _numValue->setMaximum(9999999999); @@ -502,6 +520,9 @@ MacroActionVariableEdit::MacroActionVariableEdit( SLOT(EnvVariableChanged())); QWidget::connect(_scenes, SIGNAL(SceneChanged(const SceneSelection &)), this, SLOT(SceneChanged(const SceneSelection &))); + QWidget::connect(_tempVars, + SIGNAL(SelectionChanged(const TempVariableRef &)), + this, SLOT(SelectionChanged(const TempVariableRef &))); std::unordered_map widgetPlaceholders = { {"{{variables}}", _variables}, @@ -522,6 +543,7 @@ MacroActionVariableEdit::MacroActionVariableEdit( {"{{inputPlaceholder}}", _inputPlaceholder}, {"{{envVariableName}}", _envVariable}, {"{{scenes}}", _scenes}, + {"{{tempVars}}", _tempVars}, }; auto entryLayout = new QHBoxLayout; PlaceWidgets(obs_module_text("AdvSceneSwitcher.action.variable.entry"), @@ -616,6 +638,7 @@ void MacroActionVariableEdit::UpdateEntryData() _inputPlaceholder->setText(_entryData->_inputPlaceholder); _envVariable->setText(_entryData->_envVariableName); _scenes->SetScene(_entryData->_scene); + _tempVars->SetVariable(_entryData->_tempVar); SetWidgetVisibility(); } @@ -744,7 +767,7 @@ void MacroActionVariableEdit::UpdateSegmentVariableValue() return; } - if (!segment->SupportsVariableValue()) { + if (!SupportsVariableValue(segment.get())) { std::string type; QString fmt; @@ -950,6 +973,16 @@ void MacroActionVariableEdit::SceneChanged(const SceneSelection &scene) _entryData->_scene = scene; } +void MacroActionVariableEdit::SelectionChanged(const TempVariableRef &var) +{ + if (_loading || !_entryData) { + return; + } + + auto lock = LockContext(); + _entryData->_tempVar = var; +} + void MacroActionVariableEdit::SetWidgetVisibility() { if (!_entryData) { @@ -1028,6 +1061,8 @@ void MacroActionVariableEdit::SetWidgetVisibility() MacroActionVariable::Type::ENV_VARIABLE); _scenes->setVisible(_entryData->_type == MacroActionVariable::Type::SCENE_ITEM_COUNT); + _tempVars->setVisible(_entryData->_type == + MacroActionVariable::Type::SET_TO_TEMPVAR); adjustSize(); updateGeometry(); } diff --git a/src/macro-core/macro-action-variable.hpp b/src/macro-core/macro-action-variable.hpp index 297c2de3..b194b610 100644 --- a/src/macro-core/macro-action-variable.hpp +++ b/src/macro-core/macro-action-variable.hpp @@ -43,6 +43,7 @@ public: SCENE_ITEM_COUNT, STRING_LENGTH, EXTRACT_JSON, + SET_TO_TEMPVAR, }; Type _type = Type::SET_FIXED_VALUE; @@ -73,6 +74,7 @@ public: StringVariable _envVariableName = "HOME"; #endif SceneSelection _scene; + TempVariableRef _tempVar; private: void DecrementCurrentSegmentVariableRef(); @@ -126,6 +128,7 @@ private slots: void InputPlaceholderChanged(); void EnvVariableChanged(); void SceneChanged(const SceneSelection &); + void SelectionChanged(const TempVariableRef &var); signals: void HeaderInfoChanged(const QString &); @@ -163,6 +166,7 @@ private: VariableLineEdit *_inputPlaceholder; VariableLineEdit *_envVariable; SceneSelectionWidget *_scenes; + TempVariableSelection *_tempVars; std::shared_ptr _entryData; QTimer _timer;