From 1bc0ceb5a52283afb4be4f60fd4fb0f45f4d4a6e Mon Sep 17 00:00:00 2001 From: Mike Williams Date: Wed, 9 Aug 2023 14:22:48 -0400 Subject: [PATCH] Undo/Redo: notify listeners of change events when undo/redoing --- eeschema/schematic_undo_redo.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/eeschema/schematic_undo_redo.cpp b/eeschema/schematic_undo_redo.cpp index 9ed8a551e2..0939a593e9 100644 --- a/eeschema/schematic_undo_redo.cpp +++ b/eeschema/schematic_undo_redo.cpp @@ -260,6 +260,10 @@ void SCH_EDIT_FRAME::SaveCopyInUndoList( const PICKED_ITEMS_LIST& aItemsList, void SCH_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList ) { + std::vector bulkAddedItems; + std::vector bulkRemovedItems; + std::vector bulkChangedItems; + // Undo in the reverse order of list creation: (this can allow stacked changes like the // same item can be changed and deleted in the same complex command). // After hitting 0, subtracting 1 will roll the value over to its max representation @@ -291,6 +295,8 @@ void SCH_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList ) RemoveFromScreen( eda_item, screen ); aList->SetPickedItemStatus( UNDO_REDO::DELETED, ii ); + + bulkRemovedItems.emplace_back( schItem ); } else if( status == UNDO_REDO::DELETED ) { @@ -302,6 +308,8 @@ void SCH_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList ) // deleted items are re-inserted on undo AddToScreen( eda_item, screen ); aList->SetPickedItemStatus( UNDO_REDO::NEWITEM, ii ); + + bulkAddedItems.emplace_back( schItem ); } else if( status == UNDO_REDO::PAGESETTINGS ) { @@ -336,6 +344,7 @@ void SCH_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList ) { case UNDO_REDO::CHANGED: item->SwapData( alt_item ); + bulkChangedItems.emplace_back( item ); // Special cases for items which have instance data if( item->GetParent() && item->GetParent()->Type() == SCH_SYMBOL_T @@ -349,6 +358,8 @@ void SCH_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList ) symbol->SetRef( m_schematic->GetSheets().FindSheetForScreen( screen ), field->GetText() ); } + + bulkChangedItems.emplace_back( symbol ); } break; @@ -371,6 +382,16 @@ void SCH_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList ) } GetCanvas()->GetView()->ClearHiddenFlags(); + + // Notify our listeners + if( bulkAddedItems.size() > 0 ) + Schematic().OnItemsAdded( bulkAddedItems ); + + if( bulkRemovedItems.size() > 0 ) + Schematic().OnItemsRemoved( bulkRemovedItems ); + + if( bulkChangedItems.size() > 0 ) + Schematic().OnItemsChanged( bulkChangedItems ); }