Gerbview: fix issues (crash) after commit fb10406e

The m_auxiliaryToolBar manage controls, not tools, and controls need specific
management after a wxToolbar->Clear() call.
wxToolbar->Clear() does not delete controls, but stop their management.
This commit is contained in:
jean-pierre charras 2020-06-27 20:06:17 +02:00
parent 0f0627a53e
commit cd2dea7df2
3 changed files with 72 additions and 39 deletions

View File

@ -70,14 +70,18 @@ GERBVIEW_FRAME::GERBVIEW_FRAME( KIWAY* aKiway, wxWindow* aParent )
ID_GERBVIEW_JOB_FILE_LIST_CLEAR, _( "Clear Recent Job Files" ) ), ID_GERBVIEW_JOB_FILE_LIST_CLEAR, _( "Clear Recent Job Files" ) ),
m_TextInfo( nullptr ) m_TextInfo( nullptr )
{ {
m_gerberLayout = NULL; m_gerberLayout = nullptr;
m_show_layer_manager_tools = true; m_show_layer_manager_tools = true;
m_showBorderAndTitleBlock = false; // true for reference drawings. m_showBorderAndTitleBlock = false; // true for reference drawings.
m_SelLayerBox = NULL; m_SelLayerBox = nullptr;
m_DCodeSelector = NULL; m_DCodeSelector = nullptr;
m_SelComponentBox = nullptr; m_SelComponentBox = nullptr;
m_SelNetnameBox = nullptr; m_SelNetnameBox = nullptr;
m_SelAperAttributesBox = nullptr; m_SelAperAttributesBox = nullptr;
m_cmpText = nullptr;
m_netText = nullptr;
m_apertText = nullptr;
m_dcodeText = nullptr;
m_displayMode = 0; m_displayMode = 0;
m_AboutTitle = "GerbView"; m_AboutTitle = "GerbView";

View File

@ -59,6 +59,14 @@ class GERBVIEW_FRAME : public EDA_DRAW_FRAME // PCB_BASE_FRAME
wxPoint m_grid_origin; wxPoint m_grid_origin;
PAGE_INFO m_paper; // used only to show paper limits to screen PAGE_INFO m_paper; // used only to show paper limits to screen
GBR_DISPLAY_OPTIONS m_DisplayOptions; GBR_DISPLAY_OPTIONS m_DisplayOptions;
wxStaticText* m_cmpText; // a message on the auxiliary toolbar,
// relative to the m_SelComponentBox
wxStaticText* m_netText; // a message on the auxiliary toolbar,
// relative to the m_SelNetnameBox
wxStaticText* m_apertText; // a message on the auxiliary toolbar,
// relative to the m_SelAperAttributesBox
wxStaticText* m_dcodeText; // a message on the auxiliary toolbar,
// relative to the m_DCodeSelector
public: public:
const GBR_DISPLAY_OPTIONS& GetDisplayOptions() const { return m_DisplayOptions; } const GBR_DISPLAY_OPTIONS& GetDisplayOptions() const { return m_DisplayOptions; }

View File

@ -100,7 +100,6 @@ void GERBVIEW_FRAME::ReCreateHToolbar()
void GERBVIEW_FRAME::ReCreateAuxiliaryToolbar() void GERBVIEW_FRAME::ReCreateAuxiliaryToolbar()
{ {
wxWindowUpdateLocker dummy( this ); wxWindowUpdateLocker dummy( this );
wxStaticText* text;
if( m_auxiliaryToolBar ) if( m_auxiliaryToolBar )
m_auxiliaryToolBar->ClearToolbar(); m_auxiliaryToolBar->ClearToolbar();
@ -110,67 +109,79 @@ void GERBVIEW_FRAME::ReCreateAuxiliaryToolbar()
KICAD_AUI_TB_STYLE | wxAUI_TB_HORZ_LAYOUT ); KICAD_AUI_TB_STYLE | wxAUI_TB_HORZ_LAYOUT );
// Creates box to display and choose components: // Creates box to display and choose components:
// (note, when the m_auxiliaryToolBar is recreated, tools are deleted, but controls
// are not deleted: they are just no longer managed by the toolbar
if( !m_SelComponentBox ) if( !m_SelComponentBox )
{
m_SelComponentBox = new wxChoice( m_auxiliaryToolBar, m_SelComponentBox = new wxChoice( m_auxiliaryToolBar,
ID_GBR_AUX_TOOLBAR_PCB_CMP_CHOICE ); ID_GBR_AUX_TOOLBAR_PCB_CMP_CHOICE );
m_SelComponentBox->SetToolTip( _("Highlight items belonging to this component") );
text = new wxStaticText( m_auxiliaryToolBar, wxID_ANY, _( "Cmp: ") ); if( !m_cmpText )
m_auxiliaryToolBar->AddControl( text ); m_cmpText = new wxStaticText( m_auxiliaryToolBar, wxID_ANY, _( "Cmp: ") );
m_auxiliaryToolBar->AddControl( m_SelComponentBox );
m_auxiliaryToolBar->AddSpacer( 5 ); m_SelComponentBox->SetToolTip( _("Highlight items belonging to this component") );
} m_cmpText->SetLabel( _( "Cmp: ") ); // can change when changing the language
m_auxiliaryToolBar->AddControl( m_cmpText );
m_auxiliaryToolBar->AddControl( m_SelComponentBox );
m_auxiliaryToolBar->AddSpacer( 5 );
// Creates choice box to display net names and highlight selected: // Creates choice box to display net names and highlight selected:
if( !m_SelNetnameBox ) if( !m_SelNetnameBox )
{
m_SelNetnameBox = new wxChoice( m_auxiliaryToolBar, m_SelNetnameBox = new wxChoice( m_auxiliaryToolBar,
ID_GBR_AUX_TOOLBAR_PCB_NET_CHOICE ); ID_GBR_AUX_TOOLBAR_PCB_NET_CHOICE );
m_SelNetnameBox->SetToolTip( _("Highlight items belonging to this net") );
text = new wxStaticText( m_auxiliaryToolBar, wxID_ANY, _( "Net:" ) ); if( !m_netText )
m_auxiliaryToolBar->AddControl( text ); m_netText = new wxStaticText( m_auxiliaryToolBar, wxID_ANY, _( "Net:" ) );
m_auxiliaryToolBar->AddControl( m_SelNetnameBox );
m_auxiliaryToolBar->AddSpacer( 5 ); m_SelNetnameBox->SetToolTip( _("Highlight items belonging to this net") );
} m_netText->SetLabel( _( "Net:" ) ); // can change when changing the language
m_auxiliaryToolBar->AddControl( m_netText );
m_auxiliaryToolBar->AddControl( m_SelNetnameBox );
m_auxiliaryToolBar->AddSpacer( 5 );
// Creates choice box to display aperture attributes and highlight selected: // Creates choice box to display aperture attributes and highlight selected:
if( !m_SelAperAttributesBox ) if( !m_SelAperAttributesBox )
{
m_SelAperAttributesBox = new wxChoice( m_auxiliaryToolBar, m_SelAperAttributesBox = new wxChoice( m_auxiliaryToolBar,
ID_GBR_AUX_TOOLBAR_PCB_APERATTRIBUTES_CHOICE ); ID_GBR_AUX_TOOLBAR_PCB_APERATTRIBUTES_CHOICE );
m_SelAperAttributesBox->SetToolTip( _("Highlight items with this aperture attribute") );
text = new wxStaticText( m_auxiliaryToolBar, wxID_ANY, _( "Attr:" ) ); if( !m_apertText )
m_auxiliaryToolBar->AddControl( text ); m_apertText = new wxStaticText( m_auxiliaryToolBar, wxID_ANY, _( "Attr:" ) );
m_auxiliaryToolBar->AddControl( m_SelAperAttributesBox );
m_auxiliaryToolBar->AddSpacer( 5 ); m_SelAperAttributesBox->SetToolTip( _("Highlight items with this aperture attribute") );
} m_apertText->SetLabel( _( "Attr:" ) ); // can change when changing the language
m_auxiliaryToolBar->AddControl( m_apertText );
m_auxiliaryToolBar->AddControl( m_SelAperAttributesBox );
m_auxiliaryToolBar->AddSpacer( 5 );
if( !m_DCodeSelector ) if( !m_DCodeSelector )
{
m_DCodeSelector = new DCODE_SELECTION_BOX( m_auxiliaryToolBar, m_DCodeSelector = new DCODE_SELECTION_BOX( m_auxiliaryToolBar,
ID_TOOLBARH_GERBER_SELECT_ACTIVE_DCODE, ID_TOOLBARH_GERBER_SELECT_ACTIVE_DCODE,
wxDefaultPosition, wxSize( 150, -1 ) ); wxDefaultPosition, wxSize( 150, -1 ) );
text = new wxStaticText( m_auxiliaryToolBar, wxID_ANY, _( "DCode:" ) );
m_auxiliaryToolBar->AddControl( text ); if( !m_dcodeText )
m_auxiliaryToolBar->AddControl( m_DCodeSelector ); m_dcodeText = new wxStaticText( m_auxiliaryToolBar, wxID_ANY, _( "DCode:" ) );
}
m_dcodeText->SetLabel( _( "DCode:" ) );
m_auxiliaryToolBar->AddControl( m_dcodeText );
m_auxiliaryToolBar->AddControl( m_DCodeSelector );
if( !m_gridSelectBox ) if( !m_gridSelectBox )
{ {
m_auxiliaryToolBar->AddScaledSeparator( this );
m_gridSelectBox = new wxChoice( m_auxiliaryToolBar, ID_ON_GRID_SELECT, m_gridSelectBox = new wxChoice( m_auxiliaryToolBar, ID_ON_GRID_SELECT,
wxDefaultPosition, wxDefaultSize, 0, nullptr ); wxDefaultPosition, wxDefaultSize, 0, nullptr );
m_auxiliaryToolBar->AddControl( m_gridSelectBox );
} }
m_auxiliaryToolBar->AddScaledSeparator( this );
m_auxiliaryToolBar->AddControl( m_gridSelectBox );
if( !m_zoomSelectBox ) if( !m_zoomSelectBox )
{ {
m_auxiliaryToolBar->AddScaledSeparator( this );
m_zoomSelectBox = new wxChoice( m_auxiliaryToolBar, ID_ON_ZOOM_SELECT, m_zoomSelectBox = new wxChoice( m_auxiliaryToolBar, ID_ON_ZOOM_SELECT,
wxDefaultPosition, wxDefaultSize, 0, nullptr ); wxDefaultPosition, wxDefaultSize, 0, nullptr );
m_auxiliaryToolBar->AddControl( m_zoomSelectBox );
} }
m_auxiliaryToolBar->AddScaledSeparator( this );
m_auxiliaryToolBar->AddControl( m_zoomSelectBox );
updateComponentListSelectBox(); updateComponentListSelectBox();
updateNetnameListSelectBox(); updateNetnameListSelectBox();
updateAperAttributesSelectBox(); updateAperAttributesSelectBox();
@ -180,19 +191,29 @@ void GERBVIEW_FRAME::ReCreateAuxiliaryToolbar()
// combobox sizes can have changed: apply new best sizes // combobox sizes can have changed: apply new best sizes
auto item = m_auxiliaryToolBar->FindTool( ID_GBR_AUX_TOOLBAR_PCB_CMP_CHOICE ); auto item = m_auxiliaryToolBar->FindTool( ID_GBR_AUX_TOOLBAR_PCB_CMP_CHOICE );
item->SetMinSize( m_SelComponentBox->GetBestSize() );
// if( item )
item->SetMinSize( m_SelComponentBox->GetBestSize() );
item = m_auxiliaryToolBar->FindTool( ID_GBR_AUX_TOOLBAR_PCB_NET_CHOICE ); item = m_auxiliaryToolBar->FindTool( ID_GBR_AUX_TOOLBAR_PCB_NET_CHOICE );
item->SetMinSize( m_SelNetnameBox->GetBestSize() );
// if( item )
item->SetMinSize( m_SelNetnameBox->GetBestSize() );
item = m_auxiliaryToolBar->FindTool( ID_GBR_AUX_TOOLBAR_PCB_APERATTRIBUTES_CHOICE ); item = m_auxiliaryToolBar->FindTool( ID_GBR_AUX_TOOLBAR_PCB_APERATTRIBUTES_CHOICE );
item->SetMinSize( m_SelAperAttributesBox->GetBestSize() );
// if( item )
item->SetMinSize( m_SelAperAttributesBox->GetBestSize() );
item = m_auxiliaryToolBar->FindTool( ID_ON_GRID_SELECT ); item = m_auxiliaryToolBar->FindTool( ID_ON_GRID_SELECT );
item->SetMinSize( m_gridSelectBox->GetBestSize() );
// if( item )
item->SetMinSize( m_gridSelectBox->GetBestSize() );
item = m_auxiliaryToolBar->FindTool( ID_ON_ZOOM_SELECT ); item = m_auxiliaryToolBar->FindTool( ID_ON_ZOOM_SELECT );
item->SetMinSize( m_zoomSelectBox->GetBestSize() );
// if( item )
item->SetMinSize( m_zoomSelectBox->GetBestSize() );
// after adding the buttons to the toolbar, must call Realize() // after adding the buttons to the toolbar, must call Realize()
m_auxiliaryToolBar->Realize(); m_auxiliaryToolBar->Realize();