Give the cvpcb fpviewer frame an infobar and use it for errors

Using the infobar for errors doesn't steal focus from the cpvcb
main window when they are displayed like a dialog does, so it
allows for them to be visible without interrupting navigation
in the listboxes.
This commit is contained in:
Ian McInerney 2020-05-23 19:12:59 +01:00
parent 29a40ddf9c
commit d3db3b7cc9
1 changed files with 66 additions and 24 deletions

View File

@ -51,6 +51,7 @@
#include <tools/pcb_actions.h>
#include <tools/pcb_viewer_tools.h> // shared tools with other pcbnew frames
#include <tools/cvpcb_fpviewer_selection_tool.h>
#include <widgets/infobar.h>
BEGIN_EVENT_TABLE( DISPLAY_FOOTPRINTS_FRAME, PCB_BASE_FRAME )
@ -128,12 +129,28 @@ DISPLAY_FOOTPRINTS_FRAME::DISPLAY_FOOTPRINTS_FRAME( KIWAY* aKiway, wxWindow* aPa
ReCreateVToolbar();
ReCreateOptToolbar();
// Create the infobar
m_infoBar = new WX_INFOBAR( this, &m_auimgr );
m_auimgr.SetManagedWindow( this );
m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( "MainToolbar" ).Top().Layer(6) );
m_auimgr.AddPane( m_optionsToolBar, EDA_PANE().VToolbar().Name( "OptToolbar" ).Left().Layer(3) );
m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( "DrawFrame" ).Center() );
m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( "MsgPanel" ).Bottom().Layer(6) );
m_auimgr.AddPane( m_mainToolBar,
EDA_PANE().HToolbar().Name( "MainToolbar" ).Top().Layer(6) );
m_auimgr.AddPane( m_optionsToolBar,
EDA_PANE().VToolbar().Name( "OptToolbar" ).Left().Layer(3) );
m_auimgr.AddPane( m_infoBar,
EDA_PANE().InfoBar().Name( "InfoBar" ).Top().Layer(1) );
m_auimgr.AddPane( GetCanvas(),
EDA_PANE().Canvas().Name( "DrawFrame" ).Center() );
m_auimgr.AddPane( m_messagePanel,
EDA_PANE().Messages().Name( "MsgPanel" ).Bottom().Layer(6) );
// Call Update() to fix all pane default sizes, especially the "InfoBar" pane before
// hidding it.
m_auimgr.Update();
// We don't want the infobar displayed right away
m_auimgr.GetPane( "InfoBar" ).Hide();
m_auimgr.Update();
auto& galOpts = GetGalDisplayOptions();
@ -221,7 +238,6 @@ void DISPLAY_FOOTPRINTS_FRAME::ReCreateHToolbar()
m_mainToolBar = new ACTION_TOOLBAR( this, ID_H_TOOLBAR, wxDefaultPosition, wxDefaultSize,
KICAD_AUI_TB_STYLE | wxAUI_TB_HORZ_LAYOUT );
m_mainToolBar->AddSeparator();
m_mainToolBar->Add( ACTIONS::zoomRedraw );
m_mainToolBar->Add( ACTIONS::zoomInCenter );
m_mainToolBar->Add( ACTIONS::zoomOutCenter );
@ -326,25 +342,51 @@ MODULE* DISPLAY_FOOTPRINTS_FRAME::Get_Module( const wxString& aFootprintName )
{
MODULE* footprint = NULL;
// Prep the infobar. The infobar is used for as many notifications as possible
// since it doesn't steal focus into the frame like a dialog does.
m_infoBar->Dismiss();
m_infoBar->RemoveAllButtons();
m_infoBar->AddCloseButton();
LIB_ID fpid;
if( fpid.Parse( aFootprintName, LIB_ID::ID_PCB ) >= 0 )
{
wxString msg = wxString::Format( _( "Footprint ID \"%s\" is not valid." ),
GetChars( aFootprintName ) );
m_infoBar->ShowMessage( msg, wxICON_ERROR );
return NULL;
}
wxString libNickname = FROM_UTF8( fpid.GetLibNickname().c_str() );
wxString fpName = FROM_UTF8( fpid.GetLibItemName().c_str() );
wxLogDebug( wxT( "Load footprint \"%s\" from library \"%s\"." ), fpName, libNickname );
FP_LIB_TABLE* fpTable = Prj().PcbFootprintLibs( Kiway() );
wxASSERT( fpTable );
// See if the library requested is in the library table
if( !fpTable->HasLibrary( libNickname ) )
{
wxString msg = wxString::Format( _( "Library \"%s\" is not in the footprint library table." ),
libNickname );
m_infoBar->ShowMessage( msg, wxICON_ERROR );
return NULL;
}
// See if the footprint requested is in the library
if( !fpTable->FootprintExists( libNickname, fpName ) )
{
wxString msg = wxString::Format( _( "Footprint \"%s\" not found." ), aFootprintName );
m_infoBar->ShowMessage( msg, wxICON_ERROR );
return NULL;
}
try
{
LIB_ID fpid;
if( fpid.Parse( aFootprintName, LIB_ID::ID_PCB ) >= 0 )
{
DisplayInfoMessage( this, wxString::Format( _( "Footprint ID \"%s\" is not valid." ),
GetChars( aFootprintName ) ) );
return NULL;
}
std::string nickname = fpid.GetLibNickname();
std::string fpname = fpid.GetLibItemName();
wxLogDebug( wxT( "Load footprint \"%s\" from library \"%s\"." ),
fpname.c_str(), nickname.c_str() );
footprint = Prj().PcbFootprintLibs( Kiway() )->FootprintLoad(
FROM_UTF8( nickname.c_str() ), FROM_UTF8( fpname.c_str() ) );
footprint = fpTable->FootprintLoad( libNickname, fpName );
}
catch( const IO_ERROR& ioe )
{
@ -359,8 +401,8 @@ MODULE* DISPLAY_FOOTPRINTS_FRAME::Get_Module( const wxString& aFootprintName )
return footprint;
}
wxString msg = wxString::Format( _( "Footprint \"%s\" not found" ), aFootprintName.GetData() );
DisplayError( this, msg );
wxString msg = wxString::Format( _( "Footprint \"%s\" not found." ), aFootprintName );
m_infoBar->ShowMessage( msg, wxICON_ERROR );
return NULL;
}