CvPcb: Fix crashes when starting cvPcb (could be Windows Specific) and after closing the footprint viewer.

This commit is contained in:
jean-pierre charras 2014-03-21 12:50:04 +01:00
parent a7f1939203
commit ab30fba0ab
5 changed files with 35 additions and 24 deletions

View File

@ -70,15 +70,13 @@ BEGIN_EVENT_TABLE( DISPLAY_FOOTPRINTS_FRAME, PCB_BASE_FRAME )
DISPLAY_FOOTPRINTS_FRAME::OnUpdateLineDrawMode )
END_EVENT_TABLE()
#define DISPLAY_FOOTPRINTS_FRAME_NAME wxT( "CmpFrame" )
DISPLAY_FOOTPRINTS_FRAME::DISPLAY_FOOTPRINTS_FRAME( KIWAY* aKiway, CVPCB_MAINFRAME* aParent ) :
PCB_BASE_FRAME( aKiway, aParent, CVPCB_DISPLAY_FRAME_TYPE, _( "Module" ),
PCB_BASE_FRAME( aKiway, aParent, CVPCB_DISPLAY_FRAME_TYPE, _( "Footprint Viewer" ),
wxDefaultPosition, wxDefaultSize,
KICAD_DEFAULT_DRAWFRAME_STYLE, DISPLAY_FOOTPRINTS_FRAME_NAME )
KICAD_DEFAULT_DRAWFRAME_STYLE, FOOTPRINTVIEWER_FRAME_NAME )
{
m_FrameName = DISPLAY_FOOTPRINTS_FRAME_NAME;
m_FrameName = FOOTPRINTVIEWER_FRAME_NAME;
m_showAxis = true; // true to draw axis.
// Give an icon
@ -147,9 +145,6 @@ DISPLAY_FOOTPRINTS_FRAME::~DISPLAY_FOOTPRINTS_FRAME()
{
delete GetScreen();
SetScreen( NULL ); // Be sure there is no double deletion
// a crash would be better than this uncommented:
// ( (CVPCB_MAINFRAME*) Pgm().GetTopWindow() )->m_DisplayFootprintFrame = NULL;
}

View File

@ -29,6 +29,8 @@
#include <wxBasePcbFrame.h>
// The name (for wxWidgets) of the footprint viewer frame
#define FOOTPRINTVIEWER_FRAME_NAME wxT( "FootprintViewerFrame" )
class CVPCB_MAINFRAME;

View File

@ -207,7 +207,7 @@ void FOOTPRINTS_LISTBOX::OnLeftClick( wxListEvent& event )
return;
// If the footprint view window is displayed, update the footprint.
if( GetParent()->m_DisplayFootprintFrame )
if( GetParent()->GetFpViewerFrame() )
GetParent()->CreateScreenCmp();
GetParent()->DisplayStatus();

View File

@ -114,7 +114,6 @@ CVPCB_MAINFRAME::CVPCB_MAINFRAME( KIWAY* aKiway, wxWindow* aParent ) :
m_ListCmp = NULL;
m_FootprintList = NULL;
m_LibraryList = NULL;
m_DisplayFootprintFrame = NULL;
m_mainToolBar = NULL;
m_modified = false;
m_isEESchemaNetlist = false;
@ -315,8 +314,8 @@ void CVPCB_MAINFRAME::OnCloseWindow( wxCloseEvent& Event )
}
// Close module display frame
if( m_DisplayFootprintFrame )
m_DisplayFootprintFrame->Close( true );
if( GetFpViewerFrame() )
GetFpViewerFrame()->Close( true );
m_modified = false;
@ -562,7 +561,7 @@ void CVPCB_MAINFRAME::OnKeepOpenOnSave( wxCommandEvent& event )
void CVPCB_MAINFRAME::DisplayModule( wxCommandEvent& event )
{
CreateScreenCmp();
m_DisplayFootprintFrame->RedrawScreen( wxPoint( 0, 0 ), false );
GetFpViewerFrame()->RedrawScreen( wxPoint( 0, 0 ), false );
}
@ -601,7 +600,9 @@ void CVPCB_MAINFRAME::OnSelectComponent( wxListEvent& event )
m_FootprintList->SetFootprints( m_footprints, libraryName, component, filter );
// Tell AuiMgr that objects are changed !
m_auimgr.Update();
if( m_auimgr.GetManagedWindow() ) // Be sure Aui Manager is initialized
// (could be not the case when starting CvPcb
m_auimgr.Update();
if( component == NULL )
return;
@ -640,7 +641,7 @@ void CVPCB_MAINFRAME::OnSelectComponent( wxListEvent& event )
if ( ii >= 0 )
m_FootprintList->SetSelection( ii, false );
if( m_DisplayFootprintFrame )
if( GetFpViewerFrame() )
{
CreateScreenCmp();
}
@ -919,15 +920,17 @@ bool CVPCB_MAINFRAME::WriteComponentLinkFile( const wxString& aFullFileName )
void CVPCB_MAINFRAME::CreateScreenCmp()
{
if( !m_DisplayFootprintFrame )
DISPLAY_FOOTPRINTS_FRAME* fpframe = GetFpViewerFrame();
if( !fpframe )
{
m_DisplayFootprintFrame = new DISPLAY_FOOTPRINTS_FRAME( &Kiway(), this );
m_DisplayFootprintFrame->Show( true );
fpframe = new DISPLAY_FOOTPRINTS_FRAME( &Kiway(), this );
fpframe->Show( true );
}
else
{
if( m_DisplayFootprintFrame->IsIconized() )
m_DisplayFootprintFrame->Iconize( false );
if( fpframe->IsIconized() )
fpframe->Iconize( false );
// The display footprint window might be buried under some other
// windows, so CreateScreenCmp() on an existing window would not
@ -935,11 +938,11 @@ void CVPCB_MAINFRAME::CreateScreenCmp()
// So we want to put it to front, second after our CVPCB_MAINFRAME.
// We do this by a little dance of bringing it to front then the main
// frame back.
m_DisplayFootprintFrame->Raise(); // Make sure that is visible.
Raise(); // .. but still we want the focus.
fpframe->Raise(); // Make sure that is visible.
Raise(); // .. but still we want the focus.
}
m_DisplayFootprintFrame->InitDisplay();
fpframe->InitDisplay();
}
@ -1049,3 +1052,10 @@ COMPONENT* CVPCB_MAINFRAME::GetSelectedComponent()
return NULL;
}
DISPLAY_FOOTPRINTS_FRAME* CVPCB_MAINFRAME::GetFpViewerFrame()
{
// returns the Footprint Viewer frame, if exists, or NULL
return (DISPLAY_FOOTPRINTS_FRAME*) wxWindow::FindWindowByName( FOOTPRINTVIEWER_FRAME_NAME );
}

View File

@ -63,7 +63,6 @@ public:
FOOTPRINTS_LISTBOX* m_FootprintList;
LIBRARY_LISTBOX* m_LibraryList;
COMPONENTS_LISTBOX* m_ListCmp;
DISPLAY_FOOTPRINTS_FRAME* m_DisplayFootprintFrame;
wxAuiToolBar* m_mainToolBar;
wxFileName m_NetlistFileName;
wxArrayString m_ModuleLibNames;
@ -95,6 +94,11 @@ public:
*/
FP_LIB_TABLE* FootprintLibs() const;
/**
* @return a pointer on the Footprint Viewer frame, if exists, or NULL
*/
DISPLAY_FOOTPRINTS_FRAME* GetFpViewerFrame();
/**
* Function OnSelectComponent
* Called when clicking on a component in component list window