KiCad PCB EDA Suite
Loading...
Searching...
No Matches
symbol_edit_frame.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright (C) 2008 Wayne Stambaugh <[email protected]>
6 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, you may find one here:
20 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21 * or you may search the http://www.gnu.org website for the version 2 license,
22 * or you may write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24 */
25
26#include <bitmaps.h>
27#include <wx/hyperlink.h>
28#include <base_screen.h>
29#include <confirm.h>
30#include <core/kicad_algo.h>
31#include <eeschema_id.h>
32#include <eeschema_settings.h>
33#include <env_paths.h>
35#include <kidialog.h>
36#include <kiface_base.h>
37#include <kiplatform/app.h>
38#include <kiway_express.h>
39#include <symbol_edit_frame.h>
42#include <paths.h>
43#include <pgm_base.h>
44#include <project_sch.h>
45#include <sch_painter.h>
46#include <sch_view.h>
49#include <tool/action_manager.h>
50#include <tool/action_toolbar.h>
51#include <tool/common_control.h>
52#include <tool/common_tools.h>
54#include <tool/embed_tool.h>
56#include <tool/picker_tool.h>
58#include <tool/selection.h>
60#include <tool/tool_manager.h>
61#include <tool/zoom_tool.h>
62#include <tools/sch_actions.h>
73#include <view/view_controls.h>
75#include <widgets/wx_infobar.h>
83#include <panel_sym_lib_table.h>
84#include <string_utils.h>
86#include <wx/msgdlg.h>
87#include <wx/combobox.h>
88#include <wx/log.h>
89#include <trace_helpers.h>
90
91
93
94
95BEGIN_EVENT_TABLE( SYMBOL_EDIT_FRAME, SCH_BASE_FRAME )
98
99 // menubar commands
100 EVT_MENU( wxID_EXIT, SYMBOL_EDIT_FRAME::OnExitKiCad )
101 EVT_MENU( wxID_CLOSE, SYMBOL_EDIT_FRAME::CloseWindow )
102
103 // Update user interface elements.
106
109
110 // Drop files event
111 EVT_DROP_FILES( SYMBOL_EDIT_FRAME::OnDropFiles )
112
113END_EVENT_TABLE()
114
115
116SYMBOL_EDIT_FRAME::SYMBOL_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
117 SCH_BASE_FRAME( aKiway, aParent, FRAME_SCH_SYMBOL_EDITOR, _( "Library Editor" ),
118 wxDefaultPosition, wxDefaultSize, KICAD_DEFAULT_DRAWFRAME_STYLE,
120 m_unitSelectBox( nullptr ),
121 m_bodyStyleSelectBox( nullptr ),
123{
124 m_SyncPinEdit = false;
125
126 m_symbol = nullptr;
127 m_treePane = nullptr;
128 m_libMgr = nullptr;
129 m_unit = 1;
130 m_bodyStyle = 1;
131 m_aboutTitle = _HKI( "KiCad Symbol Editor" );
132
133 wxIcon icon;
134 wxIconBundle icon_bundle;
135
136 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit, 48 ) );
137 icon_bundle.AddIcon( icon );
138 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit, 256 ) );
139 icon_bundle.AddIcon( icon );
140 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit, 128 ) );
141 icon_bundle.AddIcon( icon );
142 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit_32 ) );
143 icon_bundle.AddIcon( icon );
144 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit_16 ) );
145 icon_bundle.AddIcon( icon );
146
147 SetIcons( icon_bundle );
148
151
153
154 m_treePane = new SYMBOL_TREE_PANE( this, m_libMgr );
155 m_treePane->GetLibTree()->SetSortMode( (LIB_TREE_MODEL_ADAPTER::SORT_MODE) m_settings->m_LibrarySortMode );
156
159
160 // Ensure axis are always drawn
162 gal_opts.m_axesEnabled = true;
163
166 GetScreen()->m_Center = true;
167
168 GetCanvas()->GetViewControls()->SetCrossHairCursorPosition( VECTOR2D( 0, 0 ), false );
169
170 GetRenderSettings()->LoadColors( GetColorSettings() );
171 GetRenderSettings()->m_IsSymbolEditor = true;
172 GetCanvas()->GetGAL()->SetAxesColor( m_colorSettings->GetColor( LAYER_SCHEMATIC_GRID_AXES ) );
173
174 setupTools();
176
178
182
183 UpdateTitle();
186
187 m_propertiesPanel = new SCH_PROPERTIES_PANEL( this, this );
188 m_propertiesPanel->SetSplitterProportion( m_settings->m_AuiPanels.properties_splitter );
189
191
192 m_auimgr.SetManagedWindow( this );
193
195
196 // Rows; layers 4 - 6
197 m_auimgr.AddPane( m_tbTopMain, EDA_PANE().HToolbar().Name( "TopMainToolbar" )
198 .Top().Layer( 6 ) );
199
200 m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( "MsgPanel" )
201 .Bottom().Layer( 6 ) );
202
203 m_auimgr.AddPane( m_tbLeft, EDA_PANE().VToolbar().Name( "LeftToolbar" )
204 .Left().Layer( 2 ) );
205
206 m_auimgr.AddPane( m_tbRight, EDA_PANE().VToolbar().Name( "RightToolbar" )
207 .Right().Layer( 2 ) );
208
209 // Center
210 m_auimgr.AddPane( GetCanvas(), wxAuiPaneInfo().Name( "DrawFrame" )
211 .CentrePane() );
212
213 // Columns; layers 1 - 3
214 m_auimgr.AddPane( m_treePane, EDA_PANE().Palette().Name( "LibraryTree" )
215 .Left().Layer( 3 )
216 .TopDockable( false ).BottomDockable( false )
217 .Caption( _( "Libraries" ) )
218 .MinSize( FromDIP( 250 ), -1 ).BestSize( FromDIP( 250 ), -1 ) );
219
222
223 // Can be called only when all panes are created, because (at least on Windows) when items
224 // managed by m_auimgr are not the same as those existing when saved by Perspective()
225 // in config, broken settings can happen.
227
228 // Protect against broken saved Perspective() due to bugs in previous version
229 // This is currently a workaround.
230 m_auimgr.GetPane( "TopMainToolbar" ).Top().Layer( 6 ).Position(0).Show( true );
231 m_auimgr.GetPane( "LeftToolbar" ).Position(0).Show( true );
232 m_auimgr.GetPane( "RightToolbar" ).Show( true );
233
234 // Show or hide m_propertiesPanel depending on current settings:
235 wxAuiPaneInfo& propertiesPaneInfo = m_auimgr.GetPane( PropertiesPaneName() );
236 wxAuiPaneInfo& selectionFilterPane = m_auimgr.GetPane( wxS( "SelectionFilter" ) );
237 // The selection filter doesn't need to grow in the vertical direction when docked
238 selectionFilterPane.dock_proportion = 0;
239
240 propertiesPaneInfo.Show( m_settings->m_AuiPanels.show_properties );
242
244
245 // Can't put this in LoadSettings, because it has to be called before setupTools :/
247 selTool->GetFilter() = GetSettings()->m_SelectionFilter;
248 m_selectionFilterPanel->SetCheckboxesFromFilter( selTool->GetFilter() );
249
250 if( m_settings->m_LibWidth > 0 )
251 SetAuiPaneSize( m_auimgr, m_auimgr.GetPane( "LibraryTree" ), m_settings->m_LibWidth, -1 );
252
253 Raise();
254 Show( true );
255
256 SyncView();
257 GetCanvas()->GetView()->UseDrawPriority( true );
258 GetCanvas()->GetGAL()->SetAxesEnabled( true );
259
261
262 // Set the working/draw area size to display a symbol to a reasonable value:
263 // A 600mm x 600mm with a origin at the area center looks like a large working area
264 double max_size_x = schIUScale.mmToIU( 600 );
265 double max_size_y = schIUScale.mmToIU( 600 );
266 BOX2D bbox;
267 bbox.SetOrigin( -max_size_x /2, -max_size_y/2 );
268 bbox.SetSize( max_size_x, max_size_y );
269 GetCanvas()->GetView()->SetBoundary( bbox );
270
272
274 DragAcceptFiles( true );
275
276 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "Library changes are unsaved" ) );
277
278 // Catch unhandled accelerator command characters that were no handled by the library tree
279 // panel.
281 Bind( wxEVT_CHAR_HOOK, &TOOL_DISPATCHER::DispatchWxEvent, m_toolDispatcher );
282
283 // Ensure the window is on top
284 Raise();
285
286 // run SyncLibraries with progress reporter enabled. The progress reporter is useful
287 // in debug mode because the loading time of ecah library can be really noticeable
288 SyncLibraries( true );
289}
290
291
293{
294 // Shutdown all running tools
295 if( m_toolManager )
296 m_toolManager->ShutdownAllTools();
297
298 setSymWatcher( nullptr );
299
301 {
302 delete m_symbol;
303 m_symbol = nullptr;
304
305 SCH_SCREEN* screen = GetScreen();
306 delete screen;
308 }
309
310 // current screen is destroyed in EDA_DRAW_FRAME
312
314 Pgm().GetSettingsManager().Save( cfg );
315
316 delete m_libMgr;
317}
318
319
321{
322 wxCHECK_RET( m_settings, "Call to SYMBOL_EDIT_FRAME::LoadSettings with null m_settings" );
323
325
326 GetRenderSettings()->m_ShowPinsElectricalType = m_settings->m_ShowPinElectricalType;
327 GetRenderSettings()->m_ShowHiddenPins = m_settings->m_ShowHiddenPins;
328 GetRenderSettings()->m_ShowHiddenFields = m_settings->m_ShowHiddenFields;
329 GetRenderSettings()->m_ShowPinAltIcons = m_settings->m_ShowPinAltIcons;
330 GetRenderSettings()->SetDefaultFont( wxEmptyString );
331}
332
333
335{
336 wxCHECK_RET( m_settings, "Call to SYMBOL_EDIT_FRAME:SaveSettings with null m_settings" );
337
339
341
342 m_settings->m_ShowPinElectricalType = GetRenderSettings()->m_ShowPinsElectricalType;
343 m_settings->m_ShowHiddenPins = GetRenderSettings()->m_ShowHiddenPins;
344 m_settings->m_ShowHiddenFields = GetRenderSettings()->m_ShowHiddenFields;
345 m_settings->m_ShowPinAltIcons = GetRenderSettings()->m_ShowPinAltIcons;
346
347 m_settings->m_LibWidth = m_treePane->GetSize().x;
348
349 m_settings->m_LibrarySortMode = GetLibTree()->GetSortMode();
350
351 m_settings->m_AuiPanels.properties_splitter = m_propertiesPanel->SplitterProportion();
352 bool prop_shown = m_auimgr.GetPane( PropertiesPaneName() ).IsShown();
353 m_settings->m_AuiPanels.show_properties = prop_shown;
354
356 m_settings->m_SelectionFilter = selTool->GetFilter();
357}
358
359
361{
362 return static_cast<APP_SETTINGS_BASE*>( GetSettings() );
363}
364
365
367{
369
370 if( cfg && static_cast<SYMBOL_EDITOR_SETTINGS*>( cfg )->m_UseEeschemaColorSettings )
371 cfg = GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
372
373 return ::GetColorSettings( cfg ? cfg->m_ColorTheme : DEFAULT_THEME );
374}
375
376
378{
379 // Create the manager and dispatcher & route draw panel events to the dispatcher
381 m_toolManager->SetEnvironment( GetScreen(), GetCanvas()->GetView(),
382 GetCanvas()->GetViewControls(), GetSettings(), this );
383 m_actions = new SCH_ACTIONS();
385
386 // Register tools
387 m_toolManager->RegisterTool( new COMMON_CONTROL );
388 m_toolManager->RegisterTool( new COMMON_TOOLS );
389 m_toolManager->RegisterTool( new ZOOM_TOOL );
390 m_toolManager->RegisterTool( new SCH_SELECTION_TOOL );
391 m_toolManager->RegisterTool( new PICKER_TOOL );
392 m_toolManager->RegisterTool( new SCH_INSPECTION_TOOL );
393 m_toolManager->RegisterTool( new SYMBOL_EDITOR_PIN_TOOL );
394 m_toolManager->RegisterTool( new SYMBOL_EDITOR_DRAWING_TOOLS );
395 m_toolManager->RegisterTool( new SCH_POINT_EDITOR );
396 m_toolManager->RegisterTool( new SCH_FIND_REPLACE_TOOL );
397 m_toolManager->RegisterTool( new SYMBOL_EDITOR_MOVE_TOOL );
398 m_toolManager->RegisterTool( new SYMBOL_EDITOR_EDIT_TOOL );
399 m_toolManager->RegisterTool( new LIBRARY_EDITOR_CONTROL );
400 m_toolManager->RegisterTool( new SYMBOL_EDITOR_CONTROL );
401 m_toolManager->RegisterTool( new PROPERTIES_TOOL );
402 m_toolManager->RegisterTool( new EMBED_TOOL );
403 m_toolManager->InitTools();
404
405 // Run the selection tool, it is supposed to be always active
406 m_toolManager->InvokeTool( "common.InteractiveSelection" );
407
409}
410
411
413{
415
416 ACTION_MANAGER* mgr = m_toolManager->GetActionManager();
417 EDITOR_CONDITIONS cond( this );
418
419 wxASSERT( mgr );
420
421#define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
422#define CHECK( x ) ACTION_CONDITIONS().Check( x )
423
424 auto haveSymbolCond =
425 [this]( const SELECTION& )
426 {
427 return m_symbol;
428 };
429
430 auto isEditableCond =
431 [this]( const SELECTION& )
432 {
433 // Only root symbols from the new s-expression libraries or the schematic
434 // are editable.
435 return IsSymbolEditable() && !IsSymbolAlias();
436 };
437
438 auto isEditableInAliasCond =
439 [this]( const SELECTION& )
440 {
441 // Less restrictive than isEditableCond
442 // Symbols fields (root symbols and aliases) from the new s-expression libraries
443 // or in the schematic are editable.
444 return IsSymbolEditable();
445 };
446
447 auto symbolModifiedCondition =
448 [this]( const SELECTION& sel )
449 {
450 return m_libMgr && m_libMgr->IsSymbolModified( GetTargetLibId().GetLibItemName(),
451 GetTargetLibId().GetLibNickname() );
452 };
453
454 auto libSelectedCondition =
455 [this]( const SELECTION& sel )
456 {
457 return !GetTargetLibId().GetLibNickname().empty();
458 };
459
460 auto canEditProperties =
461 [this]( const SELECTION& sel )
462 {
464 };
465
466 auto symbolSelectedInTreeCondition =
467 [this]( const SELECTION& sel )
468 {
469 LIB_ID targetLibId = GetTargetLibId();
470 return !targetLibId.GetLibNickname().empty() && !targetLibId.GetLibItemName().empty();
471 };
472
473 auto saveSymbolAsCondition =
474 [this]( const SELECTION& aSel )
475 {
476 return getTargetSymbol() != nullptr;
477 };
478
479 const auto isSymbolFromSchematicCond =
480 [this]( const SELECTION& )
481 {
482 return IsSymbolFromSchematic();
483 };
484
485 // clang-format off
488 mgr->SetConditions( SCH_ACTIONS::saveLibraryAs, ENABLE( libSelectedCondition ) );
489 mgr->SetConditions( SCH_ACTIONS::saveSymbolAs, ENABLE( saveSymbolAsCondition ) );
490 mgr->SetConditions( SCH_ACTIONS::saveSymbolCopyAs, ENABLE( saveSymbolAsCondition ) );
493 mgr->SetConditions( SCH_ACTIONS::editLibSymbolWithLibEdit, ENABLE( isSymbolFromSchematicCond ) );
494
495 mgr->SetConditions( ACTIONS::undo, ENABLE( haveSymbolCond && cond.UndoAvailable() ) );
496 mgr->SetConditions( ACTIONS::redo, ENABLE( haveSymbolCond && cond.RedoAvailable() ) );
497 mgr->SetConditions( ACTIONS::revert, ENABLE( symbolModifiedCondition ) );
498
501
502 mgr->SetConditions( ACTIONS::cut, ENABLE( isEditableCond ) );
503 mgr->SetConditions( ACTIONS::copy, ENABLE( haveSymbolCond ) );
504 mgr->SetConditions( ACTIONS::copyAsText, ENABLE( haveSymbolCond ) );
505 mgr->SetConditions( ACTIONS::paste, ENABLE( isEditableCond &&
507 mgr->SetConditions( ACTIONS::doDelete, ENABLE( isEditableCond ) );
508 mgr->SetConditions( ACTIONS::duplicate, ENABLE( isEditableCond ) );
509 mgr->SetConditions( ACTIONS::selectAll, ENABLE( haveSymbolCond ) );
510 mgr->SetConditions( ACTIONS::unselectAll, ENABLE( haveSymbolCond ) );
511
512 // These actions in symbol editor when editing alias field rotations are allowed.
513 mgr->SetConditions( SCH_ACTIONS::rotateCW, ENABLE( isEditableInAliasCond ) );
514 mgr->SetConditions( SCH_ACTIONS::rotateCCW, ENABLE( isEditableInAliasCond ) );
515
516 mgr->SetConditions( SCH_ACTIONS::mirrorH, ENABLE( isEditableCond ) );
517 mgr->SetConditions( SCH_ACTIONS::mirrorV, ENABLE( isEditableCond ) );
518
521 // clang-format on
522
523 auto pinTypeCond =
524 [this]( const SELECTION& )
525 {
527 };
528
529 auto hiddenPinCond =
530 [this]( const SELECTION& )
531 {
533 };
534
535 auto hiddenFieldCond =
536 [this]( const SELECTION& )
537 {
539 };
540
541 auto showPinAltIconsCond =
542 [this]( const SELECTION& )
543 {
545 };
546
547 auto showLibraryTreeCond =
548 [this]( const SELECTION& )
549 {
550 return IsLibraryTreeShown();
551 };
552
553 auto propertiesCond =
554 [this] ( const SELECTION& )
555 {
556 return m_auimgr.GetPane( PropertiesPaneName() ).IsShown();
557 };
558
561 mgr->SetConditions( ACTIONS::showLibraryTree, CHECK( showLibraryTreeCond ) );
562 mgr->SetConditions( ACTIONS::showProperties, CHECK( propertiesCond ) );
563 mgr->SetConditions( SCH_ACTIONS::showHiddenPins, CHECK( hiddenPinCond ) );
564 mgr->SetConditions( SCH_ACTIONS::showHiddenFields, CHECK( hiddenFieldCond ) );
565 mgr->SetConditions( SCH_ACTIONS::togglePinAltIcons, CHECK( showPinAltIconsCond ) );
566
567 auto multiUnitModeCond =
568 [this]( const SELECTION& )
569 {
570 return m_symbol && m_symbol->IsMultiUnit() && !m_symbol->UnitsLocked();
571 };
572
573 auto multiBodyStyleModeCond =
574 [this]( const SELECTION& )
575 {
576 return m_symbol && m_symbol->IsMultiBodyStyle();
577 };
578
579 auto syncedPinsModeCond =
580 [this]( const SELECTION& )
581 {
582 return m_SyncPinEdit;
583 };
584
585 auto haveDatasheetCond =
586 [this]( const SELECTION& )
587 {
588 return m_symbol && !m_symbol->GetDatasheetField().GetText().IsEmpty();
589 };
590
591 mgr->SetConditions( ACTIONS::showDatasheet, ENABLE( haveDatasheetCond ) );
592 mgr->SetConditions( SCH_ACTIONS::symbolProperties, ENABLE( symbolSelectedInTreeCondition || ( canEditProperties && haveSymbolCond ) ) );
593 mgr->SetConditions( SCH_ACTIONS::runERC, ENABLE( haveSymbolCond ) );
594 mgr->SetConditions( SCH_ACTIONS::pinTable, ENABLE( isEditableCond && haveSymbolCond ) );
595 mgr->SetConditions( SCH_ACTIONS::updateSymbolFields, ENABLE( isEditableCond && haveSymbolCond ) );
596 mgr->SetConditions( SCH_ACTIONS::cycleBodyStyle, ENABLE( multiBodyStyleModeCond ) );
597
598 mgr->SetConditions( SCH_ACTIONS::toggleSyncedPinsMode, ACTION_CONDITIONS().Enable( multiUnitModeCond ).Check( syncedPinsModeCond ) );
599
600// Only enable a tool if the symbol is edtable
601#define EDIT_TOOL( tool ) ACTION_CONDITIONS().Enable( isEditableCond ).Check( cond.CurrentTool( tool ) )
602
615
616#undef CHECK
617#undef ENABLE
618#undef EDIT_TOOL
619}
620
621
623{
624 if( IsContentModified() )
625 {
626 SCH_EDIT_FRAME* schframe = (SCH_EDIT_FRAME*) Kiway().Player( FRAME_SCH, false );
627 wxString msg = _( "Save changes to '%s' before closing?" );
628
629 switch( UnsavedChangesDialog( this, wxString::Format( msg, m_reference ), nullptr ) )
630 {
631 case wxID_YES:
632 if( schframe && GetCurSymbol() ) // Should be always the case
634
635 break;
636
637 case wxID_NO:
638 break;
639
640 default:
641 case wxID_CANCEL:
642 return false;
643 }
644 }
645
646 if( doClose )
647 {
648 SetCurSymbol( nullptr, false );
649 UpdateTitle();
650 }
651
652 return true;
653}
654
655
656bool SYMBOL_EDIT_FRAME::canCloseWindow( wxCloseEvent& aEvent )
657{
658 // Shutdown blocks must be determined and vetoed as early as possible
660 && aEvent.GetId() == wxEVT_QUERY_END_SESSION
661 && IsContentModified() )
662 {
663 return false;
664 }
665
667 return false;
668
669 if( !saveAllLibraries( true ) )
670 return false;
671
672 // Save symbol tree column widths
673 m_libMgr->GetAdapter()->SaveSettings();
674
675 return true;
676}
677
678
680{
682
683 if( GetLibTree() )
685
686 delete m_toolManager;
687 m_toolManager = nullptr;
688
689 Destroy();
690}
691
692
694{
695 if( m_unitSelectBox )
696 {
697 if( m_unitSelectBox->GetCount() != 0 )
698 m_unitSelectBox->Clear();
699
700 if( !m_symbol || m_symbol->GetUnitCount() <= 1 )
701 {
702 m_unit = 1;
703 m_unitSelectBox->Append( wxEmptyString );
704 }
705 else
706 {
707 for( int i = 0; i < m_symbol->GetUnitCount(); i++ )
708 m_unitSelectBox->Append( m_symbol->GetUnitDisplayName( i + 1, true ) );
709 }
710
711 // Ensure the selected unit is compatible with the number of units of the current symbol:
712 if( m_symbol && m_symbol->GetUnitCount() < m_unit )
713 m_unit = 1;
714
715 m_unitSelectBox->SetSelection( ( m_unit > 0 ) ? m_unit - 1 : 0 );
716 }
717
719 {
720 if( m_bodyStyleSelectBox->GetCount() != 0 )
721 m_bodyStyleSelectBox->Clear();
722
723 if( !m_symbol || !m_symbol->IsMultiBodyStyle() )
724 {
725 m_bodyStyle = 1;
726 m_bodyStyleSelectBox->Append( wxEmptyString );
727 }
728 else if( m_symbol && m_symbol->HasDeMorganBodyStyles() )
729 {
730 m_bodyStyleSelectBox->Append( wxGetTranslation( DEMORGAN_STD ) );
731 m_bodyStyleSelectBox->Append( wxGetTranslation( DEMORGAN_ALT ) );
732 }
733 else
734 {
735 for( int i = 0; i < m_symbol->GetBodyStyleCount(); i++ )
736 m_bodyStyleSelectBox->Append( m_symbol->GetBodyStyleNames()[i] );
737 }
738
739 // Ensure the selected body style is compatible with the number of body styles of the current symbol:
740 if( m_symbol && m_symbol->GetBodyStyleCount() < m_bodyStyle )
741 m_bodyStyle = 1;
742
743 m_bodyStyleSelectBox->SetSelection( ( m_bodyStyle > 0 ) ? m_bodyStyle - 1 : 0 );
744 }
745}
746
747
749{
750 if( !m_propertiesPanel )
751 return;
752
753 bool show = !m_propertiesPanel->IsShownOnScreen();
754
755 wxAuiPaneInfo& propertiesPaneInfo = m_auimgr.GetPane( PropertiesPaneName() );
756 propertiesPaneInfo.Show( show );
758
759 if( show )
760 {
761 SetAuiPaneSize( m_auimgr, propertiesPaneInfo,
762 m_settings->m_AuiPanels.properties_panel_width, -1 );
763 }
764 else
765 {
766 m_settings->m_AuiPanels.properties_panel_width = m_propertiesPanel->GetSize().x;
767 }
768
769 m_auimgr.Update();
770 Refresh();
771}
772
773
775{
776 wxAuiPaneInfo& treePane = m_auimgr.GetPane( m_treePane );
777 treePane.Show( !IsLibraryTreeShown() );
779 m_auimgr.Update();
780 Refresh();
781}
782
783
785{
786 return const_cast<wxAuiManager&>( m_auimgr ).GetPane( m_treePane ).IsShown();
787}
788
789
794
795
797{
798 m_treePane->Freeze();
799 m_libMgr->GetAdapter()->Freeze();
800}
801
802
804{
805 m_libMgr->GetAdapter()->Thaw();
806 m_treePane->Thaw();
807}
808
809
810void SYMBOL_EDIT_FRAME::OnExitKiCad( wxCommandEvent& event )
811{
812 Kiway().OnKiCadExit();
813}
814
815
816void SYMBOL_EDIT_FRAME::OnUpdateUnitNumber( wxUpdateUIEvent& event )
817{
818 event.Enable( m_symbol && m_symbol->GetUnitCount() > 1 );
819}
820
821
822void SYMBOL_EDIT_FRAME::OnSelectUnit( wxCommandEvent& event )
823{
824 if( event.GetSelection() == wxNOT_FOUND )
825 return;
826
827 SetUnit( event.GetSelection() + 1 );
828}
829
830
831void SYMBOL_EDIT_FRAME::OnUpdateBodyStyle( wxUpdateUIEvent& event )
832{
833 event.Enable( m_symbol && m_symbol->GetBodyStyleCount() > 1 );
834}
835
836
837void SYMBOL_EDIT_FRAME::OnSelectBodyStyle( wxCommandEvent& event )
838{
839 if( event.GetSelection() == wxNOT_FOUND )
840 return;
841
842 SetBodyStyle( event.GetSelection() + 1 );
843}
844
845
847{
848 if( m_symbol )
849 {
851
852 if( auto row = adapter->GetRow( m_symbol->GetLibNickname() ); row.has_value() )
853 {
854 if( ( *row )->Type() == SCH_IO_MGR::ShowType( SCH_IO_MGR::SCH_LEGACY ) )
855 return true;
856 }
857 }
858
859 return false;
860}
861
862
864{
865 wxString libNickname = Prj().GetRString( PROJECT::SCH_LIBEDIT_CUR_LIB );
866
867 if( !libNickname.empty() )
868 {
869 if( !PROJECT_SCH::SymbolLibAdapter( &Prj() )->HasLibrary( libNickname ) )
870 {
871 Prj().SetRString( PROJECT::SCH_LIBEDIT_CUR_LIB, wxEmptyString );
872 libNickname = wxEmptyString;
873 }
874 }
875
876 return libNickname;
877}
878
879
880wxString SYMBOL_EDIT_FRAME::SetCurLib( const wxString& aLibNickname )
881{
882 wxString old = GetCurLib();
883
884 if( aLibNickname.empty() || !PROJECT_SCH::SymbolLibAdapter( &Prj() )->HasLibrary( aLibNickname ) )
885 Prj().SetRString( PROJECT::SCH_LIBEDIT_CUR_LIB, wxEmptyString );
886 else
888
889 return old;
890}
891
892
893void SYMBOL_EDIT_FRAME::SetCurSymbol( LIB_SYMBOL* aSymbol, bool aUpdateZoom )
894{
895 wxCHECK( m_toolManager, /* void */ );
896
898 GetCanvas()->GetView()->Clear();
899 delete m_symbol;
900
901 m_symbol = aSymbol;
902
903 // select the current symbol in the tree widget
905 GetLibTree()->SelectLibId( m_symbol->GetLibId() );
906 else
907 GetLibTree()->Unselect();
908
909 wxString symbolName;
910 wxString libName;
911
912 if( m_symbol )
913 {
914 symbolName = m_symbol->GetName();
915 libName = UnescapeString( m_symbol->GetLibId().GetLibNickname() );
916 }
917
918 // retain in case this wxFrame is re-opened later on the same PROJECT
920
921 // Ensure synchronized pin edit can be enabled only symbols with interchangeable units
922 m_SyncPinEdit = aSymbol && aSymbol->IsRoot() && aSymbol->IsMultiUnit() && !aSymbol->UnitsLocked();
923
925
933
934 if( aUpdateZoom )
936
937 GetCanvas()->Refresh();
938 m_propertiesPanel->UpdateData();
939
940 WX_INFOBAR& infobar = *GetInfoBar();
941 infobar.RemoveAllButtons();
942
943 wxArrayString msgs;
944 int infobarFlags = wxICON_INFORMATION;
945
947 {
948 msgs.push_back( wxString::Format( _( "Editing symbol %s from schematic. Saving will "
949 "update the schematic only." ),
950 m_reference ) );
951
952 wxString link = wxString::Format( _( "Open symbol from library %s" ), libName );
953 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( &infobar, wxID_ANY, link, wxEmptyString );
954
955 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
956 [this, symbolName, libName]( wxHyperlinkEvent& aEvent )
957 {
959 } ) );
960
961 infobar.AddButton( button );
962 }
963 else if( IsSymbolFromLegacyLibrary() )
964 {
965 msgs.push_back( _( "Symbols in legacy libraries are not editable. Use Manage Symbol "
966 "Libraries to migrate to current format." ) );
967
968 wxString link = _( "Manage symbol libraries" );
969 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( &infobar, wxID_ANY, link, wxEmptyString );
970
971 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
972 [this]( wxHyperlinkEvent& aEvent )
973 {
975 } ) );
976
977 infobar.AddButton( button );
978 }
979 else if( IsSymbolAlias() )
980 {
981 msgs.push_back( wxString::Format( _( "Symbol %s is a derived symbol. Symbol graphics will "
982 "not be editable." ),
983 UnescapeString( symbolName ) ) );
984
985 // Don't assume the parent symbol shared pointer is still valid.
986 if( std::shared_ptr<LIB_SYMBOL> rootSymbol = m_symbol->GetRootSymbol() )
987 {
988 int unit = GetUnit();
989 int bodyStyle = GetBodyStyle();
990 wxString rootSymbolName = rootSymbol->GetName();
991 wxString link = wxString::Format( _( "Open %s" ), UnescapeString( rootSymbolName ) );
992
993 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( &infobar, wxID_ANY, link,
994 wxEmptyString );
995
996 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
997 [this, rootSymbolName, unit, bodyStyle]( wxHyperlinkEvent& aEvent )
998 {
999 LoadSymbolFromCurrentLib( rootSymbolName, unit, bodyStyle );
1000 } ) );
1001
1002 infobar.AddButton( button );
1003 }
1004 }
1005
1006 if( m_symbol
1008 && m_libMgr->IsLibraryReadOnly( m_symbol->GetLibId().GetFullLibraryName() ) )
1009 {
1010 msgs.push_back( _( "Library is read-only. Changes cannot be saved to this library." ) );
1011
1012 wxString link = wxString::Format( _( "Create an editable copy" ) );
1013 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( &infobar, wxID_ANY, link, wxEmptyString );
1014
1015 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
1016 [this, symbolName, libName]( wxHyperlinkEvent& aEvent )
1017 {
1018 wxString msg = wxString::Format( _( "Create an editable copy of the symbol or "
1019 "the entire library (%s)?" ),
1020 libName );
1021
1022 KIDIALOG errorDlg( this, msg, _( "Select type of item to save" ),
1023 wxYES_NO | wxCANCEL | wxICON_QUESTION );
1024 // These buttons are in a weird order(?)
1025 errorDlg.SetYesNoCancelLabels( _( "Copy symbol" ), _( "Cancel" ),
1026 _( "Copy library" ) );
1027
1028 int choice = errorDlg.ShowModal();
1029
1030 switch( choice )
1031 {
1032 case wxID_YES:
1033 SaveSymbolCopyAs( true );
1034 break;
1035 case wxID_CANCEL:
1036 SaveLibraryAs();
1037 break;
1038 default:
1039 // Do nothing
1040 break;
1041 }
1042 } ) );
1043
1044 infobar.AddButton( button );
1045 }
1046
1047 if( msgs.empty() )
1048 {
1049 infobar.Dismiss();
1050 }
1051 else
1052 {
1053 wxString msg = wxJoin( msgs, '\n', '\0' );
1054 infobar.ShowMessage( msg, infobarFlags );
1055 }
1056}
1057
1058
1064
1065
1067{
1069
1071
1072 if( !IsSymbolFromSchematic() )
1074
1075 if( m_isClosing )
1076 return;
1077
1079
1080 if( !GetTitle().StartsWith( "*" ) )
1081 UpdateTitle();
1082}
1083
1084
1086{
1087 wxCHECK( aUnit > 0 && aUnit <= GetCurSymbol()->GetUnitCount(), /* void*/ );
1088
1089 if( m_unit == aUnit )
1090 return;
1091
1094
1095 m_unit = aUnit;
1096
1097 if( m_unitSelectBox->GetSelection() != ( m_unit - 1 ) )
1098 m_unitSelectBox->SetSelection( m_unit - 1 );
1099
1101 RebuildView();
1103}
1104
1105
1107{
1108 wxCHECK( aBodyStyle > 0 && aBodyStyle <= GetCurSymbol()->GetBodyStyleCount(), /* void */ );
1109
1110 if( m_bodyStyle == aBodyStyle )
1111 return;
1112
1115
1116 m_bodyStyle = aBodyStyle;
1117
1118 if( m_bodyStyleSelectBox->GetSelection() != ( m_bodyStyle - 1 ) )
1119 m_bodyStyleSelectBox->SetSelection( m_bodyStyle - 1 );
1120
1121
1123 RebuildView();
1125}
1126
1127
1129{
1130 return m_SyncPinEdit && m_symbol && m_symbol->IsMultiUnit() && !m_symbol->UnitsLocked();
1131}
1132
1133
1134wxString SYMBOL_EDIT_FRAME::AddLibraryFile( bool aCreateNew )
1135{
1136 wxFileName fn = m_libMgr->GetUniqueLibraryName();
1137 bool useGlobalTable = true;
1138 FILEDLG_HOOK_NEW_LIBRARY tableChooser( useGlobalTable );
1139
1140 if( !LibraryFileBrowser( aCreateNew ? _( "New Symbol Library" ) : _( "Add Symbol Library" ),
1141 !aCreateNew, fn, FILEEXT::KiCadSymbolLibFileWildcard(),
1143 Pgm().GetSettingsManager().IsProjectOpenNotDummy() ? &tableChooser : nullptr ) )
1144 {
1145 return wxEmptyString;
1146 }
1147
1150
1151 LIBRARY_MANAGER& manager = Pgm().GetLibraryManager();
1152 std::optional<LIBRARY_TABLE*> optTable = manager.Table( LIBRARY_TABLE_TYPE::SYMBOL, scope );
1153
1154 wxCHECK( optTable.has_value(), wxEmptyString );
1155 LIBRARY_TABLE* table = optTable.value();
1156
1157 wxString libName = fn.GetName();
1158
1159 if( libName.IsEmpty() )
1160 return wxEmptyString;
1161
1163
1164 if( adapter->HasLibrary( libName ) )
1165 {
1166 DisplayError( this, wxString::Format( _( "Library '%s' already exists." ), libName ) );
1167 return wxEmptyString;
1168 }
1169
1170 if( aCreateNew )
1171 {
1172 if( !m_libMgr->CreateLibrary( fn.GetFullPath(), scope ) )
1173 {
1174 DisplayError( this, wxString::Format( _( "Could not create the library file '%s'.\n"
1175 "Make sure you have write permissions and try again." ),
1176 fn.GetFullPath() ) );
1177 return wxEmptyString;
1178 }
1179 }
1180 else
1181 {
1182 if( !m_libMgr->AddLibrary( fn.GetFullPath(), scope ) )
1183 {
1184 DisplayError( this, _( "Could not open the library file." ) );
1185 return wxEmptyString;
1186 }
1187 }
1188
1189 bool success = true;
1190
1191 // Tables are reinitialized by m_libMgr->AddLibrary(). So reinit table reference.
1192 optTable = manager.Table( LIBRARY_TABLE_TYPE::SYMBOL, scope );
1193 wxCHECK( optTable.has_value(), wxEmptyString );
1194 table = optTable.value();
1195
1196 table->Save().map_error(
1197 [&]( const LIBRARY_ERROR& aError )
1198 {
1199 wxMessageDialog dlg( this, _( "Error saving library table." ), _( "File Save Error" ),
1200 wxOK | wxICON_ERROR );
1201 dlg.SetExtendedMessage( aError.message );
1202 dlg.ShowModal();
1203
1204 success = false;
1205 } );
1206
1207 if( success )
1208 adapter->LoadOne( fn.GetName() );
1209
1210 std::string packet = fn.GetFullPath().ToStdString();
1213
1214 return fn.GetFullPath();
1215}
1216
1217
1218void SYMBOL_EDIT_FRAME::DdAddLibrary( wxString aLibFile )
1219{
1220 wxFileName fn = wxFileName( aLibFile );
1221 wxString libName = fn.GetName();
1222
1223 if( libName.IsEmpty() )
1224 return;
1225
1226 LIBRARY_MANAGER& manager = Pgm().GetLibraryManager();
1228
1229 if( adapter->HasLibrary( libName ) )
1230 {
1231 DisplayError( this, wxString::Format( _( "Library '%s' already exists." ), libName ) );
1232 return;
1233 }
1234
1235 // TODO(JE) after Jeff's commit removing the select dialog; this is always project? is that correct?
1236 if( !m_libMgr->AddLibrary( fn.GetFullPath(), LIBRARY_TABLE_SCOPE::PROJECT ) )
1237 {
1238 DisplayError( this, _( "Could not open the library file." ) );
1239 return;
1240 }
1241
1242 std::optional<LIBRARY_TABLE*> optTable = manager.Table( LIBRARY_TABLE_TYPE::SYMBOL, LIBRARY_TABLE_SCOPE::PROJECT );
1243 wxCHECK( optTable.has_value(), /* void */ );
1244 LIBRARY_TABLE* table = optTable.value();
1245 bool success = true;
1246
1247 table->Save().map_error(
1248 [&]( const LIBRARY_ERROR& aError )
1249 {
1250 wxMessageDialog dlg( this, _( "Error saving library table." ), _( "File Save Error" ),
1251 wxOK | wxICON_ERROR );
1252 dlg.SetExtendedMessage( aError.message );
1253 dlg.ShowModal();
1254
1255 success = false;
1256 } );
1257
1258 if( success )
1259 adapter->LoadOne( libName );
1260
1261 std::string packet = fn.GetFullPath().ToStdString();
1264}
1265
1266
1268{
1269 return GetLibTree()->GetSelectedLibId( aUnit );
1270}
1271
1272
1277
1278int SYMBOL_EDIT_FRAME::GetTreeLIBIDs( std::vector<LIB_ID>& aSelection ) const
1279{
1280 return GetLibTree()->GetSelectedLibIds( aSelection );
1281}
1282
1283
1285{
1286 if( IsLibraryTreeShown() )
1287 {
1288 LIB_ID libId = GetTreeLIBID();
1289
1290 if( libId.IsValid() )
1291 return m_libMgr->GetSymbol( libId.GetLibItemName(), libId.GetLibNickname() );
1292 }
1293
1294 return m_symbol;
1295}
1296
1297
1299{
1300 LIB_ID id;
1301
1302 if( IsLibraryTreeShown() )
1303 id = GetTreeLIBID();
1304
1305 if( id.GetLibNickname().empty() && m_symbol )
1306 id = m_symbol->GetLibId();
1307
1308 return id;
1309}
1310
1311
1312std::vector<LIB_ID> SYMBOL_EDIT_FRAME::GetSelectedLibIds() const
1313{
1314 std::vector<LIB_ID> ids;
1315 GetTreeLIBIDs( ids );
1316 return ids;
1317}
1318
1319
1321{
1322 return GetTargetLibId().GetLibNickname();
1323}
1324
1325
1326void SYMBOL_EDIT_FRAME::SyncLibraries( bool aShowProgress, bool aPreloadCancelled,
1327 const wxString& aForceRefresh )
1328{
1329 LIB_ID selected;
1330
1331 if( m_treePane )
1332 selected = GetLibTree()->GetSelectedLibId();
1333
1334 if( aShowProgress )
1335 {
1336 APP_PROGRESS_DIALOG progressDlg( _( "Loading Symbol Libraries" ), wxEmptyString,
1337 m_libMgr->GetAdapter()->GetLibrariesCount(), this );
1338
1339 m_libMgr->Sync( aForceRefresh,
1340 [&]( int progress, int max, const wxString& libName )
1341 {
1342 progressDlg.Update( progress, wxString::Format( _( "Loading library '%s'..." ),
1343 libName ) );
1344 } );
1345 }
1346 else if( !aPreloadCancelled )
1347 {
1348 m_libMgr->Sync( aForceRefresh,
1349 [&]( int progress, int max, const wxString& libName )
1350 {
1351 } );
1352 }
1353
1354 if( m_treePane )
1355 {
1356 wxDataViewItem found;
1357
1358 if( selected.IsValid() )
1359 {
1360 // Check if the previously selected item is still valid,
1361 // if not - it has to be unselected to prevent crash
1362 found = m_libMgr->GetAdapter()->FindItem( selected );
1363
1364 if( !found )
1365 GetLibTree()->Unselect();
1366 }
1367
1368 GetLibTree()->Regenerate( true );
1369
1370 // Try to select the parent library, in case the symbol is not found
1371 if( !found && selected.IsValid() )
1372 {
1373 selected.SetLibItemName( "" );
1374 found = m_libMgr->GetAdapter()->FindItem( selected );
1375
1376 if( found )
1377 GetLibTree()->SelectLibId( selected );
1378 }
1379
1380 // If no selection, see if there's a current symbol to centre
1381 if( !selected.IsValid() && m_symbol )
1382 {
1383 LIB_ID current( GetCurLib(), m_symbol->GetName() );
1384 GetLibTree()->CenterLibId( current );
1385 }
1386 }
1387}
1388
1389
1394
1395
1397{
1398 GetLibTree()->SelectLibId( aLibID );
1399}
1400
1401
1402void SYMBOL_EDIT_FRAME::UpdateLibraryTree( const wxDataViewItem& aTreeItem, LIB_SYMBOL* aSymbol )
1403{
1404 if( aTreeItem.IsOk() ) // Can be not found in tree if the current footprint is imported
1405 // from file therefore not yet in tree.
1406 {
1407 static_cast<LIB_TREE_NODE_ITEM*>( aTreeItem.GetID() )->Update( aSymbol );
1409 }
1410}
1411
1412
1413bool SYMBOL_EDIT_FRAME::backupFile( const wxFileName& aOriginalFile, const wxString& aBackupExt )
1414{
1415 if( aOriginalFile.FileExists() )
1416 {
1417 wxFileName backupFileName( aOriginalFile );
1418 backupFileName.SetExt( aBackupExt );
1419
1420 if( backupFileName.FileExists() )
1421 wxRemoveFile( backupFileName.GetFullPath() );
1422
1423 if( !wxCopyFile( aOriginalFile.GetFullPath(), backupFileName.GetFullPath() ) )
1424 {
1425 DisplayError( this, wxString::Format( _( "Failed to save backup to '%s'." ),
1426 backupFileName.GetFullPath() ) );
1427 return false;
1428 }
1429 }
1430
1431 return true;
1432}
1433
1434
1436{
1437 if( m_symbol && !GetCurLib().IsEmpty() && GetScreen()->IsContentModified() )
1438 m_libMgr->UpdateSymbol( m_symbol, GetCurLib() ); // UpdateSymbol() makes a copy
1439}
1440
1441
1443{
1444 // This will return the root symbol of any alias
1445 LIB_SYMBOL* symbol = m_libMgr->GetBufferedSymbol( aLibId.GetLibItemName(), aLibId.GetLibNickname() );
1446
1447 // Now we can compare the libId of the current symbol and the root symbol
1448 return ( symbol && m_symbol && symbol->GetLibId() == m_symbol->GetLibId() );
1449}
1450
1451
1453{
1454 GetLibTree()->Unselect();
1455 SetCurLib( wxEmptyString );
1456 SetCurSymbol( nullptr, false );
1460 Refresh();
1461}
1462
1463
1465{
1467
1469 {
1470 GetRenderSettings()->m_ShowPinsElectricalType = cfg->m_ShowPinElectricalType;
1471 GetRenderSettings()->m_ShowHiddenPins = cfg->m_ShowHiddenPins;
1472 GetRenderSettings()->m_ShowHiddenFields = cfg->m_ShowHiddenFields;
1473 GetRenderSettings()->m_ShowPinAltIcons = cfg->m_ShowPinAltIcons;
1474
1475 GetGalDisplayOptions().ReadWindowSettings( cfg->m_Window );
1476 }
1477
1478 if( m_symbol )
1479 m_symbol->ClearCaches();
1480
1482
1484 GetCanvas()->Refresh();
1485
1487
1488 if( aFlags & ENVVARS_CHANGED )
1489 SyncLibraries( true );
1490
1491 Layout();
1492 SendSizeEvent();
1493}
1494
1495
1497{
1498 // call my base class
1500
1501 // tooltips in toolbars
1503
1504 // For some obscure reason, the AUI manager hides the first modified pane.
1505 // So force show panes
1506 wxAuiPaneInfo& tree_pane_info = m_auimgr.GetPane( m_treePane );
1507 bool tree_shown = tree_pane_info.IsShown();
1508 tree_pane_info.Caption( _( "Libraries" ) );
1509 tree_pane_info.Show( tree_shown );
1510 m_auimgr.Update();
1511
1513
1514 // status bar
1516
1517 if( GetRenderSettings()->m_ShowPinsElectricalType )
1518 {
1520 GetCanvas()->Refresh();
1521 }
1522
1523 UpdateTitle();
1524}
1525
1526
1528{
1529 SCH_BASE_FRAME::SetScreen( aScreen );
1530
1531 // Let tools add things to the view if necessary
1532 if( m_toolManager )
1534}
1535
1536
1554
1555
1557{
1558 SyncLibraries( true );
1559
1560 if( m_symbol )
1561 {
1562 SCH_SELECTION_TOOL* selectionTool = m_toolManager->GetTool<SCH_SELECTION_TOOL>();
1563 SCH_SELECTION& selection = selectionTool->GetSelection();
1564
1565 for( SCH_ITEM& item : m_symbol->GetDrawItems() )
1566 {
1567 if( !alg::contains( selection, &item ) )
1568 item.ClearSelected();
1569 else
1570 item.SetSelected();
1571 }
1572
1573 m_symbol->ClearCaches();
1574 }
1575
1576 RebuildView();
1577}
1578
1579
1580const BOX2I SYMBOL_EDIT_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
1581{
1582 if( !m_symbol )
1583 {
1584 // Gives a reasonable drawing area size
1585 int width = schIUScale.mmToIU( 50 );
1586 int height = schIUScale.mmToIU( 30 );
1587
1588 return BOX2I( VECTOR2I( -width/2, -height/2 ), VECTOR2I( width, height ) );
1589 }
1590 else
1591 {
1592 return m_symbol->Flatten()->GetUnitBoundingBox( m_unit, m_bodyStyle );
1593 }
1594}
1595
1596
1597void SYMBOL_EDIT_FRAME::FocusOnItem( EDA_ITEM* aItem, bool aAllowScroll )
1598{
1599 static KIID lastBrightenedItemID( niluuid );
1600
1601 SCH_ITEM* lastItem = nullptr;
1602
1603 // nullptr will clear the current focus
1604 if( aItem != nullptr && !aItem->IsSCH_ITEM() )
1605 return;
1606
1607 if( m_symbol )
1608 {
1609 for( SCH_PIN* pin : m_symbol->GetPins() )
1610 {
1611 if( pin->m_Uuid == lastBrightenedItemID )
1612 lastItem = pin;
1613 }
1614
1615 std::vector<SCH_FIELD*> fields;
1616 m_symbol->GetFields( fields );
1617
1618 for( SCH_FIELD* field : fields )
1619 {
1620 if( field->m_Uuid == lastBrightenedItemID )
1621 lastItem = field;
1622 }
1623 }
1624
1625 if( lastItem && lastItem != aItem )
1626 {
1627 lastItem->ClearBrightened();
1628
1629 UpdateItem( lastItem );
1630 lastBrightenedItemID = niluuid;
1631 }
1632
1633 if( aItem )
1634 {
1635 if( !aItem->IsBrightened() )
1636 {
1637 aItem->SetBrightened();
1638
1639 UpdateItem( aItem );
1640 lastBrightenedItemID = aItem->m_Uuid;
1641 }
1642
1643 FocusOnLocation( VECTOR2I( aItem->GetFocusPosition().x, -aItem->GetFocusPosition().y ), aAllowScroll );
1644 }
1645}
1646
1647
1649{
1650 const std::string& payload = mail.GetPayload();
1651
1652 switch( mail.Command() )
1653 {
1654 case MAIL_LIB_EDIT:
1655 if( !payload.empty() )
1656 {
1657 wxString uri( payload );
1658 wxString libNickname;
1659 wxString msg;
1660
1662 std::optional<const LIBRARY_TABLE_ROW*> libTableRow = adapter->FindRowByURI( uri );
1663
1664 if( !libTableRow )
1665 {
1666 msg.Printf( _( "The current configuration does not include the symbol library '%s'." ),
1667 uri );
1668 msg += wxS( "\n" ) + _( "Use Manage Symbol Libraries to edit the configuration." );
1669 DisplayErrorMessage( this, _( "Library not found in symbol library table." ), msg );
1670 break;
1671 }
1672
1673 libNickname = ( *libTableRow )->Nickname();
1674
1675 if( !adapter->HasLibrary( libNickname, true ) )
1676 {
1677 msg.Printf( _( "The symbol library '%s' is not enabled in the current configuration." ),
1678 UnescapeString( libNickname ) );
1679 msg += wxS( "\n" ) + _( "Use Manage Symbol Libraries to edit the configuration." );
1680 DisplayErrorMessage( this, _( "Symbol library not enabled." ), msg );
1681 break;
1682 }
1683
1684 SetCurLib( libNickname );
1685
1686 if( m_treePane )
1687 {
1688 LIB_ID id( libNickname, wxEmptyString );
1689 GetLibTree()->SelectLibId( id );
1690 GetLibTree()->ExpandLibId( id );
1691 GetLibTree()->CenterLibId( id );
1692 }
1693 }
1694
1695 break;
1696
1697 case MAIL_RELOAD_LIB:
1698 {
1699 wxString currentLib = GetCurLib();
1700
1702
1703 // Check if the currently selected symbol library been removed or disabled.
1704 if( !currentLib.empty()
1705 && !PROJECT_SCH::SymbolLibAdapter( &Prj() )->HasLibrary( currentLib, true ) )
1706 {
1707 SetCurLib( wxEmptyString );
1708 emptyScreen();
1709 }
1710
1711 SyncLibraries( true );
1714
1715 break;
1716 }
1717
1719 {
1721 LIB_SYMBOL* symbol = GetCurSymbol();
1722
1723 wxLogTrace( traceLibWatch, "Received refresh symbol request for %s", payload );
1724
1725 if( !symbol )
1726 break;
1727
1728 wxString libName = symbol->GetLibId().GetLibNickname();
1729 std::optional<const LIBRARY_TABLE_ROW*> row = adapter->GetRow( libName );
1730
1731 if( !row )
1732 return;
1733
1734 wxFileName libfullname( LIBRARY_MANAGER::GetFullURI( *row, true ) );
1735
1736 wxFileName changedLib( mail.GetPayload() );
1737
1738 wxLogTrace( traceLibWatch, "Received refresh symbol request for %s, current symbols is %s",
1739 changedLib.GetFullPath(), libfullname.GetFullPath() );
1740
1741 if( changedLib == libfullname )
1742 {
1743 wxLogTrace( traceLibWatch, "Refreshing symbol %s", symbol->GetName() );
1744
1745 SetScreen( m_dummyScreen ); // UpdateLibraryBuffer will destroy the old screen
1746 m_libMgr->UpdateLibraryBuffer( libName );
1747
1748 if( LIB_SYMBOL* lib_symbol = m_libMgr->GetBufferedSymbol( symbol->GetName(), libName ) )
1749 {
1750 // The buffered screen for the symbol
1751 SCH_SCREEN* symbol_screen = m_libMgr->GetScreen( lib_symbol->GetName(), libName );
1752
1753 SetScreen( symbol_screen );
1754 SetCurSymbol( new LIB_SYMBOL( *lib_symbol ), false );
1756
1757 if( m_toolManager )
1759 }
1760 }
1761
1762 break;
1763 }
1764
1765 default:
1766 break;
1767 }
1768}
1769
1770
1771std::unique_ptr<GRID_HELPER> SYMBOL_EDIT_FRAME::MakeGridHelper()
1772{
1773 return std::make_unique<EE_GRID_HELPER>( m_toolManager );
1774}
1775
1776
1778{
1779 // switches currently used canvas ( Cairo / OpenGL):
1780 SCH_BASE_FRAME::SwitchCanvas( aCanvasType );
1781
1782 // Set options specific to symbol editor (axies are always enabled):
1783 GetCanvas()->GetGAL()->SetAxesEnabled( true );
1785}
1786
1787
1789{
1790 wxCHECK( m_libMgr, false );
1791
1792 return m_libMgr->HasModifications();
1793}
1794
1795
1797{
1798 wxCHECK( m_libMgr, false );
1799
1800 // Test if the currently edited symbol is modified
1802 return true;
1803
1804 // Test if any library has been modified
1805 for( const wxString& libName : m_libMgr->GetLibraryNames() )
1806 {
1807 if( m_libMgr->IsLibraryModified( libName ) && !m_libMgr->IsLibraryReadOnly( libName ) )
1808 return true;
1809 }
1810
1811 return false;
1812}
1813
1814
1816{
1817 if( aItemCount == 0 )
1818 return;
1819
1820 UNDO_REDO_CONTAINER& list = ( whichList == UNDO_LIST ) ? m_undoList : m_redoList;
1821
1822 if( aItemCount < 0 )
1823 {
1824 list.ClearCommandList();
1825 }
1826 else
1827 {
1828 for( int ii = 0; ii < aItemCount; ii++ )
1829 {
1830 if( list.m_CommandsList.size() == 0 )
1831 break;
1832
1833 PICKED_ITEMS_LIST* curr_cmd = list.m_CommandsList[0];
1834 list.m_CommandsList.erase( list.m_CommandsList.begin() );
1835
1836 curr_cmd->ClearListAndDeleteItems( []( EDA_ITEM* aItem )
1837 {
1838 delete aItem;
1839 } );
1840 delete curr_cmd; // Delete command
1841 }
1842 }
1843}
1844
1845
1847{
1848 return m_toolManager->GetTool<SCH_SELECTION_TOOL>()->GetSelection();
1849}
1850
1851
1853{
1854 std::unique_ptr<LIB_SYMBOL> symbol = aSymbol->GetLibSymbolRef()->Flatten();
1855 wxCHECK( symbol, /* void */ );
1856
1857 symbol->SetLibId( aSymbol->GetLibId() );
1858
1859 // Take in account the symbol orientation and mirroring. to calculate the field
1860 // positions in symbol editor (i.e. no rotation, no mirroring)
1861 int orientation = aSymbol->GetOrientation() & ~( SYM_MIRROR_X | SYM_MIRROR_Y );
1862 int mirror = aSymbol->GetOrientation() & ( SYM_MIRROR_X | SYM_MIRROR_Y );
1863
1864 std::vector<SCH_FIELD> fullSetOfFields;
1865
1866 for( const SCH_FIELD& field : aSymbol->GetFields() )
1867 {
1868 VECTOR2I pos = field.GetPosition() - aSymbol->GetPosition();
1869 SCH_FIELD libField( symbol.get(), field.GetId() );
1870
1871 libField = field;
1872
1873 // The inverse transform is mirroring before, rotate after
1874 switch( mirror )
1875 {
1876 case SYM_MIRROR_X: pos.y = -pos.y; break;
1877 case SYM_MIRROR_Y: pos.x = -pos.x; break;
1878 default: break;
1879 }
1880
1881 switch( orientation )
1882 {
1883 case SYM_ORIENT_90:
1884 std::swap( pos.x, pos.y );
1885 pos.x = - pos.x;
1886 break;
1887 case SYM_ORIENT_270:
1888 std::swap( pos.x, pos.y );
1889 pos.y = - pos.y;
1890 break;
1891 case SYM_ORIENT_180:
1892 pos.x = - pos.x;
1893 pos.y = - pos.y;
1894 break;
1895 default:
1896 break;
1897 }
1898
1899 libField.SetPosition( pos );
1900
1901 fullSetOfFields.emplace_back( std::move( libField ) );
1902 }
1903
1904 symbol->SetFields( fullSetOfFields );
1905
1906 if( m_symbol )
1907 SetCurSymbol( nullptr, false );
1908
1910 m_schematicSymbolUUID = aSymbol->m_Uuid;
1911 m_reference = symbol->GetReferenceField().GetText();
1912 m_unit = std::max( 1, aSymbol->GetUnit() );
1913 m_bodyStyle = std::max( 1, aSymbol->GetBodyStyle() );
1914
1915 // Optimize default edit options for this symbol
1916 // Usually if units are locked, graphic items are specific to each unit
1917 // and if units are interchangeable, graphic items are common to units
1919 tools->SetDrawSpecificUnit( symbol->UnitsLocked() );
1920
1921 // The buffered screen for the symbol
1922 SCH_SCREEN* tmpScreen = new SCH_SCREEN();
1923
1924 SetScreen( tmpScreen );
1925 SetCurSymbol( symbol.release(), true );
1926 setSymWatcher( nullptr );
1927
1930
1931 if( IsLibraryTreeShown() )
1933
1934 UpdateTitle();
1937
1938 // Let tools add things to the view if necessary
1939 if( m_toolManager )
1941
1943 GetCanvas()->Refresh();
1944}
1945
1946
1947bool SYMBOL_EDIT_FRAME::addLibTableEntry( const wxString& aLibFile, LIBRARY_TABLE_SCOPE aScope )
1948{
1949 wxFileName fn = aLibFile;
1950 wxFileName libTableFileName( Prj().GetProjectPath(), FILEEXT::SymbolLibraryTableFileName );
1951 wxString libNickname = fn.GetName();
1953 LIBRARY_MANAGER& manager = Pgm().GetLibraryManager();
1954 const ENV_VAR_MAP& envVars = Pgm().GetLocalEnvVariables();
1955
1956 if( adapter->HasLibrary( libNickname ) )
1957 {
1958 wxString tmp;
1959 int suffix = 1;
1960
1961 while( adapter->HasLibrary( libNickname ) )
1962 {
1963 tmp.Printf( "%s%d", fn.GetName(), suffix );
1964 libNickname = tmp;
1965 suffix += 1;
1966 }
1967 }
1968
1969 std::optional<LIBRARY_TABLE*> optTable = manager.Table( LIBRARY_TABLE_TYPE::SYMBOL, aScope );
1970 wxCHECK( optTable.has_value(), false );
1971 LIBRARY_TABLE* table = optTable.value();
1972
1973 LIBRARY_TABLE_ROW* row = &table->InsertRow();
1974
1975 row->SetNickname( libNickname );
1976
1977 // We cannot normalize against the current project path when saving to global table.
1978 wxString normalizedPath = NormalizePath( aLibFile, &envVars,
1979 aScope == LIBRARY_TABLE_SCOPE::PROJECT ? Prj().GetProjectPath()
1980 : wxString( wxEmptyString ) );
1981
1982 row->SetURI( normalizedPath );
1984
1985 bool success = true;
1986
1987 table->Save().map_error(
1988 [&]( const LIBRARY_ERROR& aError )
1989 {
1990 wxMessageDialog dlg( this, _( "Error saving library table." ), _( "File Save Error" ),
1991 wxOK | wxICON_ERROR );
1992 dlg.SetExtendedMessage( aError.message );
1993 dlg.ShowModal();
1994
1995 success = false;
1996 } );
1997
1998 if( success )
1999 {
2000 manager.ReloadTables( aScope, { LIBRARY_TABLE_TYPE::SYMBOL } );
2001 adapter->LoadOne( libNickname );
2002 }
2003
2004 return success;
2005}
2006
2007
2008bool SYMBOL_EDIT_FRAME::replaceLibTableEntry( const wxString& aLibNickname, const wxString& aLibFile )
2009{
2011 LIBRARY_MANAGER& manager = Pgm().GetLibraryManager();
2012 LIBRARY_TABLE* table = nullptr;
2014
2015 // Check the global library table first because checking the project library table
2016 // checks the global library table as well due to library chaining.
2017 if( adapter->GetRow( aLibNickname, scope ) )
2018 {
2019 std::optional<LIBRARY_TABLE*> optTable = manager.Table( LIBRARY_TABLE_TYPE::SYMBOL, scope );
2020 wxCHECK( optTable.has_value(), false );
2021 table = optTable.value();
2022 }
2023 else
2024 {
2026
2027 if( adapter->GetRow( aLibNickname, scope ) )
2028 {
2029 std::optional<LIBRARY_TABLE*> optTable = manager.Table( LIBRARY_TABLE_TYPE::SYMBOL, scope );
2030
2031 if( optTable.has_value() )
2032 table = optTable.value();
2033 }
2034 }
2035
2036 wxCHECK( table, false );
2037
2038 std::optional<LIBRARY_TABLE_ROW*> optRow = adapter->GetRow( aLibNickname, scope );
2039 wxCHECK( optRow.has_value(), false );
2040 LIBRARY_TABLE_ROW* row = optRow.value();
2041
2042 const ENV_VAR_MAP& envVars = Pgm().GetLocalEnvVariables();
2043
2044 wxString projectPath;
2045
2046 if( scope == LIBRARY_TABLE_SCOPE::PROJECT )
2047 projectPath = Prj().GetProjectPath();
2048
2049 wxString normalizedPath = NormalizePath( aLibFile, &envVars, projectPath );
2050
2051 row->SetURI( normalizedPath );
2052 row->SetType( "KiCad" );
2053
2054 bool success = true;
2055
2056 table->Save().map_error(
2057 [&]( const LIBRARY_ERROR& aError )
2058 {
2059 wxMessageDialog dlg( this, _( "Error saving library table." ), _( "File Save Error" ),
2060 wxOK | wxICON_ERROR );
2061 dlg.SetExtendedMessage( aError.message );
2062 dlg.ShowModal();
2063
2064 success = false;
2065 } );
2066
2067 if( success )
2068 {
2069 manager.ReloadTables( scope, { LIBRARY_TABLE_TYPE::SYMBOL } );
2070 adapter->LoadOne( aLibNickname );
2071 }
2072
2073 return success;
2074}
2075
2076
2078{
2079 return m_symbol && !m_symbol->IsRoot();
2080}
2081
2082
2087
2088
2089void SYMBOL_EDIT_FRAME::UpdateItem( EDA_ITEM* aItem, bool isAddOrDelete, bool aUpdateRtree )
2090{
2091 SCH_BASE_FRAME::UpdateItem( aItem, isAddOrDelete, aUpdateRtree );
2092
2093 if( EDA_TEXT* eda_text = dynamic_cast<EDA_TEXT*>( aItem ) )
2094 {
2095 eda_text->ClearBoundingBoxCache();
2096 eda_text->ClearRenderCache();
2097 }
2098}
2099
2100
2102{
2103 wxAuiPaneInfo& treePane = m_auimgr.GetPane( m_treePane );
2104 wxAuiPaneInfo& propertiesPane = m_auimgr.GetPane( PropertiesPaneName() );
2105 wxAuiPaneInfo& selectionFilterPane = m_auimgr.GetPane( wxS( "SelectionFilter" ) );
2106
2107 // Don't give the selection filter its own visibility controls; instead show it if
2108 // anything else is visible
2109 bool showFilter = ( treePane.IsShown() && treePane.IsDocked() )
2110 || ( propertiesPane.IsShown() && propertiesPane.IsDocked() );
2111
2112 selectionFilterPane.Show( showFilter );
2113}
2114
2115
2117{
2118 // Returns the current render option for invisible fields
2120}
2121
2122
2124{
2125 // Returns the current render option for invisible pins
2127}
BASE_SCREEN class implementation.
constexpr EDA_IU_SCALE schIUScale
Definition base_units.h:114
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_16
BOX2< VECTOR2I > BOX2I
Definition box2.h:922
BOX2< VECTOR2D > BOX2D
Definition box2.h:923
static TOOL_ACTION toggleGrid
Definition actions.h:198
static TOOL_ACTION paste
Definition actions.h:80
static TOOL_ACTION cancelInteractive
Definition actions.h:72
static TOOL_ACTION unselectAll
Definition actions.h:83
static TOOL_ACTION revert
Definition actions.h:62
static TOOL_ACTION showLibraryTree
Definition actions.h:164
static TOOL_ACTION copy
Definition actions.h:78
static TOOL_ACTION showDatasheet
Definition actions.h:267
static TOOL_ACTION toggleBoundingBoxes
Definition actions.h:157
static TOOL_ACTION saveAll
Definition actions.h:61
static TOOL_ACTION undo
Definition actions.h:75
static TOOL_ACTION duplicate
Definition actions.h:84
static TOOL_ACTION doDelete
Definition actions.h:85
static TOOL_ACTION selectionTool
Definition actions.h:251
static TOOL_ACTION save
Definition actions.h:58
static TOOL_ACTION zoomFitScreen
Definition actions.h:142
static TOOL_ACTION redo
Definition actions.h:76
static TOOL_ACTION deleteTool
Definition actions.h:86
static TOOL_ACTION zoomTool
Definition actions.h:146
static TOOL_ACTION selectionClear
Clear the current selection.
Definition actions.h:224
static TOOL_ACTION showProperties
Definition actions.h:266
static TOOL_ACTION cut
Definition actions.h:77
static TOOL_ACTION ddAddLibrary
Definition actions.h:67
static TOOL_ACTION copyAsText
Definition actions.h:79
static TOOL_ACTION toggleGridOverrides
Definition actions.h:199
static TOOL_ACTION selectAll
Definition actions.h:82
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.
wxString m_ColorTheme
Active color theme name.
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...
Handle actions that are shared between different applications.
Handles action that are shared between different applications.
UNDO_REDO_CONTAINER m_undoList
void ShowChangedLanguage() override
Redraw the menus and what not in current language.
virtual void setupUIConditions()
Setup the UI conditions for the various actions and their controls in this frame.
virtual void ClearUndoRedoList()
Clear the undo and redo list using ClearUndoORRedoList()
SETTINGS_MANAGER * GetSettingsManager() const
UNDO_REDO_LIST
Specify whether we are interacting with the undo or redo stacks.
virtual void OnModify()
Must be called after a model change in order to set the "modify" flag and do other frame-specific pro...
ACTION_TOOLBAR * m_tbRight
TOOLBAR_SETTINGS * m_toolbarSettings
wxAuiManager m_auimgr
virtual void RecreateToolbars()
UNDO_REDO_CONTAINER m_redoList
ACTION_TOOLBAR * m_tbLeft
virtual void OnDropFiles(wxDropFilesEvent &aEvent)
Handle event fired when a file is dropped to the window.
std::map< const wxString, TOOL_ACTION * > m_acceptedExts
Associate file extensions with action to execute.
ACTION_TOOLBAR * m_tbTopMain
wxString m_aboutTitle
bool m_isClosing
Set by the close window event handler after frames are asked if they can close.
void ReCreateMenuBar()
Recreate the menu bar.
WX_INFOBAR * GetInfoBar()
COLOR_SETTINGS * m_colorSettings
EDA_DRAW_PANEL_GAL::GAL_TYPE m_canvasType
The current canvas type.
void OnSelectGrid(wxCommandEvent &event)
Command event handler for selecting grid sizes.
void setupUnits(APP_SETTINGS_BASE *aCfg)
virtual void SwitchCanvas(EDA_DRAW_PANEL_GAL::GAL_TYPE aCanvasType)
Change the current rendering backend.
virtual void OnSelectZoom(wxCommandEvent &event)
Set the zoom factor when selected by the zoom list box in the main tool bar.
GAL_DISPLAY_OPTIONS_IMPL & GetGalDisplayOptions()
Return a reference to the gal rendering options used by GAL for rendering.
virtual void resolveCanvasType()
Determine the canvas type to load (with prompt if required) and initializes m_canvasType.
static const wxString PropertiesPaneName()
EDA_MSG_PANEL * m_messagePanel
virtual void SetScreen(BASE_SCREEN *aScreen)
bool LibraryFileBrowser(const wxString &aTitle, bool doOpen, wxFileName &aFilename, const wxString &wildcard, const wxString &ext, bool isDirectory, FILEDLG_HOOK_NEW_LIBRARY *aFileDlgHook=nullptr)
void FocusOnLocation(const VECTOR2I &aPos, bool aAllowScroll=true)
Useful to focus on a particular location, in find functions.
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:98
virtual const VECTOR2I GetFocusPosition() const
Similar to GetPosition() but allows items to return their visual center rather than their anchor.
Definition eda_item.h:285
const KIID m_Uuid
Definition eda_item.h:522
void ClearBrightened()
Definition eda_item.h:144
void SetBrightened()
Definition eda_item.h:141
bool IsBrightened() const
Definition eda_item.h:129
Specialization of the wxAuiPaneInfo class for KiCad panels.
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
Definition eda_text.h:80
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 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.
void ReadWindowSettings(WINDOW_SETTINGS &aCfg)
Read GAL config options from application-level config.
Helper class to create more flexible dialogs, including 'do not show again' checkbox handling.
Definition kidialog.h:42
int ShowModal() override
Definition kidialog.cpp:93
bool m_axesEnabled
Crosshair drawing mode.
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:206
void ClearHiddenFlags()
Clear the hide flag of all items in the view.
Definition sch_view.cpp:194
bool IsSCH_ITEM() const
Definition view_item.h:101
void Clear()
Remove all items from the view.
Definition view.cpp:1143
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition view.cpp:1561
Definition kiid.h:49
Carry a payload from one KIWAY_PLAYER to another within a PROJECT.
std::string & GetPayload()
Return the payload, which can be any text but it typically self identifying s-expression.
MAIL_T Command()
Returns the MAIL_T associated with this mail.
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:294
void OnKiCadExit()
Definition kiway.cpp:761
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
Definition kiway.cpp:403
virtual void ExpressMail(FRAME_T aDestination, MAIL_T aCommand, std::string &aPayload, wxWindow *aSource=nullptr, bool aFromOtherThread=false)
Send aPayload to aDestination from aSource.
Definition kiway.cpp:507
Module editor specific tools.
std::optional< LIBRARY_TABLE_ROW * > FindRowByURI(const wxString &aUri, LIBRARY_TABLE_SCOPE aScope=LIBRARY_TABLE_SCOPE::BOTH) const
Like LIBRARY_MANAGER::FindRowByURI but filtered to the LIBRARY_TABLE_TYPE of this adapter.
bool HasLibrary(const wxString &aNickname, bool aCheckEnabled=false) const
Test for the existence of aNickname in the library tables.
std::optional< LIBRARY_TABLE_ROW * > GetRow(const wxString &aNickname, LIBRARY_TABLE_SCOPE aScope=LIBRARY_TABLE_SCOPE::BOTH) const
Like LIBRARY_MANAGER::GetRow but filtered to the LIBRARY_TABLE_TYPE of this adapter.
void ReloadTables(LIBRARY_TABLE_SCOPE aScope, std::initializer_list< LIBRARY_TABLE_TYPE > aTablesToLoad={})
std::optional< LIBRARY_TABLE * > Table(LIBRARY_TABLE_TYPE aType, LIBRARY_TABLE_SCOPE aScope)
Retrieves a given table; creating a new empty project table if a valid project is loaded and the give...
std::optional< wxString > GetFullURI(LIBRARY_TABLE_TYPE aType, const wxString &aNickname, bool aSubstituted=false) const
Return the full location specifying URI for the LIB, either in original UI form or in environment var...
void SetNickname(const wxString &aNickname)
void SetType(const wxString &aType)
void SetURI(const wxString &aUri)
A logical library item identifier and consists of various portions much like a URI.
Definition lib_id.h:49
int SetLibItemName(const UTF8 &aLibItemName)
Override the library item name portion of the LIB_ID to aLibItemName.
Definition lib_id.cpp:111
bool IsValid() const
Check if this LID_ID is valid.
Definition lib_id.h:172
const UTF8 & GetLibItemName() const
Definition lib_id.h:102
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Definition lib_id.h:87
Symbol library management helper that is specific to the symbol library editor frame.
Define a library symbol object.
Definition lib_symbol.h:83
const LIB_ID & GetLibId() const override
Definition lib_symbol.h:153
bool UnitsLocked() const
Check whether symbol units are interchangeable.
Definition lib_symbol.h:288
bool IsRoot() const override
For symbols derived from other symbols, IsRoot() indicates no derivation.
Definition lib_symbol.h:203
wxString GetName() const override
Definition lib_symbol.h:146
bool IsMultiUnit() const override
Definition lib_symbol.h:757
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
Node type: LIB_ID.
void Update(LIB_TREE_ITEM *aItem)
Update the node using data from a LIB_ALIAS object.
void RefreshLibTree()
Refresh the tree (mainly to update highlighting and asterisking)
Definition lib_tree.cpp:472
void CenterLibId(const LIB_ID &aLibId)
Ensure that an item is visible (preferably centered).
Definition lib_tree.cpp:381
int GetSelectionCount() const
Definition lib_tree.h:90
void ShutdownPreviews()
Definition lib_tree.cpp:287
void ShowChangedLanguage()
Definition lib_tree.cpp:304
void FocusSearchFieldIfExists()
Focus the search widget if it exists.
Definition lib_tree.cpp:487
void SelectLibId(const LIB_ID &aLibId)
Select an item in the tree widget.
Definition lib_tree.cpp:375
LIB_TREE_MODEL_ADAPTER::SORT_MODE GetSortMode() const
Definition lib_tree.h:154
int GetSelectedLibIds(std::vector< LIB_ID > &aSelection, std::vector< int > *aUnit=nullptr) const
Retrieve a list of selections for trees that allow multi-selection.
Definition lib_tree.cpp:334
void Unselect()
Unselect currently selected item in wxDataViewCtrl.
Definition lib_tree.cpp:387
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:314
void ExpandLibId(const LIB_ID &aLibId)
Expand and item i the tree widget.
Definition lib_tree.cpp:395
void Regenerate(bool aKeepState)
Regenerate the tree.
Definition lib_tree.cpp:454
virtual ENV_VAR_MAP & GetLocalEnvVariables() const
Definition pgm_base.cpp:793
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition pgm_base.h:132
virtual LIBRARY_MANAGER & GetLibraryManager() const
Definition pgm_base.h:134
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...
static SYMBOL_LIBRARY_ADAPTER * SymbolLibAdapter(PROJECT *aProject)
Accessor for project symbol library manager adapter.
@ SCH_LIBEDIT_CUR_LIB
Definition project.h:217
@ SCH_LIBEDIT_CUR_SYMBOL
Definition project.h:218
virtual const wxString GetProjectPath() const
Return the full path of the project.
Definition project.cpp:167
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:339
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:350
Action handler for the Properties panel.
Gather all the actions that are shared by tools.
Definition sch_actions.h:40
static TOOL_ACTION rotateCCW
static TOOL_ACTION importSymbol
static TOOL_ACTION newSymbol
static TOOL_ACTION saveLibraryAs
static TOOL_ACTION mirrorV
static TOOL_ACTION editLibSymbolWithLibEdit
static TOOL_ACTION drawArc
Definition sch_actions.h:97
static TOOL_ACTION pinTable
static TOOL_ACTION drawSymbolLines
static TOOL_ACTION placeSymbolPin
static TOOL_ACTION drawSymbolTextBox
static TOOL_ACTION drawRectangle
Definition sch_actions.h:95
static TOOL_ACTION drawCircle
Definition sch_actions.h:96
static TOOL_ACTION importGraphics
static TOOL_ACTION drawBezier
Definition sch_actions.h:98
static TOOL_ACTION saveSymbolCopyAs
static TOOL_ACTION rotateCW
static TOOL_ACTION showElectricalTypes
static TOOL_ACTION drawSymbolPolygon
static TOOL_ACTION showHiddenFields
static TOOL_ACTION placeSymbolAnchor
static TOOL_ACTION showHiddenPins
static TOOL_ACTION cycleBodyStyle
static TOOL_ACTION mirrorH
static TOOL_ACTION runERC
Inspection and Editing.
static TOOL_ACTION symbolProperties
static TOOL_ACTION placeSymbolText
static TOOL_ACTION toggleSyncedPinsMode
static TOOL_ACTION togglePinAltIcons
static TOOL_ACTION updateSymbolFields
static TOOL_ACTION saveSymbolAs
A shim class between EDA_DRAW_FRAME and several derived classes: SYMBOL_EDIT_FRAME,...
SCH_BASE_FRAME(KIWAY *aKiway, wxWindow *aParent, FRAME_T aWindowType, const wxString &aTitle, const wxPoint &aPosition, const wxSize &aSize, long aStyle, const wxString &aFrameName)
SCH_RENDER_SETTINGS * GetRenderSettings()
void doCloseWindow() override
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.
void CommonSettingsChanged(int aFlags) override
Notification event that some of the common (suite-wide) settings have changed.
void SyncView()
Mark all items for refresh.
PANEL_SCH_SELECTION_FILTER * m_selectionFilterPanel
virtual void UpdateItem(EDA_ITEM *aItem, bool isAddOrDelete=false, bool aUpdateRtree=false)
Mark an item for refresh.
void setSymWatcher(const LIB_ID *aSymbol)
Creates (or removes) a watcher on the specified symbol library.
KIGFX::SCH_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
void DisplaySymbol(LIB_SYMBOL *aSymbol)
Schematic editor (Eeschema) main window.
void SaveSymbolToSchematic(const LIB_SYMBOL &aSymbol, const KIID &aSchematicSymbolUUID)
Update a schematic symbol from a LIB_SYMBOL.
void SetPosition(const VECTOR2I &aPosition) override
Handle actions specific to the schematic editor.
static const wxString ShowType(SCH_FILE_T aFileType)
Return a brief name for a plugin, given aFileType enum.
static SCH_FILE_T GuessPluginTypeFromLibPath(const wxString &aLibPath, int aCtl=0)
Return a plugin type given a symbol library using the file extension of aLibPath.
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition sch_item.h:167
int GetBodyStyle() const
Definition sch_item.h:247
int GetUnit() const
Definition sch_item.h:238
Tool that displays edit points allowing to modify items by dragging the points.
SCH_SELECTION & GetSelection()
SCH_SELECTION_FILTER_OPTIONS & GetFilter()
Schematic symbol object.
Definition sch_symbol.h:76
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) const override
Populate a std::vector with SCH_FIELDs, sorted in ordinal order.
VECTOR2I GetPosition() const override
Definition sch_symbol.h:854
const LIB_ID & GetLibId() const override
Definition sch_symbol.h:165
int GetOrientation() const override
Get the display symbol orientation.
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
Definition sch_symbol.h:184
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).
Handle actions for the various symbol editor and viewers.
bool m_ShowPinAltIcons
When true, dragging an outline edge will drag pins rooted on it.
The symbol library editor main window.
void OnExitKiCad(wxCommandEvent &event)
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
std::unique_ptr< GRID_HELPER > MakeGridHelper() override
void UpdateItem(EDA_ITEM *aItem, bool isAddOrDelete=false, bool aUpdateRtree=false) override
Mark an item for refresh.
void setupUIConditions() override
Setup the UI conditions for the various actions and their controls in this frame.
APP_SETTINGS_BASE * config() const override
Return the settings object used in SaveSettings(), and is overloaded in KICAD_MANAGER_FRAME.
void storeCurrentSymbol()
Rename LIB_SYMBOL aliases to avoid conflicts before adding a symbol to a library.
bool IsLibraryTreeShown() const override
const BOX2I GetDocumentExtents(bool aIncludeAllVisible=true) const override
Return bounding box of document with option to not include some items.
SELECTION & GetCurrentSelection() override
Get the current selection from the canvas area.
wxString getTargetLib() const
bool IsCurrentSymbol(const LIB_ID &aLibId) const
Restore the empty editor screen, without any symbol or library selected.
void OnSelectBodyStyle(wxCommandEvent &event)
bool backupFile(const wxFileName &aOriginalFile, const wxString &aBackupExt)
Return currently edited symbol.
void RefreshLibraryTree()
Redisplay the library tree.
void updateSelectionFilterVisbility() override
Selection filter panel doesn't have a dedicated visibility control, so show it if any other AUI panel...
void CommonSettingsChanged(int aFlags) override
Called after the preferences dialog is run.
void FocusLibraryTreeInput() override
wxComboBox * m_unitSelectBox
void RebuildSymbolUnitAndBodyStyleLists()
int GetTreeLIBIDs(std::vector< LIB_ID > &aSelection) const
LIB_ID GetTreeLIBID(int *aUnit=nullptr) const
Return the LIB_ID of the library or symbol selected in the symbol tree.
LIB_SYMBOL_LIBRARY_MANAGER * m_libMgr
wxString GetCurLib() const
The nickname of the current library being edited and empty string if none.
void FocusOnLibId(const LIB_ID &aLibID)
bool IsSymbolAlias() const
Return true if aLibId is an alias for the editor screen symbol.
void ToggleProperties() override
SYMBOL_EDITOR_SETTINGS * m_settings
void HardRedraw() override
Rebuild the GAL and redraw the screen.
bool m_SyncPinEdit
Set to true to synchronize pins at the same position when editing symbols with multiple units or mult...
int GetTreeSelectionCount() const
bool addLibTableEntry(const wxString &aLibFile, LIBRARY_TABLE_SCOPE aScope=LIBRARY_TABLE_SCOPE::GLOBAL)
Add aLibFile to the symbol library table defined by aScope.
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 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)
SYMBOL_EDIT_FRAME(KIWAY *aKiway, wxWindow *aParent)
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...
void SetBodyStyle(int aBodyStyle)
int m_bodyStyle
Flag if the symbol being edited was loaded directly from a schematic.
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.
LIB_TREE * GetLibTree() const override
wxString SetCurLib(const wxString &aLibNickname)
Set the current library nickname and returns the old library nickname.
void UpdateTitle()
Update the main window title bar with the current library name and read only status of the library.
bool LoadSymbolFromCurrentLib(const wxString &aSymbolName, int aUnit=0, int aBodyStyle=0)
Load a symbol from the current active library, optionally setting the selected unit and convert.
bool HasLibModifications() const
Check if any pending libraries have been modified.
SYMBOL_TREE_PANE * m_treePane
void LoadSymbolFromSchematic(SCH_SYMBOL *aSymbol)
Load a symbol from the schematic to edit in place.
COLOR_SETTINGS * GetColorSettings(bool aForceRefresh=false) const override
Returns a pointer to the active color theme settings.
LIB_SYMBOL_LIBRARY_MANAGER & GetLibManager()
void OnUpdateBodyStyle(wxUpdateUIEvent &event)
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 FocusOnItem(EDA_ITEM *aItem, bool aAllowScroll=true) override
Focus on a particular canvas item.
void configureToolbars() override
void CloseWindow(wxCommandEvent &event)
Trigger the wxCloseEvent, which is handled by the function given to EVT_CLOSE() macro:
wxComboBox * m_bodyStyleSelectBox
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 ShowChangedLanguage() override
Redraw the menus and what not in current language.
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)
An interface to the global shared library manager that is schematic-specific and linked to one projec...
std::optional< LIB_STATUS > LoadOne(LIB_DATA *aLib) override
Loads or reloads the given library, if it exists.
Library Editor pane with symbol tree and symbol library table selector.
TOOL_MANAGER * m_toolManager
TOOL_DISPATCHER * m_toolDispatcher
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
ACTIONS * m_actions
@ 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:
bool RunAction(const std::string &aActionName, T aParam)
Run the specified action immediately, pausing the current action to run the new one.
A holder to handle a list of undo (or redo) commands.
bool empty() const
Definition utf8.h:109
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.
void AddButton(wxButton *aButton)
Add an already created button to the infobar.
void Dismiss() override
Dismisses the infobar and updates the containing layout and AUI manager (if one is provided).
void ShowMessage(const wxString &aMessage, int aFlags=wxICON_INFORMATION) override
Show the info bar with the provided message and icon.
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition confirm.cpp:202
int UnsavedChangesDialog(wxWindow *parent, const wxString &aMessage, bool *aApplyToAll)
A specialized version of HandleUnsavedChanges which handles an apply-to-all checkbox.
Definition confirm.cpp:64
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
Definition confirm.cpp:177
This file is part of the common library.
#define CHECK(x)
#define ENABLE(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:65
@ ID_LIBEDIT_SELECT_BODY_STYLE
Definition eeschema_id.h:66
const wxAuiPaneInfo & defaultSchSelectionFilterPaneInfo(wxWindow *aWindow)
const wxAuiPaneInfo & defaultPropertiesPaneInfo(wxWindow *aWindow)
wxString NormalizePath(const wxFileName &aFilePath, const ENV_VAR_MAP *aEnvVars, const wxString &aProjectPath)
Normalize a file path to an environmental variable, if possible.
Definition env_paths.cpp:73
Helper functions to substitute paths with environmental variables.
@ FRAME_SCH_SYMBOL_EDITOR
Definition frame_type.h:35
@ FRAME_SCH
Definition frame_type.h:34
static const std::string SymbolLibraryTableFileName
static const std::string KiCadSymbolLibFileExtension
static wxString KiCadSymbolLibFileWildcard()
const wxChar *const traceLibWatch
Flag to enable debug output for library file watch refreshes.
@ ID_ON_GRID_SELECT
Definition id.h:113
@ ID_ON_ZOOM_SELECT
Definition id.h:112
std::map< wxString, ENV_VAR_ITEM > ENV_VAR_MAP
PROJECT & Prj()
Definition kicad.cpp:637
KIID niluuid(0)
@ LAYER_SCHEMATIC_GRID_AXES
Definition layer_ids.h:487
LIBRARY_TABLE_SCOPE
@ MAIL_LIB_EDIT
Definition mail_type.h:55
@ MAIL_REFRESH_SYMBOL
Definition mail_type.h:59
@ MAIL_RELOAD_LIB
Definition mail_type.h:57
@ ALL
All except INITIAL_ADD.
Definition view_item.h:59
void SetShutdownBlockReason(wxWindow *aWindow, const wxString &aReason)
Sets the block reason why the window/application is preventing OS shutdown.
Definition unix/app.cpp:90
bool SupportsShutdownBlockReason()
Whether or not the window supports setting a shutdown block reason.
Definition unix/app.cpp:79
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
Definition kicad_algo.h:100
#define _HKI(x)
Definition page_info.cpp:44
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.
see class PGM_BASE
#define DEFAULT_THEME
COLOR_SETTINGS * GetColorSettings(const wxString &aName)
T * GetToolbarSettings(const wxString &aFilename)
T * GetAppSettings(const char *aFilename)
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 ...
wxString message
@ SYM_ORIENT_270
Definition symbol.h:42
@ SYM_MIRROR_Y
Definition symbol.h:44
@ SYM_ORIENT_180
Definition symbol.h:41
@ SYM_MIRROR_X
Definition symbol.h:43
@ SYM_ORIENT_90
Definition symbol.h:40
#define EDIT_TOOL(tool)
#define DEMORGAN_ALT
#define DEMORGAN_STD
KIBIS_PIN * pin
#define ENVVARS_CHANGED
wxLogTrace helper definitions.
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:695
VECTOR2< double > VECTOR2D
Definition vector2d.h:694
Definition of file extensions used in Kicad.
void SetAuiPaneSize(wxAuiManager &aManager, wxAuiPaneInfo &aPane, int aWidth, int aHeight)
Sets the size of an AUI pane, working around http://trac.wxwidgets.org/ticket/13180.