KiCad PCB EDA Suite
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-2023 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>
35#include <kiface_base.h>
36#include <kiplatform/app.h>
37#include <kiway_express.h>
38#include <symbol_edit_frame.h>
40#include <lib_text.h>
42#include <paths.h>
43#include <pgm_base.h>
44#include <sch_painter.h>
45#include <sch_view.h>
47#include <symbol_lib_table.h>
48#include <tool/action_manager.h>
49#include <tool/action_toolbar.h>
50#include <tool/common_control.h>
51#include <tool/common_tools.h>
53#include <tool/picker_tool.h>
54#include <tool/selection.h>
56#include <tool/tool_manager.h>
57#include <tool/zoom_tool.h>
58#include <tools/ee_actions.h>
68#include <widgets/wx_infobar.h>
69#include <widgets/lib_tree.h>
73#include <panel_sym_lib_table.h>
74#include <string_utils.h>
75
76
78
79
80BEGIN_EVENT_TABLE( SYMBOL_EDIT_FRAME, SCH_BASE_FRAME )
82
84
85 // menubar commands
86 EVT_MENU( wxID_EXIT, SYMBOL_EDIT_FRAME::OnExitKiCad )
87 EVT_MENU( wxID_CLOSE, SYMBOL_EDIT_FRAME::CloseWindow )
89
90 // Update user interface elements.
92
93 // Drop files event
94 EVT_DROP_FILES( SYMBOL_EDIT_FRAME::OnDropFiles )
95
96END_EVENT_TABLE()
97
98
99SYMBOL_EDIT_FRAME::SYMBOL_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
100 SCH_BASE_FRAME( aKiway, aParent, FRAME_SCH_SYMBOL_EDITOR, _( "Library Editor" ),
101 wxDefaultPosition, wxDefaultSize, KICAD_DEFAULT_DRAWFRAME_STYLE,
103 m_unitSelectBox( nullptr ),
104 m_isSymbolFromSchematic( false )
105{
106 SetShowDeMorgan( false );
107 m_SyncPinEdit = false;
108
109 m_symbol = nullptr;
110 m_treePane = nullptr;
111 m_libMgr = nullptr;
112 m_unit = 1;
113 m_convert = 1;
114 m_aboutTitle = _HKI( "KiCad Symbol Editor" );
115
116 wxIcon icon;
117 wxIconBundle icon_bundle;
118
119 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit ) );
120 icon_bundle.AddIcon( icon );
121 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit_32 ) );
122 icon_bundle.AddIcon( icon );
123 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit_16 ) );
124 icon_bundle.AddIcon( icon );
125
126 SetIcons( icon_bundle );
127
128 m_settings = Pgm().GetSettingsManager().GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
129 LoadSettings( m_settings );
130
131 m_libMgr = new LIB_SYMBOL_LIBRARY_MANAGER( *this );
132 bool loadingCancelled = false;
133
134 {
135 // Preload libraries before using SyncLibraries the first time, as the preload is
136 // multi-threaded
137 WX_PROGRESS_REPORTER reporter( this, _( "Loading Symbol Libraries" ),
138 m_libMgr->GetLibraryCount(), true );
139 m_libMgr->Preload( reporter );
140
141 loadingCancelled = reporter.IsCancelled();
142 wxSafeYield();
143 }
144
145 SyncLibraries( false, loadingCancelled );
146 m_treePane = new SYMBOL_TREE_PANE( this, m_libMgr );
147
148 resolveCanvasType();
149 SwitchCanvas( m_canvasType );
150
151 // Ensure axis are always drawn
152 KIGFX::GAL_DISPLAY_OPTIONS& gal_opts = GetGalDisplayOptions();
153 gal_opts.m_axesEnabled = true;
154
155 m_dummyScreen = new SCH_SCREEN();
156 SetScreen( m_dummyScreen );
157 GetScreen()->m_Center = true;
158
159 GetCanvas()->GetViewControls()->SetCrossHairCursorPosition( VECTOR2D( 0, 0 ), false );
160
161 GetRenderSettings()->LoadColors( GetColorSettings() );
162 GetRenderSettings()->m_IsSymbolEditor = true;
163 GetCanvas()->GetGAL()->SetAxesColor( m_colorSettings->GetColor( LAYER_SCHEMATIC_GRID_AXES ) );
164
165 setupTools();
166 setupUIConditions();
167
168 ReCreateMenuBar();
169 ReCreateHToolbar();
170 ReCreateVToolbar();
171 ReCreateOptToolbar();
172
173 updateTitle();
174 UpdateSymbolMsgPanelInfo();
175 RebuildSymbolUnitsList();
176
177 m_auimgr.SetManagedWindow( this );
178
179 CreateInfoBar();
180
181 // Rows; layers 4 - 6
182 m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( "MainToolbar" )
183 .Top().Layer( 6 ) );
184
185 m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( "MsgPanel" )
186 .Bottom().Layer( 6 ) );
187
188 // Columns; layers 1 - 3
189 m_auimgr.AddPane( m_treePane, EDA_PANE().Palette().Name( "SymbolTree" )
190 .Left().Layer( 3 )
191 .Caption( _( "Libraries" ) )
192 .MinSize( 250, -1 ).BestSize( 250, -1 ) );
193 m_auimgr.AddPane( m_optionsToolBar, EDA_PANE().VToolbar().Name( "OptToolbar" )
194 .Left().Layer( 2 ) );
195
196 m_auimgr.AddPane( m_drawToolBar, EDA_PANE().VToolbar().Name( "ToolsToolbar" )
197 .Right().Layer( 2 ) );
198
199 // Center
200 m_auimgr.AddPane( GetCanvas(), wxAuiPaneInfo().Name( "DrawFrame" )
201 .CentrePane() );
202
203 FinishAUIInitialization();
204
205 if( m_settings->m_LibWidth > 0 )
206 {
207 wxAuiPaneInfo& treePane = m_auimgr.GetPane( "SymbolTree" );
208
209 // wxAUI hack: force width by setting MinSize() and then Fixed()
210 // thanks to ZenJu http://trac.wxwidgets.org/ticket/13180
211 treePane.MinSize( m_settings->m_LibWidth, -1 );
212 treePane.Fixed();
213 m_auimgr.Update();
214
215 // now make it resizable again
216 treePane.Resizable();
217 m_auimgr.Update();
218
219 // Note: DO NOT call m_auimgr.Update() anywhere after this; it will nuke the size
220 // back to minimum.
221 treePane.MinSize( 250, -1 );
222 }
223
224 Raise();
225 Show( true );
226
227 SyncView();
228 GetCanvas()->GetView()->UseDrawPriority( true );
229 GetCanvas()->GetGAL()->SetAxesEnabled( true );
230
231 setupUnits( m_settings );
232
233 // Set the working/draw area size to display a symbol to a reasonable value:
234 // A 600mm x 600mm with a origin at the area center looks like a large working area
235 double max_size_x = schIUScale.mmToIU( 600 );
236 double max_size_y = schIUScale.mmToIU( 600 );
237 BOX2D bbox;
238 bbox.SetOrigin( -max_size_x /2, -max_size_y/2 );
239 bbox.SetSize( max_size_x, max_size_y );
240 GetCanvas()->GetView()->SetBoundary( bbox );
241
242 m_toolManager->RunAction( ACTIONS::zoomFitScreen, true );
243
244 m_acceptedExts.emplace( KiCadSymbolLibFileExtension, &ACTIONS::ddAddLibrary );
245 DragAcceptFiles( true );
246
247 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "Library changes are unsaved" ) );
248
249 // Catch unhandled accelerator command characters that were no handled by the library tree
250 // panel.
251 Bind( wxEVT_CHAR, &TOOL_DISPATCHER::DispatchWxEvent, m_toolDispatcher );
252 Bind( wxEVT_CHAR_HOOK, &TOOL_DISPATCHER::DispatchWxEvent, m_toolDispatcher );
253
254 // Ensure the window is on top
255 Raise();
256
257 if( loadingCancelled )
258 ShowInfoBarWarning( _( "Symbol library loading was cancelled by user." ) );
259}
260
261
263{
264 // Shutdown all running tools
265 if( m_toolManager )
267
269 {
270 delete m_symbol;
271 m_symbol = nullptr;
272
273 SCH_SCREEN* screen = GetScreen();
274 delete screen;
276 }
277
278 // current screen is destroyed in EDA_DRAW_FRAME
280
281 auto libedit = Pgm().GetSettingsManager().GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
282 Pgm().GetSettingsManager().Save( libedit );
283
284 delete m_libMgr;
285}
286
287
289{
290 wxCHECK_RET( m_settings, "Call to SYMBOL_EDIT_FRAME::LoadSettings with null m_boardAdapter" );
291
293
295 GetRenderSettings()->SetDefaultFont( wxEmptyString );
296}
297
298
300{
301 wxCHECK_RET( m_settings, "Call to SYMBOL_EDIT_FRAME::LoadSettings with null m_boardAdapter" );
302
304
306
308 m_settings->m_LibWidth = m_treePane->GetSize().x;
309}
310
311
313{
314 return static_cast<APP_SETTINGS_BASE*>( GetSettings() );
315}
316
317
319{
320 SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
321
322 if( GetSettings()->m_UseEeschemaColorSettings )
324 else
325 return mgr.GetColorSettings( GetSettings()->m_ColorTheme );
326}
327
328
330{
331 // Create the manager and dispatcher & route draw panel events to the dispatcher
334 GetCanvas()->GetViewControls(), GetSettings(), this );
335 m_actions = new EE_ACTIONS();
337
338 // Register tools
352
353 // Run the selection tool, it is supposed to be always active
354 m_toolManager->InvokeTool( "eeschema.InteractiveSelection" );
355
357}
358
359
361{
363
365 EDITOR_CONDITIONS cond( this );
366
367 wxASSERT( mgr );
368
369#define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
370#define CHECK( x ) ACTION_CONDITIONS().Check( x )
371
372 auto haveSymbolCond =
373 [this]( const SELECTION& )
374 {
375 return m_symbol;
376 };
377
378 auto isEditableCond =
379 [this]( const SELECTION& )
380 {
381 // Only root symbols from the new s-expression libraries or the schematic
382 // are editable.
383 return IsSymbolEditable() && !IsSymbolAlias();
384 };
385
386 auto symbolModifiedCondition =
387 [this]( const SELECTION& sel )
388 {
391 };
392
393 auto libSelectedCondition =
394 [this]( const SELECTION& sel )
395 {
396 return !GetTargetLibId().GetLibNickname().empty();
397 };
398
399 auto canEditProperties =
400 [this]( const SELECTION& sel )
401 {
403 };
404
405 auto saveSymbolAsCondition =
406 [this]( const SELECTION& aSel )
407 {
408 return getTargetSymbol() != nullptr;
409 };
410
413 mgr->SetConditions( EE_ACTIONS::saveLibraryAs, ENABLE( libSelectedCondition ) );
414 mgr->SetConditions( EE_ACTIONS::saveSymbolAs, ENABLE( saveSymbolAsCondition ) );
417
418 mgr->SetConditions( ACTIONS::undo, ENABLE( haveSymbolCond && cond.UndoAvailable() ) );
419 mgr->SetConditions( ACTIONS::redo, ENABLE( haveSymbolCond && cond.RedoAvailable() ) );
420 mgr->SetConditions( ACTIONS::revert, ENABLE( symbolModifiedCondition ) );
421
427
428 mgr->SetConditions( ACTIONS::cut, ENABLE( isEditableCond ) );
429 mgr->SetConditions( ACTIONS::copy, ENABLE( haveSymbolCond ) );
431 mgr->SetConditions( ACTIONS::doDelete, ENABLE( isEditableCond ) );
432 mgr->SetConditions( ACTIONS::duplicate, ENABLE( isEditableCond ) );
433 mgr->SetConditions( ACTIONS::selectAll, ENABLE( haveSymbolCond ) );
434
435 mgr->SetConditions( EE_ACTIONS::rotateCW, ENABLE( isEditableCond ) );
436 mgr->SetConditions( EE_ACTIONS::rotateCCW, ENABLE( isEditableCond ) );
437 mgr->SetConditions( EE_ACTIONS::mirrorH, ENABLE( isEditableCond ) );
438 mgr->SetConditions( EE_ACTIONS::mirrorV, ENABLE( isEditableCond ) );
439
442
443 auto pinTypeCond =
444 [this]( const SELECTION& )
445 {
447 };
448
449 auto showCompTreeCond =
450 [this]( const SELECTION& )
451 {
452 return IsSymbolTreeShown();
453 };
454
457 mgr->SetConditions( EE_ACTIONS::showSymbolTree, CHECK( showCompTreeCond ) );
458
459 auto demorganCond =
460 [this]( const SELECTION& )
461 {
462 return GetShowDeMorgan();
463 };
464
465 auto demorganStandardCond =
466 [this]( const SELECTION& )
467 {
468 return m_convert == LIB_ITEM::LIB_CONVERT::BASE;
469 };
470
471 auto demorganAlternateCond =
472 [this]( const SELECTION& )
473 {
474 return m_convert == LIB_ITEM::LIB_CONVERT::DEMORGAN;
475 };
476
477 auto multiUnitModeCond =
478 [this]( const SELECTION& )
479 {
480 return m_symbol && m_symbol->IsMulti() && !m_symbol->UnitsLocked();
481 };
482
483 auto hasMultipleUnitsCond =
484 [this]( const SELECTION& )
485 {
486 return m_symbol && m_symbol->IsMulti();
487 };
488
489 auto syncedPinsModeCond =
490 [this]( const SELECTION& )
491 {
492 return m_SyncPinEdit;
493 };
494
495 auto haveDatasheetCond =
496 [this]( const SELECTION& )
497 {
498 return m_symbol && !m_symbol->GetDatasheetField().GetText().IsEmpty();
499 };
500
501 mgr->SetConditions( EE_ACTIONS::showDatasheet, ENABLE( haveDatasheetCond ) );
502 mgr->SetConditions( EE_ACTIONS::symbolProperties, ENABLE( canEditProperties && haveSymbolCond ) );
503 mgr->SetConditions( EE_ACTIONS::runERC, ENABLE( haveSymbolCond ) );
504 mgr->SetConditions( EE_ACTIONS::pinTable, ENABLE( isEditableCond && haveSymbolCond ) );
505
507 ACTION_CONDITIONS().Enable( demorganCond ).Check( demorganStandardCond ) );
509 ACTION_CONDITIONS().Enable( demorganCond ).Check( demorganAlternateCond ) );
511 ACTION_CONDITIONS().Enable( multiUnitModeCond ).Check( syncedPinsModeCond ) );
513 ACTION_CONDITIONS().Enable( isEditableCond && hasMultipleUnitsCond ) );
514
515// Only enable a tool if the symbol is edtable
516#define EDIT_TOOL( tool ) ACTION_CONDITIONS().Enable( isEditableCond ).Check( cond.CurrentTool( tool ) )
517
527
528#undef CHECK
529#undef ENABLE
530#undef EDIT_TOOL
531}
532
533
535{
536 if( IsContentModified() )
537 {
538 SCH_EDIT_FRAME* schframe = (SCH_EDIT_FRAME*) Kiway().Player( FRAME_SCH, false );
539 wxString msg = _( "Save changes to '%s' before closing?" );
540
541 switch( UnsavedChangesDialog( this, wxString::Format( msg, m_reference ), nullptr ) )
542 {
543 case wxID_YES:
544 if( schframe && GetCurSymbol() ) // Should be always the case
546
547 break;
548
549 case wxID_NO:
550 break;
551
552 default:
553 case wxID_CANCEL:
554 return false;
555 }
556 }
557
558 if( doClose )
559 {
560 SetCurSymbol( nullptr, false );
561 updateTitle();
562 }
563
564 return true;
565}
566
567
568bool SYMBOL_EDIT_FRAME::canCloseWindow( wxCloseEvent& aEvent )
569{
570 // Shutdown blocks must be determined and vetoed as early as possible
572 && aEvent.GetId() == wxEVT_QUERY_END_SESSION
573 && IsContentModified() )
574 {
575 return false;
576 }
577
579 return false;
580
581 if( !saveAllLibraries( true ) )
582 return false;
583
584 // Save symbol tree column widths
585 m_libMgr->GetAdapter()->SaveSettings();
586
587 return true;
588}
589
590
592{
593 Destroy();
594}
595
596
598{
599 if( !m_unitSelectBox )
600 return;
601
602 if( m_unitSelectBox->GetCount() != 0 )
603 m_unitSelectBox->Clear();
604
605 if( !m_symbol || m_symbol->GetUnitCount() <= 1 )
606 {
607 m_unit = 1;
608 m_unitSelectBox->Append( wxEmptyString );
609 }
610 else
611 {
612 for( int i = 0; i < m_symbol->GetUnitCount(); i++ )
613 {
614 wxString unitDisplayName = m_symbol->GetUnitDisplayName( i + 1 );
615 m_unitSelectBox->Append( unitDisplayName );
616 }
617 }
618
619 // Ensure the selected unit is compatible with the number of units of the current symbol:
621 m_unit = 1;
622
623 m_unitSelectBox->SetSelection(( m_unit > 0 ) ? m_unit - 1 : 0 );
624}
625
626
627void SYMBOL_EDIT_FRAME::OnToggleSymbolTree( wxCommandEvent& event )
628{
629 wxAuiPaneInfo& treePane = m_auimgr.GetPane( m_treePane );
630 treePane.Show( !IsSymbolTreeShown() );
631 m_auimgr.Update();
632}
633
634
636{
637 return const_cast<wxAuiManager&>( m_auimgr ).GetPane( m_treePane ).IsShown();
638}
639
640
642{
643 m_treePane->Freeze();
644 m_libMgr->GetAdapter()->Freeze();
645}
646
647
649{
650 m_libMgr->GetAdapter()->Thaw();
651 m_treePane->Thaw();
652}
653
654
655void SYMBOL_EDIT_FRAME::OnExitKiCad( wxCommandEvent& event )
656{
657 Kiway().OnKiCadExit();
658}
659
660
661void SYMBOL_EDIT_FRAME::OnUpdateUnitNumber( wxUpdateUIEvent& event )
662{
663 event.Enable( m_symbol && m_symbol->GetUnitCount() > 1 );
664}
665
666
667void SYMBOL_EDIT_FRAME::OnSelectUnit( wxCommandEvent& event )
668{
669 int i = event.GetSelection();
670
671 if( ( i == wxNOT_FOUND ) || ( ( i + 1 ) == m_unit ) )
672 return;
673
676
677 m_unit = i + 1;
678
680 RebuildView();
682}
683
684
686{
687 if( m_symbol )
688 {
690
691 if( row && row->GetType() == SCH_IO_MGR::ShowType( SCH_IO_MGR::SCH_LEGACY ) )
692 return true;
693 }
694
695 return false;
696}
697
698
700{
701 wxString libNickname = Prj().GetRString( PROJECT::SCH_LIBEDIT_CUR_LIB );
702
703 if( !libNickname.empty() )
704 {
705 if( !Prj().SchSymbolLibTable()->HasLibrary( libNickname ) )
706 {
707 Prj().SetRString( PROJECT::SCH_LIBEDIT_CUR_LIB, wxEmptyString );
708 libNickname = wxEmptyString;
709 }
710 }
711
712 return libNickname;
713}
714
715
716wxString SYMBOL_EDIT_FRAME::SetCurLib( const wxString& aLibNickname )
717{
718 wxString old = GetCurLib();
719
720 if( aLibNickname.empty() || !Prj().SchSymbolLibTable()->HasLibrary( aLibNickname ) )
721 Prj().SetRString( PROJECT::SCH_LIBEDIT_CUR_LIB, wxEmptyString );
722 else
724
725 return old;
726}
727
728
729void SYMBOL_EDIT_FRAME::SetCurSymbol( LIB_SYMBOL* aSymbol, bool aUpdateZoom )
730{
732 GetCanvas()->GetView()->Clear();
733 delete m_symbol;
734
735 m_symbol = aSymbol;
736
737 // select the current symbol in the tree widget
740 else
742
743 wxString symbolName = m_symbol ? m_symbol->GetName() : wxString();
744
745 // retain in case this wxFrame is re-opened later on the same PROJECT
747
748 // Ensure synchronized pin edit can be enabled only symbols with interchangeable units
749 m_SyncPinEdit = aSymbol && aSymbol->IsRoot() && aSymbol->IsMulti() && !aSymbol->UnitsLocked();
750
752
760
761 if( aUpdateZoom )
763
764 GetCanvas()->Refresh();
765
766 WX_INFOBAR* infobar = GetInfoBar();
767
769 {
770 wxString msg;
771 msg.Printf( _( "Editing symbol %s from schematic. Saving will update the schematic "
772 "only." ), m_reference );
773
774 infobar->RemoveAllButtons();
775 infobar->ShowMessage( msg, wxICON_INFORMATION );
776 }
777 else if( IsSymbolFromLegacyLibrary() )
778 {
779 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( infobar, wxID_ANY,
780 _( "Manage symbol libraries" ),
781 wxEmptyString );
782
783 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
784 [&]( wxHyperlinkEvent& aEvent )
785 {
787 } ) );
788
789 infobar->RemoveAllButtons();
790 infobar->AddButton( button );
791 infobar->ShowMessage( _( "Symbols in legacy libraries are not editable. Use Manage "
792 "Symbol Libraries to migrate to current format." ),
793 wxICON_INFORMATION );
794 }
795 else if( IsSymbolAlias() )
796 {
797 wxString parentSymbolName = m_symbol->GetParent().lock()->GetName();
798 wxString msg;
799 wxString link;
800
801 msg.Printf( _( "Symbol %s is derived from %s. Symbol graphics will not be editable." ),
802 UnescapeString( symbolName ),
803 UnescapeString( parentSymbolName ) );
804
805 link.Printf( _( "Open %s" ), UnescapeString( parentSymbolName ) );
806
807 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( infobar, wxID_ANY, link, wxEmptyString );
808 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
809 [&]( wxHyperlinkEvent& aEvent )
810 {
811 LoadSymbolFromCurrentLib( m_symbol->GetParent().lock()->GetName(),
812 GetUnit(), GetConvert() );
813 } ) );
814
815 infobar->RemoveAllButtons();
816 infobar->AddButton( button );
817 infobar->ShowMessage( msg, wxICON_INFORMATION );
818 }
819 else
820 {
821 infobar->Dismiss();
822 }
823}
824
825
827{
828 wxASSERT( m_libMgr );
829 return *m_libMgr;
830}
831
832
834{
836
838 m_autoSaveRequired = true;
839
840 if( !IsSymbolFromSchematic() )
842
844
845 if( !GetTitle().StartsWith( "*" ) )
846 updateTitle();
847}
848
849
851{
853}
854
855
856wxString SYMBOL_EDIT_FRAME::AddLibraryFile( bool aCreateNew )
857{
858 // Select the target library table (global/project)
860
861 if( !libTable )
862 return wxEmptyString;
863
864 wxFileName fn = m_libMgr->GetUniqueLibraryName();
865
866 if( !LibraryFileBrowser( !aCreateNew, fn, KiCadSymbolLibFileWildcard(),
868 ( libTable == &SYMBOL_LIB_TABLE::GetGlobalLibTable() ),
870 {
871 return wxEmptyString;
872 }
873
874 wxString libName = fn.GetName();
875
876 if( libName.IsEmpty() )
877 return wxEmptyString;
878
879 if( m_libMgr->LibraryExists( libName ) )
880 {
881 DisplayError( this, wxString::Format( _( "Library '%s' already exists." ), libName ) );
882 return wxEmptyString;
883 }
884
885 if( aCreateNew )
886 {
887 if( !m_libMgr->CreateLibrary( fn.GetFullPath(), libTable ) )
888 {
889 DisplayError( this, wxString::Format( _( "Could not create the library file '%s'.\n"
890 "Make sure you have write permissions and "
891 "try again." ),
892 fn.GetFullPath() ) );
893 return wxEmptyString;
894 }
895 }
896 else
897 {
898 if( !m_libMgr->AddLibrary( fn.GetFullPath(), libTable ) )
899 {
900 DisplayError( this, _( "Could not open the library file." ) );
901 return wxEmptyString;
902 }
903 }
904
905 bool globalTable = ( libTable == &SYMBOL_LIB_TABLE::GetGlobalLibTable() );
906 saveSymbolLibTables( globalTable, !globalTable );
907
908 std::string packet = fn.GetFullPath().ToStdString();
910
911 return fn.GetFullPath();
912}
913
914
915void SYMBOL_EDIT_FRAME::DdAddLibrary( wxString aLibFile )
916{
917 // Select the target library table (global/project)
919
920 if( !libTable )
921 return;
922
923 wxFileName fn = wxFileName( aLibFile );
924
925 wxString libName = fn.GetName();
926
927 if( libName.IsEmpty() )
928 return;
929
930 if( m_libMgr->LibraryExists( libName ) )
931 {
932 DisplayError( this, wxString::Format( _( "Library '%s' already exists." ), libName ) );
933 return;
934 }
935
936 if( !m_libMgr->AddLibrary( fn.GetFullPath(), libTable ) )
937 {
938 DisplayError( this, _( "Could not open the library file." ) );
939 return;
940 }
941
942 bool globalTable = ( libTable == &SYMBOL_LIB_TABLE::GetGlobalLibTable() );
943 saveSymbolLibTables( globalTable, !globalTable );
944
945 std::string packet = fn.GetFullPath().ToStdString();
947}
948
949
951{
952 return m_treePane->GetLibTree()->GetSelectedLibId( aUnit );
953}
954
955
957{
959}
960
961int SYMBOL_EDIT_FRAME::GetTreeLIBIDs( std::vector<LIB_ID>& aSelection ) const
962{
963 return m_treePane->GetLibTree()->GetSelectedLibIds( aSelection );
964}
965
966
968{
969 LIB_ID libId = GetTreeLIBID();
970
971 if( libId.IsValid() )
972 {
973 LIB_SYMBOL* alias = m_libMgr->GetAlias( libId.GetLibItemName(), libId.GetLibNickname() );
974 return alias;
975 }
976
977 return m_symbol;
978}
979
980
982{
983 LIB_ID id;
984
985 if( IsSymbolTreeShown() )
986 id = GetTreeLIBID();
987
988 if( id.GetLibNickname().empty() && m_symbol )
989 id = m_symbol->GetLibId();
990
991 return id;
992}
993
994
995std::vector<LIB_ID> SYMBOL_EDIT_FRAME::GetSelectedLibIds() const
996{
997 std::vector<LIB_ID> ids;
998 GetTreeLIBIDs( ids );
999 return ids;
1000}
1001
1002
1004{
1006}
1007
1008
1010{
1011 return GetTargetLibId().GetLibNickname();
1012}
1013
1014
1015void SYMBOL_EDIT_FRAME::SyncLibraries( bool aShowProgress, bool aPreloadCancelled,
1016 const wxString& aForceRefresh )
1017{
1018 LIB_ID selected;
1019
1020 if( m_treePane )
1021 selected = m_treePane->GetLibTree()->GetSelectedLibId();
1022
1023 if( aShowProgress )
1024 {
1025 APP_PROGRESS_DIALOG progressDlg( _( "Loading Symbol Libraries" ), wxEmptyString,
1026 m_libMgr->GetAdapter()->GetLibrariesCount(), this );
1027
1028 m_libMgr->Sync( aForceRefresh,
1029 [&]( int progress, int max, const wxString& libName )
1030 {
1031 progressDlg.Update( progress, wxString::Format( _( "Loading library '%s'..." ),
1032 libName ) );
1033 } );
1034 }
1035 else if( !aPreloadCancelled )
1036 {
1037 m_libMgr->Sync( aForceRefresh,
1038 [&]( int progress, int max, const wxString& libName )
1039 {
1040 } );
1041 }
1042
1043 if( m_treePane )
1044 {
1045 wxDataViewItem found;
1046
1047 if( selected.IsValid() )
1048 {
1049 // Check if the previously selected item is still valid,
1050 // if not - it has to be unselected to prevent crash
1051 found = m_libMgr->GetAdapter()->FindItem( selected );
1052
1053 if( !found )
1055 }
1056
1057 m_treePane->GetLibTree()->Regenerate( true );
1058
1059 // Try to select the parent library, in case the symbol is not found
1060 if( !found && selected.IsValid() )
1061 {
1062 selected.SetLibItemName( "" );
1063 found = m_libMgr->GetAdapter()->FindItem( selected );
1064
1065 if( found )
1066 m_treePane->GetLibTree()->SelectLibId( selected );
1067 }
1068
1069 // If no selection, see if there's a current symbol to centre
1070 if( !selected.IsValid() && m_symbol )
1071 {
1072 LIB_ID current( GetCurLib(), m_symbol->GetName() );
1073 m_treePane->GetLibTree()->CenterLibId( current );
1074 }
1075 }
1076}
1077
1078
1080{
1081 LIB_ID target = GetTargetLibId();
1082
1083 m_treePane->GetLibTree()->Regenerate( true );
1084
1085 if( target.IsValid() )
1086 m_treePane->GetLibTree()->CenterLibId( target );
1087}
1088
1089
1091{
1093}
1094
1095
1097{
1098 m_treePane->GetLibTree()->SelectLibId( aLibID );
1099}
1100
1101
1102void SYMBOL_EDIT_FRAME::UpdateLibraryTree( const wxDataViewItem& aTreeItem, LIB_SYMBOL* aSymbol )
1103{
1104 if( aTreeItem.IsOk() ) // Can be not found in tree if the current footprint is imported
1105 // from file therefore not yet in tree.
1106 {
1107 static_cast<LIB_TREE_NODE_LIB_ID*>( aTreeItem.GetID() )->Update( aSymbol );
1109 }
1110}
1111
1112
1113bool SYMBOL_EDIT_FRAME::backupFile( const wxFileName& aOriginalFile, const wxString& aBackupExt )
1114{
1115 if( aOriginalFile.FileExists() )
1116 {
1117 wxFileName backupFileName( aOriginalFile );
1118 backupFileName.SetExt( aBackupExt );
1119
1120 if( backupFileName.FileExists() )
1121 wxRemoveFile( backupFileName.GetFullPath() );
1122
1123 if( !wxCopyFile( aOriginalFile.GetFullPath(), backupFileName.GetFullPath() ) )
1124 {
1125 DisplayError( this, wxString::Format( _( "Failed to save backup to '%s'." ),
1126 backupFileName.GetFullPath() ) );
1127 return false;
1128 }
1129 }
1130
1131 return true;
1132}
1133
1134
1136{
1137 if( m_symbol && !GetCurLib().IsEmpty() && GetScreen()->IsContentModified() )
1138 m_libMgr->UpdateSymbol( m_symbol, GetCurLib() ); // UpdateSymbol() makes a copy
1139}
1140
1141
1143{
1144 // This will return the root symbol of any alias
1146 aLibId.GetLibNickname() );
1147
1148 // Now we can compare the libId of the current symbol and the root symbol
1149 return ( symbol && m_symbol && symbol->GetLibId() == m_symbol->GetLibId() );
1150}
1151
1152
1154{
1156 SetCurLib( wxEmptyString );
1157 SetCurSymbol( nullptr, false );
1161 Refresh();
1162}
1163
1164
1165void SYMBOL_EDIT_FRAME::CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged )
1166{
1167 SCH_BASE_FRAME::CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
1168
1171
1173
1175
1176 if( m_symbol )
1178
1180
1182 GetCanvas()->Refresh();
1183
1185
1186 if( aEnvVarsChanged )
1187 SyncLibraries( true );
1188
1189 Layout();
1190 SendSizeEvent();
1191}
1192
1193
1195{
1196 // call my base class
1198
1199 // tooltips in toolbars
1201
1202 // status bar
1204
1205 if( GetRenderSettings()->m_ShowPinsElectricalType )
1206 {
1208 GetCanvas()->Refresh();
1209 }
1210
1211 updateTitle();
1212}
1213
1214
1216{
1217 SCH_BASE_FRAME::SetScreen( aScreen );
1218}
1219
1220
1222{
1230
1232 GetCanvas()->Refresh();
1233}
1234
1235
1237{
1238 SyncLibraries( true );
1239
1240 if( m_symbol )
1241 {
1243 EE_SELECTION& selection = selectionTool->GetSelection();
1244
1245 for( LIB_ITEM& item : m_symbol->GetDrawItems() )
1246 {
1247 if( !alg::contains( selection, &item ) )
1248 item.ClearSelected();
1249 else
1250 item.SetSelected();
1251 }
1252
1254 }
1255
1256 RebuildView();
1257}
1258
1259
1260const BOX2I SYMBOL_EDIT_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
1261{
1262 if( !m_symbol )
1263 {
1264 // Gives a reasonable drawing area size
1265 int width = schIUScale.mmToIU( 50 );
1266 int height = schIUScale.mmToIU( 30 );
1267
1268 return BOX2I( VECTOR2I( -width/2, -height/2 ),
1269 VECTOR2I( width, height ) );
1270 }
1271 else
1272 {
1273 return m_symbol->Flatten()->GetUnitBoundingBox( m_unit, m_convert );
1274 }
1275}
1276
1277
1279{
1280 const std::string& payload = mail.GetPayload();
1281
1282 switch( mail.Command() )
1283 {
1284 case MAIL_LIB_EDIT:
1285 if( !payload.empty() )
1286 {
1287 wxString libFileName( payload );
1288 wxString libNickname;
1289 wxString msg;
1290
1291 SYMBOL_LIB_TABLE* libTable = Prj().SchSymbolLibTable();
1292 const LIB_TABLE_ROW* libTableRow = libTable->FindRowByURI( libFileName );
1293
1294 if( !libTableRow )
1295 {
1296 msg.Printf( _( "The current configuration does not include the library '%s'.\n"
1297 "Use Manage Symbol Libraries to edit the configuration." ),
1298 libFileName );
1299 DisplayErrorMessage( this, _( "Library not found in symbol library table." ), msg );
1300 break;
1301 }
1302
1303 libNickname = libTableRow->GetNickName();
1304
1305 if( !libTable->HasLibrary( libNickname, true ) )
1306 {
1307 msg.Printf( _( "The library '%s' is not enabled in the current configuration.\n"
1308 "Use Manage Symbol Libraries to edit the configuration." ),
1309 UnescapeString( libNickname ) );
1310 DisplayErrorMessage( this, _( "Symbol library not enabled." ), msg );
1311 break;
1312 }
1313
1314 SetCurLib( libNickname );
1315
1316 if( m_treePane )
1317 {
1318 LIB_ID id( libNickname, wxEmptyString );
1322 }
1323 }
1324
1325 break;
1326
1327 default:
1328 ;
1329 }
1330}
1331
1332
1334{
1335 // switches currently used canvas ( Cairo / OpenGL):
1336 SCH_BASE_FRAME::SwitchCanvas( aCanvasType );
1337
1338 // Set options specific to symbol editor (axies are always enabled):
1339 GetCanvas()->GetGAL()->SetAxesEnabled( true );
1341}
1342
1343
1345{
1346 wxCHECK( m_libMgr, false );
1347
1348 return m_libMgr->HasModifications();
1349}
1350
1351
1353{
1354 wxCHECK( m_libMgr, false );
1355
1356 // Test if the currently edited symbol is modified
1358 return true;
1359
1360 // Test if any library has been modified
1361 for( const wxString& libName : m_libMgr->GetLibraryNames() )
1362 {
1363 if( m_libMgr->IsLibraryModified( libName ) && !m_libMgr->IsLibraryReadOnly( libName ) )
1364 return true;
1365 }
1366
1367 return false;
1368}
1369
1370
1372{
1373 if( aItemCount == 0 )
1374 return;
1375
1376 UNDO_REDO_CONTAINER& list = whichList == UNDO_LIST ? m_undoList : m_redoList;
1377
1378 for( PICKED_ITEMS_LIST* command : list.m_CommandsList )
1379 {
1380 command->ClearListAndDeleteItems( []( EDA_ITEM* aItem )
1381 {
1382 delete aItem;
1383 } );
1384 delete command;
1385 }
1386
1387 list.m_CommandsList.clear();
1388}
1389
1390
1392{
1393 return m_toolManager->GetTool<EE_SELECTION_TOOL>()->GetSelection();
1394}
1395
1396
1398{
1399 std::unique_ptr<LIB_SYMBOL> symbol = aSymbol->GetLibSymbolRef()->Flatten();
1400 wxCHECK( symbol, /* void */ );
1401
1402 std::vector<LIB_FIELD> fullSetOfFields;
1403
1404 for( int i = 0; i < (int) aSymbol->GetFields().size(); ++i )
1405 {
1406 const SCH_FIELD& field = aSymbol->GetFields()[i];
1407 VECTOR2I pos = field.GetPosition() - aSymbol->GetPosition();
1408 LIB_FIELD libField( symbol.get(), field.GetId() );
1409
1410 if( i >= MANDATORY_FIELDS && !field.GetName( false ).IsEmpty() )
1411 libField.SetName( field.GetName( false ) );
1412
1413 libField.SetText( field.GetText() );
1414 libField.SetAttributes( field );
1415 libField.SetPosition( wxPoint( pos.x, -pos.y ) );
1416
1417 fullSetOfFields.emplace_back( std::move( libField ) );
1418 }
1419
1420 symbol->SetFields( fullSetOfFields );
1421
1422 if( m_symbol )
1423 SetCurSymbol( nullptr, false );
1424
1426 m_schematicSymbolUUID = aSymbol->m_Uuid;
1427 m_reference = symbol->GetFieldById( REFERENCE_FIELD )->GetText();
1428 m_unit = std::max( 1, aSymbol->GetUnit() );
1429 m_convert = std::max( 1, aSymbol->GetConvert() );
1430
1431 // Optimize default edit options for this symbol
1432 // Usually if units are locked, graphic items are specific to each unit
1433 // and if units are interchangeable, graphic items are common to units
1435 tools->SetDrawSpecificUnit( symbol->UnitsLocked() );
1436
1437 // The buffered screen for the symbol
1438 SCH_SCREEN* tmpScreen = new SCH_SCREEN();
1439
1440 SetScreen( tmpScreen );
1441 SetCurSymbol( symbol.release(), true );
1442
1445
1446 if( IsSymbolTreeShown() )
1447 {
1448 wxCommandEvent evt;
1449 OnToggleSymbolTree( evt );
1450 }
1451
1452 updateTitle();
1454 SetShowDeMorgan( GetCurSymbol()->HasConversion() );
1456 Refresh();
1457}
1458
1459
1460bool SYMBOL_EDIT_FRAME::addLibTableEntry( const wxString& aLibFile, TABLE_SCOPE aScope )
1461{
1462 wxFileName fn = aLibFile;
1463 wxFileName libTableFileName( Prj().GetProjectPath(),
1465 wxString libNickname = fn.GetName();
1466 SYMBOL_LIB_TABLE* libTable = Prj().SchSymbolLibTable();
1467 const ENV_VAR_MAP& envVars = Pgm().GetLocalEnvVariables();
1468
1469 if( libTable->HasLibrary( libNickname ) )
1470 {
1471 wxString tmp;
1472 int suffix = 1;
1473
1474 while( libTable->HasLibrary( libNickname ) )
1475 {
1476 tmp.Printf( "%s%d", fn.GetName(), suffix );
1477 libNickname = tmp;
1478 suffix += 1;
1479 }
1480 }
1481
1483 row->SetNickName( libNickname );
1484
1485 wxString normalizedPath = NormalizePath( aLibFile, &envVars, Prj().GetProjectPath() );
1486
1487 if( aScope == GLOBAL_LIB_TABLE )
1488 {
1490 libTableFileName = SYMBOL_LIB_TABLE::GetGlobalTableFileName();
1491
1492 // We cannot normalize against the current project path when saving to global table.
1493 normalizedPath = NormalizePath( aLibFile, &envVars, wxEmptyString );
1494 }
1495
1496 row->SetFullURI( normalizedPath );
1497
1498 wxCHECK( libTable->InsertRow( row ), false );
1499
1500 try
1501 {
1502 libTable->Save( libTableFileName.GetFullPath() );
1503 }
1504 catch( const IO_ERROR& ioe )
1505 {
1506 wxString msg = aScope == GLOBAL_LIB_TABLE ? _( "Error saving global library table." )
1507 : _( "Error saving project library table." );
1508
1509 wxMessageDialog dlg( this, msg, _( "File Save Error" ), wxOK | wxICON_ERROR );
1510 dlg.SetExtendedMessage( ioe.What() );
1511 dlg.ShowModal();
1512
1513 return false;
1514 }
1515
1516 return true;
1517}
1518
1519
1520bool SYMBOL_EDIT_FRAME::replaceLibTableEntry( const wxString& aLibNickname,
1521 const wxString& aLibFile )
1522{
1523 // Check the global library table first because checking the project library table
1524 // checks the global library table as well due to library chaining.
1525 bool isGlobalTable = true;
1526 wxFileName libTableFileName = SYMBOL_LIB_TABLE::GetGlobalTableFileName();;
1527 const ENV_VAR_MAP& envVars = Pgm().GetLocalEnvVariables();
1529 SYMBOL_LIB_TABLE_ROW* row = libTable->FindRow( aLibNickname );
1530
1531 if( !row )
1532 {
1533 libTableFileName.SetPath( Prj().GetProjectPath() );
1534 libTableFileName.SetName( SYMBOL_LIB_TABLE::GetSymbolLibTableFileName() );
1535 libTable = Prj().SchSymbolLibTable();
1536 isGlobalTable = false;
1537 row = libTable->FindRow( aLibNickname );
1538 }
1539
1540 wxCHECK( row, false );
1541
1542 wxString projectPath;
1543
1544 if( !isGlobalTable )
1545 projectPath = Prj().GetProjectPath();
1546
1547 wxString normalizedPath = NormalizePath( aLibFile, &envVars, projectPath );
1548
1549 row->SetFullURI( normalizedPath );
1550 row->SetType( "KiCad" );
1551
1552 try
1553 {
1554 libTable->Save( libTableFileName.GetFullPath() );
1555 }
1556 catch( const IO_ERROR& ioe )
1557 {
1558 wxString msg = isGlobalTable ? _( "Error saving global library table." )
1559 : _( "Error saving project library table." );
1560
1561 wxMessageDialog dlg( this, msg, _( "File Save Error" ), wxOK | wxICON_ERROR );
1562 dlg.SetExtendedMessage( ioe.What() );
1563 dlg.ShowModal();
1564
1565 return false;
1566 }
1567
1568 return true;
1569}
1570
1571
1573{
1574 return m_symbol && !m_symbol->IsRoot();
1575}
1576
1577
1579{
1581}
1582
1583
1584void SYMBOL_EDIT_FRAME::UpdateItem( EDA_ITEM* aItem, bool isAddOrDelete, bool aUpdateRtree )
1585{
1586 SCH_BASE_FRAME::UpdateItem( aItem, isAddOrDelete, aUpdateRtree );
1587
1588 if( EDA_TEXT* eda_text = dynamic_cast<EDA_TEXT*>( aItem ) )
1589 {
1590 eda_text->ClearBoundingBoxCache();
1591 eda_text->ClearRenderCache();
1592 }
1593}
BASE_SCREEN class implementation.
constexpr EDA_IU_SCALE schIUScale
Definition: base_units.h:111
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:105
@ icon_libedit_32
@ icon_libedit
@ icon_libedit_16
BOX2< VECTOR2I > BOX2I
Definition: box2.h:847
static TOOL_ACTION toggleGrid
Definition: actions.h:143
static TOOL_ACTION paste
Definition: actions.h:69
static TOOL_ACTION cancelInteractive
Definition: actions.h:63
static TOOL_ACTION millimetersUnits
Definition: actions.h:149
static TOOL_ACTION revert
Definition: actions.h:55
static TOOL_ACTION copy
Definition: actions.h:68
static TOOL_ACTION milsUnits
Definition: actions.h:148
static TOOL_ACTION toggleBoundingBoxes
Definition: actions.h:107
static TOOL_ACTION saveAll
Definition: actions.h:54
static TOOL_ACTION undo
Definition: actions.h:65
static TOOL_ACTION duplicate
Definition: actions.h:72
static TOOL_ACTION inchesUnits
Definition: actions.h:147
static TOOL_ACTION toggleCursorStyle
Definition: actions.h:104
static TOOL_ACTION doDelete
Definition: actions.h:73
static TOOL_ACTION selectionTool
Definition: actions.h:156
static TOOL_ACTION save
Definition: actions.h:51
static TOOL_ACTION zoomFitScreen
Definition: actions.h:98
static TOOL_ACTION redo
Definition: actions.h:66
static TOOL_ACTION deleteTool
Definition: actions.h:74
static TOOL_ACTION zoomTool
Definition: actions.h:101
static TOOL_ACTION cut
Definition: actions.h:67
static TOOL_ACTION ddAddLibrary
Definition: actions.h:60
static TOOL_ACTION selectAll
Definition: actions.h:71
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:110
WINDOW_SETTINGS m_Window
Definition: app_settings.h:187
wxString m_ColorTheme
Active color theme name.
Definition: app_settings.h:190
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
void SetOrigin(const Vec &pos)
Definition: box2.h:202
void SetSize(const Vec &size)
Definition: box2.h:213
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
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
KIGFX::GAL_DISPLAY_OPTIONS & GetGalDisplayOptions()
Return a reference to the gal rendering options used by GAL for rendering.
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.
virtual void OnSize(wxSizeEvent &event) override
Recalculate the size of toolbars and display panel when the frame size changes.
virtual void SetScreen(BASE_SCREEN *aScreen)
void RecreateToolbars()
Rebuild all toolbars, and update the checked state of check tools.
void OnGridSettings(wxCommandEvent &event)
void ShowChangedLanguage() override
Redraw the menus and what not in current language.
void ForceRefresh()
Force a redraw.
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
Update the board display after modifying it by a python script (note: it is automatically called by a...
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:85
const KIID m_Uuid
Definition: eda_item.h:492
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:72
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:87
void SetAttributes(const EDA_TEXT &aSrc)
Set the text attributes from another instance.
Definition: eda_text.cpp:264
virtual void SetText(const wxString &aText)
Definition: eda_text.cpp:163
Class that groups generic conditions for editor states.
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.
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 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:125
static TOOL_ACTION runERC
Definition: ee_actions.h:150
static TOOL_ACTION pinTable
Definition: ee_actions.h:155
static TOOL_ACTION saveSymbolAs
Definition: ee_actions.h:182
static TOOL_ACTION clearSelection
Clears the current selection.
Definition: ee_actions.h:56
static TOOL_ACTION placeSymbolAnchor
Definition: ee_actions.h:113
static TOOL_ACTION showDeMorganAlternate
Definition: ee_actions.h:135
static TOOL_ACTION newSymbol
Definition: ee_actions.h:183
static TOOL_ACTION drawCircle
Definition: ee_actions.h:96
static TOOL_ACTION showDeMorganStandard
Definition: ee_actions.h:134
static TOOL_ACTION rotateCCW
Definition: ee_actions.h:124
static TOOL_ACTION saveLibraryAs
Definition: ee_actions.h:181
static TOOL_ACTION placeSymbolText
Definition: ee_actions.h:110
static TOOL_ACTION mirrorH
Definition: ee_actions.h:126
static TOOL_ACTION rotateCW
Definition: ee_actions.h:123
static TOOL_ACTION importSymbol
Definition: ee_actions.h:191
static TOOL_ACTION showDatasheet
Inspection and Editing.
Definition: ee_actions.h:149
static TOOL_ACTION symbolProperties
Definition: ee_actions.h:154
static TOOL_ACTION drawRectangle
Definition: ee_actions.h:95
static TOOL_ACTION setUnitDisplayName
Definition: ee_actions.h:194
static TOOL_ACTION drawSymbolTextBox
Definition: ee_actions.h:111
static TOOL_ACTION drawSymbolLines
Definition: ee_actions.h:112
static TOOL_ACTION drawArc
Definition: ee_actions.h:97
static TOOL_ACTION toggleSyncedPinsMode
Definition: ee_actions.h:218
static TOOL_ACTION showSymbolTree
Definition: ee_actions.h:226
static TOOL_ACTION placeSymbolPin
Definition: ee_actions.h:109
static TOOL_ACTION showElectricalTypes
Definition: ee_actions.h:224
Tool that displays edit points allowing to modify items by dragging the points.
EE_SELECTION & GetSelection()
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
Definition: ki_exception.h:76
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:30
void ReadWindowSettings(WINDOW_SETTINGS &aCfg)
Read GAL config options from application-level config.
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:192
void ClearHiddenFlags()
Clear the hide flag of all items in the view.
Definition: sch_view.cpp:185
void Clear()
Remove all items from the view.
Definition: view.cpp:1099
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition: view.cpp:1484
Carry a payload from one KIWAY_PLAYER to another within a PROJECT.
Definition: kiway_express.h:39
std::string & GetPayload()
Return the payload, which can be any text but it typically self identifying s-expression.
Definition: kiway_express.h:57
MAIL_T Command()
Returns the MAIL_T associated with this mail.
Definition: kiway_express.h:49
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
KIWAY & Kiway() const
Return a reference to the KIWAY that this object has an opportunity to participate in.
Definition: kiway_holder.h:53
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:274
void OnKiCadExit()
Definition: kiway.cpp:668
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
Definition: kiway.cpp:394
virtual void ExpressMail(FRAME_T aDestination, MAIL_T aCommand, std::string &aPayload, wxWindow *aSource=nullptr)
Send aPayload to aDestination from aSource.
Definition: kiway.cpp:491
Field object used in symbol libraries.
Definition: lib_field.h:61
void SetName(const wxString &aName)
Set a user definable field name to aName.
Definition: lib_field.cpp:494
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:109
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
The base class for drawable items used by schematic library symbols.
Definition: lib_item.h:61
void SetPosition(const VECTOR2I &aPosition) override
Definition: lib_item.h:234
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:99
bool IsMulti() const
Definition: lib_symbol.h:557
bool UnitsLocked() const
Check whether symbol units are interchangeable.
Definition: lib_symbol.h:258
bool IsRoot() const override
For symbols derived from other symbols, IsRoot() indicates no derivation.
Definition: lib_symbol.h:187
wxString GetUnitDisplayName(int aUnit) override
Return the user-defined display name for aUnit for symbols with units.
Definition: lib_symbol.cpp:399
LIB_ITEMS_CONTAINER & GetDrawItems()
Return a reference to the draw item list.
Definition: lib_symbol.h:508
LIB_ID GetLibId() const override
Definition: lib_symbol.h:141
wxString GetName() const override
Definition: lib_symbol.h:138
wxString GetLibNickname() const override
Definition: lib_symbol.h:147
void ClearCaches()
Definition: lib_symbol.cpp:526
int GetUnitCount() const override
For items with units, return the number of units.
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
Definition: lib_symbol.cpp:456
LIB_FIELD & GetDatasheetField()
Return reference to the datasheet field.
LIB_SYMBOL_REF & GetParent()
Definition: lib_symbol.h:127
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
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.
Model class in the component selector Model-View-Adapter (mediated MVC) architecture.
void RefreshLibTree()
Refreshes the tree (mainly to update highlighting and asterisking)
Definition: lib_tree.cpp:313
LIB_TREE_NODE * GetCurrentTreeNode() const
Definition: lib_tree.cpp:219
void CenterLibId(const LIB_ID &aLibId)
Ensure that an item is visible (preferably centered).
Definition: lib_tree.cpp:236
int GetSelectionCount() const
Definition: lib_tree.h:87
void SelectLibId(const LIB_ID &aLibId)
Select an item in the tree widget.
Definition: lib_tree.cpp:230
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:202
void Unselect()
Unselect currently selected item in wxDataViewCtrl.
Definition: lib_tree.cpp:242
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:188
void ExpandLibId(const LIB_ID &aLibId)
Expand and item i the tree widget.
Definition: lib_tree.cpp:248
void Regenerate(bool aKeepState)
Regenerate the tree.
Definition: lib_tree.cpp:295
static wxString GetDefaultUserSymbolsPath()
Gets the default path we point users to create projects.
Definition: paths.cpp:97
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
@ SCH_LIBEDIT_CUR_LIB
Definition: project.h:167
@ SCH_LIBEDIT_CUR_SYMBOL
Definition: project.h:168
virtual const wxString GetProjectPath() const
Return the full path of the project.
Definition: project.cpp:126
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:254
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:265
A shim class between EDA_DRAW_FRAME and several derived classes: SYMBOL_EDIT_FRAME,...
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.
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.
KIGFX::SCH_RENDER_SETTINGS * GetRenderSettings()
virtual void UpdateItem(EDA_ITEM *aItem, bool isAddOrDelete=false, bool aUpdateRtree=false)
Mark an item for refresh.
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:1061
int GetId() const
Definition: sch_field.h:125
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
Definition: sch_field.cpp:813
static const wxString ShowType(SCH_FILE_T aFileType)
Return a brief name for a plugin, given aFileType enum.
Definition: sch_io_mgr.cpp:81
Schematic symbol object.
Definition: sch_symbol.h:81
int GetUnit() const
Definition: sch_symbol.h:228
int GetConvert() const
Definition: sch_symbol.h:270
VECTOR2I GetPosition() const override
Definition: sch_symbol.h:712
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly)
Populate a std::vector with SCH_FIELDs.
Definition: sch_symbol.cpp:879
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
Definition: sch_symbol.h:192
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(bool aLoadNow=true)
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.
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.
void UpdateItem(EDA_ITEM *aItem, bool isAddOrDelete=false, bool aUpdateRtree=false) override
Mark an item for refresh.
int m_convert
Flag if the symbol being edited was loaded directly from a schematic.
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.
void updateTitle()
Update the main window title bar with the current library name and read only status of the library.
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 RefreshLibraryTree()
Redisplay the library tree.
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.
LIB_ID GetTargetLibId() const
Return either the symbol selected in the symbol tree (if context menu is active) or the symbol on the...
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
bool LoadSymbolFromCurrentLib(const wxString &aAliasName, int aUnit=0, int aConvert=0)
Load a symbol from the current active library, optionally setting the selected unit and convert.
void HardRedraw() override
Rebuild the GAL and redraw the screen.
bool GetShowDeMorgan() const
bool IsSymbolTreeShown() 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
void OnToggleSymbolTree(wxCommandEvent &event)
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
LIB_TREE_NODE * GetCurrentTreeNode() 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 RegenerateLibraryTree()
Filter, sort, and redisplay the library tree.
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
bool saveAllLibraries(bool aRequireConfirmation)
Save the current symbol.
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.
wxString SetCurLib(const wxString &aLibNickname)
Set the current library nickname and returns the old library nickname.
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.
COLOR_SETTINGS * GetColorSettings(bool aForceRefresh=false) const override
Returns a pointer to the active color theme settings.
LIB_SYMBOL_LIBRARY_MANAGER & GetLibManager()
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
bool IsContentModified() const override
Get if any symbols or libraries have been modified but not saved.
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 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 AddLibrary(const wxString &aFilePath, SYMBOL_LIB_TABLE *aTable)
Add an existing library.
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.
Hold a record identifying a symbol library accessed by the appropriate symbol library SCH_PLUGIN obje...
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.
LIB_TREE * GetLibTree() const
TOOL_MANAGER * m_toolManager
Definition: tools_holder.h:170
TOOL_DISPATCHER * m_toolDispatcher
Definition: tools_holder.h:172
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:54
ACTIONS * m_actions
Definition: tools_holder.h:171
@ MODEL_RELOAD
Model changes (required full reload)
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:55
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Run the specified action.
Definition: tool_manager.h:142
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:196
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:103
A modified version of the wxInfoBar class that allows us to:
Definition: wx_infobar.h:75
void RemoveAllButtons()
Remove all the buttons that have been added by the user.
Definition: wx_infobar.cpp:289
void AddButton(wxButton *aButton)
Add an already created button to the infobar.
Definition: wx_infobar.cpp:248
void Dismiss() override
Dismisses the infobar and updates the containing layout and AUI manager (if one is provided).
Definition: wx_infobar.cpp:175
void ShowMessage(const wxString &aMessage, int aFlags=wxICON_INFORMATION) override
Show the info bar with the provided message and icon.
Definition: wx_infobar.cpp:142
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:300
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition: confirm.cpp:325
int UnsavedChangesDialog(wxWindow *parent, const wxString &aMessage, bool *aApplyToAll)
A specialized version of HandleUnsavedChanges which handles an apply-to-all checkbox.
Definition: confirm.cpp:197
This file is part of the common library.
#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:66
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
EVT_UPDATE_UI(ID_LOAD_FOOTPRINT_FROM_BOARD, FOOTPRINT_EDIT_FRAME::OnUpdateLoadFootprintFromBoard) EVT_UPDATE_UI(ID_ADD_FOOTPRINT_TO_BOARD
@ FRAME_SCH_SYMBOL_EDITOR
Definition: frame_type.h:35
@ FRAME_SCH
Definition: frame_type.h:34
const std::string KiCadSymbolLibFileExtension
wxString KiCadSymbolLibFileWildcard()
@ ID_GRID_SETTINGS
Definition: id.h:146
std::map< wxString, ENV_VAR_ITEM > ENV_VAR_MAP
@ LAYER_SCHEMATIC_GRID_AXES
Definition: layer_ids.h:375
@ MAIL_LIB_EDIT
Definition: mail_type.h:53
@ ALL
All except INITIAL_ADD.
Definition: view_item.h:53
void SetShutdownBlockReason(wxWindow *aWindow, const wxString &aReason)
Sets the block reason why the window/application is preventing OS shutdown.
Definition: gtk/app.cpp:83
bool SupportsShutdownBlockReason()
Whether or not the window supports setting a shutdown block reason.
Definition: gtk/app.cpp:72
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
Definition: kicad_algo.h:99
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...
see class PGM_BASE
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:111
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:89
#define CHECK(x)
#define ENABLE(x)
#define EDIT_TOOL(tool)
Definition for symbol library class.
@ MANDATORY_FIELDS
The first 4 are mandatory, and must be instantiated in SCH_COMPONENT and LIB_PART constructors.
@ REFERENCE_FIELD
Field Reference of part, i.e. "IC21".
VECTOR2< double > VECTOR2D
Definition: vector2d.h:617
VECTOR2< int > VECTOR2I
Definition: vector2d.h:618
Definition of file extensions used in Kicad.