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 <[email protected]>
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
71void 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 m_prev_panel->SetUserUnits( aUnits );
92}
93
94
96{
97 if( !m_prev_panel || m_libid == aFPID )
98 return;
99
100 wxBusyCursor busy;
101
102 if( m_prev_panel->DisplayFootprint( aFPID ) )
103 {
104 ClearStatus();
105 m_libid = aFPID;
106 }
107 else
108 {
109 SetStatusText( _( "Footprint not found." ) );
110 m_libid.clear();
111 }
112}
113
114
116 KIWAY& aKiway )
117{
118 FOOTPRINT_PREVIEW_PANEL_BASE* panel = nullptr;
119
120 try
121 {
122 KIFACE* kiface = aKiway.KiFACE( KIWAY::FACE_PCB );
123 wxWindow* window = kiface->CreateKiWindow( aParent, FRAME_FOOTPRINT_PREVIEW, &aKiway );
124
125 panel = dynamic_cast<FOOTPRINT_PREVIEW_PANEL_BASE*>( window );
126
127 if( window && !panel )
128 delete window;
129 }
130 catch( ... )
131 {
132 }
133
134 return panel;
135}
Base class for the actual viewer panel.
virtual bool DisplayFootprint(LIB_ID const &aFPID)=0
Set the currently displayed footprint.
virtual wxWindow * GetWindow()=0
Get the underlying wxWindow.
virtual const KIGFX::COLOR4D & GetForegroundColor() const =0
virtual void SetUserUnits(EDA_UNITS aUnits)=0
virtual const KIGFX::COLOR4D & GetBackgroundColor() const =0
Get the colors to use in a preview widget to match the preview panel.
static FOOTPRINT_PREVIEW_PANEL_BASE * Create(wxWindow *aParent, KIWAY &aKiway)
Return a footprint preview panel instance via Kiface.
FOOTPRINT_PREVIEW_PANEL_BASE * m_prev_panel
void DisplayFootprint(const LIB_ID &aFPID)
Set the currently displayed footprint.
FOOTPRINT_PREVIEW_WIDGET(wxWindow *aParent, KIWAY &aKiway)
Construct a footprint preview widget.
void SetUserUnits(EDA_UNITS aUnits)
Set the units for the preview.
void SetStatusText(const wxString &aText)
Set the contents of the status label and display it.
void ClearStatus()
Clear the contents of the status label and hide it.
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition: kiway.h:274
virtual KIFACE * KiFACE(FACE_T aFaceId, bool doLoad=true)
Return the KIFACE* given a FACE_T.
Definition: kiway.cpp:198
@ FACE_PCB
pcbnew DSO
Definition: kiway.h:282
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:49
void clear()
Clear the contents of the library nickname, library entry name.
Definition: lib_id.cpp:42
return & kiface
Definition: cvpcb.cpp:112
#define _(s)
EDA_UNITS
Definition: eda_units.h:43
@ FRAME_FOOTPRINT_PREVIEW
Definition: frame_type.h:46
Implement a participant in the KIWAY alchemy.
Definition: kiway.h:151