Skip to content

Commit 9991afe

Browse files
committed
Reduce code duplications
1 parent b8649b7 commit 9991afe

File tree

2 files changed

+43
-114
lines changed

2 files changed

+43
-114
lines changed

modules/yup_data_model/tree/yup_DataTree.cpp

Lines changed: 36 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -438,95 +438,8 @@ class TransactionAction : public UndoableAction
438438
child.object->parent = dataTree.object;
439439
}
440440

441-
// Apply property changes
442-
for (const auto& change : propertyChanges)
443-
{
444-
switch (change.type)
445-
{
446-
case DataTree::Transaction::PropertyChange::Set:
447-
dataTree.object->properties.set (change.name, change.newValue);
448-
dataTree.object->sendPropertyChangeMessage (change.name);
449-
break;
450-
451-
case DataTree::Transaction::PropertyChange::Remove:
452-
dataTree.object->properties.remove (change.name);
453-
dataTree.object->sendPropertyChangeMessage (change.name);
454-
break;
455-
456-
case DataTree::Transaction::PropertyChange::RemoveAll:
457-
{
458-
auto oldProperties = dataTree.object->properties;
459-
dataTree.object->properties.clear();
460-
for (int i = 0; i < oldProperties.size(); ++i)
461-
dataTree.object->sendPropertyChangeMessage (oldProperties.getName (i));
462-
}
463-
break;
464-
}
465-
}
466-
467-
// Apply child changes
468-
for (const auto& change : childChangeList)
469-
{
470-
switch (change.type)
471-
{
472-
case DataTree::Transaction::ChildChange::Add:
473-
{
474-
// Remove from previous parent if any
475-
if (auto oldParentObj = change.child.object->parent.lock())
476-
{
477-
DataTree oldParent (oldParentObj);
478-
oldParent.removeChild (change.child, nullptr);
479-
}
480-
481-
const int numChildren = static_cast<int> (dataTree.object->children.size());
482-
const int actualIndex = (change.newIndex < 0 || change.newIndex > numChildren) ? numChildren : change.newIndex;
483-
484-
dataTree.object->children.insert (dataTree.object->children.begin() + actualIndex, change.child);
485-
change.child.object->parent = dataTree.object;
486-
dataTree.object->sendChildAddedMessage (change.child);
487-
}
488-
break;
489-
490-
case DataTree::Transaction::ChildChange::Remove:
491-
{
492-
// Resolve child by index at redo time
493-
if (change.oldIndex >= 0 && change.oldIndex < static_cast<int> (dataTree.object->children.size()))
494-
{
495-
auto child = dataTree.object->children[static_cast<size_t> (change.oldIndex)];
496-
dataTree.object->children.erase (dataTree.object->children.begin() + change.oldIndex);
497-
child.object->parent.reset();
498-
dataTree.object->sendChildRemovedMessage (child, change.oldIndex);
499-
}
500-
}
501-
break;
502-
503-
case DataTree::Transaction::ChildChange::RemoveAll:
504-
{
505-
auto oldChildren = dataTree.object->children;
506-
dataTree.object->children.clear();
507-
for (size_t i = 0; i < oldChildren.size(); ++i)
508-
{
509-
oldChildren[i].object->parent.reset();
510-
dataTree.object->sendChildRemovedMessage (oldChildren[i], static_cast<int> (i));
511-
}
512-
}
513-
break;
514-
515-
case DataTree::Transaction::ChildChange::Move:
516-
{
517-
// Resolve child by current index at redo time
518-
const int numChildren = static_cast<int> (dataTree.object->children.size());
519-
if (change.oldIndex >= 0 && change.oldIndex < numChildren && change.newIndex >= 0 && change.newIndex < numChildren)
520-
{
521-
auto child = dataTree.object->children[static_cast<size_t> (change.oldIndex)];
522-
dataTree.object->children.erase (dataTree.object->children.begin() + change.oldIndex);
523-
dataTree.object->children.insert (dataTree.object->children.begin() + change.newIndex, child);
524-
dataTree.object->sendChildMovedMessage (child, change.oldIndex, change.newIndex);
525-
}
526-
}
527-
break;
528-
}
529-
}
441+
// Apply all changes using the shared implementation
442+
DataTree::Transaction::applyChangesToTree (dataTree, originalProperties, originalChildren, propertyChanges, childChangeList);
530443
}
531444

532445
DataTree dataTree;
@@ -1532,9 +1445,13 @@ void DataTree::Transaction::captureInitialState()
15321445
originalChildren = dataTree.object->children;
15331446
}
15341447

1535-
void DataTree::Transaction::applyChanges()
1448+
void DataTree::Transaction::applyChangesToTree (DataTree& tree,
1449+
const NamedValueSet& originalProperties,
1450+
const std::vector<DataTree>& originalChildren,
1451+
const std::vector<PropertyChange>& propertyChanges,
1452+
const std::vector<ChildChange>& childChanges)
15361453
{
1537-
if (dataTree.object == nullptr)
1454+
if (tree.object == nullptr)
15381455
return;
15391456

15401457
// Apply property changes directly
@@ -1543,21 +1460,21 @@ void DataTree::Transaction::applyChanges()
15431460
switch (change.type)
15441461
{
15451462
case PropertyChange::Set:
1546-
dataTree.object->properties.set (change.name, change.newValue);
1547-
dataTree.object->sendPropertyChangeMessage (change.name);
1463+
tree.object->properties.set (change.name, change.newValue);
1464+
tree.object->sendPropertyChangeMessage (change.name);
15481465
break;
15491466

15501467
case PropertyChange::Remove:
1551-
dataTree.object->properties.remove (change.name);
1552-
dataTree.object->sendPropertyChangeMessage (change.name);
1468+
tree.object->properties.remove (change.name);
1469+
tree.object->sendPropertyChangeMessage (change.name);
15531470
break;
15541471

15551472
case PropertyChange::RemoveAll:
15561473
{
1557-
auto oldProperties = dataTree.object->properties;
1558-
dataTree.object->properties.clear();
1474+
auto oldProperties = tree.object->properties;
1475+
tree.object->properties.clear();
15591476
for (int i = 0; i < oldProperties.size(); ++i)
1560-
dataTree.object->sendPropertyChangeMessage (oldProperties.getName (i));
1477+
tree.object->sendPropertyChangeMessage (oldProperties.getName (i));
15611478
}
15621479
break;
15631480
}
@@ -1577,57 +1494,62 @@ void DataTree::Transaction::applyChanges()
15771494
oldParent.removeChild (change.child, nullptr);
15781495
}
15791496

1580-
const int numChildren = static_cast<int> (dataTree.object->children.size());
1497+
const int numChildren = static_cast<int> (tree.object->children.size());
15811498
const int actualIndex = (change.newIndex < 0 || change.newIndex > numChildren) ? numChildren : change.newIndex;
15821499

1583-
dataTree.object->children.insert (dataTree.object->children.begin() + actualIndex, change.child);
1584-
change.child.object->parent = dataTree.object;
1585-
dataTree.object->sendChildAddedMessage (change.child);
1500+
tree.object->children.insert (tree.object->children.begin() + actualIndex, change.child);
1501+
change.child.object->parent = tree.object;
1502+
tree.object->sendChildAddedMessage (change.child);
15861503
}
15871504
break;
15881505

15891506
case ChildChange::Remove:
15901507
{
15911508
// Resolve child by index at commit time
1592-
if (change.oldIndex >= 0 && change.oldIndex < static_cast<int> (dataTree.object->children.size()))
1509+
if (change.oldIndex >= 0 && change.oldIndex < static_cast<int> (tree.object->children.size()))
15931510
{
1594-
auto child = dataTree.object->children[static_cast<size_t> (change.oldIndex)];
1595-
dataTree.object->children.erase (dataTree.object->children.begin() + change.oldIndex);
1511+
auto child = tree.object->children[static_cast<size_t> (change.oldIndex)];
1512+
tree.object->children.erase (tree.object->children.begin() + change.oldIndex);
15961513
child.object->parent.reset();
1597-
dataTree.object->sendChildRemovedMessage (child, change.oldIndex);
1514+
tree.object->sendChildRemovedMessage (child, change.oldIndex);
15981515
}
15991516
}
16001517
break;
16011518

16021519
case ChildChange::RemoveAll:
16031520
{
1604-
auto oldChildren = dataTree.object->children;
1605-
dataTree.object->children.clear();
1521+
auto oldChildren = tree.object->children;
1522+
tree.object->children.clear();
16061523
for (size_t i = 0; i < oldChildren.size(); ++i)
16071524
{
16081525
oldChildren[i].object->parent.reset();
1609-
dataTree.object->sendChildRemovedMessage (oldChildren[i], static_cast<int> (i));
1526+
tree.object->sendChildRemovedMessage (oldChildren[i], static_cast<int> (i));
16101527
}
16111528
}
16121529
break;
16131530

16141531
case ChildChange::Move:
16151532
{
16161533
// Resolve child by current index at commit time
1617-
const int numChildren = static_cast<int> (dataTree.object->children.size());
1534+
const int numChildren = static_cast<int> (tree.object->children.size());
16181535
if (change.oldIndex >= 0 && change.oldIndex < numChildren && change.newIndex >= 0 && change.newIndex < numChildren)
16191536
{
1620-
auto child = dataTree.object->children[static_cast<size_t> (change.oldIndex)];
1621-
dataTree.object->children.erase (dataTree.object->children.begin() + change.oldIndex);
1622-
dataTree.object->children.insert (dataTree.object->children.begin() + change.newIndex, child);
1623-
dataTree.object->sendChildMovedMessage (child, change.oldIndex, change.newIndex);
1537+
auto child = tree.object->children[static_cast<size_t> (change.oldIndex)];
1538+
tree.object->children.erase (tree.object->children.begin() + change.oldIndex);
1539+
tree.object->children.insert (tree.object->children.begin() + change.newIndex, child);
1540+
tree.object->sendChildMovedMessage (child, change.oldIndex, change.newIndex);
16241541
}
16251542
}
16261543
break;
16271544
}
16281545
}
16291546
}
16301547

1548+
void DataTree::Transaction::applyChanges()
1549+
{
1550+
applyChangesToTree (dataTree, originalProperties, originalChildren, propertyChanges, childChanges);
1551+
}
1552+
16311553
//==============================================================================
16321554

16331555
DataTree::ValidatedTransaction::ValidatedTransaction (DataTree& tree, DataTreeSchema* schema, const String& description, UndoManager* undoManager)

modules/yup_data_model/tree/yup_DataTree.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -966,6 +966,13 @@ class YUP_API DataTree
966966
void captureInitialState();
967967
void applyChanges();
968968
void rollbackChanges();
969+
970+
// Static helper for applying changes - used by both Transaction and TransactionAction
971+
static void applyChangesToTree (DataTree& tree,
972+
const NamedValueSet& originalProperties,
973+
const std::vector<DataTree>& originalChildren,
974+
const std::vector<PropertyChange>& propertyChanges,
975+
const std::vector<ChildChange>& childChanges);
969976

970977
DataTree& dataTree;
971978
UndoManager* undoManager;

0 commit comments

Comments
 (0)