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 (C) 2004-2024 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>
50#include <tool/action_manager.h>
51#include <tool/action_toolbar.h>
52#include <tool/common_control.h>
53#include <tool/common_tools.h>
55#include <tool/embed_tool.h>
57#include <tool/picker_tool.h>
59#include <tool/selection.h>
61#include <tool/tool_manager.h>
62#include <tool/zoom_tool.h>
63#include <tools/ee_actions.h>
73#include <view/view_controls.h>
75#include <widgets/wx_infobar.h>
82#include <panel_sym_lib_table.h>
83#include <string_utils.h>
84#include <wx/msgdlg.h>
85#include <wx/log.h>
86
87
89
90
91BEGIN_EVENT_TABLE( SYMBOL_EDIT_FRAME, SCH_BASE_FRAME )
93
94 // menubar commands
95 EVT_MENU( wxID_EXIT, SYMBOL_EDIT_FRAME::OnExitKiCad )
96 EVT_MENU( wxID_CLOSE, SYMBOL_EDIT_FRAME::CloseWindow )
97
98 // Update user interface elements.
100
101 // Drop files event
102 EVT_DROP_FILES( SYMBOL_EDIT_FRAME::OnDropFiles )
103
104END_EVENT_TABLE()
105
106
107SYMBOL_EDIT_FRAME::SYMBOL_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
108 SCH_BASE_FRAME( aKiway, aParent, FRAME_SCH_SYMBOL_EDITOR, _( "Library Editor" ),
109 wxDefaultPosition, wxDefaultSize, KICAD_DEFAULT_DRAWFRAME_STYLE,
111 m_unitSelectBox( nullptr ),
112 m_isSymbolFromSchematic( false )
113{
114 SetShowDeMorgan( false );
115 m_SyncPinEdit = false;
116
117 m_symbol = nullptr;
118 m_treePane = nullptr;
119 m_libMgr = nullptr;
120 m_unit = 1;
121 m_bodyStyle = 1;
122 m_aboutTitle = _HKI( "KiCad Symbol Editor" );
123
124 wxIcon icon;
125 wxIconBundle icon_bundle;
126
127 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit, 48 ) );
128 icon_bundle.AddIcon( icon );
129 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit, 256 ) );
130 icon_bundle.AddIcon( icon );
131 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit, 128 ) );
132 icon_bundle.AddIcon( icon );
133 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit_32 ) );
134 icon_bundle.AddIcon( icon );
135 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit_16 ) );
136 icon_bundle.AddIcon( icon );
137
138 SetIcons( icon_bundle );
139
141 LoadSettings( m_settings );
142
143 m_libMgr = new LIB_SYMBOL_LIBRARY_MANAGER( *this );
144 bool loadingCancelled = false;
145
146 {
147 // Preload libraries before using SyncLibraries the first time, as the preload is
148 // multi-threaded
149 WX_PROGRESS_REPORTER reporter( this, _( "Loading Symbol Libraries" ),
150 m_libMgr->GetLibraryCount(), true );
151 m_libMgr->Preload( reporter );
152
153 loadingCancelled = reporter.IsCancelled();
154 wxSafeYield();
155 }
156
157 SyncLibraries( false, loadingCancelled );
158 m_treePane = new SYMBOL_TREE_PANE( this, m_libMgr );
159 m_treePane->GetLibTree()->SetSortMode( (LIB_TREE_MODEL_ADAPTER::SORT_MODE) m_settings->m_LibrarySortMode );
160
161 resolveCanvasType();
162 SwitchCanvas( m_canvasType );
163
164 // Ensure axis are always drawn
165 KIGFX::GAL_DISPLAY_OPTIONS& gal_opts = GetGalDisplayOptions();
166 gal_opts.m_axesEnabled = true;
167
168 m_dummyScreen = new SCH_SCREEN();
169 SetScreen( m_dummyScreen );
170 GetScreen()->m_Center = true;
171
172 GetCanvas()->GetViewControls()->SetCrossHairCursorPosition( VECTOR2D( 0, 0 ), false );
173
174 GetRenderSettings()->LoadColors( GetColorSettings() );
175 GetRenderSettings()->m_IsSymbolEditor = true;
176 GetCanvas()->GetGAL()->SetAxesColor( m_colorSettings->GetColor( LAYER_SCHEMATIC_GRID_AXES ) );
177
178 setupTools();
179 setupUIConditions();
180
181 ReCreateMenuBar();
182 ReCreateHToolbar();
183 ReCreateVToolbar();
184 ReCreateOptToolbar();
185
186 UpdateTitle();
187 UpdateSymbolMsgPanelInfo();
188 RebuildSymbolUnitsList();
189
190 m_propertiesPanel = new SCH_PROPERTIES_PANEL( this, this );
191 m_propertiesPanel->SetSplitterProportion( m_settings->m_AuiPanels.properties_splitter );
192
193 m_selectionFilterPanel = new PANEL_SCH_SELECTION_FILTER( this );
194
195 m_auimgr.SetManagedWindow( this );
196
197 CreateInfoBar();
198
199 // Rows; layers 4 - 6
200 m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( "MainToolbar" )
201 .Top().Layer( 6 ) );
202
203 m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( "MsgPanel" )
204 .Bottom().Layer( 6 ) );
205
206 // Columns; layers 1 - 3
207 m_auimgr.AddPane( m_treePane, EDA_PANE().Palette().Name( "LibraryTree" )
208 .Left().Layer( 3 )
209 .TopDockable( false ).BottomDockable( false )
210 .Caption( _( "Libraries" ) )
211 .MinSize( FromDIP( 250 ), -1 ).BestSize( FromDIP( 250 ), -1 ) );
212
213 m_auimgr.AddPane( m_propertiesPanel, defaultPropertiesPaneInfo( this ) );
214 // Show or hide m_propertiesPanel depending on current settings:
215 wxAuiPaneInfo& propertiesPaneInfo = m_auimgr.GetPane( PropertiesPaneName() );
216
217 m_auimgr.AddPane( m_selectionFilterPanel, defaultSchSelectionFilterPaneInfo( this ) );
218
219 wxAuiPaneInfo& selectionFilterPane = m_auimgr.GetPane( wxS( "SelectionFilter" ) );
220 // The selection filter doesn't need to grow in the vertical direction when docked
221 selectionFilterPane.dock_proportion = 0;
222
223 propertiesPaneInfo.Show( m_settings->m_AuiPanels.show_properties );
224 updateSelectionFilterVisbility();
225
226 m_auimgr.AddPane( m_optionsToolBar, EDA_PANE().VToolbar().Name( "OptToolbar" )
227 .Left().Layer( 2 ) );
228
229 m_auimgr.AddPane( m_drawToolBar, EDA_PANE().VToolbar().Name( "ToolsToolbar" )
230 .Right().Layer( 2 ) );
231
232 // Center
233 m_auimgr.AddPane( GetCanvas(), wxAuiPaneInfo().Name( "DrawFrame" )
234 .CentrePane() );
235
236 FinishAUIInitialization();
237
238 // Can't put this in LoadSettings, because it has to be called before setupTools :/
239 EE_SELECTION_TOOL* selTool = GetToolManager()->GetTool<EE_SELECTION_TOOL>();
240 selTool->GetFilter() = GetSettings()->m_SelectionFilter;
241
242 if( m_settings->m_LibWidth > 0 )
243 SetAuiPaneSize( m_auimgr, m_auimgr.GetPane( "LibraryTree" ), m_settings->m_LibWidth, -1 );
244
245 Raise();
246 Show( true );
247
248 SyncView();
249 GetCanvas()->GetView()->UseDrawPriority( true );
250 GetCanvas()->GetGAL()->SetAxesEnabled( true );
251
252 setupUnits( m_settings );
253
254 // Set the working/draw area size to display a symbol to a reasonable value:
255 // A 600mm x 600mm with a origin at the area center looks like a large working area
256 double max_size_x = schIUScale.mmToIU( 600 );
257 double max_size_y = schIUScale.mmToIU( 600 );
258 BOX2D bbox;
259 bbox.SetOrigin( -max_size_x /2, -max_size_y/2 );
260 bbox.SetSize( max_size_x, max_size_y );
261 GetCanvas()->GetView()->SetBoundary( bbox );
262
263 m_toolManager->RunAction( ACTIONS::zoomFitScreen );
264
266 DragAcceptFiles( true );
267
268 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "Library changes are unsaved" ) );
269
270 // Catch unhandled accelerator command characters that were no handled by the library tree
271 // panel.
272 Bind( wxEVT_CHAR, &TOOL_DISPATCHER::DispatchWxEvent, m_toolDispatcher );
273 Bind( wxEVT_CHAR_HOOK, &TOOL_DISPATCHER::DispatchWxEvent, m_toolDispatcher );
274
275 // Ensure the window is on top
276 Raise();
277
278 if( loadingCancelled )
279 ShowInfoBarWarning( _( "Symbol library loading was cancelled by user." ) );
280}
281
282
284{
285 // Shutdown all running tools
286 if( m_toolManager )
288
289 setSymWatcher( nullptr );
290
292 {
293 delete m_symbol;
294 m_symbol = nullptr;
295
296 SCH_SCREEN* screen = GetScreen();
297 delete screen;
299 }
300
301 // current screen is destroyed in EDA_DRAW_FRAME
303
304 SYMBOL_EDITOR_SETTINGS* cfg = nullptr;
305
306 try
307 {
309 }
310 catch( const std::runtime_error& e )
311 {
312 wxFAIL_MSG( e.what() );
313 }
314
315 if( cfg )
316 Pgm().GetSettingsManager().Save( cfg );
317
318 delete m_libMgr;
319}
320
321
323{
324 wxCHECK_RET( m_settings, "Call to SYMBOL_EDIT_FRAME::LoadSettings with null m_boardAdapter" );
325
327
332 GetRenderSettings()->SetDefaultFont( wxEmptyString );
333}
334
335
337{
338 wxCHECK_RET( m_settings, "Call to SYMBOL_EDIT_FRAME::LoadSettings with null m_boardAdapter" );
339
341
343
348
349 m_settings->m_LibWidth = m_treePane->GetSize().x;
350
352
354 bool prop_shown = m_auimgr.GetPane( PropertiesPaneName() ).IsShown();
356
359}
360
361
363{
364 return static_cast<APP_SETTINGS_BASE*>( GetSettings() );
365}
366
367
369{
371
372 if( GetSettings()->m_UseEeschemaColorSettings )
374 else
375 return mgr.GetColorSettings( GetSettings()->m_ColorTheme );
376}
377
378
380{
381 // Create the manager and dispatcher & route draw panel events to the dispatcher
384 GetCanvas()->GetViewControls(), GetSettings(), this );
385 m_actions = new EE_ACTIONS();
387
388 // Register tools
405
406 // Run the selection tool, it is supposed to be always active
407 m_toolManager->InvokeTool( "eeschema.InteractiveSelection" );
408
410}
411
412
414{
416
418 EDITOR_CONDITIONS cond( this );
419
420 wxASSERT( mgr );
421
422#define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
423#define CHECK( x ) ACTION_CONDITIONS().Check( x )
424
425 auto haveSymbolCond =
426 [this]( const SELECTION& )
427 {
428 return m_symbol;
429 };
430
431 auto isEditableCond =
432 [this]( const SELECTION& )
433 {
434 // Only root symbols from the new s-expression libraries or the schematic
435 // are editable.
436 return IsSymbolEditable() && !IsSymbolAlias();
437 };
438
439 auto isEditableInAliasCond =
440 [this]( const SELECTION& )
441 {
442 // Less restrictive than isEditableCond
443 // Symbols fields (root symbols and aliases) from the new s-expression libraries
444 // or in the schematic are editable.
445 return IsSymbolEditable();
446 };
447
448 auto symbolModifiedCondition =
449 [this]( const SELECTION& sel )
450 {
453 };
454
455 auto libSelectedCondition =
456 [this]( const SELECTION& sel )
457 {
458 return !GetTargetLibId().GetLibNickname().empty();
459 };
460
461 auto canEditProperties =
462 [this]( const SELECTION& sel )
463 {
465 };
466
467 auto saveSymbolAsCondition =
468 [this]( const SELECTION& aSel )
469 {
470 return getTargetSymbol() != nullptr;
471 };
472
473 const auto isSymbolFromSchematicCond =
474 [this]( const SELECTION& )
475 {
476 return IsSymbolFromSchematic();
477 };
478
479 // clang-format off
482 mgr->SetConditions( EE_ACTIONS::saveLibraryAs, ENABLE( libSelectedCondition ) );
483 mgr->SetConditions( EE_ACTIONS::saveSymbolAs, ENABLE( saveSymbolAsCondition ) );
484 mgr->SetConditions( EE_ACTIONS::saveSymbolCopyAs, ENABLE( saveSymbolAsCondition ) );
487 mgr->SetConditions( EE_ACTIONS::editLibSymbolWithLibEdit, ENABLE( isSymbolFromSchematicCond ) );
488
489 mgr->SetConditions( ACTIONS::undo, ENABLE( haveSymbolCond && cond.UndoAvailable() ) );
490 mgr->SetConditions( ACTIONS::redo, ENABLE( haveSymbolCond && cond.RedoAvailable() ) );
491 mgr->SetConditions( ACTIONS::revert, ENABLE( symbolModifiedCondition ) );
492
496 mgr->SetConditions( ACTIONS::millimetersUnits, CHECK( cond.Units( EDA_UNITS::MILLIMETRES ) ) );
497 mgr->SetConditions( ACTIONS::inchesUnits, CHECK( cond.Units( EDA_UNITS::INCHES ) ) );
498 mgr->SetConditions( ACTIONS::milsUnits, CHECK( cond.Units( EDA_UNITS::MILS ) ) );
499
500 mgr->SetConditions( ACTIONS::cut, ENABLE( isEditableCond ) );
501 mgr->SetConditions( ACTIONS::copy, ENABLE( haveSymbolCond ) );
502 mgr->SetConditions( ACTIONS::copyAsText, ENABLE( haveSymbolCond ) );
503 mgr->SetConditions( ACTIONS::paste, ENABLE( isEditableCond &&
505 mgr->SetConditions( ACTIONS::doDelete, ENABLE( isEditableCond ) );
506 mgr->SetConditions( ACTIONS::duplicate, ENABLE( isEditableCond ) );
507 mgr->SetConditions( ACTIONS::selectAll, ENABLE( haveSymbolCond ) );
508 mgr->SetConditions( ACTIONS::unselectAll, ENABLE( haveSymbolCond ) );
509
510 // These actions in symbol editor when editing alias field rotations are allowed.
511 mgr->SetConditions( EE_ACTIONS::rotateCW, ENABLE( isEditableInAliasCond ) );
512 mgr->SetConditions( EE_ACTIONS::rotateCCW, ENABLE( isEditableInAliasCond ) );
513
514 mgr->SetConditions( EE_ACTIONS::mirrorH, ENABLE( isEditableCond ) );
515 mgr->SetConditions( EE_ACTIONS::mirrorV, ENABLE( isEditableCond ) );
516
519 // clang-format on
520
521 auto pinTypeCond =
522 [this]( const SELECTION& )
523 {
525 };
526
527 auto hiddenPinCond =
528 [this]( const SELECTION& )
529 {
531 };
532
533 auto hiddenFieldCond =
534 [this]( const SELECTION& )
535 {
537 };
538
539 auto showPinAltIconsCond =
540 [this]( const SELECTION& )
541 {
543 };
544
545 auto showLibraryTreeCond =
546 [this]( const SELECTION& )
547 {
548 return IsLibraryTreeShown();
549 };
550
551 auto propertiesCond =
552 [this] ( const SELECTION& )
553 {
554 return m_auimgr.GetPane( PropertiesPaneName() ).IsShown();
555 };
556
559 mgr->SetConditions( ACTIONS::showLibraryTree, CHECK( showLibraryTreeCond ) );
560 mgr->SetConditions( ACTIONS::showProperties, CHECK( propertiesCond ) );
561 mgr->SetConditions( EE_ACTIONS::showHiddenPins, CHECK( hiddenPinCond ) );
562 mgr->SetConditions( EE_ACTIONS::showHiddenFields, CHECK( hiddenFieldCond ) );
563 mgr->SetConditions( EE_ACTIONS::togglePinAltIcons, CHECK( showPinAltIconsCond ) );
564
565 auto demorganCond =
566 [this]( const SELECTION& )
567 {
568 return GetShowDeMorgan();
569 };
570
571 auto demorganStandardCond =
572 [this]( const SELECTION& )
573 {
574 return m_bodyStyle == BODY_STYLE::BASE;
575 };
576
577 auto demorganAlternateCond =
578 [this]( const SELECTION& )
579 {
580 return m_bodyStyle == BODY_STYLE::DEMORGAN;
581 };
582
583 auto multiUnitModeCond =
584 [this]( const SELECTION& )
585 {
586 return m_symbol && m_symbol->IsMulti() && !m_symbol->UnitsLocked();
587 };
588
589 auto hasMultipleUnitsCond =
590 [this]( const SELECTION& )
591 {
592 return m_symbol && m_symbol->IsMulti();
593 };
594
595 auto syncedPinsModeCond =
596 [this]( const SELECTION& )
597 {
598 return m_SyncPinEdit;
599 };
600
601 auto haveDatasheetCond =
602 [this]( const SELECTION& )
603 {
604 return m_symbol && !m_symbol->GetDatasheetField().GetText().IsEmpty();
605 };
606
607 mgr->SetConditions( ACTIONS::showDatasheet, ENABLE( haveDatasheetCond ) );
608 mgr->SetConditions( EE_ACTIONS::symbolProperties, ENABLE( canEditProperties && haveSymbolCond ) );
609 mgr->SetConditions( EE_ACTIONS::runERC, ENABLE( haveSymbolCond ) );
610 mgr->SetConditions( EE_ACTIONS::pinTable, ENABLE( isEditableCond && haveSymbolCond ) );
611
613 ACTION_CONDITIONS().Enable( demorganCond ).Check( demorganStandardCond ) );
615 ACTION_CONDITIONS().Enable( demorganCond ).Check( demorganAlternateCond ) );
617 ACTION_CONDITIONS().Enable( multiUnitModeCond ).Check( syncedPinsModeCond ) );
619 ACTION_CONDITIONS().Enable( isEditableCond && hasMultipleUnitsCond ) );
620
621// Only enable a tool if the symbol is edtable
622#define EDIT_TOOL( tool ) ACTION_CONDITIONS().Enable( isEditableCond ).Check( cond.CurrentTool( tool ) )
623
636
637#undef CHECK
638#undef ENABLE
639#undef EDIT_TOOL
640}
641
642
644{
645 if( IsContentModified() )
646 {
647 SCH_EDIT_FRAME* schframe = (SCH_EDIT_FRAME*) Kiway().Player( FRAME_SCH, false );
648 wxString msg = _( "Save changes to '%s' before closing?" );
649
650 switch( UnsavedChangesDialog( this, wxString::Format( msg, m_reference ), nullptr ) )
651 {
652 case wxID_YES:
653 if( schframe && GetCurSymbol() ) // Should be always the case
655
656 break;
657
658 case wxID_NO:
659 break;
660
661 default:
662 case wxID_CANCEL:
663 return false;
664 }
665 }
666
667 if( doClose )
668 {
669 SetCurSymbol( nullptr, false );
670 UpdateTitle();
671 }
672
673 return true;
674}
675
676
677bool SYMBOL_EDIT_FRAME::canCloseWindow( wxCloseEvent& aEvent )
678{
679 // Shutdown blocks must be determined and vetoed as early as possible
681 && aEvent.GetId() == wxEVT_QUERY_END_SESSION
682 && IsContentModified() )
683 {
684 return false;
685 }
686
688 return false;
689
690 if( !saveAllLibraries( true ) )
691 return false;
692
693 // Save symbol tree column widths
694 m_libMgr->GetAdapter()->SaveSettings();
695
696 return true;
697}
698
699
701{
702 Destroy();
703}
704
705
707{
708 if( !m_unitSelectBox )
709 return;
710
711 if( m_unitSelectBox->GetCount() != 0 )
712 m_unitSelectBox->Clear();
713
714 if( !m_symbol || m_symbol->GetUnitCount() <= 1 )
715 {
716 m_unit = 1;
717 m_unitSelectBox->Append( wxEmptyString );
718 }
719 else
720 {
721 for( int i = 0; i < m_symbol->GetUnitCount(); i++ )
722 {
723 wxString unitDisplayName = m_symbol->GetUnitDisplayName( i + 1 );
724 m_unitSelectBox->Append( unitDisplayName );
725 }
726 }
727
728 // Ensure the selected unit is compatible with the number of units of the current symbol:
730 m_unit = 1;
731
732 m_unitSelectBox->SetSelection(( m_unit > 0 ) ? m_unit - 1 : 0 );
733}
734
735
737{
738 wxAuiPaneInfo& treePane = m_auimgr.GetPane( m_treePane );
739 treePane.Show( !IsLibraryTreeShown() );
741 m_auimgr.Update();
742 Refresh();
743}
744
745
747{
748 return const_cast<wxAuiManager&>( m_auimgr ).GetPane( m_treePane ).IsShown();
749}
750
751
753{
755}
756
757
759{
760 m_treePane->Freeze();
761 m_libMgr->GetAdapter()->Freeze();
762}
763
764
766{
767 m_libMgr->GetAdapter()->Thaw();
768 m_treePane->Thaw();
769}
770
771
772void SYMBOL_EDIT_FRAME::OnExitKiCad( wxCommandEvent& event )
773{
774 Kiway().OnKiCadExit();
775}
776
777
778void SYMBOL_EDIT_FRAME::OnUpdateUnitNumber( wxUpdateUIEvent& event )
779{
780 event.Enable( m_symbol && m_symbol->GetUnitCount() > 1 );
781}
782
783
784void SYMBOL_EDIT_FRAME::OnSelectUnit( wxCommandEvent& event )
785{
786 int i = event.GetSelection();
787
788 if( i == wxNOT_FOUND )
789 return;
790
791 SetUnit( i + 1 );
792}
793
794
796{
797 if( m_symbol )
798 {
800
801 if( row && row->GetType() == SCH_IO_MGR::ShowType( SCH_IO_MGR::SCH_LEGACY ) )
802 return true;
803 }
804
805 return false;
806}
807
808
810{
811 wxString libNickname = Prj().GetRString( PROJECT::SCH_LIBEDIT_CUR_LIB );
812
813 if( !libNickname.empty() )
814 {
815 if( !PROJECT_SCH::SchSymbolLibTable( &Prj() )->HasLibrary( libNickname ) )
816 {
817 Prj().SetRString( PROJECT::SCH_LIBEDIT_CUR_LIB, wxEmptyString );
818 libNickname = wxEmptyString;
819 }
820 }
821
822 return libNickname;
823}
824
825
826wxString SYMBOL_EDIT_FRAME::SetCurLib( const wxString& aLibNickname )
827{
828 wxString old = GetCurLib();
829
830 if( aLibNickname.empty() || !PROJECT_SCH::SchSymbolLibTable( &Prj() )->HasLibrary( aLibNickname ) )
831 Prj().SetRString( PROJECT::SCH_LIBEDIT_CUR_LIB, wxEmptyString );
832 else
834
835 return old;
836}
837
838
839void SYMBOL_EDIT_FRAME::SetCurSymbol( LIB_SYMBOL* aSymbol, bool aUpdateZoom )
840{
841 wxCHECK( m_toolManager, /* void */ );
842
844 GetCanvas()->GetView()->Clear();
845 delete m_symbol;
846
847 m_symbol = aSymbol;
848
849 // select the current symbol in the tree widget
852 else
853 GetLibTree()->Unselect();
854
855 wxString symbolName;
856 wxString libName;
857
858 if( m_symbol )
859 {
860 symbolName = m_symbol->GetName();
862 }
863
864 // retain in case this wxFrame is re-opened later on the same PROJECT
866
867 // Ensure synchronized pin edit can be enabled only symbols with interchangeable units
868 m_SyncPinEdit = aSymbol && aSymbol->IsRoot() && aSymbol->IsMulti() && !aSymbol->UnitsLocked();
869
871
879
880 if( aUpdateZoom )
882
883 GetCanvas()->Refresh();
884
885 WX_INFOBAR& infobar = *GetInfoBar();
886 infobar.RemoveAllButtons();
887
888 wxArrayString msgs;
889 int infobarFlags = wxICON_INFORMATION;
890
892 {
893 msgs.push_back( wxString::Format( _( "Editing symbol %s from schematic. Saving will "
894 "update the schematic only." ),
895 m_reference ) );
896
897 wxString link = wxString::Format( _( "Open symbol from library %s" ), libName );
898 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( &infobar, wxID_ANY, link, wxEmptyString );
899
900 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
901 [this, symbolName, libName]( wxHyperlinkEvent& aEvent )
902 {
904 } ) );
905
906 infobar.AddButton( button );
907 }
908 else if( IsSymbolFromLegacyLibrary() )
909 {
910 msgs.push_back( _( "Symbols in legacy libraries are not editable. Use Manage Symbol "
911 "Libraries to migrate to current format." ) );
912
913 wxString link = _( "Manage symbol libraries" );
914 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( &infobar, wxID_ANY, link, wxEmptyString );
915
916 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
917 [this]( wxHyperlinkEvent& aEvent )
918 {
920 } ) );
921
922 infobar.AddButton( button );
923 }
924 else if( IsSymbolAlias() )
925 {
926 msgs.push_back( wxString::Format( _( "Symbol %s is a derived symbol. Symbol graphics will "
927 "not be editable." ),
928 UnescapeString( symbolName ) ) );
929
930 // Don't assume the parent symbol shared pointer is still valid.
931 if( std::shared_ptr<LIB_SYMBOL> rootSymbol = m_symbol->GetRootSymbol() )
932 {
933 int unit = GetUnit();
934 int bodyStyle = GetBodyStyle();
935 wxString rootSymbolName = rootSymbol->GetName();
936 wxString link = wxString::Format( _( "Open %s" ), UnescapeString( rootSymbolName ) );
937
938 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( &infobar, wxID_ANY, link,
939 wxEmptyString );
940
941 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
942 [this, rootSymbolName, unit, bodyStyle]( wxHyperlinkEvent& aEvent )
943 {
944 LoadSymbolFromCurrentLib( rootSymbolName, unit, bodyStyle );
945 } ) );
946
947 infobar.AddButton( button );
948 }
949 }
950
951 if( m_symbol
954 {
955 msgs.push_back( _( "Library is read-only. Changes cannot be saved to this library." ) );
956
957 wxString link = wxString::Format( _( "Create an editable copy" ) );
958 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( &infobar, wxID_ANY, link, wxEmptyString );
959
960 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
961 [this, symbolName, libName]( wxHyperlinkEvent& aEvent )
962 {
963 wxString msg = wxString::Format( _( "Create an editable copy of the symbol or "
964 "the entire library (%s)?" ),
965 libName );
966
967 KIDIALOG errorDlg( this, msg, _( "Select type of item to save" ),
968 wxYES_NO | wxCANCEL | wxICON_QUESTION );
969 // These buttons are in a weird order(?)
970 errorDlg.SetYesNoCancelLabels( _( "Copy symbol" ), _( "Cancel" ),
971 _( "Copy library" ) );
972
973 int choice = errorDlg.ShowModal();
974
975 switch( choice )
976 {
977 case wxID_YES:
978 SaveSymbolCopyAs( true );
979 break;
980 case wxID_CANCEL:
982 break;
983 default:
984 // Do nothing
985 break;
986 }
987 } ) );
988
989 infobar.AddButton( button );
990 }
991
992 if( msgs.empty() )
993 {
994 infobar.Dismiss();
995 }
996 else
997 {
998 wxString msg = wxJoin( msgs, '\n', '\0' );
999 infobar.ShowMessage( msg, infobarFlags );
1000 }
1001}
1002
1003
1005{
1006 wxASSERT( m_libMgr );
1007 return *m_libMgr;
1008}
1009
1010
1012{
1014
1016 m_autoSaveRequired = true;
1017
1018 if( !IsSymbolFromSchematic() )
1020
1022
1023 if( !GetTitle().StartsWith( "*" ) )
1024 UpdateTitle();
1025}
1026
1027
1029{
1030 wxCHECK( aUnit > 0 && aUnit <= GetCurSymbol()->GetUnitCount(), /* void*/ );
1031
1032 if( m_unit == aUnit )
1033 return;
1034
1037
1038 m_unit = aUnit;
1039
1040 if( m_unitSelectBox->GetSelection() != ( m_unit - 1 ) )
1041 m_unitSelectBox->SetSelection( m_unit - 1 );
1042
1044 RebuildView();
1046}
1047
1048
1050{
1052}
1053
1054
1055wxString SYMBOL_EDIT_FRAME::AddLibraryFile( bool aCreateNew )
1056{
1057 // Select the target library table (global/project)
1058 SYMBOL_LIB_TABLE* libTable = SelectSymLibTable();
1059
1060 if( !libTable )
1061 return wxEmptyString;
1062
1063 wxFileName fn = m_libMgr->GetUniqueLibraryName();
1064
1067 ( libTable == &SYMBOL_LIB_TABLE::GetGlobalLibTable() ),
1069 {
1070 return wxEmptyString;
1071 }
1072
1073 wxString libName = fn.GetName();
1074
1075 if( libName.IsEmpty() )
1076 return wxEmptyString;
1077
1078 if( m_libMgr->LibraryExists( libName ) )
1079 {
1080 DisplayError( this, wxString::Format( _( "Library '%s' already exists." ), libName ) );
1081 return wxEmptyString;
1082 }
1083
1084 if( aCreateNew )
1085 {
1086 if( !m_libMgr->CreateLibrary( fn.GetFullPath(), *libTable ) )
1087 {
1088 DisplayError( this, wxString::Format( _( "Could not create the library file '%s'.\n"
1089 "Make sure you have write permissions and "
1090 "try again." ),
1091 fn.GetFullPath() ) );
1092 return wxEmptyString;
1093 }
1094 }
1095 else
1096 {
1097 if( !m_libMgr->AddLibrary( fn.GetFullPath(), *libTable ) )
1098 {
1099 DisplayError( this, _( "Could not open the library file." ) );
1100 return wxEmptyString;
1101 }
1102 }
1103
1104 bool globalTable = ( libTable == &SYMBOL_LIB_TABLE::GetGlobalLibTable() );
1105 saveSymbolLibTables( globalTable, !globalTable );
1106
1107 std::string packet = fn.GetFullPath().ToStdString();
1109
1110 return fn.GetFullPath();
1111}
1112
1113
1114void SYMBOL_EDIT_FRAME::DdAddLibrary( wxString aLibFile )
1115{
1116 // Select the target library table (global/project)
1117 SYMBOL_LIB_TABLE* libTable = SelectSymLibTable();
1118
1119 if( !libTable )
1120 return;
1121
1122 wxFileName fn = wxFileName( aLibFile );
1123
1124 wxString libName = fn.GetName();
1125
1126 if( libName.IsEmpty() )
1127 return;
1128
1129 if( m_libMgr->LibraryExists( libName ) )
1130 {
1131 DisplayError( this, wxString::Format( _( "Library '%s' already exists." ), libName ) );
1132 return;
1133 }
1134
1135 if( !m_libMgr->AddLibrary( fn.GetFullPath(), *libTable ) )
1136 {
1137 DisplayError( this, _( "Could not open the library file." ) );
1138 return;
1139 }
1140
1141 bool globalTable = ( libTable == &SYMBOL_LIB_TABLE::GetGlobalLibTable() );
1142 saveSymbolLibTables( globalTable, !globalTable );
1143
1144 std::string packet = fn.GetFullPath().ToStdString();
1146}
1147
1148
1150{
1151 return GetLibTree()->GetSelectedLibId( aUnit );
1152}
1153
1154
1156{
1157 return GetLibTree()->GetSelectionCount();
1158}
1159
1160int SYMBOL_EDIT_FRAME::GetTreeLIBIDs( std::vector<LIB_ID>& aSelection ) const
1161{
1162 return GetLibTree()->GetSelectedLibIds( aSelection );
1163}
1164
1165
1167{
1168 if( IsLibraryTreeShown() )
1169 {
1170 LIB_ID libId = GetTreeLIBID();
1171
1172 if( libId.IsValid() )
1173 return m_libMgr->GetAlias( libId.GetLibItemName(), libId.GetLibNickname() );
1174 }
1175
1176 return m_symbol;
1177}
1178
1179
1181{
1182 LIB_ID id;
1183
1184 if( IsLibraryTreeShown() )
1185 id = GetTreeLIBID();
1186
1187 if( id.GetLibNickname().empty() && m_symbol )
1188 id = m_symbol->GetLibId();
1189
1190 return id;
1191}
1192
1193
1194std::vector<LIB_ID> SYMBOL_EDIT_FRAME::GetSelectedLibIds() const
1195{
1196 std::vector<LIB_ID> ids;
1197 GetTreeLIBIDs( ids );
1198 return ids;
1199}
1200
1201
1203{
1204 return GetTargetLibId().GetLibNickname();
1205}
1206
1207
1208void SYMBOL_EDIT_FRAME::SyncLibraries( bool aShowProgress, bool aPreloadCancelled,
1209 const wxString& aForceRefresh )
1210{
1211 LIB_ID selected;
1212
1213 if( m_treePane )
1214 selected = GetLibTree()->GetSelectedLibId();
1215
1216 if( aShowProgress )
1217 {
1218 APP_PROGRESS_DIALOG progressDlg( _( "Loading Symbol Libraries" ), wxEmptyString,
1219 m_libMgr->GetAdapter()->GetLibrariesCount(), this );
1220
1221 m_libMgr->Sync( aForceRefresh,
1222 [&]( int progress, int max, const wxString& libName )
1223 {
1224 progressDlg.Update( progress, wxString::Format( _( "Loading library '%s'..." ),
1225 libName ) );
1226 } );
1227 }
1228 else if( !aPreloadCancelled )
1229 {
1230 m_libMgr->Sync( aForceRefresh,
1231 [&]( int progress, int max, const wxString& libName )
1232 {
1233 } );
1234 }
1235
1236 if( m_treePane )
1237 {
1238 wxDataViewItem found;
1239
1240 if( selected.IsValid() )
1241 {
1242 // Check if the previously selected item is still valid,
1243 // if not - it has to be unselected to prevent crash
1244 found = m_libMgr->GetAdapter()->FindItem( selected );
1245
1246 if( !found )
1247 GetLibTree()->Unselect();
1248 }
1249
1250 GetLibTree()->Regenerate( true );
1251
1252 // Try to select the parent library, in case the symbol is not found
1253 if( !found && selected.IsValid() )
1254 {
1255 selected.SetLibItemName( "" );
1256 found = m_libMgr->GetAdapter()->FindItem( selected );
1257
1258 if( found )
1259 GetLibTree()->SelectLibId( selected );
1260 }
1261
1262 // If no selection, see if there's a current symbol to centre
1263 if( !selected.IsValid() && m_symbol )
1264 {
1265 LIB_ID current( GetCurLib(), m_symbol->GetName() );
1266 GetLibTree()->CenterLibId( current );
1267 }
1268 }
1269}
1270
1271
1273{
1275}
1276
1277
1279{
1280 GetLibTree()->SelectLibId( aLibID );
1281}
1282
1283
1284void SYMBOL_EDIT_FRAME::UpdateLibraryTree( const wxDataViewItem& aTreeItem, LIB_SYMBOL* aSymbol )
1285{
1286 if( aTreeItem.IsOk() ) // Can be not found in tree if the current footprint is imported
1287 // from file therefore not yet in tree.
1288 {
1289 static_cast<LIB_TREE_NODE_ITEM*>( aTreeItem.GetID() )->Update( aSymbol );
1291 }
1292}
1293
1294
1295bool SYMBOL_EDIT_FRAME::backupFile( const wxFileName& aOriginalFile, const wxString& aBackupExt )
1296{
1297 if( aOriginalFile.FileExists() )
1298 {
1299 wxFileName backupFileName( aOriginalFile );
1300 backupFileName.SetExt( aBackupExt );
1301
1302 if( backupFileName.FileExists() )
1303 wxRemoveFile( backupFileName.GetFullPath() );
1304
1305 if( !wxCopyFile( aOriginalFile.GetFullPath(), backupFileName.GetFullPath() ) )
1306 {
1307 DisplayError( this, wxString::Format( _( "Failed to save backup to '%s'." ),
1308 backupFileName.GetFullPath() ) );
1309 return false;
1310 }
1311 }
1312
1313 return true;
1314}
1315
1316
1318{
1319 if( m_symbol && !GetCurLib().IsEmpty() && GetScreen()->IsContentModified() )
1320 m_libMgr->UpdateSymbol( m_symbol, GetCurLib() ); // UpdateSymbol() makes a copy
1321}
1322
1323
1325{
1326 // This will return the root symbol of any alias
1328 aLibId.GetLibNickname() );
1329
1330 // Now we can compare the libId of the current symbol and the root symbol
1331 return ( symbol && m_symbol && symbol->GetLibId() == m_symbol->GetLibId() );
1332}
1333
1334
1336{
1337 GetLibTree()->Unselect();
1338 SetCurLib( wxEmptyString );
1339 SetCurSymbol( nullptr, false );
1343 Refresh();
1344}
1345
1346
1347void SYMBOL_EDIT_FRAME::CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged )
1348{
1349 SCH_BASE_FRAME::CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
1350
1353
1358
1360
1361 if( m_symbol )
1363
1365
1367 GetCanvas()->Refresh();
1368
1370
1371 if( aEnvVarsChanged )
1372 SyncLibraries( true );
1373
1374 Layout();
1375 SendSizeEvent();
1376}
1377
1378
1380{
1381 // call my base class
1383
1384 // tooltips in toolbars
1386
1387 // For some obscure reason, the AUI manager hides the first modified pane.
1388 // So force show panes
1389 wxAuiPaneInfo& tree_pane_info = m_auimgr.GetPane( m_treePane );
1390 bool tree_shown = tree_pane_info.IsShown();
1391 tree_pane_info.Caption( _( "Libraries" ) );
1392 tree_pane_info.Show( tree_shown );
1393 m_auimgr.Update();
1394
1396
1397 // status bar
1399
1400 if( GetRenderSettings()->m_ShowPinsElectricalType )
1401 {
1403 GetCanvas()->Refresh();
1404 }
1405
1406 UpdateTitle();
1407}
1408
1409
1411{
1412 SCH_BASE_FRAME::SetScreen( aScreen );
1413
1414 // Let tools add things to the view if necessary
1415 if( m_toolManager )
1417}
1418
1419
1421{
1429
1430 // Let tools add things to the view if necessary
1431 if( m_toolManager )
1433
1435 GetCanvas()->Refresh();
1436}
1437
1438
1440{
1441 SyncLibraries( true );
1442
1443 if( m_symbol )
1444 {
1446 EE_SELECTION& selection = selectionTool->GetSelection();
1447
1448 for( SCH_ITEM& item : m_symbol->GetDrawItems() )
1449 {
1450 if( !alg::contains( selection, &item ) )
1451 item.ClearSelected();
1452 else
1453 item.SetSelected();
1454 }
1455
1457 }
1458
1459 RebuildView();
1460}
1461
1462
1463const BOX2I SYMBOL_EDIT_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
1464{
1465 if( !m_symbol )
1466 {
1467 // Gives a reasonable drawing area size
1468 int width = schIUScale.mmToIU( 50 );
1469 int height = schIUScale.mmToIU( 30 );
1470
1471 return BOX2I( VECTOR2I( -width/2, -height/2 ), VECTOR2I( width, height ) );
1472 }
1473 else
1474 {
1475 return m_symbol->Flatten()->GetUnitBoundingBox( m_unit, m_bodyStyle );
1476 }
1477}
1478
1479
1481{
1482 static KIID lastBrightenedItemID( niluuid );
1483
1484 SCH_ITEM* lastItem = nullptr;
1485
1486 if( m_symbol )
1487 {
1488 for( SCH_PIN* pin : m_symbol->GetAllLibPins() )
1489 {
1490 if( pin->m_Uuid == lastBrightenedItemID )
1491 lastItem = pin;
1492 }
1493
1494 std::vector<SCH_FIELD*> fields;
1495 m_symbol->GetFields( fields );
1496
1497 for( SCH_FIELD* field : fields )
1498 {
1499 if( field->m_Uuid == lastBrightenedItemID )
1500 lastItem = field;
1501 }
1502 }
1503
1504 if( lastItem && lastItem != aItem )
1505 {
1506 lastItem->ClearBrightened();
1507
1508 UpdateItem( lastItem );
1509 lastBrightenedItemID = niluuid;
1510 }
1511
1512 if( aItem )
1513 {
1514 if( !aItem->IsBrightened() )
1515 {
1516 aItem->SetBrightened();
1517
1518 UpdateItem( aItem );
1519 lastBrightenedItemID = aItem->m_Uuid;
1520 }
1521
1522 FocusOnLocation( VECTOR2I( aItem->GetFocusPosition().x, -aItem->GetFocusPosition().y ) );
1523 }
1524}
1525
1526
1528{
1529 const std::string& payload = mail.GetPayload();
1530
1531 switch( mail.Command() )
1532 {
1533 case MAIL_LIB_EDIT:
1534 if( !payload.empty() )
1535 {
1536 wxString libFileName( payload );
1537 wxString libNickname;
1538 wxString msg;
1539
1541 const LIB_TABLE_ROW* libTableRow = libTable->FindRowByURI( libFileName );
1542
1543 if( !libTableRow )
1544 {
1545 msg.Printf( _( "The current configuration does not include the symbol library '%s'." ),
1546 libFileName );
1547 msg += wxS( "\n" ) + _( "Use Manage Symbol Libraries to edit the configuration." );
1548 DisplayErrorMessage( this, _( "Library not found in symbol library table." ), msg );
1549 break;
1550 }
1551
1552 libNickname = libTableRow->GetNickName();
1553
1554 if( !libTable->HasLibrary( libNickname, true ) )
1555 {
1556 msg.Printf( _( "The symbol library '%s' is not enabled in the current configuration." ),
1557 UnescapeString( libNickname ) );
1558 msg += wxS( "\n" ) + _( "Use Manage Symbol Libraries to edit the configuration." );
1559 DisplayErrorMessage( this, _( "Symbol library not enabled." ), msg );
1560 break;
1561 }
1562
1563 SetCurLib( libNickname );
1564
1565 if( m_treePane )
1566 {
1567 LIB_ID id( libNickname, wxEmptyString );
1568 GetLibTree()->SelectLibId( id );
1569 GetLibTree()->ExpandLibId( id );
1570 GetLibTree()->CenterLibId( id );
1571 }
1572 }
1573
1574 break;
1575
1576 case MAIL_RELOAD_LIB:
1577 {
1578 wxString currentLib = GetCurLib();
1580
1582
1583 // Check if the currently selected symbol library been removed or disabled.
1584 if( !currentLib.empty() && libTable && !libTable->HasLibrary( currentLib, true ) )
1585 {
1586 SetCurLib( wxEmptyString );
1587 emptyScreen();
1588 }
1589
1590 SyncLibraries( true );
1593
1594 break;
1595 }
1596
1598 {
1600 LIB_SYMBOL* symbol = GetCurSymbol();
1601
1602 wxLogTrace( "KICAD_LIB_WATCH", "Received refresh symbol request for %s",
1603 payload );
1604
1605 if( !tbl || !symbol )
1606 break;
1607
1608 wxString libName = symbol->GetLibId().GetLibNickname();
1609 const SYMBOL_LIB_TABLE_ROW* row = tbl->FindRow( libName );
1610
1611 if( !row )
1612 return;
1613
1614 wxFileName libfullname( row->GetFullURI( true ) );
1615
1616 wxFileName changedLib( mail.GetPayload() );
1617 wxLogTrace( "KICAD_LIB_WATCH",
1618 "Received refresh symbol request for %s, current symbols is %s",
1619 changedLib.GetFullPath(), libfullname.GetFullPath() );
1620
1621 if( changedLib == libfullname )
1622 {
1623 wxLogTrace( "KICAD_LIB_WATCH", "Refreshing symbol %s", symbol->GetName() );
1624
1625 SetScreen( m_dummyScreen ); // UpdateLibraryBuffer will destroy the old screen
1626 m_libMgr->UpdateLibraryBuffer( libName );
1627
1628 LIB_SYMBOL* lib_symbol = m_libMgr->GetBufferedSymbol( symbol->GetName(), libName );
1629 wxCHECK2_MSG( lib_symbol, break, wxString::Format( "Symbol %s not found in library %s",
1630 symbol->GetName(), libName ) );
1631
1632 // The buffered screen for the symbol
1633 SCH_SCREEN* symbol_screen = m_libMgr->GetScreen( lib_symbol->GetName(), libName );
1634
1635 SetScreen( symbol_screen );
1636 SetCurSymbol( new LIB_SYMBOL( *lib_symbol ), false );
1638 SetShowDeMorgan( GetCurSymbol()->HasAlternateBodyStyle() );
1639
1640 if( m_toolManager )
1642 }
1643
1644 break;
1645 }
1646
1647 default:
1648 ;
1649 }
1650}
1651
1652
1653std::unique_ptr<GRID_HELPER> SYMBOL_EDIT_FRAME::MakeGridHelper()
1654{
1655 return std::make_unique<EE_GRID_HELPER>( m_toolManager );
1656}
1657
1658
1660{
1661 // switches currently used canvas ( Cairo / OpenGL):
1662 SCH_BASE_FRAME::SwitchCanvas( aCanvasType );
1663
1664 // Set options specific to symbol editor (axies are always enabled):
1665 GetCanvas()->GetGAL()->SetAxesEnabled( true );
1667}
1668
1669
1671{
1672 wxCHECK( m_libMgr, false );
1673
1674 return m_libMgr->HasModifications();
1675}
1676
1677
1679{
1680 wxCHECK( m_libMgr, false );
1681
1682 // Test if the currently edited symbol is modified
1684 return true;
1685
1686 // Test if any library has been modified
1687 for( const wxString& libName : m_libMgr->GetLibraryNames() )
1688 {
1689 if( m_libMgr->IsLibraryModified( libName ) && !m_libMgr->IsLibraryReadOnly( libName ) )
1690 return true;
1691 }
1692
1693 return false;
1694}
1695
1696
1698{
1699 if( aItemCount == 0 )
1700 return;
1701
1702 UNDO_REDO_CONTAINER& list = ( whichList == UNDO_LIST ) ? m_undoList : m_redoList;
1703
1704 if( aItemCount < 0 )
1705 {
1706 list.ClearCommandList();
1707 }
1708 else
1709 {
1710 for( int ii = 0; ii < aItemCount; ii++ )
1711 {
1712 if( list.m_CommandsList.size() == 0 )
1713 break;
1714
1715 PICKED_ITEMS_LIST* curr_cmd = list.m_CommandsList[0];
1716 list.m_CommandsList.erase( list.m_CommandsList.begin() );
1717
1718 curr_cmd->ClearListAndDeleteItems( []( EDA_ITEM* aItem )
1719 {
1720 delete aItem;
1721 } );
1722 delete curr_cmd; // Delete command
1723 }
1724 }
1725}
1726
1727
1729{
1730 return m_toolManager->GetTool<EE_SELECTION_TOOL>()->GetSelection();
1731}
1732
1733
1735{
1736 std::unique_ptr<LIB_SYMBOL> symbol = aSymbol->GetLibSymbolRef()->Flatten();
1737 wxCHECK( symbol, /* void */ );
1738
1739 symbol->SetLibId( aSymbol->GetLibId() );
1740
1741 // Take in account the symbol orientation and mirroring. to calculate the field
1742 // positions in symbol editor (i.e. no rotation, no mirroring)
1743 int orientation = aSymbol->GetOrientation() & ~( SYM_MIRROR_X | SYM_MIRROR_Y );
1744 int mirror = aSymbol->GetOrientation() & ( SYM_MIRROR_X | SYM_MIRROR_Y );
1745
1746 std::vector<SCH_FIELD> fullSetOfFields;
1747
1748 for( int i = 0; i < (int) aSymbol->GetFields().size(); ++i )
1749 {
1750 const SCH_FIELD& field = aSymbol->GetFields()[i];
1751 VECTOR2I pos = field.GetPosition() - aSymbol->GetPosition();
1752 SCH_FIELD libField( symbol.get(), field.GetId() );
1753
1754 if( i >= MANDATORY_FIELDS && !field.GetName( false ).IsEmpty() )
1755 libField.SetName( field.GetName( false ) );
1756
1757 libField.SetText( field.GetText() );
1758 libField.SetAttributes( field );
1759
1760 // The inverse transform is mirroring before, rotate after
1761 switch( mirror )
1762 {
1763 case SYM_MIRROR_X: pos.y = -pos.y; break;
1764 case SYM_MIRROR_Y: pos.x = -pos.x; break;
1765 default: break;
1766 }
1767
1768 switch( orientation )
1769 {
1770 case SYM_ORIENT_90:
1771 std::swap( pos.x, pos.y );
1772 pos.x = - pos.x;
1773 break;
1774 case SYM_ORIENT_270:
1775 std::swap( pos.x, pos.y );
1776 pos.y = - pos.y;
1777 break;
1778 case SYM_ORIENT_180:
1779 pos.x = - pos.x;
1780 pos.y = - pos.y;
1781 break;
1782 default:
1783 break;
1784 }
1785
1786 libField.SetPosition( pos );
1787
1788 fullSetOfFields.emplace_back( std::move( libField ) );
1789 }
1790
1791 symbol->SetFields( fullSetOfFields );
1792
1793 if( m_symbol )
1794 SetCurSymbol( nullptr, false );
1795
1797 m_schematicSymbolUUID = aSymbol->m_Uuid;
1798 m_reference = symbol->GetFieldById( REFERENCE_FIELD )->GetText();
1799 m_unit = std::max( 1, aSymbol->GetUnit() );
1800 m_bodyStyle = std::max( 1, aSymbol->GetBodyStyle() );
1801
1802 // Optimize default edit options for this symbol
1803 // Usually if units are locked, graphic items are specific to each unit
1804 // and if units are interchangeable, graphic items are common to units
1806 tools->SetDrawSpecificUnit( symbol->UnitsLocked() );
1807
1808 // The buffered screen for the symbol
1809 SCH_SCREEN* tmpScreen = new SCH_SCREEN();
1810
1811 SetScreen( tmpScreen );
1812 SetCurSymbol( symbol.release(), true );
1813 setSymWatcher( nullptr );
1814
1817
1818 if( IsLibraryTreeShown() )
1820
1821 UpdateTitle();
1823 SetShowDeMorgan( GetCurSymbol()->HasAlternateBodyStyle() );
1825
1826 // Let tools add things to the view if necessary
1827 if( m_toolManager )
1829
1831 GetCanvas()->Refresh();
1832}
1833
1834
1835bool SYMBOL_EDIT_FRAME::addLibTableEntry( const wxString& aLibFile, TABLE_SCOPE aScope )
1836{
1837 wxFileName fn = aLibFile;
1838 wxFileName libTableFileName( Prj().GetProjectPath(),
1840 wxString libNickname = fn.GetName();
1842 const ENV_VAR_MAP& envVars = Pgm().GetLocalEnvVariables();
1843
1844 if( libTable->HasLibrary( libNickname ) )
1845 {
1846 wxString tmp;
1847 int suffix = 1;
1848
1849 while( libTable->HasLibrary( libNickname ) )
1850 {
1851 tmp.Printf( "%s%d", fn.GetName(), suffix );
1852 libNickname = tmp;
1853 suffix += 1;
1854 }
1855 }
1856
1858 row->SetNickName( libNickname );
1859
1860 wxString normalizedPath = NormalizePath( aLibFile, &envVars, Prj().GetProjectPath() );
1861
1862 if( aScope == GLOBAL_LIB_TABLE )
1863 {
1865 libTableFileName = SYMBOL_LIB_TABLE::GetGlobalTableFileName();
1866
1867 // We cannot normalize against the current project path when saving to global table.
1868 normalizedPath = NormalizePath( aLibFile, &envVars, wxEmptyString );
1869 }
1870
1871 row->SetFullURI( normalizedPath );
1872
1873 wxCHECK( libTable->InsertRow( row ), false );
1874
1875 try
1876 {
1877 libTable->Save( libTableFileName.GetFullPath() );
1878 }
1879 catch( const IO_ERROR& ioe )
1880 {
1881 wxString msg = aScope == GLOBAL_LIB_TABLE ? _( "Error saving global library table." )
1882 : _( "Error saving project library table." );
1883
1884 wxMessageDialog dlg( this, msg, _( "File Save Error" ), wxOK | wxICON_ERROR );
1885 dlg.SetExtendedMessage( ioe.What() );
1886 dlg.ShowModal();
1887
1888 return false;
1889 }
1890
1891 return true;
1892}
1893
1894
1895bool SYMBOL_EDIT_FRAME::replaceLibTableEntry( const wxString& aLibNickname,
1896 const wxString& aLibFile )
1897{
1898 // Check the global library table first because checking the project library table
1899 // checks the global library table as well due to library chaining.
1900 bool isGlobalTable = true;
1901 wxFileName libTableFileName = SYMBOL_LIB_TABLE::GetGlobalTableFileName();;
1902 const ENV_VAR_MAP& envVars = Pgm().GetLocalEnvVariables();
1904 SYMBOL_LIB_TABLE_ROW* row = libTable->FindRow( aLibNickname );
1905
1906 if( !row )
1907 {
1908 libTableFileName.SetPath( Prj().GetProjectPath() );
1909 libTableFileName.SetName( SYMBOL_LIB_TABLE::GetSymbolLibTableFileName() );
1910 libTable = PROJECT_SCH::SchSymbolLibTable( &Prj() );
1911 isGlobalTable = false;
1912 row = libTable->FindRow( aLibNickname );
1913 }
1914
1915 wxCHECK( row, false );
1916
1917 wxString projectPath;
1918
1919 if( !isGlobalTable )
1920 projectPath = Prj().GetProjectPath();
1921
1922 wxString normalizedPath = NormalizePath( aLibFile, &envVars, projectPath );
1923
1924 row->SetFullURI( normalizedPath );
1925 row->SetType( "KiCad" );
1926
1927 try
1928 {
1929 libTable->Save( libTableFileName.GetFullPath() );
1930 }
1931 catch( const IO_ERROR& ioe )
1932 {
1933 wxString msg = isGlobalTable ? _( "Error saving global library table." )
1934 : _( "Error saving project library table." );
1935
1936 wxMessageDialog dlg( this, msg, _( "File Save Error" ), wxOK | wxICON_ERROR );
1937 dlg.SetExtendedMessage( ioe.What() );
1938 dlg.ShowModal();
1939
1940 return false;
1941 }
1942
1943 return true;
1944}
1945
1946
1948{
1949 return m_symbol && !m_symbol->IsRoot();
1950}
1951
1952
1954{
1956}
1957
1958
1959void SYMBOL_EDIT_FRAME::UpdateItem( EDA_ITEM* aItem, bool isAddOrDelete, bool aUpdateRtree )
1960{
1961 SCH_BASE_FRAME::UpdateItem( aItem, isAddOrDelete, aUpdateRtree );
1962
1963 if( EDA_TEXT* eda_text = dynamic_cast<EDA_TEXT*>( aItem ) )
1964 {
1965 eda_text->ClearBoundingBoxCache();
1966 eda_text->ClearRenderCache();
1967 }
1968}
1969
1970
1972{
1973 wxAuiPaneInfo& treePane = m_auimgr.GetPane( "SymbolTree" );
1974 wxAuiPaneInfo& propertiesPane = m_auimgr.GetPane( PropertiesPaneName() );
1975 wxAuiPaneInfo& selectionFilterPane = m_auimgr.GetPane( wxS( "SelectionFilter" ) );
1976
1977 // Don't give the selection filter its own visibility controls; instead show it if
1978 // anything else is visible
1979 bool showFilter = ( treePane.IsShown() && treePane.IsDocked() )
1980 || ( propertiesPane.IsShown() && propertiesPane.IsDocked() );
1981
1982 selectionFilterPane.Show( showFilter );
1983}
1984
1985
1987{
1988 // Returns the current render option for invisible fields
1990}
1991
1992
1994{
1995 // Returns the current render option for invisible pins
1997}
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:187
static TOOL_ACTION paste
Definition: actions.h:73
static TOOL_ACTION cancelInteractive
Definition: actions.h:65
static TOOL_ACTION millimetersUnits
Definition: actions.h:195
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:217
static TOOL_ACTION milsUnits
Definition: actions.h:194
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:193
static TOOL_ACTION toggleCursorStyle
Definition: actions.h:144
static TOOL_ACTION doDelete
Definition: actions.h:78
static TOOL_ACTION selectionTool
Definition: actions.h:202
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:216
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:188
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:186
wxString m_ColorTheme
Active color theme name.
Definition: app_settings.h:189
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
Specifies 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
UNDO_REDO_CONTAINER m_redoList
virtual void OnDropFiles(wxDropFilesEvent &aEvent)
Handles event fired when a file is dropped to the window.
void ReCreateMenuBar()
Recreates 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)
Changes 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)
void RecreateToolbars()
Rebuild all toolbars, and update the checked state of check tools.
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:250
const KIID m_Uuid
Definition: eda_item.h:489
void ClearBrightened()
Definition: eda_item.h:123
void SetBrightened()
Definition: eda_item.h:120
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:79
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:94
void SetAttributes(const EDA_TEXT &aSrc, bool aSetPosition=true)
Set the text attributes from another instance.
Definition: eda_text.cpp:337
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.
Gather all the actions that are shared by tools.
Definition: ee_actions.h:39
static TOOL_ACTION mirrorV
Definition: ee_actions.h:132
static TOOL_ACTION runERC
Inspection and Editing.
Definition: ee_actions.h:156
static TOOL_ACTION pinTable
Definition: ee_actions.h:162
static TOOL_ACTION saveSymbolAs
Definition: ee_actions.h:214
static TOOL_ACTION clearSelection
Clears the current selection.
Definition: ee_actions.h:56
static TOOL_ACTION placeSymbolAnchor
Definition: ee_actions.h:123
static TOOL_ACTION showHiddenFields
Definition: ee_actions.h:250
static TOOL_ACTION drawSymbolPolygon
Definition: ee_actions.h:122
static TOOL_ACTION showDeMorganAlternate
Definition: ee_actions.h:142
static TOOL_ACTION newSymbol
Definition: ee_actions.h:216
static TOOL_ACTION drawCircle
Definition: ee_actions.h:106
static TOOL_ACTION showDeMorganStandard
Definition: ee_actions.h:141
static TOOL_ACTION rotateCCW
Definition: ee_actions.h:131
static TOOL_ACTION editLibSymbolWithLibEdit
Definition: ee_actions.h:180
static TOOL_ACTION saveLibraryAs
Definition: ee_actions.h:213
static TOOL_ACTION placeSymbolText
Definition: ee_actions.h:119
static TOOL_ACTION mirrorH
Definition: ee_actions.h:133
static TOOL_ACTION rotateCW
Definition: ee_actions.h:130
static TOOL_ACTION togglePinAltIcons
Definition: ee_actions.h:258
static TOOL_ACTION importGraphics
Definition: ee_actions.h:269
static TOOL_ACTION importSymbol
Definition: ee_actions.h:225
static TOOL_ACTION saveSymbolCopyAs
Definition: ee_actions.h:215
static TOOL_ACTION symbolProperties
Definition: ee_actions.h:161
static TOOL_ACTION drawRectangle
Definition: ee_actions.h:105
static TOOL_ACTION setUnitDisplayName
Definition: ee_actions.h:228
static TOOL_ACTION drawSymbolTextBox
Definition: ee_actions.h:120
static TOOL_ACTION drawSymbolLines
Definition: ee_actions.h:121
static TOOL_ACTION drawArc
Definition: ee_actions.h:107
static TOOL_ACTION toggleSyncedPinsMode
Definition: ee_actions.h:259
static TOOL_ACTION drawBezier
Definition: ee_actions.h:108
static TOOL_ACTION showHiddenPins
Definition: ee_actions.h:249
static TOOL_ACTION placeSymbolPin
Definition: ee_actions.h:118
static TOOL_ACTION showElectricalTypes
Definition: ee_actions.h:265
Tool that displays edit points allowing to modify items by dragging the points.
SCH_SELECTION_FILTER_OPTIONS & GetFilter()
EE_SELECTION & GetSelection()
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:1117
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition: view.cpp:1535
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:284
void OnKiCadExit()
Definition: kiway.cpp:725
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:110
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:277
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:78
const LIB_ID & GetLibId() const override
Definition: lib_symbol.h:143
bool IsMulti() const override
Definition: lib_symbol.h:554
bool UnitsLocked() const
Check whether symbol units are interchangeable.
Definition: lib_symbol.h:264
void GetFields(std::vector< SCH_FIELD * > &aList)
Return a list of fields within this symbol.
bool IsRoot() const override
For symbols derived from other symbols, IsRoot() indicates no derivation.
Definition: lib_symbol.h:194
wxString GetUnitDisplayName(int aUnit) override
Return the user-defined display name for aUnit for symbols with units.
Definition: lib_symbol.cpp:260
std::vector< SCH_PIN * > GetAllLibPins() const
Return a list of pin pointers for all units / converts.
Definition: lib_symbol.cpp:854
SCH_FIELD & GetDatasheetField() const
Return reference to the datasheet field.
LIB_ITEMS_CONTAINER & GetDrawItems()
Return a reference to the draw item list.
Definition: lib_symbol.h:499
wxString GetName() const override
Definition: lib_symbol.h:137
wxString GetLibNickname() const override
Sets the Description field text value.
Definition: lib_symbol.h:149
int GetUnitCount() const override
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
Definition: lib_symbol.cpp:304
LIB_SYMBOL_SPTR GetRootSymbol() const
Get the parent symbol that does not have another parent.
Definition: lib_symbol.cpp:236
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()
Refreshes the tree (mainly to update highlighting and asterisking)
Definition: lib_tree.cpp:440
void CenterLibId(const LIB_ID &aLibId)
Ensure that an item is visible (preferably centered).
Definition: lib_tree.cpp:349
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:455
void SelectLibId(const LIB_ID &aLibId)
Select an item in the tree widget.
Definition: lib_tree.cpp:343
LIB_TREE_MODEL_ADAPTER::SORT_MODE GetSortMode() const
Definition: lib_tree.h:141
int GetSelectedLibIds(std::vector< LIB_ID > &aSelection, std::vector< int > *aUnit=nullptr) const
Retrieves a list of selections for trees that allow multi-selection.
Definition: lib_tree.cpp:315
void Unselect()
Unselect currently selected item in wxDataViewCtrl.
Definition: lib_tree.cpp:355
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:363
void Regenerate(bool aKeepState)
Regenerate the tree.
Definition: lib_tree.cpp:422
static wxString GetDefaultUserSymbolsPath()
Gets the default path we point users to create projects.
Definition: paths.cpp:87
virtual ENV_VAR_MAP & GetLocalEnvVariables() const
Definition: pgm_base.cpp:924
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition: pgm_base.h:142
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:218
@ SCH_LIBEDIT_CUR_SYMBOL
Definition: project.h:219
virtual const wxString GetProjectPath() const
Return the full path of the project.
Definition: project.cpp:135
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:307
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:318
float SplitterProportion() const
Action handler for the Properties panel.
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(bool aEnvVarsChanged, bool aTextVarsChanged) 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.
Instances are attached to a symbol or sheet and provide a place for the symbol's value,...
Definition: sch_field.h:51
VECTOR2I GetPosition() const override
Definition: sch_field.cpp:1483
int GetId() const
Definition: sch_field.h:133
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
Definition: sch_field.cpp:1225
void SetPosition(const VECTOR2I &aPosition) override
Definition: sch_field.cpp:1463
void SetName(const wxString &aName)
Definition: sch_field.cpp:1200
void SetText(const wxString &aText) override
Definition: sch_field.cpp:1210
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:166
int GetBodyStyle() const
Definition: sch_item.h:232
int GetUnit() const
Definition: sch_item.h:229
virtual void ClearCaches()
Definition: sch_item.cpp:372
Schematic symbol object.
Definition: sch_symbol.h:104
VECTOR2I GetPosition() const override
Definition: sch_symbol.h:807
const LIB_ID & GetLibId() const override
Definition: sch_symbol.h:193
int GetOrientation() const
Get the display symbol orientation.
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly)
Populate a std::vector with SCH_FIELDs.
Definition: sch_symbol.cpp:987
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
Definition: sch_symbol.h:212
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).
T * GetAppSettings()
Returns a handle to the a given settings by type If the settings have already been loaded,...
COLOR_SETTINGS * GetColorSettings(const wxString &aName="user")
Retrieves a color settings object that applications can read colors from.
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
Returns 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
Returns bbox 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 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.
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.
void ReCreateHToolbar() override
void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Called after the preferences dialog is run.
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.
bool LoadSymbolFromCurrentLib(const wxString &aAliasName, int aUnit=0, int aBodyStyle=0)
Load a symbol from the current active library, optionally setting the selected unit and convert.
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)
LIB_SYMBOL * GetBufferedSymbol(const wxString &aAlias, const wxString &aLibrary)
Return the symbol copy from the buffer.
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 * GetAlias(const wxString &aAlias, 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...
bool AddLibrary(const wxString &aFilePath, SYMBOL_LIB_TABLE &aTable)
Add an existing library.
SCH_SCREEN * GetScreen(const wxString &aAlias, const wxString &aLibrary)
Return the screen used to edit a specific symbol.
bool IsLibraryModified(const wxString &aLibrary) const
Return true if library has unsaved modifications.
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 &aAlias, 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:167
TOOL_DISPATCHER * m_toolDispatcher
Definition: tools_holder.h:169
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:55
ACTIONS * m_actions
Definition: tools_holder.h:168
@ 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()
Initializes 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:304
void AddButton(wxButton *aButton)
Add an already created button to the infobar.
Definition: wx_infobar.cpp:263
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 DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
Definition: confirm.cpp:170
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition: confirm.cpp:195
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
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:71
GERBVIEW_FRAME::OnZipFileHistory GERBVIEW_FRAME::OnSelectHighlightChoice EVT_UPDATE_UI(ID_TOOLBARH_GERBVIEW_SELECT_ACTIVE_LAYER, GERBVIEW_FRAME::OnUpdateLayerSelectBox) void GERBVIEW_FRAME
@ 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:595
This file is part of the common library.
KIID niluuid(0)
@ LAYER_SCHEMATIC_GRID_AXES
Definition: layer_ids.h:390
@ MAIL_LIB_EDIT
Definition: mail_type.h:54
@ MAIL_REFRESH_SYMBOL
Definition: mail_type.h:58
@ MAIL_RELOAD_LIB
Definition: mail_type.h:56
@ ALL
All except INITIAL_ADD.
Definition: view_item.h:58
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:1060
see class PGM_BASE
@ SYM_ORIENT_270
Definition: sch_symbol.h:83
@ SYM_MIRROR_Y
Definition: sch_symbol.h:85
@ SYM_ORIENT_180
Definition: sch_symbol.h:82
@ SYM_MIRROR_X
Definition: sch_symbol.h:84
@ SYM_ORIENT_90
Definition: sch_symbol.h:81
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
#define EDIT_TOOL(tool)
Definition for symbol library class.
@ MANDATORY_FIELDS
The first 5 are mandatory, and must be instantiated in SCH_COMPONENT and LIB_PART constructors.
@ REFERENCE_FIELD
Field Reference of part, i.e. "IC21".
VECTOR2< int32_t > VECTOR2I
Definition: vector2d.h:691
VECTOR2< double > VECTOR2D
Definition: vector2d.h:690
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.