diff --git a/lib/macro/macro-segment-copy-paste.cpp b/lib/macro/macro-segment-copy-paste.cpp index e3eea81e..ccc6b215 100644 --- a/lib/macro/macro-segment-copy-paste.cpp +++ b/lib/macro/macro-segment-copy-paste.cpp @@ -57,6 +57,8 @@ 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( @@ -72,15 +74,26 @@ void MacroEdit::PasteMacroSegment() } AddMacroCondition(macro.get(), macro->Conditions().size(), copyInfo.segment->GetId(), data.Get(), logic); + if (!macro->Conditions().empty()) { + macro->Conditions().back()->FixupVarMappingRefs( + original); + } break; } case MacroSegmentCopyInfo::Type::ACTION: AddMacroAction(macro.get(), macro->Actions().size(), copyInfo.segment->GetId(), data.Get()); + if (!macro->Actions().empty()) { + macro->Actions().back()->FixupVarMappingRefs(original); + } 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); + } break; default: break; diff --git a/lib/macro/macro-segment.cpp b/lib/macro/macro-segment.cpp index 64d8d89a..e7f17bec 100644 --- a/lib/macro/macro-segment.cpp +++ b/lib/macro/macro-segment.cpp @@ -56,6 +56,22 @@ void MacroSegment::SetVarMappings(const std::vector &mappings) _varMappings = mappings; } +void MacroSegment::FixupVarMappingRefs(const MacroSegment *originalSegment) +{ + for (auto &mapping : _varMappings) { + auto refSeg = mapping.tempVar._segment.lock(); + if (refSeg.get() != originalSegment) { + continue; + } + for (const auto &var : _tempVariables) { + if (var.ID() == mapping.tempVar._id) { + mapping.tempVar = var.GetRef(); + break; + } + } + } +} + std::vector MacroSegment::GetOwnTempVars() const { return _tempVariables; diff --git a/lib/macro/macro-segment.hpp b/lib/macro/macro-segment.hpp index 64508951..fb9b2c64 100644 --- a/lib/macro/macro-segment.hpp +++ b/lib/macro/macro-segment.hpp @@ -57,6 +57,7 @@ public: const std::vector &GetVarMappings() const; void SetVarMappings(const std::vector &mappings); std::vector GetOwnTempVars() const; + void FixupVarMappingRefs(const MacroSegment *originalSegment); protected: friend bool SupportsVariableValue(MacroSegment *); diff --git a/lib/utils/temp-variable.hpp b/lib/utils/temp-variable.hpp index ab0cc54b..cb4fc6c3 100644 --- a/lib/utils/temp-variable.hpp +++ b/lib/utils/temp-variable.hpp @@ -87,6 +87,7 @@ private: friend TempVariable; friend TempVariableSelection; + friend MacroSegment; }; class ADVSS_EXPORT TempVariableSelection : public QWidget {