KiCad PCB EDA Suite
dialog_choose_component.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) 2014 Henner Zeller <h.zeller@acm.org>
5  * Copyright (C) 2016-2019 KiCad Developers, see AUTHORS.txt for contributors.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, you may find one here:
19  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20  * or you may search the http://www.gnu.org website for the version 2 license,
21  * or you may write to the Free Software Foundation, Inc.,
22  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23  */
24 
26 #include <algorithm>
27 #include <wx/utils.h>
28 #include <wx/button.h>
29 #include <wx/dataview.h>
30 #include <wx/panel.h>
31 #include <wx/sizer.h>
32 #include <wx/splitter.h>
33 #include <wx/timer.h>
34 #include <class_library.h>
35 #include <sch_base_frame.h>
36 #include <template_fieldnames.h>
37 #include <symbol_lib_table.h>
38 #include <widgets/lib_tree.h>
42 #include <wx/clipbrd.h>
43 #include <kiface_i.h>
44 #include <class_libentry.h>
45 
46 #define SYM_CHOOSER_HSASH wxT( "SymbolChooserHSashPosition" )
47 #define SYM_CHOOSER_VSASH wxT( "SymbolChooserVSashPosition" )
48 #define SYM_CHOOSER_WIDTH_KEY wxT( "SymbolChooserWidth" )
49 #define SYM_CHOOSER_HEIGHT_KEY wxT( "SymbolChooserHeight" )
50 #define SYM_CHOOSER_KEEP_SYM_KEY wxT( "SymbolChooserKeepSymbol" )
51 #define SYM_CHOOSER_USE_UNITS_KEY wxT( "SymbolChooserUseUnits" )
52 
53 
55 
56 
59  int aDeMorganConvert, bool aAllowFieldEdits,
60  bool aShowFootprints, bool aAllowBrowser )
61  : DIALOG_SHIM( aParent, wxID_ANY, aTitle, wxDefaultPosition, wxDefaultSize,
62  wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER ),
63  m_browser_button( nullptr ),
64  m_hsplitter( nullptr ),
65  m_vsplitter( nullptr ),
66  m_fp_sel_ctrl( nullptr ),
67  m_fp_preview( nullptr ),
68  m_tree( nullptr ),
69  m_details( nullptr ),
70  m_parent( aParent ),
71  m_deMorganConvert( aDeMorganConvert >= 0 ? aDeMorganConvert : 0 ),
72  m_allow_field_edits( aAllowFieldEdits ),
73  m_show_footprints( aShowFootprints ),
74  m_external_browser_requested( false )
75 {
77 
78  auto sizer = new wxBoxSizer( wxVERTICAL );
79 
80  // Use a slightly different layout, with a details pane spanning the entire window,
81  // if we're not showing footprints.
82  if( aShowFootprints )
83  {
84  m_hsplitter = new wxSplitterWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize,
85  wxSP_LIVE_UPDATE );
86 
87  //Avoid the splitter window being assigned as the Parent to additional windows
88  m_hsplitter->SetExtraStyle( wxWS_EX_TRANSIENT );
89 
90  sizer->Add( m_hsplitter, 1, wxEXPAND | wxLEFT | wxRIGHT | wxTOP, 5 );
91  }
92  else
93  {
94  m_vsplitter = new wxSplitterWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize,
95  wxSP_LIVE_UPDATE );
96 
97  m_hsplitter = new wxSplitterWindow( m_vsplitter, wxID_ANY, wxDefaultPosition, wxDefaultSize,
98  wxSP_LIVE_UPDATE );
99 
100  //Avoid the splitter window being assigned as the Parent to additional windows
101  m_hsplitter->SetExtraStyle( wxWS_EX_TRANSIENT );
102 
103  auto detailsPanel = new wxPanel( m_vsplitter );
104  auto detailsSizer = new wxBoxSizer( wxVERTICAL );
105  detailsPanel->SetSizer( detailsSizer );
106 
107  m_details = new wxHtmlWindow( detailsPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize,
108  wxHW_SCROLLBAR_AUTO );
109  detailsSizer->Add( m_details, 1, wxEXPAND | wxLEFT | wxRIGHT | wxTOP, 5 );
110  detailsPanel->Layout();
111  detailsSizer->Fit( detailsPanel );
112 
113  m_vsplitter->SetSashGravity( 0.5 );
114  m_vsplitter->SetMinimumPaneSize( 20 );
115  m_vsplitter->SplitHorizontally( m_hsplitter, detailsPanel );
116 
117  sizer->Add( m_vsplitter, 1, wxEXPAND | wxLEFT | wxRIGHT | wxTOP, 5 );
118  }
119 
120  m_tree = new LIB_TREE( m_hsplitter, Prj().SchSymbolLibTable(), aAdapter,
122 
123  m_hsplitter->SetSashGravity( 0.8 );
124  m_hsplitter->SetMinimumPaneSize( 20 );
125  m_hsplitter->SplitVertically( m_tree, ConstructRightPanel( m_hsplitter ) );
126 
127  m_dbl_click_timer = new wxTimer( this );
128 
129  auto buttonsSizer = new wxBoxSizer( wxHORIZONTAL );
130 
131  if( aAllowBrowser )
132  {
133  m_browser_button = new wxButton( this, wxID_ANY, _( "Select with Browser" ) );
134  buttonsSizer->Add( m_browser_button, 0, wxALL | wxALIGN_CENTER_VERTICAL, 5 );
135  }
136 
137  auto sdbSizer = new wxStdDialogButtonSizer();
138  auto okButton = new wxButton( this, wxID_OK );
139  auto cancelButton = new wxButton( this, wxID_CANCEL );
140  sdbSizer->AddButton( okButton );
141  sdbSizer->AddButton( cancelButton );
142  sdbSizer->Realize();
143 
144  buttonsSizer->Add( sdbSizer, 1, wxALL, 5 );
145 
146  sizer->Add( buttonsSizer, 0, wxEXPAND | wxLEFT, 5 );
147  SetSizer( sizer );
148 
149  Layout();
150 
151  // We specify the width of the right window (m_symbol_view_panel), because specify
152  // the width of the left window does not work as expected when SetSashGravity() is called
153  m_hsplitter->SetSashPosition( m_config->Read( SYM_CHOOSER_HSASH, HorizPixelsFromDU( 220 ) ) );
154 
155  if( m_vsplitter )
156  m_vsplitter->SetSashPosition( m_config->Read( SYM_CHOOSER_VSASH,
157  VertPixelsFromDU( 230 ) ) );
158 
159  wxSize dlgSize( m_config->Read( SYM_CHOOSER_WIDTH_KEY, HorizPixelsFromDU( 390 ) ),
161  SetSize( dlgSize );
162 
164  okButton->SetDefault();
165 
166  Bind( wxEVT_INIT_DIALOG, &DIALOG_CHOOSE_COMPONENT::OnInitDialog, this );
167  Bind( wxEVT_TIMER, &DIALOG_CHOOSE_COMPONENT::OnCloseTimer, this, m_dbl_click_timer->GetId() );
168  Bind( COMPONENT_PRESELECTED, &DIALOG_CHOOSE_COMPONENT::OnComponentPreselected, this );
169  Bind( COMPONENT_SELECTED, &DIALOG_CHOOSE_COMPONENT::OnComponentSelected, this );
170 
171  if( m_browser_button )
172  m_browser_button->Bind( wxEVT_COMMAND_BUTTON_CLICKED,
174 
175  if( m_fp_sel_ctrl )
176  m_fp_sel_ctrl->Bind( EVT_FOOTPRINT_SELECTED,
178 
179  if( m_details )
180  m_details->Connect( wxEVT_CHAR_HOOK,
181  wxKeyEventHandler( DIALOG_CHOOSE_COMPONENT::OnCharHook ),
182  NULL, this );
183 }
184 
185 
187 {
188  Unbind( wxEVT_INIT_DIALOG, &DIALOG_CHOOSE_COMPONENT::OnInitDialog, this );
189  Unbind( wxEVT_TIMER, &DIALOG_CHOOSE_COMPONENT::OnCloseTimer, this );
190  Unbind( COMPONENT_PRESELECTED, &DIALOG_CHOOSE_COMPONENT::OnComponentPreselected, this );
191  Unbind( COMPONENT_SELECTED, &DIALOG_CHOOSE_COMPONENT::OnComponentSelected, this );
192 
193  if( m_browser_button )
194  m_browser_button->Unbind( wxEVT_COMMAND_BUTTON_CLICKED,
196 
197  if( m_fp_sel_ctrl )
198  m_fp_sel_ctrl->Unbind( EVT_FOOTPRINT_SELECTED,
200 
201  if( m_details )
202  m_details->Disconnect( wxEVT_CHAR_HOOK,
203  wxKeyEventHandler( DIALOG_CHOOSE_COMPONENT::OnCharHook ),
204  NULL, this );
205 
206  // I am not sure the following two lines are necessary, but they will not hurt anyone
207  m_dbl_click_timer->Stop();
208  delete m_dbl_click_timer;
209 
210  m_config->Write( SYM_CHOOSER_WIDTH_KEY, GetSize().x );
211  m_config->Write( SYM_CHOOSER_HEIGHT_KEY, GetSize().y );
212 
213  m_config->Write( SYM_CHOOSER_KEEP_SYM_KEY, m_keepSymbol->GetValue() );
214  m_config->Write( SYM_CHOOSER_USE_UNITS_KEY, m_useUnits->GetValue() );
215 
216  m_config->Write( SYM_CHOOSER_HSASH, m_hsplitter->GetSashPosition() );
217 
218  if( m_vsplitter )
219  m_config->Write( SYM_CHOOSER_VSASH, m_vsplitter->GetSashPosition() );
220 }
221 
222 
223 wxPanel* DIALOG_CHOOSE_COMPONENT::ConstructRightPanel( wxWindow* aParent )
224 {
225  auto panel = new wxPanel( aParent );
226  auto sizer = new wxBoxSizer( wxVERTICAL );
227 
229  m_parent->GetCanvas()->GetBackend() );
230  m_symbol_preview->SetLayoutDirection( wxLayout_LeftToRight );
231 
232  if( m_show_footprints )
233  {
235 
236  sizer->Add( m_symbol_preview, 1, wxEXPAND | wxTOP | wxBOTTOM | wxRIGHT, 5 );
237 
238  if ( fp_list )
239  {
240  if( m_allow_field_edits )
241  m_fp_sel_ctrl = new FOOTPRINT_SELECT_WIDGET( panel, fp_list, true );
242 
243  m_fp_preview = new FOOTPRINT_PREVIEW_WIDGET( panel, Kiway() );
244  }
245 
246  if( m_fp_sel_ctrl )
247  sizer->Add( m_fp_sel_ctrl, 0, wxEXPAND | wxBOTTOM | wxTOP | wxRIGHT, 5 );
248 
249  if( m_fp_preview )
250  sizer->Add( m_fp_preview, 1, wxEXPAND | wxBOTTOM | wxRIGHT, 5 );
251  }
252  else
253  {
254  sizer->Add( m_symbol_preview, 1, wxEXPAND | wxTOP | wxRIGHT, 5 );
255  }
256 
257  m_keepSymbol = new wxCheckBox( panel, 1000, _("Multi-Symbol Placement"), wxDefaultPosition,
258  wxDefaultSize, wxALIGN_RIGHT );
259  m_keepSymbol->SetValue( m_config->ReadBool( SYM_CHOOSER_KEEP_SYM_KEY, false ) );
260  m_keepSymbol->SetToolTip( _( "Place multiple copies of the symbol." ) );
261 
262  m_useUnits = new wxCheckBox( panel, 1000, _("Place all units"), wxDefaultPosition,
263  wxDefaultSize, wxALIGN_RIGHT );
264  m_useUnits->SetValue( m_config->ReadBool( SYM_CHOOSER_USE_UNITS_KEY, true ) );
265  m_useUnits->SetToolTip( _( "Sequentially place all units of the symbol." ) );
266 
267  auto fgSizer = new wxFlexGridSizer( 0, 2, 0, 1 );
268  fgSizer->AddGrowableCol( 0 );
269  fgSizer->SetFlexibleDirection( wxBOTH );
270  fgSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
271 
272  fgSizer->Add( 0, 0, 1, wxEXPAND );
273  fgSizer->Add( m_keepSymbol, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
274  fgSizer->Add( 0, 0, 1, wxEXPAND );
275  fgSizer->Add( m_useUnits, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
276 
277  sizer->Add( fgSizer, 0, wxALL | wxEXPAND, 5 );
278  panel->SetSizer( sizer );
279  panel->Layout();
280  sizer->Fit( panel );
281 
282  return panel;
283 }
284 
285 
286 void DIALOG_CHOOSE_COMPONENT::OnInitDialog( wxInitDialogEvent& aEvent )
287 {
289  {
290  // This hides the GAL panel and shows the status label
291  m_fp_preview->SetStatusText( wxEmptyString );
292  }
293 
294  if( m_fp_sel_ctrl )
295  m_fp_sel_ctrl->Load( Kiway(), Prj() );
296 }
297 
298 
300 {
301  if( m_details && e.GetKeyCode() == 'C' && e.ControlDown() &&
302  !e.AltDown() && !e.ShiftDown() && !e.MetaDown() )
303  {
304  wxString txt = m_details->SelectionToText();
305 
306  if( wxTheClipboard->Open() )
307  {
308  wxTheClipboard->SetData( new wxTextDataObject( txt ) );
309  wxTheClipboard->Close();
310  }
311  }
312  else
313  {
314  e.Skip();
315  }
316 }
317 
318 
320 {
321  return m_tree->GetSelectedLibId( aUnit );
322 }
323 
324 
325 void DIALOG_CHOOSE_COMPONENT::OnUseBrowser( wxCommandEvent& aEvent )
326 {
328  EndQuasiModal( wxID_OK );
329 }
330 
331 
332 void DIALOG_CHOOSE_COMPONENT::OnCloseTimer( wxTimerEvent& aEvent )
333 {
334  // Hack handler because of eaten MouseUp event. See
335  // DIALOG_CHOOSE_COMPONENT::OnComponentSelected for the beginning
336  // of this spaghetti noodle.
337 
338  auto state = wxGetMouseState();
339 
340  if( state.LeftIsDown() )
341  {
342  // Mouse hasn't been raised yet, so fire the timer again. Otherwise the
343  // purpose of this timer is defeated.
345  }
346  else
347  {
348  EndQuasiModal( wxID_OK );
349  }
350 }
351 
352 
354 {
356  return;
357 
358  LIB_PART* symbol = nullptr;
359 
360  try
361  {
362  symbol = Prj().SchSymbolLibTable()->LoadSymbol( aLibId );
363  }
364  catch( const IO_ERROR& ioe )
365  {
366  wxLogError( wxString::Format( _( "Error loading symbol %s from library %s.\n\n%s" ),
367  aLibId.GetLibItemName().wx_str(),
368  aLibId.GetLibNickname().wx_str(),
369  ioe.What() ) );
370  }
371 
372  if( !symbol )
373  return;
374 
375  LIB_FIELD* fp_field = symbol->GetField( FOOTPRINT );
376  wxString fp_name = fp_field ? fp_field->GetFullText() : wxString( "" );
377 
378  ShowFootprint( fp_name );
379 }
380 
381 
382 void DIALOG_CHOOSE_COMPONENT::ShowFootprint( wxString const& aName )
383 {
385  return;
386 
387  if( aName == wxEmptyString )
388  {
389  m_fp_preview->SetStatusText( _( "No footprint specified" ) );
390  }
391  else
392  {
393  LIB_ID lib_id;
394 
395  if( lib_id.Parse( aName, LIB_ID::ID_PCB ) == -1 && lib_id.IsValid() )
396  {
398  m_fp_preview->CacheFootprint( lib_id );
399  m_fp_preview->DisplayFootprint( lib_id );
400  }
401  else
402  {
403  m_fp_preview->SetStatusText( _( "Invalid footprint specified" ) );
404  }
405  }
406 }
407 
408 
410 {
411  if( !m_fp_sel_ctrl )
412  return;
413 
415 
416  LIB_PART* symbol = nullptr;
417 
418  if( aLibId.IsValid() )
419  {
420  try
421  {
422  symbol = Prj().SchSymbolLibTable()->LoadSymbol( aLibId );
423  }
424  catch( const IO_ERROR& ioe )
425  {
426  wxLogError( wxString::Format( _( "Error occurred loading symbol %s from library %s."
427  "\n\n%s" ),
428  aLibId.GetLibItemName().wx_str(),
429  aLibId.GetLibNickname().wx_str(),
430  ioe.What() ) );
431  }
432  }
433 
434  if( symbol != nullptr )
435  {
436  LIB_PINS temp_pins;
437  LIB_FIELD* fp_field = symbol->GetField( FOOTPRINT );
438  wxString fp_name = fp_field ? fp_field->GetFullText() : wxString( "" );
439 
440  symbol->GetPins( temp_pins );
441 
442  m_fp_sel_ctrl->FilterByPinCount( temp_pins.size() );
447  }
448  else
449  {
451  m_fp_sel_ctrl->Disable();
452  }
453 }
454 
455 
456 void DIALOG_CHOOSE_COMPONENT::OnFootprintSelected( wxCommandEvent& aEvent )
457 {
458  m_fp_override = aEvent.GetString();
459 
460  m_field_edits.erase(
461  std::remove_if( m_field_edits.begin(), m_field_edits.end(),
462  []( std::pair<int, wxString> const& i )
463  {
464  return i.first == FOOTPRINT;
465  } ),
466  m_field_edits.end() );
467 
468  m_field_edits.emplace_back( std::make_pair( FOOTPRINT, m_fp_override ) );
469 
471 }
472 
473 
475 {
476  int unit = 0;
477 
478  LIB_ID id = m_tree->GetSelectedLibId( &unit );
479 
480  if( id.IsValid() )
481  {
482  m_symbol_preview->DisplaySymbol( id, unit );
483 
484  ShowFootprintFor( id );
486  }
487  else
488  {
489  m_symbol_preview->SetStatusText( _( "No symbol selected" ) );
490 
492  m_fp_preview->SetStatusText( wxEmptyString );
493 
495  }
496 }
497 
498 
499 void DIALOG_CHOOSE_COMPONENT::OnComponentSelected( wxCommandEvent& aEvent )
500 {
501  if( m_tree->GetSelectedLibId().IsValid() )
502  {
503  // Got a selection. We can't just end the modal dialog here, because
504  // wx leaks some events back to the parent window (in particular, the
505  // MouseUp following a double click).
506  //
507  // NOW, here's where it gets really fun. wxTreeListCtrl eats MouseUp.
508  // This isn't really feasible to bypass without a fully custom
509  // wxDataViewCtrl implementation, and even then might not be fully
510  // possible (docs are vague). To get around this, we use a one-shot
511  // timer to schedule the dialog close.
512  //
513  // See DIALOG_CHOOSE_COMPONENT::OnCloseTimer for the other end of this
514  // spaghetti noodle.
516  }
517 }
518 
519 
FOOTPRINT_SELECT_WIDGET * m_fp_sel_ctrl
const UTF8 & GetLibItemName() const
Definition: lib_id.h:114
KIWAY & Kiway() const
Function Kiway returns a reference to the KIWAY that this object has an opportunity to participate in...
Definition: kiway_holder.h:56
void FilterByFootprintFilters(wxArrayString const &aFilters, bool aZeroFilters)
Filter by footprint filter list.
std::vector< std::pair< int, wxString > > m_field_edits
void PopulateFootprintSelector(LIB_ID const &aLibId)
Populate the footprint selector for a given alias.
void OnFootprintSelected(wxCommandEvent &aEvent)
std::vector< LIB_PIN * > LIB_PINS
Helper for defining a list of pin object pointers.
Definition: lib_item.h:54
#define SYM_CHOOSER_VSASH
Field object used in symbol libraries.
Definition: lib_field.h:59
SYMBOL_PREVIEW_WIDGET * m_symbol_preview
void SetDefaultFootprint(wxString const &aFp)
Set the default footprint for a part.
wxConfigBase * KifaceSettings() const
Definition: kiface_i.h:103
void ShowFootprint(wxString const &aFootprint)
Display the given footprint by name.
#define SYM_CHOOSER_HSASH
Dialog helper object to sit in the inheritance tree between wxDialog and any class written by wxFormB...
Definition: dialog_shim.h:84
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:51
bool IsValid() const
Definition: lib_id.h:171
void SetStatusText(wxString const &aText)
Set the contents of the status label and display it.
void SetInitialFocus(wxWindow *aWindow)
Sets the window (usually a wxTextCtrl) that should be focused when the dialog is shown.
Definition: dialog_shim.h:115
Field Name Module PCB, i.e. "16DIP300".
void OnComponentPreselected(wxCommandEvent &aEvent)
#define SYM_CHOOSER_USE_UNITS_KEY
void ClearFilters()
Clear all filters.
void OnCharHook(wxKeyEvent &aEvt)
bool UpdateList()
Update the contents of the list to match the filters.
void DisplaySymbol(const LIB_ID &aSymbolID, int aUnit)
Set the currently displayed symbol.
void GetPins(LIB_PINS &aList, int aUnit=0, int aConvert=0)
Return a list of pin object pointers from the draw item list.
static FOOTPRINT_LIST * GetInstance(KIWAY &aKiway)
Factory function to return a FOOTPRINT_LIST via Kiway.
DIALOG_CHOOSE_COMPONENT(SCH_BASE_FRAME *aParent, const wxString &aTitle, SYMBOL_TREE_MODEL_ADAPTER::PTR &aAdapter, int aDeMorganConvert, bool aAllowFieldEdits, bool aShowFootprints, bool aAllowBrowser)
Create dialog to choose component.
void OnInitDialog(wxInitDialogEvent &aEvent)
#define NULL
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:33
void ClearStatus()
Clear the contents of the status label and hide it.
PROJECT & Prj() const
Function Prj returns a reference to the PROJECT "associated with" this KIWAY.
Class LIB_PIN definition.
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
KIFACE_I & Kiface()
Global KIFACE_I "get" accessor.
LIB_ID GetSelectedLibId(int *aUnit=nullptr) const
For multi-unit components, if the user selects the component itself rather than picking an individual...
Definition: lib_tree.cpp:145
Define a library symbol object.
void OnCloseTimer(wxTimerEvent &aEvent)
virtual bool Enable(bool aEnable=true) override
Enable or disable the control for input.
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Definition: lib_id.h:97
#define SYM_CHOOSER_KEEP_SYM_KEY
wxPanel * ConstructRightPanel(wxWindow *aParent)
Definition: hash_eda.h:46
void SetStatusText(wxString const &aText)
Set the contents of the status label and display it.
void OnUseBrowser(wxCommandEvent &aEvent)
wxArrayString GetFootprints() const
#define SYM_CHOOSER_WIDTH_KEY
#define SYM_CHOOSER_HEIGHT_KEY
int VertPixelsFromDU(int y)
Convert an integer number of dialog units to pixels, vertically.
void EndQuasiModal(int retCode)
void CacheFootprint(const LIB_ID &aFPID)
Preload a footprint into the cache.
Holds a list of FOOTPRINT_INFO objects, along with a list of IO_ERRORs or PARSE_ERRORs that were thro...
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
#define _(s)
Definition: 3d_actions.cpp:31
void DisplayFootprint(const LIB_ID &aFPID)
Set the currently displayed footprint.
static constexpr int DblClickDelay
wxString wx_str() const
Definition: utf8.cpp:51
wxString GetFullText(int unit=1) const
Return the text of a field.
Definition: lib_field.cpp:300
FOOTPRINT_PREVIEW_WIDGET * m_fp_preview
void Load(KIWAY &aKiway, PROJECT &aProject)
Start loading.
int HorizPixelsFromDU(int x)
Convert an integer number of dialog units to pixels, horizontally.
void ShowFootprintFor(LIB_ID const &aLibId)
Look up the footprint for a given symbol specified in the LIB_ID and display it.
GAL_TYPE GetBackend() const
Function GetBackend Returns the type of backend currently used by GAL canvas.
wxObjectDataPtr< LIB_TREE_MODEL_ADAPTER > PTR
Reference-counting container for a pointer to CMP_TREE_MODEL_ADAPTER_BASE.
Definition for part library class.
int Parse(const UTF8 &aId, LIB_ID_TYPE aType, bool aFix=false)
Parse LIB_ID with the information from aId.
Definition: lib_id.cpp:122
LIB_FIELD * GetField(int aId) const
Return pointer to the requested field.
bool IsInitialized() const
Return whether the widget initialized properly.
A shim class between EDA_DRAW_FRAME and several derived classes: LIB_EDIT_FRAME, LIB_VIEW_FRAME,...
void OnComponentSelected(wxCommandEvent &aEvent)
Handle the selection of an item.
Struct IO_ERROR is a class used to hold an error message and may be used when throwing exceptions con...
Definition: ki_exception.h:76
LIB_ID GetSelectedLibId(int *aUnit=nullptr) const
To be called after this dialog returns from ShowModal().
void FilterByPinCount(int aPinCount)
Filter by pin count.
Widget displaying a tree of components with optional search text control and description panel.
Definition: lib_tree.h:42