diff --git a/eeschema/block.cpp b/eeschema/block.cpp index 2d2af403f7..f0a52f795c 100644 --- a/eeschema/block.cpp +++ b/eeschema/block.cpp @@ -272,7 +272,7 @@ bool SCH_EDIT_FRAME::HandleBlockEnd( wxDC* aDC ) if( block->GetCount() ) { - DeleteItemsInList( m_canvas, block->GetItems() ); + DeleteItemsInList( block->GetItems() ); OnModify(); } block->ClearItemsList(); @@ -303,7 +303,7 @@ bool SCH_EDIT_FRAME::HandleBlockEnd( wxDC* aDC ) wxPoint move_vector = -GetScreen()->m_BlockLocate.GetLastCursorPosition(); copyBlockItems( block->GetItems() ); MoveItemsInList( m_blockItems.GetItems(), move_vector ); - DeleteItemsInList( m_canvas, block->GetItems() ); + DeleteItemsInList( block->GetItems() ); OnModify(); } diff --git a/eeschema/operations_on_items_lists.cpp b/eeschema/operations_on_items_lists.cpp index a470c5d6f7..ad8313d387 100644 --- a/eeschema/operations_on_items_lists.cpp +++ b/eeschema/operations_on_items_lists.cpp @@ -115,10 +115,8 @@ void MoveItemsInList( PICKED_ITEMS_LIST& aItemsList, const wxPoint& aMoveVector } -void DeleteItemsInList( EDA_DRAW_PANEL* panel, PICKED_ITEMS_LIST& aItemsList ) +void SCH_EDIT_FRAME::DeleteItemsInList( PICKED_ITEMS_LIST& aItemsList, bool aAppend ) { - SCH_SCREEN* screen = (SCH_SCREEN*) panel->GetScreen(); - SCH_EDIT_FRAME* frame = (SCH_EDIT_FRAME*) panel->GetParent(); PICKED_ITEMS_LIST itemsList; for( unsigned ii = 0; ii < aItemsList.GetCount(); ii++ ) @@ -126,46 +124,64 @@ void DeleteItemsInList( EDA_DRAW_PANEL* panel, PICKED_ITEMS_LIST& aItemsList ) SCH_ITEM* item = (SCH_ITEM*) aItemsList.GetPickedItem( ii ); ITEM_PICKER itemWrapper( item, UR_DELETED ); - if( item->Type() == SCH_SHEET_PIN_T ) - { - /* this item is depending on a sheet, and is not in global list */ - wxMessageBox( wxT( "DeleteItemsInList() err: unexpected SCH_SHEET_PIN_T" ) ); - } - else - { - screen->Remove( item ); + if( item->GetFlags() & STRUCT_DELETED ) + continue; - /* Unlink the structure */ - itemsList.PushItem( itemWrapper ); - } + DeleteItem( item, aAppend ); + aAppend = true; } - frame->SaveCopyInUndoList( itemsList, UR_DELETED ); + GetScreen()->ClearDrawingState(); } -void SCH_EDIT_FRAME::DeleteItem( SCH_ITEM* aItem ) +void SCH_EDIT_FRAME::DeleteItem( SCH_ITEM* aItem, bool aAppend ) { wxCHECK_RET( aItem != NULL, wxT( "Cannot delete invalid item." ) ); + wxCHECK_RET( !( aItem->GetFlags() & STRUCT_DELETED ), + wxT( "Cannot delete item that is already deleted." ) ); // Here, aItem is not null. - SCH_SCREEN* screen = GetScreen(); if( aItem->Type() == SCH_SHEET_PIN_T ) { - // This iten is attached to a node, and is not accessible by the global list directly. + // This item is attached to a node, and is not accessible by the global list directly. SCH_SHEET* sheet = (SCH_SHEET*) aItem->GetParent(); wxCHECK_RET( (sheet != NULL) && (sheet->Type() == SCH_SHEET_T), wxT( "Sheet label has invalid parent item." ) ); - SaveCopyInUndoList( (SCH_ITEM*) sheet, UR_CHANGED ); + SaveCopyInUndoList( (SCH_ITEM*) sheet, UR_CHANGED, aAppend ); sheet->RemovePin( (SCH_SHEET_PIN*) aItem ); m_canvas->RefreshDrawingRect( sheet->GetBoundingBox() ); } else { + PICKED_ITEMS_LIST itemsList; + ITEM_PICKER picker( aItem, UR_DELETED ); + + aItem->SetFlags( STRUCT_DELETED ); + itemsList.PushItem( picker ); screen->Remove( aItem ); - SaveCopyInUndoList( aItem, UR_DELETED ); + + if( aItem->IsConnectable() && aItem->Type() != SCH_JUNCTION_T ) + { + std::vector< wxPoint > pts; + aItem->GetConnectionPoints( pts ); + for( auto point : pts ) + { + SCH_ITEM* junction; + if( !screen->IsJunctionNeeded( point ) + && ( junction = screen->GetItem( point, 0, SCH_JUNCTION_T ) ) ) + { + ITEM_PICKER picker_juction( junction, UR_DELETED ); + junction->SetFlags( STRUCT_DELETED ); + itemsList.PushItem( picker_juction ); + screen->Remove( junction ); + } + } + } + + SaveCopyInUndoList( itemsList, UR_DELETED, aAppend ); m_canvas->RefreshDrawingRect( aItem->GetBoundingBox() ); } } diff --git a/eeschema/schedit.cpp b/eeschema/schedit.cpp index 102f1fcbe7..80b17570c4 100644 --- a/eeschema/schedit.cpp +++ b/eeschema/schedit.cpp @@ -648,7 +648,7 @@ void SCH_EDIT_FRAME::DeleteConnection( bool aFullConnection ) if( screen->GetConnection( pos, pickList, aFullConnection ) != 0 ) { - DeleteItemsInList( m_canvas, pickList ); + DeleteItemsInList( pickList ); OnModify(); } } diff --git a/eeschema/schframe.h b/eeschema/schframe.h index bd0f08a06e..1e3e46dd87 100644 --- a/eeschema/schframe.h +++ b/eeschema/schframe.h @@ -1073,7 +1073,16 @@ public: * * @param aItem The item to remove from the current screen. */ - void DeleteItem( SCH_ITEM* aItem ); + void DeleteItem( SCH_ITEM* aItem, bool aAppend = false ); + + /** + * Removes all items (and unused junctions that connect to them) and saves + * each in the undo list + * + * @param aItemsList The list of items to delete + * @param aAppend True if we are updating a previous commit + */ + void DeleteItemsInList( PICKED_ITEMS_LIST& aItemsList, bool aAppend = false ); int GetLabelIncrement() const { return m_repeatLabelDelta; }