Pcbnew fix: "create array" extremely slow in GAL mode, due to a useless call of a time consuming method for each new item created.

This commit is contained in:
jean-pierre charras 2017-04-19 14:15:11 +02:00
parent 01f5a129a3
commit a35a46804e
3 changed files with 17 additions and 7 deletions

View File

@ -27,7 +27,6 @@
*/
#include "array_creator.h"
#include <board_commit.h>
#include <dialogs/dialog_create_array.h>
@ -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 );

View File

@ -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<MODULE*>( aItem )->RunOnChildren( [&] ( BOARD_ITEM* item )
{
item->ClearSelected();
}
);
}
}
void postPushAction( BOARD_ITEM* new_item ) override

View File

@ -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 );