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
107 // Drop files event
108 EVT_DROP_FILES( SYMBOL_EDIT_FRAME::OnDropFiles )
109
110END_EVENT_TABLE()
111
112
113SYMBOL_EDIT_FRAME::SYMBOL_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
114 SCH_BASE_FRAME( aKiway, aParent, FRAME_SCH_SYMBOL_EDITOR, _( "Library Editor" ),
115 wxDefaultPosition, wxDefaultSize, KICAD_DEFAULT_DRAWFRAME_STYLE,
117 m_unitSelectBox( nullptr ),
118 m_bodyStyleSelectBox( nullptr ),
120{
121 m_SyncPinEdit = false;
122
123 m_symbol = nullptr;
124 m_treePane = nullptr;
125 m_libMgr = nullptr;
126 m_unit = 1;
127 m_bodyStyle = 1;
128 m_aboutTitle = _HKI( "KiCad Symbol Editor" );
129
130 wxIcon icon;
131 wxIconBundle icon_bundle;
132
133 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit, 48 ) );
134 icon_bundle.AddIcon( icon );
135 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit, 256 ) );
136 icon_bundle.AddIcon( icon );
137 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit, 128 ) );
138 icon_bundle.AddIcon( icon );
139 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit_32 ) );
140 icon_bundle.AddIcon( icon );
141 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit_16 ) );
142 icon_bundle.AddIcon( icon );
143
144 SetIcons( icon_bundle );
145
148
150
151 m_treePane = new SYMBOL_TREE_PANE( this, m_libMgr );
152 m_treePane->GetLibTree()->SetSortMode( (LIB_TREE_MODEL_ADAPTER::SORT_MODE) m_settings->m_LibrarySortMode );
153
156
157 // Ensure axis are always drawn
159 gal_opts.m_axesEnabled = true;
160
163 GetScreen()->m_Center = true;
164
165 GetCanvas()->GetViewControls()->SetCrossHairCursorPosition( VECTOR2D( 0, 0 ), false );
166
167 GetRenderSettings()->LoadColors( GetColorSettings() );
168 GetRenderSettings()->m_IsSymbolEditor = true;
169 GetCanvas()->GetGAL()->SetAxesColor( m_colorSettings->GetColor( LAYER_SCHEMATIC_GRID_AXES ) );
170
171 setupTools();
173
175
179
180 UpdateTitle();
183
184 m_propertiesPanel = new SCH_PROPERTIES_PANEL( this, this );
185 m_propertiesPanel->SetSplitterProportion( m_settings->m_AuiPanels.properties_splitter );
186
188
189 m_auimgr.SetManagedWindow( this );
190
192
193 // Rows; layers 4 - 6
194 m_auimgr.AddPane( m_tbTopMain, EDA_PANE().HToolbar().Name( "TopMainToolbar" )
195 .Top().Layer( 6 ) );
196
197 m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( "MsgPanel" )
198 .Bottom().Layer( 6 ) );
199
200 m_auimgr.AddPane( m_tbLeft, EDA_PANE().VToolbar().Name( "LeftToolbar" )
201 .Left().Layer( 2 ) );
202
203 m_auimgr.AddPane( m_tbRight, EDA_PANE().VToolbar().Name( "RightToolbar" )
204 .Right().Layer( 2 ) );
205
206 // Center
207 m_auimgr.AddPane( GetCanvas(), wxAuiPaneInfo().Name( "DrawFrame" )
208 .CentrePane() );
209
210 // Columns; layers 1 - 3
211 m_auimgr.AddPane( m_treePane, EDA_PANE().Palette().Name( "LibraryTree" )
212 .Left().Layer( 3 )
213 .TopDockable( false ).BottomDockable( false )
214 .Caption( _( "Libraries" ) )
215 .MinSize( FromDIP( 250 ), -1 ).BestSize( FromDIP( 250 ), -1 ) );
216
219
220 // Can be called only when all panes are created, because (at least on Windows) when items
221 // managed by m_auimgr are not the same as those existing when saved by Perspective()
222 // in config, broken settings can happen.
224
225 // Protect against broken saved Perspective() due to bugs in previous version
226 // This is currently a workaround.
227 m_auimgr.GetPane( "TopMainToolbar" ).Top().Layer( 6 ).Position(0).Show( true );
228 m_auimgr.GetPane( "LeftToolbar" ).Position(0).Show( true );
229 m_auimgr.GetPane( "RightToolbar" ).Show( true );
230
231 // Show or hide m_propertiesPanel depending on current settings:
232 wxAuiPaneInfo& propertiesPaneInfo = m_auimgr.GetPane( PropertiesPaneName() );
233 wxAuiPaneInfo& selectionFilterPane = m_auimgr.GetPane( wxS( "SelectionFilter" ) );
234 // The selection filter doesn't need to grow in the vertical direction when docked
235 selectionFilterPane.dock_proportion = 0;
236
237 propertiesPaneInfo.Show( m_settings->m_AuiPanels.show_properties );
239
241
242 // Can't put this in LoadSettings, because it has to be called before setupTools :/
244 selTool->GetFilter() = GetSettings()->m_SelectionFilter;
245 m_selectionFilterPanel->SetCheckboxesFromFilter( selTool->GetFilter() );
246
247 if( m_settings->m_LibWidth > 0 )
248 SetAuiPaneSize( m_auimgr, m_auimgr.GetPane( "LibraryTree" ), m_settings->m_LibWidth, -1 );
249
250 Raise();
251 Show( true );
252
253 SyncView();
254 GetCanvas()->GetView()->UseDrawPriority( true );
255 GetCanvas()->GetGAL()->SetAxesEnabled( true );
256
258
259 // Set the working/draw area size to display a symbol to a reasonable value:
260 // A 600mm x 600mm with a origin at the area center looks like a large working area
261 double max_size_x = schIUScale.mmToIU( 600 );
262 double max_size_y = schIUScale.mmToIU( 600 );
263 BOX2D bbox;
264 bbox.SetOrigin( -max_size_x /2, -max_size_y/2 );
265 bbox.SetSize( max_size_x, max_size_y );
266 GetCanvas()->GetView()->SetBoundary( bbox );
267
269
271 DragAcceptFiles( true );
272
273 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "Library changes are unsaved" ) );
274
275 // Catch unhandled accelerator command characters that were no handled by the library tree
276 // panel.
278 Bind( wxEVT_CHAR_HOOK, &TOOL_DISPATCHER::DispatchWxEvent, m_toolDispatcher );
279
280 // Ensure the window is on top
281 Raise();
282
283 // run SyncLibraries with progress reporter enabled. The progress reporter is useful
284 // in debug mode because the loading time of ecah library can be really noticeable
285 SyncLibraries( true );
286}
287
288
290{
291 // Shutdown all running tools
292 if( m_toolManager )
293 m_toolManager->ShutdownAllTools();
294
295 setSymWatcher( nullptr );
296
298 {
299 delete m_symbol;
300 m_symbol = nullptr;
301
302 SCH_SCREEN* screen = GetScreen();
303 delete screen;
305 }
306
307 // current screen is destroyed in EDA_DRAW_FRAME
309
311 Pgm().GetSettingsManager().Save( cfg );
312
313 delete m_libMgr;
314}
315
316
318{
319 wxCHECK_RET( m_settings, "Call to SYMBOL_EDIT_FRAME::LoadSettings with null m_settings" );
320
322
323 GetRenderSettings()->m_ShowPinsElectricalType = m_settings->m_ShowPinElectricalType;
324 GetRenderSettings()->m_ShowHiddenPins = m_settings->m_ShowHiddenPins;
325 GetRenderSettings()->m_ShowHiddenFields = m_settings->m_ShowHiddenFields;
326 GetRenderSettings()->m_ShowPinAltIcons = m_settings->m_ShowPinAltIcons;
327 GetRenderSettings()->SetDefaultFont( wxEmptyString );
328}
329
330
332{
333 wxCHECK_RET( m_settings, "Call to SYMBOL_EDIT_FRAME:SaveSettings with null m_settings" );
334
336
338
339 m_settings->m_ShowPinElectricalType = GetRenderSettings()->m_ShowPinsElectricalType;
340 m_settings->m_ShowHiddenPins = GetRenderSettings()->m_ShowHiddenPins;
341 m_settings->m_ShowHiddenFields = GetRenderSettings()->m_ShowHiddenFields;
342 m_settings->m_ShowPinAltIcons = GetRenderSettings()->m_ShowPinAltIcons;
343
344 m_settings->m_LibWidth = m_treePane->GetSize().x;
345
346 m_settings->m_LibrarySortMode = GetLibTree()->GetSortMode();
347
348 m_settings->m_AuiPanels.properties_splitter = m_propertiesPanel->SplitterProportion();
349 bool prop_shown = m_auimgr.GetPane( PropertiesPaneName() ).IsShown();
350 m_settings->m_AuiPanels.show_properties = prop_shown;
351
353 m_settings->m_SelectionFilter = selTool->GetFilter();
354}
355
356
358{
359 return static_cast<APP_SETTINGS_BASE*>( GetSettings() );
360}
361
362
364{
366
367 if( cfg && static_cast<SYMBOL_EDITOR_SETTINGS*>( cfg )->m_UseEeschemaColorSettings )
368 cfg = GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
369
370 return ::GetColorSettings( cfg ? cfg->m_ColorTheme : DEFAULT_THEME );
371}
372
373
375{
376 // Create the manager and dispatcher & route draw panel events to the dispatcher
378 m_toolManager->SetEnvironment( GetScreen(), GetCanvas()->GetView(),
379 GetCanvas()->GetViewControls(), GetSettings(), this );
380 m_actions = new SCH_ACTIONS();
382
383 // Register tools
384 m_toolManager->RegisterTool( new COMMON_CONTROL );
385 m_toolManager->RegisterTool( new COMMON_TOOLS );
386 m_toolManager->RegisterTool( new ZOOM_TOOL );
387 m_toolManager->RegisterTool( new SCH_SELECTION_TOOL );
388 m_toolManager->RegisterTool( new PICKER_TOOL );
389 m_toolManager->RegisterTool( new SCH_INSPECTION_TOOL );
390 m_toolManager->RegisterTool( new SYMBOL_EDITOR_PIN_TOOL );
391 m_toolManager->RegisterTool( new SYMBOL_EDITOR_DRAWING_TOOLS );
392 m_toolManager->RegisterTool( new SCH_POINT_EDITOR );
393 m_toolManager->RegisterTool( new SCH_FIND_REPLACE_TOOL );
394 m_toolManager->RegisterTool( new SYMBOL_EDITOR_MOVE_TOOL );
395 m_toolManager->RegisterTool( new SYMBOL_EDITOR_EDIT_TOOL );
396 m_toolManager->RegisterTool( new LIBRARY_EDITOR_CONTROL );
397 m_toolManager->RegisterTool( new SYMBOL_EDITOR_CONTROL );
398 m_toolManager->RegisterTool( new PROPERTIES_TOOL );
399 m_toolManager->RegisterTool( new EMBED_TOOL );
400 m_toolManager->InitTools();
401
402 // Run the selection tool, it is supposed to be always active
403 m_toolManager->InvokeTool( "common.InteractiveSelection" );
404
406}
407
408
410{
412
413 ACTION_MANAGER* mgr = m_toolManager->GetActionManager();
414 EDITOR_CONDITIONS cond( this );
415
416 wxASSERT( mgr );
417
418#define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
419#define CHECK( x ) ACTION_CONDITIONS().Check( x )
420
421 auto haveSymbolCond =
422 [this]( const SELECTION& )
423 {
424 return m_symbol;
425 };
426
427 auto isEditableCond =
428 [this]( const SELECTION& )
429 {
430 // Only root symbols from the new s-expression libraries or the schematic
431 // are editable.
432 return IsSymbolEditable() && !IsSymbolAlias();
433 };
434
435 auto isEditableInAliasCond =
436 [this]( const SELECTION& )
437 {
438 // Less restrictive than isEditableCond
439 // Symbols fields (root symbols and aliases) from the new s-expression libraries
440 // or in the schematic are editable.
441 return IsSymbolEditable();
442 };
443
444 auto symbolModifiedCondition =
445 [this]( const SELECTION& sel )
446 {
447 return m_libMgr && m_libMgr->IsSymbolModified( GetTargetLibId().GetLibItemName(),
448 GetTargetLibId().GetLibNickname() );
449 };
450
451 auto libSelectedCondition =
452 [this]( const SELECTION& sel )
453 {
454 return !GetTargetLibId().GetLibNickname().empty();
455 };
456
457 auto canEditProperties =
458 [this]( const SELECTION& sel )
459 {
461 };
462
463 auto saveSymbolAsCondition =
464 [this]( const SELECTION& aSel )
465 {
466 return getTargetSymbol() != nullptr;
467 };
468
469 const auto isSymbolFromSchematicCond =
470 [this]( const SELECTION& )
471 {
472 return IsSymbolFromSchematic();
473 };
474
475 // clang-format off
478 mgr->SetConditions( SCH_ACTIONS::saveLibraryAs, ENABLE( libSelectedCondition ) );
479 mgr->SetConditions( SCH_ACTIONS::saveSymbolAs, ENABLE( saveSymbolAsCondition ) );
480 mgr->SetConditions( SCH_ACTIONS::saveSymbolCopyAs, ENABLE( saveSymbolAsCondition ) );
483 mgr->SetConditions( SCH_ACTIONS::editLibSymbolWithLibEdit, ENABLE( isSymbolFromSchematicCond ) );
484
485 mgr->SetConditions( ACTIONS::undo, ENABLE( haveSymbolCond && cond.UndoAvailable() ) );
486 mgr->SetConditions( ACTIONS::redo, ENABLE( haveSymbolCond && cond.RedoAvailable() ) );
487 mgr->SetConditions( ACTIONS::revert, ENABLE( symbolModifiedCondition ) );
488
491
492 mgr->SetConditions( ACTIONS::cut, ENABLE( isEditableCond ) );
493 mgr->SetConditions( ACTIONS::copy, ENABLE( haveSymbolCond ) );
494 mgr->SetConditions( ACTIONS::copyAsText, ENABLE( haveSymbolCond ) );
495 mgr->SetConditions( ACTIONS::paste, ENABLE( isEditableCond &&
497 mgr->SetConditions( ACTIONS::doDelete, ENABLE( isEditableCond ) );
498 mgr->SetConditions( ACTIONS::duplicate, ENABLE( isEditableCond ) );
499 mgr->SetConditions( ACTIONS::selectAll, ENABLE( haveSymbolCond ) );
500 mgr->SetConditions( ACTIONS::unselectAll, ENABLE( haveSymbolCond ) );
501
502 // These actions in symbol editor when editing alias field rotations are allowed.
503 mgr->SetConditions( SCH_ACTIONS::rotateCW, ENABLE( isEditableInAliasCond ) );
504 mgr->SetConditions( SCH_ACTIONS::rotateCCW, ENABLE( isEditableInAliasCond ) );
505
506 mgr->SetConditions( SCH_ACTIONS::mirrorH, ENABLE( isEditableCond ) );
507 mgr->SetConditions( SCH_ACTIONS::mirrorV, ENABLE( isEditableCond ) );
508
511 // clang-format on
512
513 auto pinTypeCond =
514 [this]( const SELECTION& )
515 {
517 };
518
519 auto hiddenPinCond =
520 [this]( const SELECTION& )
521 {
523 };
524
525 auto hiddenFieldCond =
526 [this]( const SELECTION& )
527 {
529 };
530
531 auto showPinAltIconsCond =
532 [this]( const SELECTION& )
533 {
535 };
536
537 auto showLibraryTreeCond =
538 [this]( const SELECTION& )
539 {
540 return IsLibraryTreeShown();
541 };
542
543 auto propertiesCond =
544 [this] ( const SELECTION& )
545 {
546 return m_auimgr.GetPane( PropertiesPaneName() ).IsShown();
547 };
548
551 mgr->SetConditions( ACTIONS::showLibraryTree, CHECK( showLibraryTreeCond ) );
552 mgr->SetConditions( ACTIONS::showProperties, CHECK( propertiesCond ) );
553 mgr->SetConditions( SCH_ACTIONS::showHiddenPins, CHECK( hiddenPinCond ) );
554 mgr->SetConditions( SCH_ACTIONS::showHiddenFields, CHECK( hiddenFieldCond ) );
555 mgr->SetConditions( SCH_ACTIONS::togglePinAltIcons, CHECK( showPinAltIconsCond ) );
556
557 auto multiUnitModeCond =
558 [this]( const SELECTION& )
559 {
560 return m_symbol && m_symbol->IsMultiUnit() && !m_symbol->UnitsLocked();
561 };
562
563 auto multiBodyStyleModeCond =
564 [this]( const SELECTION& )
565 {
566 return m_symbol && m_symbol->IsMultiBodyStyle();
567 };
568
569 auto syncedPinsModeCond =
570 [this]( const SELECTION& )
571 {
572 return m_SyncPinEdit;
573 };
574
575 auto haveDatasheetCond =
576 [this]( const SELECTION& )
577 {
578 return m_symbol && !m_symbol->GetDatasheetField().GetText().IsEmpty();
579 };
580
581 mgr->SetConditions( ACTIONS::showDatasheet, ENABLE( haveDatasheetCond ) );
582 mgr->SetConditions( SCH_ACTIONS::symbolProperties, ENABLE( canEditProperties && haveSymbolCond ) );
583 mgr->SetConditions( SCH_ACTIONS::runERC, ENABLE( haveSymbolCond ) );
584 mgr->SetConditions( SCH_ACTIONS::pinTable, ENABLE( isEditableCond && haveSymbolCond ) );
585 mgr->SetConditions( SCH_ACTIONS::cycleBodyStyle, ENABLE( multiBodyStyleModeCond ) );
586
587 mgr->SetConditions( SCH_ACTIONS::toggleSyncedPinsMode, ACTION_CONDITIONS().Enable( multiUnitModeCond ).Check( syncedPinsModeCond ) );
588
589// Only enable a tool if the symbol is edtable
590#define EDIT_TOOL( tool ) ACTION_CONDITIONS().Enable( isEditableCond ).Check( cond.CurrentTool( tool ) )
591
604
605#undef CHECK
606#undef ENABLE
607#undef EDIT_TOOL
608}
609
610
612{
613 if( IsContentModified() )
614 {
615 SCH_EDIT_FRAME* schframe = (SCH_EDIT_FRAME*) Kiway().Player( FRAME_SCH, false );
616 wxString msg = _( "Save changes to '%s' before closing?" );
617
618 switch( UnsavedChangesDialog( this, wxString::Format( msg, m_reference ), nullptr ) )
619 {
620 case wxID_YES:
621 if( schframe && GetCurSymbol() ) // Should be always the case
623
624 break;
625
626 case wxID_NO:
627 break;
628
629 default:
630 case wxID_CANCEL:
631 return false;
632 }
633 }
634
635 if( doClose )
636 {
637 SetCurSymbol( nullptr, false );
638 UpdateTitle();
639 }
640
641 return true;
642}
643
644
645bool SYMBOL_EDIT_FRAME::canCloseWindow( wxCloseEvent& aEvent )
646{
647 // Shutdown blocks must be determined and vetoed as early as possible
649 && aEvent.GetId() == wxEVT_QUERY_END_SESSION
650 && IsContentModified() )
651 {
652 return false;
653 }
654
656 return false;
657
658 if( !saveAllLibraries( true ) )
659 return false;
660
661 // Save symbol tree column widths
662 m_libMgr->GetAdapter()->SaveSettings();
663
664 return true;
665}
666
667
669{
671
672 if( GetLibTree() )
674
675 delete m_toolManager;
676 m_toolManager = nullptr;
677
678 Destroy();
679}
680
681
683{
684 if( m_unitSelectBox )
685 {
686 if( m_unitSelectBox->GetCount() != 0 )
687 m_unitSelectBox->Clear();
688
689 if( !m_symbol || m_symbol->GetUnitCount() <= 1 )
690 {
691 m_unit = 1;
692 m_unitSelectBox->Append( wxEmptyString );
693 }
694 else
695 {
696 for( int i = 0; i < m_symbol->GetUnitCount(); i++ )
697 m_unitSelectBox->Append( m_symbol->GetUnitDisplayName( i + 1, true ) );
698 }
699
700 // Ensure the selected unit is compatible with the number of units of the current symbol:
701 if( m_symbol && m_symbol->GetUnitCount() < m_unit )
702 m_unit = 1;
703
704 m_unitSelectBox->SetSelection( ( m_unit > 0 ) ? m_unit - 1 : 0 );
705 }
706
708 {
709 if( m_bodyStyleSelectBox->GetCount() != 0 )
710 m_bodyStyleSelectBox->Clear();
711
712 if( !m_symbol || !m_symbol->IsMultiBodyStyle() )
713 {
714 m_bodyStyle = 1;
715 m_bodyStyleSelectBox->Append( wxEmptyString );
716 }
717 else if( m_symbol && m_symbol->HasDeMorganBodyStyles() )
718 {
719 m_bodyStyleSelectBox->Append( wxGetTranslation( DEMORGAN_STD ) );
720 m_bodyStyleSelectBox->Append( wxGetTranslation( DEMORGAN_ALT ) );
721 }
722 else
723 {
724 for( int i = 0; i < m_symbol->GetBodyStyleCount(); i++ )
725 m_bodyStyleSelectBox->Append( m_symbol->GetBodyStyleNames()[i] );
726 }
727
728 // Ensure the selected body style is compatible with the number of body styles of the current symbol:
729 if( m_symbol && m_symbol->GetBodyStyleCount() < m_bodyStyle )
730 m_bodyStyle = 1;
731
732 m_bodyStyleSelectBox->SetSelection( ( m_bodyStyle > 0 ) ? m_bodyStyle - 1 : 0 );
733 }
734}
735
736
738{
739 if( !m_propertiesPanel )
740 return;
741
742 bool show = !m_propertiesPanel->IsShownOnScreen();
743
744 wxAuiPaneInfo& propertiesPaneInfo = m_auimgr.GetPane( PropertiesPaneName() );
745 propertiesPaneInfo.Show( show );
747
748 if( show )
749 {
750 SetAuiPaneSize( m_auimgr, propertiesPaneInfo,
751 m_settings->m_AuiPanels.properties_panel_width, -1 );
752 }
753 else
754 {
755 m_settings->m_AuiPanels.properties_panel_width = m_propertiesPanel->GetSize().x;
756 }
757
758 m_auimgr.Update();
759 Refresh();
760}
761
762
764{
765 wxAuiPaneInfo& treePane = m_auimgr.GetPane( m_treePane );
766 treePane.Show( !IsLibraryTreeShown() );
768 m_auimgr.Update();
769 Refresh();
770}
771
772
774{
775 return const_cast<wxAuiManager&>( m_auimgr ).GetPane( m_treePane ).IsShown();
776}
777
778
783
784
786{
787 m_treePane->Freeze();
788 m_libMgr->GetAdapter()->Freeze();
789}
790
791
793{
794 m_libMgr->GetAdapter()->Thaw();
795 m_treePane->Thaw();
796}
797
798
799void SYMBOL_EDIT_FRAME::OnExitKiCad( wxCommandEvent& event )
800{
801 Kiway().OnKiCadExit();
802}
803
804
805void SYMBOL_EDIT_FRAME::OnUpdateUnitNumber( wxUpdateUIEvent& event )
806{
807 event.Enable( m_symbol && m_symbol->GetUnitCount() > 1 );
808}
809
810
811void SYMBOL_EDIT_FRAME::OnSelectUnit( wxCommandEvent& event )
812{
813 if( event.GetSelection() == wxNOT_FOUND )
814 return;
815
816 SetUnit( event.GetSelection() + 1 );
817}
818
819
820void SYMBOL_EDIT_FRAME::OnUpdateBodyStyle( wxUpdateUIEvent& event )
821{
822 event.Enable( m_symbol && m_symbol->GetBodyStyleCount() > 1 );
823}
824
825
826void SYMBOL_EDIT_FRAME::OnSelectBodyStyle( wxCommandEvent& event )
827{
828 if( event.GetSelection() == wxNOT_FOUND )
829 return;
830
831 SetBodyStyle( event.GetSelection() + 1 );
832}
833
834
836{
837 if( m_symbol )
838 {
840
841 if( auto row = adapter->GetRow( m_symbol->GetLibNickname() ); row.has_value() )
842 {
843 if( ( *row )->Type() == SCH_IO_MGR::ShowType( SCH_IO_MGR::SCH_LEGACY ) )
844 return true;
845 }
846 }
847
848 return false;
849}
850
851
853{
854 wxString libNickname = Prj().GetRString( PROJECT::SCH_LIBEDIT_CUR_LIB );
855
856 if( !libNickname.empty() )
857 {
858 if( !PROJECT_SCH::SymbolLibAdapter( &Prj() )->HasLibrary( libNickname ) )
859 {
860 Prj().SetRString( PROJECT::SCH_LIBEDIT_CUR_LIB, wxEmptyString );
861 libNickname = wxEmptyString;
862 }
863 }
864
865 return libNickname;
866}
867
868
869wxString SYMBOL_EDIT_FRAME::SetCurLib( const wxString& aLibNickname )
870{
871 wxString old = GetCurLib();
872
873 if( aLibNickname.empty() || !PROJECT_SCH::SymbolLibAdapter( &Prj() )->HasLibrary( aLibNickname ) )
874 Prj().SetRString( PROJECT::SCH_LIBEDIT_CUR_LIB, wxEmptyString );
875 else
877
878 return old;
879}
880
881
882void SYMBOL_EDIT_FRAME::SetCurSymbol( LIB_SYMBOL* aSymbol, bool aUpdateZoom )
883{
884 wxCHECK( m_toolManager, /* void */ );
885
887 GetCanvas()->GetView()->Clear();
888 delete m_symbol;
889
890 m_symbol = aSymbol;
891
892 // select the current symbol in the tree widget
894 GetLibTree()->SelectLibId( m_symbol->GetLibId() );
895 else
896 GetLibTree()->Unselect();
897
898 wxString symbolName;
899 wxString libName;
900
901 if( m_symbol )
902 {
903 symbolName = m_symbol->GetName();
904 libName = UnescapeString( m_symbol->GetLibId().GetLibNickname() );
905 }
906
907 // retain in case this wxFrame is re-opened later on the same PROJECT
909
910 // Ensure synchronized pin edit can be enabled only symbols with interchangeable units
911 m_SyncPinEdit = aSymbol && aSymbol->IsRoot() && aSymbol->IsMultiUnit() && !aSymbol->UnitsLocked();
912
914
922
923 if( aUpdateZoom )
925
926 GetCanvas()->Refresh();
927 m_propertiesPanel->UpdateData();
928
929 WX_INFOBAR& infobar = *GetInfoBar();
930 infobar.RemoveAllButtons();
931
932 wxArrayString msgs;
933 int infobarFlags = wxICON_INFORMATION;
934
936 {
937 msgs.push_back( wxString::Format( _( "Editing symbol %s from schematic. Saving will "
938 "update the schematic only." ),
939 m_reference ) );
940
941 wxString link = wxString::Format( _( "Open symbol from library %s" ), libName );
942 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( &infobar, wxID_ANY, link, wxEmptyString );
943
944 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
945 [this, symbolName, libName]( wxHyperlinkEvent& aEvent )
946 {
948 } ) );
949
950 infobar.AddButton( button );
951 }
952 else if( IsSymbolFromLegacyLibrary() )
953 {
954 msgs.push_back( _( "Symbols in legacy libraries are not editable. Use Manage Symbol "
955 "Libraries to migrate to current format." ) );
956
957 wxString link = _( "Manage symbol libraries" );
958 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( &infobar, wxID_ANY, link, wxEmptyString );
959
960 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
961 [this]( wxHyperlinkEvent& aEvent )
962 {
964 } ) );
965
966 infobar.AddButton( button );
967 }
968 else if( IsSymbolAlias() )
969 {
970 msgs.push_back( wxString::Format( _( "Symbol %s is a derived symbol. Symbol graphics will "
971 "not be editable." ),
972 UnescapeString( symbolName ) ) );
973
974 // Don't assume the parent symbol shared pointer is still valid.
975 if( std::shared_ptr<LIB_SYMBOL> rootSymbol = m_symbol->GetRootSymbol() )
976 {
977 int unit = GetUnit();
978 int bodyStyle = GetBodyStyle();
979 wxString rootSymbolName = rootSymbol->GetName();
980 wxString link = wxString::Format( _( "Open %s" ), UnescapeString( rootSymbolName ) );
981
982 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( &infobar, wxID_ANY, link,
983 wxEmptyString );
984
985 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
986 [this, rootSymbolName, unit, bodyStyle]( wxHyperlinkEvent& aEvent )
987 {
988 LoadSymbolFromCurrentLib( rootSymbolName, unit, bodyStyle );
989 } ) );
990
991 infobar.AddButton( button );
992 }
993 }
994
995 if( m_symbol
997 && m_libMgr->IsLibraryReadOnly( m_symbol->GetLibId().GetFullLibraryName() ) )
998 {
999 msgs.push_back( _( "Library is read-only. Changes cannot be saved to this library." ) );
1000
1001 wxString link = wxString::Format( _( "Create an editable copy" ) );
1002 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( &infobar, wxID_ANY, link, wxEmptyString );
1003
1004 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
1005 [this, symbolName, libName]( wxHyperlinkEvent& aEvent )
1006 {
1007 wxString msg = wxString::Format( _( "Create an editable copy of the symbol or "
1008 "the entire library (%s)?" ),
1009 libName );
1010
1011 KIDIALOG errorDlg( this, msg, _( "Select type of item to save" ),
1012 wxYES_NO | wxCANCEL | wxICON_QUESTION );
1013 // These buttons are in a weird order(?)
1014 errorDlg.SetYesNoCancelLabels( _( "Copy symbol" ), _( "Cancel" ),
1015 _( "Copy library" ) );
1016
1017 int choice = errorDlg.ShowModal();
1018
1019 switch( choice )
1020 {
1021 case wxID_YES:
1022 SaveSymbolCopyAs( true );
1023 break;
1024 case wxID_CANCEL:
1025 SaveLibraryAs();
1026 break;
1027 default:
1028 // Do nothing
1029 break;
1030 }
1031 } ) );
1032
1033 infobar.AddButton( button );
1034 }
1035
1036 if( msgs.empty() )
1037 {
1038 infobar.Dismiss();
1039 }
1040 else
1041 {
1042 wxString msg = wxJoin( msgs, '\n', '\0' );
1043 infobar.ShowMessage( msg, infobarFlags );
1044 }
1045}
1046
1047
1053
1054
1056{
1058
1060
1061 if( !IsSymbolFromSchematic() )
1063
1064 if( m_isClosing )
1065 return;
1066
1068
1069 if( !GetTitle().StartsWith( "*" ) )
1070 UpdateTitle();
1071}
1072
1073
1075{
1076 wxCHECK( aUnit > 0 && aUnit <= GetCurSymbol()->GetUnitCount(), /* void*/ );
1077
1078 if( m_unit == aUnit )
1079 return;
1080
1083
1084 m_unit = aUnit;
1085
1086 if( m_unitSelectBox->GetSelection() != ( m_unit - 1 ) )
1087 m_unitSelectBox->SetSelection( m_unit - 1 );
1088
1090 RebuildView();
1092}
1093
1094
1096{
1097 wxCHECK( aBodyStyle > 0 && aBodyStyle <= GetCurSymbol()->GetBodyStyleCount(), /* void */ );
1098
1099 if( m_bodyStyle == aBodyStyle )
1100 return;
1101
1104
1105 m_bodyStyle = aBodyStyle;
1106
1107 if( m_bodyStyleSelectBox->GetSelection() != ( m_bodyStyle - 1 ) )
1108 m_bodyStyleSelectBox->SetSelection( m_bodyStyle - 1 );
1109
1110
1112 RebuildView();
1114}
1115
1116
1118{
1119 return m_SyncPinEdit && m_symbol && m_symbol->IsMultiUnit() && !m_symbol->UnitsLocked();
1120}
1121
1122
1123wxString SYMBOL_EDIT_FRAME::AddLibraryFile( bool aCreateNew )
1124{
1125 wxFileName fn = m_libMgr->GetUniqueLibraryName();
1126 bool useGlobalTable = true;
1127 FILEDLG_HOOK_NEW_LIBRARY tableChooser( useGlobalTable );
1128
1129 if( !LibraryFileBrowser( aCreateNew ? _( "New Symbol Library" ) : _( "Add Symbol Library" ),
1130 !aCreateNew, fn, FILEEXT::KiCadSymbolLibFileWildcard(),
1132 Pgm().GetSettingsManager().IsProjectOpenNotDummy() ? &tableChooser : nullptr ) )
1133 {
1134 return wxEmptyString;
1135 }
1136
1139
1140 std::optional<LIBRARY_TABLE*> table = Pgm().GetLibraryManager().Table( LIBRARY_TABLE_TYPE::SYMBOL, scope );
1141 wxCHECK( table, wxEmptyString );
1142
1143 wxString libName = fn.GetName();
1144
1145 if( libName.IsEmpty() )
1146 return wxEmptyString;
1147
1149
1150 if( adapter->HasLibrary( libName ) )
1151 {
1152 DisplayError( this, wxString::Format( _( "Library '%s' already exists." ), libName ) );
1153 return wxEmptyString;
1154 }
1155
1156 if( aCreateNew )
1157 {
1158 if( !m_libMgr->CreateLibrary( fn.GetFullPath(), scope ) )
1159 {
1160 DisplayError( this, wxString::Format( _( "Could not create the library file '%s'.\n"
1161 "Make sure you have write permissions and try again." ),
1162 fn.GetFullPath() ) );
1163 return wxEmptyString;
1164 }
1165 }
1166 else
1167 {
1168 if( !m_libMgr->AddLibrary( fn.GetFullPath(), scope ) )
1169 {
1170 DisplayError( this, _( "Could not open the library file." ) );
1171 return wxEmptyString;
1172 }
1173 }
1174
1175 ( *table )->Save().map_error(
1176 []( const LIBRARY_ERROR& aError )
1177 {
1178 wxMessageBox( wxString::Format( _( "Error saving library table:\n\n%s" ), aError.message ),
1179 _( "File Save Error" ), wxOK | wxICON_ERROR );
1180 } );
1181
1182 adapter->LoadOne( fn.GetName() );
1183
1184 std::string packet = fn.GetFullPath().ToStdString();
1187
1188 return fn.GetFullPath();
1189}
1190
1191
1192void SYMBOL_EDIT_FRAME::DdAddLibrary( wxString aLibFile )
1193{
1194 wxFileName fn = wxFileName( aLibFile );
1195 wxString libName = fn.GetName();
1196
1197 if( libName.IsEmpty() )
1198 return;
1199
1201
1202 if( adapter->HasLibrary( libName ) )
1203 {
1204 DisplayError( this, wxString::Format( _( "Library '%s' already exists." ), libName ) );
1205 return;
1206 }
1207
1208 // TODO(JE) after Jeff's commit removing the select dialog; this is always project? is that correct?
1209 if( !m_libMgr->AddLibrary( fn.GetFullPath(), LIBRARY_TABLE_SCOPE::PROJECT ) )
1210 {
1211 DisplayError( this, _( "Could not open the library file." ) );
1212 return;
1213 }
1214
1215 std::optional<LIBRARY_TABLE*> table = Pgm().GetLibraryManager().Table( LIBRARY_TABLE_TYPE::SYMBOL,
1217 wxCHECK( table, /* void */ );
1218
1219 ( *table )->Save().map_error(
1220 []( const LIBRARY_ERROR& aError )
1221 {
1222 wxMessageBox( wxString::Format( _( "Error saving library table:\n\n%s" ), aError.message ),
1223 _( "File Save Error" ), wxOK | wxICON_ERROR );
1224 } );
1225
1226 std::string packet = fn.GetFullPath().ToStdString();
1229}
1230
1231
1233{
1234 return GetLibTree()->GetSelectedLibId( aUnit );
1235}
1236
1237
1242
1243int SYMBOL_EDIT_FRAME::GetTreeLIBIDs( std::vector<LIB_ID>& aSelection ) const
1244{
1245 return GetLibTree()->GetSelectedLibIds( aSelection );
1246}
1247
1248
1250{
1251 if( IsLibraryTreeShown() )
1252 {
1253 LIB_ID libId = GetTreeLIBID();
1254
1255 if( libId.IsValid() )
1256 return m_libMgr->GetSymbol( libId.GetLibItemName(), libId.GetLibNickname() );
1257 }
1258
1259 return m_symbol;
1260}
1261
1262
1264{
1265 LIB_ID id;
1266
1267 if( IsLibraryTreeShown() )
1268 id = GetTreeLIBID();
1269
1270 if( id.GetLibNickname().empty() && m_symbol )
1271 id = m_symbol->GetLibId();
1272
1273 return id;
1274}
1275
1276
1277std::vector<LIB_ID> SYMBOL_EDIT_FRAME::GetSelectedLibIds() const
1278{
1279 std::vector<LIB_ID> ids;
1280 GetTreeLIBIDs( ids );
1281 return ids;
1282}
1283
1284
1286{
1287 return GetTargetLibId().GetLibNickname();
1288}
1289
1290
1291void SYMBOL_EDIT_FRAME::SyncLibraries( bool aShowProgress, bool aPreloadCancelled,
1292 const wxString& aForceRefresh )
1293{
1294 LIB_ID selected;
1295
1296 if( m_treePane )
1297 selected = GetLibTree()->GetSelectedLibId();
1298
1299 if( aShowProgress )
1300 {
1301 APP_PROGRESS_DIALOG progressDlg( _( "Loading Symbol Libraries" ), wxEmptyString,
1302 m_libMgr->GetAdapter()->GetLibrariesCount(), this );
1303
1304 m_libMgr->Sync( aForceRefresh,
1305 [&]( int progress, int max, const wxString& libName )
1306 {
1307 progressDlg.Update( progress, wxString::Format( _( "Loading library '%s'..." ),
1308 libName ) );
1309 } );
1310 }
1311 else if( !aPreloadCancelled )
1312 {
1313 m_libMgr->Sync( aForceRefresh,
1314 [&]( int progress, int max, const wxString& libName )
1315 {
1316 } );
1317 }
1318
1319 if( m_treePane )
1320 {
1321 wxDataViewItem found;
1322
1323 if( selected.IsValid() )
1324 {
1325 // Check if the previously selected item is still valid,
1326 // if not - it has to be unselected to prevent crash
1327 found = m_libMgr->GetAdapter()->FindItem( selected );
1328
1329 if( !found )
1330 GetLibTree()->Unselect();
1331 }
1332
1333 GetLibTree()->Regenerate( true );
1334
1335 // Try to select the parent library, in case the symbol is not found
1336 if( !found && selected.IsValid() )
1337 {
1338 selected.SetLibItemName( "" );
1339 found = m_libMgr->GetAdapter()->FindItem( selected );
1340
1341 if( found )
1342 GetLibTree()->SelectLibId( selected );
1343 }
1344
1345 // If no selection, see if there's a current symbol to centre
1346 if( !selected.IsValid() && m_symbol )
1347 {
1348 LIB_ID current( GetCurLib(), m_symbol->GetName() );
1349 GetLibTree()->CenterLibId( current );
1350 }
1351 }
1352}
1353
1354
1359
1360
1362{
1363 GetLibTree()->SelectLibId( aLibID );
1364}
1365
1366
1367void SYMBOL_EDIT_FRAME::UpdateLibraryTree( const wxDataViewItem& aTreeItem, LIB_SYMBOL* aSymbol )
1368{
1369 if( aTreeItem.IsOk() ) // Can be not found in tree if the current footprint is imported
1370 // from file therefore not yet in tree.
1371 {
1372 static_cast<LIB_TREE_NODE_ITEM*>( aTreeItem.GetID() )->Update( aSymbol );
1374 }
1375}
1376
1377
1378bool SYMBOL_EDIT_FRAME::backupFile( const wxFileName& aOriginalFile, const wxString& aBackupExt )
1379{
1380 if( aOriginalFile.FileExists() )
1381 {
1382 wxFileName backupFileName( aOriginalFile );
1383 backupFileName.SetExt( aBackupExt );
1384
1385 if( backupFileName.FileExists() )
1386 wxRemoveFile( backupFileName.GetFullPath() );
1387
1388 if( !wxCopyFile( aOriginalFile.GetFullPath(), backupFileName.GetFullPath() ) )
1389 {
1390 DisplayError( this, wxString::Format( _( "Failed to save backup to '%s'." ),
1391 backupFileName.GetFullPath() ) );
1392 return false;
1393 }
1394 }
1395
1396 return true;
1397}
1398
1399
1401{
1402 if( m_symbol && !GetCurLib().IsEmpty() && GetScreen()->IsContentModified() )
1403 m_libMgr->UpdateSymbol( m_symbol, GetCurLib() ); // UpdateSymbol() makes a copy
1404}
1405
1406
1408{
1409 // This will return the root symbol of any alias
1410 LIB_SYMBOL* symbol = m_libMgr->GetBufferedSymbol( aLibId.GetLibItemName(), aLibId.GetLibNickname() );
1411
1412 // Now we can compare the libId of the current symbol and the root symbol
1413 return ( symbol && m_symbol && symbol->GetLibId() == m_symbol->GetLibId() );
1414}
1415
1416
1418{
1419 GetLibTree()->Unselect();
1420 SetCurLib( wxEmptyString );
1421 SetCurSymbol( nullptr, false );
1425 Refresh();
1426}
1427
1428
1430{
1432
1434 {
1435 GetRenderSettings()->m_ShowPinsElectricalType = cfg->m_ShowPinElectricalType;
1436 GetRenderSettings()->m_ShowHiddenPins = cfg->m_ShowHiddenPins;
1437 GetRenderSettings()->m_ShowHiddenFields = cfg->m_ShowHiddenFields;
1438 GetRenderSettings()->m_ShowPinAltIcons = cfg->m_ShowPinAltIcons;
1439
1440 GetGalDisplayOptions().ReadWindowSettings( cfg->m_Window );
1441 }
1442
1443 if( m_symbol )
1444 m_symbol->ClearCaches();
1445
1447
1449 GetCanvas()->Refresh();
1450
1452
1453 if( aFlags & ENVVARS_CHANGED )
1454 SyncLibraries( true );
1455
1456 Layout();
1457 SendSizeEvent();
1458}
1459
1460
1462{
1463 // call my base class
1465
1466 // tooltips in toolbars
1468
1469 // For some obscure reason, the AUI manager hides the first modified pane.
1470 // So force show panes
1471 wxAuiPaneInfo& tree_pane_info = m_auimgr.GetPane( m_treePane );
1472 bool tree_shown = tree_pane_info.IsShown();
1473 tree_pane_info.Caption( _( "Libraries" ) );
1474 tree_pane_info.Show( tree_shown );
1475 m_auimgr.Update();
1476
1478
1479 // status bar
1481
1482 if( GetRenderSettings()->m_ShowPinsElectricalType )
1483 {
1485 GetCanvas()->Refresh();
1486 }
1487
1488 UpdateTitle();
1489}
1490
1491
1493{
1494 SCH_BASE_FRAME::SetScreen( aScreen );
1495
1496 // Let tools add things to the view if necessary
1497 if( m_toolManager )
1499}
1500
1501
1519
1520
1522{
1523 SyncLibraries( true );
1524
1525 if( m_symbol )
1526 {
1527 SCH_SELECTION_TOOL* selectionTool = m_toolManager->GetTool<SCH_SELECTION_TOOL>();
1528 SCH_SELECTION& selection = selectionTool->GetSelection();
1529
1530 for( SCH_ITEM& item : m_symbol->GetDrawItems() )
1531 {
1532 if( !alg::contains( selection, &item ) )
1533 item.ClearSelected();
1534 else
1535 item.SetSelected();
1536 }
1537
1538 m_symbol->ClearCaches();
1539 }
1540
1541 RebuildView();
1542}
1543
1544
1545const BOX2I SYMBOL_EDIT_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
1546{
1547 if( !m_symbol )
1548 {
1549 // Gives a reasonable drawing area size
1550 int width = schIUScale.mmToIU( 50 );
1551 int height = schIUScale.mmToIU( 30 );
1552
1553 return BOX2I( VECTOR2I( -width/2, -height/2 ), VECTOR2I( width, height ) );
1554 }
1555 else
1556 {
1557 return m_symbol->Flatten()->GetUnitBoundingBox( m_unit, m_bodyStyle );
1558 }
1559}
1560
1561
1562void SYMBOL_EDIT_FRAME::FocusOnItem( EDA_ITEM* aItem, bool aAllowScroll )
1563{
1564 static KIID lastBrightenedItemID( niluuid );
1565
1566 SCH_ITEM* lastItem = nullptr;
1567
1568 // nullptr will clear the current focus
1569 if( aItem != nullptr && !aItem->IsSCH_ITEM() )
1570 return;
1571
1572 if( m_symbol )
1573 {
1574 for( SCH_PIN* pin : m_symbol->GetPins() )
1575 {
1576 if( pin->m_Uuid == lastBrightenedItemID )
1577 lastItem = pin;
1578 }
1579
1580 std::vector<SCH_FIELD*> fields;
1581 m_symbol->GetFields( fields );
1582
1583 for( SCH_FIELD* field : fields )
1584 {
1585 if( field->m_Uuid == lastBrightenedItemID )
1586 lastItem = field;
1587 }
1588 }
1589
1590 if( lastItem && lastItem != aItem )
1591 {
1592 lastItem->ClearBrightened();
1593
1594 UpdateItem( lastItem );
1595 lastBrightenedItemID = niluuid;
1596 }
1597
1598 if( aItem )
1599 {
1600 if( !aItem->IsBrightened() )
1601 {
1602 aItem->SetBrightened();
1603
1604 UpdateItem( aItem );
1605 lastBrightenedItemID = aItem->m_Uuid;
1606 }
1607
1608 FocusOnLocation( VECTOR2I( aItem->GetFocusPosition().x, -aItem->GetFocusPosition().y ), aAllowScroll );
1609 }
1610}
1611
1612
1614{
1615 const std::string& payload = mail.GetPayload();
1616
1617 switch( mail.Command() )
1618 {
1619 case MAIL_LIB_EDIT:
1620 if( !payload.empty() )
1621 {
1622 wxString uri( payload );
1623 wxString libNickname;
1624 wxString msg;
1625
1627 std::optional<const LIBRARY_TABLE_ROW*> libTableRow = adapter->FindRowByURI( uri );
1628
1629 if( !libTableRow )
1630 {
1631 msg.Printf( _( "The current configuration does not include the symbol library '%s'." ),
1632 uri );
1633 msg += wxS( "\n" ) + _( "Use Manage Symbol Libraries to edit the configuration." );
1634 DisplayErrorMessage( this, _( "Library not found in symbol library table." ), msg );
1635 break;
1636 }
1637
1638 libNickname = ( *libTableRow )->Nickname();
1639
1640 if( !adapter->HasLibrary( libNickname, true ) )
1641 {
1642 msg.Printf( _( "The symbol library '%s' is not enabled in the current configuration." ),
1643 UnescapeString( libNickname ) );
1644 msg += wxS( "\n" ) + _( "Use Manage Symbol Libraries to edit the configuration." );
1645 DisplayErrorMessage( this, _( "Symbol library not enabled." ), msg );
1646 break;
1647 }
1648
1649 SetCurLib( libNickname );
1650
1651 if( m_treePane )
1652 {
1653 LIB_ID id( libNickname, wxEmptyString );
1654 GetLibTree()->SelectLibId( id );
1655 GetLibTree()->ExpandLibId( id );
1656 GetLibTree()->CenterLibId( id );
1657 }
1658 }
1659
1660 break;
1661
1662 case MAIL_RELOAD_LIB:
1663 {
1664 wxString currentLib = GetCurLib();
1665
1667
1668 // Check if the currently selected symbol library been removed or disabled.
1669 if( !currentLib.empty()
1670 && !PROJECT_SCH::SymbolLibAdapter( &Prj() )->HasLibrary( currentLib, true ) )
1671 {
1672 SetCurLib( wxEmptyString );
1673 emptyScreen();
1674 }
1675
1676 SyncLibraries( true );
1679
1680 break;
1681 }
1682
1684 {
1686 LIB_SYMBOL* symbol = GetCurSymbol();
1687
1688 wxLogTrace( traceLibWatch, "Received refresh symbol request for %s", payload );
1689
1690 if( !symbol )
1691 break;
1692
1693 wxString libName = symbol->GetLibId().GetLibNickname();
1694 std::optional<const LIBRARY_TABLE_ROW*> row = adapter->GetRow( libName );
1695
1696 if( !row )
1697 return;
1698
1699 wxFileName libfullname( LIBRARY_MANAGER::GetFullURI( *row, true ) );
1700
1701 wxFileName changedLib( mail.GetPayload() );
1702
1703 wxLogTrace( traceLibWatch, "Received refresh symbol request for %s, current symbols is %s",
1704 changedLib.GetFullPath(), libfullname.GetFullPath() );
1705
1706 if( changedLib == libfullname )
1707 {
1708 wxLogTrace( traceLibWatch, "Refreshing symbol %s", symbol->GetName() );
1709
1710 SetScreen( m_dummyScreen ); // UpdateLibraryBuffer will destroy the old screen
1711 m_libMgr->UpdateLibraryBuffer( libName );
1712
1713 if( LIB_SYMBOL* lib_symbol = m_libMgr->GetBufferedSymbol( symbol->GetName(), libName ) )
1714 {
1715 // The buffered screen for the symbol
1716 SCH_SCREEN* symbol_screen = m_libMgr->GetScreen( lib_symbol->GetName(), libName );
1717
1718 SetScreen( symbol_screen );
1719 SetCurSymbol( new LIB_SYMBOL( *lib_symbol ), false );
1721
1722 if( m_toolManager )
1724 }
1725 }
1726
1727 break;
1728 }
1729
1730 default:
1731 break;
1732 }
1733}
1734
1735
1736std::unique_ptr<GRID_HELPER> SYMBOL_EDIT_FRAME::MakeGridHelper()
1737{
1738 return std::make_unique<EE_GRID_HELPER>( m_toolManager );
1739}
1740
1741
1743{
1744 // switches currently used canvas ( Cairo / OpenGL):
1745 SCH_BASE_FRAME::SwitchCanvas( aCanvasType );
1746
1747 // Set options specific to symbol editor (axies are always enabled):
1748 GetCanvas()->GetGAL()->SetAxesEnabled( true );
1750}
1751
1752
1754{
1755 wxCHECK( m_libMgr, false );
1756
1757 return m_libMgr->HasModifications();
1758}
1759
1760
1762{
1763 wxCHECK( m_libMgr, false );
1764
1765 // Test if the currently edited symbol is modified
1767 return true;
1768
1769 // Test if any library has been modified
1770 for( const wxString& libName : m_libMgr->GetLibraryNames() )
1771 {
1772 if( m_libMgr->IsLibraryModified( libName ) && !m_libMgr->IsLibraryReadOnly( libName ) )
1773 return true;
1774 }
1775
1776 return false;
1777}
1778
1779
1781{
1782 if( aItemCount == 0 )
1783 return;
1784
1785 UNDO_REDO_CONTAINER& list = ( whichList == UNDO_LIST ) ? m_undoList : m_redoList;
1786
1787 if( aItemCount < 0 )
1788 {
1789 list.ClearCommandList();
1790 }
1791 else
1792 {
1793 for( int ii = 0; ii < aItemCount; ii++ )
1794 {
1795 if( list.m_CommandsList.size() == 0 )
1796 break;
1797
1798 PICKED_ITEMS_LIST* curr_cmd = list.m_CommandsList[0];
1799 list.m_CommandsList.erase( list.m_CommandsList.begin() );
1800
1801 curr_cmd->ClearListAndDeleteItems( []( EDA_ITEM* aItem )
1802 {
1803 delete aItem;
1804 } );
1805 delete curr_cmd; // Delete command
1806 }
1807 }
1808}
1809
1810
1812{
1813 return m_toolManager->GetTool<SCH_SELECTION_TOOL>()->GetSelection();
1814}
1815
1816
1818{
1819 std::unique_ptr<LIB_SYMBOL> symbol = aSymbol->GetLibSymbolRef()->Flatten();
1820 wxCHECK( symbol, /* void */ );
1821
1822 symbol->SetLibId( aSymbol->GetLibId() );
1823
1824 // Take in account the symbol orientation and mirroring. to calculate the field
1825 // positions in symbol editor (i.e. no rotation, no mirroring)
1826 int orientation = aSymbol->GetOrientation() & ~( SYM_MIRROR_X | SYM_MIRROR_Y );
1827 int mirror = aSymbol->GetOrientation() & ( SYM_MIRROR_X | SYM_MIRROR_Y );
1828
1829 std::vector<SCH_FIELD> fullSetOfFields;
1830
1831 for( const SCH_FIELD& field : aSymbol->GetFields() )
1832 {
1833 VECTOR2I pos = field.GetPosition() - aSymbol->GetPosition();
1834 SCH_FIELD libField( symbol.get(), field.GetId() );
1835
1836 libField = field;
1837
1838 // The inverse transform is mirroring before, rotate after
1839 switch( mirror )
1840 {
1841 case SYM_MIRROR_X: pos.y = -pos.y; break;
1842 case SYM_MIRROR_Y: pos.x = -pos.x; break;
1843 default: break;
1844 }
1845
1846 switch( orientation )
1847 {
1848 case SYM_ORIENT_90:
1849 std::swap( pos.x, pos.y );
1850 pos.x = - pos.x;
1851 break;
1852 case SYM_ORIENT_270:
1853 std::swap( pos.x, pos.y );
1854 pos.y = - pos.y;
1855 break;
1856 case SYM_ORIENT_180:
1857 pos.x = - pos.x;
1858 pos.y = - pos.y;
1859 break;
1860 default:
1861 break;
1862 }
1863
1864 libField.SetPosition( pos );
1865
1866 fullSetOfFields.emplace_back( std::move( libField ) );
1867 }
1868
1869 symbol->SetFields( fullSetOfFields );
1870
1871 if( m_symbol )
1872 SetCurSymbol( nullptr, false );
1873
1875 m_schematicSymbolUUID = aSymbol->m_Uuid;
1876 m_reference = symbol->GetReferenceField().GetText();
1877 m_unit = std::max( 1, aSymbol->GetUnit() );
1878 m_bodyStyle = std::max( 1, aSymbol->GetBodyStyle() );
1879
1880 // Optimize default edit options for this symbol
1881 // Usually if units are locked, graphic items are specific to each unit
1882 // and if units are interchangeable, graphic items are common to units
1884 tools->SetDrawSpecificUnit( symbol->UnitsLocked() );
1885
1886 // The buffered screen for the symbol
1887 SCH_SCREEN* tmpScreen = new SCH_SCREEN();
1888
1889 SetScreen( tmpScreen );
1890 SetCurSymbol( symbol.release(), true );
1891 setSymWatcher( nullptr );
1892
1895
1896 if( IsLibraryTreeShown() )
1898
1899 UpdateTitle();
1902
1903 // Let tools add things to the view if necessary
1904 if( m_toolManager )
1906
1908 GetCanvas()->Refresh();
1909}
1910
1911
1912bool SYMBOL_EDIT_FRAME::addLibTableEntry( const wxString& aLibFile, LIBRARY_TABLE_SCOPE aScope )
1913{
1914 wxFileName fn = aLibFile;
1915 wxFileName libTableFileName( Prj().GetProjectPath(), FILEEXT::SymbolLibraryTableFileName );
1916 wxString libNickname = fn.GetName();
1918 const ENV_VAR_MAP& envVars = Pgm().GetLocalEnvVariables();
1919
1920 if( adapter->HasLibrary( libNickname ) )
1921 {
1922 wxString tmp;
1923 int suffix = 1;
1924
1925 while( adapter->HasLibrary( libNickname ) )
1926 {
1927 tmp.Printf( "%s%d", fn.GetName(), suffix );
1928 libNickname = tmp;
1929 suffix += 1;
1930 }
1931 }
1932
1933 std::optional<LIBRARY_TABLE*> optTable =
1935 wxCHECK( optTable, false );
1936 LIBRARY_TABLE* table = *optTable;
1937
1938 LIBRARY_TABLE_ROW* row = &table->InsertRow();
1939
1940 row->SetNickname( libNickname );
1941
1942 // We cannot normalize against the current project path when saving to global table.
1943 wxString normalizedPath = NormalizePath( aLibFile, &envVars,
1944 aScope == LIBRARY_TABLE_SCOPE::PROJECT ? Prj().GetProjectPath()
1945 : wxString( wxEmptyString ) );
1946
1947 row->SetURI( normalizedPath );
1949
1950 bool success = true;
1951
1952 table->Save().map_error(
1953 [&]( const LIBRARY_ERROR& aError )
1954 {
1955 wxString msg = aScope == LIBRARY_TABLE_SCOPE::GLOBAL ? _( "Error saving global library table." )
1956 : _( "Error saving project library table." );
1957
1958 wxMessageDialog dlg( this, msg, _( "File Save Error" ), wxOK | wxICON_ERROR );
1959 dlg.SetExtendedMessage( aError.message );
1960 dlg.ShowModal();
1961
1962 success = false;
1963 } );
1964
1965 if( success )
1966 adapter->LoadOne( libNickname );
1967
1968 return success;
1969}
1970
1971
1972bool SYMBOL_EDIT_FRAME::replaceLibTableEntry( const wxString& aLibNickname, const wxString& aLibFile )
1973{
1975 LIBRARY_TABLE* table = nullptr;
1977
1978 // Check the global library table first because checking the project library table
1979 // checks the global library table as well due to library chaining.
1980 if( adapter->GetRow( aLibNickname, scope ) )
1981 {
1982 std::optional<LIBRARY_TABLE*> optTable = Pgm().GetLibraryManager().Table( LIBRARY_TABLE_TYPE::SYMBOL,
1983 scope );
1984 wxCHECK( optTable, false );
1985 table = *optTable;
1986 }
1987 else
1988 {
1990
1991 if( adapter->GetRow( aLibNickname, scope ) )
1992 {
1993 std::optional<LIBRARY_TABLE*> optTable = Pgm().GetLibraryManager().Table( LIBRARY_TABLE_TYPE::SYMBOL,
1994 scope );
1995
1996 if( optTable )
1997 table = *optTable;
1998 }
1999 }
2000
2001 wxCHECK( table, false );
2002
2003 auto optRow = adapter->GetRow( aLibNickname, scope );
2004 wxCHECK( optRow, false );
2005 LIBRARY_TABLE_ROW* row = *optRow;
2006
2007 const ENV_VAR_MAP& envVars = Pgm().GetLocalEnvVariables();
2008
2009 wxString projectPath;
2010
2011 if( scope == LIBRARY_TABLE_SCOPE::PROJECT )
2012 projectPath = Prj().GetProjectPath();
2013
2014 wxString normalizedPath = NormalizePath( aLibFile, &envVars, projectPath );
2015
2016 row->SetURI( normalizedPath );
2017 row->SetType( "KiCad" );
2018
2019 bool success = true;
2020
2021 table->Save().map_error(
2022 [&]( const LIBRARY_ERROR& aError )
2023 {
2024 wxString msg = scope == LIBRARY_TABLE_SCOPE::GLOBAL ? _( "Error saving global library table." )
2025 : _( "Error saving project library table." );
2026
2027 wxMessageDialog dlg( this, msg, _( "File Save Error" ), wxOK | wxICON_ERROR );
2028 dlg.SetExtendedMessage( aError.message );
2029 dlg.ShowModal();
2030
2031 success = false;
2032 } );
2033
2034 if( success )
2035 adapter->LoadOne( aLibNickname );
2036
2037 return success;
2038}
2039
2040
2042{
2043 return m_symbol && !m_symbol->IsRoot();
2044}
2045
2046
2051
2052
2053void SYMBOL_EDIT_FRAME::UpdateItem( EDA_ITEM* aItem, bool isAddOrDelete, bool aUpdateRtree )
2054{
2055 SCH_BASE_FRAME::UpdateItem( aItem, isAddOrDelete, aUpdateRtree );
2056
2057 if( EDA_TEXT* eda_text = dynamic_cast<EDA_TEXT*>( aItem ) )
2058 {
2059 eda_text->ClearBoundingBoxCache();
2060 eda_text->ClearRenderCache();
2061 }
2062}
2063
2064
2066{
2067 wxAuiPaneInfo& treePane = m_auimgr.GetPane( m_treePane );
2068 wxAuiPaneInfo& propertiesPane = m_auimgr.GetPane( PropertiesPaneName() );
2069 wxAuiPaneInfo& selectionFilterPane = m_auimgr.GetPane( wxS( "SelectionFilter" ) );
2070
2071 // Don't give the selection filter its own visibility controls; instead show it if
2072 // anything else is visible
2073 bool showFilter = ( treePane.IsShown() && treePane.IsDocked() )
2074 || ( propertiesPane.IsShown() && propertiesPane.IsDocked() );
2075
2076 selectionFilterPane.Show( showFilter );
2077}
2078
2079
2081{
2082 // Returns the current render option for invisible fields
2084}
2085
2086
2088{
2089 // Returns the current render option for invisible pins
2091}
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:197
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:163
static TOOL_ACTION copy
Definition actions.h:78
static TOOL_ACTION showDatasheet
Definition actions.h:266
static TOOL_ACTION toggleBoundingBoxes
Definition actions.h:156
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:250
static TOOL_ACTION save
Definition actions.h:58
static TOOL_ACTION zoomFitScreen
Definition actions.h:141
static TOOL_ACTION redo
Definition actions.h:76
static TOOL_ACTION deleteTool
Definition actions.h:86
static TOOL_ACTION zoomTool
Definition actions.h:145
static TOOL_ACTION selectionClear
Clear the current selection.
Definition actions.h:223
static TOOL_ACTION showProperties
Definition actions.h:265
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:198
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 setupUnits(APP_SETTINGS_BASE *aCfg)
virtual void SwitchCanvas(EDA_DRAW_PANEL_GAL::GAL_TYPE aCanvasType)
Change the current rendering backend.
GAL_DISPLAY_OPTIONS_IMPL & GetGalDisplayOptions()
Return a reference to the gal rendering options used by GAL for rendering.
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:279
const KIID m_Uuid
Definition eda_item.h:516
void ClearBrightened()
Definition eda_item.h:138
void SetBrightened()
Definition eda_item.h:135
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:292
void OnKiCadExit()
Definition kiway.cpp:754
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.
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:85
const LIB_ID & GetLibId() const override
Definition lib_symbol.h:155
bool UnitsLocked() const
Check whether symbol units are interchangeable.
Definition lib_symbol.h:291
bool IsRoot() const override
For symbols derived from other symbols, IsRoot() indicates no derivation.
Definition lib_symbol.h:205
wxString GetName() const override
Definition lib_symbol.h:148
bool IsMultiUnit() const override
Definition lib_symbol.h:746
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:783
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition pgm_base.h:128
virtual LIBRARY_MANAGER & GetLibraryManager() const
Definition pgm_base.h:130
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:223
@ SCH_LIBEDIT_CUR_SYMBOL
Definition project.h:224
virtual const wxString GetProjectPath() const
Return the full path of the project.
Definition project.cpp:165
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:337
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:348
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 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:811
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(const wxString &aNickname)
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:110
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.
std::map< wxString, ENV_VAR_ITEM > ENV_VAR_MAP
PROJECT & Prj()
Definition kicad.cpp:623
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.
Definition pgm_base.cpp:946
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
#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.