From e2afe5e1a3914dc2d2c7af86492a704e76065fe4 Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Fri, 18 Jan 2019 17:24:40 +0100 Subject: [PATCH] Toolbars with wxComboboxes: Fix incorrect ReCreate Toolbar methods: they recreated these wxComboboxes without deleting the previously created. This issue created memory leak and not working wxComboboxes (for instance after modifying the language selection). Now, these wxComboboxes are created only once, never recreated. Also: minor cosmetic enhancement in footprint editor main toolbar (the save footprint icon is modified if the footprint is saved to the board or to the library) --- bitmaps_png/CMakeLists.txt | 1 + bitmaps_png/cpp_26/save_fp_to_board.cpp | 79 +++ bitmaps_png/sources/save_fp_to_board.svg | 535 ++++++++++++++++++ .../sources/tune_diff_pair_length_legend.svg | 422 ++++++++++++++ include/bitmaps.h | 1 + pcbnew/footprint_editor_utils.cpp | 6 + pcbnew/load_select_footprint.cpp | 10 +- pcbnew/tool_footprint_editor.cpp | 26 +- pcbnew/tool_footprint_viewer.cpp | 19 +- pcbnew/tool_pcb_editor.cpp | 34 +- 10 files changed, 1116 insertions(+), 17 deletions(-) create mode 100644 bitmaps_png/cpp_26/save_fp_to_board.cpp create mode 100644 bitmaps_png/sources/save_fp_to_board.svg create mode 100644 bitmaps_png/sources/tune_diff_pair_length_legend.svg diff --git a/bitmaps_png/CMakeLists.txt b/bitmaps_png/CMakeLists.txt index a4f6a6167a..fa57403fdc 100644 --- a/bitmaps_png/CMakeLists.txt +++ b/bitmaps_png/CMakeLists.txt @@ -505,6 +505,7 @@ set( BMAPS_MID rotate_neg_z rotate_pos_z save_as + save_fp_to_board save_gerber save_library save_project diff --git a/bitmaps_png/cpp_26/save_fp_to_board.cpp b/bitmaps_png/cpp_26/save_fp_to_board.cpp new file mode 100644 index 0000000000..9b89a8957b --- /dev/null +++ b/bitmaps_png/cpp_26/save_fp_to_board.cpp @@ -0,0 +1,79 @@ + +/* Do not modify this file, it was automatically generated by the + * PNG2cpp CMake script, using a *.png file as input. + */ + +#include + +static const unsigned char png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, + 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c, + 0xce, 0x00, 0x00, 0x03, 0xd9, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xed, 0x94, 0x6d, 0x4c, 0x53, + 0x57, 0x18, 0xc7, 0xcb, 0x2e, 0xa5, 0xef, 0xb4, 0x34, 0x60, 0x06, 0xf2, 0x12, 0x07, 0x73, 0x61, + 0x44, 0x1d, 0xa2, 0x08, 0x42, 0x9d, 0xa6, 0xd9, 0xe4, 0x45, 0x47, 0xd8, 0xc2, 0x3e, 0x98, 0x09, + 0x08, 0xed, 0xbd, 0x58, 0x2a, 0x58, 0x98, 0x34, 0xe0, 0x60, 0x30, 0xf0, 0x85, 0x36, 0x22, 0x63, + 0x20, 0x64, 0x2e, 0x7b, 0x83, 0x69, 0x9c, 0x08, 0x6a, 0xe4, 0xa5, 0x15, 0x4b, 0xd5, 0xe9, 0xe6, + 0x94, 0x31, 0xd3, 0xe2, 0x34, 0x03, 0x09, 0xd3, 0xf1, 0x81, 0x7d, 0x58, 0xf6, 0x61, 0xc9, 0xc2, + 0x07, 0xfe, 0x3b, 0xe7, 0x66, 0x23, 0x76, 0xbc, 0xd8, 0x39, 0xf5, 0xd3, 0x4e, 0xf2, 0xcb, 0x3d, + 0xe7, 0xde, 0xe7, 0x79, 0x7e, 0xcf, 0x3d, 0xf7, 0xe4, 0x0a, 0x04, 0x8b, 0x0c, 0x00, 0x25, 0x95, + 0x95, 0x95, 0xa0, 0xd3, 0x85, 0x88, 0x5b, 0x1b, 0x4b, 0xc2, 0xd0, 0x2f, 0xf8, 0x2f, 0x83, 0x14, + 0xd8, 0xcb, 0x71, 0x1c, 0xc2, 0x92, 0x18, 0xa4, 0x34, 0xf9, 0xcd, 0x21, 0x36, 0xcf, 0x17, 0x4b, + 0xc3, 0x9f, 0xa5, 0x22, 0xe7, 0x63, 0x11, 0x45, 0xa5, 0x31, 0xd8, 0xd6, 0x2b, 0x9e, 0x43, 0x72, + 0x85, 0x10, 0xa1, 0x11, 0xc1, 0x4f, 0x55, 0x34, 0xf8, 0x28, 0xc5, 0xa5, 0x04, 0x03, 0xc1, 0x4c, + 0xf7, 0xde, 0x4b, 0xd1, 0xd8, 0x5f, 0xf1, 0x6f, 0x13, 0x22, 0xbc, 0x15, 0x35, 0xb5, 0xb5, 0xb5, + 0x81, 0x65, 0x59, 0x9e, 0xe8, 0xe8, 0x68, 0x4f, 0x51, 0x9f, 0xa7, 0x48, 0xae, 0x90, 0xce, 0xc6, + 0x96, 0x96, 0x96, 0x62, 0x7a, 0x7a, 0xfa, 0x07, 0xaf, 0x45, 0x45, 0xc5, 0x46, 0xfe, 0x44, 0x85, + 0x26, 0x32, 0x88, 0x4a, 0x65, 0xa0, 0x3d, 0x20, 0xc2, 0xf6, 0xf3, 0x52, 0x64, 0x0f, 0xc8, 0x90, + 0x73, 0x41, 0xc6, 0x5f, 0xb3, 0xc9, 0xfa, 0xf5, 0x0e, 0x31, 0x9e, 0x4f, 0x27, 0x31, 0x29, 0x0c, + 0x18, 0x91, 0x0f, 0x5e, 0x5c, 0xf1, 0x02, 0x15, 0xdd, 0xf6, 0x56, 0xa4, 0xa2, 0xc1, 0x2f, 0x6f, + 0xd2, 0x20, 0x38, 0x86, 0x74, 0xde, 0x23, 0xe5, 0x8b, 0xef, 0x70, 0xca, 0x91, 0x77, 0x49, 0x81, + 0x7c, 0x02, 0xbd, 0xee, 0xb8, 0xa8, 0x40, 0xae, 0x43, 0xce, 0x0b, 0x57, 0xbe, 0x25, 0x84, 0x32, + 0xc0, 0x1f, 0xa3, 0xa3, 0xa3, 0x7f, 0x90, 0xfc, 0x75, 0x8b, 0x0a, 0xaa, 0xab, 0xb3, 0xfc, 0xca, + 0x9b, 0xd3, 0x96, 0xdb, 0xcf, 0x94, 0x85, 0xfc, 0x3e, 0xe9, 0x5a, 0x33, 0xf5, 0xcb, 0xd4, 0xaf, + 0xcb, 0x22, 0xc3, 0xb1, 0x7c, 0xb3, 0x98, 0x2f, 0xac, 0xbb, 0xe2, 0x0f, 0xf6, 0x6b, 0x25, 0xb8, + 0x6f, 0x54, 0x60, 0x09, 0xfa, 0xab, 0x4a, 0xe4, 0x5f, 0xf6, 0x87, 0xb6, 0x4e, 0x0c, 0x5f, 0x21, + 0x03, 0x87, 0xc3, 0x81, 0xc9, 0xa9, 0xbb, 0x15, 0xb4, 0xc6, 0x83, 0x98, 0xbe, 0xcc, 0x92, 0x78, + 0x88, 0xb8, 0x06, 0x4d, 0x86, 0x40, 0x27, 0x40, 0xe7, 0x89, 0x42, 0x8c, 0x5f, 0xb0, 0x60, 0x6b, + 0xe3, 0x66, 0xb8, 0x46, 0x5c, 0x50, 0x28, 0x65, 0x48, 0x30, 0x4a, 0xc0, 0x7d, 0xab, 0x82, 0x61, + 0x48, 0x8d, 0xc2, 0xef, 0xd4, 0x30, 0x10, 0x0a, 0xae, 0x07, 0x20, 0xeb, 0x98, 0x02, 0x12, 0xb9, + 0x1f, 0x5a, 0x5b, 0x5b, 0x61, 0xed, 0xb7, 0x82, 0xe6, 0xff, 0x93, 0x1c, 0x4b, 0x72, 0xe1, 0xa2, + 0xa2, 0x40, 0xa3, 0x1c, 0x86, 0x76, 0x0e, 0x76, 0xbb, 0x9d, 0xef, 0x38, 0xad, 0x41, 0x8e, 0x5d, + 0x37, 0x03, 0x51, 0xec, 0x0e, 0x42, 0x91, 0x2b, 0x10, 0xf9, 0x4e, 0x35, 0xd4, 0x61, 0x12, 0x14, + 0xec, 0x64, 0x61, 0x73, 0xdb, 0xc0, 0xb0, 0xcc, 0xa3, 0x8b, 0x64, 0x3b, 0x45, 0xf8, 0xed, 0xde, + 0x10, 0x1a, 0xdf, 0x6f, 0x84, 0x48, 0x2a, 0xc4, 0xb6, 0x53, 0x2a, 0x98, 0x6e, 0x2f, 0x21, 0xc2, + 0x20, 0x44, 0xc4, 0x4b, 0x91, 0x90, 0x14, 0x8f, 0x91, 0x7b, 0x23, 0x50, 0x15, 0xa9, 0xe6, 0x95, + 0xfc, 0x2b, 0xd1, 0xb8, 0xc3, 0x8a, 0x1b, 0x3f, 0x5e, 0x06, 0x57, 0xc0, 0x22, 0x20, 0x44, 0x02, + 0x1d, 0x79, 0x93, 0x95, 0x6f, 0xca, 0xc8, 0xaf, 0x27, 0x18, 0x93, 0x93, 0xf7, 0x71, 0x75, 0xc0, + 0x8a, 0x8c, 0xba, 0x58, 0x18, 0x0f, 0x6b, 0x31, 0xd4, 0xf3, 0x2e, 0x9f, 0xfb, 0x20, 0x77, 0x07, + 0x2c, 0x1a, 0xef, 0x44, 0x64, 0x9e, 0xd7, 0xa0, 0x85, 0xfb, 0x27, 0x37, 0x34, 0x1b, 0x93, 0xa0, + 0x0c, 0x11, 0x42, 0x22, 0x13, 0x63, 0x78, 0x78, 0x18, 0x5b, 0x9b, 0xd2, 0x61, 0x6e, 0x4e, 0x43, + 0xc7, 0x31, 0x3d, 0xcf, 0x91, 0x4f, 0xb7, 0x23, 0xa1, 0x3a, 0x06, 0x29, 0x96, 0x0d, 0x78, 0xed, + 0x40, 0x02, 0x6e, 0xd9, 0xf7, 0x3d, 0x5c, 0x14, 0x5a, 0x1c, 0x00, 0x46, 0xff, 0x0c, 0x3e, 0xfc, + 0x2c, 0x07, 0x37, 0xfb, 0x6a, 0xa0, 0x6b, 0xde, 0x82, 0xb1, 0xfb, 0x63, 0x58, 0x13, 0xbf, 0x1a, + 0x5d, 0x5d, 0x5d, 0x98, 0xb8, 0xd5, 0x8f, 0xf5, 0x7b, 0xa3, 0xe6, 0x6c, 0x55, 0x66, 0x4b, 0x26, + 0x66, 0x66, 0x66, 0xb0, 0xa9, 0x3e, 0x19, 0x27, 0x4f, 0x18, 0x1e, 0x2e, 0xea, 0xed, 0x34, 0xe1, + 0xb9, 0x92, 0x20, 0xf8, 0xe8, 0x7d, 0x90, 0x6b, 0x4d, 0xc6, 0x9d, 0xf3, 0xfb, 0xf1, 0x49, 0x77, + 0x39, 0x2e, 0xdd, 0xb9, 0x88, 0xfd, 0xe7, 0x6a, 0xf9, 0x06, 0x68, 0xdc, 0xf7, 0xa4, 0x89, 0xbf, + 0xb9, 0xde, 0x53, 0x05, 0xdd, 0xe1, 0x57, 0x90, 0x72, 0x30, 0x11, 0xe6, 0x23, 0x19, 0x44, 0x52, + 0x3f, 0xbf, 0x28, 0x68, 0x97, 0x02, 0x5f, 0x9d, 0x2d, 0x9f, 0xdd, 0xdf, 0x11, 0x5b, 0x1d, 0xde, + 0xd8, 0x17, 0xc7, 0x77, 0x1a, 0xb3, 0x67, 0x29, 0x9c, 0xa7, 0xcd, 0xe8, 0x3b, 0x65, 0x82, 0x88, + 0xf3, 0x85, 0xda, 0x28, 0xe3, 0x63, 0xb2, 0xeb, 0xd7, 0x23, 0x7c, 0xb7, 0x1a, 0x91, 0x25, 0x4b, + 0x50, 0xf6, 0x41, 0x2a, 0xce, 0x9e, 0x2c, 0xf2, 0xc0, 0xde, 0x6d, 0x7a, 0xd5, 0x43, 0x74, 0xa5, + 0x7b, 0xcf, 0x4b, 0xee, 0xfe, 0x5a, 0xfe, 0x83, 0x7e, 0xf4, 0x79, 0x2e, 0x06, 0xcf, 0x94, 0xcd, + 0x0a, 0xab, 0x5b, 0x33, 0x78, 0xd9, 0x96, 0xf7, 0x56, 0xf1, 0x6b, 0x95, 0x41, 0xca, 0x43, 0xe7, + 0xa9, 0x35, 0x2b, 0x16, 0x3c, 0x71, 0xf3, 0x9e, 0xba, 0x09, 0xc7, 0xc1, 0x98, 0x1b, 0xbd, 0x55, + 0x88, 0x34, 0x87, 0xa1, 0x65, 0xb0, 0x05, 0x71, 0x35, 0xab, 0xd0, 0xf1, 0x05, 0xcb, 0x17, 0xeb, + 0xe9, 0xdc, 0xcd, 0x27, 0xd1, 0xa2, 0x8f, 0x45, 0x74, 0xed, 0xdc, 0x3b, 0x58, 0x56, 0x16, 0x8a, + 0xe3, 0xd7, 0x8e, 0x63, 0x5d, 0xdd, 0x5a, 0x7c, 0xdc, 0x9e, 0xf7, 0x64, 0x44, 0x34, 0xb1, 0xfe, + 0x68, 0x16, 0x39, 0x6d, 0x0c, 0x32, 0x6b, 0x57, 0xcf, 0x6e, 0xdd, 0x13, 0x11, 0x1d, 0x25, 0xdf, + 0x87, 0x06, 0xe8, 0xac, 0x1b, 0xfe, 0x17, 0x79, 0x27, 0x1a, 0xb5, 0x1d, 0x0a, 0x1b, 0x1f, 0xb0, + 0x9c, 0x6e, 0x6f, 0xd7, 0x3b, 0x13, 0x2b, 0xa2, 0x7e, 0x2e, 0x6f, 0x4e, 0x1f, 0xa2, 0x6b, 0x8a, + 0xad, 0xab, 0xc4, 0x4e, 0xef, 0x71, 0x87, 0x36, 0xba, 0xe8, 0x5a, 0x5b, 0x15, 0x3d, 0x41, 0xa1, + 0x73, 0x7a, 0x8f, 0x3e, 0x5b, 0x08, 0xd6, 0xaa, 0x49, 0x17, 0x3c, 0xcd, 0xf1, 0x27, 0x8c, 0xfc, + 0x30, 0x79, 0x1c, 0x02, 0xda, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, + 0x60, 0x82, +}; + +const BITMAP_OPAQUE save_fp_to_board_xpm[1] = {{ png, sizeof( png ), "save_fp_to_board_xpm" }}; + +//EOF diff --git a/bitmaps_png/sources/save_fp_to_board.svg b/bitmaps_png/sources/save_fp_to_board.svg new file mode 100644 index 0000000000..d34622aceb --- /dev/null +++ b/bitmaps_png/sources/save_fp_to_board.svg @@ -0,0 +1,535 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bitmaps_png/sources/tune_diff_pair_length_legend.svg b/bitmaps_png/sources/tune_diff_pair_length_legend.svg new file mode 100644 index 0000000000..6d70d6ef74 --- /dev/null +++ b/bitmaps_png/sources/tune_diff_pair_length_legend.svg @@ -0,0 +1,422 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + Amax + Amin + S + r + + + + + + + + + + diff --git a/include/bitmaps.h b/include/bitmaps.h index 2ed1e76925..a4238ac2a0 100644 --- a/include/bitmaps.h +++ b/include/bitmaps.h @@ -467,6 +467,7 @@ EXTERN_BITMAP( rotate_neg_z_xpm ) EXTERN_BITMAP( rotate_pos_z_xpm ) EXTERN_BITMAP( save_as_xpm ) EXTERN_BITMAP( save_gerber_xpm ) +EXTERN_BITMAP( save_fp_to_board_xpm ) EXTERN_BITMAP( save_library_xpm ) EXTERN_BITMAP( save_project_xpm ) EXTERN_BITMAP( save_setup_xpm ) diff --git a/pcbnew/footprint_editor_utils.cpp b/pcbnew/footprint_editor_utils.cpp index 3dffd81ff1..91c28926df 100644 --- a/pcbnew/footprint_editor_utils.cpp +++ b/pcbnew/footprint_editor_utils.cpp @@ -182,6 +182,8 @@ void FOOTPRINT_EDIT_FRAME::LoadModuleFromBoard( wxCommandEvent& event ) void FOOTPRINT_EDIT_FRAME::LoadModuleFromLibrary( LIB_ID aFPID) { + bool is_last_fp_from_brd = IsCurrentFPFromBoard(); + MODULE* module = LoadFootprint( aFPID ); if( !module ) @@ -225,6 +227,10 @@ void FOOTPRINT_EDIT_FRAME::LoadModuleFromLibrary( LIB_ID aFPID) updateView(); m_canvas->Refresh(); + // Update the bitmap of the ID_MODEDIT_SAVE tool if needed. + if( is_last_fp_from_brd ) + ReCreateHToolbar(); + m_treePane->GetLibTree()->ExpandLibId( aFPID ); m_treePane->GetLibTree()->CenterLibId( aFPID ); m_treePane->GetLibTree()->Refresh(); // update highlighting diff --git a/pcbnew/load_select_footprint.cpp b/pcbnew/load_select_footprint.cpp index c3c5bb4c62..f14a930f1c 100644 --- a/pcbnew/load_select_footprint.cpp +++ b/pcbnew/load_select_footprint.cpp @@ -89,9 +89,12 @@ static void clearModuleItemFlags( BOARD_ITEM* aItem ) aItem->ClearFlags(); } - +#include "pcbnew_id.h" +#include bool FOOTPRINT_EDIT_FRAME::Load_Module_From_BOARD( MODULE* aModule ) { + bool is_last_fp_from_brd = IsCurrentFPFromBoard(); + MODULE* newModule; PCB_EDIT_FRAME* frame = (PCB_EDIT_FRAME*) Kiway().Player( FRAME_PCB, false ); @@ -150,10 +153,15 @@ bool FOOTPRINT_EDIT_FRAME::Load_Module_From_BOARD( MODULE* aModule ) GetScreen()->ClearUndoRedoList(); GetScreen()->ClrModify(); + // Update the bitmap of the ID_MODEDIT_SAVE tool if needed. + if( !is_last_fp_from_brd ) + ReCreateHToolbar(); + Update3DView(); if( IsGalCanvasActive() ) updateView(); + m_canvas->Refresh(); m_treePane->GetLibTree()->Refresh(); // update any previously-highlighted items diff --git a/pcbnew/tool_footprint_editor.cpp b/pcbnew/tool_footprint_editor.cpp index faee12d229..336c01d411 100644 --- a/pcbnew/tool_footprint_editor.cpp +++ b/pcbnew/tool_footprint_editor.cpp @@ -22,7 +22,7 @@ /** * @file tool_footprint_editor.cpp - * @brief Footprint editor tool bars + * @brief methods to build Footprint Editor toolbars */ #include @@ -37,6 +37,13 @@ void FOOTPRINT_EDIT_FRAME::ReCreateHToolbar() { + // Note: + // To rebuild the aui toolbar, the more easy way is to clear ( calling m_mainToolBar.Clear() ) + // all wxAuiToolBarItems. + // However the wxAuiToolBarItems are not the owners of controls managed by + // them ( m_zoomSelectBox and m_gridSelectBox ), and therefore do not delete them + // So we do not recreate them after clearing the tools. + if( m_mainToolBar ) m_mainToolBar->Clear(); else @@ -57,8 +64,10 @@ void FOOTPRINT_EDIT_FRAME::ReCreateHToolbar() #endif m_mainToolBar->AddTool( ID_MODEDIT_SAVE, wxEmptyString, - KiScaledBitmap( save_xpm, this ), - _( "Save changes" ) ); + KiScaledBitmap( IsCurrentFPFromBoard() ? open_brd_file_xpm : save_xpm, + this ), + IsCurrentFPFromBoard() ? + _( "Save changes to board" ) : _( "Save changes to library" ) ); KiScaledSeparator( m_mainToolBar, this ); m_mainToolBar->AddTool( wxID_PRINT, wxEmptyString, @@ -115,16 +124,19 @@ void FOOTPRINT_EDIT_FRAME::ReCreateHToolbar() KiScaledSeparator( m_mainToolBar, this ); // Grid selection choice box. - m_gridSelectBox = new wxComboBox( m_mainToolBar, ID_ON_GRID_SELECT, wxEmptyString, - wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY ); + if( m_gridSelectBox == nullptr ) + m_gridSelectBox = new wxComboBox( m_mainToolBar, ID_ON_GRID_SELECT, wxEmptyString, + wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY ); UpdateGridSelectBox(); m_mainToolBar->AddControl( m_gridSelectBox ); KiScaledSeparator( m_mainToolBar, this ); // Zoom selection choice box. - m_zoomSelectBox = new wxComboBox( m_mainToolBar, ID_ON_ZOOM_SELECT, wxEmptyString, - wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY ); + if( m_zoomSelectBox == nullptr ) + m_zoomSelectBox = new wxComboBox( m_mainToolBar, ID_ON_ZOOM_SELECT, wxEmptyString, + wxDefaultPosition, wxDefaultSize, 0, nullptr, + wxCB_READONLY ); updateZoomSelectBox(); m_mainToolBar->AddControl( m_zoomSelectBox ); diff --git a/pcbnew/tool_footprint_viewer.cpp b/pcbnew/tool_footprint_viewer.cpp index 856ca53deb..ad7de6a138 100644 --- a/pcbnew/tool_footprint_viewer.cpp +++ b/pcbnew/tool_footprint_viewer.cpp @@ -39,6 +39,13 @@ void FOOTPRINT_VIEWER_FRAME::ReCreateHToolbar() { + // Note: + // To rebuild the aui toolbar, the more easy way is to clear ( calling m_mainToolBar.Clear() ) + // all wxAuiToolBarItems. + // However the wxAuiToolBarItems are not the owners of controls managed by + // them ( m_zoomSelectBox and m_gridSelectBox ), and therefore do not delete them + // So we do not recreate them after clearing the tools. + wxString msg; if( m_mainToolBar ) @@ -102,16 +109,20 @@ void FOOTPRINT_VIEWER_FRAME::ReCreateHToolbar() KiScaledSeparator( m_mainToolBar, this ); // Grid selection choice box. - m_gridSelectBox = new wxComboBox( m_mainToolBar, ID_ON_GRID_SELECT, wxEmptyString, - wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY ); + if( m_gridSelectBox == nullptr ) + m_gridSelectBox = new wxComboBox( m_mainToolBar, ID_ON_GRID_SELECT, wxEmptyString, + wxDefaultPosition, wxDefaultSize, 0, nullptr, + wxCB_READONLY ); UpdateGridSelectBox(); m_mainToolBar->AddControl( m_gridSelectBox ); KiScaledSeparator( m_mainToolBar, this ); // Zoom selection choice box. - m_zoomSelectBox = new wxComboBox( m_mainToolBar, ID_ON_ZOOM_SELECT, wxEmptyString, - wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY ); + if( m_zoomSelectBox == nullptr ) + m_zoomSelectBox = new wxComboBox( m_mainToolBar, ID_ON_ZOOM_SELECT, wxEmptyString, + wxDefaultPosition, wxDefaultSize, 0, nullptr, + wxCB_READONLY ); updateZoomSelectBox(); m_mainToolBar->AddControl( m_zoomSelectBox ); diff --git a/pcbnew/tool_pcb_editor.cpp b/pcbnew/tool_pcb_editor.cpp index 67976b464e..838616dc99 100644 --- a/pcbnew/tool_pcb_editor.cpp +++ b/pcbnew/tool_pcb_editor.cpp @@ -232,6 +232,13 @@ void PCB_EDIT_FRAME::PrepareLayerIndicator() void PCB_EDIT_FRAME::ReCreateHToolbar() { + // Note: + // To rebuild the aui toolbar, the more easy way is to clear ( calling m_mainToolBar.Clear() ) + // all wxAuiToolBarItems. + // However the wxAuiToolBarItems are not the owners of controls managed by + // them and therefore do not delete them + // So we do not recreate them after clearing the tools. + wxString msg; wxWindowUpdateLocker dummy( this ); @@ -296,7 +303,7 @@ void PCB_EDIT_FRAME::ReCreateHToolbar() KiScaledSeparator( m_mainToolBar, this ); - if( m_SelLayerBox == NULL ) + if( m_SelLayerBox == nullptr ) { m_SelLayerBox = new PCB_LAYER_BOX_SELECTOR( m_mainToolBar, ID_TOOLBARH_PCB_SELECT_LAYER ); m_SelLayerBox->SetBoardFrame( this ); @@ -337,6 +344,13 @@ void PCB_EDIT_FRAME::ReCreateHToolbar() void PCB_EDIT_FRAME::ReCreateOptToolbar() { + // Note: + // To rebuild the aui toolbar, the more easy way is to clear ( calling m_mainToolBar.Clear() ) + // all wxAuiToolBarItems. + // However the wxAuiToolBarItems are not the owners of controls managed by + // them and therefore do not delete them + // So we do not recreate them after clearing the tools. + wxWindowUpdateLocker dummy( this ); if( m_optionsToolBar ) @@ -583,16 +597,20 @@ void PCB_EDIT_FRAME::ReCreateAuxiliaryToolbar() /* Set up toolbar items */ // Creates box to display and choose tracks widths: - m_SelTrackWidthBox = new wxComboBox( m_auxiliaryToolBar, + if( m_SelTrackWidthBox == nullptr ) + m_SelTrackWidthBox = new wxComboBox( m_auxiliaryToolBar, ID_AUX_TOOLBAR_PCB_TRACK_WIDTH, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY ); + UpdateTrackWidthSelectBox( m_SelTrackWidthBox ); m_auxiliaryToolBar->AddControl( m_SelTrackWidthBox ); // Creates box to display and choose vias diameters: - m_SelViaSizeBox = new wxComboBox( m_auxiliaryToolBar, + if( m_SelViaSizeBox == nullptr ) + m_SelViaSizeBox = new wxComboBox( m_auxiliaryToolBar, ID_AUX_TOOLBAR_PCB_VIA_SIZE, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY ); + UpdateViaSizeSelectBox( m_SelViaSizeBox ); m_auxiliaryToolBar->AddControl( m_SelViaSizeBox ); KiScaledSeparator( m_auxiliaryToolBar, this ); @@ -607,17 +625,23 @@ void PCB_EDIT_FRAME::ReCreateAuxiliaryToolbar() // Add the box to display and select the current grid size: KiScaledSeparator( m_auxiliaryToolBar, this ); - m_gridSelectBox = new wxComboBox( m_auxiliaryToolBar, ID_ON_GRID_SELECT, wxEmptyString, + + if( m_gridSelectBox == nullptr ) + m_gridSelectBox = new wxComboBox( m_auxiliaryToolBar, ID_ON_GRID_SELECT, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY ); + UpdateGridSelectBox(); m_auxiliaryToolBar->AddControl( m_gridSelectBox ); // Add the box to display and select the current Zoom KiScaledSeparator( m_auxiliaryToolBar, this ); - m_zoomSelectBox = new wxComboBox( m_auxiliaryToolBar, + + if( m_zoomSelectBox == nullptr ) + m_zoomSelectBox = new wxComboBox( m_auxiliaryToolBar, ID_ON_ZOOM_SELECT, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY ); + updateZoomSelectBox(); m_auxiliaryToolBar->AddControl( m_zoomSelectBox );