diff --git a/eeschema/tools/sch_edit_tool.cpp b/eeschema/tools/sch_edit_tool.cpp index 583e8ab58662fce42a17c030015204caccc8dd95..35d0649e989bc5f283abc901ab83e2bd91fdc1ad 100644 --- a/eeschema/tools/sch_edit_tool.cpp +++ b/eeschema/tools/sch_edit_tool.cpp @@ -1201,22 +1201,35 @@ int SCH_EDIT_TOOL::EditField( const TOOL_EVENT& aEvent ) int SCH_EDIT_TOOL::AutoplaceFields( const TOOL_EVENT& aEvent ) { EE_SELECTION& selection = m_selectionTool->RequestSelection( rotatableItems ); + SCH_ITEM* head = static_cast<SCH_ITEM*>( selection.Front() ); + bool moving = head && head->IsMoving(); if( selection.Empty() ) return 0; - SCH_ITEM* head = static_cast<SCH_ITEM*>( selection.Front() ); - bool moving = head && head->IsMoving(); + std::vector<SCH_ITEM*> autoplaceItems; for( unsigned ii = 0; ii < selection.GetSize(); ii++ ) { - SCH_ITEM* sch_item = static_cast<SCH_ITEM*>( selection.GetItem( ii ) ); + SCH_ITEM* item = static_cast<SCH_ITEM*>( selection.GetItem( ii ) ); + + if( item->IsType( EE_COLLECTOR::FieldOwners ) ) + autoplaceItems.push_back( item ); + else if( item->GetParent() && item->GetParent()->IsType( EE_COLLECTOR::FieldOwners ) ) + autoplaceItems.push_back( static_cast<SCH_ITEM*>( item->GetParent() ) ); + } + + bool appendUndo = false; + for( SCH_ITEM* sch_item : autoplaceItems ) + { if( !moving && !sch_item->IsNew() ) - saveCopyInUndoList( sch_item, UNDO_REDO::CHANGED, ii > 0 ); + { + saveCopyInUndoList( sch_item, UNDO_REDO::CHANGED, appendUndo ); + appendUndo = true; + } - if( sch_item->IsType( EE_COLLECTOR::FieldOwners ) ) - sch_item->AutoplaceFields( m_frame->GetScreen(), /* aManual */ true ); + sch_item->AutoplaceFields( m_frame->GetScreen(), /* aManual */ true ); updateItem( sch_item, true ); }