@@ -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
16331555DataTree::ValidatedTransaction::ValidatedTransaction (DataTree& tree, DataTreeSchema* schema, const String& description, UndoManager* undoManager)
0 commit comments