Rework temp var mapping handling on copy of macro segments

This commit is contained in:
WarmUpTill 2026-05-20 21:09:09 +02:00
parent 930e8b38d4
commit 680f72e4f9
5 changed files with 18 additions and 13 deletions

View File

@ -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,

View File

@ -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<MacroCondition>(
@ -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:

View File

@ -57,20 +57,20 @@ void MacroSegment::SetVarMappings(const std::vector<VarMapping> &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<TempVariable> MacroSegment::GetOwnTempVars() const

View File

@ -57,7 +57,7 @@ public:
const std::vector<VarMapping> &GetVarMappings() const;
void SetVarMappings(const std::vector<VarMapping> &mappings);
std::vector<TempVariable> GetOwnTempVars() const;
void FixupVarMappingRefs(const MacroSegment *originalSegment);
void FixupVarMappingRefs();
protected:
friend bool SupportsVariableValue(MacroSegment *);

View File

@ -74,6 +74,7 @@ public:
EXPORT std::optional<const TempVariable> 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 {