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 <symbol_library.h>
30#include <confirm.h>
31#include <core/kicad_algo.h>
32#include <eeschema_id.h>
33#include <eeschema_settings.h>
34#include <env_paths.h>
36#include <kidialog.h>
37#include <kiface_base.h>
38#include <kiplatform/app.h>
39#include <kiway_express.h>
40#include <symbol_edit_frame.h>
43#include <paths.h>
44#include <pgm_base.h>
45#include <project_sch.h>
46#include <sch_painter.h>
47#include <sch_view.h>
49#include <symbol_lib_table.h>
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>
85#include <panel_sym_lib_table.h>
86#include <string_utils.h>
87#include <wx/msgdlg.h>
88#include <wx/combobox.h>
89#include <wx/log.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 bool loadingCancelled = false;
151
152 {
153 // Preload libraries before using SyncLibraries the first time, as the preload is
154 // multi-threaded
155 WX_PROGRESS_REPORTER reporter( this, _( "Load Symbol Libraries" ), m_libMgr->GetLibraryCount(),
156 PR_CAN_ABORT );
157 m_libMgr->Preload( reporter );
158
159 loadingCancelled = reporter.IsCancelled();
160 wxSafeYield();
161 }
162
163 SyncLibraries( false, loadingCancelled );
164 m_treePane = new SYMBOL_TREE_PANE( this, m_libMgr );
165 m_treePane->GetLibTree()->SetSortMode( (LIB_TREE_MODEL_ADAPTER::SORT_MODE) m_settings->m_LibrarySortMode );
166
169
170 // Ensure axis are always drawn
172 gal_opts.m_axesEnabled = true;
173
176 GetScreen()->m_Center = true;
177
178 GetCanvas()->GetViewControls()->SetCrossHairCursorPosition( VECTOR2D( 0, 0 ), false );
179
180 GetRenderSettings()->LoadColors( GetColorSettings() );
181 GetRenderSettings()->m_IsSymbolEditor = true;
182 GetCanvas()->GetGAL()->SetAxesColor( m_colorSettings->GetColor( LAYER_SCHEMATIC_GRID_AXES ) );
183
184 setupTools();
186
188
192
193 UpdateTitle();
196
197 m_propertiesPanel = new SCH_PROPERTIES_PANEL( this, this );
198 m_propertiesPanel->SetSplitterProportion( m_settings->m_AuiPanels.properties_splitter );
199
201
202 m_auimgr.SetManagedWindow( this );
203
205
206 // Rows; layers 4 - 6
207 m_auimgr.AddPane( m_tbTopMain, EDA_PANE().HToolbar().Name( "TopMainToolbar" )
208 .Top().Layer( 6 ) );
209
210 m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( "MsgPanel" )
211 .Bottom().Layer( 6 ) );
212
213 // Columns; layers 1 - 3
214 m_auimgr.AddPane( m_treePane, EDA_PANE().Palette().Name( "LibraryTree" )
215 .Left().Layer( 3 )
216 .TopDockable( false ).BottomDockable( false )
217 .Caption( _( "Libraries" ) )
218 .MinSize( FromDIP( 250 ), -1 ).BestSize( FromDIP( 250 ), -1 ) );
219
221 // Show or hide m_propertiesPanel depending on current settings:
222 wxAuiPaneInfo& propertiesPaneInfo = m_auimgr.GetPane( PropertiesPaneName() );
223
225
226 wxAuiPaneInfo& selectionFilterPane = m_auimgr.GetPane( wxS( "SelectionFilter" ) );
227 // The selection filter doesn't need to grow in the vertical direction when docked
228 selectionFilterPane.dock_proportion = 0;
229
230 propertiesPaneInfo.Show( m_settings->m_AuiPanels.show_properties );
232
233 m_auimgr.AddPane( m_tbLeft, EDA_PANE().VToolbar().Name( "LeftToolbar" )
234 .Left().Layer( 2 ) );
235
236 m_auimgr.AddPane( m_tbRight, EDA_PANE().VToolbar().Name( "RightToolbar" )
237 .Right().Layer( 2 ) );
238
239 // Center
240 m_auimgr.AddPane( GetCanvas(), wxAuiPaneInfo().Name( "DrawFrame" )
241 .CentrePane() );
242
244
245 // Can't put this in LoadSettings, because it has to be called before setupTools :/
247 selTool->GetFilter() = GetSettings()->m_SelectionFilter;
248 m_selectionFilterPanel->SetCheckboxesFromFilter( selTool->GetFilter() );
249
250 if( m_settings->m_LibWidth > 0 )
251 SetAuiPaneSize( m_auimgr, m_auimgr.GetPane( "LibraryTree" ), m_settings->m_LibWidth, -1 );
252
253 Raise();
254 Show( true );
255
256 SyncView();
257 GetCanvas()->GetView()->UseDrawPriority( true );
258 GetCanvas()->GetGAL()->SetAxesEnabled( true );
259
261
262 // Set the working/draw area size to display a symbol to a reasonable value:
263 // A 600mm x 600mm with a origin at the area center looks like a large working area
264 double max_size_x = schIUScale.mmToIU( 600 );
265 double max_size_y = schIUScale.mmToIU( 600 );
266 BOX2D bbox;
267 bbox.SetOrigin( -max_size_x /2, -max_size_y/2 );
268 bbox.SetSize( max_size_x, max_size_y );
269 GetCanvas()->GetView()->SetBoundary( bbox );
270
272
274 DragAcceptFiles( true );
275
276 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "Library changes are unsaved" ) );
277
278 // Catch unhandled accelerator command characters that were no handled by the library tree
279 // panel.
281 Bind( wxEVT_CHAR_HOOK, &TOOL_DISPATCHER::DispatchWxEvent, m_toolDispatcher );
282
283 // Ensure the window is on top
284 Raise();
285
286 if( loadingCancelled )
287 ShowInfoBarWarning( _( "Symbol library loading canceled by user." ) );
288}
289
290
292{
293 // Shutdown all running tools
294 if( m_toolManager )
295 m_toolManager->ShutdownAllTools();
296
297 setSymWatcher( nullptr );
298
300 {
301 delete m_symbol;
302 m_symbol = nullptr;
303
304 SCH_SCREEN* screen = GetScreen();
305 delete screen;
307 }
308
309 // current screen is destroyed in EDA_DRAW_FRAME
311
313 Pgm().GetSettingsManager().Save( cfg );
314
315 delete m_libMgr;
316}
317
318
320{
321 wxCHECK_RET( m_settings, "Call to SYMBOL_EDIT_FRAME::LoadSettings with null m_settings" );
322
324
325 GetRenderSettings()->m_ShowPinsElectricalType = m_settings->m_ShowPinElectricalType;
326 GetRenderSettings()->m_ShowHiddenPins = m_settings->m_ShowHiddenPins;
327 GetRenderSettings()->m_ShowHiddenFields = m_settings->m_ShowHiddenFields;
328 GetRenderSettings()->m_ShowPinAltIcons = m_settings->m_ShowPinAltIcons;
329 GetRenderSettings()->SetDefaultFont( wxEmptyString );
330}
331
332
334{
335 wxCHECK_RET( m_settings, "Call to SYMBOL_EDIT_FRAME:SaveSettings with null m_settings" );
336
338
340
341 m_settings->m_ShowPinElectricalType = GetRenderSettings()->m_ShowPinsElectricalType;
342 m_settings->m_ShowHiddenPins = GetRenderSettings()->m_ShowHiddenPins;
343 m_settings->m_ShowHiddenFields = GetRenderSettings()->m_ShowHiddenFields;
344 m_settings->m_ShowPinAltIcons = GetRenderSettings()->m_ShowPinAltIcons;
345
346 m_settings->m_LibWidth = m_treePane->GetSize().x;
347
348 m_settings->m_LibrarySortMode = GetLibTree()->GetSortMode();
349
350 m_settings->m_AuiPanels.properties_splitter = m_propertiesPanel->SplitterProportion();
351 bool prop_shown = m_auimgr.GetPane( PropertiesPaneName() ).IsShown();
352 m_settings->m_AuiPanels.show_properties = prop_shown;
353
355 m_settings->m_SelectionFilter = selTool->GetFilter();
356}
357
358
360{
361 return static_cast<APP_SETTINGS_BASE*>( GetSettings() );
362}
363
364
366{
368
369 if( cfg && static_cast<SYMBOL_EDITOR_SETTINGS*>( cfg )->m_UseEeschemaColorSettings )
370 cfg = GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
371
372 return ::GetColorSettings( cfg ? cfg->m_ColorTheme : DEFAULT_THEME );
373}
374
375
377{
378 // Create the manager and dispatcher & route draw panel events to the dispatcher
380 m_toolManager->SetEnvironment( GetScreen(), GetCanvas()->GetView(),
381 GetCanvas()->GetViewControls(), GetSettings(), this );
382 m_actions = new SCH_ACTIONS();
384
385 // Register tools
386 m_toolManager->RegisterTool( new COMMON_CONTROL );
387 m_toolManager->RegisterTool( new COMMON_TOOLS );
388 m_toolManager->RegisterTool( new ZOOM_TOOL );
389 m_toolManager->RegisterTool( new SCH_SELECTION_TOOL );
390 m_toolManager->RegisterTool( new PICKER_TOOL );
391 m_toolManager->RegisterTool( new SCH_INSPECTION_TOOL );
392 m_toolManager->RegisterTool( new SYMBOL_EDITOR_PIN_TOOL );
393 m_toolManager->RegisterTool( new SYMBOL_EDITOR_DRAWING_TOOLS );
394 m_toolManager->RegisterTool( new SCH_POINT_EDITOR );
395 m_toolManager->RegisterTool( new SCH_FIND_REPLACE_TOOL );
396 m_toolManager->RegisterTool( new SYMBOL_EDITOR_MOVE_TOOL );
397 m_toolManager->RegisterTool( new SYMBOL_EDITOR_EDIT_TOOL );
398 m_toolManager->RegisterTool( new LIBRARY_EDITOR_CONTROL );
399 m_toolManager->RegisterTool( new SYMBOL_EDITOR_CONTROL );
400 m_toolManager->RegisterTool( new PROPERTIES_TOOL );
401 m_toolManager->RegisterTool( new EMBED_TOOL );
402 m_toolManager->InitTools();
403
404 // Run the selection tool, it is supposed to be always active
405 m_toolManager->InvokeTool( "common.InteractiveSelection" );
406
408}
409
410
412{
414
415 ACTION_MANAGER* mgr = m_toolManager->GetActionManager();
416 EDITOR_CONDITIONS cond( this );
417
418 wxASSERT( mgr );
419
420#define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
421#define CHECK( x ) ACTION_CONDITIONS().Check( x )
422
423 auto haveSymbolCond =
424 [this]( const SELECTION& )
425 {
426 return m_symbol;
427 };
428
429 auto isEditableCond =
430 [this]( const SELECTION& )
431 {
432 // Only root symbols from the new s-expression libraries or the schematic
433 // are editable.
434 return IsSymbolEditable() && !IsSymbolAlias();
435 };
436
437 auto isEditableInAliasCond =
438 [this]( const SELECTION& )
439 {
440 // Less restrictive than isEditableCond
441 // Symbols fields (root symbols and aliases) from the new s-expression libraries
442 // or in the schematic are editable.
443 return IsSymbolEditable();
444 };
445
446 auto symbolModifiedCondition =
447 [this]( const SELECTION& sel )
448 {
449 return m_libMgr && m_libMgr->IsSymbolModified( GetTargetLibId().GetLibItemName(),
450 GetTargetLibId().GetLibNickname() );
451 };
452
453 auto libSelectedCondition =
454 [this]( const SELECTION& sel )
455 {
456 return !GetTargetLibId().GetLibNickname().empty();
457 };
458
459 auto canEditProperties =
460 [this]( const SELECTION& sel )
461 {
463 };
464
465 auto saveSymbolAsCondition =
466 [this]( const SELECTION& aSel )
467 {
468 return getTargetSymbol() != nullptr;
469 };
470
471 const auto isSymbolFromSchematicCond =
472 [this]( const SELECTION& )
473 {
474 return IsSymbolFromSchematic();
475 };
476
477 // clang-format off
480 mgr->SetConditions( SCH_ACTIONS::saveLibraryAs, ENABLE( libSelectedCondition ) );
481 mgr->SetConditions( SCH_ACTIONS::saveSymbolAs, ENABLE( saveSymbolAsCondition ) );
482 mgr->SetConditions( SCH_ACTIONS::saveSymbolCopyAs, ENABLE( saveSymbolAsCondition ) );
485 mgr->SetConditions( SCH_ACTIONS::editLibSymbolWithLibEdit, ENABLE( isSymbolFromSchematicCond ) );
486
487 mgr->SetConditions( ACTIONS::undo, ENABLE( haveSymbolCond && cond.UndoAvailable() ) );
488 mgr->SetConditions( ACTIONS::redo, ENABLE( haveSymbolCond && cond.RedoAvailable() ) );
489 mgr->SetConditions( ACTIONS::revert, ENABLE( symbolModifiedCondition ) );
490
499
500 mgr->SetConditions( ACTIONS::cut, ENABLE( isEditableCond ) );
501 mgr->SetConditions( ACTIONS::copy, ENABLE( haveSymbolCond ) );
502 mgr->SetConditions( ACTIONS::copyAsText, ENABLE( haveSymbolCond ) );
503 mgr->SetConditions( ACTIONS::paste, ENABLE( isEditableCond &&
505 mgr->SetConditions( ACTIONS::doDelete, ENABLE( isEditableCond ) );
506 mgr->SetConditions( ACTIONS::duplicate, ENABLE( isEditableCond ) );
507 mgr->SetConditions( ACTIONS::selectAll, ENABLE( haveSymbolCond ) );
508 mgr->SetConditions( ACTIONS::unselectAll, ENABLE( haveSymbolCond ) );
509
510 // These actions in symbol editor when editing alias field rotations are allowed.
511 mgr->SetConditions( SCH_ACTIONS::rotateCW, ENABLE( isEditableInAliasCond ) );
512 mgr->SetConditions( SCH_ACTIONS::rotateCCW, ENABLE( isEditableInAliasCond ) );
513
514 mgr->SetConditions( SCH_ACTIONS::mirrorH, ENABLE( isEditableCond ) );
515 mgr->SetConditions( SCH_ACTIONS::mirrorV, ENABLE( isEditableCond ) );
516
519 // clang-format on
520
521 auto pinTypeCond =
522 [this]( const SELECTION& )
523 {
525 };
526
527 auto hiddenPinCond =
528 [this]( const SELECTION& )
529 {
531 };
532
533 auto hiddenFieldCond =
534 [this]( const SELECTION& )
535 {
537 };
538
539 auto showPinAltIconsCond =
540 [this]( const SELECTION& )
541 {
543 };
544
545 auto showLibraryTreeCond =
546 [this]( const SELECTION& )
547 {
548 return IsLibraryTreeShown();
549 };
550
551 auto propertiesCond =
552 [this] ( const SELECTION& )
553 {
554 return m_auimgr.GetPane( PropertiesPaneName() ).IsShown();
555 };
556
559 mgr->SetConditions( ACTIONS::showLibraryTree, CHECK( showLibraryTreeCond ) );
560 mgr->SetConditions( ACTIONS::showProperties, CHECK( propertiesCond ) );
561 mgr->SetConditions( SCH_ACTIONS::showHiddenPins, CHECK( hiddenPinCond ) );
562 mgr->SetConditions( SCH_ACTIONS::showHiddenFields, CHECK( hiddenFieldCond ) );
563 mgr->SetConditions( SCH_ACTIONS::togglePinAltIcons, CHECK( showPinAltIconsCond ) );
564
565 auto multiUnitModeCond =
566 [this]( const SELECTION& )
567 {
568 return m_symbol && m_symbol->IsMultiUnit() && !m_symbol->UnitsLocked();
569 };
570
571 auto multiBodyStyleModeCond =
572 [this]( const SELECTION& )
573 {
574 return m_symbol && m_symbol->IsMultiBodyStyle();
575 };
576
577 auto syncedPinsModeCond =
578 [this]( const SELECTION& )
579 {
580 return m_SyncPinEdit;
581 };
582
583 auto haveDatasheetCond =
584 [this]( const SELECTION& )
585 {
586 return m_symbol && !m_symbol->GetDatasheetField().GetText().IsEmpty();
587 };
588
589 mgr->SetConditions( ACTIONS::showDatasheet, ENABLE( haveDatasheetCond ) );
590 mgr->SetConditions( SCH_ACTIONS::symbolProperties, ENABLE( canEditProperties && haveSymbolCond ) );
591 mgr->SetConditions( SCH_ACTIONS::runERC, ENABLE( haveSymbolCond ) );
592 mgr->SetConditions( SCH_ACTIONS::pinTable, ENABLE( isEditableCond && haveSymbolCond ) );
593 mgr->SetConditions( SCH_ACTIONS::cycleBodyStyle, ENABLE( multiBodyStyleModeCond ) );
594
595 mgr->SetConditions( SCH_ACTIONS::toggleSyncedPinsMode, ACTION_CONDITIONS().Enable( multiUnitModeCond ).Check( syncedPinsModeCond ) );
596
597// Only enable a tool if the symbol is edtable
598#define EDIT_TOOL( tool ) ACTION_CONDITIONS().Enable( isEditableCond ).Check( cond.CurrentTool( tool ) )
599
612
613#undef CHECK
614#undef ENABLE
615#undef EDIT_TOOL
616}
617
618
620{
621 if( IsContentModified() )
622 {
623 SCH_EDIT_FRAME* schframe = (SCH_EDIT_FRAME*) Kiway().Player( FRAME_SCH, false );
624 wxString msg = _( "Save changes to '%s' before closing?" );
625
626 switch( UnsavedChangesDialog( this, wxString::Format( msg, m_reference ), nullptr ) )
627 {
628 case wxID_YES:
629 if( schframe && GetCurSymbol() ) // Should be always the case
631
632 break;
633
634 case wxID_NO:
635 break;
636
637 default:
638 case wxID_CANCEL:
639 return false;
640 }
641 }
642
643 if( doClose )
644 {
645 SetCurSymbol( nullptr, false );
646 UpdateTitle();
647 }
648
649 return true;
650}
651
652
653bool SYMBOL_EDIT_FRAME::canCloseWindow( wxCloseEvent& aEvent )
654{
655 // Shutdown blocks must be determined and vetoed as early as possible
657 && aEvent.GetId() == wxEVT_QUERY_END_SESSION
658 && IsContentModified() )
659 {
660 return false;
661 }
662
664 return false;
665
666 if( !saveAllLibraries( true ) )
667 return false;
668
669 // Save symbol tree column widths
670 m_libMgr->GetAdapter()->SaveSettings();
671
672 return true;
673}
674
675
677{
679
680 if( GetLibTree() )
682
683 delete m_toolManager;
684 m_toolManager = nullptr;
685
686 Destroy();
687}
688
689
691{
692 if( m_unitSelectBox )
693 {
694 if( m_unitSelectBox->GetCount() != 0 )
695 m_unitSelectBox->Clear();
696
697 if( !m_symbol || m_symbol->GetUnitCount() <= 1 )
698 {
699 m_unit = 1;
700 m_unitSelectBox->Append( wxEmptyString );
701 }
702 else
703 {
704 for( int i = 0; i < m_symbol->GetUnitCount(); i++ )
705 m_unitSelectBox->Append( m_symbol->GetUnitDisplayName( i + 1, true ) );
706 }
707
708 // Ensure the selected unit is compatible with the number of units of the current symbol:
709 if( m_symbol && m_symbol->GetUnitCount() < m_unit )
710 m_unit = 1;
711
712 m_unitSelectBox->SetSelection( ( m_unit > 0 ) ? m_unit - 1 : 0 );
713 }
714
716 {
717 if( m_bodyStyleSelectBox->GetCount() != 0 )
718 m_bodyStyleSelectBox->Clear();
719
720 if( !m_symbol || !m_symbol->IsMultiBodyStyle() )
721 {
722 m_bodyStyle = 1;
723 m_bodyStyleSelectBox->Append( wxEmptyString );
724 }
725 else if( m_symbol && m_symbol->HasDeMorganBodyStyles() )
726 {
727 m_bodyStyleSelectBox->Append( wxGetTranslation( DEMORGAN_STD ) );
728 m_bodyStyleSelectBox->Append( wxGetTranslation( DEMORGAN_ALT ) );
729 }
730 else
731 {
732 for( int i = 0; i < m_symbol->GetBodyStyleCount(); i++ )
733 m_bodyStyleSelectBox->Append( m_symbol->GetBodyStyleNames()[i] );
734 }
735
736 // Ensure the selected body style is compatible with the number of body styles of the current symbol:
737 if( m_symbol && m_symbol->GetBodyStyleCount() < m_bodyStyle )
738 m_bodyStyle = 1;
739
740 m_bodyStyleSelectBox->SetSelection( ( m_bodyStyle > 0 ) ? m_bodyStyle - 1 : 0 );
741 }
742}
743
744
746{
747 if( !m_propertiesPanel )
748 return;
749
750 bool show = !m_propertiesPanel->IsShownOnScreen();
751
752 wxAuiPaneInfo& propertiesPaneInfo = m_auimgr.GetPane( PropertiesPaneName() );
753 propertiesPaneInfo.Show( show );
755
756 if( show )
757 {
758 SetAuiPaneSize( m_auimgr, propertiesPaneInfo,
759 m_settings->m_AuiPanels.properties_panel_width, -1 );
760 }
761 else
762 {
763 m_settings->m_AuiPanels.properties_panel_width = m_propertiesPanel->GetSize().x;
764 }
765
766 m_auimgr.Update();
767 Refresh();
768}
769
770
772{
773 wxAuiPaneInfo& treePane = m_auimgr.GetPane( m_treePane );
774 treePane.Show( !IsLibraryTreeShown() );
776 m_auimgr.Update();
777 Refresh();
778}
779
780
782{
783 return const_cast<wxAuiManager&>( m_auimgr ).GetPane( m_treePane ).IsShown();
784}
785
786
791
792
794{
795 m_treePane->Freeze();
796 m_libMgr->GetAdapter()->Freeze();
797}
798
799
801{
802 m_libMgr->GetAdapter()->Thaw();
803 m_treePane->Thaw();
804}
805
806
807void SYMBOL_EDIT_FRAME::OnExitKiCad( wxCommandEvent& event )
808{
809 Kiway().OnKiCadExit();
810}
811
812
813void SYMBOL_EDIT_FRAME::OnUpdateUnitNumber( wxUpdateUIEvent& event )
814{
815 event.Enable( m_symbol && m_symbol->GetUnitCount() > 1 );
816}
817
818
819void SYMBOL_EDIT_FRAME::OnSelectUnit( wxCommandEvent& event )
820{
821 if( event.GetSelection() == wxNOT_FOUND )
822 return;
823
824 SetUnit( event.GetSelection() + 1 );
825}
826
827
828void SYMBOL_EDIT_FRAME::OnUpdateBodyStyle( wxUpdateUIEvent& event )
829{
830 event.Enable( m_symbol && m_symbol->GetBodyStyleCount() > 1 );
831}
832
833
834void SYMBOL_EDIT_FRAME::OnSelectBodyStyle( wxCommandEvent& event )
835{
836 if( event.GetSelection() == wxNOT_FOUND )
837 return;
838
839 SetBodyStyle( event.GetSelection() + 1 );
840}
841
842
844{
845 if( m_symbol )
846 {
847 SYMBOL_LIB_TABLE_ROW* row = m_libMgr->GetLibrary( m_symbol->GetLibNickname() );
848
849 if( row && row->GetType() == SCH_IO_MGR::ShowType( SCH_IO_MGR::SCH_LEGACY ) )
850 return true;
851 }
852
853 return false;
854}
855
856
858{
859 wxString libNickname = Prj().GetRString( PROJECT::SCH_LIBEDIT_CUR_LIB );
860
861 if( !libNickname.empty() )
862 {
863 if( !PROJECT_SCH::SchSymbolLibTable( &Prj() )->HasLibrary( libNickname ) )
864 {
865 Prj().SetRString( PROJECT::SCH_LIBEDIT_CUR_LIB, wxEmptyString );
866 libNickname = wxEmptyString;
867 }
868 }
869
870 return libNickname;
871}
872
873
874wxString SYMBOL_EDIT_FRAME::SetCurLib( const wxString& aLibNickname )
875{
876 wxString old = GetCurLib();
877
878 if( aLibNickname.empty() || !PROJECT_SCH::SchSymbolLibTable( &Prj() )->HasLibrary( aLibNickname ) )
879 Prj().SetRString( PROJECT::SCH_LIBEDIT_CUR_LIB, wxEmptyString );
880 else
882
883 return old;
884}
885
886
887void SYMBOL_EDIT_FRAME::SetCurSymbol( LIB_SYMBOL* aSymbol, bool aUpdateZoom )
888{
889 wxCHECK( m_toolManager, /* void */ );
890
892 GetCanvas()->GetView()->Clear();
893 delete m_symbol;
894
895 m_symbol = aSymbol;
896
897 // select the current symbol in the tree widget
899 GetLibTree()->SelectLibId( m_symbol->GetLibId() );
900 else
901 GetLibTree()->Unselect();
902
903 wxString symbolName;
904 wxString libName;
905
906 if( m_symbol )
907 {
908 symbolName = m_symbol->GetName();
909 libName = UnescapeString( m_symbol->GetLibId().GetLibNickname() );
910 }
911
912 // retain in case this wxFrame is re-opened later on the same PROJECT
914
915 // Ensure synchronized pin edit can be enabled only symbols with interchangeable units
916 m_SyncPinEdit = aSymbol && aSymbol->IsRoot() && aSymbol->IsMultiUnit() && !aSymbol->UnitsLocked();
917
919
927
928 if( aUpdateZoom )
930
931 GetCanvas()->Refresh();
932
933 WX_INFOBAR& infobar = *GetInfoBar();
934 infobar.RemoveAllButtons();
935
936 wxArrayString msgs;
937 int infobarFlags = wxICON_INFORMATION;
938
940 {
941 msgs.push_back( wxString::Format( _( "Editing symbol %s from schematic. Saving will "
942 "update the schematic only." ),
943 m_reference ) );
944
945 wxString link = wxString::Format( _( "Open symbol from library %s" ), libName );
946 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( &infobar, wxID_ANY, link, wxEmptyString );
947
948 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
949 [this, symbolName, libName]( wxHyperlinkEvent& aEvent )
950 {
952 } ) );
953
954 infobar.AddButton( button );
955 }
956 else if( IsSymbolFromLegacyLibrary() )
957 {
958 msgs.push_back( _( "Symbols in legacy libraries are not editable. Use Manage Symbol "
959 "Libraries to migrate to current format." ) );
960
961 wxString link = _( "Manage symbol libraries" );
962 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( &infobar, wxID_ANY, link, wxEmptyString );
963
964 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
965 [this]( wxHyperlinkEvent& aEvent )
966 {
968 } ) );
969
970 infobar.AddButton( button );
971 }
972 else if( IsSymbolAlias() )
973 {
974 msgs.push_back( wxString::Format( _( "Symbol %s is a derived symbol. Symbol graphics will "
975 "not be editable." ),
976 UnescapeString( symbolName ) ) );
977
978 // Don't assume the parent symbol shared pointer is still valid.
979 if( std::shared_ptr<LIB_SYMBOL> rootSymbol = m_symbol->GetRootSymbol() )
980 {
981 int unit = GetUnit();
982 int bodyStyle = GetBodyStyle();
983 wxString rootSymbolName = rootSymbol->GetName();
984 wxString link = wxString::Format( _( "Open %s" ), UnescapeString( rootSymbolName ) );
985
986 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( &infobar, wxID_ANY, link,
987 wxEmptyString );
988
989 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
990 [this, rootSymbolName, unit, bodyStyle]( wxHyperlinkEvent& aEvent )
991 {
992 LoadSymbolFromCurrentLib( rootSymbolName, unit, bodyStyle );
993 } ) );
994
995 infobar.AddButton( button );
996 }
997 }
998
999 if( m_symbol
1001 && m_libMgr->IsLibraryReadOnly( m_symbol->GetLibId().GetFullLibraryName() ) )
1002 {
1003 msgs.push_back( _( "Library is read-only. Changes cannot be saved to this library." ) );
1004
1005 wxString link = wxString::Format( _( "Create an editable copy" ) );
1006 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( &infobar, wxID_ANY, link, wxEmptyString );
1007
1008 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
1009 [this, symbolName, libName]( wxHyperlinkEvent& aEvent )
1010 {
1011 wxString msg = wxString::Format( _( "Create an editable copy of the symbol or "
1012 "the entire library (%s)?" ),
1013 libName );
1014
1015 KIDIALOG errorDlg( this, msg, _( "Select type of item to save" ),
1016 wxYES_NO | wxCANCEL | wxICON_QUESTION );
1017 // These buttons are in a weird order(?)
1018 errorDlg.SetYesNoCancelLabels( _( "Copy symbol" ), _( "Cancel" ),
1019 _( "Copy library" ) );
1020
1021 int choice = errorDlg.ShowModal();
1022
1023 switch( choice )
1024 {
1025 case wxID_YES:
1026 SaveSymbolCopyAs( true );
1027 break;
1028 case wxID_CANCEL:
1029 SaveLibraryAs();
1030 break;
1031 default:
1032 // Do nothing
1033 break;
1034 }
1035 } ) );
1036
1037 infobar.AddButton( button );
1038 }
1039
1040 if( msgs.empty() )
1041 {
1042 infobar.Dismiss();
1043 }
1044 else
1045 {
1046 wxString msg = wxJoin( msgs, '\n', '\0' );
1047 infobar.ShowMessage( msg, infobarFlags );
1048 }
1049}
1050
1051
1057
1058
1060{
1062
1064
1065 if( !IsSymbolFromSchematic() )
1067
1068 if( m_isClosing )
1069 return;
1070
1072
1073 if( !GetTitle().StartsWith( "*" ) )
1074 UpdateTitle();
1075}
1076
1077
1079{
1080 wxCHECK( aUnit > 0 && aUnit <= GetCurSymbol()->GetUnitCount(), /* void*/ );
1081
1082 if( m_unit == aUnit )
1083 return;
1084
1087
1088 m_unit = aUnit;
1089
1090 if( m_unitSelectBox->GetSelection() != ( m_unit - 1 ) )
1091 m_unitSelectBox->SetSelection( m_unit - 1 );
1092
1094 RebuildView();
1096}
1097
1098
1100{
1101 wxCHECK( aBodyStyle > 0 && aBodyStyle <= GetCurSymbol()->GetBodyStyleCount(), /* void */ );
1102
1103 if( m_bodyStyle == aBodyStyle )
1104 return;
1105
1108
1109 m_bodyStyle = aBodyStyle;
1110
1111 if( m_bodyStyleSelectBox->GetSelection() != ( m_bodyStyle - 1 ) )
1112 m_bodyStyleSelectBox->SetSelection( m_bodyStyle - 1 );
1113
1114
1116 RebuildView();
1118}
1119
1120
1122{
1123 return m_SyncPinEdit && m_symbol && m_symbol->IsMultiUnit() && !m_symbol->UnitsLocked();
1124}
1125
1126
1127wxString SYMBOL_EDIT_FRAME::AddLibraryFile( bool aCreateNew )
1128{
1129 wxFileName fn = m_libMgr->GetUniqueLibraryName();
1130 bool useGlobalTable = false;
1131 FILEDLG_HOOK_NEW_LIBRARY tableChooser( useGlobalTable );
1132
1133 if( !LibraryFileBrowser( aCreateNew ? _( "New Symbol Library" ) : _( "Add Symbol Library" ),
1134 !aCreateNew, fn, FILEEXT::KiCadSymbolLibFileWildcard(),
1135 FILEEXT::KiCadSymbolLibFileExtension, false, &tableChooser ) )
1136 {
1137 return wxEmptyString;
1138 }
1139
1140 wxString libName = fn.GetName();
1141
1142 if( libName.IsEmpty() )
1143 return wxEmptyString;
1144
1145 useGlobalTable = tableChooser.GetUseGlobalTable();
1146
1147 if( m_libMgr->LibraryExists( libName ) )
1148 {
1149 DisplayError( this, wxString::Format( _( "Library '%s' already exists." ), libName ) );
1150 return wxEmptyString;
1151 }
1152
1153 SYMBOL_LIB_TABLE* libTable = useGlobalTable ? &SYMBOL_LIB_TABLE::GetGlobalLibTable()
1155
1156 if( aCreateNew )
1157 {
1158 if( !m_libMgr->CreateLibrary( fn.GetFullPath(), *libTable ) )
1159 {
1160 DisplayError( this, wxString::Format( _( "Could not create the library file '%s'.\n"
1161 "Make sure you have write permissions and "
1162 "try again." ),
1163 fn.GetFullPath() ) );
1164 return wxEmptyString;
1165 }
1166 }
1167 else
1168 {
1169 if( !m_libMgr->AddLibrary( fn.GetFullPath(), *libTable ) )
1170 {
1171 DisplayError( this, _( "Could not open the library file." ) );
1172 return wxEmptyString;
1173 }
1174 }
1175
1176 bool globalTable = ( libTable == &SYMBOL_LIB_TABLE::GetGlobalLibTable() );
1177 saveSymbolLibTables( globalTable, !globalTable );
1178
1179 std::string packet = fn.GetFullPath().ToStdString();
1181
1182 return fn.GetFullPath();
1183}
1184
1185
1186void SYMBOL_EDIT_FRAME::DdAddLibrary( wxString aLibFile )
1187{
1188 wxFileName fn = wxFileName( aLibFile );
1189 wxString libName = fn.GetName();
1190
1191 if( libName.IsEmpty() )
1192 return;
1193
1194 if( m_libMgr->LibraryExists( libName ) )
1195 {
1196 DisplayError( this, wxString::Format( _( "Library '%s' already exists." ), libName ) );
1197 return;
1198 }
1199
1200 if( !m_libMgr->AddLibrary( fn.GetFullPath(), *PROJECT_SCH::SchSymbolLibTable( &Prj() ) ) )
1201 {
1202 DisplayError( this, _( "Could not open the library file." ) );
1203 return;
1204 }
1205
1206 saveSymbolLibTables( false, true );
1207
1208 std::string packet = fn.GetFullPath().ToStdString();
1210}
1211
1212
1214{
1215 return GetLibTree()->GetSelectedLibId( aUnit );
1216}
1217
1218
1223
1224int SYMBOL_EDIT_FRAME::GetTreeLIBIDs( std::vector<LIB_ID>& aSelection ) const
1225{
1226 return GetLibTree()->GetSelectedLibIds( aSelection );
1227}
1228
1229
1231{
1232 if( IsLibraryTreeShown() )
1233 {
1234 LIB_ID libId = GetTreeLIBID();
1235
1236 if( libId.IsValid() )
1237 return m_libMgr->GetSymbol( libId.GetLibItemName(), libId.GetLibNickname() );
1238 }
1239
1240 return m_symbol;
1241}
1242
1243
1245{
1246 LIB_ID id;
1247
1248 if( IsLibraryTreeShown() )
1249 id = GetTreeLIBID();
1250
1251 if( id.GetLibNickname().empty() && m_symbol )
1252 id = m_symbol->GetLibId();
1253
1254 return id;
1255}
1256
1257
1258std::vector<LIB_ID> SYMBOL_EDIT_FRAME::GetSelectedLibIds() const
1259{
1260 std::vector<LIB_ID> ids;
1261 GetTreeLIBIDs( ids );
1262 return ids;
1263}
1264
1265
1267{
1268 return GetTargetLibId().GetLibNickname();
1269}
1270
1271
1272void SYMBOL_EDIT_FRAME::SyncLibraries( bool aShowProgress, bool aPreloadCancelled,
1273 const wxString& aForceRefresh )
1274{
1275 LIB_ID selected;
1276
1277 if( m_treePane )
1278 selected = GetLibTree()->GetSelectedLibId();
1279
1280 if( aShowProgress )
1281 {
1282 APP_PROGRESS_DIALOG progressDlg( _( "Loading Symbol Libraries" ), wxEmptyString,
1283 m_libMgr->GetAdapter()->GetLibrariesCount(), this );
1284
1285 m_libMgr->Sync( aForceRefresh,
1286 [&]( int progress, int max, const wxString& libName )
1287 {
1288 progressDlg.Update( progress, wxString::Format( _( "Loading library '%s'..." ),
1289 libName ) );
1290 } );
1291 }
1292 else if( !aPreloadCancelled )
1293 {
1294 m_libMgr->Sync( aForceRefresh,
1295 [&]( int progress, int max, const wxString& libName )
1296 {
1297 } );
1298 }
1299
1300 if( m_treePane )
1301 {
1302 wxDataViewItem found;
1303
1304 if( selected.IsValid() )
1305 {
1306 // Check if the previously selected item is still valid,
1307 // if not - it has to be unselected to prevent crash
1308 found = m_libMgr->GetAdapter()->FindItem( selected );
1309
1310 if( !found )
1311 GetLibTree()->Unselect();
1312 }
1313
1314 GetLibTree()->Regenerate( true );
1315
1316 // Try to select the parent library, in case the symbol is not found
1317 if( !found && selected.IsValid() )
1318 {
1319 selected.SetLibItemName( "" );
1320 found = m_libMgr->GetAdapter()->FindItem( selected );
1321
1322 if( found )
1323 GetLibTree()->SelectLibId( selected );
1324 }
1325
1326 // If no selection, see if there's a current symbol to centre
1327 if( !selected.IsValid() && m_symbol )
1328 {
1329 LIB_ID current( GetCurLib(), m_symbol->GetName() );
1330 GetLibTree()->CenterLibId( current );
1331 }
1332 }
1333}
1334
1335
1340
1341
1343{
1344 GetLibTree()->SelectLibId( aLibID );
1345}
1346
1347
1348void SYMBOL_EDIT_FRAME::UpdateLibraryTree( const wxDataViewItem& aTreeItem, LIB_SYMBOL* aSymbol )
1349{
1350 if( aTreeItem.IsOk() ) // Can be not found in tree if the current footprint is imported
1351 // from file therefore not yet in tree.
1352 {
1353 static_cast<LIB_TREE_NODE_ITEM*>( aTreeItem.GetID() )->Update( aSymbol );
1355 }
1356}
1357
1358
1359bool SYMBOL_EDIT_FRAME::backupFile( const wxFileName& aOriginalFile, const wxString& aBackupExt )
1360{
1361 if( aOriginalFile.FileExists() )
1362 {
1363 wxFileName backupFileName( aOriginalFile );
1364 backupFileName.SetExt( aBackupExt );
1365
1366 if( backupFileName.FileExists() )
1367 wxRemoveFile( backupFileName.GetFullPath() );
1368
1369 if( !wxCopyFile( aOriginalFile.GetFullPath(), backupFileName.GetFullPath() ) )
1370 {
1371 DisplayError( this, wxString::Format( _( "Failed to save backup to '%s'." ),
1372 backupFileName.GetFullPath() ) );
1373 return false;
1374 }
1375 }
1376
1377 return true;
1378}
1379
1380
1382{
1383 if( m_symbol && !GetCurLib().IsEmpty() && GetScreen()->IsContentModified() )
1384 m_libMgr->UpdateSymbol( m_symbol, GetCurLib() ); // UpdateSymbol() makes a copy
1385}
1386
1387
1389{
1390 // This will return the root symbol of any alias
1391 LIB_SYMBOL* symbol = m_libMgr->GetBufferedSymbol( aLibId.GetLibItemName(),
1392 aLibId.GetLibNickname() );
1393
1394 // Now we can compare the libId of the current symbol and the root symbol
1395 return ( symbol && m_symbol && symbol->GetLibId() == m_symbol->GetLibId() );
1396}
1397
1398
1400{
1401 GetLibTree()->Unselect();
1402 SetCurLib( wxEmptyString );
1403 SetCurSymbol( nullptr, false );
1407 Refresh();
1408}
1409
1410
1412{
1414
1416 {
1417 GetRenderSettings()->m_ShowPinsElectricalType = cfg->m_ShowPinElectricalType;
1418 GetRenderSettings()->m_ShowHiddenPins = cfg->m_ShowHiddenPins;
1419 GetRenderSettings()->m_ShowHiddenFields = cfg->m_ShowHiddenFields;
1420 GetRenderSettings()->m_ShowPinAltIcons = cfg->m_ShowPinAltIcons;
1421
1422 GetGalDisplayOptions().ReadWindowSettings( cfg->m_Window );
1423 }
1424
1425 if( m_symbol )
1426 m_symbol->ClearCaches();
1427
1429
1431 GetCanvas()->Refresh();
1432
1434
1435 if( aFlags & ENVVARS_CHANGED )
1436 SyncLibraries( true );
1437
1438 Layout();
1439 SendSizeEvent();
1440}
1441
1442
1444{
1445 // call my base class
1447
1448 // tooltips in toolbars
1450
1451 // For some obscure reason, the AUI manager hides the first modified pane.
1452 // So force show panes
1453 wxAuiPaneInfo& tree_pane_info = m_auimgr.GetPane( m_treePane );
1454 bool tree_shown = tree_pane_info.IsShown();
1455 tree_pane_info.Caption( _( "Libraries" ) );
1456 tree_pane_info.Show( tree_shown );
1457 m_auimgr.Update();
1458
1460
1461 // status bar
1463
1464 if( GetRenderSettings()->m_ShowPinsElectricalType )
1465 {
1467 GetCanvas()->Refresh();
1468 }
1469
1470 UpdateTitle();
1471}
1472
1473
1475{
1476 SCH_BASE_FRAME::SetScreen( aScreen );
1477
1478 // Let tools add things to the view if necessary
1479 if( m_toolManager )
1481}
1482
1483
1501
1502
1504{
1505 SyncLibraries( true );
1506
1507 if( m_symbol )
1508 {
1509 SCH_SELECTION_TOOL* selectionTool = m_toolManager->GetTool<SCH_SELECTION_TOOL>();
1510 SCH_SELECTION& selection = selectionTool->GetSelection();
1511
1512 for( SCH_ITEM& item : m_symbol->GetDrawItems() )
1513 {
1514 if( !alg::contains( selection, &item ) )
1515 item.ClearSelected();
1516 else
1517 item.SetSelected();
1518 }
1519
1520 m_symbol->ClearCaches();
1521 }
1522
1523 RebuildView();
1524}
1525
1526
1527const BOX2I SYMBOL_EDIT_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
1528{
1529 if( !m_symbol )
1530 {
1531 // Gives a reasonable drawing area size
1532 int width = schIUScale.mmToIU( 50 );
1533 int height = schIUScale.mmToIU( 30 );
1534
1535 return BOX2I( VECTOR2I( -width/2, -height/2 ), VECTOR2I( width, height ) );
1536 }
1537 else
1538 {
1539 return m_symbol->Flatten()->GetUnitBoundingBox( m_unit, m_bodyStyle );
1540 }
1541}
1542
1543
1544void SYMBOL_EDIT_FRAME::FocusOnItem( EDA_ITEM* aItem, bool aAllowScroll )
1545{
1546 static KIID lastBrightenedItemID( niluuid );
1547
1548 SCH_ITEM* lastItem = nullptr;
1549
1550 // nullptr will clear the current focus
1551 if( aItem != nullptr && !aItem->IsSCH_ITEM() )
1552 return;
1553
1554 if( m_symbol )
1555 {
1556 for( SCH_PIN* pin : m_symbol->GetPins() )
1557 {
1558 if( pin->m_Uuid == lastBrightenedItemID )
1559 lastItem = pin;
1560 }
1561
1562 std::vector<SCH_FIELD*> fields;
1563 m_symbol->GetFields( fields );
1564
1565 for( SCH_FIELD* field : fields )
1566 {
1567 if( field->m_Uuid == lastBrightenedItemID )
1568 lastItem = field;
1569 }
1570 }
1571
1572 if( lastItem && lastItem != aItem )
1573 {
1574 lastItem->ClearBrightened();
1575
1576 UpdateItem( lastItem );
1577 lastBrightenedItemID = niluuid;
1578 }
1579
1580 if( aItem )
1581 {
1582 if( !aItem->IsBrightened() )
1583 {
1584 aItem->SetBrightened();
1585
1586 UpdateItem( aItem );
1587 lastBrightenedItemID = aItem->m_Uuid;
1588 }
1589
1590 FocusOnLocation( VECTOR2I( aItem->GetFocusPosition().x, -aItem->GetFocusPosition().y ), aAllowScroll );
1591 }
1592}
1593
1594
1596{
1597 const std::string& payload = mail.GetPayload();
1598
1599 switch( mail.Command() )
1600 {
1601 case MAIL_LIB_EDIT:
1602 if( !payload.empty() )
1603 {
1604 wxString libFileName( payload );
1605 wxString libNickname;
1606 wxString msg;
1607
1609 const LIB_TABLE_ROW* libTableRow = libTable->FindRowByURI( libFileName );
1610
1611 if( !libTableRow )
1612 {
1613 msg.Printf( _( "The current configuration does not include the symbol library '%s'." ),
1614 libFileName );
1615 msg += wxS( "\n" ) + _( "Use Manage Symbol Libraries to edit the configuration." );
1616 DisplayErrorMessage( this, _( "Library not found in symbol library table." ), msg );
1617 break;
1618 }
1619
1620 libNickname = libTableRow->GetNickName();
1621
1622 if( !libTable->HasLibrary( libNickname, true ) )
1623 {
1624 msg.Printf( _( "The symbol library '%s' is not enabled in the current configuration." ),
1625 UnescapeString( libNickname ) );
1626 msg += wxS( "\n" ) + _( "Use Manage Symbol Libraries to edit the configuration." );
1627 DisplayErrorMessage( this, _( "Symbol library not enabled." ), msg );
1628 break;
1629 }
1630
1631 SetCurLib( libNickname );
1632
1633 if( m_treePane )
1634 {
1635 LIB_ID id( libNickname, wxEmptyString );
1636 GetLibTree()->SelectLibId( id );
1637 GetLibTree()->ExpandLibId( id );
1638 GetLibTree()->CenterLibId( id );
1639 }
1640 }
1641
1642 break;
1643
1644 case MAIL_RELOAD_LIB:
1645 {
1646 wxString currentLib = GetCurLib();
1648
1650
1651 // Check if the currently selected symbol library been removed or disabled.
1652 if( !currentLib.empty() && libTable && !libTable->HasLibrary( currentLib, true ) )
1653 {
1654 SetCurLib( wxEmptyString );
1655 emptyScreen();
1656 }
1657
1658 SyncLibraries( true );
1661
1662 break;
1663 }
1664
1666 {
1668 LIB_SYMBOL* symbol = GetCurSymbol();
1669
1670 wxLogTrace( "KICAD_LIB_WATCH", "Received refresh symbol request for %s", payload );
1671
1672 if( !tbl || !symbol )
1673 break;
1674
1675 wxString libName = symbol->GetLibId().GetLibNickname();
1676 const SYMBOL_LIB_TABLE_ROW* row = tbl->FindRow( libName );
1677
1678 if( !row )
1679 return;
1680
1681 wxFileName libfullname( row->GetFullURI( true ) );
1682
1683 wxFileName changedLib( mail.GetPayload() );
1684 wxLogTrace( "KICAD_LIB_WATCH", "Received refresh symbol request for %s, current symbols is %s",
1685 changedLib.GetFullPath(), libfullname.GetFullPath() );
1686
1687 if( changedLib == libfullname )
1688 {
1689 wxLogTrace( "KICAD_LIB_WATCH", "Refreshing symbol %s", symbol->GetName() );
1690
1691 SetScreen( m_dummyScreen ); // UpdateLibraryBuffer will destroy the old screen
1692 m_libMgr->UpdateLibraryBuffer( libName );
1693
1694 if( LIB_SYMBOL* lib_symbol = m_libMgr->GetBufferedSymbol( symbol->GetName(), libName ) )
1695 {
1696 // The buffered screen for the symbol
1697 SCH_SCREEN* symbol_screen = m_libMgr->GetScreen( lib_symbol->GetName(), libName );
1698
1699 SetScreen( symbol_screen );
1700 SetCurSymbol( new LIB_SYMBOL( *lib_symbol ), false );
1702
1703 if( m_toolManager )
1705 }
1706 }
1707
1708 break;
1709 }
1710
1711 default:
1712 ;
1713 }
1714}
1715
1716
1717std::unique_ptr<GRID_HELPER> SYMBOL_EDIT_FRAME::MakeGridHelper()
1718{
1719 return std::make_unique<EE_GRID_HELPER>( m_toolManager );
1720}
1721
1722
1724{
1725 // switches currently used canvas ( Cairo / OpenGL):
1726 SCH_BASE_FRAME::SwitchCanvas( aCanvasType );
1727
1728 // Set options specific to symbol editor (axies are always enabled):
1729 GetCanvas()->GetGAL()->SetAxesEnabled( true );
1731}
1732
1733
1735{
1736 wxCHECK( m_libMgr, false );
1737
1738 return m_libMgr->HasModifications();
1739}
1740
1741
1743{
1744 wxCHECK( m_libMgr, false );
1745
1746 // Test if the currently edited symbol is modified
1748 return true;
1749
1750 // Test if any library has been modified
1751 for( const wxString& libName : m_libMgr->GetLibraryNames() )
1752 {
1753 if( m_libMgr->IsLibraryModified( libName ) && !m_libMgr->IsLibraryReadOnly( libName ) )
1754 return true;
1755 }
1756
1757 return false;
1758}
1759
1760
1762{
1763 if( aItemCount == 0 )
1764 return;
1765
1766 UNDO_REDO_CONTAINER& list = ( whichList == UNDO_LIST ) ? m_undoList : m_redoList;
1767
1768 if( aItemCount < 0 )
1769 {
1770 list.ClearCommandList();
1771 }
1772 else
1773 {
1774 for( int ii = 0; ii < aItemCount; ii++ )
1775 {
1776 if( list.m_CommandsList.size() == 0 )
1777 break;
1778
1779 PICKED_ITEMS_LIST* curr_cmd = list.m_CommandsList[0];
1780 list.m_CommandsList.erase( list.m_CommandsList.begin() );
1781
1782 curr_cmd->ClearListAndDeleteItems( []( EDA_ITEM* aItem )
1783 {
1784 delete aItem;
1785 } );
1786 delete curr_cmd; // Delete command
1787 }
1788 }
1789}
1790
1791
1793{
1794 return m_toolManager->GetTool<SCH_SELECTION_TOOL>()->GetSelection();
1795}
1796
1797
1799{
1800 std::unique_ptr<LIB_SYMBOL> symbol = aSymbol->GetLibSymbolRef()->Flatten();
1801 wxCHECK( symbol, /* void */ );
1802
1803 symbol->SetLibId( aSymbol->GetLibId() );
1804
1805 // Take in account the symbol orientation and mirroring. to calculate the field
1806 // positions in symbol editor (i.e. no rotation, no mirroring)
1807 int orientation = aSymbol->GetOrientation() & ~( SYM_MIRROR_X | SYM_MIRROR_Y );
1808 int mirror = aSymbol->GetOrientation() & ( SYM_MIRROR_X | SYM_MIRROR_Y );
1809
1810 std::vector<SCH_FIELD> fullSetOfFields;
1811
1812 for( const SCH_FIELD& field : aSymbol->GetFields() )
1813 {
1814 VECTOR2I pos = field.GetPosition() - aSymbol->GetPosition();
1815 SCH_FIELD libField( symbol.get(), field.GetId() );
1816
1817 libField = field;
1818
1819 // The inverse transform is mirroring before, rotate after
1820 switch( mirror )
1821 {
1822 case SYM_MIRROR_X: pos.y = -pos.y; break;
1823 case SYM_MIRROR_Y: pos.x = -pos.x; break;
1824 default: break;
1825 }
1826
1827 switch( orientation )
1828 {
1829 case SYM_ORIENT_90:
1830 std::swap( pos.x, pos.y );
1831 pos.x = - pos.x;
1832 break;
1833 case SYM_ORIENT_270:
1834 std::swap( pos.x, pos.y );
1835 pos.y = - pos.y;
1836 break;
1837 case SYM_ORIENT_180:
1838 pos.x = - pos.x;
1839 pos.y = - pos.y;
1840 break;
1841 default:
1842 break;
1843 }
1844
1845 libField.SetPosition( pos );
1846
1847 fullSetOfFields.emplace_back( std::move( libField ) );
1848 }
1849
1850 symbol->SetFields( fullSetOfFields );
1851
1852 if( m_symbol )
1853 SetCurSymbol( nullptr, false );
1854
1856 m_schematicSymbolUUID = aSymbol->m_Uuid;
1857 m_reference = symbol->GetReferenceField().GetText();
1858 m_unit = std::max( 1, aSymbol->GetUnit() );
1859 m_bodyStyle = std::max( 1, aSymbol->GetBodyStyle() );
1860
1861 // Optimize default edit options for this symbol
1862 // Usually if units are locked, graphic items are specific to each unit
1863 // and if units are interchangeable, graphic items are common to units
1865 tools->SetDrawSpecificUnit( symbol->UnitsLocked() );
1866
1867 // The buffered screen for the symbol
1868 SCH_SCREEN* tmpScreen = new SCH_SCREEN();
1869
1870 SetScreen( tmpScreen );
1871 SetCurSymbol( symbol.release(), true );
1872 setSymWatcher( nullptr );
1873
1876
1877 if( IsLibraryTreeShown() )
1879
1880 UpdateTitle();
1883
1884 // Let tools add things to the view if necessary
1885 if( m_toolManager )
1887
1889 GetCanvas()->Refresh();
1890}
1891
1892
1893bool SYMBOL_EDIT_FRAME::addLibTableEntry( const wxString& aLibFile, TABLE_SCOPE aScope )
1894{
1895 wxFileName fn = aLibFile;
1896 wxFileName libTableFileName( Prj().GetProjectPath(),
1898 wxString libNickname = fn.GetName();
1900 const ENV_VAR_MAP& envVars = Pgm().GetLocalEnvVariables();
1901
1902 if( libTable->HasLibrary( libNickname ) )
1903 {
1904 wxString tmp;
1905 int suffix = 1;
1906
1907 while( libTable->HasLibrary( libNickname ) )
1908 {
1909 tmp.Printf( "%s%d", fn.GetName(), suffix );
1910 libNickname = tmp;
1911 suffix += 1;
1912 }
1913 }
1914
1916 row->SetNickName( libNickname );
1917
1918 wxString normalizedPath = NormalizePath( aLibFile, &envVars, Prj().GetProjectPath() );
1919
1920 if( aScope == GLOBAL_LIB_TABLE )
1921 {
1923 libTableFileName = SYMBOL_LIB_TABLE::GetGlobalTableFileName();
1924
1925 // We cannot normalize against the current project path when saving to global table.
1926 normalizedPath = NormalizePath( aLibFile, &envVars, wxEmptyString );
1927 }
1928
1929 row->SetFullURI( normalizedPath );
1930
1931 wxCHECK( libTable->InsertRow( row ), false );
1932
1933 try
1934 {
1935 libTable->Save( libTableFileName.GetFullPath() );
1936 }
1937 catch( const IO_ERROR& ioe )
1938 {
1939 wxString msg = aScope == GLOBAL_LIB_TABLE ? _( "Error saving global library table." )
1940 : _( "Error saving project library table." );
1941
1942 wxMessageDialog dlg( this, msg, _( "File Save Error" ), wxOK | wxICON_ERROR );
1943 dlg.SetExtendedMessage( ioe.What() );
1944 dlg.ShowModal();
1945
1946 return false;
1947 }
1948
1949 return true;
1950}
1951
1952
1953bool SYMBOL_EDIT_FRAME::replaceLibTableEntry( const wxString& aLibNickname,
1954 const wxString& aLibFile )
1955{
1956 // Check the global library table first because checking the project library table
1957 // checks the global library table as well due to library chaining.
1958 bool isGlobalTable = true;
1959 wxFileName libTableFileName = SYMBOL_LIB_TABLE::GetGlobalTableFileName();;
1960 const ENV_VAR_MAP& envVars = Pgm().GetLocalEnvVariables();
1962 SYMBOL_LIB_TABLE_ROW* row = libTable->FindRow( aLibNickname );
1963
1964 if( !row )
1965 {
1966 libTableFileName.SetPath( Prj().GetProjectPath() );
1967 libTableFileName.SetName( SYMBOL_LIB_TABLE::GetSymbolLibTableFileName() );
1968 libTable = PROJECT_SCH::SchSymbolLibTable( &Prj() );
1969 isGlobalTable = false;
1970 row = libTable->FindRow( aLibNickname );
1971 }
1972
1973 wxCHECK( row, false );
1974
1975 wxString projectPath;
1976
1977 if( !isGlobalTable )
1978 projectPath = Prj().GetProjectPath();
1979
1980 wxString normalizedPath = NormalizePath( aLibFile, &envVars, projectPath );
1981
1982 row->SetFullURI( normalizedPath );
1983 row->SetType( "KiCad" );
1984
1985 try
1986 {
1987 libTable->Save( libTableFileName.GetFullPath() );
1988 }
1989 catch( const IO_ERROR& ioe )
1990 {
1991 wxString msg = isGlobalTable ? _( "Error saving global library table." )
1992 : _( "Error saving project library table." );
1993
1994 wxMessageDialog dlg( this, msg, _( "File Save Error" ), wxOK | wxICON_ERROR );
1995 dlg.SetExtendedMessage( ioe.What() );
1996 dlg.ShowModal();
1997
1998 return false;
1999 }
2000
2001 return true;
2002}
2003
2004
2006{
2007 return m_symbol && !m_symbol->IsRoot();
2008}
2009
2010
2015
2016
2017void SYMBOL_EDIT_FRAME::UpdateItem( EDA_ITEM* aItem, bool isAddOrDelete, bool aUpdateRtree )
2018{
2019 SCH_BASE_FRAME::UpdateItem( aItem, isAddOrDelete, aUpdateRtree );
2020
2021 if( EDA_TEXT* eda_text = dynamic_cast<EDA_TEXT*>( aItem ) )
2022 {
2023 eda_text->ClearBoundingBoxCache();
2024 eda_text->ClearRenderCache();
2025 }
2026}
2027
2028
2030{
2031 wxAuiPaneInfo& treePane = m_auimgr.GetPane( m_treePane );
2032 wxAuiPaneInfo& propertiesPane = m_auimgr.GetPane( PropertiesPaneName() );
2033 wxAuiPaneInfo& selectionFilterPane = m_auimgr.GetPane( wxS( "SelectionFilter" ) );
2034
2035 // Don't give the selection filter its own visibility controls; instead show it if
2036 // anything else is visible
2037 bool showFilter = ( treePane.IsShown() && treePane.IsDocked() )
2038 || ( propertiesPane.IsShown() && propertiesPane.IsDocked() );
2039
2040 selectionFilterPane.Show( showFilter );
2041}
2042
2043
2045{
2046 // Returns the current render option for invisible fields
2048}
2049
2050
2052{
2053 // Returns the current render option for invisible pins
2055}
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 millimetersUnits
Definition actions.h:205
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 cursorSmallCrosshairs
Definition actions.h:151
static TOOL_ACTION copy
Definition actions.h:78
static TOOL_ACTION showDatasheet
Definition actions.h:266
static TOOL_ACTION milsUnits
Definition actions.h:204
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 inchesUnits
Definition actions.h:203
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 cursor45Crosshairs
Definition actions.h:153
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
static TOOL_ACTION cursorFullCrosshairs
Definition actions.h:152
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()
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
void ShowInfoBarWarning(const wxString &aWarningMsg, bool aShowCloseButton=false)
Show the WX_INFOBAR displayed on the top of the canvas with a message and a warning icon on the left ...
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:79
Class that groups generic conditions for editor states.
SELECTION_CONDITION NoActiveTool()
Create a functor testing if there are no tools active in the frame.
SELECTION_CONDITION BoundingBoxes()
SELECTION_CONDITION RedoAvailable()
Create a functor that tests if there are any items in the redo queue.
SELECTION_CONDITION CurrentTool(const TOOL_ACTION &aTool)
Create a functor testing if the specified tool is the current active tool in the frame.
virtual SELECTION_CONDITION UndoAvailable()
Create a functor that tests if there are any items in the undo queue.
SELECTION_CONDITION Units(EDA_UNITS aUnit)
Create a functor that tests if the frame has the specified units.
SELECTION_CONDITION CursorSmallCrosshairs()
Create a functor testing if the cursor is full screen in a frame.
SELECTION_CONDITION GridVisible()
Create a functor testing if the grid is visible in a frame.
SELECTION_CONDITION GridOverrides()
Create a functor testing if the grid overrides wires is enabled in a frame.
SELECTION_CONDITION Cursor45Crosshairs()
SELECTION_CONDITION CursorFullCrosshairs()
void ReadWindowSettings(WINDOW_SETTINGS &aCfg)
Read GAL config options from application-level config.
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
virtual const wxString What() const
A composite of Problem() and Where()
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:286
void OnKiCadExit()
Definition kiway.cpp:717
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
Definition kiway.cpp:395
virtual void ExpressMail(FRAME_T aDestination, MAIL_T aCommand, std::string &aPayload, wxWindow *aSource=nullptr)
Send aPayload to aDestination from aSource.
Definition kiway.cpp:499
Module editor specific tools.
A logical library item identifier and consists of various portions much like a URI.
Definition lib_id.h:49
int SetLibItemName(const UTF8 &aLibItemName)
Override the library item name portion of the LIB_ID to aLibItemName.
Definition lib_id.cpp: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:154
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:590
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
Hold a record identifying a library accessed by the appropriate plug in object in the LIB_TABLE.
void SetFullURI(const wxString &aFullURI)
Change the full URI for the library.
void SetNickName(const wxString &aNickName)
Change the logical name of this library, useful for an editor.
const wxString & GetNickName() const
const wxString GetFullURI(bool aSubstituted=false) const
Return the full location specifying URI for the LIB, either in original UI form or in environment var...
bool HasLibrary(const wxString &aNickname, bool aCheckEnabled=false) const
Test for the existence of aNickname in the library table.
bool InsertRow(LIB_TABLE_ROW *aRow, bool doReplace=false)
Adds aRow if it does not already exist or if doReplace is true.
const LIB_TABLE_ROW * FindRowByURI(const wxString &aURI)
void Save(const wxString &aFileName) const
Write this library table to aFileName in s-expression form.
Node type: LIB_ID.
void 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:91
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:155
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:822
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition pgm_base.h:125
A holder to handle information on schematic or board items.
void ClearListAndDeleteItems(std::function< void(EDA_ITEM *)> aItemDeleter)
Delete the list of pickers AND the data pointed by #m_PickedItem or #m_PickedItemLink according to th...
bool IsCancelled() const override
static SYMBOL_LIB_TABLE * SchSymbolLibTable(PROJECT *aProject)
Accessor for project symbol library table.
@ SCH_LIBEDIT_CUR_LIB
Definition project.h:222
@ SCH_LIBEDIT_CUR_SYMBOL
Definition project.h:223
virtual const wxString GetProjectPath() const
Return the full path of the project.
Definition project.cpp:162
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:334
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:345
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.
bool saveSymbolLibTables(bool aGlobal, bool aProject)
Save Symbol Library Tables to disk.
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.
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:244
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:75
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:760
const LIB_ID & GetLibId() const override
Definition sch_symbol.h:164
int GetOrientation() const override
Get the display symbol orientation.
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
Definition sch_symbol.h:183
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.
bool addLibTableEntry(const wxString &aLibFile, TABLE_SCOPE aScope=GLOBAL_LIB_TABLE)
Add aLibFile to the symbol library table defined by aScope.
void storeCurrentSymbol()
Rename LIB_SYMBOL aliases to avoid conflicts before adding a symbol to a library.
bool IsLibraryTreeShown() const override
const BOX2I GetDocumentExtents(bool aIncludeAllVisible=true) const override
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
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)
Hold a record identifying a symbol library accessed by the appropriate symbol library SCH_IO object i...
void SetType(const wxString &aType) override
Change the schematic plugin type represented by this row.
const wxString GetType() const override
Return the type of symbol library table represented by this row.
static SYMBOL_LIB_TABLE & GetGlobalLibTable()
static const wxString GetSymbolLibTableFileName()
static wxString GetGlobalTableFileName()
Fetch the global symbol library table file name.
SYMBOL_LIB_TABLE_ROW * FindRow(const wxString &aNickName, bool aCheckIfEnabled=false)
Return an SYMBOL_LIB_TABLE_ROW if aNickName is found in this table or in any chained fallBack table f...
Library Editor pane with symbol tree and symbol library table selector.
TOOL_MANAGER * m_toolManager
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.
Multi-thread safe progress reporter dialog, intended for use of tasks that parallel reporting back of...
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition confirm.cpp:194
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:169
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 KiCadSymbolLibFileExtension
static wxString KiCadSymbolLibFileWildcard()
std::map< wxString, ENV_VAR_ITEM > ENV_VAR_MAP
PROJECT & Prj()
Definition kicad.cpp:612
KIID niluuid(0)
@ LAYER_SCHEMATIC_GRID_AXES
Definition layer_ids.h:486
@ 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:913
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 ...
@ 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
Definition for symbol library class.
#define ENVVARS_CHANGED
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.
#define PR_CAN_ABORT