KiCad PCB EDA Suite
footprint_preview_widget.cpp
Go to the documentation of this file.
1 /*
2  * This program source code file is part of KiCad, a free EDA CAD application.
3  *
4  * Copyright (C) 2017-2021 KiCad Developers, see AUTHORS.txt for contributors.
5  * Copyright (C) 2017 Chris Pavlina <pavlina.chris@gmail.com>
6  *
7  * This program is free software: you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by the
9  * Free Software Foundation, either version 3 of the License, or (at your
10  * option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with this program. If not, see <http://www.gnu.org/licenses/>.
19  */
20 
22 #include <lib_id.h>
23 #include <wx/stattext.h>
24 #include <wx/sizer.h>
25 #include <kiway.h>
26 
27 
29  wxPanel( aParent, wxID_ANY, wxDefaultPosition, wxDefaultSize,
30  wxFULL_REPAINT_ON_RESIZE | wxTAB_TRAVERSAL ),
31  m_prev_panel( nullptr ),
32  m_status( nullptr ),
33  m_statusPanel( nullptr ),
34  m_statusSizer( nullptr ),
35  m_outerSizer( nullptr )
36 {
38 
39  if( !m_prev_panel )
40  return;
41 
42  m_statusPanel = new wxPanel( this );
43  m_status = new wxStaticText( m_statusPanel, wxID_ANY, wxEmptyString );
44  m_statusSizer = new wxBoxSizer( wxVERTICAL );
45  m_statusSizer->Add( 0, 0, 1 ); // add a spacer
46  m_statusSizer->Add( m_status, 0, wxALIGN_CENTER );
47  m_statusSizer->Add( 0, 0, 1 ); // add a spacer
48  m_statusPanel->SetSizer( m_statusSizer );
49 
50  // Give the status panel the same color scheme as the canvas so it isn't jarring when
51  // switched to
52  m_statusPanel->SetBackgroundColour( m_prev_panel->GetBackgroundColor().ToColour() );
53  m_statusPanel->SetForegroundColour( m_prev_panel->GetForegroundColor().ToColour() );
54  m_status->SetForegroundColour( m_prev_panel->GetForegroundColor().ToColour() );
55 
56  // Set our background so wx doesn't render a normal control background momentarily when
57  // rapidly navigating with arrow keys
58  SetBackgroundColour( m_prev_panel->GetBackgroundColor().ToColour() );
59  SetForegroundColour( m_prev_panel->GetForegroundColor().ToColour() );
60 
61  m_outerSizer = new wxBoxSizer( wxVERTICAL );
62  m_outerSizer->Add( m_prev_panel->GetWindow(), 1, wxALL | wxEXPAND, 0 );
63  m_outerSizer->Add( m_statusPanel, 1, wxALL | wxEXPAND, 0 );
64 
65  SetSizer( m_outerSizer );
66 
67  SetStatusText( wxEmptyString );
68 }
69 
70 
71 void FOOTPRINT_PREVIEW_WIDGET::SetStatusText( wxString const& aText )
72 {
73  m_status->SetLabel( aText );
74  m_statusPanel->Show();
75  m_prev_panel->GetWindow()->Hide();
76  Layout();
77 }
78 
79 
81 {
82  m_status->SetLabel( wxEmptyString );
83  m_statusPanel->Hide();
84  m_prev_panel->GetWindow()->Show();
85  Layout();
86 }
87 
88 
90 {
91  if( !m_prev_panel || m_libid == aFPID )
92  return;
93 
94  wxBusyCursor busy;
95 
96  if( m_prev_panel->DisplayFootprint( aFPID ) )
97  {
98  ClearStatus();
99  m_libid = aFPID;
100  }
101  else
102  {
103  SetStatusText( _( "Footprint not found." ) );
104  m_libid.clear();
105  }
106 }
107 
108 
110  KIWAY& aKiway )
111 {
112  FOOTPRINT_PREVIEW_PANEL_BASE* panel = nullptr;
113 
114  try
115  {
116  KIFACE* kiface = aKiway.KiFACE( KIWAY::FACE_PCB );
117  wxWindow* window = kiface->CreateWindow( aParent, FRAME_FOOTPRINT_PREVIEW, &aKiway );
118 
119  panel = dynamic_cast<FOOTPRINT_PREVIEW_PANEL_BASE*>( window );
120 
121  if( window && !panel )
122  delete window;
123  }
124  catch( ... )
125  {
126  }
127 
128  return panel;
129 }
BITMAP2CMP_SETTINGS kiface
virtual bool DisplayFootprint(LIB_ID const &aFPID)=0
Set the currently displayed footprint.
virtual const KIGFX::COLOR4D & GetForegroundColor()=0
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:51
FOOTPRINT_PREVIEW_PANEL_BASE * m_prev_panel
void ClearStatus()
Clear the contents of the status label and hide it.
virtual wxWindow * GetWindow()=0
Get the underlying wxWindow.
virtual const KIGFX::COLOR4D & GetBackgroundColor()=0
Get the colors to use in a preview widget to match the preview panel.
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition: kiway.h:260
#define _(s)
pcbnew DSO
Definition: kiway.h:269
void SetStatusText(const wxString &aText)
Set the contents of the status label and display it.
void clear()
Clear the contents of the library nickname, library entry name, and revision strings.
Definition: lib_id.cpp:42
virtual KIFACE * KiFACE(FACE_T aFaceId, bool doLoad=true)
Return the KIFACE* given a FACE_T.
Definition: kiway.cpp:196
Base class for the actual viewer panel.
static FOOTPRINT_PREVIEW_PANEL_BASE * Create(wxWindow *aParent, KIWAY &aKiway)
Return a footprint preview panel instance via Kiface.
void DisplayFootprint(const LIB_ID &aFPID)
Set the currently displayed footprint.
Implement a participant in the KIWAY alchemy.
Definition: kiway.h:148
FOOTPRINT_PREVIEW_WIDGET(wxWindow *aParent, KIWAY &aKiway)
Construct a footprint preview widget.