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 <core/throttle.h>
32#include <eeschema_id.h>
33#include <eeschema_settings.h>
34#include <env_paths.h>
36#include <kidialog.h>
37#include <kiface_base.h>
38#include <kiplatform/app.h>
39#include <kiway_mail.h>
40#include <symbol_edit_frame.h>
43#include <paths.h>
44#include <pgm_base.h>
45#include <project_sch.h>
46#include <sch_painter.h>
47#include <sch_view.h>
51#include <tool/action_manager.h>
52#include <tool/action_toolbar.h>
53#include <tool/common_control.h>
54#include <tool/common_tools.h>
56#include <tool/embed_tool.h>
58#include <tool/picker_tool.h>
60#include <tool/selection.h>
62#include <tool/tool_manager.h>
63#include <tool/zoom_tool.h>
64#include <tools/sch_actions.h>
75#include <view/view_controls.h>
77#include <widgets/wx_infobar.h>
81#include <widgets/lib_tree.h>
86#include <panel_sym_lib_table.h>
87#include <string_utils.h>
89#include <wx/msgdlg.h>
90#include <wx/combobox.h>
91#include <wx/log.h>
92#include <trace_helpers.h>
93
94
96
97
98BEGIN_EVENT_TABLE( SYMBOL_EDIT_FRAME, SCH_BASE_FRAME )
101
102 // menubar commands
103 EVT_MENU( wxID_EXIT, SYMBOL_EDIT_FRAME::OnExitKiCad )
104 EVT_MENU( wxID_CLOSE, SYMBOL_EDIT_FRAME::CloseWindow )
105
106 // Update user interface elements.
109
112
113 // Drop files event
114 EVT_DROP_FILES( SYMBOL_EDIT_FRAME::OnDropFiles )
115
116END_EVENT_TABLE()
117
118
119SYMBOL_EDIT_FRAME::SYMBOL_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
120 SCH_BASE_FRAME( aKiway, aParent, FRAME_SCH_SYMBOL_EDITOR, _( "Library Editor" ),
121 wxDefaultPosition, wxDefaultSize, KICAD_DEFAULT_DRAWFRAME_STYLE,
123 m_unitSelectBox( nullptr ),
124 m_bodyStyleSelectBox( nullptr ),
126{
127 m_SyncPinEdit = false;
128
129 m_symbol = nullptr;
130 m_treePane = nullptr;
131 m_libMgr = nullptr;
132 m_unit = 1;
133 m_bodyStyle = 1;
135 m_aboutTitle = _HKI( "KiCad Symbol Editor" );
136
137 wxIcon icon;
138 wxIconBundle icon_bundle;
139
140 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit, 48 ) );
141 icon_bundle.AddIcon( icon );
142 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit, 256 ) );
143 icon_bundle.AddIcon( icon );
144 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit, 128 ) );
145 icon_bundle.AddIcon( icon );
146 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit_32 ) );
147 icon_bundle.AddIcon( icon );
148 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit_16 ) );
149 icon_bundle.AddIcon( icon );
150
151 SetIcons( icon_bundle );
152
155
157
158 m_treePane = new SYMBOL_TREE_PANE( this, m_libMgr );
159 m_treePane->GetLibTree()->SetSortMode( (LIB_TREE_MODEL_ADAPTER::SORT_MODE) m_settings->m_LibrarySortMode );
160
163
164 // Ensure axis are always drawn
166 gal_opts.m_axesEnabled = true;
167
170 GetScreen()->m_Center = true;
171
172 GetCanvas()->GetViewControls()->SetCrossHairCursorPosition( VECTOR2D( 0, 0 ), false );
173
174 GetRenderSettings()->LoadColors( GetColorSettings() );
175 GetRenderSettings()->m_IsSymbolEditor = true;
176 GetCanvas()->GetGAL()->SetAxesColor( m_colorSettings->GetColor( LAYER_SCHEMATIC_GRID_AXES ) );
177
178 setupTools();
180
182
186
187 UpdateTitle();
190
191 m_propertiesPanel = new SCH_PROPERTIES_PANEL( this, this );
192 m_propertiesPanel->SetSplitterProportion( m_settings->m_AuiPanels.properties_splitter );
193
195
196 m_auimgr.SetManagedWindow( this );
197
199
200 // Rows; layers 4 - 6
201 m_auimgr.AddPane( m_tbTopMain, EDA_PANE().HToolbar().Name( "TopMainToolbar" )
202 .Top().Layer( 6 ) );
203
204 m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( "MsgPanel" )
205 .Bottom().Layer( 6 ) );
206
207 m_auimgr.AddPane( m_tbLeft, EDA_PANE().VToolbar().Name( "LeftToolbar" )
208 .Left().Layer( 2 ) );
209
210 m_auimgr.AddPane( m_tbRight, EDA_PANE().VToolbar().Name( "RightToolbar" )
211 .Right().Layer( 2 ) );
212
213 // Center
214 m_auimgr.AddPane( GetCanvas(), wxAuiPaneInfo().Name( "DrawFrame" )
215 .CentrePane() );
216
217 // Columns; layers 1 - 3
218 m_auimgr.AddPane( m_treePane, EDA_PANE().Palette().Name( "LibraryTree" )
219 .Left().Layer( 3 )
220 .TopDockable( false ).BottomDockable( false )
221 .Caption( _( "Libraries" ) )
222 // Don't use -1 for don't-change-height on a growable panel; it has side-effects.
223 .MinSize( FromDIP( 250 ), FromDIP( 80 ) )
224 .BestSize( FromDIP( 250 ), -1 ) );
225
228
229 // Can be called only when all panes are created, because (at least on Windows) when items
230 // managed by m_auimgr are not the same as those existing when saved by Perspective()
231 // in config, broken settings can happen.
233
234 // Protect against broken saved Perspective() due to bugs in previous version
235 // This is currently a workaround.
236 m_auimgr.GetPane( "TopMainToolbar" ).Top().Layer( 6 ).Position(0).Show( true );
237 m_auimgr.GetPane( "LeftToolbar" ).Position(0).Show( true );
238 m_auimgr.GetPane( "RightToolbar" ).Show( true );
239
240 // Show or hide m_propertiesPanel depending on current settings:
241 wxAuiPaneInfo& propertiesPaneInfo = m_auimgr.GetPane( PropertiesPaneName() );
242 wxAuiPaneInfo& selectionFilterPane = m_auimgr.GetPane( wxS( "SelectionFilter" ) );
243 // The selection filter doesn't need to grow in the vertical direction when docked
244 selectionFilterPane.dock_proportion = 0;
245
246 propertiesPaneInfo.Show( m_settings->m_AuiPanels.show_properties );
248
250
251 // Can't put this in LoadSettings, because it has to be called before setupTools :/
253 selTool->GetFilter() = GetSettings()->m_SelectionFilter;
254 m_selectionFilterPanel->SetCheckboxesFromFilter( selTool->GetFilter() );
255
256 if( m_settings->m_LibWidth > 0 )
257 SetAuiPaneSize( m_auimgr, m_auimgr.GetPane( "LibraryTree" ), m_settings->m_LibWidth, -1 );
258
259 Raise();
260 Show( true );
261
262 SyncView();
263 GetCanvas()->GetView()->UseDrawPriority( true );
264 GetCanvas()->GetGAL()->SetAxesEnabled( true );
265
267
268 // Set the working/draw area size to display a symbol to a reasonable value:
269 // A 600mm x 600mm with a origin at the area center looks like a large working area
270 double max_size_x = schIUScale.mmToIU( 600 );
271 double max_size_y = schIUScale.mmToIU( 600 );
272 BOX2D bbox;
273 bbox.SetOrigin( -max_size_x /2, -max_size_y/2 );
274 bbox.SetSize( max_size_x, max_size_y );
275 GetCanvas()->GetView()->SetBoundary( bbox );
276
278
280 DragAcceptFiles( true );
281
282 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "Library changes are unsaved" ) );
283
284 // Catch unhandled accelerator command characters that were no handled by the library tree
285 // panel.
287 Bind( wxEVT_CHAR_HOOK, &TOOL_DISPATCHER::DispatchWxEvent, m_toolDispatcher );
288
289 // Ensure the window is on top
290 Raise();
291
292 // run SyncLibraries with progress reporter enabled. The progress reporter is useful
293 // in debug mode because the loading time of ecah library can be really noticeable
294 SyncLibraries( true );
295}
296
297
299{
300 // Shutdown all running tools
301 if( m_toolManager )
302 m_toolManager->ShutdownAllTools();
303
304 setSymWatcher( nullptr );
305
307 {
308 delete m_symbol;
309 m_symbol = nullptr;
310
311 SCH_SCREEN* screen = GetScreen();
312 delete screen;
314 }
315
316 // current screen is destroyed in EDA_DRAW_FRAME
318
320 Pgm().GetSettingsManager().Save( cfg );
321
322 delete m_libMgr;
323}
324
325
327{
328 wxCHECK_RET( m_settings, "Call to SYMBOL_EDIT_FRAME::LoadSettings with null m_settings" );
329
331
332 GetRenderSettings()->m_ShowPinsElectricalType = m_settings->m_ShowPinElectricalType;
333 GetRenderSettings()->m_ShowHiddenPins = m_settings->m_ShowHiddenPins;
334 GetRenderSettings()->m_ShowHiddenFields = m_settings->m_ShowHiddenFields;
335 GetRenderSettings()->m_ShowPinAltIcons = m_settings->m_ShowPinAltIcons;
336 GetRenderSettings()->SetDefaultFont( wxEmptyString );
337}
338
339
341{
342 wxCHECK_RET( m_settings, "Call to SYMBOL_EDIT_FRAME:SaveSettings with null m_settings" );
343
345
347
348 m_settings->m_ShowPinElectricalType = GetRenderSettings()->m_ShowPinsElectricalType;
349 m_settings->m_ShowHiddenPins = GetRenderSettings()->m_ShowHiddenPins;
350 m_settings->m_ShowHiddenFields = GetRenderSettings()->m_ShowHiddenFields;
351 m_settings->m_ShowPinAltIcons = GetRenderSettings()->m_ShowPinAltIcons;
352
353 m_settings->m_LibWidth = m_treePane->GetSize().x;
354
355 m_settings->m_LibrarySortMode = GetLibTree()->GetSortMode();
356
357 m_settings->m_AuiPanels.properties_splitter = m_propertiesPanel->SplitterProportion();
358 bool prop_shown = m_auimgr.GetPane( PropertiesPaneName() ).IsShown();
359 m_settings->m_AuiPanels.show_properties = prop_shown;
360
361 if( TOOL_MANAGER* toolMgr = GetToolManager() )
362 {
363 if( SCH_SELECTION_TOOL* selTool = toolMgr->GetTool<SCH_SELECTION_TOOL>() )
364 m_settings->m_SelectionFilter = selTool->GetFilter();
365 }
366}
367
368
370{
371 return static_cast<APP_SETTINGS_BASE*>( GetSettings() );
372}
373
374
376{
378
379 if( cfg && static_cast<SYMBOL_EDITOR_SETTINGS*>( cfg )->m_UseEeschemaColorSettings )
380 cfg = GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
381
382 return ::GetColorSettings( cfg ? cfg->m_ColorTheme : DEFAULT_THEME );
383}
384
385
387{
388 // Create the manager and dispatcher & route draw panel events to the dispatcher
390 m_toolManager->SetEnvironment( GetScreen(), GetCanvas()->GetView(),
391 GetCanvas()->GetViewControls(), GetSettings(), this );
392 m_actions = new SCH_ACTIONS();
394
395 // Register tools
396 m_toolManager->RegisterTool( new COMMON_CONTROL );
397 m_toolManager->RegisterTool( new COMMON_TOOLS );
398 m_toolManager->RegisterTool( new ZOOM_TOOL );
399 m_toolManager->RegisterTool( new SCH_SELECTION_TOOL );
400 m_toolManager->RegisterTool( new PICKER_TOOL );
401 m_toolManager->RegisterTool( new SCH_INSPECTION_TOOL );
402 m_toolManager->RegisterTool( new SYMBOL_EDITOR_PIN_TOOL );
403 m_toolManager->RegisterTool( new SYMBOL_EDITOR_DRAWING_TOOLS );
404 m_toolManager->RegisterTool( new SCH_POINT_EDITOR );
405 m_toolManager->RegisterTool( new SCH_FIND_REPLACE_TOOL );
406 m_toolManager->RegisterTool( new SYMBOL_EDITOR_MOVE_TOOL );
407 m_toolManager->RegisterTool( new SYMBOL_EDITOR_EDIT_TOOL );
408 m_toolManager->RegisterTool( new LIBRARY_EDITOR_CONTROL );
409 m_toolManager->RegisterTool( new SYMBOL_EDITOR_CONTROL );
410 m_toolManager->RegisterTool( new PROPERTIES_TOOL );
411 m_toolManager->RegisterTool( new EMBED_TOOL );
412 m_toolManager->InitTools();
413
414 // Run the selection tool, it is supposed to be always active
415 m_toolManager->InvokeTool( "common.InteractiveSelection" );
416
418}
419
420
422{
424
425 ACTION_MANAGER* mgr = m_toolManager->GetActionManager();
426 EDITOR_CONDITIONS cond( this );
427
428 wxASSERT( mgr );
429
430#define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
431#define CHECK( x ) ACTION_CONDITIONS().Check( x )
432
433 auto haveSymbolCond =
434 [this]( const SELECTION& )
435 {
436 return m_symbol;
437 };
438
439 auto isEditableCond =
440 [this]( const SELECTION& )
441 {
442 // Only root symbols from the new s-expression libraries or the schematic
443 // are editable.
444 return IsSymbolEditable() && !IsSymbolAlias();
445 };
446
447 auto isEditableInAliasCond =
448 [this]( const SELECTION& )
449 {
450 // Less restrictive than isEditableCond
451 // Symbols fields (root symbols and aliases) from the new s-expression libraries
452 // or in the schematic are editable.
453 return IsSymbolEditable();
454 };
455
456 auto symbolModifiedCondition =
457 [this]( const SELECTION& sel )
458 {
459 return m_libMgr && m_libMgr->IsSymbolModified( GetTargetLibId().GetLibItemName(),
460 GetTargetLibId().GetLibNickname() );
461 };
462
463 auto libSelectedCondition =
464 [this]( const SELECTION& sel )
465 {
466 return !GetTargetLibId().GetLibNickname().empty();
467 };
468
469 auto canEditProperties =
470 [this]( const SELECTION& sel )
471 {
473 };
474
475 auto symbolSelectedInTreeCondition =
476 [this]( const SELECTION& sel )
477 {
478 LIB_ID targetLibId = GetTargetLibId();
479 return !targetLibId.GetLibNickname().empty() && !targetLibId.GetLibItemName().empty();
480 };
481
482 auto saveSymbolAsCondition =
483 [this]( const SELECTION& aSel )
484 {
485 return getTargetSymbol() != nullptr;
486 };
487
488 const auto isSymbolFromSchematicCond =
489 [this]( const SELECTION& )
490 {
491 return IsSymbolFromSchematic();
492 };
493
494 // clang-format off
497 mgr->SetConditions( SCH_ACTIONS::saveLibraryAs, ENABLE( libSelectedCondition ) );
498 mgr->SetConditions( SCH_ACTIONS::saveSymbolAs, ENABLE( saveSymbolAsCondition ) );
499 mgr->SetConditions( SCH_ACTIONS::saveSymbolCopyAs, ENABLE( saveSymbolAsCondition ) );
502 mgr->SetConditions( SCH_ACTIONS::editLibSymbolWithLibEdit, ENABLE( isSymbolFromSchematicCond ) );
503
504 mgr->SetConditions( ACTIONS::undo, ENABLE( haveSymbolCond && cond.UndoAvailable() ) );
505 mgr->SetConditions( ACTIONS::redo, ENABLE( haveSymbolCond && cond.RedoAvailable() ) );
506 mgr->SetConditions( ACTIONS::revert, ENABLE( symbolModifiedCondition ) );
507
510
511 mgr->SetConditions( ACTIONS::cut, ENABLE( isEditableCond ) );
512 mgr->SetConditions( ACTIONS::copy, ENABLE( haveSymbolCond ) );
513 mgr->SetConditions( ACTIONS::copyAsText, ENABLE( haveSymbolCond ) );
514 mgr->SetConditions( ACTIONS::paste, ENABLE( isEditableCond &&
516 mgr->SetConditions( ACTIONS::doDelete, ENABLE( isEditableCond ) );
517 mgr->SetConditions( ACTIONS::duplicate, ENABLE( isEditableCond ) );
518 mgr->SetConditions( ACTIONS::selectAll, ENABLE( haveSymbolCond ) );
519 mgr->SetConditions( ACTIONS::unselectAll, ENABLE( haveSymbolCond ) );
520
521 // These actions in symbol editor when editing alias field rotations are allowed.
522 mgr->SetConditions( SCH_ACTIONS::rotateCW, ENABLE( isEditableInAliasCond ) );
523 mgr->SetConditions( SCH_ACTIONS::rotateCCW, ENABLE( isEditableInAliasCond ) );
524
525 mgr->SetConditions( SCH_ACTIONS::mirrorH, ENABLE( isEditableCond ) );
526 mgr->SetConditions( SCH_ACTIONS::mirrorV, ENABLE( isEditableCond ) );
527
530 // clang-format on
531
532 auto pinTypeCond =
533 [this]( const SELECTION& )
534 {
536 };
537
538 auto hiddenPinCond =
539 [this]( const SELECTION& )
540 {
542 };
543
544 auto hiddenFieldCond =
545 [this]( const SELECTION& )
546 {
548 };
549
550 auto showPinAltIconsCond =
551 [this]( const SELECTION& )
552 {
554 };
555
556 auto showLibraryTreeCond =
557 [this]( const SELECTION& )
558 {
559 return IsLibraryTreeShown();
560 };
561
562 auto propertiesCond =
563 [this] ( const SELECTION& )
564 {
565 return m_auimgr.GetPane( PropertiesPaneName() ).IsShown();
566 };
567
570 mgr->SetConditions( ACTIONS::showLibraryTree, CHECK( showLibraryTreeCond ) );
571 mgr->SetConditions( ACTIONS::showProperties, CHECK( propertiesCond ) );
572 mgr->SetConditions( SCH_ACTIONS::showHiddenPins, CHECK( hiddenPinCond ) );
573 mgr->SetConditions( SCH_ACTIONS::showHiddenFields, CHECK( hiddenFieldCond ) );
574 mgr->SetConditions( SCH_ACTIONS::togglePinAltIcons, CHECK( showPinAltIconsCond ) );
575
576 auto multiUnitModeCond =
577 [this]( const SELECTION& )
578 {
579 return m_symbol && m_symbol->IsMultiUnit() && !m_symbol->UnitsLocked();
580 };
581
582 auto multiBodyStyleModeCond =
583 [this]( const SELECTION& )
584 {
585 return m_symbol && m_symbol->IsMultiBodyStyle();
586 };
587
588 auto syncedPinsModeCond =
589 [this]( const SELECTION& )
590 {
591 return m_SyncPinEdit;
592 };
593
594 auto haveDatasheetCond =
595 [this]( const SELECTION& )
596 {
597 return m_symbol && !m_symbol->GetDatasheetField().GetText().IsEmpty();
598 };
599
600 mgr->SetConditions( ACTIONS::showDatasheet, ENABLE( haveDatasheetCond ) );
601 mgr->SetConditions( SCH_ACTIONS::symbolProperties, ENABLE( symbolSelectedInTreeCondition || ( canEditProperties && haveSymbolCond ) ) );
602 mgr->SetConditions( SCH_ACTIONS::runERC, ENABLE( haveSymbolCond ) );
603 mgr->SetConditions( SCH_ACTIONS::pinTable, ENABLE( isEditableCond && haveSymbolCond ) );
604 mgr->SetConditions( SCH_ACTIONS::updateSymbolFields, ENABLE( isEditableCond && haveSymbolCond ) );
605 mgr->SetConditions( SCH_ACTIONS::cycleBodyStyle, ENABLE( multiBodyStyleModeCond ) );
606
607 mgr->SetConditions( SCH_ACTIONS::toggleSyncedPinsMode, ACTION_CONDITIONS().Enable( multiUnitModeCond ).Check( syncedPinsModeCond ) );
608
609// Only enable a tool if the symbol is edtable
610#define EDIT_TOOL( tool ) ACTION_CONDITIONS().Enable( isEditableCond ).Check( cond.CurrentTool( tool ) )
611
624
625#undef CHECK
626#undef ENABLE
627#undef EDIT_TOOL
628}
629
630
632{
633 if( IsContentModified() )
634 {
635 SCH_EDIT_FRAME* schframe = (SCH_EDIT_FRAME*) Kiway().Player( FRAME_SCH, false );
636 wxString msg = _( "Save changes to '%s' before closing?" );
637
638 switch( UnsavedChangesDialog( this, wxString::Format( msg, m_reference ), nullptr ) )
639 {
640 case wxID_YES:
641 if( schframe && GetCurSymbol() ) // Should be always the case
643
644 break;
645
646 case wxID_NO:
647 break;
648
649 default:
650 case wxID_CANCEL:
651 return false;
652 }
653 }
654
655 if( doClose )
656 {
657 SetCurSymbol( nullptr, false );
658 UpdateTitle();
659 }
660
661 return true;
662}
663
664
665bool SYMBOL_EDIT_FRAME::canCloseWindow( wxCloseEvent& aEvent )
666{
667 // Shutdown blocks must be determined and vetoed as early as possible
669 && aEvent.GetId() == wxEVT_QUERY_END_SESSION
670 && IsContentModified() )
671 {
672 return false;
673 }
674
676 return false;
677
678 if( !saveAllLibraries( true ) )
679 return false;
680
681 // Save symbol tree column widths
682 m_libMgr->GetAdapter()->SaveSettings();
683
684 return true;
685}
686
687
689{
691
692 if( GetLibTree() )
694
695 delete m_toolManager;
696 m_toolManager = nullptr;
697
698 Destroy();
699}
700
701
703{
704 if( m_unitSelectBox )
705 {
706 if( m_unitSelectBox->GetCount() != 0 )
707 m_unitSelectBox->Clear();
708
709 if( !m_symbol || m_symbol->GetUnitCount() <= 1 )
710 {
711 m_unit = 1;
712 m_unitSelectBox->Append( wxEmptyString );
713 }
714 else
715 {
716 for( int i = 0; i < m_symbol->GetUnitCount(); i++ )
717 m_unitSelectBox->Append( m_symbol->GetUnitDisplayName( i + 1, true ) );
718 }
719
720 // Ensure the selected unit is compatible with the number of units of the current symbol:
721 if( m_symbol && m_symbol->GetUnitCount() < m_unit )
722 m_unit = 1;
723
724 m_unitSelectBox->SetSelection( ( m_unit > 0 ) ? m_unit - 1 : 0 );
725 }
726
728 {
729 if( m_bodyStyleSelectBox->GetCount() != 0 )
730 m_bodyStyleSelectBox->Clear();
731
732 if( !m_symbol || !m_symbol->IsMultiBodyStyle() )
733 {
734 m_bodyStyle = 1;
735 m_bodyStyleSelectBox->Append( wxEmptyString );
736 }
737 else if( m_symbol && m_symbol->HasDeMorganBodyStyles() )
738 {
739 m_bodyStyleSelectBox->Append( wxGetTranslation( DEMORGAN_STD ) );
740 m_bodyStyleSelectBox->Append( wxGetTranslation( DEMORGAN_ALT ) );
741 }
742 else
743 {
744 for( int i = 0; i < m_symbol->GetBodyStyleCount(); i++ )
745 m_bodyStyleSelectBox->Append( m_symbol->GetBodyStyleNames()[i] );
746 }
747
748 // Ensure the selected body style is compatible with the number of body styles of the current symbol:
749 if( m_symbol && m_symbol->GetBodyStyleCount() < m_bodyStyle )
750 m_bodyStyle = 1;
751
752 m_bodyStyleSelectBox->SetSelection( ( m_bodyStyle > 0 ) ? m_bodyStyle - 1 : 0 );
753 }
754}
755
756
758{
759 if( !m_propertiesPanel )
760 return;
761
762 bool show = !m_propertiesPanel->IsShownOnScreen();
763
764 wxAuiPaneInfo& propertiesPaneInfo = m_auimgr.GetPane( PropertiesPaneName() );
765 propertiesPaneInfo.Show( show );
767
768 if( show )
769 {
770 SetAuiPaneSize( m_auimgr, propertiesPaneInfo,
771 m_settings->m_AuiPanels.properties_panel_width, -1 );
772 }
773 else
774 {
775 m_settings->m_AuiPanels.properties_panel_width = m_propertiesPanel->GetSize().x;
776 }
777
778 m_auimgr.Update();
779 Refresh();
780}
781
782
784{
785 wxAuiPaneInfo& treePane = m_auimgr.GetPane( m_treePane );
786 treePane.Show( !IsLibraryTreeShown() );
788 m_auimgr.Update();
789 Refresh();
790}
791
792
794{
795 return const_cast<wxAuiManager&>( m_auimgr ).GetPane( m_treePane ).IsShown();
796}
797
798
803
804
806{
807 m_treePane->Freeze();
808 m_libMgr->GetAdapter()->Freeze();
809}
810
811
813{
814 m_libMgr->GetAdapter()->Thaw();
815 m_treePane->Thaw();
816}
817
818
819void SYMBOL_EDIT_FRAME::OnExitKiCad( wxCommandEvent& event )
820{
821 Kiway().OnKiCadExit();
822}
823
824
825void SYMBOL_EDIT_FRAME::OnUpdateUnitNumber( wxUpdateUIEvent& event )
826{
827 event.Enable( m_symbol && m_symbol->GetUnitCount() > 1 );
828}
829
830
831void SYMBOL_EDIT_FRAME::OnSelectUnit( wxCommandEvent& event )
832{
833 if( event.GetSelection() == wxNOT_FOUND )
834 return;
835
836 SetUnit( event.GetSelection() + 1 );
837}
838
839
840void SYMBOL_EDIT_FRAME::OnUpdateBodyStyle( wxUpdateUIEvent& event )
841{
842 event.Enable( m_symbol && m_symbol->GetBodyStyleCount() > 1 );
843}
844
845
846void SYMBOL_EDIT_FRAME::OnSelectBodyStyle( wxCommandEvent& event )
847{
848 if( event.GetSelection() == wxNOT_FOUND )
849 return;
850
851 SetBodyStyle( event.GetSelection() + 1 );
852}
853
854
856{
857 if( m_symbol )
858 {
860
861 if( auto row = adapter->GetRow( m_symbol->GetLibNickname() ); row.has_value() )
862 {
863 if( ( *row )->Type() == SCH_IO_MGR::ShowType( SCH_IO_MGR::SCH_LEGACY ) )
864 return true;
865 }
866 }
867
868 return false;
869}
870
871
873{
874 wxString libNickname = Prj().GetRString( PROJECT::SCH_LIBEDIT_CUR_LIB );
875
876 if( !libNickname.empty() )
877 {
878 if( !PROJECT_SCH::SymbolLibAdapter( &Prj() )->HasLibrary( libNickname ) )
879 {
880 Prj().SetRString( PROJECT::SCH_LIBEDIT_CUR_LIB, wxEmptyString );
881 libNickname = wxEmptyString;
882 }
883 }
884
885 return libNickname;
886}
887
888
889wxString SYMBOL_EDIT_FRAME::SetCurLib( const wxString& aLibNickname )
890{
891 wxString old = GetCurLib();
892
893 if( aLibNickname.empty() || !PROJECT_SCH::SymbolLibAdapter( &Prj() )->HasLibrary( aLibNickname ) )
894 Prj().SetRString( PROJECT::SCH_LIBEDIT_CUR_LIB, wxEmptyString );
895 else
897
898 return old;
899}
900
901
902void SYMBOL_EDIT_FRAME::SetCurSymbol( LIB_SYMBOL* aSymbol, bool aUpdateZoom )
903{
904 wxCHECK( m_toolManager, /* void */ );
905
907 GetCanvas()->GetView()->Clear();
908 delete m_symbol;
909
910 m_symbol = aSymbol;
911
912 // select the current symbol in the tree widget
914 GetLibTree()->SelectLibId( m_symbol->GetLibId() );
915 else
916 GetLibTree()->Unselect();
917
918 wxString symbolName;
919 wxString libName;
920
921 if( m_symbol )
922 {
923 symbolName = m_symbol->GetName();
924 libName = UnescapeString( m_symbol->GetLibId().GetLibNickname() );
925 }
926
927 // retain in case this wxFrame is re-opened later on the same PROJECT
929
930 // Ensure synchronized pin edit can be enabled only symbols with interchangeable units
931 m_SyncPinEdit = aSymbol && aSymbol->IsRoot() && aSymbol->IsMultiUnit() && !aSymbol->UnitsLocked();
932
934
942
943 if( aUpdateZoom )
945
946 GetCanvas()->Refresh();
947 m_propertiesPanel->UpdateData();
948
949 WX_INFOBAR& infobar = *GetInfoBar();
950 infobar.RemoveAllButtons();
951
952 wxArrayString msgs;
953 int infobarFlags = wxICON_INFORMATION;
954
956 {
957 msgs.push_back( wxString::Format( _( "Editing symbol %s from schematic. Saving will "
958 "update the schematic only." ),
959 m_reference ) );
960
961 wxString link = wxString::Format( _( "Open symbol from library %s" ), libName );
962 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( &infobar, wxID_ANY, link, wxEmptyString );
963
964 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
965 [this, symbolName, libName]( wxHyperlinkEvent& aEvent )
966 {
968 } ) );
969
970 infobar.AddButton( button );
971 }
972 else if( IsSymbolFromLegacyLibrary() )
973 {
974 msgs.push_back( _( "Symbols in legacy libraries are not editable. Use Manage Symbol "
975 "Libraries to migrate to current format." ) );
976
977 wxString link = _( "Manage symbol libraries" );
978 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( &infobar, wxID_ANY, link, wxEmptyString );
979
980 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
981 [this]( wxHyperlinkEvent& aEvent )
982 {
984 } ) );
985
986 infobar.AddButton( button );
987 }
988 else if( IsSymbolAlias() )
989 {
990 msgs.push_back( wxString::Format( _( "Symbol %s is a derived symbol. Symbol graphics will "
991 "not be editable." ),
992 UnescapeString( symbolName ) ) );
993
994 // Don't assume the parent symbol shared pointer is still valid.
995 if( std::shared_ptr<LIB_SYMBOL> rootSymbol = m_symbol->GetRootSymbol() )
996 {
997 int unit = GetUnit();
998 int bodyStyle = GetBodyStyle();
999 wxString rootSymbolName = rootSymbol->GetName();
1000 wxString link = wxString::Format( _( "Open %s" ), UnescapeString( rootSymbolName ) );
1001
1002 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( &infobar, wxID_ANY, link,
1003 wxEmptyString );
1004
1005 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
1006 [this, rootSymbolName, unit, bodyStyle]( wxHyperlinkEvent& aEvent )
1007 {
1008 LoadSymbolFromCurrentLib( rootSymbolName, unit, bodyStyle );
1009 } ) );
1010
1011 infobar.AddButton( button );
1012 }
1013 }
1014
1015 if( m_symbol
1017 && m_libMgr->IsLibraryReadOnly( m_symbol->GetLibId().GetFullLibraryName() ) )
1018 {
1019 msgs.push_back( _( "Library is read-only. Changes cannot be saved to this library." ) );
1020
1021 wxString link = wxString::Format( _( "Create an editable copy" ) );
1022 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( &infobar, wxID_ANY, link, wxEmptyString );
1023
1024 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
1025 [this, symbolName, libName]( wxHyperlinkEvent& aEvent )
1026 {
1027 wxString msg = wxString::Format( _( "Create an editable copy of the symbol or "
1028 "the entire library (%s)?" ),
1029 libName );
1030
1031 KIDIALOG errorDlg( this, msg, _( "Select type of item to save" ),
1032 wxYES_NO | wxCANCEL | wxICON_QUESTION );
1033 // These buttons are in a weird order(?)
1034 errorDlg.SetYesNoCancelLabels( _( "Copy symbol" ), _( "Cancel" ),
1035 _( "Copy library" ) );
1036
1037 int choice = errorDlg.ShowModal();
1038
1039 switch( choice )
1040 {
1041 case wxID_YES:
1042 SaveSymbolCopyAs( true );
1043 break;
1044 case wxID_CANCEL:
1045 SaveLibraryAs();
1046 break;
1047 default:
1048 // Do nothing
1049 break;
1050 }
1051 } ) );
1052
1053 infobar.AddButton( button );
1054 }
1055
1056 if( msgs.empty() )
1057 {
1058 infobar.Dismiss();
1059 }
1060 else
1061 {
1062 wxString msg = wxJoin( msgs, '\n', '\0' );
1063 infobar.ShowMessage( msg, infobarFlags );
1064 }
1065}
1066
1067
1073
1074
1076{
1078
1080
1081 if( !IsSymbolFromSchematic() )
1083
1084 if( m_isClosing )
1085 return;
1086
1088
1089 if( !GetTitle().StartsWith( "*" ) )
1090 UpdateTitle();
1091}
1092
1093
1095{
1096 wxCHECK( aUnit > 0 && aUnit <= GetCurSymbol()->GetUnitCount(), /* void*/ );
1097
1098 if( m_unit == aUnit )
1099 return;
1100
1103
1104 m_unit = aUnit;
1105
1106 if( m_unitSelectBox->GetSelection() != ( m_unit - 1 ) )
1107 m_unitSelectBox->SetSelection( m_unit - 1 );
1108
1110 RebuildView();
1112}
1113
1114
1116{
1117 wxCHECK( aBodyStyle > 0 && aBodyStyle <= GetCurSymbol()->GetBodyStyleCount(), /* void */ );
1118
1119 if( m_bodyStyle == aBodyStyle )
1120 return;
1121
1124
1125 m_bodyStyle = aBodyStyle;
1126
1127 if( m_bodyStyleSelectBox->GetSelection() != ( m_bodyStyle - 1 ) )
1128 m_bodyStyleSelectBox->SetSelection( m_bodyStyle - 1 );
1129
1130
1132 RebuildView();
1134}
1135
1136
1138{
1139 return m_SyncPinEdit && m_symbol && m_symbol->IsMultiUnit() && !m_symbol->UnitsLocked();
1140}
1141
1142
1143wxString SYMBOL_EDIT_FRAME::AddLibraryFile( bool aCreateNew )
1144{
1145 wxFileName fn = m_libMgr->GetUniqueLibraryName();
1146 bool useGlobalTable = true;
1147 FILEDLG_HOOK_NEW_LIBRARY tableChooser( useGlobalTable );
1148
1149 if( !LibraryFileBrowser( aCreateNew ? _( "New Symbol Library" ) : _( "Add Symbol Library" ),
1150 !aCreateNew, fn, FILEEXT::KiCadSymbolLibFileWildcard(),
1152 Pgm().GetSettingsManager().IsProjectOpenNotDummy() ? &tableChooser : nullptr ) )
1153 {
1154 return wxEmptyString;
1155 }
1156
1159
1160 LIBRARY_MANAGER& manager = Pgm().GetLibraryManager();
1161 std::optional<LIBRARY_TABLE*> optTable = manager.Table( LIBRARY_TABLE_TYPE::SYMBOL, scope );
1162
1163 wxCHECK( optTable.has_value(), wxEmptyString );
1164 LIBRARY_TABLE* table = optTable.value();
1165
1166 wxString libName = fn.GetName();
1167
1168 if( libName.IsEmpty() )
1169 return wxEmptyString;
1170
1172
1173 if( adapter->HasLibrary( libName ) )
1174 {
1175 DisplayError( this, wxString::Format( _( "Library '%s' already exists." ), libName ) );
1176 return wxEmptyString;
1177 }
1178
1179 if( aCreateNew )
1180 {
1181 if( !m_libMgr->CreateLibrary( fn.GetFullPath(), scope ) )
1182 {
1183 DisplayError( this, wxString::Format( _( "Could not create the library file '%s'.\n"
1184 "Make sure you have write permissions and try again." ),
1185 fn.GetFullPath() ) );
1186 return wxEmptyString;
1187 }
1188 }
1189 else
1190 {
1191 if( !m_libMgr->AddLibrary( fn.GetFullPath(), scope ) )
1192 {
1193 DisplayError( this, _( "Could not open the library file." ) );
1194 return wxEmptyString;
1195 }
1196 }
1197
1198 bool success = true;
1199
1200 // Tables are reinitialized by m_libMgr->AddLibrary(). So reinit table reference.
1201 optTable = manager.Table( LIBRARY_TABLE_TYPE::SYMBOL, scope );
1202 wxCHECK( optTable.has_value(), wxEmptyString );
1203 table = optTable.value();
1204
1205 table->Save().map_error(
1206 [&]( const LIBRARY_ERROR& aError )
1207 {
1208 KICAD_MESSAGE_DIALOG dlg( this, _( "Error saving library table." ), _( "File Save Error" ),
1209 wxOK | wxICON_ERROR );
1210 dlg.SetExtendedMessage( aError.message );
1211 dlg.ShowModal();
1212
1213 success = false;
1214 } );
1215
1216 if( success )
1217 adapter->LoadOne( fn.GetName() );
1218
1219 std::string packet = fn.GetFullPath().ToStdString();
1222
1223 return fn.GetFullPath();
1224}
1225
1226
1227void SYMBOL_EDIT_FRAME::DdAddLibrary( wxString aLibFile )
1228{
1229 wxFileName fn = wxFileName( aLibFile );
1230 wxString libName = fn.GetName();
1231
1232 if( libName.IsEmpty() )
1233 return;
1234
1235 LIBRARY_MANAGER& manager = Pgm().GetLibraryManager();
1237
1238 if( adapter->HasLibrary( libName ) )
1239 {
1240 DisplayError( this, wxString::Format( _( "Library '%s' already exists." ), libName ) );
1241 return;
1242 }
1243
1244 if( !m_libMgr->AddLibrary( fn.GetFullPath(), LIBRARY_TABLE_SCOPE::PROJECT ) )
1245 {
1246 DisplayError( this, _( "Could not open the library file." ) );
1247 return;
1248 }
1249
1250 std::optional<LIBRARY_TABLE*> optTable = manager.Table( LIBRARY_TABLE_TYPE::SYMBOL, LIBRARY_TABLE_SCOPE::PROJECT );
1251 wxCHECK( optTable.has_value(), /* void */ );
1252 LIBRARY_TABLE* table = optTable.value();
1253 bool success = true;
1254
1255 table->Save().map_error(
1256 [&]( const LIBRARY_ERROR& aError )
1257 {
1258 KICAD_MESSAGE_DIALOG dlg( this, _( "Error saving library table." ), _( "File Save Error" ),
1259 wxOK | wxICON_ERROR );
1260 dlg.SetExtendedMessage( aError.message );
1261 dlg.ShowModal();
1262
1263 success = false;
1264 } );
1265
1266 if( success )
1267 adapter->LoadOne( libName );
1268
1269 std::string packet = fn.GetFullPath().ToStdString();
1272}
1273
1274
1276{
1277 return GetLibTree()->GetSelectedLibId( aUnit );
1278}
1279
1280
1285
1286int SYMBOL_EDIT_FRAME::GetTreeLIBIDs( std::vector<LIB_ID>& aSelection ) const
1287{
1288 return GetLibTree()->GetSelectedLibIds( aSelection );
1289}
1290
1291
1293{
1294 if( IsLibraryTreeShown() )
1295 {
1296 LIB_ID libId = GetTreeLIBID();
1297
1298 if( libId.IsValid() )
1299 return m_libMgr->GetSymbol( libId.GetLibItemName(), libId.GetLibNickname() );
1300 }
1301
1302 return m_symbol;
1303}
1304
1305
1307{
1308 LIB_ID id;
1309
1310 if( IsLibraryTreeShown() )
1311 id = GetTreeLIBID();
1312
1313 if( id.GetLibNickname().empty() && m_symbol )
1314 id = m_symbol->GetLibId();
1315
1316 return id;
1317}
1318
1319
1320std::vector<LIB_ID> SYMBOL_EDIT_FRAME::GetSelectedLibIds() const
1321{
1322 std::vector<LIB_ID> ids;
1323 GetTreeLIBIDs( ids );
1324 return ids;
1325}
1326
1327
1329{
1330 return GetTargetLibId().GetLibNickname();
1331}
1332
1333
1334void SYMBOL_EDIT_FRAME::SyncLibraries( bool aShowProgress, bool aPreloadCancelled,
1335 const wxString& aForceRefresh )
1336{
1337 // Prevent re-entrant calls. The progress dialog yields the event loop during Sync(),
1338 // which can dispatch queued UI events (e.g. menu clicks queued while the app was busy
1339 // loading libraries). A re-entrant call would corrupt the library tree mid-rebuild.
1341 return;
1342
1344
1345 LIB_ID selected;
1346
1347 if( m_treePane )
1348 selected = GetLibTree()->GetSelectedLibId();
1349
1350 // Ensure any in-progress background library preloading is complete before syncing the
1351 // tree. Without this, libraries still in LOADING state get skipped by Sync(), resulting
1352 // in an incomplete tree that requires a manual refresh to fully populate.
1354 adapter->BlockUntilLoaded();
1355
1356 if( aShowProgress )
1357 {
1358 APP_PROGRESS_DIALOG progressDlg( _( "Loading Symbol Libraries" ), wxEmptyString,
1359 m_libMgr->GetAdapter()->GetLibrariesCount(), this );
1360
1361 THROTTLE progressThrottle( std::chrono::milliseconds( 350 ) );
1362 int pendingProgress = 0;
1363 bool callbackFired = false;
1364 wxString pendingLibName;
1365
1366 m_libMgr->Sync( aForceRefresh,
1367 [&]( int progress, int max, const wxString& libName )
1368 {
1369 pendingProgress = progress;
1370 pendingLibName = libName;
1371 callbackFired = true;
1372
1373 if( progressThrottle.Ready() )
1374 progressDlg.Update( progress, wxString::Format( _( "Loading library '%s'..." ), libName ) );
1375 } );
1376
1377 if( callbackFired )
1378 progressDlg.Update( pendingProgress, wxString::Format( _( "Loading library '%s'..." ), pendingLibName ) );
1379 }
1380 else if( !aPreloadCancelled )
1381 {
1382 m_libMgr->Sync( aForceRefresh, [&]( int progress, int max, const wxString& libName ) {} );
1383 }
1384
1385 if( m_treePane )
1386 {
1387 wxDataViewItem found;
1388
1389 if( selected.IsValid() )
1390 {
1391 // Check if the previously selected item is still valid,
1392 // if not - it has to be unselected to prevent crash
1393 found = m_libMgr->GetAdapter()->FindItem( selected );
1394
1395 if( !found )
1396 GetLibTree()->Unselect();
1397 }
1398
1399 GetLibTree()->Regenerate( true );
1400
1401 // Try to select the parent library, in case the symbol is not found
1402 if( !found && selected.IsValid() )
1403 {
1404 selected.SetLibItemName( "" );
1405 found = m_libMgr->GetAdapter()->FindItem( selected );
1406
1407 if( found )
1408 GetLibTree()->SelectLibId( selected );
1409 }
1410
1411 // If no selection, see if there's a current symbol to centre
1412 if( !selected.IsValid() && m_symbol )
1413 {
1414 LIB_ID current( GetCurLib(), m_symbol->GetName() );
1415 GetLibTree()->CenterLibId( current );
1416 }
1417 }
1418
1420}
1421
1422
1427
1428
1430{
1431 GetLibTree()->SelectLibId( aLibID );
1432}
1433
1434
1435void SYMBOL_EDIT_FRAME::UpdateLibraryTree( const wxDataViewItem& aTreeItem, LIB_SYMBOL* aSymbol )
1436{
1437 if( aTreeItem.IsOk() ) // Can be not found in tree if the current footprint is imported
1438 // from file therefore not yet in tree.
1439 {
1440 static_cast<LIB_TREE_NODE_ITEM*>( aTreeItem.GetID() )->Update( aSymbol );
1442 }
1443}
1444
1445
1446bool SYMBOL_EDIT_FRAME::backupFile( const wxFileName& aOriginalFile, const wxString& aBackupExt )
1447{
1448 if( aOriginalFile.FileExists() )
1449 {
1450 wxFileName backupFileName( aOriginalFile );
1451 backupFileName.SetExt( aBackupExt );
1452
1453 if( backupFileName.FileExists() )
1454 wxRemoveFile( backupFileName.GetFullPath() );
1455
1456 if( !wxCopyFile( aOriginalFile.GetFullPath(), backupFileName.GetFullPath() ) )
1457 {
1458 DisplayError( this, wxString::Format( _( "Failed to save backup to '%s'." ),
1459 backupFileName.GetFullPath() ) );
1460 return false;
1461 }
1462 }
1463
1464 return true;
1465}
1466
1467
1469{
1470 if( m_symbol && !GetCurLib().IsEmpty() && GetScreen()->IsContentModified() )
1471 m_libMgr->UpdateSymbol( m_symbol, GetCurLib() ); // UpdateSymbol() makes a copy
1472}
1473
1474
1476{
1477 // This will return the root symbol of any alias
1478 LIB_SYMBOL* symbol = m_libMgr->GetBufferedSymbol( aLibId.GetLibItemName(), aLibId.GetLibNickname() );
1479
1480 // Now we can compare the libId of the current symbol and the root symbol
1481 return ( symbol && m_symbol && symbol->GetLibId() == m_symbol->GetLibId() );
1482}
1483
1484
1486{
1487 GetLibTree()->Unselect();
1488 SetCurLib( wxEmptyString );
1489 SetCurSymbol( nullptr, false );
1493 Refresh();
1494}
1495
1496
1498{
1500
1502 {
1503 GetRenderSettings()->m_ShowPinsElectricalType = cfg->m_ShowPinElectricalType;
1504 GetRenderSettings()->m_ShowHiddenPins = cfg->m_ShowHiddenPins;
1505 GetRenderSettings()->m_ShowHiddenFields = cfg->m_ShowHiddenFields;
1506 GetRenderSettings()->m_ShowPinAltIcons = cfg->m_ShowPinAltIcons;
1507
1508 GetGalDisplayOptions().ReadWindowSettings( cfg->m_Window );
1509 }
1510
1511 if( m_symbol )
1512 m_symbol->ClearCaches();
1513
1515
1517 GetCanvas()->Refresh();
1518
1520
1521 if( aFlags & ENVVARS_CHANGED )
1522 SyncLibraries( true );
1523
1524 Layout();
1525 SendSizeEvent();
1526}
1527
1528
1530{
1531 // call my base class
1533
1534 // tooltips in toolbars
1536
1537 // For some obscure reason, the AUI manager hides the first modified pane.
1538 // So force show panes
1539 wxAuiPaneInfo& tree_pane_info = m_auimgr.GetPane( m_treePane );
1540 bool tree_shown = tree_pane_info.IsShown();
1541 tree_pane_info.Caption( _( "Libraries" ) );
1542 tree_pane_info.Show( tree_shown );
1543 m_auimgr.Update();
1544
1546
1547 // status bar
1549
1550 if( GetRenderSettings()->m_ShowPinsElectricalType )
1551 {
1553 GetCanvas()->Refresh();
1554 }
1555
1556 UpdateTitle();
1557}
1558
1559
1561{
1562 SCH_BASE_FRAME::SetScreen( aScreen );
1563
1564 // Let tools add things to the view if necessary
1565 if( m_toolManager )
1567}
1568
1569
1587
1588
1590{
1591 SyncLibraries( true );
1592
1593 if( m_symbol )
1594 {
1595 SCH_SELECTION_TOOL* selectionTool = m_toolManager->GetTool<SCH_SELECTION_TOOL>();
1596 SCH_SELECTION& selection = selectionTool->GetSelection();
1597
1598 for( SCH_ITEM& item : m_symbol->GetDrawItems() )
1599 {
1600 if( !alg::contains( selection, &item ) )
1601 item.ClearSelected();
1602 else
1603 item.SetSelected();
1604 }
1605
1606 m_symbol->ClearCaches();
1607 }
1608
1609 RebuildView();
1610}
1611
1612
1613const BOX2I SYMBOL_EDIT_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
1614{
1615 if( !m_symbol )
1616 {
1617 // Gives a reasonable drawing area size
1618 int width = schIUScale.mmToIU( 50 );
1619 int height = schIUScale.mmToIU( 30 );
1620
1621 return BOX2I( VECTOR2I( -width/2, -height/2 ), VECTOR2I( width, height ) );
1622 }
1623 else
1624 {
1625 return m_symbol->Flatten()->GetUnitBoundingBox( m_unit, m_bodyStyle );
1626 }
1627}
1628
1629
1630void SYMBOL_EDIT_FRAME::FocusOnItem( EDA_ITEM* aItem, bool aAllowScroll )
1631{
1632 static KIID lastBrightenedItemID( niluuid );
1633
1634 SCH_ITEM* lastItem = nullptr;
1635
1636 // nullptr will clear the current focus
1637 if( aItem != nullptr && !aItem->IsSCH_ITEM() )
1638 return;
1639
1640 if( m_symbol )
1641 {
1642 for( SCH_PIN* pin : m_symbol->GetGraphicalPins( 0, 0 ) )
1643 {
1644 if( pin->m_Uuid == lastBrightenedItemID )
1645 lastItem = pin;
1646 }
1647
1648 std::vector<SCH_FIELD*> fields;
1649 m_symbol->GetFields( fields );
1650
1651 for( SCH_FIELD* field : fields )
1652 {
1653 if( field->m_Uuid == lastBrightenedItemID )
1654 lastItem = field;
1655 }
1656 }
1657
1658 if( lastItem && lastItem != aItem )
1659 {
1660 lastItem->ClearBrightened();
1661
1662 UpdateItem( lastItem );
1663 lastBrightenedItemID = niluuid;
1664 }
1665
1666 if( aItem )
1667 {
1668 if( aItem->IsSCH_ITEM() )
1669 {
1670 SCH_ITEM* item = static_cast<SCH_ITEM*>( aItem );
1671
1672 if( int unit = item->GetUnit() )
1673 SetUnit( unit );
1674
1675 if( int bodyStyle = item->GetBodyStyle() )
1676 SetBodyStyle( bodyStyle );
1677 }
1678
1679 if( !aItem->IsBrightened() )
1680 {
1681 aItem->SetBrightened();
1682
1683 UpdateItem( aItem );
1684 lastBrightenedItemID = aItem->m_Uuid;
1685 }
1686
1687 FocusOnLocation( VECTOR2I( aItem->GetFocusPosition().x, aItem->GetFocusPosition().y ), aAllowScroll );
1688 }
1689}
1690
1691
1693{
1694 const std::string& payload = mail.GetPayload();
1695
1696 switch( mail.Command() )
1697 {
1698 case MAIL_LIB_EDIT:
1699 if( !payload.empty() )
1700 {
1701 wxString uri( payload );
1702 wxString libNickname;
1703 wxString msg;
1704
1706 std::optional<const LIBRARY_TABLE_ROW*> libTableRow = adapter->FindRowByURI( uri );
1707
1708 if( !libTableRow )
1709 {
1710 msg.Printf( _( "The current configuration does not include the symbol library '%s'." ),
1711 uri );
1712 msg += wxS( "\n" ) + _( "Use Manage Symbol Libraries to edit the configuration." );
1713 DisplayErrorMessage( this, _( "Library not found in symbol library table." ), msg );
1714 break;
1715 }
1716
1717 libNickname = ( *libTableRow )->Nickname();
1718
1719 if( !adapter->HasLibrary( libNickname, true ) )
1720 {
1721 msg.Printf( _( "The symbol library '%s' is not enabled in the current configuration." ),
1722 UnescapeString( libNickname ) );
1723 msg += wxS( "\n" ) + _( "Use Manage Symbol Libraries to edit the configuration." );
1724 DisplayErrorMessage( this, _( "Symbol library not enabled." ), msg );
1725 break;
1726 }
1727
1728 SetCurLib( libNickname );
1729
1730 if( m_treePane )
1731 {
1732 LIB_ID id( libNickname, wxEmptyString );
1733 GetLibTree()->SelectLibId( id );
1734 GetLibTree()->ExpandLibId( id );
1735 GetLibTree()->CenterLibId( id );
1736 }
1737 }
1738
1739 break;
1740
1741 case MAIL_RELOAD_LIB:
1742 {
1743 wxString currentLib = GetCurLib();
1744
1746
1747 // Check if the currently selected symbol library been removed or disabled.
1748 if( !currentLib.empty()
1749 && !PROJECT_SCH::SymbolLibAdapter( &Prj() )->HasLibrary( currentLib, true ) )
1750 {
1751 SetCurLib( wxEmptyString );
1752 emptyScreen();
1753 }
1754
1755 SyncLibraries( true );
1758
1759 break;
1760 }
1761
1763 {
1765 LIB_SYMBOL* symbol = GetCurSymbol();
1766
1767 wxLogTrace( traceLibWatch, "Received refresh symbol request for %s", payload );
1768
1769 if( !symbol )
1770 break;
1771
1772 wxString libName = symbol->GetLibId().GetLibNickname();
1773 std::optional<const LIBRARY_TABLE_ROW*> row = adapter->GetRow( libName );
1774
1775 if( !row )
1776 return;
1777
1778 wxFileName libfullname( LIBRARY_MANAGER::GetFullURI( *row, true ) );
1779
1780 wxFileName changedLib( mail.GetPayload() );
1781
1782 wxLogTrace( traceLibWatch, "Received refresh symbol request for %s, current symbols is %s",
1783 changedLib.GetFullPath(), libfullname.GetFullPath() );
1784
1785 if( changedLib == libfullname )
1786 {
1787 wxLogTrace( traceLibWatch, "Refreshing symbol %s", symbol->GetName() );
1788
1789 SetScreen( m_dummyScreen ); // UpdateLibraryBuffer will destroy the old screen
1790 m_libMgr->UpdateLibraryBuffer( libName );
1791
1792 if( LIB_SYMBOL* lib_symbol = m_libMgr->GetBufferedSymbol( symbol->GetName(), libName ) )
1793 {
1794 // The buffered screen for the symbol
1795 SCH_SCREEN* symbol_screen = m_libMgr->GetScreen( lib_symbol->GetName(), libName );
1796
1797 SetScreen( symbol_screen );
1798 SetCurSymbol( new LIB_SYMBOL( *lib_symbol ), false );
1800
1801 if( m_toolManager )
1803 }
1804 }
1805
1806 break;
1807 }
1808
1809 default:
1810 break;
1811 }
1812}
1813
1814
1815std::unique_ptr<GRID_HELPER> SYMBOL_EDIT_FRAME::MakeGridHelper()
1816{
1817 return std::make_unique<EE_GRID_HELPER>( m_toolManager );
1818}
1819
1820
1822{
1823 // switches currently used canvas ( Cairo / OpenGL):
1824 SCH_BASE_FRAME::SwitchCanvas( aCanvasType );
1825
1826 // Set options specific to symbol editor (axies are always enabled):
1827 GetCanvas()->GetGAL()->SetAxesEnabled( true );
1829}
1830
1831
1833{
1834 wxCHECK( m_libMgr, false );
1835
1836 return m_libMgr->HasModifications();
1837}
1838
1839
1841{
1842 wxCHECK( m_libMgr, false );
1843
1844 // Test if the currently edited symbol is modified
1846 return true;
1847
1848 // Test if any library has been modified
1849 for( const wxString& libName : m_libMgr->GetLibraryNames() )
1850 {
1851 if( m_libMgr->IsLibraryModified( libName ) && !m_libMgr->IsLibraryReadOnly( libName ) )
1852 return true;
1853 }
1854
1855 return false;
1856}
1857
1858
1860{
1861 if( aItemCount == 0 )
1862 return;
1863
1864 UNDO_REDO_CONTAINER& list = ( whichList == UNDO_LIST ) ? m_undoList : m_redoList;
1865
1866 if( aItemCount < 0 )
1867 {
1868 list.ClearCommandList();
1869 }
1870 else
1871 {
1872 for( int ii = 0; ii < aItemCount; ii++ )
1873 {
1874 if( list.m_CommandsList.size() == 0 )
1875 break;
1876
1877 PICKED_ITEMS_LIST* curr_cmd = list.m_CommandsList[0];
1878 list.m_CommandsList.erase( list.m_CommandsList.begin() );
1879
1880 curr_cmd->ClearListAndDeleteItems( []( EDA_ITEM* aItem )
1881 {
1882 delete aItem;
1883 } );
1884 delete curr_cmd; // Delete command
1885 }
1886 }
1887}
1888
1889
1891{
1892 return m_toolManager->GetTool<SCH_SELECTION_TOOL>()->GetSelection();
1893}
1894
1895
1897{
1898 std::unique_ptr<LIB_SYMBOL> symbol = aSymbol->GetLibSymbolRef()->Flatten();
1899 wxCHECK( symbol, /* void */ );
1900
1901 symbol->SetLibId( aSymbol->GetLibId() );
1902
1903 // Take in account the symbol orientation and mirroring. to calculate the field
1904 // positions in symbol editor (i.e. no rotation, no mirroring)
1905 int orientation = aSymbol->GetOrientation() & ~( SYM_MIRROR_X | SYM_MIRROR_Y );
1906 int mirror = aSymbol->GetOrientation() & ( SYM_MIRROR_X | SYM_MIRROR_Y );
1907
1908 std::vector<SCH_FIELD> fullSetOfFields;
1909
1910 for( const SCH_FIELD& field : aSymbol->GetFields() )
1911 {
1912 VECTOR2I pos = field.GetPosition() - aSymbol->GetPosition();
1913 SCH_FIELD libField( symbol.get(), field.GetId() );
1914
1915 libField = field;
1916
1917 // The inverse transform is mirroring before, rotate after
1918 switch( mirror )
1919 {
1920 case SYM_MIRROR_X: pos.y = -pos.y; break;
1921 case SYM_MIRROR_Y: pos.x = -pos.x; break;
1922 default: break;
1923 }
1924
1925 switch( orientation )
1926 {
1927 case SYM_ORIENT_90:
1928 std::swap( pos.x, pos.y );
1929 pos.x = - pos.x;
1930 break;
1931 case SYM_ORIENT_270:
1932 std::swap( pos.x, pos.y );
1933 pos.y = - pos.y;
1934 break;
1935 case SYM_ORIENT_180:
1936 pos.x = - pos.x;
1937 pos.y = - pos.y;
1938 break;
1939 default:
1940 break;
1941 }
1942
1943 libField.SetPosition( pos );
1944
1945 fullSetOfFields.emplace_back( std::move( libField ) );
1946 }
1947
1948 symbol->SetFields( fullSetOfFields );
1949
1950 if( m_symbol )
1951 SetCurSymbol( nullptr, false );
1952
1954 m_schematicSymbolUUID = aSymbol->m_Uuid;
1955 m_reference = symbol->GetReferenceField().GetText();
1956 m_unit = std::max( 1, aSymbol->GetUnit() );
1957 m_bodyStyle = std::max( 1, aSymbol->GetBodyStyle() );
1958
1959 // Optimize default edit options for this symbol
1960 // Usually if units are locked, graphic items are specific to each unit
1961 // and if units are interchangeable, graphic items are common to units
1963 tools->SetDrawSpecificUnit( symbol->UnitsLocked() );
1964
1965 // The buffered screen for the symbol
1966 SCH_SCREEN* tmpScreen = new SCH_SCREEN();
1967
1968 SetScreen( tmpScreen );
1969 SetCurSymbol( symbol.release(), true );
1970 setSymWatcher( nullptr );
1971
1974
1975 if( IsLibraryTreeShown() )
1977
1978 UpdateTitle();
1981
1982 // Let tools add things to the view if necessary
1983 if( m_toolManager )
1985
1987 GetCanvas()->Refresh();
1988}
1989
1990
1991bool SYMBOL_EDIT_FRAME::addLibTableEntry( const wxString& aLibFile, LIBRARY_TABLE_SCOPE aScope )
1992{
1993 wxFileName fn = aLibFile;
1994 wxFileName libTableFileName( Prj().GetProjectPath(), FILEEXT::SymbolLibraryTableFileName );
1995 wxString libNickname = fn.GetName();
1997 LIBRARY_MANAGER& manager = Pgm().GetLibraryManager();
1998 const ENV_VAR_MAP& envVars = Pgm().GetLocalEnvVariables();
1999
2000 if( adapter->HasLibrary( libNickname ) )
2001 {
2002 wxString tmp;
2003 int suffix = 1;
2004
2005 while( adapter->HasLibrary( libNickname ) )
2006 {
2007 tmp.Printf( "%s%d", fn.GetName(), suffix );
2008 libNickname = tmp;
2009 suffix += 1;
2010 }
2011 }
2012
2013 std::optional<LIBRARY_TABLE*> optTable = manager.Table( LIBRARY_TABLE_TYPE::SYMBOL, aScope );
2014 wxCHECK( optTable.has_value(), false );
2015 LIBRARY_TABLE* table = optTable.value();
2016
2017 LIBRARY_TABLE_ROW* row = &table->InsertRow();
2018
2019 row->SetNickname( libNickname );
2020
2021 // We cannot normalize against the current project path when saving to global table.
2022 wxString normalizedPath = NormalizePath( aLibFile, &envVars,
2023 aScope == LIBRARY_TABLE_SCOPE::PROJECT ? Prj().GetProjectPath()
2024 : wxString( wxEmptyString ) );
2025
2026 row->SetURI( normalizedPath );
2028
2029 bool success = true;
2030
2031 table->Save().map_error(
2032 [&]( const LIBRARY_ERROR& aError )
2033 {
2034 KICAD_MESSAGE_DIALOG dlg( this, _( "Error saving library table." ), _( "File Save Error" ),
2035 wxOK | wxICON_ERROR );
2036 dlg.SetExtendedMessage( aError.message );
2037 dlg.ShowModal();
2038
2039 success = false;
2040 } );
2041
2042 if( success )
2043 {
2044 manager.ReloadTables( aScope, { LIBRARY_TABLE_TYPE::SYMBOL } );
2045 adapter->LoadOne( libNickname );
2046 }
2047
2048 return success;
2049}
2050
2051
2052bool SYMBOL_EDIT_FRAME::replaceLibTableEntry( const wxString& aLibNickname, const wxString& aLibFile )
2053{
2055 LIBRARY_MANAGER& manager = Pgm().GetLibraryManager();
2056 LIBRARY_TABLE* table = nullptr;
2058
2059 // Check the global library table first because checking the project library table
2060 // checks the global library table as well due to library chaining.
2061 if( adapter->GetRow( aLibNickname, scope ) )
2062 {
2063 std::optional<LIBRARY_TABLE*> optTable = manager.Table( LIBRARY_TABLE_TYPE::SYMBOL, scope );
2064 wxCHECK( optTable.has_value(), false );
2065 table = optTable.value();
2066 }
2067 else
2068 {
2070
2071 if( adapter->GetRow( aLibNickname, scope ) )
2072 {
2073 std::optional<LIBRARY_TABLE*> optTable = manager.Table( LIBRARY_TABLE_TYPE::SYMBOL, scope );
2074
2075 if( optTable.has_value() )
2076 table = optTable.value();
2077 }
2078 }
2079
2080 wxCHECK( table, false );
2081
2082 std::optional<LIBRARY_TABLE_ROW*> optRow = adapter->GetRow( aLibNickname, scope );
2083 wxCHECK( optRow.has_value(), false );
2084 LIBRARY_TABLE_ROW* row = optRow.value();
2085
2086 const ENV_VAR_MAP& envVars = Pgm().GetLocalEnvVariables();
2087
2088 wxString projectPath;
2089
2090 if( scope == LIBRARY_TABLE_SCOPE::PROJECT )
2091 projectPath = Prj().GetProjectPath();
2092
2093 wxString normalizedPath = NormalizePath( aLibFile, &envVars, projectPath );
2094
2095 row->SetURI( normalizedPath );
2096 row->SetType( "KiCad" );
2097
2098 bool success = true;
2099
2100 table->Save().map_error(
2101 [&]( const LIBRARY_ERROR& aError )
2102 {
2103 KICAD_MESSAGE_DIALOG dlg( this, _( "Error saving library table." ), _( "File Save Error" ),
2104 wxOK | wxICON_ERROR );
2105 dlg.SetExtendedMessage( aError.message );
2106 dlg.ShowModal();
2107
2108 success = false;
2109 } );
2110
2111 if( success )
2112 {
2113 manager.ReloadTables( scope, { LIBRARY_TABLE_TYPE::SYMBOL } );
2114 adapter->LoadOne( aLibNickname );
2115 }
2116
2117 return success;
2118}
2119
2120
2122{
2123 return m_symbol && !m_symbol->IsRoot();
2124}
2125
2126
2131
2132
2133void SYMBOL_EDIT_FRAME::UpdateItem( EDA_ITEM* aItem, bool isAddOrDelete, bool aUpdateRtree )
2134{
2135 SCH_BASE_FRAME::UpdateItem( aItem, isAddOrDelete, aUpdateRtree );
2136
2137 if( EDA_TEXT* eda_text = dynamic_cast<EDA_TEXT*>( aItem ) )
2138 {
2139 eda_text->ClearBoundingBoxCache();
2140 eda_text->ClearRenderCache();
2141 }
2142}
2143
2144
2146{
2147 wxAuiPaneInfo& treePane = m_auimgr.GetPane( m_treePane );
2148 wxAuiPaneInfo& propertiesPane = m_auimgr.GetPane( PropertiesPaneName() );
2149 wxAuiPaneInfo& selectionFilterPane = m_auimgr.GetPane( wxS( "SelectionFilter" ) );
2150
2151 // Don't give the selection filter its own visibility controls; instead show it if
2152 // anything else is visible
2153 bool showFilter = ( treePane.IsShown() && treePane.IsDocked() )
2154 || ( propertiesPane.IsShown() && propertiesPane.IsDocked() );
2155
2156 selectionFilterPane.Show( showFilter );
2157}
2158
2159
2161{
2162 // Returns the current render option for invisible fields
2164}
2165
2166
2168{
2169 // Returns the current render option for invisible pins
2171}
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:100
virtual const VECTOR2I GetFocusPosition() const
Similar to GetPosition() but allows items to return their visual center rather than their anchor.
Definition eda_item.h:286
const KIID m_Uuid
Definition eda_item.h:528
void ClearBrightened()
Definition eda_item.h:145
void SetBrightened()
Definition eda_item.h:142
bool IsBrightened() const
Definition eda_item.h:131
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:91
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:211
void ClearHiddenFlags()
Clear the hide flag of all items in the view.
Definition sch_view.cpp:199
bool IsSCH_ITEM() const
Definition view_item.h:101
void Clear()
Remove all items from the view.
Definition view.cpp:1213
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition view.cpp:1666
Definition kiid.h:48
Carry a payload from one KIWAY_PLAYER to another within a PROJECT.
Definition kiway_mail.h:38
std::string & GetPayload()
Return the payload, which can be any text but it typically self identifying s-expression.
Definition kiway_mail.h:56
MAIL_T Command()
Returns the MAIL_T associated with this mail.
Definition kiway_mail.h:48
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:315
void OnKiCadExit()
Definition kiway.cpp:798
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
Definition kiway.cpp:402
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:500
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)
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:152
bool UnitsLocked() const
Check whether symbol units are interchangeable.
Definition lib_symbol.h:287
bool IsRoot() const override
For symbols derived from other symbols, IsRoot() indicates no derivation.
Definition lib_symbol.h:199
wxString GetName() const override
Definition lib_symbol.h:145
bool IsMultiUnit() const override
Definition lib_symbol.h:770
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:92
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:156
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:787
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition pgm_base.h:130
virtual LIBRARY_MANAGER & GetLibraryManager() const
Definition pgm_base.h:132
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:222
@ SCH_LIBEDIT_CUR_SYMBOL
Definition project.h:223
virtual const wxString GetProjectPath() const
Return the full path of the project.
Definition project.cpp:187
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:359
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:370
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:168
int GetBodyStyle() const
Definition sch_item.h:248
int GetUnit() const
Definition sch_item.h:239
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:871
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
void KiwayMailIn(KIWAY_MAIL_EVENT &mail) override
Receive #KIWAY_ROUTED_EVENT messages from other players.
SYMBOL_EDITOR_SETTINGS * GetSettings() const
SCH_SCREEN * m_dummyScreen
< Helper screen used when no symbol is loaded
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.
Rate-limiter that fires at most once per interval.
Definition throttle.h:35
bool Ready()
Definition throttle.h:48
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:77
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 KICAD_MESSAGE_DIALOG
Definition confirm.h:52
#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:116
@ ID_ON_ZOOM_SELECT
Definition id.h:115
std::map< wxString, ENV_VAR_ITEM > ENV_VAR_MAP
PROJECT & Prj()
Definition kicad.cpp:644
KIID niluuid(0)
@ LAYER_SCHEMATIC_GRID_AXES
Definition layer_ids.h:489
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:102
bool SupportsShutdownBlockReason()
Whether or not the window supports setting a shutdown block reason.
Definition unix/app.cpp:91
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)
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
std::vector< std::vector< std::string > > table
#define ENVVARS_CHANGED
wxLogTrace helper definitions.
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:687
VECTOR2< double > VECTOR2D
Definition vector2d.h:686
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.