Handle undo of a Repeat Draw Item.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/18261
This commit is contained in:
Jeff Young 2024-06-23 23:37:54 +01:00
parent 0b4d0bcb6c
commit 968ef0082d
2 changed files with 26 additions and 3 deletions

View File

@ -200,7 +200,18 @@ void SCH_EDIT_FRAME::SaveCopyInUndoList( const PICKED_ITEMS_LIST& aItemsList,
// Copy picker list:
if( !commandToUndo->GetCount() )
{
commandToUndo->CopyList( aItemsList );
for( const std::unique_ptr<SCH_ITEM>& item : GetRepeatItems() )
{
EDA_ITEM* repeatItemClone = item->Clone();
repeatItemClone->SetFlags( UR_TRANSIENT );
ITEM_PICKER repeatItemPicker( nullptr, repeatItemClone, UNDO_REDO::REPEAT_ITEM );
commandToUndo->PushItem( repeatItemPicker );
}
}
else
{
// Unless we are appending, in which case, get the picker items
@ -242,6 +253,7 @@ void SCH_EDIT_FRAME::SaveCopyInUndoList( const PICKED_ITEMS_LIST& aItemsList,
case UNDO_REDO::NEWITEM:
case UNDO_REDO::DELETED:
case UNDO_REDO::PAGESETTINGS:
case UNDO_REDO::REPEAT_ITEM:
break;
default:
@ -275,6 +287,7 @@ void SCH_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList )
bool rebuildHierarchyNavigator = false;
SCH_CLEANUP_FLAGS connectivityCleanUp = NO_CLEANUP;
SCH_SHEET_LIST sheets;
bool clearedRepeatItems = false;
// 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).
@ -285,8 +298,6 @@ void SCH_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList )
EDA_ITEM* eda_item = aList->GetPickedItem( ii );
SCH_SCREEN* screen = dynamic_cast<SCH_SCREEN*>( aList->GetScreenForItem( ii ) );
wxCHECK( screen, /* void */ );
eda_item->SetFlags( aList->GetPickerFlags( ii ) );
eda_item->ClearEditFlags();
eda_item->ClearTempFlags();
@ -390,6 +401,17 @@ void SCH_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList )
item->Restore( this );
*item = std::move( alt_item );
}
else if( status == UNDO_REDO::REPEAT_ITEM )
{
if( !clearedRepeatItems )
{
ClearRepeatItemsList();
clearedRepeatItems = true;
}
if( schItem )
AddCopyForRepeatItem( schItem );
}
else if( schItem )
{
SCH_ITEM* itemCopy = dynamic_cast<SCH_ITEM*>( aList->GetPickedItemLink( ii ) );

View File

@ -70,7 +70,8 @@ enum class UNDO_REDO {
PAGESETTINGS, // page settings or title block changes
REGROUP, // new group of items created (NB: can't use GROUP because of collision
// with a header on msys2)
UNGROUP // existing group destroyed (items not destroyed)
UNGROUP, // existing group destroyed (items not destroyed)
REPEAT_ITEM // storage entry for the editor's global repeatItems list
};