From 680f72e4f930e6079a46c5e938d04d520f31cd3d Mon Sep 17 00:00:00 2001 From: WarmUpTill <19472752+WarmUpTill@users.noreply.github.com> Date: Wed, 20 May 2026 21:09:09 +0200 Subject: [PATCH] Rework temp var mapping handling on copy of macro segments --- lib/macro/macro-edit.cpp | 9 +++++++++ lib/macro/macro-segment-copy-paste.cpp | 10 +++------- lib/macro/macro-segment.cpp | 8 ++++---- lib/macro/macro-segment.hpp | 2 +- lib/utils/temp-variable.hpp | 2 +- 5 files changed, 18 insertions(+), 13 deletions(-) diff --git a/lib/macro/macro-edit.cpp b/lib/macro/macro-edit.cpp index f8b09ce2..39ebaa0a 100644 --- a/lib/macro/macro-edit.cpp +++ b/lib/macro/macro-edit.cpp @@ -1118,6 +1118,9 @@ void MacroEdit::AddMacroAction(int idx) macro->Actions().at(idx - 1)->Save(data); } AddMacroAction(macro.get(), idx, id, data); + if (idx < (int)macro->Actions().size()) { + macro->Actions().at(idx)->FixupVarMappingRefs(); + } } void MacroEdit::on_actionAdd_clicked() @@ -1426,6 +1429,9 @@ void MacroEdit::AddMacroElseAction(int idx) macro->ElseActions().at(idx - 1)->Save(data); } AddMacroElseAction(macro.get(), idx, id, data); + if (idx < (int)macro->ElseActions().size()) { + macro->ElseActions().at(idx)->FixupVarMappingRefs(); + } } void MacroEdit::RemoveMacroElseAction(int idx) @@ -1570,6 +1576,9 @@ void MacroEdit::AddMacroCondition(int idx) macro->Conditions().at(idx - 1)->Save(data); } AddMacroCondition(macro.get(), idx, id, data.Get(), logic); + if (idx < (int)macro->Conditions().size()) { + macro->Conditions().at(idx)->FixupVarMappingRefs(); + } } void MacroEdit::AddMacroCondition(Macro *macro, int idx, const std::string &id, diff --git a/lib/macro/macro-segment-copy-paste.cpp b/lib/macro/macro-segment-copy-paste.cpp index ccc6b215..031a278f 100644 --- a/lib/macro/macro-segment-copy-paste.cpp +++ b/lib/macro/macro-segment-copy-paste.cpp @@ -57,8 +57,6 @@ void MacroEdit::PasteMacroSegment() OBSDataAutoRelease data = obs_data_create(); copyInfo.segment->Save(data); - const MacroSegment *const original = copyInfo.segment.get(); - switch (copyInfo.type) { case MacroSegmentCopyInfo::Type::CONDITION: { const auto condition = std::static_pointer_cast( @@ -75,8 +73,7 @@ void MacroEdit::PasteMacroSegment() AddMacroCondition(macro.get(), macro->Conditions().size(), copyInfo.segment->GetId(), data.Get(), logic); if (!macro->Conditions().empty()) { - macro->Conditions().back()->FixupVarMappingRefs( - original); + macro->Conditions().back()->FixupVarMappingRefs(); } break; } @@ -84,15 +81,14 @@ void MacroEdit::PasteMacroSegment() AddMacroAction(macro.get(), macro->Actions().size(), copyInfo.segment->GetId(), data.Get()); if (!macro->Actions().empty()) { - macro->Actions().back()->FixupVarMappingRefs(original); + macro->Actions().back()->FixupVarMappingRefs(); } break; case MacroSegmentCopyInfo::Type::ELSE: AddMacroElseAction(macro.get(), macro->ElseActions().size(), copyInfo.segment->GetId(), data.Get()); if (!macro->ElseActions().empty()) { - macro->ElseActions().back()->FixupVarMappingRefs( - original); + macro->ElseActions().back()->FixupVarMappingRefs(); } break; default: diff --git a/lib/macro/macro-segment.cpp b/lib/macro/macro-segment.cpp index 1f819aee..6faa5641 100644 --- a/lib/macro/macro-segment.cpp +++ b/lib/macro/macro-segment.cpp @@ -57,20 +57,20 @@ void MacroSegment::SetVarMappings(const std::vector &mappings) IncrementTempVarInUseGeneration(); } -void MacroSegment::FixupVarMappingRefs(const MacroSegment *originalSegment) +void MacroSegment::FixupVarMappingRefs() { for (auto &mapping : _varMappings) { - auto refSeg = mapping.tempVar._segment.lock(); - if (refSeg.get() != originalSegment) { + if (!mapping.tempVar.HasValidID()) { continue; } for (const auto &var : _tempVariables) { - if (var.ID() == mapping.tempVar._id) { + if (var.ID() == mapping.tempVar.GetID()) { mapping.tempVar = var.GetRef(); break; } } } + NotifyUIAboutTempVarChange(this); } std::vector MacroSegment::GetOwnTempVars() const diff --git a/lib/macro/macro-segment.hpp b/lib/macro/macro-segment.hpp index fb9b2c64..22d5c7e0 100644 --- a/lib/macro/macro-segment.hpp +++ b/lib/macro/macro-segment.hpp @@ -57,7 +57,7 @@ public: const std::vector &GetVarMappings() const; void SetVarMappings(const std::vector &mappings); std::vector GetOwnTempVars() const; - void FixupVarMappingRefs(const MacroSegment *originalSegment); + void FixupVarMappingRefs(); protected: friend bool SupportsVariableValue(MacroSegment *); diff --git a/lib/utils/temp-variable.hpp b/lib/utils/temp-variable.hpp index cb4fc6c3..0f25dec7 100644 --- a/lib/utils/temp-variable.hpp +++ b/lib/utils/temp-variable.hpp @@ -74,6 +74,7 @@ public: EXPORT std::optional GetTempVariable(Macro *) const; EXPORT bool operator==(const TempVariableRef &other) const; bool HasValidID() const { return !_id.empty(); } + std::string GetID() const { return _id; } private: enum class SegmentType { NONE, CONDITION, ACTION, ELSEACTION }; @@ -87,7 +88,6 @@ private: friend TempVariable; friend TempVariableSelection; - friend MacroSegment; }; class ADVSS_EXPORT TempVariableSelection : public QWidget {