From e4961cb9568bbe2b620379345bbd863979d69b94 Mon Sep 17 00:00:00 2001 From: Seth Hillbrand Date: Wed, 5 Jan 2022 11:32:10 -0800 Subject: [PATCH] Update pin cache when undoing The pin cache is invalidated by swap, so we need to ensure that it is reset when we undo a change to the pins in schematic editor Fixes https://gitlab.com/kicad/code/kicad/issues/10272 (cherry picked from commit 7f1648934f77ae801a8a1546ca23df0004bcf96f) --- eeschema/schematic_undo_redo.cpp | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/eeschema/schematic_undo_redo.cpp b/eeschema/schematic_undo_redo.cpp index e445376381..bcb7a6fe9e 100644 --- a/eeschema/schematic_undo_redo.cpp +++ b/eeschema/schematic_undo_redo.cpp @@ -264,15 +264,16 @@ void SCH_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList ) { // 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). - for( int ii = aList->GetCount() - 1; ii >= 0; ii-- ) + // After hitting 0, subtracting 1 will roll the value over to its max representation + for( unsigned ii = aList->GetCount() - 1; ii < std::numeric_limits::max(); ii-- ) { - UNDO_REDO status = aList->GetPickedItemStatus( (unsigned) ii ); - EDA_ITEM* eda_item = aList->GetPickedItem( (unsigned) ii ); - SCH_SCREEN* screen = dynamic_cast( aList->GetScreenForItem( (unsigned) ii ) ); + UNDO_REDO status = aList->GetPickedItemStatus( ii ); + EDA_ITEM* eda_item = aList->GetPickedItem( ii ); + SCH_SCREEN* screen = dynamic_cast( aList->GetScreenForItem( ii ) ); wxCHECK( screen, /* void */ ); - eda_item->SetFlags( aList->GetPickerFlags( (unsigned) ii ) ); + eda_item->SetFlags( aList->GetPickerFlags( ii ) ); eda_item->ClearEditFlags(); eda_item->ClearTempFlags(); @@ -284,13 +285,13 @@ void SCH_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList ) { // new items are deleted on undo RemoveFromScreen( eda_item, screen ); - aList->SetPickedItemStatus( UNDO_REDO::DELETED, (unsigned) ii ); + aList->SetPickedItemStatus( UNDO_REDO::DELETED, ii ); } else if( status == UNDO_REDO::DELETED ) { // deleted items are re-inserted on undo AddToScreen( eda_item, screen ); - aList->SetPickedItemStatus( UNDO_REDO::NEWITEM, (unsigned) ii ); + aList->SetPickedItemStatus( UNDO_REDO::NEWITEM, ii ); } else if( status == UNDO_REDO::PAGESETTINGS ) { @@ -303,11 +304,10 @@ void SCH_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList ) item->Restore( this ); *item = alt_item; } - else if( dynamic_cast( eda_item ) ) + else if( SCH_ITEM* item = dynamic_cast( eda_item ) ) { // everything else is modified in place - SCH_ITEM* item = (SCH_ITEM*) eda_item; - SCH_ITEM* alt_item = (SCH_ITEM*) aList->GetPickedItemLink( (unsigned) ii ); + SCH_ITEM* alt_item = static_cast( aList->GetPickedItemLink( ii ) ); // The root sheet is a pseudo object that owns the root screen object but is not on // the root screen so do not attempt to remove it from the screen it owns. @@ -321,17 +321,23 @@ void SCH_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList ) break; case UNDO_REDO::EXCHANGE_T: - aList->SetPickedItem( alt_item, (unsigned) ii ); - aList->SetPickedItemLink( item, (unsigned) ii ); + aList->SetPickedItem( alt_item, ii ); + aList->SetPickedItemLink( item, ii ); item = alt_item; break; default: wxFAIL_MSG( wxString::Format( wxT( "Unknown undo/redo command %d" ), - aList->GetPickedItemStatus( (unsigned) ii ) ) ); + aList->GetPickedItemStatus( ii ) ) ); break; } + if( item->Type() == SCH_SYMBOL_T ) + { + SCH_SYMBOL* sym = static_cast( item ); + sym->UpdatePins(); + } + if( item != &Schematic().Root() ) AddToScreen( item, screen ); }