KiCad PCB EDA Suite
Loading...
Searching...
No Matches
dialog_pin_properties.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) 2010 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright The 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
25#include <bitmaps.h>
26#include <sch_painter.h>
27#include <symbol_edit_frame.h>
28#include <sch_pin.h>
30#include <confirm.h>
31#include <kiplatform/ui.h>
33#include <widgets/wx_grid.h>
34#include <grid_tricks.h>
37#include <wx/hyperlink.h>
39
40class ALT_PIN_DATA_MODEL : public WX_GRID_TABLE_BASE, public std::vector<SCH_PIN::ALT>
41{
42public:
44 {
45 }
46
47 int GetNumberRows() override { return (int) size(); }
48 int GetNumberCols() override { return COL_COUNT; }
49
50 wxString GetColLabelValue( int aCol ) override
51 {
52 switch( aCol )
53 {
54 case COL_NAME: return _( "Alternate Pin Name" );
55 case COL_TYPE: return _( "Electrical Type" );
56 case COL_SHAPE: return _( "Graphic Style" );
57 default: wxFAIL; return wxEmptyString;
58 }
59 }
60
61 bool IsEmptyCell( int row, int col ) override
62 {
63 return false; // don't allow adjacent cell overflow, even if we are actually empty
64 }
65
66 wxString GetValue( int aRow, int aCol ) override
67 {
68 switch( aCol )
69 {
70 case COL_NAME: return at( aRow ).m_Name;
71 case COL_TYPE: return PinTypeNames()[static_cast<int>( at( aRow ).m_Type )];
72 case COL_SHAPE: return PinShapeNames()[static_cast<int>( at( aRow ).m_Shape )];
73 default: wxFAIL; return wxEmptyString;
74 }
75 }
76
77 void SetValue( int aRow, int aCol, const wxString &aValue ) override
78 {
79 switch( aCol )
80 {
81 case COL_NAME:
82 at( aRow ).m_Name = aValue;
83 break;
84
85 case COL_TYPE:
86 if( PinTypeNames().Index( aValue ) != wxNOT_FOUND )
87 at( aRow ).m_Type = (ELECTRICAL_PINTYPE) PinTypeNames().Index( aValue );
88
89 break;
90
91 case COL_SHAPE:
92 if( PinShapeNames().Index( aValue ) != wxNOT_FOUND )
93 at( aRow ).m_Shape = (GRAPHIC_PINSHAPE) PinShapeNames().Index( aValue );
94
95 break;
96
97 default:
98 wxFAIL;
99 break;
100 }
101 }
102
103 void AppendRow( const SCH_PIN::ALT& aAlt )
104 {
105 push_back( aAlt );
106
107 if ( GetView() )
108 {
109 wxGridTableMessage msg( this, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, 1 );
110 GetView()->ProcessTableMessage( msg );
111 }
112 }
113
114 void RemoveRow( int aRow )
115 {
116 erase( begin() + aRow );
117
118 if ( GetView() )
119 {
120 wxGridTableMessage msg( this, wxGRIDTABLE_NOTIFY_ROWS_DELETED, aRow, 1 );
121 GetView()->ProcessTableMessage( msg );
122 }
123 }
124};
125
126
128 bool aFocusPinNumber ) :
130 m_frame( parent ),
131 m_pin( aPin ),
132 m_posX( parent, m_posXLabel, m_posXCtrl, m_posXUnits ),
133 m_posY( parent, m_posYLabel, m_posYCtrl, m_posYUnits ),
134 m_pinLength( parent, m_pinLengthLabel, m_pinLengthCtrl, m_pinLengthUnits ),
135 m_nameSize( parent, m_nameSizeLabel, m_nameSizeCtrl, m_nameSizeUnits ),
136 m_numberSize( parent, m_numberSizeLabel, m_numberSizeCtrl, m_numberSizeUnits ),
137 m_delayedFocusRow( -1 ),
138 m_delayedFocusColumn( -1 ),
139 m_initialized( false )
140{
141 // Create a dummy symbol with a single pin for the preview widget:
142 m_dummyParent = new LIB_SYMBOL( *static_cast<LIB_SYMBOL*>( m_pin->GetParentSymbol() ) );
143
144 // Move everything in the copied symbol to unit 1; we'll use unit 2 for the dummy pin:
145 m_dummyParent->SetUnitCount( 2, false );
146 m_dummyParent->RunOnChildren( [&]( SCH_ITEM* child )
147 {
148 child->SetUnit( 1 );
149 },
150 RECURSE_MODE::NO_RECURSE );
151
152 m_dummyPin = new SCH_PIN( *m_pin );
153 m_dummyPin->SetUnit( 2 );
155
158
161
162 m_previewWidget->SetLayoutDirection( wxLayout_LeftToRight );
164
165 wxBoxSizer* previewSizer = new wxBoxSizer( wxHORIZONTAL );
166 previewSizer->Add( m_previewWidget, 1, wxEXPAND, 5 );
167 m_panelShowPin->SetSizer( previewSizer );
168
169 const wxArrayString& orientationNames = PinOrientationNames();
170 const std::vector<BITMAPS>& orientationIcons = PinOrientationIcons();
171
172 for ( unsigned ii = 0; ii < orientationNames.GetCount(); ii++ )
173 m_choiceOrientation->Insert( orientationNames[ii], KiBitmapBundle( orientationIcons[ii] ), ii );
174
175 // We can't set the tab order through wxWidgets due to shortcomings in their mnemonics
176 // implementation on MSW
177 m_tabOrder = {
193 };
194
195 // Default alternates turndown to whether or not alternates exist, or if we've had it open
196 // before
198
199 // wxwidgets doesn't call the OnCollapseChange even at init, so we update this value if
200 // the alternates pane defaults to open
201 if ( m_pin->GetAlternates().size() > 0 )
203
205
206 // Save original columns widths so we can do proportional sizing.
207 for( int i = 0; i < COL_COUNT; ++i )
208 m_originalColWidths[ i ] = m_alternatesGrid->GetColSize( i );
209
211 m_alternatesGrid->PushEventHandler( new GRID_TRICKS( m_alternatesGrid,
212 [this]( wxCommandEvent& aEvent )
213 {
214 OnAddAlternate( aEvent );
215 } ) );
216 m_alternatesGrid->SetSelectionMode( wxGrid::wxGridSelectRows );
217
219 {
220 m_alternatesTurndown->Collapse();
221 m_alternatesTurndown->Disable();
222 m_alternatesTurndown->SetToolTip( _( "Alternate pin assignments are not available for "
223 "De Morgan symbols." ) );
224 }
225
226 // Set special attributes
227 wxGridCellAttr* attr;
228
229 attr = new wxGridCellAttr;
230 attr->SetRenderer( new GRID_CELL_ICON_TEXT_RENDERER( PinTypeIcons(), PinTypeNames() ) );
231 attr->SetEditor( new GRID_CELL_ICON_TEXT_POPUP( PinTypeIcons(), PinTypeNames() ) );
232 m_alternatesGrid->SetColAttr( COL_TYPE, attr );
233
234 attr = new wxGridCellAttr;
235 attr->SetRenderer( new GRID_CELL_ICON_TEXT_RENDERER( PinShapeIcons(), PinShapeNames() ) );
236 attr->SetEditor( new GRID_CELL_ICON_TEXT_POPUP( PinShapeIcons(), PinShapeNames() ) );
237 m_alternatesGrid->SetColAttr( COL_SHAPE, attr );
238
239 m_addAlternate->SetBitmap( KiBitmapBundle( BITMAPS::small_plus ) );
240 m_deleteAlternate->SetBitmap( KiBitmapBundle( BITMAPS::small_trash ) );
241 m_addAlternate->GetParent()->Layout();
242
244
245 SetInitialFocus( aFocusPinNumber ? m_textPinNumber : m_textPinName );
246
247 // We should call FinishDialogSettings() when all widgets have the size fixed.
248 // However m_infoBar is not yet initialized, so it will called later
249 // See TransferDataToWindow()
250
251 // On some window managers (Unity, XFCE) the dialog is not always raised, depending on
252 // how it is run.
253 Raise();
254
255 m_initialized = true;
256}
257
258
260{
261 delete m_dummyParent;
262
263 // Prevents crash bug in wxGrid's d'tor
265
266 // Delete the GRID_TRICKS.
267 m_alternatesGrid->PopEventHandler( true );
268}
269
270
272{
273 if( !DIALOG_SHIM::TransferDataToWindow() )
274 return false;
275
277
281 m_textPinName->SetValue( m_pin->GetName() );
285 m_textPinNumber->SetValue( m_pin->GetNumber() );
289 m_checkApplyToAllParts->SetValue( m_pin->GetParentSymbol()->IsMulti() && m_pin->GetUnit() == 0 );
291 m_checkShow->SetValue( m_pin->IsVisible() );
292
294
295 wxString commonUnitsToolTip;
296
298 {
299 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( m_infoBar, wxID_ANY, _( "Exit sync pins mode" ),
300 wxEmptyString );
301
302 button->Bind( wxEVT_COMMAND_HYPERLINK,
303 std::function<void( wxHyperlinkEvent& aEvent )>(
304 [&]( wxHyperlinkEvent& aEvent )
305 {
306 m_frame->m_SyncPinEdit = false;
308 } ) );
309
311 m_infoBar->AddButton( button );
313
314 commonUnitsToolTip = _( "Synchronized pins mode is enabled.\n"
315 "Similar pins will be edited regardless of this option." );
316 }
317 else
318 {
319 commonUnitsToolTip = _( "If checked, this pin will exist in all units." );
320 }
321
322 if( !m_pin->GetParentSymbol()->IsMulti() )
323 commonUnitsToolTip = _( "This symbol only has one unit. This control has no effect." );
324
325 m_checkApplyToAllParts->SetToolTip( commonUnitsToolTip );
326
327 for( const std::pair<const wxString, SCH_PIN::ALT>& alt : m_pin->GetAlternates() )
328 m_alternatesDataModel->AppendRow( alt.second );
329
330 // We can call FinishDialogSettings() now all widgets have the size fixed.
332
333 return true;
334}
335
336
338{
340 return false;
341
342 // Check for missing alternate names.
343 for( size_t i = 0; i < m_alternatesDataModel->size(); ++i )
344 {
345 if( m_alternatesDataModel->at( i ).m_Name.IsEmpty() )
346 {
347 DisplayErrorMessage( this, _( "Alternate pin definitions must have a name." ) );
348
351
352 return false;
353 }
354 }
355
356 if( !DIALOG_SHIM::TransferDataFromWindow() )
357 return false;
358
360
361 const int standard_grid = 50;
362
363 // Only show the warning if the position has been changed
364 if( ( m_origPos != newPos )
365 && ( ( m_posX.GetValue() % standard_grid ) || ( m_posY.GetValue() % standard_grid ) ) )
366 {
367 wxString msg = wxString::Format( _( "This pin is not on a %d mils grid which will make it "
368 "difficult to connect to in the schematic.\n"
369 "Do you wish to continue?" ),
370 standard_grid );
371 if( !IsOK( this, msg ) )
372 return false;
373 }
374
375 m_pin->SetName( m_textPinName->GetValue() );
376 m_pin->SetNumber( m_textPinNumber->GetValue() );
380 m_pin->SetPosition( newPos );
385 m_pin->SetUnit( m_checkApplyToAllParts->GetValue() ? 0 : m_frame->GetUnit() );
386 m_pin->SetVisible( m_checkShow->GetValue() );
387
388 std::map<wxString, SCH_PIN::ALT>& alternates = m_pin->GetAlternates();
389 alternates.clear();
390
391 for( const SCH_PIN::ALT& alt : *m_alternatesDataModel )
392 alternates[ alt.m_Name ] = alt;
393
394 return true;
395}
396
397
398void DIALOG_PIN_PROPERTIES::OnPropertiesChange( wxCommandEvent& event )
399{
400 if( !IsShownOnScreen() ) // do nothing at init time
401 return;
402
403 m_dummyPin->SetName( m_textPinName->GetValue() );
404 m_dummyPin->SetNumber( m_textPinNumber->GetValue() );
411 m_dummyPin->SetVisible( m_checkShow->GetValue() );
412
413 if( event.GetEventObject() == m_checkApplyToAllParts && m_frame->m_SyncPinEdit )
414 {
416 m_infoBar->GetSizer()->Layout();
417 }
418
420}
421
422
424{
425 if( m_checkApplyToAllParts->GetValue() )
426 return _( "Synchronized Pins Mode." );
427 else if( m_pin->IsNew() )
428 return _( "Synchronized Pins Mode. New pin will be added to all units." );
429 else
430 return _( "Synchronized Pins Mode. Matching pins in other units will be updated." );
431}
432
433
434void DIALOG_PIN_PROPERTIES::OnAddAlternate( wxCommandEvent& event )
435{
437 return;
438
440 [&]() -> std::pair<int, int>
441 {
442 SCH_PIN::ALT newAlt;
443 newAlt.m_Name = wxEmptyString;
444 newAlt.m_Type = m_pin->GetType();
445 newAlt.m_Shape = m_pin->GetShape();
446
448 return { m_alternatesGrid->GetNumberRows() - 1, COL_NAME };
449 } );
450}
451
452
453void DIALOG_PIN_PROPERTIES::OnDeleteAlternate( wxCommandEvent& event )
454{
456 [&]( int row )
457 {
459 } );
460}
461
462
464{
465 // Account for scroll bars
467
468 wxGridUpdateLocker deferRepaintsTillLeavingScope;
469
472
474}
475
476
477void DIALOG_PIN_PROPERTIES::OnSize( wxSizeEvent& event )
478{
479 auto new_size = event.GetSize();
480
481 if( m_initialized && m_size != new_size )
482 {
483 m_size = new_size;
484
486 }
487
488 // Always propagate for a grid repaint (needed if the height changes, as well as width)
489 event.Skip();
490}
491
492
493void DIALOG_PIN_PROPERTIES::OnUpdateUI( wxUpdateUIEvent& event )
494{
495 // Handle a delayed focus
496 if( m_delayedFocusRow >= 0 )
497 {
498 m_alternatesTurndown->Collapse( false );
499
500 m_alternatesGrid->SetFocus();
503
504 m_alternatesGrid->EnableCellEditControl( true );
505 m_alternatesGrid->ShowCellEditControl();
506
509 }
510}
511
512
513void DIALOG_PIN_PROPERTIES::OnCollapsiblePaneChange( wxCollapsiblePaneEvent& event )
514{
515 if( !event.GetCollapsed() )
516 {
517 wxTopLevelWindow* tlw = dynamic_cast<wxTopLevelWindow*>( wxGetTopLevelParent( this ) );
518
519 if( tlw )
520 {
521 tlw->InvalidateBestSize();
522 wxSize bestSize = tlw->GetBestSize();
523 wxSize currentSize = tlw->GetSize();
524 tlw->SetSize( wxMax( bestSize.GetWidth(), currentSize.GetWidth() ),
525 wxMax( bestSize.GetHeight(), currentSize.GetHeight() ) );
526 }
527 }
528}
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
Definition: bitmap.cpp:110
wxString GetColLabelValue(int aCol) override
void SetValue(int aRow, int aCol, const wxString &aValue) override
ALT_PIN_DATA_MODEL(EDA_UNITS aUserUnits)
wxString GetValue(int aRow, int aCol) override
void AppendRow(const SCH_PIN::ALT &aAlt)
bool IsEmptyCell(int row, int col) override
Class DIALOG_PIN_PROPERTIES_BASE.
WX_BITMAP_COMBOBOX * m_choiceOrientation
SYMBOL_EDIT_FRAME * m_frame
void OnUpdateUI(wxUpdateUIEvent &event) override
std::map< int, int > m_originalColWidths
void OnCollapsiblePaneChange(wxCollapsiblePaneEvent &event) override
void OnPropertiesChange(wxCommandEvent &event) override
bool TransferDataToWindow() override
void OnAddAlternate(wxCommandEvent &event) override
SYMBOL_PREVIEW_WIDGET * m_previewWidget
ALT_PIN_DATA_MODEL * m_alternatesDataModel
void OnSize(wxSizeEvent &event) override
DIALOG_PIN_PROPERTIES(SYMBOL_EDIT_FRAME *parent, SCH_PIN *aPin, bool aFocusPinNumber)
bool TransferDataFromWindow() override
void OnDeleteAlternate(wxCommandEvent &event) override
std::vector< wxWindow * > m_tabOrder
Definition: dialog_shim.h:256
void SetInitialFocus(wxWindow *aWindow)
Sets the window (usually a wxTextCtrl) that should be focused when the dialog is shown.
Definition: dialog_shim.h:75
void SetupStandardButtons(std::map< int, wxString > aLabels={})
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
EDA_UNITS GetUserUnits() const
Definition: dialog_shim.h:111
GAL_TYPE GetBackend() const
Return the type of backend currently used by GAL canvas.
bool IsNew() const
Definition: eda_item.h:124
Add mouse and command handling (such as cut, copy, and paste) to a WX_GRID instance.
Definition: grid_tricks.h:61
KIWAY & Kiway() const
Return a reference to the KIWAY that this object has an opportunity to participate in.
Definition: kiway_holder.h:55
Define a library symbol object.
Definition: lib_symbol.h:85
void SetUnitCount(int aCount, bool aDuplicateDrawItems=true)
Set the units per symbol count.
void RunOnChildren(const std::function< void(SCH_ITEM *)> &aFunction, RECURSE_MODE aMode) override
void AddDrawItem(SCH_ITEM *aItem, bool aSort=true)
Add a new draw aItem to the draw object list and sort according to aSort.
Definition: lib_symbol.cpp:785
GRAPHIC_PINSHAPE GetPinShapeSelection()
void SetSelection(GRAPHIC_PINSHAPE aShape)
ELECTRICAL_PINTYPE GetPinTypeSelection()
void SetSelection(ELECTRICAL_PINTYPE aType)
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:168
virtual void SetBodyStyle(int aBodyStyle)
Definition: sch_item.h:247
const SYMBOL * GetParentSymbol() const
Definition: sch_item.cpp:252
int GetBodyStyle() const
Definition: sch_item.h:248
int GetUnit() const
Definition: sch_item.h:239
virtual void SetUnit(int aUnit)
Definition: sch_item.h:238
int GetNumberTextSize() const
Definition: sch_pin.cpp:578
int GetLength() const
Definition: sch_pin.cpp:255
const std::map< wxString, ALT > & GetAlternates() const
Definition: sch_pin.h:133
void SetNumber(const wxString &aNumber)
Definition: sch_pin.cpp:541
void SetVisible(bool aVisible)
Definition: sch_pin.h:113
void ChangeLength(int aLength)
Change the length of a pin and adjust its position based on orientation.
Definition: sch_pin.cpp:1008
void SetOrientation(PIN_ORIENTATION aOrientation)
Definition: sch_pin.h:92
void SetName(const wxString &aName)
Definition: sch_pin.cpp:375
bool IsVisible() const
Definition: sch_pin.cpp:343
void SetPosition(const VECTOR2I &aPos) override
Definition: sch_pin.h:224
const wxString & GetName() const
Definition: sch_pin.cpp:357
void SetLength(int aLength)
Definition: sch_pin.h:98
PIN_ORIENTATION GetOrientation() const
Definition: sch_pin.cpp:220
void SetNumberTextSize(int aSize)
Definition: sch_pin.cpp:592
void SetShape(GRAPHIC_PINSHAPE aShape)
Definition: sch_pin.h:95
VECTOR2I GetPosition() const override
Definition: sch_pin.cpp:212
int GetNameTextSize() const
Definition: sch_pin.cpp:554
void SetType(ELECTRICAL_PINTYPE aType)
Definition: sch_pin.cpp:289
const wxString & GetNumber() const
Definition: sch_pin.h:123
GRAPHIC_PINSHAPE GetShape() const
Definition: sch_pin.cpp:234
ELECTRICAL_PINTYPE GetType() const
Definition: sch_pin.cpp:269
void SetNameTextSize(int aSize)
Definition: sch_pin.cpp:568
void SetBitmap(const wxBitmapBundle &aBmp)
The symbol library editor main window.
int GetBodyStyle() const
bool m_SyncPinEdit
Set to true to synchronize pins at the same position when editing symbols with multiple units or mult...
void DisplayPart(LIB_SYMBOL *aSymbol, int aUnit, int aBodyStyle=0)
virtual bool IsMulti() const =0
virtual void SetShowPinNumbers(bool aShow)
Set or clear the pin number visibility flag.
Definition: symbol.h:164
virtual void SetShowPinNames(bool aShow)
Set or clear the pin name visibility flag.
Definition: symbol.h:158
virtual bool HasAlternateBodyStyle() const =0
Test if symbol has more than one body conversion type (DeMorgan).
int GetIntValue()
Definition: unit_binder.h:134
virtual long long int GetValue()
Return the current value in Internal Units.
virtual void SetValue(long long int aValue)
Set new value (in Internal Units) for the text field, taking care of units conversion.
void SetTable(wxGridTableBase *table, bool aTakeOwnership=false)
Hide wxGrid's SetTable() method with one which doesn't mess up the grid column widths when setting th...
Definition: wx_grid.cpp:273
void DestroyTable(wxGridTableBase *aTable)
Work-around for a bug in wxGrid which crashes when deleting the table if the cell edit control was no...
Definition: wx_grid.cpp:450
void OnDeleteRows(const std::function< void(int row)> &aDeleter)
Handles a row deletion event.
Definition: wx_grid.cpp:704
void OnAddRow(const std::function< std::pair< int, int >()> &aAdder)
Definition: wx_grid.cpp:684
bool CommitPendingChanges(bool aQuietMode=false)
Close any open cell edit controls.
Definition: wx_grid.cpp:632
void RemoveAllButtons()
Remove all the buttons that have been added by the user.
Definition: wx_infobar.cpp:371
void AddButton(wxButton *aButton)
Add an already created button to the infobar.
Definition: wx_infobar.cpp:327
void Dismiss() override
Dismisses the infobar and updates the containing layout and AUI manager (if one is provided).
Definition: wx_infobar.cpp:192
void ShowMessage(const wxString &aMessage, int aFlags=wxICON_INFORMATION) override
Show the info bar with the provided message and icon.
Definition: wx_infobar.cpp:156
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
Definition: confirm.cpp:251
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition: confirm.cpp:194
This file is part of the common library.
#define _(s)
EDA_UNITS
Definition: eda_units.h:48
wxSize GetUnobscuredSize(const wxWindow *aWindow)
Tries to determine the size of the viewport of a scrollable widget (wxDataViewCtrl,...
Definition: wxgtk/ui.cpp:258
const std::vector< BITMAPS > & PinTypeIcons()
Definition: pin_type.cpp:167
ELECTRICAL_PINTYPE
The symbol library pin object electrical types used in ERC tests.
Definition: pin_type.h:36
const wxArrayString & PinTypeNames()
Definition: pin_type.cpp:158
int PinOrientationIndex(PIN_ORIENTATION code)
Definition: pin_type.cpp:70
const wxArrayString & PinShapeNames()
Definition: pin_type.cpp:176
const std::vector< BITMAPS > & PinShapeIcons()
Definition: pin_type.cpp:185
const wxArrayString & PinOrientationNames()
Definition: pin_type.cpp:194
PIN_ORIENTATION PinOrientationCode(size_t index)
Definition: pin_type.cpp:63
const std::vector< BITMAPS > & PinOrientationIcons()
Definition: pin_type.cpp:203
GRAPHIC_PINSHAPE
Definition: pin_type.h:84
wxString m_Name
Definition: sch_pin.h:44
GRAPHIC_PINSHAPE m_Shape
Definition: sch_pin.h:45
ELECTRICAL_PINTYPE m_Type
Definition: sch_pin.h:46
Functions for manipulating tab traversal in forms and dialogs.