From a35a46804e0202cdf9617a95f625ff3ed1bb3119 Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Wed, 19 Apr 2017 14:15:11 +0200 Subject: [PATCH] Pcbnew fix: "create array" extremely slow in GAL mode, due to a useless call of a time consuming method for each new item created. --- pcbnew/array_creator.cpp | 4 ++-- pcbnew/tools/edit_tool.cpp | 18 ++++++++++++++---- pcbnew/tools/pcbnew_control.cpp | 2 +- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/pcbnew/array_creator.cpp b/pcbnew/array_creator.cpp index 5787e35dee..41c9a5b89c 100644 --- a/pcbnew/array_creator.cpp +++ b/pcbnew/array_creator.cpp @@ -27,7 +27,6 @@ */ #include "array_creator.h" - #include #include @@ -41,7 +40,6 @@ void ARRAY_CREATOR::Invoke() if( numItems == 0 ) return; - BOARD_COMMIT commit( &m_parent ); MODULE* const module = getModule(); const bool isModuleEditor = module != NULL; @@ -56,6 +54,8 @@ void ARRAY_CREATOR::Invoke() if( ret != wxID_OK || array_opts == NULL ) return; + BOARD_COMMIT commit( &m_parent ); + for ( int i = 0; i < numItems; ++i ) { BOARD_ITEM* item = getNthItemToArray( i ); diff --git a/pcbnew/tools/edit_tool.cpp b/pcbnew/tools/edit_tool.cpp index 6ff32b4106..2021c09f86 100644 --- a/pcbnew/tools/edit_tool.cpp +++ b/pcbnew/tools/edit_tool.cpp @@ -828,7 +828,7 @@ int EDIT_TOOL::Duplicate( const TOOL_EVENT& aEvent ) } return 0; -}; +} class GAL_ARRAY_CREATOR: public ARRAY_CREATOR @@ -873,10 +873,20 @@ private: return wxPoint( rp.x, rp.y ); } - void prePushAction( BOARD_ITEM* new_item ) override + void prePushAction( BOARD_ITEM* aItem ) override { - m_parent.GetToolManager()->RunAction( PCB_ACTIONS::unselectItem, - true, new_item ); + // Because aItem is/can be created from a selected item, and inherits from + // it this state, reset the selected stated of aItem: + aItem->ClearSelected(); + + if( aItem->Type() == PCB_MODULE_T ) + { + static_cast( aItem )->RunOnChildren( [&] ( BOARD_ITEM* item ) + { + item->ClearSelected(); + } + ); + } } void postPushAction( BOARD_ITEM* new_item ) override diff --git a/pcbnew/tools/pcbnew_control.cpp b/pcbnew/tools/pcbnew_control.cpp index c4725c65ab..c80736f448 100644 --- a/pcbnew/tools/pcbnew_control.cpp +++ b/pcbnew/tools/pcbnew_control.cpp @@ -906,7 +906,7 @@ int PCBNEW_CONTROL::AppendBoard( const TOOL_EVENT& aEvent ) board->GetRatsnest()->ProcessBoard(); // Start dragging the appended board - if( selection.Front() ) // be sure at least one item is selected + if( selection.Size() ) // be sure at least one item is loaded { // Inform other potentially interested tools m_toolMgr->ProcessEvent( SELECTION_TOOL::SelectedEvent );