KiCad PCB EDA Suite
Loading...
Searching...
No Matches
symbol_edit_frame.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) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright (C) 2008 Wayne Stambaugh <[email protected]>
6 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, you may find one here:
20 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21 * or you may search the http://www.gnu.org website for the version 2 license,
22 * or you may write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24 */
25
26#include <bitmaps.h>
27#include <wx/hyperlink.h>
28#include <base_screen.h>
29#include <symbol_library.h>
30#include <confirm.h>
31#include <core/kicad_algo.h>
32#include <eeschema_id.h>
33#include <eeschema_settings.h>
34#include <env_paths.h>
36#include <kidialog.h>
37#include <kiface_base.h>
38#include <kiplatform/app.h>
39#include <kiway_express.h>
40#include <symbol_edit_frame.h>
43#include <paths.h>
44#include <pgm_base.h>
45#include <project_sch.h>
46#include <sch_painter.h>
47#include <sch_view.h>
49#include <symbol_lib_table.h>
51#include <tool/action_manager.h>
52#include <tool/action_toolbar.h>
53#include <tool/common_control.h>
54#include <tool/common_tools.h>
56#include <tool/embed_tool.h>
58#include <tool/picker_tool.h>
60#include <tool/selection.h>
62#include <tool/tool_manager.h>
63#include <tool/zoom_tool.h>
64#include <tools/sch_actions.h>
74#include <view/view_controls.h>
76#include <widgets/wx_infobar.h>
83#include <panel_sym_lib_table.h>
84#include <string_utils.h>
85#include <wx/msgdlg.h>
86#include <wx/log.h>
87
88
90
91
92BEGIN_EVENT_TABLE( SYMBOL_EDIT_FRAME, SCH_BASE_FRAME )
94
95 // menubar commands
96 EVT_MENU( wxID_EXIT, SYMBOL_EDIT_FRAME::OnExitKiCad )
97 EVT_MENU( wxID_CLOSE, SYMBOL_EDIT_FRAME::CloseWindow )
98
99 // Update user interface elements.
101
102 // Drop files event
103 EVT_DROP_FILES( SYMBOL_EDIT_FRAME::OnDropFiles )
104
105END_EVENT_TABLE()
106
107
108SYMBOL_EDIT_FRAME::SYMBOL_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
109 SCH_BASE_FRAME( aKiway, aParent, FRAME_SCH_SYMBOL_EDITOR, _( "Library Editor" ),
110 wxDefaultPosition, wxDefaultSize, KICAD_DEFAULT_DRAWFRAME_STYLE,
112 m_unitSelectBox( nullptr ),
113 m_isSymbolFromSchematic( false )
114{
115 SetShowDeMorgan( false );
116 m_SyncPinEdit = false;
117
118 m_symbol = nullptr;
119 m_treePane = nullptr;
120 m_libMgr = nullptr;
121 m_unit = 1;
122 m_bodyStyle = 1;
123 m_aboutTitle = _HKI( "KiCad Symbol Editor" );
124
125 wxIcon icon;
126 wxIconBundle icon_bundle;
127
128 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit, 48 ) );
129 icon_bundle.AddIcon( icon );
130 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit, 256 ) );
131 icon_bundle.AddIcon( icon );
132 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit, 128 ) );
133 icon_bundle.AddIcon( icon );
134 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit_32 ) );
135 icon_bundle.AddIcon( icon );
136 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit_16 ) );
137 icon_bundle.AddIcon( icon );
138
139 SetIcons( icon_bundle );
140
141 m_settings = Pgm().GetSettingsManager().GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" );
142 LoadSettings( m_settings );
143
144 m_libMgr = new LIB_SYMBOL_LIBRARY_MANAGER( *this );
145 bool loadingCancelled = false;
146
147 {
148 // Preload libraries before using SyncLibraries the first time, as the preload is
149 // multi-threaded
150 WX_PROGRESS_REPORTER reporter( this, _( "Loading Symbol Libraries" ),
151 m_libMgr->GetLibraryCount(), true );
152 m_libMgr->Preload( reporter );
153
154 loadingCancelled = reporter.IsCancelled();
155 wxSafeYield();
156 }
157
158 SyncLibraries( false, loadingCancelled );
159 m_treePane = new SYMBOL_TREE_PANE( this, m_libMgr );
160 m_treePane->GetLibTree()->SetSortMode( (LIB_TREE_MODEL_ADAPTER::SORT_MODE) m_settings->m_LibrarySortMode );
161
162 resolveCanvasType();
163 SwitchCanvas( m_canvasType );
164
165 // Ensure axis are always drawn
166 KIGFX::GAL_DISPLAY_OPTIONS& gal_opts = GetGalDisplayOptions();
167 gal_opts.m_axesEnabled = true;
168
169 m_dummyScreen = new SCH_SCREEN();
170 SetScreen( m_dummyScreen );
171 GetScreen()->m_Center = true;
172
173 GetCanvas()->GetViewControls()->SetCrossHairCursorPosition( VECTOR2D( 0, 0 ), false );
174
175 GetRenderSettings()->LoadColors( GetColorSettings() );
176 GetRenderSettings()->m_IsSymbolEditor = true;
177 GetCanvas()->GetGAL()->SetAxesColor( m_colorSettings->GetColor( LAYER_SCHEMATIC_GRID_AXES ) );
178
179 setupTools();
180 setupUIConditions();
181
182 ReCreateMenuBar();
183
184 m_toolbarSettings = Pgm().GetSettingsManager().GetToolbarSettings<SYMBOL_EDIT_TOOLBAR_SETTINGS>( "symbol_editor-toolbars" );
185 configureToolbars();
186 RecreateToolbars();
187
188 UpdateTitle();
189 UpdateSymbolMsgPanelInfo();
190 RebuildSymbolUnitsList();
191
192 m_propertiesPanel = new SCH_PROPERTIES_PANEL( this, this );
193 m_propertiesPanel->SetSplitterProportion( m_settings->m_AuiPanels.properties_splitter );
194
195 m_selectionFilterPanel = new PANEL_SCH_SELECTION_FILTER( this );
196
197 m_auimgr.SetManagedWindow( this );
198
199 CreateInfoBar();
200
201 // Rows; layers 4 - 6
202 m_auimgr.AddPane( m_tbTopMain, EDA_PANE().HToolbar().Name( "TopMainToolbar" )
203 .Top().Layer( 6 ) );
204
205 m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( "MsgPanel" )
206 .Bottom().Layer( 6 ) );
207
208 // Columns; layers 1 - 3
209 m_auimgr.AddPane( m_treePane, EDA_PANE().Palette().Name( "LibraryTree" )
210 .Left().Layer( 3 )
211 .TopDockable( false ).BottomDockable( false )
212 .Caption( _( "Libraries" ) )
213 .MinSize( FromDIP( 250 ), -1 ).BestSize( FromDIP( 250 ), -1 ) );
214
215 m_auimgr.AddPane( m_propertiesPanel, defaultPropertiesPaneInfo( this ) );
216 // Show or hide m_propertiesPanel depending on current settings:
217 wxAuiPaneInfo& propertiesPaneInfo = m_auimgr.GetPane( PropertiesPaneName() );
218
219 m_auimgr.AddPane( m_selectionFilterPanel, defaultSchSelectionFilterPaneInfo( this ) );
220
221 wxAuiPaneInfo& selectionFilterPane = m_auimgr.GetPane( wxS( "SelectionFilter" ) );
222 // The selection filter doesn't need to grow in the vertical direction when docked
223 selectionFilterPane.dock_proportion = 0;
224
225 propertiesPaneInfo.Show( m_settings->m_AuiPanels.show_properties );
226 updateSelectionFilterVisbility();
227
228 m_auimgr.AddPane( m_tbLeft, EDA_PANE().VToolbar().Name( "LeftToolbar" )
229 .Left().Layer( 2 ) );
230
231 m_auimgr.AddPane( m_tbRight, EDA_PANE().VToolbar().Name( "RightToolbar" )
232 .Right().Layer( 2 ) );
233
234 // Center
235 m_auimgr.AddPane( GetCanvas(), wxAuiPaneInfo().Name( "DrawFrame" )
236 .CentrePane() );
237
238 FinishAUIInitialization();
239
240 // Can't put this in LoadSettings, because it has to be called before setupTools :/
241 SCH_SELECTION_TOOL* selTool = GetToolManager()->GetTool<SCH_SELECTION_TOOL>();
242 selTool->GetFilter() = GetSettings()->m_SelectionFilter;
243 m_selectionFilterPanel->SetCheckboxesFromFilter( selTool->GetFilter() );
244
245 if( m_settings->m_LibWidth > 0 )
246 SetAuiPaneSize( m_auimgr, m_auimgr.GetPane( "LibraryTree" ), m_settings->m_LibWidth, -1 );
247
248 Raise();
249 Show( true );
250
251 SyncView();
252 GetCanvas()->GetView()->UseDrawPriority( true );
253 GetCanvas()->GetGAL()->SetAxesEnabled( true );
254
255 setupUnits( m_settings );
256
257 // Set the working/draw area size to display a symbol to a reasonable value:
258 // A 600mm x 600mm with a origin at the area center looks like a large working area
259 double max_size_x = schIUScale.mmToIU( 600 );
260 double max_size_y = schIUScale.mmToIU( 600 );
261 BOX2D bbox;
262 bbox.SetOrigin( -max_size_x /2, -max_size_y/2 );
263 bbox.SetSize( max_size_x, max_size_y );
264 GetCanvas()->GetView()->SetBoundary( bbox );
265
266 m_toolManager->RunAction( ACTIONS::zoomFitScreen );
267
269 DragAcceptFiles( true );
270
271 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "Library changes are unsaved" ) );
272
273 // Catch unhandled accelerator command characters that were no handled by the library tree
274 // panel.
275 Bind( wxEVT_CHAR, &TOOL_DISPATCHER::DispatchWxEvent, m_toolDispatcher );
276 Bind( wxEVT_CHAR_HOOK, &TOOL_DISPATCHER::DispatchWxEvent, m_toolDispatcher );
277
278 // Ensure the window is on top
279 Raise();
280
281 if( loadingCancelled )
282 ShowInfoBarWarning( _( "Symbol library loading was cancelled by user." ) );
283}
284
285
287{
288 // Shutdown all running tools
289 if( m_toolManager )
291
292 setSymWatcher( nullptr );
293
295 {
296 delete m_symbol;
297 m_symbol = nullptr;
298
299 SCH_SCREEN* screen = GetScreen();
300 delete screen;
302 }
303
304 // current screen is destroyed in EDA_DRAW_FRAME
306
308 SYMBOL_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" );
309
310 if( cfg )
311 mgr.Save( cfg );
312
313 delete m_libMgr;
314}
315
316
318{
319 wxCHECK_RET( m_settings, "Call to SYMBOL_EDIT_FRAME::LoadSettings with null m_boardAdapter" );
320
322
327 GetRenderSettings()->SetDefaultFont( wxEmptyString );
328}
329
330
332{
333 wxCHECK_RET( m_settings, "Call to SYMBOL_EDIT_FRAME::LoadSettings with null m_boardAdapter" );
334
336
338
343
344 m_settings->m_LibWidth = m_treePane->GetSize().x;
345
347
349 bool prop_shown = m_auimgr.GetPane( PropertiesPaneName() ).IsShown();
351
354}
355
356
358{
359 return static_cast<APP_SETTINGS_BASE*>( GetSettings() );
360}
361
362
364{
366
367 if( GetSettings()->m_UseEeschemaColorSettings )
368 return mgr.GetColorSettings( mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" )->m_ColorTheme );
369 else
370 return mgr.GetColorSettings( GetSettings()->m_ColorTheme );
371}
372
373
375{
376 // Create the manager and dispatcher & route draw panel events to the dispatcher
379 GetCanvas()->GetViewControls(), GetSettings(), this );
380 m_actions = new SCH_ACTIONS();
382
383 // Register tools
400
401 // Run the selection tool, it is supposed to be always active
402 m_toolManager->InvokeTool( "eeschema.InteractiveSelection" );
403
405}
406
407
409{
411
413 EDITOR_CONDITIONS cond( this );
414
415 wxASSERT( mgr );
416
417#define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
418#define CHECK( x ) ACTION_CONDITIONS().Check( x )
419
420 auto haveSymbolCond =
421 [this]( const SELECTION& )
422 {
423 return m_symbol;
424 };
425
426 auto isEditableCond =
427 [this]( const SELECTION& )
428 {
429 // Only root symbols from the new s-expression libraries or the schematic
430 // are editable.
431 return IsSymbolEditable() && !IsSymbolAlias();
432 };
433
434 auto isEditableInAliasCond =
435 [this]( const SELECTION& )
436 {
437 // Less restrictive than isEditableCond
438 // Symbols fields (root symbols and aliases) from the new s-expression libraries
439 // or in the schematic are editable.
440 return IsSymbolEditable();
441 };
442
443 auto symbolModifiedCondition =
444 [this]( const SELECTION& sel )
445 {
448 };
449
450 auto libSelectedCondition =
451 [this]( const SELECTION& sel )
452 {
453 return !GetTargetLibId().GetLibNickname().empty();
454 };
455
456 auto canEditProperties =
457 [this]( const SELECTION& sel )
458 {
460 };
461
462 auto saveSymbolAsCondition =
463 [this]( const SELECTION& aSel )
464 {
465 return getTargetSymbol() != nullptr;
466 };
467
468 const auto isSymbolFromSchematicCond =
469 [this]( const SELECTION& )
470 {
471 return IsSymbolFromSchematic();
472 };
473
474 // clang-format off
477 mgr->SetConditions( SCH_ACTIONS::saveLibraryAs, ENABLE( libSelectedCondition ) );
478 mgr->SetConditions( SCH_ACTIONS::saveSymbolAs, ENABLE( saveSymbolAsCondition ) );
479 mgr->SetConditions( SCH_ACTIONS::saveSymbolCopyAs, ENABLE( saveSymbolAsCondition ) );
482 mgr->SetConditions( SCH_ACTIONS::editLibSymbolWithLibEdit, ENABLE( isSymbolFromSchematicCond ) );
483
484 mgr->SetConditions( ACTIONS::undo, ENABLE( haveSymbolCond && cond.UndoAvailable() ) );
485 mgr->SetConditions( ACTIONS::redo, ENABLE( haveSymbolCond && cond.RedoAvailable() ) );
486 mgr->SetConditions( ACTIONS::revert, ENABLE( symbolModifiedCondition ) );
487
491 mgr->SetConditions( ACTIONS::millimetersUnits, CHECK( cond.Units( EDA_UNITS::MM ) ) );
492 mgr->SetConditions( ACTIONS::inchesUnits, CHECK( cond.Units( EDA_UNITS::INCH ) ) );
493 mgr->SetConditions( ACTIONS::milsUnits, CHECK( cond.Units( EDA_UNITS::MILS ) ) );
494
495 mgr->SetConditions( ACTIONS::cut, ENABLE( isEditableCond ) );
496 mgr->SetConditions( ACTIONS::copy, ENABLE( haveSymbolCond ) );
497 mgr->SetConditions( ACTIONS::copyAsText, ENABLE( haveSymbolCond ) );
498 mgr->SetConditions( ACTIONS::paste, ENABLE( isEditableCond &&
500 mgr->SetConditions( ACTIONS::doDelete, ENABLE( isEditableCond ) );
501 mgr->SetConditions( ACTIONS::duplicate, ENABLE( isEditableCond ) );
502 mgr->SetConditions( ACTIONS::selectAll, ENABLE( haveSymbolCond ) );
503 mgr->SetConditions( ACTIONS::unselectAll, ENABLE( haveSymbolCond ) );
504
505 // These actions in symbol editor when editing alias field rotations are allowed.
506 mgr->SetConditions( SCH_ACTIONS::rotateCW, ENABLE( isEditableInAliasCond ) );
507 mgr->SetConditions( SCH_ACTIONS::rotateCCW, ENABLE( isEditableInAliasCond ) );
508
509 mgr->SetConditions( SCH_ACTIONS::mirrorH, ENABLE( isEditableCond ) );
510 mgr->SetConditions( SCH_ACTIONS::mirrorV, ENABLE( isEditableCond ) );
511
514 // clang-format on
515
516 auto pinTypeCond =
517 [this]( const SELECTION& )
518 {
520 };
521
522 auto hiddenPinCond =
523 [this]( const SELECTION& )
524 {
526 };
527
528 auto hiddenFieldCond =
529 [this]( const SELECTION& )
530 {
532 };
533
534 auto showPinAltIconsCond =
535 [this]( const SELECTION& )
536 {
538 };
539
540 auto showLibraryTreeCond =
541 [this]( const SELECTION& )
542 {
543 return IsLibraryTreeShown();
544 };
545
546 auto propertiesCond =
547 [this] ( const SELECTION& )
548 {
549 return m_auimgr.GetPane( PropertiesPaneName() ).IsShown();
550 };
551
554 mgr->SetConditions( ACTIONS::showLibraryTree, CHECK( showLibraryTreeCond ) );
555 mgr->SetConditions( ACTIONS::showProperties, CHECK( propertiesCond ) );
556 mgr->SetConditions( SCH_ACTIONS::showHiddenPins, CHECK( hiddenPinCond ) );
557 mgr->SetConditions( SCH_ACTIONS::showHiddenFields, CHECK( hiddenFieldCond ) );
558 mgr->SetConditions( SCH_ACTIONS::togglePinAltIcons, CHECK( showPinAltIconsCond ) );
559
560 auto demorganCond =
561 [this]( const SELECTION& )
562 {
563 return GetShowDeMorgan();
564 };
565
566 auto demorganStandardCond =
567 [this]( const SELECTION& )
568 {
569 return m_bodyStyle == BODY_STYLE::BASE;
570 };
571
572 auto demorganAlternateCond =
573 [this]( const SELECTION& )
574 {
575 return m_bodyStyle == BODY_STYLE::DEMORGAN;
576 };
577
578 auto multiUnitModeCond =
579 [this]( const SELECTION& )
580 {
581 return m_symbol && m_symbol->IsMulti() && !m_symbol->UnitsLocked();
582 };
583
584 auto hasMultipleUnitsCond =
585 [this]( const SELECTION& )
586 {
587 return m_symbol && m_symbol->IsMulti();
588 };
589
590 auto syncedPinsModeCond =
591 [this]( const SELECTION& )
592 {
593 return m_SyncPinEdit;
594 };
595
596 auto haveDatasheetCond =
597 [this]( const SELECTION& )
598 {
599 return m_symbol && !m_symbol->GetDatasheetField().GetText().IsEmpty();
600 };
601
602 mgr->SetConditions( ACTIONS::showDatasheet, ENABLE( haveDatasheetCond ) );
603 mgr->SetConditions( SCH_ACTIONS::symbolProperties, ENABLE( canEditProperties && haveSymbolCond ) );
604 mgr->SetConditions( SCH_ACTIONS::runERC, ENABLE( haveSymbolCond ) );
605 mgr->SetConditions( SCH_ACTIONS::pinTable, ENABLE( isEditableCond && haveSymbolCond ) );
606
607 mgr->SetConditions( SCH_ACTIONS::showDeMorganStandard, ACTION_CONDITIONS().Enable( demorganCond ).Check( demorganStandardCond ) );
608 mgr->SetConditions( SCH_ACTIONS::showDeMorganAlternate, ACTION_CONDITIONS().Enable( demorganCond ).Check( demorganAlternateCond ) );
609 mgr->SetConditions( SCH_ACTIONS::toggleSyncedPinsMode, ACTION_CONDITIONS().Enable( multiUnitModeCond ).Check( syncedPinsModeCond ) );
610 mgr->SetConditions( SCH_ACTIONS::setUnitDisplayName, ACTION_CONDITIONS().Enable( isEditableCond && hasMultipleUnitsCond ) );
611
612// Only enable a tool if the symbol is edtable
613#define EDIT_TOOL( tool ) ACTION_CONDITIONS().Enable( isEditableCond ).Check( cond.CurrentTool( tool ) )
614
627
628#undef CHECK
629#undef ENABLE
630#undef EDIT_TOOL
631}
632
633
635{
636 if( IsContentModified() )
637 {
638 SCH_EDIT_FRAME* schframe = (SCH_EDIT_FRAME*) Kiway().Player( FRAME_SCH, false );
639 wxString msg = _( "Save changes to '%s' before closing?" );
640
641 switch( UnsavedChangesDialog( this, wxString::Format( msg, m_reference ), nullptr ) )
642 {
643 case wxID_YES:
644 if( schframe && GetCurSymbol() ) // Should be always the case
646
647 break;
648
649 case wxID_NO:
650 break;
651
652 default:
653 case wxID_CANCEL:
654 return false;
655 }
656 }
657
658 if( doClose )
659 {
660 SetCurSymbol( nullptr, false );
661 UpdateTitle();
662 }
663
664 return true;
665}
666
667
668bool SYMBOL_EDIT_FRAME::canCloseWindow( wxCloseEvent& aEvent )
669{
670 // Shutdown blocks must be determined and vetoed as early as possible
672 && aEvent.GetId() == wxEVT_QUERY_END_SESSION
673 && IsContentModified() )
674 {
675 return false;
676 }
677
679 return false;
680
681 if( !saveAllLibraries( true ) )
682 return false;
683
684 // Save symbol tree column widths
685 m_libMgr->GetAdapter()->SaveSettings();
686
687 return true;
688}
689
690
692{
693 Destroy();
694}
695
696
698{
699 if( !m_unitSelectBox )
700 return;
701
702 if( m_unitSelectBox->GetCount() != 0 )
703 m_unitSelectBox->Clear();
704
705 if( !m_symbol || m_symbol->GetUnitCount() <= 1 )
706 {
707 m_unit = 1;
708 m_unitSelectBox->Append( wxEmptyString );
709 }
710 else
711 {
712 for( int i = 0; i < m_symbol->GetUnitCount(); i++ )
713 {
714 wxString unitDisplayName = m_symbol->GetUnitDisplayName( i + 1 );
715 m_unitSelectBox->Append( unitDisplayName );
716 }
717 }
718
719 // Ensure the selected unit is compatible with the number of units of the current symbol:
721 m_unit = 1;
722
723 m_unitSelectBox->SetSelection(( m_unit > 0 ) ? m_unit - 1 : 0 );
724}
725
726
728{
729 if( !m_propertiesPanel )
730 return;
731
732 bool show = !m_propertiesPanel->IsShownOnScreen();
733
734 wxAuiPaneInfo& propertiesPaneInfo = m_auimgr.GetPane( PropertiesPaneName() );
735 propertiesPaneInfo.Show( show );
737
738 if( show )
739 {
740 SetAuiPaneSize( m_auimgr, propertiesPaneInfo,
742 }
743 else
744 {
746 }
747
748 m_auimgr.Update();
749 Refresh();
750}
751
752
754{
755 wxAuiPaneInfo& treePane = m_auimgr.GetPane( m_treePane );
756 treePane.Show( !IsLibraryTreeShown() );
758 m_auimgr.Update();
759 Refresh();
760}
761
762
764{
765 return const_cast<wxAuiManager&>( m_auimgr ).GetPane( m_treePane ).IsShown();
766}
767
768
770{
772}
773
774
776{
777 m_treePane->Freeze();
778 m_libMgr->GetAdapter()->Freeze();
779}
780
781
783{
784 m_libMgr->GetAdapter()->Thaw();
785 m_treePane->Thaw();
786}
787
788
789void SYMBOL_EDIT_FRAME::OnExitKiCad( wxCommandEvent& event )
790{
791 Kiway().OnKiCadExit();
792}
793
794
795void SYMBOL_EDIT_FRAME::OnUpdateUnitNumber( wxUpdateUIEvent& event )
796{
797 event.Enable( m_symbol && m_symbol->GetUnitCount() > 1 );
798}
799
800
801void SYMBOL_EDIT_FRAME::OnSelectUnit( wxCommandEvent& event )
802{
803 int i = event.GetSelection();
804
805 if( i == wxNOT_FOUND )
806 return;
807
808 SetUnit( i + 1 );
809}
810
811
813{
814 if( m_symbol )
815 {
817
818 if( row && row->GetType() == SCH_IO_MGR::ShowType( SCH_IO_MGR::SCH_LEGACY ) )
819 return true;
820 }
821
822 return false;
823}
824
825
827{
828 wxString libNickname = Prj().GetRString( PROJECT::SCH_LIBEDIT_CUR_LIB );
829
830 if( !libNickname.empty() )
831 {
832 if( !PROJECT_SCH::SchSymbolLibTable( &Prj() )->HasLibrary( libNickname ) )
833 {
834 Prj().SetRString( PROJECT::SCH_LIBEDIT_CUR_LIB, wxEmptyString );
835 libNickname = wxEmptyString;
836 }
837 }
838
839 return libNickname;
840}
841
842
843wxString SYMBOL_EDIT_FRAME::SetCurLib( const wxString& aLibNickname )
844{
845 wxString old = GetCurLib();
846
847 if( aLibNickname.empty() || !PROJECT_SCH::SchSymbolLibTable( &Prj() )->HasLibrary( aLibNickname ) )
848 Prj().SetRString( PROJECT::SCH_LIBEDIT_CUR_LIB, wxEmptyString );
849 else
851
852 return old;
853}
854
855
856void SYMBOL_EDIT_FRAME::SetCurSymbol( LIB_SYMBOL* aSymbol, bool aUpdateZoom )
857{
858 wxCHECK( m_toolManager, /* void */ );
859
861 GetCanvas()->GetView()->Clear();
862 delete m_symbol;
863
864 m_symbol = aSymbol;
865
866 // select the current symbol in the tree widget
869 else
870 GetLibTree()->Unselect();
871
872 wxString symbolName;
873 wxString libName;
874
875 if( m_symbol )
876 {
877 symbolName = m_symbol->GetName();
879 }
880
881 // retain in case this wxFrame is re-opened later on the same PROJECT
883
884 // Ensure synchronized pin edit can be enabled only symbols with interchangeable units
885 m_SyncPinEdit = aSymbol && aSymbol->IsRoot() && aSymbol->IsMulti() && !aSymbol->UnitsLocked();
886
888
896
897 if( aUpdateZoom )
899
900 GetCanvas()->Refresh();
901
902 WX_INFOBAR& infobar = *GetInfoBar();
903 infobar.RemoveAllButtons();
904
905 wxArrayString msgs;
906 int infobarFlags = wxICON_INFORMATION;
907
909 {
910 msgs.push_back( wxString::Format( _( "Editing symbol %s from schematic. Saving will "
911 "update the schematic only." ),
912 m_reference ) );
913
914 wxString link = wxString::Format( _( "Open symbol from library %s" ), libName );
915 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( &infobar, wxID_ANY, link, wxEmptyString );
916
917 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
918 [this, symbolName, libName]( wxHyperlinkEvent& aEvent )
919 {
921 } ) );
922
923 infobar.AddButton( button );
924 }
925 else if( IsSymbolFromLegacyLibrary() )
926 {
927 msgs.push_back( _( "Symbols in legacy libraries are not editable. Use Manage Symbol "
928 "Libraries to migrate to current format." ) );
929
930 wxString link = _( "Manage symbol libraries" );
931 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( &infobar, wxID_ANY, link, wxEmptyString );
932
933 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
934 [this]( wxHyperlinkEvent& aEvent )
935 {
937 } ) );
938
939 infobar.AddButton( button );
940 }
941 else if( IsSymbolAlias() )
942 {
943 msgs.push_back( wxString::Format( _( "Symbol %s is a derived symbol. Symbol graphics will "
944 "not be editable." ),
945 UnescapeString( symbolName ) ) );
946
947 // Don't assume the parent symbol shared pointer is still valid.
948 if( std::shared_ptr<LIB_SYMBOL> rootSymbol = m_symbol->GetRootSymbol() )
949 {
950 int unit = GetUnit();
951 int bodyStyle = GetBodyStyle();
952 wxString rootSymbolName = rootSymbol->GetName();
953 wxString link = wxString::Format( _( "Open %s" ), UnescapeString( rootSymbolName ) );
954
955 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( &infobar, wxID_ANY, link,
956 wxEmptyString );
957
958 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
959 [this, rootSymbolName, unit, bodyStyle]( wxHyperlinkEvent& aEvent )
960 {
961 LoadSymbolFromCurrentLib( rootSymbolName, unit, bodyStyle );
962 } ) );
963
964 infobar.AddButton( button );
965 }
966 }
967
968 if( m_symbol
971 {
972 msgs.push_back( _( "Library is read-only. Changes cannot be saved to this library." ) );
973
974 wxString link = wxString::Format( _( "Create an editable copy" ) );
975 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( &infobar, wxID_ANY, link, wxEmptyString );
976
977 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
978 [this, symbolName, libName]( wxHyperlinkEvent& aEvent )
979 {
980 wxString msg = wxString::Format( _( "Create an editable copy of the symbol or "
981 "the entire library (%s)?" ),
982 libName );
983
984 KIDIALOG errorDlg( this, msg, _( "Select type of item to save" ),
985 wxYES_NO | wxCANCEL | wxICON_QUESTION );
986 // These buttons are in a weird order(?)
987 errorDlg.SetYesNoCancelLabels( _( "Copy symbol" ), _( "Cancel" ),
988 _( "Copy library" ) );
989
990 int choice = errorDlg.ShowModal();
991
992 switch( choice )
993 {
994 case wxID_YES:
995 SaveSymbolCopyAs( true );
996 break;
997 case wxID_CANCEL:
999 break;
1000 default:
1001 // Do nothing
1002 break;
1003 }
1004 } ) );
1005
1006 infobar.AddButton( button );
1007 }
1008
1009 if( msgs.empty() )
1010 {
1011 infobar.Dismiss();
1012 }
1013 else
1014 {
1015 wxString msg = wxJoin( msgs, '\n', '\0' );
1016 infobar.ShowMessage( msg, infobarFlags );
1017 }
1018}
1019
1020
1022{
1023 wxASSERT( m_libMgr );
1024 return *m_libMgr;
1025}
1026
1027
1029{
1031
1033 m_autoSaveRequired = true;
1034
1035 if( !IsSymbolFromSchematic() )
1037
1039
1040 if( !GetTitle().StartsWith( "*" ) )
1041 UpdateTitle();
1042}
1043
1044
1046{
1047 wxCHECK( aUnit > 0 && aUnit <= GetCurSymbol()->GetUnitCount(), /* void*/ );
1048
1049 if( m_unit == aUnit )
1050 return;
1051
1054
1055 m_unit = aUnit;
1056
1057 if( m_unitSelectBox->GetSelection() != ( m_unit - 1 ) )
1058 m_unitSelectBox->SetSelection( m_unit - 1 );
1059
1061 RebuildView();
1063}
1064
1065
1067{
1069}
1070
1071
1072wxString SYMBOL_EDIT_FRAME::AddLibraryFile( bool aCreateNew )
1073{
1074 // Select the target library table (global/project)
1075 SYMBOL_LIB_TABLE* libTable = SelectSymLibTable();
1076
1077 if( !libTable )
1078 return wxEmptyString;
1079
1080 wxFileName fn = m_libMgr->GetUniqueLibraryName();
1081
1084 ( libTable == &SYMBOL_LIB_TABLE::GetGlobalLibTable() ),
1086 {
1087 return wxEmptyString;
1088 }
1089
1090 wxString libName = fn.GetName();
1091
1092 if( libName.IsEmpty() )
1093 return wxEmptyString;
1094
1095 if( m_libMgr->LibraryExists( libName ) )
1096 {
1097 DisplayError( this, wxString::Format( _( "Library '%s' already exists." ), libName ) );
1098 return wxEmptyString;
1099 }
1100
1101 if( aCreateNew )
1102 {
1103 if( !m_libMgr->CreateLibrary( fn.GetFullPath(), *libTable ) )
1104 {
1105 DisplayError( this, wxString::Format( _( "Could not create the library file '%s'.\n"
1106 "Make sure you have write permissions and "
1107 "try again." ),
1108 fn.GetFullPath() ) );
1109 return wxEmptyString;
1110 }
1111 }
1112 else
1113 {
1114 if( !m_libMgr->AddLibrary( fn.GetFullPath(), *libTable ) )
1115 {
1116 DisplayError( this, _( "Could not open the library file." ) );
1117 return wxEmptyString;
1118 }
1119 }
1120
1121 bool globalTable = ( libTable == &SYMBOL_LIB_TABLE::GetGlobalLibTable() );
1122 saveSymbolLibTables( globalTable, !globalTable );
1123
1124 std::string packet = fn.GetFullPath().ToStdString();
1126
1127 return fn.GetFullPath();
1128}
1129
1130
1131void SYMBOL_EDIT_FRAME::DdAddLibrary( wxString aLibFile )
1132{
1133 // Select the target library table (global/project)
1134 SYMBOL_LIB_TABLE* libTable = SelectSymLibTable();
1135
1136 if( !libTable )
1137 return;
1138
1139 wxFileName fn = wxFileName( aLibFile );
1140
1141 wxString libName = fn.GetName();
1142
1143 if( libName.IsEmpty() )
1144 return;
1145
1146 if( m_libMgr->LibraryExists( libName ) )
1147 {
1148 DisplayError( this, wxString::Format( _( "Library '%s' already exists." ), libName ) );
1149 return;
1150 }
1151
1152 if( !m_libMgr->AddLibrary( fn.GetFullPath(), *libTable ) )
1153 {
1154 DisplayError( this, _( "Could not open the library file." ) );
1155 return;
1156 }
1157
1158 bool globalTable = ( libTable == &SYMBOL_LIB_TABLE::GetGlobalLibTable() );
1159 saveSymbolLibTables( globalTable, !globalTable );
1160
1161 std::string packet = fn.GetFullPath().ToStdString();
1163}
1164
1165
1167{
1168 return GetLibTree()->GetSelectedLibId( aUnit );
1169}
1170
1171
1173{
1174 return GetLibTree()->GetSelectionCount();
1175}
1176
1177int SYMBOL_EDIT_FRAME::GetTreeLIBIDs( std::vector<LIB_ID>& aSelection ) const
1178{
1179 return GetLibTree()->GetSelectedLibIds( aSelection );
1180}
1181
1182
1184{
1185 if( IsLibraryTreeShown() )
1186 {
1187 LIB_ID libId = GetTreeLIBID();
1188
1189 if( libId.IsValid() )
1190 return m_libMgr->GetSymbol( libId.GetLibItemName(), libId.GetLibNickname() );
1191 }
1192
1193 return m_symbol;
1194}
1195
1196
1198{
1199 LIB_ID id;
1200
1201 if( IsLibraryTreeShown() )
1202 id = GetTreeLIBID();
1203
1204 if( id.GetLibNickname().empty() && m_symbol )
1205 id = m_symbol->GetLibId();
1206
1207 return id;
1208}
1209
1210
1211std::vector<LIB_ID> SYMBOL_EDIT_FRAME::GetSelectedLibIds() const
1212{
1213 std::vector<LIB_ID> ids;
1214 GetTreeLIBIDs( ids );
1215 return ids;
1216}
1217
1218
1220{
1221 return GetTargetLibId().GetLibNickname();
1222}
1223
1224
1225void SYMBOL_EDIT_FRAME::SyncLibraries( bool aShowProgress, bool aPreloadCancelled,
1226 const wxString& aForceRefresh )
1227{
1228 LIB_ID selected;
1229
1230 if( m_treePane )
1231 selected = GetLibTree()->GetSelectedLibId();
1232
1233 if( aShowProgress )
1234 {
1235 APP_PROGRESS_DIALOG progressDlg( _( "Loading Symbol Libraries" ), wxEmptyString,
1236 m_libMgr->GetAdapter()->GetLibrariesCount(), this );
1237
1238 m_libMgr->Sync( aForceRefresh,
1239 [&]( int progress, int max, const wxString& libName )
1240 {
1241 progressDlg.Update( progress, wxString::Format( _( "Loading library '%s'..." ),
1242 libName ) );
1243 } );
1244 }
1245 else if( !aPreloadCancelled )
1246 {
1247 m_libMgr->Sync( aForceRefresh,
1248 [&]( int progress, int max, const wxString& libName )
1249 {
1250 } );
1251 }
1252
1253 if( m_treePane )
1254 {
1255 wxDataViewItem found;
1256
1257 if( selected.IsValid() )
1258 {
1259 // Check if the previously selected item is still valid,
1260 // if not - it has to be unselected to prevent crash
1261 found = m_libMgr->GetAdapter()->FindItem( selected );
1262
1263 if( !found )
1264 GetLibTree()->Unselect();
1265 }
1266
1267 GetLibTree()->Regenerate( true );
1268
1269 // Try to select the parent library, in case the symbol is not found
1270 if( !found && selected.IsValid() )
1271 {
1272 selected.SetLibItemName( "" );
1273 found = m_libMgr->GetAdapter()->FindItem( selected );
1274
1275 if( found )
1276 GetLibTree()->SelectLibId( selected );
1277 }
1278
1279 // If no selection, see if there's a current symbol to centre
1280 if( !selected.IsValid() && m_symbol )
1281 {
1282 LIB_ID current( GetCurLib(), m_symbol->GetName() );
1283 GetLibTree()->CenterLibId( current );
1284 }
1285 }
1286}
1287
1288
1290{
1292}
1293
1294
1296{
1297 GetLibTree()->SelectLibId( aLibID );
1298}
1299
1300
1301void SYMBOL_EDIT_FRAME::UpdateLibraryTree( const wxDataViewItem& aTreeItem, LIB_SYMBOL* aSymbol )
1302{
1303 if( aTreeItem.IsOk() ) // Can be not found in tree if the current footprint is imported
1304 // from file therefore not yet in tree.
1305 {
1306 static_cast<LIB_TREE_NODE_ITEM*>( aTreeItem.GetID() )->Update( aSymbol );
1308 }
1309}
1310
1311
1312bool SYMBOL_EDIT_FRAME::backupFile( const wxFileName& aOriginalFile, const wxString& aBackupExt )
1313{
1314 if( aOriginalFile.FileExists() )
1315 {
1316 wxFileName backupFileName( aOriginalFile );
1317 backupFileName.SetExt( aBackupExt );
1318
1319 if( backupFileName.FileExists() )
1320 wxRemoveFile( backupFileName.GetFullPath() );
1321
1322 if( !wxCopyFile( aOriginalFile.GetFullPath(), backupFileName.GetFullPath() ) )
1323 {
1324 DisplayError( this, wxString::Format( _( "Failed to save backup to '%s'." ),
1325 backupFileName.GetFullPath() ) );
1326 return false;
1327 }
1328 }
1329
1330 return true;
1331}
1332
1333
1335{
1336 if( m_symbol && !GetCurLib().IsEmpty() && GetScreen()->IsContentModified() )
1337 m_libMgr->UpdateSymbol( m_symbol, GetCurLib() ); // UpdateSymbol() makes a copy
1338}
1339
1340
1342{
1343 // This will return the root symbol of any alias
1345 aLibId.GetLibNickname() );
1346
1347 // Now we can compare the libId of the current symbol and the root symbol
1348 return ( symbol && m_symbol && symbol->GetLibId() == m_symbol->GetLibId() );
1349}
1350
1351
1353{
1354 GetLibTree()->Unselect();
1355 SetCurLib( wxEmptyString );
1356 SetCurSymbol( nullptr, false );
1360 Refresh();
1361}
1362
1363
1365{
1367
1369 SYMBOL_EDITOR_SETTINGS* cfg = mgr->GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" );
1370
1375
1377
1378 if( m_symbol )
1380
1382
1384 GetCanvas()->Refresh();
1385
1387
1388 if( aFlags & ENVVARS_CHANGED )
1389 SyncLibraries( true );
1390
1391 Layout();
1392 SendSizeEvent();
1393}
1394
1395
1397{
1398 // call my base class
1400
1401 // tooltips in toolbars
1403
1404 // For some obscure reason, the AUI manager hides the first modified pane.
1405 // So force show panes
1406 wxAuiPaneInfo& tree_pane_info = m_auimgr.GetPane( m_treePane );
1407 bool tree_shown = tree_pane_info.IsShown();
1408 tree_pane_info.Caption( _( "Libraries" ) );
1409 tree_pane_info.Show( tree_shown );
1410 m_auimgr.Update();
1411
1413
1414 // status bar
1416
1417 if( GetRenderSettings()->m_ShowPinsElectricalType )
1418 {
1420 GetCanvas()->Refresh();
1421 }
1422
1423 UpdateTitle();
1424}
1425
1426
1428{
1429 SCH_BASE_FRAME::SetScreen( aScreen );
1430
1431 // Let tools add things to the view if necessary
1432 if( m_toolManager )
1434}
1435
1436
1438{
1446
1447 // Let tools add things to the view if necessary
1448 if( m_toolManager )
1450
1452 GetCanvas()->Refresh();
1453}
1454
1455
1457{
1458 SyncLibraries( true );
1459
1460 if( m_symbol )
1461 {
1463 SCH_SELECTION& selection = selectionTool->GetSelection();
1464
1465 for( SCH_ITEM& item : m_symbol->GetDrawItems() )
1466 {
1467 if( !alg::contains( selection, &item ) )
1468 item.ClearSelected();
1469 else
1470 item.SetSelected();
1471 }
1472
1474 }
1475
1476 RebuildView();
1477}
1478
1479
1480const BOX2I SYMBOL_EDIT_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
1481{
1482 if( !m_symbol )
1483 {
1484 // Gives a reasonable drawing area size
1485 int width = schIUScale.mmToIU( 50 );
1486 int height = schIUScale.mmToIU( 30 );
1487
1488 return BOX2I( VECTOR2I( -width/2, -height/2 ), VECTOR2I( width, height ) );
1489 }
1490 else
1491 {
1492 return m_symbol->Flatten()->GetUnitBoundingBox( m_unit, m_bodyStyle );
1493 }
1494}
1495
1496
1498{
1499 static KIID lastBrightenedItemID( niluuid );
1500
1501 SCH_ITEM* lastItem = nullptr;
1502
1503 if( m_symbol )
1504 {
1505 for( SCH_PIN* pin : m_symbol->GetPins() )
1506 {
1507 if( pin->m_Uuid == lastBrightenedItemID )
1508 lastItem = pin;
1509 }
1510
1511 std::vector<SCH_FIELD*> fields;
1512 m_symbol->GetFields( fields );
1513
1514 for( SCH_FIELD* field : fields )
1515 {
1516 if( field->m_Uuid == lastBrightenedItemID )
1517 lastItem = field;
1518 }
1519 }
1520
1521 if( lastItem && lastItem != aItem )
1522 {
1523 lastItem->ClearBrightened();
1524
1525 UpdateItem( lastItem );
1526 lastBrightenedItemID = niluuid;
1527 }
1528
1529 if( aItem )
1530 {
1531 if( !aItem->IsBrightened() )
1532 {
1533 aItem->SetBrightened();
1534
1535 UpdateItem( aItem );
1536 lastBrightenedItemID = aItem->m_Uuid;
1537 }
1538
1539 FocusOnLocation( VECTOR2I( aItem->GetFocusPosition().x, -aItem->GetFocusPosition().y ) );
1540 }
1541}
1542
1543
1545{
1546 const std::string& payload = mail.GetPayload();
1547
1548 switch( mail.Command() )
1549 {
1550 case MAIL_LIB_EDIT:
1551 if( !payload.empty() )
1552 {
1553 wxString libFileName( payload );
1554 wxString libNickname;
1555 wxString msg;
1556
1558 const LIB_TABLE_ROW* libTableRow = libTable->FindRowByURI( libFileName );
1559
1560 if( !libTableRow )
1561 {
1562 msg.Printf( _( "The current configuration does not include the symbol library '%s'." ),
1563 libFileName );
1564 msg += wxS( "\n" ) + _( "Use Manage Symbol Libraries to edit the configuration." );
1565 DisplayErrorMessage( this, _( "Library not found in symbol library table." ), msg );
1566 break;
1567 }
1568
1569 libNickname = libTableRow->GetNickName();
1570
1571 if( !libTable->HasLibrary( libNickname, true ) )
1572 {
1573 msg.Printf( _( "The symbol library '%s' is not enabled in the current configuration." ),
1574 UnescapeString( libNickname ) );
1575 msg += wxS( "\n" ) + _( "Use Manage Symbol Libraries to edit the configuration." );
1576 DisplayErrorMessage( this, _( "Symbol library not enabled." ), msg );
1577 break;
1578 }
1579
1580 SetCurLib( libNickname );
1581
1582 if( m_treePane )
1583 {
1584 LIB_ID id( libNickname, wxEmptyString );
1585 GetLibTree()->SelectLibId( id );
1586 GetLibTree()->ExpandLibId( id );
1587 GetLibTree()->CenterLibId( id );
1588 }
1589 }
1590
1591 break;
1592
1593 case MAIL_RELOAD_LIB:
1594 {
1595 wxString currentLib = GetCurLib();
1597
1599
1600 // Check if the currently selected symbol library been removed or disabled.
1601 if( !currentLib.empty() && libTable && !libTable->HasLibrary( currentLib, true ) )
1602 {
1603 SetCurLib( wxEmptyString );
1604 emptyScreen();
1605 }
1606
1607 SyncLibraries( true );
1610
1611 break;
1612 }
1613
1615 {
1617 LIB_SYMBOL* symbol = GetCurSymbol();
1618
1619 wxLogTrace( "KICAD_LIB_WATCH", "Received refresh symbol request for %s",
1620 payload );
1621
1622 if( !tbl || !symbol )
1623 break;
1624
1625 wxString libName = symbol->GetLibId().GetLibNickname();
1626 const SYMBOL_LIB_TABLE_ROW* row = tbl->FindRow( libName );
1627
1628 if( !row )
1629 return;
1630
1631 wxFileName libfullname( row->GetFullURI( true ) );
1632
1633 wxFileName changedLib( mail.GetPayload() );
1634 wxLogTrace( "KICAD_LIB_WATCH",
1635 "Received refresh symbol request for %s, current symbols is %s",
1636 changedLib.GetFullPath(), libfullname.GetFullPath() );
1637
1638 if( changedLib == libfullname )
1639 {
1640 wxLogTrace( "KICAD_LIB_WATCH", "Refreshing symbol %s", symbol->GetName() );
1641
1642 SetScreen( m_dummyScreen ); // UpdateLibraryBuffer will destroy the old screen
1643 m_libMgr->UpdateLibraryBuffer( libName );
1644
1645 LIB_SYMBOL* lib_symbol = m_libMgr->GetBufferedSymbol( symbol->GetName(), libName );
1646 wxCHECK2_MSG( lib_symbol, break, wxString::Format( "Symbol %s not found in library %s",
1647 symbol->GetName(), libName ) );
1648
1649 // The buffered screen for the symbol
1650 SCH_SCREEN* symbol_screen = m_libMgr->GetScreen( lib_symbol->GetName(), libName );
1651
1652 SetScreen( symbol_screen );
1653 SetCurSymbol( new LIB_SYMBOL( *lib_symbol ), false );
1655 SetShowDeMorgan( GetCurSymbol()->HasAlternateBodyStyle() );
1656
1657 if( m_toolManager )
1659 }
1660
1661 break;
1662 }
1663
1664 default:
1665 ;
1666 }
1667}
1668
1669
1670std::unique_ptr<GRID_HELPER> SYMBOL_EDIT_FRAME::MakeGridHelper()
1671{
1672 return std::make_unique<EE_GRID_HELPER>( m_toolManager );
1673}
1674
1675
1677{
1678 // switches currently used canvas ( Cairo / OpenGL):
1679 SCH_BASE_FRAME::SwitchCanvas( aCanvasType );
1680
1681 // Set options specific to symbol editor (axies are always enabled):
1682 GetCanvas()->GetGAL()->SetAxesEnabled( true );
1684}
1685
1686
1688{
1689 wxCHECK( m_libMgr, false );
1690
1691 return m_libMgr->HasModifications();
1692}
1693
1694
1696{
1697 wxCHECK( m_libMgr, false );
1698
1699 // Test if the currently edited symbol is modified
1701 return true;
1702
1703 // Test if any library has been modified
1704 for( const wxString& libName : m_libMgr->GetLibraryNames() )
1705 {
1706 if( m_libMgr->IsLibraryModified( libName ) && !m_libMgr->IsLibraryReadOnly( libName ) )
1707 return true;
1708 }
1709
1710 return false;
1711}
1712
1713
1715{
1716 if( aItemCount == 0 )
1717 return;
1718
1719 UNDO_REDO_CONTAINER& list = ( whichList == UNDO_LIST ) ? m_undoList : m_redoList;
1720
1721 if( aItemCount < 0 )
1722 {
1723 list.ClearCommandList();
1724 }
1725 else
1726 {
1727 for( int ii = 0; ii < aItemCount; ii++ )
1728 {
1729 if( list.m_CommandsList.size() == 0 )
1730 break;
1731
1732 PICKED_ITEMS_LIST* curr_cmd = list.m_CommandsList[0];
1733 list.m_CommandsList.erase( list.m_CommandsList.begin() );
1734
1735 curr_cmd->ClearListAndDeleteItems( []( EDA_ITEM* aItem )
1736 {
1737 delete aItem;
1738 } );
1739 delete curr_cmd; // Delete command
1740 }
1741 }
1742}
1743
1744
1746{
1747 return m_toolManager->GetTool<SCH_SELECTION_TOOL>()->GetSelection();
1748}
1749
1750
1752{
1753 std::unique_ptr<LIB_SYMBOL> symbol = aSymbol->GetLibSymbolRef()->Flatten();
1754 wxCHECK( symbol, /* void */ );
1755
1756 symbol->SetLibId( aSymbol->GetLibId() );
1757
1758 // Take in account the symbol orientation and mirroring. to calculate the field
1759 // positions in symbol editor (i.e. no rotation, no mirroring)
1760 int orientation = aSymbol->GetOrientation() & ~( SYM_MIRROR_X | SYM_MIRROR_Y );
1761 int mirror = aSymbol->GetOrientation() & ( SYM_MIRROR_X | SYM_MIRROR_Y );
1762
1763 std::vector<SCH_FIELD> fullSetOfFields;
1764
1765 for( const SCH_FIELD& field : aSymbol->GetFields() )
1766 {
1767 VECTOR2I pos = field.GetPosition() - aSymbol->GetPosition();
1768 SCH_FIELD libField( symbol.get(), field.GetId() );
1769
1770 libField = field;
1771
1772 // The inverse transform is mirroring before, rotate after
1773 switch( mirror )
1774 {
1775 case SYM_MIRROR_X: pos.y = -pos.y; break;
1776 case SYM_MIRROR_Y: pos.x = -pos.x; break;
1777 default: break;
1778 }
1779
1780 switch( orientation )
1781 {
1782 case SYM_ORIENT_90:
1783 std::swap( pos.x, pos.y );
1784 pos.x = - pos.x;
1785 break;
1786 case SYM_ORIENT_270:
1787 std::swap( pos.x, pos.y );
1788 pos.y = - pos.y;
1789 break;
1790 case SYM_ORIENT_180:
1791 pos.x = - pos.x;
1792 pos.y = - pos.y;
1793 break;
1794 default:
1795 break;
1796 }
1797
1798 libField.SetPosition( pos );
1799
1800 fullSetOfFields.emplace_back( std::move( libField ) );
1801 }
1802
1803 symbol->SetFields( fullSetOfFields );
1804
1805 if( m_symbol )
1806 SetCurSymbol( nullptr, false );
1807
1809 m_schematicSymbolUUID = aSymbol->m_Uuid;
1810 m_reference = symbol->GetReferenceField().GetText();
1811 m_unit = std::max( 1, aSymbol->GetUnit() );
1812 m_bodyStyle = std::max( 1, aSymbol->GetBodyStyle() );
1813
1814 // Optimize default edit options for this symbol
1815 // Usually if units are locked, graphic items are specific to each unit
1816 // and if units are interchangeable, graphic items are common to units
1818 tools->SetDrawSpecificUnit( symbol->UnitsLocked() );
1819
1820 // The buffered screen for the symbol
1821 SCH_SCREEN* tmpScreen = new SCH_SCREEN();
1822
1823 SetScreen( tmpScreen );
1824 SetCurSymbol( symbol.release(), true );
1825 setSymWatcher( nullptr );
1826
1829
1830 if( IsLibraryTreeShown() )
1832
1833 UpdateTitle();
1835 SetShowDeMorgan( GetCurSymbol()->HasAlternateBodyStyle() );
1837
1838 // Let tools add things to the view if necessary
1839 if( m_toolManager )
1841
1843 GetCanvas()->Refresh();
1844}
1845
1846
1847bool SYMBOL_EDIT_FRAME::addLibTableEntry( const wxString& aLibFile, TABLE_SCOPE aScope )
1848{
1849 wxFileName fn = aLibFile;
1850 wxFileName libTableFileName( Prj().GetProjectPath(),
1852 wxString libNickname = fn.GetName();
1854 const ENV_VAR_MAP& envVars = Pgm().GetLocalEnvVariables();
1855
1856 if( libTable->HasLibrary( libNickname ) )
1857 {
1858 wxString tmp;
1859 int suffix = 1;
1860
1861 while( libTable->HasLibrary( libNickname ) )
1862 {
1863 tmp.Printf( "%s%d", fn.GetName(), suffix );
1864 libNickname = tmp;
1865 suffix += 1;
1866 }
1867 }
1868
1870 row->SetNickName( libNickname );
1871
1872 wxString normalizedPath = NormalizePath( aLibFile, &envVars, Prj().GetProjectPath() );
1873
1874 if( aScope == GLOBAL_LIB_TABLE )
1875 {
1877 libTableFileName = SYMBOL_LIB_TABLE::GetGlobalTableFileName();
1878
1879 // We cannot normalize against the current project path when saving to global table.
1880 normalizedPath = NormalizePath( aLibFile, &envVars, wxEmptyString );
1881 }
1882
1883 row->SetFullURI( normalizedPath );
1884
1885 wxCHECK( libTable->InsertRow( row ), false );
1886
1887 try
1888 {
1889 libTable->Save( libTableFileName.GetFullPath() );
1890 }
1891 catch( const IO_ERROR& ioe )
1892 {
1893 wxString msg = aScope == GLOBAL_LIB_TABLE ? _( "Error saving global library table." )
1894 : _( "Error saving project library table." );
1895
1896 wxMessageDialog dlg( this, msg, _( "File Save Error" ), wxOK | wxICON_ERROR );
1897 dlg.SetExtendedMessage( ioe.What() );
1898 dlg.ShowModal();
1899
1900 return false;
1901 }
1902
1903 return true;
1904}
1905
1906
1907bool SYMBOL_EDIT_FRAME::replaceLibTableEntry( const wxString& aLibNickname,
1908 const wxString& aLibFile )
1909{
1910 // Check the global library table first because checking the project library table
1911 // checks the global library table as well due to library chaining.
1912 bool isGlobalTable = true;
1913 wxFileName libTableFileName = SYMBOL_LIB_TABLE::GetGlobalTableFileName();;
1914 const ENV_VAR_MAP& envVars = Pgm().GetLocalEnvVariables();
1916 SYMBOL_LIB_TABLE_ROW* row = libTable->FindRow( aLibNickname );
1917
1918 if( !row )
1919 {
1920 libTableFileName.SetPath( Prj().GetProjectPath() );
1921 libTableFileName.SetName( SYMBOL_LIB_TABLE::GetSymbolLibTableFileName() );
1922 libTable = PROJECT_SCH::SchSymbolLibTable( &Prj() );
1923 isGlobalTable = false;
1924 row = libTable->FindRow( aLibNickname );
1925 }
1926
1927 wxCHECK( row, false );
1928
1929 wxString projectPath;
1930
1931 if( !isGlobalTable )
1932 projectPath = Prj().GetProjectPath();
1933
1934 wxString normalizedPath = NormalizePath( aLibFile, &envVars, projectPath );
1935
1936 row->SetFullURI( normalizedPath );
1937 row->SetType( "KiCad" );
1938
1939 try
1940 {
1941 libTable->Save( libTableFileName.GetFullPath() );
1942 }
1943 catch( const IO_ERROR& ioe )
1944 {
1945 wxString msg = isGlobalTable ? _( "Error saving global library table." )
1946 : _( "Error saving project library table." );
1947
1948 wxMessageDialog dlg( this, msg, _( "File Save Error" ), wxOK | wxICON_ERROR );
1949 dlg.SetExtendedMessage( ioe.What() );
1950 dlg.ShowModal();
1951
1952 return false;
1953 }
1954
1955 return true;
1956}
1957
1958
1960{
1961 return m_symbol && !m_symbol->IsRoot();
1962}
1963
1964
1966{
1968}
1969
1970
1971void SYMBOL_EDIT_FRAME::UpdateItem( EDA_ITEM* aItem, bool isAddOrDelete, bool aUpdateRtree )
1972{
1973 SCH_BASE_FRAME::UpdateItem( aItem, isAddOrDelete, aUpdateRtree );
1974
1975 if( EDA_TEXT* eda_text = dynamic_cast<EDA_TEXT*>( aItem ) )
1976 {
1977 eda_text->ClearBoundingBoxCache();
1978 eda_text->ClearRenderCache();
1979 }
1980}
1981
1982
1984{
1985 wxAuiPaneInfo& treePane = m_auimgr.GetPane( m_treePane );
1986 wxAuiPaneInfo& propertiesPane = m_auimgr.GetPane( PropertiesPaneName() );
1987 wxAuiPaneInfo& selectionFilterPane = m_auimgr.GetPane( wxS( "SelectionFilter" ) );
1988
1989 // Don't give the selection filter its own visibility controls; instead show it if
1990 // anything else is visible
1991 bool showFilter = ( treePane.IsShown() && treePane.IsDocked() )
1992 || ( propertiesPane.IsShown() && propertiesPane.IsDocked() );
1993
1994 selectionFilterPane.Show( showFilter );
1995}
1996
1997
1999{
2000 // Returns the current render option for invisible fields
2002}
2003
2004
2006{
2007 // Returns the current render option for invisible pins
2009}
BASE_SCREEN class implementation.
constexpr EDA_IU_SCALE schIUScale
Definition: base_units.h:110
wxBitmap KiBitmap(BITMAPS aBitmap, int aHeightTag)
Construct a wxBitmap from an image identifier Returns the image from the active theme if the image ha...
Definition: bitmap.cpp:104
@ icon_libedit_32
@ icon_libedit
@ icon_libedit_16
BOX2< VECTOR2I > BOX2I
Definition: box2.h:922
static TOOL_ACTION toggleGrid
Definition: actions.h:191
static TOOL_ACTION paste
Definition: actions.h:73
static TOOL_ACTION cancelInteractive
Definition: actions.h:65
static TOOL_ACTION millimetersUnits
Definition: actions.h:199
static TOOL_ACTION unselectAll
Definition: actions.h:76
static TOOL_ACTION revert
Definition: actions.h:55
static TOOL_ACTION showLibraryTree
Definition: actions.h:154
static TOOL_ACTION copy
Definition: actions.h:71
static TOOL_ACTION showDatasheet
Definition: actions.h:221
static TOOL_ACTION milsUnits
Definition: actions.h:198
static TOOL_ACTION toggleBoundingBoxes
Definition: actions.h:147
static TOOL_ACTION saveAll
Definition: actions.h:54
static TOOL_ACTION undo
Definition: actions.h:68
static TOOL_ACTION duplicate
Definition: actions.h:77
static TOOL_ACTION inchesUnits
Definition: actions.h:197
static TOOL_ACTION toggleCursorStyle
Definition: actions.h:144
static TOOL_ACTION doDelete
Definition: actions.h:78
static TOOL_ACTION selectionTool
Definition: actions.h:206
static TOOL_ACTION save
Definition: actions.h:51
static TOOL_ACTION zoomFitScreen
Definition: actions.h:134
static TOOL_ACTION redo
Definition: actions.h:69
static TOOL_ACTION deleteTool
Definition: actions.h:79
static TOOL_ACTION zoomTool
Definition: actions.h:138
static TOOL_ACTION showProperties
Definition: actions.h:220
static TOOL_ACTION cut
Definition: actions.h:70
static TOOL_ACTION ddAddLibrary
Definition: actions.h:60
static TOOL_ACTION copyAsText
Definition: actions.h:72
static TOOL_ACTION toggleGridOverrides
Definition: actions.h:192
static TOOL_ACTION selectAll
Definition: actions.h:75
Manage TOOL_ACTION objects.
void SetConditions(const TOOL_ACTION &aAction, const ACTION_CONDITIONS &aConditions)
Set the conditions the UI elements for activating a specific tool action should use for determining t...
wxProgressDialog with the option to also update the application progress on the taskbar
virtual bool Update(int aValue, const wxString &aNewMsg=wxEmptyString, bool *aSkip=nullptr) override
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
Definition: app_settings.h:92
WINDOW_SETTINGS m_Window
Definition: app_settings.h:196
wxString m_ColorTheme
Active color theme name.
Definition: app_settings.h:199
Handles how to draw a screen (a board, a schematic ...)
Definition: base_screen.h:41
void SetContentModified(bool aModified=true)
Definition: base_screen.h:59
constexpr void SetOrigin(const Vec &pos)
Definition: box2.h:237
constexpr void SetSize(const SizeVec &size)
Definition: box2.h:248
Color settings are a bit different than most of the settings objects in that there can be more than o...
COLOR4D GetColor(int aLayer) const
Handle actions that are shared between different applications.
Handles action that are shared between different applications.
Definition: common_tools.h:38
UNDO_REDO_CONTAINER m_undoList
void ShowChangedLanguage() override
Redraw the menus and what not in current language.
virtual void setupUIConditions()
Setup the UI conditions for the various actions and their controls in this frame.
virtual void ClearUndoRedoList()
Clear the undo and redo list using ClearUndoORRedoList()
SETTINGS_MANAGER * GetSettingsManager() const
UNDO_REDO_LIST
Specify whether we are interacting with the undo or redo stacks.
virtual void OnModify()
Must be called after a model change in order to set the "modify" flag and do other frame-specific pro...
wxAuiManager m_auimgr
virtual void RecreateToolbars()
UNDO_REDO_CONTAINER m_redoList
virtual void OnDropFiles(wxDropFilesEvent &aEvent)
Handle event fired when a file is dropped to the window.
void ReCreateMenuBar()
Recreate the menu bar.
WX_INFOBAR * GetInfoBar()
COLOR_SETTINGS * m_colorSettings
bool LibraryFileBrowser(bool doOpen, wxFileName &aFilename, const wxString &wildcard, const wxString &ext, bool isDirectory=false, bool aIsGlobal=false, const wxString &aGlobalPath=wxEmptyString)
virtual void SwitchCanvas(EDA_DRAW_PANEL_GAL::GAL_TYPE aCanvasType)
Change the current rendering backend.
GAL_DISPLAY_OPTIONS_IMPL & GetGalDisplayOptions()
Return a reference to the gal rendering options used by GAL for rendering.
static const wxString PropertiesPaneName()
void FocusOnLocation(const VECTOR2I &aPos)
Useful to focus on a particular location, in find functions.
virtual void SetScreen(BASE_SCREEN *aScreen)
PROPERTIES_PANEL * m_propertiesPanel
void ForceRefresh()
Force a redraw.
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
KIGFX::GAL * GetGAL() const
Return a pointer to the GAL instance used in the panel.
void SetEventDispatcher(TOOL_DISPATCHER *aEventDispatcher)
Set a dispatcher that processes events and forwards them to tools.
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:89
virtual const VECTOR2I GetFocusPosition() const
Similar to GetPosition() but allows items to return their visual center rather than their anchor.
Definition: eda_item.h:249
const KIID m_Uuid
Definition: eda_item.h:488
void ClearBrightened()
Definition: eda_item.h:121
void SetBrightened()
Definition: eda_item.h:118
bool IsBrightened() const
Definition: eda_item.h:112
Specialization of the wxAuiPaneInfo class for KiCad panels.
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
Definition: eda_text.h:80
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:98
Class that groups generic conditions for editor states.
SELECTION_CONDITION NoActiveTool()
Create a functor testing if there are no tools active in the frame.
SELECTION_CONDITION BoundingBoxes()
SELECTION_CONDITION RedoAvailable()
Create a functor that tests if there are any items in the redo queue.
SELECTION_CONDITION CurrentTool(const TOOL_ACTION &aTool)
Create a functor testing if the specified tool is the current active tool in the frame.
virtual SELECTION_CONDITION UndoAvailable()
Create a functor that tests if there are any items in the undo queue.
SELECTION_CONDITION Units(EDA_UNITS aUnit)
Create a functor that tests if the frame has the specified units.
SELECTION_CONDITION GridVisible()
Create a functor testing if the grid is visible in a frame.
SELECTION_CONDITION GridOverrides()
Create a functor testing if the grid overrides wires is enabled in a frame.
SELECTION_CONDITION FullscreenCursor()
Create a functor testing if the cursor is full screen in a frame.
void ReadWindowSettings(WINDOW_SETTINGS &aCfg)
Read GAL config options from application-level config.
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
Definition: ki_exception.h:77
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:30
Helper class to create more flexible dialogs, including 'do not show again' checkbox handling.
Definition: kidialog.h:43
int ShowModal() override
Definition: kidialog.cpp:95
bool m_axesEnabled
Fullscreen crosshair or small cross.
void SetAxesEnabled(bool aAxesEnabled)
Enable drawing the axes.
void SetAxesColor(const COLOR4D &aAxesColor)
Set the axes color.
void SetDefaultFont(const wxString &aFont)
void HideDrawingSheet()
Definition: sch_view.cpp:191
void ClearHiddenFlags()
Clear the hide flag of all items in the view.
Definition: sch_view.cpp:179
void Clear()
Remove all items from the view.
Definition: view.cpp:1131
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition: view.cpp:1549
Definition: kiid.h:49
Carry a payload from one KIWAY_PLAYER to another within a PROJECT.
Definition: kiway_express.h:40
std::string & GetPayload()
Return the payload, which can be any text but it typically self identifying s-expression.
Definition: kiway_express.h:58
MAIL_T Command()
Returns the MAIL_T associated with this mail.
Definition: kiway_express.h:50
bool Destroy() override
Our version of Destroy() which is virtual from wxWidgets.
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition: kiway.h:285
void OnKiCadExit()
Definition: kiway.cpp:727
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
Definition: kiway.cpp:406
virtual void ExpressMail(FRAME_T aDestination, MAIL_T aCommand, std::string &aPayload, wxWindow *aSource=nullptr)
Send aPayload to aDestination from aSource.
Definition: kiway.cpp:527
Module editor specific tools.
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:49
int SetLibItemName(const UTF8 &aLibItemName)
Override the library item name portion of the LIB_ID to aLibItemName.
Definition: lib_id.cpp:111
bool IsValid() const
Check if this LID_ID is valid.
Definition: lib_id.h:172
const UTF8 & GetLibItemName() const
Definition: lib_id.h:102
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Definition: lib_id.h:87
const wxString GetFullLibraryName() const
Definition: lib_id.cpp:275
Symbol library management helper that is specific to the symbol library editor frame.
void Sync(const wxString &aForceRefresh, std::function< void(int, int, const wxString &)> aProgressCallback)
Updates the SYMBOL_LIBRARY_MANAGER data to synchronize with Symbol Library Table.
wxObjectDataPtr< LIB_TREE_MODEL_ADAPTER > & GetAdapter()
Return the adapter object that provides the stored data.
Define a library symbol object.
Definition: lib_symbol.h:85
const LIB_ID & GetLibId() const override
Definition: lib_symbol.h:155
bool IsMulti() const override
Definition: lib_symbol.h:574
std::vector< SCH_PIN * > GetPins(int aUnit, int aBodyStyle) const
Return a list of pin object pointers from the draw item list.
Definition: lib_symbol.cpp:790
void GetFields(std::vector< SCH_FIELD * > &aList, bool aVisibleOnly=false) const override
Populate a std::vector with SCH_FIELDs, sorted in ordinal order.
bool UnitsLocked() const
Check whether symbol units are interchangeable.
Definition: lib_symbol.h:289
SCH_FIELD & GetDatasheetField()
Return reference to the datasheet field.
Definition: lib_symbol.h:346
bool IsRoot() const override
For symbols derived from other symbols, IsRoot() indicates no derivation.
Definition: lib_symbol.h:206
wxString GetUnitDisplayName(int aUnit) override
Return the user-defined display name for aUnit for symbols with units.
Definition: lib_symbol.cpp:291
LIB_ITEMS_CONTAINER & GetDrawItems()
Return a reference to the draw item list.
Definition: lib_symbol.h:519
wxString GetName() const override
Definition: lib_symbol.h:149
wxString GetLibNickname() const override
Sets the Description field text value.
Definition: lib_symbol.h:161
int GetUnitCount() const override
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
Definition: lib_symbol.cpp:335
LIB_SYMBOL_SPTR GetRootSymbol() const
Get the parent symbol that does not have another parent.
Definition: lib_symbol.cpp:267
Hold a record identifying a library accessed by the appropriate plug in object in the LIB_TABLE.
void SetFullURI(const wxString &aFullURI)
Change the full URI for the library.
void SetNickName(const wxString &aNickName)
Change the logical name of this library, useful for an editor.
const wxString & GetNickName() const
const wxString GetFullURI(bool aSubstituted=false) const
Return the full location specifying URI for the LIB, either in original UI form or in environment var...
bool HasLibrary(const wxString &aNickname, bool aCheckEnabled=false) const
Test for the existence of aNickname in the library table.
bool InsertRow(LIB_TABLE_ROW *aRow, bool doReplace=false)
Adds aRow if it does not already exist or if doReplace is true.
const LIB_TABLE_ROW * FindRowByURI(const wxString &aURI)
void Save(const wxString &aFileName) const
Write this library table to aFileName in s-expression form.
Node type: LIB_ID.
void RefreshLibTree()
Refresh the tree (mainly to update highlighting and asterisking)
Definition: lib_tree.cpp:459
void CenterLibId(const LIB_ID &aLibId)
Ensure that an item is visible (preferably centered).
Definition: lib_tree.cpp:368
int GetSelectionCount() const
Definition: lib_tree.h:91
void ShowChangedLanguage()
Definition: lib_tree.cpp:291
void FocusSearchFieldIfExists()
Focus the search widget if it exists.
Definition: lib_tree.cpp:474
void SelectLibId(const LIB_ID &aLibId)
Select an item in the tree widget.
Definition: lib_tree.cpp:362
LIB_TREE_MODEL_ADAPTER::SORT_MODE GetSortMode() const
Definition: lib_tree.h:155
int GetSelectedLibIds(std::vector< LIB_ID > &aSelection, std::vector< int > *aUnit=nullptr) const
Retrieve a list of selections for trees that allow multi-selection.
Definition: lib_tree.cpp:321
void Unselect()
Unselect currently selected item in wxDataViewCtrl.
Definition: lib_tree.cpp:374
LIB_ID GetSelectedLibId(int *aUnit=nullptr) const
For multi-unit symbols, if the user selects the symbol itself rather than picking an individual unit,...
Definition: lib_tree.cpp:301
void ExpandLibId(const LIB_ID &aLibId)
Expand and item i the tree widget.
Definition: lib_tree.cpp:382
void Regenerate(bool aKeepState)
Regenerate the tree.
Definition: lib_tree.cpp:441
static wxString GetDefaultUserSymbolsPath()
Gets the default path we point users to create projects.
Definition: paths.cpp:88
virtual ENV_VAR_MAP & GetLocalEnvVariables() const
Definition: pgm_base.cpp:935
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition: pgm_base.h:125
A holder to handle information on schematic or board items.
void ClearListAndDeleteItems(std::function< void(EDA_ITEM *)> aItemDeleter)
Delete the list of pickers AND the data pointed by #m_PickedItem or #m_PickedItemLink according to th...
bool IsCancelled() const override
static SYMBOL_LIB_TABLE * SchSymbolLibTable(PROJECT *aProject)
Accessor for project symbol library table.
@ SCH_LIBEDIT_CUR_LIB
Definition: project.h:221
@ SCH_LIBEDIT_CUR_SYMBOL
Definition: project.h:222
virtual const wxString GetProjectPath() const
Return the full path of the project.
Definition: project.cpp:146
virtual void SetRString(RSTRING_T aStringId, const wxString &aString)
Store a "retained string", which is any session and project specific string identified in enum RSTRIN...
Definition: project.cpp:318
virtual const wxString & GetRString(RSTRING_T aStringId)
Return a "retained string", which is any session and project specific string identified in enum RSTRI...
Definition: project.cpp:329
float SplitterProportion() const
Action handler for the Properties panel.
Gather all the actions that are shared by tools.
Definition: sch_actions.h:39
static TOOL_ACTION rotateCCW
Definition: sch_actions.h:132
static TOOL_ACTION importSymbol
Definition: sch_actions.h:221
static TOOL_ACTION newSymbol
Definition: sch_actions.h:212
static TOOL_ACTION saveLibraryAs
Definition: sch_actions.h:209
static TOOL_ACTION mirrorV
Definition: sch_actions.h:133
static TOOL_ACTION clearSelection
Clears the current selection.
Definition: sch_actions.h:56
static TOOL_ACTION editLibSymbolWithLibEdit
Definition: sch_actions.h:184
static TOOL_ACTION showDeMorganAlternate
Definition: sch_actions.h:143
static TOOL_ACTION drawArc
Definition: sch_actions.h:108
static TOOL_ACTION pinTable
Definition: sch_actions.h:163
static TOOL_ACTION drawSymbolLines
Definition: sch_actions.h:122
static TOOL_ACTION placeSymbolPin
Definition: sch_actions.h:119
static TOOL_ACTION drawSymbolTextBox
Definition: sch_actions.h:121
static TOOL_ACTION drawRectangle
Definition: sch_actions.h:106
static TOOL_ACTION drawCircle
Definition: sch_actions.h:107
static TOOL_ACTION importGraphics
Definition: sch_actions.h:265
static TOOL_ACTION drawBezier
Definition: sch_actions.h:109
static TOOL_ACTION saveSymbolCopyAs
Definition: sch_actions.h:211
static TOOL_ACTION rotateCW
Definition: sch_actions.h:131
static TOOL_ACTION showElectricalTypes
Definition: sch_actions.h:261
static TOOL_ACTION drawSymbolPolygon
Definition: sch_actions.h:123
static TOOL_ACTION showHiddenFields
Definition: sch_actions.h:246
static TOOL_ACTION placeSymbolAnchor
Definition: sch_actions.h:124
static TOOL_ACTION showHiddenPins
Definition: sch_actions.h:245
static TOOL_ACTION setUnitDisplayName
Definition: sch_actions.h:224
static TOOL_ACTION mirrorH
Definition: sch_actions.h:134
static TOOL_ACTION runERC
Inspection and Editing.
Definition: sch_actions.h:157
static TOOL_ACTION symbolProperties
Definition: sch_actions.h:162
static TOOL_ACTION placeSymbolText
Definition: sch_actions.h:120
static TOOL_ACTION toggleSyncedPinsMode
Definition: sch_actions.h:255
static TOOL_ACTION togglePinAltIcons
Definition: sch_actions.h:254
static TOOL_ACTION showDeMorganStandard
Definition: sch_actions.h:142
static TOOL_ACTION saveSymbolAs
Definition: sch_actions.h:210
A shim class between EDA_DRAW_FRAME and several derived classes: SYMBOL_EDIT_FRAME,...
SCH_RENDER_SETTINGS * GetRenderSettings()
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
SCH_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
SYMBOL_EDITOR_SETTINGS * libeditconfig() const
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
SYMBOL_LIB_TABLE * SelectSymLibTable(bool aOptional=false)
Display a dialog asking the user to select a symbol library table.
void CommonSettingsChanged(int aFlags) override
Notification event that some of the common (suite-wide) settings have changed.
bool saveSymbolLibTables(bool aGlobal, bool aProject)
Save Symbol Library Tables to disk.
virtual void UpdateItem(EDA_ITEM *aItem, bool isAddOrDelete=false, bool aUpdateRtree=false)
Mark an item for refresh.
void setSymWatcher(const LIB_ID *aSymbol)
Creates (or removes) a watcher on the specified symbol library.
KIGFX::SCH_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
void DisplaySymbol(LIB_SYMBOL *aSymbol)
Schematic editor (Eeschema) main window.
void SaveSymbolToSchematic(const LIB_SYMBOL &aSymbol, const KIID &aSchematicSymbolUUID)
Update a schematic symbol from a LIB_SYMBOL.
void SetPosition(const VECTOR2I &aPosition) override
Definition: sch_field.cpp:1289
static const wxString ShowType(SCH_FILE_T aFileType)
Return a brief name for a plugin, given aFileType enum.
Definition: sch_io_mgr.cpp:83
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:167
int GetBodyStyle() const
Definition: sch_item.h:236
int GetUnit() const
Definition: sch_item.h:233
virtual void ClearCaches()
Definition: sch_item.cpp:373
Tool that displays edit points allowing to modify items by dragging the points.
SCH_SELECTION & GetSelection()
SCH_SELECTION_FILTER_OPTIONS & GetFilter()
Schematic symbol object.
Definition: sch_symbol.h:75
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) const override
Populate a std::vector with SCH_FIELDs, sorted in ordinal order.
Definition: sch_symbol.cpp:841
VECTOR2I GetPosition() const override
Definition: sch_symbol.h:773
const LIB_ID & GetLibId() const override
Definition: sch_symbol.h:164
int GetOrientation() const override
Get the display symbol orientation.
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
Definition: sch_symbol.h:183
static bool Idle(const SELECTION &aSelection)
Test if there no items selected or being edited.
static bool ShowAlways(const SELECTION &aSelection)
The default condition function (always returns true).
COLOR_SETTINGS * GetColorSettings(const wxString &aName="user")
Retrieve a color settings object that applications can read colors from.
T * GetToolbarSettings(const wxString &aFilename)
Return a handle to the given toolbar settings.
T * GetAppSettings(const wxString &aFilename)
Return a handle to the a given settings by type.
Handle actions for the various symbol editor and viewers.
SYMBOL_EDITOR_DRAWING_TOOLS.
SCH_SELECTION_FILTER_OPTIONS m_SelectionFilter
bool m_ShowPinAltIcons
When true, dragging an outline edge will drag pins rooted on it.
The symbol library editor main window.
void OnExitKiCad(wxCommandEvent &event)
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
std::unique_ptr< GRID_HELPER > MakeGridHelper() override
void UpdateItem(EDA_ITEM *aItem, bool isAddOrDelete=false, bool aUpdateRtree=false) override
Mark an item for refresh.
void setupUIConditions() override
Setup the UI conditions for the various actions and their controls in this frame.
APP_SETTINGS_BASE * config() const override
Return the settings object used in SaveSettings(), and is overloaded in KICAD_MANAGER_FRAME.
bool addLibTableEntry(const wxString &aLibFile, TABLE_SCOPE aScope=GLOBAL_LIB_TABLE)
Add aLibFile to the symbol library table defined by aScope.
void storeCurrentSymbol()
Rename LIB_SYMBOL aliases to avoid conflicts before adding a symbol to a library.
bool IsLibraryTreeShown() const override
const BOX2I GetDocumentExtents(bool aIncludeAllVisible=true) const override
Return bounding box of document with option to not include some items.
SELECTION & GetCurrentSelection() override
Get the current selection from the canvas area.
wxString getTargetLib() const
bool IsCurrentSymbol(const LIB_ID &aLibId) const
Restore the empty editor screen, without any symbol or library selected.
bool backupFile(const wxFileName &aOriginalFile, const wxString &aBackupExt)
Return currently edited symbol.
void FocusOnItem(SCH_ITEM *aItem)
void RefreshLibraryTree()
Redisplay the library tree.
void updateSelectionFilterVisbility() override
Selection filter panel doesn't have a dedicated visibility control, so show it if any other AUI panel...
void CommonSettingsChanged(int aFlags) override
Called after the preferences dialog is run.
void FocusLibraryTreeInput() override
wxComboBox * m_unitSelectBox
int GetTreeLIBIDs(std::vector< LIB_ID > &aSelection) const
LIB_ID GetTreeLIBID(int *aUnit=nullptr) const
Return the LIB_ID of the library or symbol selected in the symbol tree.
LIB_SYMBOL_LIBRARY_MANAGER * m_libMgr
wxString GetCurLib() const
The nickname of the current library being edited and empty string if none.
void FocusOnLibId(const LIB_ID &aLibID)
bool IsSymbolAlias() const
Return true if aLibId is an alias for the editor screen symbol.
void ToggleProperties() override
SYMBOL_EDITOR_SETTINGS * m_settings
int GetBodyStyle() const
void HardRedraw() override
Rebuild the GAL and redraw the screen.
bool GetShowDeMorgan() const
bool m_SyncPinEdit
Set to true to synchronize pins at the same position when editing symbols with multiple units or mult...
int GetTreeSelectionCount() const
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
bool CanCloseSymbolFromSchematic(bool doClose)
bool IsSymbolFromLegacyLibrary() const
bool replaceLibTableEntry(const wxString &aLibNickname, const wxString &aLibFile)
Replace the file path of the symbol library table entry aLibNickname with aLibFile.
bool IsSymbolFromSchematic() const
static bool m_showDeMorgan
void SetScreen(BASE_SCREEN *aScreen) override
SYMBOL_EDITOR_SETTINGS * GetSettings() const
SCH_SCREEN * m_dummyScreen
< Helper screen used when no symbol is loaded
void KiwayMailIn(KIWAY_EXPRESS &mail) override
Receive KIWAY_EXPRESS messages from other players.
void SetCurSymbol(LIB_SYMBOL *aSymbol, bool aUpdateZoom)
Take ownership of aSymbol and notes that it is the one currently being edited.
KIID m_schematicSymbolUUID
RefDes of the symbol (only valid if symbol was loaded from schematic)
bool IsSymbolEditable() const
Test if a symbol is loaded and can be edited.
std::vector< LIB_ID > GetSelectedLibIds() const
void SyncLibraries(bool aShowProgress, bool aPreloadCancelled=false, const wxString &aForceRefresh=wxEmptyString)
Synchronize the library manager to the symbol library table, and then the symbol tree to the library ...
void OnSelectUnit(wxCommandEvent &event)
LIB_SYMBOL * GetCurSymbol() const
Return the current symbol being edited or NULL if none selected.
void UpdateSymbolMsgPanelInfo()
Display the documentation of the selected symbol.
bool canCloseWindow(wxCloseEvent &aCloseEvent) override
LIB_ID GetTargetLibId() const override
Return either the symbol selected in the symbol tree (if context menu is active) or the symbol on the...
int m_bodyStyle
Flag if the symbol being edited was loaded directly from a schematic.
bool saveAllLibraries(bool aRequireConfirmation)
Save the current symbol.
void SetUnit(int aUnit)
void UpdateMsgPanel() override
Redraw the message panel.
void ClearUndoORRedoList(UNDO_REDO_LIST whichList, int aItemCount=-1) override
Free the undo or redo list from aList element.
LIB_TREE * GetLibTree() const override
wxString SetCurLib(const wxString &aLibNickname)
Set the current library nickname and returns the old library nickname.
void UpdateTitle()
Update the main window title bar with the current library name and read only status of the library.
bool LoadSymbolFromCurrentLib(const wxString &aSymbolName, int aUnit=0, int aBodyStyle=0)
Load a symbol from the current active library, optionally setting the selected unit and convert.
bool HasLibModifications() const
Check if any pending libraries have been modified.
SYMBOL_TREE_PANE * m_treePane
void LoadSymbolFromSchematic(SCH_SYMBOL *aSymbol)
Load a symbol from the schematic to edit in place.
COLOR_SETTINGS * GetColorSettings(bool aForceRefresh=false) const override
Returns a pointer to the active color theme settings.
LIB_SYMBOL_LIBRARY_MANAGER & GetLibManager()
void SaveSymbolCopyAs(bool aOpenCopy)
Save the currently selected symbol to a new name and/or location.
void SwitchCanvas(EDA_DRAW_PANEL_GAL::GAL_TYPE aCanvasType) override
Switch currently used canvas ( Cairo / OpenGL).
void doCloseWindow() override
void DdAddLibrary(wxString aLibFile)
Add a library dropped file to the symbol library table.
wxString AddLibraryFile(bool aCreateNew)
Create or add an existing library to the symbol library table.
void CloseWindow(wxCommandEvent &event)
Trigger the wxCloseEvent, which is handled by the function given to EVT_CLOSE() macro:
void UpdateLibraryTree(const wxDataViewItem &aTreeItem, LIB_SYMBOL *aSymbol)
Update a symbol node in the library tree.
void OnModify() override
Must be called after a schematic change in order to set the "modify" flag of the current symbol.
void SetShowDeMorgan(bool show)
void ShowChangedLanguage() override
void SaveLibraryAs()
Save the currently selected library to a new file.
bool IsContentModified() const override
Get if any symbols or libraries have been modified but not saved.
void ToggleLibraryTree() override
LIB_SYMBOL * getTargetSymbol() const
Return either the library selected in the symbol tree, if context menu is active or the library that ...
void OnUpdateUnitNumber(wxUpdateUIEvent &event)
Toolbar configuration for the symbol editor frame.
bool IsLibraryReadOnly(const wxString &aLibrary) const
Return true if the library is stored in a read-only file.
bool LibraryExists(const wxString &aLibrary, bool aCheckEnabled=false) const
Return true if library exists.
LIB_SYMBOL * GetBufferedSymbol(const wxString &aSymbolName, const wxString &aLibrary)
Return the symbol copy from the buffer.
SCH_SCREEN * GetScreen(const wxString &aSymbolName, const wxString &aLibrary)
Return the screen used to edit a specific symbol.
bool AddLibrary(const wxString &aFilePath, SYMBOL_LIB_TABLE &aTable)
Add an existing library.
bool IsLibraryModified(const wxString &aLibrary) const
Return true if library has unsaved modifications.
LIB_SYMBOL * GetSymbol(const wxString &aSymbolName, const wxString &aLibrary) const
Return either an alias of a working LIB_SYMBOL copy, or alias of the original symbol if there is no w...
wxArrayString GetLibraryNames() const
Return the array of library names.
wxString GetUniqueLibraryName() const
Return a library name that is not currently in use.
bool CreateLibrary(const wxString &aFilePath, SYMBOL_LIB_TABLE &aTable)
Create an empty library and adds it to the library table.
bool IsSymbolModified(const wxString &aSymbolName, const wxString &aLibrary) const
Return true if symbol has unsaved modifications.
SYMBOL_LIB_TABLE_ROW * GetLibrary(const wxString &aLibrary) const
Find a single library within the (aggregate) library table.
bool UpdateSymbol(LIB_SYMBOL *aSymbol, const wxString &aLibrary)
Update the symbol buffer with a new version of the symbol.
bool UpdateLibraryBuffer(const wxString &aLibrary)
Update the library buffer with a new version of the library.
Hold a record identifying a symbol library accessed by the appropriate symbol library SCH_IO object i...
void SetType(const wxString &aType) override
Change the schematic plugin type represented by this row.
const wxString GetType() const override
Return the type of symbol library table represented by this row.
static SYMBOL_LIB_TABLE & GetGlobalLibTable()
static const wxString GetSymbolLibTableFileName()
static wxString GetGlobalTableFileName()
Fetch the global symbol library table file name.
SYMBOL_LIB_TABLE_ROW * FindRow(const wxString &aNickName, bool aCheckIfEnabled=false)
Return an SYMBOL_LIB_TABLE_ROW if aNickName is found in this table or in any chained fallBack table f...
Library Editor pane with symbol tree and symbol library table selector.
TOOL_MANAGER * m_toolManager
Definition: tools_holder.h:171
TOOL_DISPATCHER * m_toolDispatcher
Definition: tools_holder.h:173
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:55
ACTIONS * m_actions
Definition: tools_holder.h:172
@ MODEL_RELOAD
Model changes (the sheet for a schematic)
Definition: tool_base.h:80
virtual void DispatchWxEvent(wxEvent &aEvent)
Process wxEvents (mostly UI events), translate them to TOOL_EVENTs, and make tools handle those.
Master controller class:
Definition: tool_manager.h:62
bool RunAction(const std::string &aActionName, T aParam)
Run the specified action immediately, pausing the current action to run the new one.
Definition: tool_manager.h:150
bool InvokeTool(TOOL_ID aToolId)
Call a tool by sending a tool activation event to tool of given ID.
ACTION_MANAGER * GetActionManager() const
Definition: tool_manager.h:302
void ResetTools(TOOL_BASE::RESET_REASON aReason)
Reset all tools (i.e.
void RegisterTool(TOOL_BASE *aTool)
Add a tool to the manager set and sets it up.
void SetEnvironment(EDA_ITEM *aModel, KIGFX::VIEW *aView, KIGFX::VIEW_CONTROLS *aViewControls, APP_SETTINGS_BASE *aSettings, TOOLS_HOLDER *aFrame)
Set the work environment (model, view, view controls and the parent window).
void InitTools()
Initialize all registered tools.
void ShutdownAllTools()
Shutdown all tools with a currently registered event loop in this tool manager by waking them up with...
A holder to handle a list of undo (or redo) commands.
std::vector< PICKED_ITEMS_LIST * > m_CommandsList
bool empty() const
Definition: utf8.h:104
A modified version of the wxInfoBar class that allows us to:
Definition: wx_infobar.h:76
void RemoveAllButtons()
Remove all the buttons that have been added by the user.
Definition: wx_infobar.cpp:353
void AddButton(wxButton *aButton)
Add an already created button to the infobar.
Definition: wx_infobar.cpp:309
void Dismiss() override
Dismisses the infobar and updates the containing layout and AUI manager (if one is provided).
Definition: wx_infobar.cpp:190
void ShowMessage(const wxString &aMessage, int aFlags=wxICON_INFORMATION) override
Show the info bar with the provided message and icon.
Definition: wx_infobar.cpp:154
Multi-thread safe progress reporter dialog, intended for use of tasks that parallel reporting back of...
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition: confirm.cpp:194
int UnsavedChangesDialog(wxWindow *parent, const wxString &aMessage, bool *aApplyToAll)
A specialized version of HandleUnsavedChanges which handles an apply-to-all checkbox.
Definition: confirm.cpp:66
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
Definition: confirm.cpp:170
This file is part of the common library.
#define CHECK(x)
#define ENABLE(x)
#define _HKI(x)
static bool empty(const wxTextEntryBase *aCtrl)
#define _(s)
#define KICAD_DEFAULT_DRAWFRAME_STYLE
#define LIB_EDIT_FRAME_NAME
@ ID_LIBEDIT_SELECT_UNIT_NUMBER
Definition: eeschema_id.h:60
const wxAuiPaneInfo & defaultSchSelectionFilterPaneInfo(wxWindow *aWindow)
const wxAuiPaneInfo & defaultPropertiesPaneInfo(wxWindow *aWindow)
wxString NormalizePath(const wxFileName &aFilePath, const ENV_VAR_MAP *aEnvVars, const wxString &aProjectPath)
Normalize a file path to an environmental variable, if possible.
Definition: env_paths.cpp:73
Helper functions to substitute paths with environmental variables.
@ FRAME_SCH_SYMBOL_EDITOR
Definition: frame_type.h:35
@ FRAME_SCH
Definition: frame_type.h:34
static const std::string KiCadSymbolLibFileExtension
static wxString KiCadSymbolLibFileWildcard()
std::map< wxString, ENV_VAR_ITEM > ENV_VAR_MAP
PROJECT & Prj()
Definition: kicad.cpp:597
This file is part of the common library.
KIID niluuid(0)
@ LAYER_SCHEMATIC_GRID_AXES
Definition: layer_ids.h:476
@ MAIL_LIB_EDIT
Definition: mail_type.h:55
@ MAIL_REFRESH_SYMBOL
Definition: mail_type.h:59
@ MAIL_RELOAD_LIB
Definition: mail_type.h:57
@ ALL
All except INITIAL_ADD.
Definition: view_item.h:59
void SetShutdownBlockReason(wxWindow *aWindow, const wxString &aReason)
Sets the block reason why the window/application is preventing OS shutdown.
Definition: unix/app.cpp:90
bool SupportsShutdownBlockReason()
Whether or not the window supports setting a shutdown block reason.
Definition: unix/app.cpp:79
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
Definition: kicad_algo.h:100
void InvokeSchEditSymbolLibTable(KIWAY *aKiway, wxWindow *aParent)
void Refresh()
Update the board display after modifying it by a python script (note: it is automatically called by a...
PGM_BASE & Pgm()
The global program "get" accessor.
Definition: pgm_base.cpp:1073
see class PGM_BASE
KIWAY Kiway(KFCTL_STANDALONE)
wxString UnescapeString(const wxString &aSource)
Functors that can be used to figure out how the action controls should be displayed in the UI and if ...
ACTION_CONDITIONS & Enable(const SELECTION_CONDITION &aCondition)
ACTION_CONDITIONS & Check(const SELECTION_CONDITION &aCondition)
constexpr int mmToIU(double mm) const
Definition: base_units.h:88
@ SYM_ORIENT_270
Definition: symbol.h:42
@ SYM_MIRROR_Y
Definition: symbol.h:44
@ SYM_ORIENT_180
Definition: symbol.h:41
@ SYM_MIRROR_X
Definition: symbol.h:43
@ SYM_ORIENT_90
Definition: symbol.h:40
#define EDIT_TOOL(tool)
Definition for symbol library class.
#define ENVVARS_CHANGED
Definition: tools_holder.h:152
VECTOR2< int32_t > VECTOR2I
Definition: vector2d.h:695
VECTOR2< double > VECTOR2D
Definition: vector2d.h:694
Definition of file extensions used in Kicad.
void SetAuiPaneSize(wxAuiManager &aManager, wxAuiPaneInfo &aPane, int aWidth, int aHeight)
Sets the size of an AUI pane, working around http://trac.wxwidgets.org/ticket/13180.