KiCad PCB EDA Suite
symbol_edit_frame.cpp
Go to the documentation of this file.
1 /*
2  * This program source code file is part of KiCad, a free EDA CAD application.
3  *
4  * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr
5  * Copyright (C) 2008 Wayne Stambaugh <stambaughw@gmail.com>
6  * Copyright (C) 2004-2021 KiCad Developers, see AUTHORS.txt for contributors.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, you may find one here:
20  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21  * or you may search the http://www.gnu.org website for the version 2 license,
22  * or you may write to the Free Software Foundation, Inc.,
23  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24  */
25 
26 #include <bitmaps.h>
27 #include <wx/hyperlink.h>
28 #include <base_screen.h>
29 #include <symbol_library.h>
30 #include <confirm.h>
31 #include <core/kicad_algo.h>
32 #include <eeschema_id.h>
33 #include <eeschema_settings.h>
34 #include <env_paths.h>
35 #include <kiface_base.h>
36 #include <kiplatform/app.h>
37 #include <kiway_express.h>
38 #include <symbol_edit_frame.h>
39 #include <symbol_library_manager.h>
40 #include <lib_text.h>
41 #include <symbol_editor_settings.h>
42 #include <paths.h>
43 #include <pgm_base.h>
44 #include <sch_painter.h>
45 #include <sch_view.h>
47 #include <symbol_lib_table.h>
48 #include <tool/action_manager.h>
49 #include <tool/action_toolbar.h>
50 #include <tool/common_control.h>
51 #include <tool/common_tools.h>
52 #include <tool/editor_conditions.h>
53 #include <tool/picker_tool.h>
54 #include <tool/selection.h>
55 #include <tool/tool_dispatcher.h>
56 #include <tool/tool_manager.h>
57 #include <tool/zoom_tool.h>
58 #include <tools/ee_actions.h>
60 #include <tools/ee_point_editor.h>
68 #include <widgets/infobar.h>
69 #include <widgets/lib_tree.h>
73 #include <panel_sym_lib_table.h>
74 #include <wx/choicdlg.h>
75 #include <string_utils.h>
76 
77 
79 
80 
81 BEGIN_EVENT_TABLE( SYMBOL_EDIT_FRAME, EDA_DRAW_FRAME )
82  EVT_SIZE( SYMBOL_EDIT_FRAME::OnSize )
83 
85 
86  // menubar commands
87  EVT_MENU( wxID_EXIT, SYMBOL_EDIT_FRAME::OnExitKiCad )
88  EVT_MENU( wxID_CLOSE, SYMBOL_EDIT_FRAME::CloseWindow )
90 
91  // Update user interface elements.
93 
94 END_EVENT_TABLE()
95 
96 
97 SYMBOL_EDIT_FRAME::SYMBOL_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
98  SCH_BASE_FRAME( aKiway, aParent, FRAME_SCH_SYMBOL_EDITOR, _( "Library Editor" ),
99  wxDefaultPosition, wxDefaultSize, KICAD_DEFAULT_DRAWFRAME_STYLE,
101  m_unitSelectBox( nullptr ),
102  m_isSymbolFromSchematic( false )
103 {
104  SetShowDeMorgan( false );
105  m_SyncPinEdit = false;
106 
107  m_symbol = nullptr;
108  m_treePane = nullptr;
109  m_libMgr = nullptr;
110  m_unit = 1;
111  m_convert = 1;
112  m_aboutTitle = _( "KiCad Symbol Editor" );
113 
114  wxIcon icon;
115  wxIconBundle icon_bundle;
116 
117  icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit ) );
118  icon_bundle.AddIcon( icon );
119  icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit_32 ) );
120  icon_bundle.AddIcon( icon );
121  icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit_16 ) );
122  icon_bundle.AddIcon( icon );
123 
124  SetIcons( icon_bundle );
125 
126  m_settings = Pgm().GetSettingsManager().GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
127  LoadSettings( m_settings );
128 
129  // Ensure axis are always drawn
130  KIGFX::GAL_DISPLAY_OPTIONS& gal_opts = GetGalDisplayOptions();
131  gal_opts.m_axesEnabled = true;
132 
133  m_dummyScreen = new SCH_SCREEN();
134  SetScreen( m_dummyScreen );
135  GetScreen()->m_Center = true;
136 
137  GetCanvas()->GetViewControls()->SetCrossHairCursorPosition( VECTOR2D( 0, 0 ), false );
138 
139  GetRenderSettings()->LoadColors( GetColorSettings() );
140  GetCanvas()->GetGAL()->SetAxesColor( m_colorSettings->GetColor( LAYER_SCHEMATIC_GRID_AXES ) );
141 
142  setupTools();
143  setupUIConditions();
144 
145  m_libMgr = new SYMBOL_LIBRARY_MANAGER( *this );
146 
147  // Preload libraries before using SyncLibraries the first time, as the preload is threaded
148  WX_PROGRESS_REPORTER reporter( this, _( "Loading Symbol Libraries" ),
149  m_libMgr->GetLibraryCount(), true );
150  m_libMgr->Preload( reporter );
151 
152  SyncLibraries( false );
153  m_treePane = new SYMBOL_TREE_PANE( this, m_libMgr );
154 
155  ReCreateMenuBar();
156  ReCreateHToolbar();
157  ReCreateVToolbar();
158  ReCreateOptToolbar();
159 
160  updateTitle();
161  UpdateSymbolMsgPanelInfo();
162  RebuildSymbolUnitsList();
163 
164  m_auimgr.SetManagedWindow( this );
165 
166  CreateInfoBar();
167  m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( "MainToolbar" )
168  .Top().Layer( 6 ) );
169  m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( "MsgPanel" )
170  .Bottom().Layer( 6 ) );
171 
172  m_auimgr.AddPane( m_optionsToolBar, EDA_PANE().VToolbar().Name( "OptToolbar" )
173  .Left().Layer( 3 ) );
174  m_auimgr.AddPane( m_treePane, EDA_PANE().Palette().Name( "SymbolTree" )
175  .Left().Layer( 2 )
176  .Caption( _( "Libraries" ) )
177  .MinSize( 250, -1 ).BestSize( 250, -1 ) );
178  m_auimgr.AddPane( m_drawToolBar, EDA_PANE().VToolbar().Name( "ToolsToolbar" )
179  .Right().Layer( 2 ) );
180 
181  m_auimgr.AddPane( GetCanvas(), wxAuiPaneInfo().Name( "DrawFrame" )
182  .CentrePane() );
183 
184  FinishAUIInitialization();
185 
186  if( m_settings->m_LibWidth > 0 )
187  {
188  wxAuiPaneInfo& treePane = m_auimgr.GetPane( "SymbolTree" );
189 
190  // wxAUI hack: force width by setting MinSize() and then Fixed()
191  // thanks to ZenJu http://trac.wxwidgets.org/ticket/13180
192  treePane.MinSize( m_settings->m_LibWidth, -1 );
193  treePane.Fixed();
194  m_auimgr.Update();
195 
196  // now make it resizable again
197  treePane.Resizable();
198  m_auimgr.Update();
199 
200  // Note: DO NOT call m_auimgr.Update() anywhere after this; it will nuke the size
201  // back to minimum.
202  treePane.MinSize( 250, -1 );
203  }
204 
205  Raise();
206  Show( true );
207 
208  SyncView();
209  GetCanvas()->GetView()->UseDrawPriority( true );
210  GetCanvas()->GetGAL()->SetAxesEnabled( true );
211 
212  setupUnits( m_settings );
213 
214  // Set the working/draw area size to display a symbol to a reasonable value:
215  // A 600mm x 600mm with a origin at the area center looks like a large working area
216  double max_size_x = Millimeter2iu( 600 );
217  double max_size_y = Millimeter2iu( 600 );
218  BOX2D bbox;
219  bbox.SetOrigin( -max_size_x /2, -max_size_y/2 );
220  bbox.SetSize( max_size_x, max_size_y );
221  GetCanvas()->GetView()->SetBoundary( bbox );
222 
223  m_toolManager->RunAction( ACTIONS::zoomFitScreen, true );
224 
225  KIPLATFORM::APP::SetShutdownBlockReason( this, _( "Library changes are unsaved" ) );
226 
227  // Catch unhandled accelerator command characters that were no handled by the library tree
228  // panel.
229  Bind( wxEVT_CHAR, &TOOL_DISPATCHER::DispatchWxEvent, m_toolDispatcher );
230  Bind( wxEVT_CHAR_HOOK, &TOOL_DISPATCHER::DispatchWxEvent, m_toolDispatcher );
231 
232  // Ensure the window is on top
233  Raise();
234 }
235 
236 
238 {
239  // Shutdown all running tools
240  if( m_toolManager )
242 
243  if( IsSymbolFromSchematic() )
244  {
245  delete m_symbol;
246  m_symbol = nullptr;
247 
248  SCH_SCREEN* screen = GetScreen();
249  delete screen;
250  m_isSymbolFromSchematic = false;
251  }
252  // current screen is destroyed in EDA_DRAW_FRAME
254 
255  auto libedit = Pgm().GetSettingsManager().GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
256  Pgm().GetSettingsManager().Save( libedit );
257 
258  delete m_libMgr;
259 }
260 
261 
263 {
264  wxCHECK_RET( m_settings, "Call to SYMBOL_EDIT_FRAME::LoadSettings with null m_boardAdapter" );
265 
267 
269 
270  // Hidden elements must be editable
274 }
275 
276 
278 {
279  wxCHECK_RET( m_settings, "Call to SYMBOL_EDIT_FRAME::LoadSettings with null m_boardAdapter" );
280 
282 
284 
286  m_settings->m_LibWidth = m_treePane->GetSize().x;
287 }
288 
289 
291 {
292  return static_cast<APP_SETTINGS_BASE*>( GetSettings() );
293 }
294 
295 
297 {
298  SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
299 
300  if( GetSettings()->m_UseEeschemaColorSettings )
302  else
303  return mgr.GetColorSettings( GetSettings()->m_ColorTheme );
304 }
305 
306 
308 {
309  // Create the manager and dispatcher & route draw panel events to the dispatcher
312  GetCanvas()->GetViewControls(), GetSettings(), this );
313  m_actions = new EE_ACTIONS();
315 
316  // Register tools
330 
331  // Run the selection tool, it is supposed to be always active
332  m_toolManager->InvokeTool( "eeschema.InteractiveSelection" );
333 
335 }
336 
337 
339 {
341 
343  EDITOR_CONDITIONS cond( this );
344 
345  wxASSERT( mgr );
346 
347 #define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
348 #define CHECK( x ) ACTION_CONDITIONS().Check( x )
349 
350  auto haveSymbolCond =
351  [this] ( const SELECTION& )
352  {
353  return m_symbol;
354  };
355 
356  auto isEditableCond =
357  [this] ( const SELECTION& )
358  {
359  // Only root symbols from the new s-expression libraries or the schematic
360  // are editable.
361  return IsSymbolEditable() && !IsSymbolAlias();
362  };
363 
364  auto libModifiedCondition =
365  [this] ( const SELECTION& sel )
366  {
367  return m_libMgr->HasModifications();
368  };
369 
370  auto libSelectedCondition =
371  [this] ( const SELECTION& sel )
372  {
373  return !GetTargetLibId().GetLibNickname().empty();
374  };
375 
376  auto canEditProperties =
377  [this] ( const SELECTION& sel )
378  {
380  };
381 
382  auto saveSymbolAsCondition =
383  [ this ]( const SELECTION& aSel )
384  {
385  LIB_ID sel = GetTargetLibId();
386  return !sel.GetLibNickname().empty() && !sel.GetLibItemName().empty();
387  };
388 
391  mgr->SetConditions( EE_ACTIONS::saveLibraryAs, ENABLE( libSelectedCondition ) );
392  mgr->SetConditions( EE_ACTIONS::saveSymbolAs, ENABLE( saveSymbolAsCondition ) );
395 
396  mgr->SetConditions( ACTIONS::undo, ENABLE( haveSymbolCond && cond.UndoAvailable() ) );
397  mgr->SetConditions( ACTIONS::redo, ENABLE( haveSymbolCond && cond.RedoAvailable() ) );
398  mgr->SetConditions( ACTIONS::revert, ENABLE( haveSymbolCond && libModifiedCondition ) );
399 
405 
406  mgr->SetConditions( ACTIONS::cut, ENABLE( isEditableCond ) );
407  mgr->SetConditions( ACTIONS::copy, ENABLE( haveSymbolCond ) );
408  mgr->SetConditions( ACTIONS::paste, ENABLE( isEditableCond && SELECTION_CONDITIONS::Idle ) );
409  mgr->SetConditions( ACTIONS::doDelete, ENABLE( isEditableCond ) );
410  mgr->SetConditions( ACTIONS::duplicate, ENABLE( isEditableCond ) );
411  mgr->SetConditions( ACTIONS::selectAll, ENABLE( haveSymbolCond ) );
412 
413  mgr->SetConditions( EE_ACTIONS::rotateCW, ENABLE( isEditableCond ) );
414  mgr->SetConditions( EE_ACTIONS::rotateCCW, ENABLE( isEditableCond ) );
415  mgr->SetConditions( EE_ACTIONS::mirrorH, ENABLE( isEditableCond ) );
416  mgr->SetConditions( EE_ACTIONS::mirrorV, ENABLE( isEditableCond ) );
417 
420 
421  auto pinTypeCond =
422  [this] ( const SELECTION& )
423  {
425  };
426 
427  auto showCompTreeCond =
428  [this] ( const SELECTION& )
429  {
430  return IsSymbolTreeShown();
431  };
432 
433  mgr->SetConditions( EE_ACTIONS::showElectricalTypes, CHECK( pinTypeCond ) );
434  mgr->SetConditions( EE_ACTIONS::showSymbolTree, CHECK( showCompTreeCond ) );
435 
436  auto demorganCond =
437  [this] ( const SELECTION& )
438  {
439  return GetShowDeMorgan();
440  };
441 
442  auto demorganStandardCond =
443  [this] ( const SELECTION& )
444  {
445  return m_convert == LIB_ITEM::LIB_CONVERT::BASE;
446  };
447 
448  auto demorganAlternateCond =
449  [this] ( const SELECTION& )
450  {
451  return m_convert == LIB_ITEM::LIB_CONVERT::DEMORGAN;
452  };
453 
454  auto multiUnitModeCond =
455  [this] ( const SELECTION& )
456  {
457  return m_symbol && m_symbol->IsMulti() && !m_symbol->UnitsLocked();
458  };
459 
460  auto syncedPinsModeCond =
461  [this] ( const SELECTION& )
462  {
463  return m_SyncPinEdit;
464  };
465 
466  auto haveDatasheetCond =
467  [this] ( const SELECTION& )
468  {
469  return m_symbol && !m_symbol->GetDatasheetField().GetText().IsEmpty();
470  };
471 
472  mgr->SetConditions( EE_ACTIONS::showDatasheet, ENABLE( haveDatasheetCond ) );
473  mgr->SetConditions( EE_ACTIONS::symbolProperties, ENABLE( canEditProperties && haveSymbolCond ) );
474  mgr->SetConditions( EE_ACTIONS::runERC, ENABLE( haveSymbolCond ) );
475  mgr->SetConditions( EE_ACTIONS::pinTable, ENABLE( isEditableCond && haveSymbolCond ) );
476 
478  ACTION_CONDITIONS().Enable( demorganCond ).Check( demorganStandardCond ) );
480  ACTION_CONDITIONS().Enable( demorganCond ).Check( demorganAlternateCond ) );
482  ACTION_CONDITIONS().Enable( multiUnitModeCond ).Check( syncedPinsModeCond ) );
483 
484 // Only enable a tool if the symbol is edtable
485 #define EDIT_TOOL( tool ) ACTION_CONDITIONS().Enable( isEditableCond ).Check( cond.CurrentTool( tool ) )
486 
495 
496 #undef CHECK
497 #undef ENABLE
498 #undef EDIT_TOOL
499 }
500 
501 
502 bool SYMBOL_EDIT_FRAME::canCloseWindow( wxCloseEvent& aEvent )
503 {
504  // Shutdown blocks must be determined and vetoed as early as possible
505  if( KIPLATFORM::APP::SupportsShutdownBlockReason() && aEvent.GetId() == wxEVT_QUERY_END_SESSION
506  && IsContentModified() )
507  {
508  return false;
509  }
510 
512  {
513  SCH_EDIT_FRAME* schframe = (SCH_EDIT_FRAME*) Kiway().Player( FRAME_SCH, false );
514 
515  switch( UnsavedChangesDialog( this,
516  _( "Save changes to schematic before closing?" ),
517  nullptr ) )
518  {
519  case wxID_YES:
520  if( schframe && GetCurSymbol() ) // Should be always the case
521  schframe->SaveSymbolToSchematic( *GetCurSymbol());
522 
523  return true;
524 
525  case wxID_NO: return true;
526 
527  default:
528  case wxID_CANCEL: return false;
529  }
530  }
531 
532  if( !saveAllLibraries( true ) )
533  {
534  return false;
535  }
536 
537  return true;
538 }
539 
540 
542 {
543  Destroy();
544 }
545 
546 
548 {
549  if( !m_unitSelectBox )
550  return;
551 
552  if( m_unitSelectBox->GetCount() != 0 )
553  m_unitSelectBox->Clear();
554 
555  if( !m_symbol || m_symbol->GetUnitCount() <= 1 )
556  {
557  m_unit = 1;
558  m_unitSelectBox->Append( wxEmptyString );
559  }
560  else
561  {
562  for( int i = 0; i < m_symbol->GetUnitCount(); i++ )
563  {
564  wxString sub = LIB_SYMBOL::SubReference( i+1, false );
565  wxString unit = wxString::Format( _( "Unit %s" ), sub );
566  m_unitSelectBox->Append( unit );
567  }
568  }
569 
570  // Ensure the selected unit is compatible with the number of units of the current symbol:
571  if( m_symbol && m_symbol->GetUnitCount() < m_unit )
572  m_unit = 1;
573 
574  m_unitSelectBox->SetSelection(( m_unit > 0 ) ? m_unit - 1 : 0 );
575 }
576 
577 
578 void SYMBOL_EDIT_FRAME::OnToggleSymbolTree( wxCommandEvent& event )
579 {
580  auto& treePane = m_auimgr.GetPane( m_treePane );
581  treePane.Show( !IsSymbolTreeShown() );
582  m_auimgr.Update();
583 }
584 
585 
587 {
588  return m_auimgr.GetPane( m_treePane ).IsShown();
589 }
590 
591 
593 {
594  m_treePane->Freeze();
595  m_libMgr->GetAdapter()->Freeze();
596 }
597 
598 
600 {
601  m_libMgr->GetAdapter()->Thaw();
602  m_treePane->Thaw();
603 }
604 
605 
606 void SYMBOL_EDIT_FRAME::OnExitKiCad( wxCommandEvent& event )
607 {
608  Kiway().OnKiCadExit();
609 }
610 
611 
612 void SYMBOL_EDIT_FRAME::OnUpdateUnitNumber( wxUpdateUIEvent& event )
613 {
614  event.Enable( m_symbol && m_symbol->GetUnitCount() > 1 );
615 }
616 
617 
618 void SYMBOL_EDIT_FRAME::OnSelectUnit( wxCommandEvent& event )
619 {
620  int i = event.GetSelection();
621 
622  if( ( i == wxNOT_FOUND ) || ( ( i + 1 ) == m_unit ) )
623  return;
624 
627 
628  m_unit = i + 1;
629 
631  RebuildView();
633 }
634 
635 
637 {
638  if( m_symbol )
639  {
641 
642  if( row && row->GetType() == SCH_IO_MGR::ShowType( SCH_IO_MGR::SCH_LEGACY ) )
643  return true;
644  }
645 
646  return false;
647 }
648 
649 
651 {
652  wxString libNickname = Prj().GetRString( PROJECT::SCH_LIBEDIT_CUR_LIB );
653 
654  if( !libNickname.empty() )
655  {
656  if( !Prj().SchSymbolLibTable()->HasLibrary( libNickname ) )
657  {
658  Prj().SetRString( PROJECT::SCH_LIBEDIT_CUR_LIB, wxEmptyString );
659  libNickname = wxEmptyString;
660  }
661  }
662 
663  return libNickname;
664 }
665 
666 
667 wxString SYMBOL_EDIT_FRAME::SetCurLib( const wxString& aLibNickname )
668 {
669  wxString old = GetCurLib();
670 
671  if( aLibNickname.empty() || !Prj().SchSymbolLibTable()->HasLibrary( aLibNickname ) )
672  Prj().SetRString( PROJECT::SCH_LIBEDIT_CUR_LIB, wxEmptyString );
673  else
674  Prj().SetRString( PROJECT::SCH_LIBEDIT_CUR_LIB, aLibNickname );
675 
676  return old;
677 }
678 
679 
680 void SYMBOL_EDIT_FRAME::SetCurSymbol( LIB_SYMBOL* aSymbol, bool aUpdateZoom )
681 {
683  GetCanvas()->GetView()->Clear();
684  delete m_symbol;
685 
686  m_symbol = aSymbol;
687 
688  // select the current symbol in the tree widget
689  if( !IsSymbolFromSchematic() && m_symbol )
691  else
693 
694  wxString symbolName = m_symbol ? m_symbol->GetName() : wxString();
695 
696  // retain in case this wxFrame is re-opened later on the same PROJECT
698 
699  // Ensure synchronized pin edit can be enabled only symbols with interchangeable units
700  m_SyncPinEdit = aSymbol && aSymbol->IsRoot() && aSymbol->IsMulti() && !aSymbol->UnitsLocked();
701 
703 
711 
712  if( aUpdateZoom )
714 
715  GetCanvas()->Refresh();
716 
717  WX_INFOBAR* infobar = GetInfoBar();
718 
719  if( IsSymbolFromSchematic() )
720  {
721  wxString msg;
722  msg.Printf( _( "Editing symbol %s from schematic. Saving will update the schematic "
723  "only." ), m_reference );
724 
725  infobar->RemoveAllButtons();
726  infobar->ShowMessage( msg, wxICON_INFORMATION );
727  }
728  else if( IsSymbolFromLegacyLibrary() )
729  {
730  wxHyperlinkCtrl* button = new wxHyperlinkCtrl( infobar, wxID_ANY,
731  _( "Manage symbol libraries" ),
732  wxEmptyString );
733 
734  button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
735  [&]( wxHyperlinkEvent& aEvent )
736  {
738  } ) );
739 
740  infobar->RemoveAllButtons();
741  infobar->AddButton( button );
742  infobar->ShowMessage( _( "Symbols in legacy libraries are not editable. Use Manage "
743  "Symbol Libraries to migrate to current format." ),
744  wxICON_INFORMATION );
745  }
746  else if( IsSymbolAlias() )
747  {
748  wxString parentSymbolName = m_symbol->GetParent().lock()->GetName();
749  wxString msg;
750  wxString link;
751 
752  msg.Printf( _( "Symbol %s is derived from %s. Symbol graphics will not be editable." ),
753  UnescapeString( symbolName ),
754  UnescapeString( parentSymbolName ) );
755 
756  link.Printf( _( "Open %s" ), UnescapeString( parentSymbolName ) );
757 
758  wxHyperlinkCtrl* button = new wxHyperlinkCtrl( infobar, wxID_ANY, link, wxEmptyString );
759  button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
760  [&]( wxHyperlinkEvent& aEvent )
761  {
762  LoadSymbolFromCurrentLib( m_symbol->GetParent().lock()->GetName(),
763  GetUnit(), GetConvert() );
764  } ) );
765 
766  infobar->RemoveAllButtons();
767  infobar->AddButton( button );
768  infobar->ShowMessage( msg, wxICON_INFORMATION );
769  }
770  else
771  {
772  infobar->Dismiss();
773  }
774 }
775 
776 
778 {
779  wxASSERT( m_libMgr );
780  return *m_libMgr;
781 }
782 
783 
785 {
788 
790 
791  if( !GetTitle().StartsWith( "*" ) )
792  updateTitle();
793 }
794 
795 
797 {
799 }
800 
801 
802 bool SYMBOL_EDIT_FRAME::AddLibraryFile( bool aCreateNew )
803 {
804  // Select the target library table (global/project)
805  SYMBOL_LIB_TABLE* libTable = selectSymLibTable();
806 
807  if( !libTable )
808  return false;
809 
810  wxFileName fn = m_libMgr->GetUniqueLibraryName();
811 
812  if( !LibraryFileBrowser( !aCreateNew, fn, KiCadSymbolLibFileWildcard(),
814  ( libTable == &SYMBOL_LIB_TABLE::GetGlobalLibTable() ),
816  {
817  return false;
818  }
819 
820  wxString libName = fn.GetName();
821 
822  if( libName.IsEmpty() )
823  return false;
824 
825  if( m_libMgr->LibraryExists( libName ) )
826  {
827  DisplayError( this, wxString::Format( _( "Library '%s' already exists." ), libName ) );
828  return false;
829  }
830 
831  if( aCreateNew )
832  {
833  if( !m_libMgr->CreateLibrary( fn.GetFullPath(), libTable ) )
834  {
835  DisplayError( this, wxString::Format( _( "Could not create the library file '%s'.\n"
836  "Make sure you have write permissions and try again." ),
837  fn.GetFullPath() ) );
838  return false;
839  }
840  }
841  else
842  {
843  if( !m_libMgr->AddLibrary( fn.GetFullPath(), libTable ) )
844  {
845  DisplayError( this, _( "Could not open the library file." ) );
846  return false;
847  }
848  }
849 
850  bool globalTable = ( libTable == &SYMBOL_LIB_TABLE::GetGlobalLibTable() );
851  saveSymbolLibTables( globalTable, !globalTable );
852 
853  std::string packet = fn.GetFullPath().ToStdString();
855 
856  return true;
857 }
858 
859 
861 {
862  return m_treePane->GetLibTree()->GetSelectedLibId( aUnit );
863 }
864 
865 
867 {
868  LIB_ID libId = GetTreeLIBID();
869 
870  if( libId.IsValid() )
871  {
872  LIB_SYMBOL* alias = m_libMgr->GetAlias( libId.GetLibItemName(), libId.GetLibNickname() );
873  return alias;
874  }
875 
876  return m_symbol;
877 }
878 
879 
881 {
882  LIB_ID id = GetTreeLIBID();
883 
884  if( id.GetLibNickname().empty() && m_symbol )
885  id = m_symbol->GetLibId();
886 
887  return id;
888 }
889 
890 
892 {
894 }
895 
896 
898 {
899  return GetTargetLibId().GetLibNickname();
900 }
901 
902 
903 void SYMBOL_EDIT_FRAME::SyncLibraries( bool aShowProgress, const wxString& aForceRefresh )
904 {
905  LIB_ID selected;
906 
907  if( m_treePane )
908  selected = m_treePane->GetLibTree()->GetSelectedLibId();
909 
910  if( aShowProgress )
911  {
912  APP_PROGRESS_DIALOG progressDlg( _( "Loading Symbol Libraries" ), wxEmptyString,
913  m_libMgr->GetAdapter()->GetLibrariesCount(), this );
914 
915  m_libMgr->Sync( aForceRefresh,
916  [&]( int progress, int max, const wxString& libName )
917  {
918  progressDlg.Update( progress, wxString::Format( _( "Loading library '%s'..." ),
919  libName ) );
920  } );
921  }
922  else
923  {
924  m_libMgr->Sync( aForceRefresh,
925  [&]( int progress, int max, const wxString& libName )
926  {
927  } );
928  }
929 
930  if( m_treePane )
931  {
932  wxDataViewItem found;
933 
934  if( selected.IsValid() )
935  {
936  // Check if the previously selected item is still valid,
937  // if not - it has to be unselected to prevent crash
938  found = m_libMgr->GetAdapter()->FindItem( selected );
939 
940  if( !found )
942  }
943 
944  m_treePane->GetLibTree()->Regenerate( true );
945 
946  // Try to select the parent library, in case the symbol is not found
947  if( !found && selected.IsValid() )
948  {
949  selected.SetLibItemName( "" );
950  found = m_libMgr->GetAdapter()->FindItem( selected );
951 
952  if( found )
953  m_treePane->GetLibTree()->SelectLibId( selected );
954  }
955 
956  // If no selection, see if there's a current symbol to centre
957  if( !selected.IsValid() && m_symbol )
958  {
959  LIB_ID current( GetCurLib(), m_symbol->GetName() );
960  m_treePane->GetLibTree()->CenterLibId( current );
961  }
962  }
963 }
964 
965 
967 {
968  LIB_ID target = GetTargetLibId();
969 
970  m_treePane->GetLibTree()->Regenerate( true );
971 
972  if( target.IsValid() )
973  m_treePane->GetLibTree()->CenterLibId( target );
974 }
975 
976 
978 {
980 }
981 
982 
984 {
985  // If no project is loaded, always work with the global table
986  if( Prj().IsNullProject() )
987  {
989 
990  if( aOptional )
991  {
992  wxMessageDialog dlg( this, _( "Add the library to the global library table?" ),
993  _( "Add To Global Library Table" ), wxYES_NO );
994 
995  if( dlg.ShowModal() != wxID_OK )
996  ret = nullptr;
997  }
998 
999  return ret;
1000  }
1001 
1002  wxArrayString libTableNames;
1003  libTableNames.Add( _( "Global" ) );
1004  libTableNames.Add( _( "Project" ) );
1005 
1006  wxSingleChoiceDialog dlg( this, _( "Choose the Library Table to add the library to:" ),
1007  _( "Add To Library Table" ), libTableNames );
1008 
1009  if( aOptional )
1010  {
1011  dlg.FindWindow( wxID_CANCEL )->SetLabel( _( "Skip" ) );
1012  dlg.FindWindow( wxID_OK )->SetLabel( _( "Add" ) );
1013  }
1014 
1015  if( dlg.ShowModal() != wxID_OK )
1016  return nullptr;
1017 
1018  switch( dlg.GetSelection() )
1019  {
1020  case 0: return &SYMBOL_LIB_TABLE::GetGlobalLibTable();
1021  case 1: return Prj().SchSymbolLibTable();
1022  default: return nullptr;
1023  }
1024 }
1025 
1026 
1027 bool SYMBOL_EDIT_FRAME::backupFile( const wxFileName& aOriginalFile, const wxString& aBackupExt )
1028 {
1029  if( aOriginalFile.FileExists() )
1030  {
1031  wxFileName backupFileName( aOriginalFile );
1032  backupFileName.SetExt( aBackupExt );
1033 
1034  if( backupFileName.FileExists() )
1035  wxRemoveFile( backupFileName.GetFullPath() );
1036 
1037  if( !wxCopyFile( aOriginalFile.GetFullPath(), backupFileName.GetFullPath() ) )
1038  {
1039  DisplayError( this, wxString::Format( _( "Failed to save backup to '%s'." ),
1040  backupFileName.GetFullPath() ) );
1041  return false;
1042  }
1043  }
1044 
1045  return true;
1046 }
1047 
1048 
1050 {
1051  if( m_symbol && !GetCurLib().IsEmpty() && GetScreen()->IsContentModified() )
1052  m_libMgr->UpdateSymbol( m_symbol, GetCurLib() ); // UpdateSymbol() makes a copy
1053 }
1054 
1055 
1056 bool SYMBOL_EDIT_FRAME::isCurrentSymbol( const LIB_ID& aLibId ) const
1057 {
1058  // This will return the root symbol of any alias
1059  LIB_SYMBOL* symbol = m_libMgr->GetBufferedSymbol( aLibId.GetLibItemName(),
1060  aLibId.GetLibNickname() );
1061 
1062  // Now we can compare the libId of the current symbol and the root symbol
1063  return ( symbol && m_symbol && symbol->GetLibId() == m_symbol->GetLibId() );
1064 }
1065 
1066 
1068 {
1070  SetCurLib( wxEmptyString );
1071  SetCurSymbol( nullptr, false );
1075  Refresh();
1076 }
1077 
1078 
1079 void SYMBOL_EDIT_FRAME::CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged )
1080 {
1081  SCH_BASE_FRAME::CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
1082 
1084  GetCanvas()->GetGAL()->DrawGrid();
1085 
1086  RecreateToolbars();
1087 
1088  if( aEnvVarsChanged )
1089  SyncLibraries( true );
1090 
1091  Layout();
1092  SendSizeEvent();
1093 }
1094 
1095 
1097 {
1098  // call my base class
1100 
1101  // tooltips in toolbars
1102  RecreateToolbars();
1103 
1104  // status bar
1105  UpdateMsgPanel();
1106 }
1107 
1108 
1110 {
1111  SCH_BASE_FRAME::SetScreen( aScreen );
1112 }
1113 
1114 
1116 {
1124 
1125  GetCanvas()->Refresh();
1126 }
1127 
1128 
1130 {
1131  SyncLibraries( true );
1132 
1133  if( m_symbol )
1134  {
1136  EE_SELECTION& selection = selectionTool->GetSelection();
1137 
1138  for( LIB_ITEM& item : m_symbol->GetDrawItems() )
1139  {
1140  if( !alg::contains( selection, &item ) )
1141  item.ClearSelected();
1142  else
1143  item.SetSelected();
1144  }
1145  }
1146 
1147  RebuildView();
1148 }
1149 
1150 
1151 const BOX2I SYMBOL_EDIT_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
1152 {
1153  if( !m_symbol )
1154  {
1155  return BOX2I( VECTOR2I( Mils2iu( -100 ), Mils2iu( -100 ) ),
1156  VECTOR2I( Mils2iu( 200 ), Mils2iu( 200 ) ) );
1157  }
1158  else
1159  {
1160  EDA_RECT boundingBox = m_symbol->Flatten()->GetUnitBoundingBox( m_unit, m_convert );
1162  boundingBox.GetHeight() ) );
1163  }
1164 }
1165 
1166 
1168 {
1169  const std::string& payload = mail.GetPayload();
1170 
1171  switch( mail.Command() )
1172  {
1173  case MAIL_LIB_EDIT:
1174  if( !payload.empty() )
1175  {
1176  wxString libFileName( payload );
1177  wxString libNickname;
1178  wxString msg;
1179 
1180  SYMBOL_LIB_TABLE* libTable = Prj().SchSymbolLibTable();
1181  const LIB_TABLE_ROW* libTableRow = libTable->FindRowByURI( libFileName );
1182 
1183  if( !libTableRow )
1184  {
1185  msg.Printf( _( "The current configuration does not include the library '%s'.\n"
1186  "Use Manage Symbol Libraries to edit the configuration." ),
1187  libFileName );
1188  DisplayErrorMessage( this, _( "Library not found in symbol library table." ), msg );
1189  break;
1190  }
1191 
1192  libNickname = libTableRow->GetNickName();
1193 
1194  if( !libTable->HasLibrary( libNickname, true ) )
1195  {
1196  msg.Printf( _( "The library '%s' is not enabled in the current configuration.\n"
1197  "Use Manage Symbol Libraries to edit the configuration." ),
1198  UnescapeString( libNickname ) );
1199  DisplayErrorMessage( this, _( "Symbol library not enabled." ), msg );
1200  break;
1201  }
1202 
1203  SetCurLib( libNickname );
1204 
1205  if( m_treePane )
1206  {
1207  LIB_ID id( libNickname, wxEmptyString );
1208  m_treePane->GetLibTree()->SelectLibId( id );
1209  m_treePane->GetLibTree()->ExpandLibId( id );
1210  m_treePane->GetLibTree()->CenterLibId( id );
1211  }
1212  }
1213 
1214  break;
1215 
1216  default:
1217  ;
1218  }
1219 }
1220 
1221 
1223 {
1224  // switches currently used canvas ( Cairo / OpenGL):
1225  SCH_BASE_FRAME::SwitchCanvas( aCanvasType );
1226 
1227  // Set options specific to symbol editor (axies are always enabled):
1228  GetCanvas()->GetGAL()->SetAxesEnabled( true );
1230 }
1231 
1232 
1234 {
1235  wxCHECK( m_libMgr, false );
1236 
1237  return m_libMgr->HasModifications();
1238 }
1239 
1240 
1242 {
1243  wxCHECK( m_libMgr, false );
1244 
1245  // Test if the currently edited symbol is modified
1246  if( GetScreen() && GetScreen()->IsContentModified() && GetCurSymbol() )
1247  return true;
1248 
1249  // Test if any library has been modified
1250  for( const wxString& libName : m_libMgr->GetLibraryNames() )
1251  {
1252  if( m_libMgr->IsLibraryModified( libName ) && !m_libMgr->IsLibraryReadOnly( libName ) )
1253  return true;
1254  }
1255 
1256  return false;
1257 }
1258 
1259 
1261 {
1262  if( aItemCount == 0 )
1263  return;
1264 
1265  UNDO_REDO_CONTAINER& list = whichList == UNDO_LIST ? m_undoList : m_redoList;
1266 
1267  for( PICKED_ITEMS_LIST* command : list.m_CommandsList )
1268  {
1269  command->ClearListAndDeleteItems();
1270  delete command;
1271  }
1272 
1273  list.m_CommandsList.clear();
1274 }
1275 
1276 
1278 {
1279  return m_toolManager->GetTool<EE_SELECTION_TOOL>()->GetSelection();
1280 }
1281 
1282 
1284 {
1285  std::unique_ptr<LIB_SYMBOL> symbol = aSymbol->GetLibSymbolRef()->Flatten();
1286  wxCHECK( symbol, /* void */ );
1287 
1288  std::vector<LIB_FIELD> fullSetOfFields;
1289 
1290  for( int i = 0; i < (int) aSymbol->GetFields().size(); ++i )
1291  {
1292  const SCH_FIELD& field = aSymbol->GetFields()[i];
1293  wxPoint pos = field.GetPosition() - aSymbol->GetPosition();
1294  LIB_FIELD libField( symbol.get(), field.GetId() );
1295 
1296  if( i >= MANDATORY_FIELDS && !field.GetName( false ).IsEmpty() )
1297  libField.SetName( field.GetName( false ) );
1298 
1299  libField.SetText( field.GetText() );
1300  libField.SetEffects( field );
1301  libField.SetPosition( wxPoint( pos.x, -pos.y ) );
1302 
1303  fullSetOfFields.emplace_back( std::move( libField ) );
1304  }
1305 
1306  symbol->SetFields( fullSetOfFields );
1307 
1308  if( m_symbol )
1309  SetCurSymbol( nullptr, false );
1310 
1311  m_isSymbolFromSchematic = true;
1312  m_reference = symbol->GetFieldById( REFERENCE_FIELD )->GetText();
1313  m_unit = std::max( 1, aSymbol->GetUnit() );
1314  m_convert = std::max( 1, aSymbol->GetConvert() );
1315 
1316  // The buffered screen for the symbol
1317  SCH_SCREEN* tmpScreen = new SCH_SCREEN();
1318 
1319  SetScreen( tmpScreen );
1320  SetCurSymbol( symbol.release(), true );
1321 
1322  ReCreateMenuBar();
1323  ReCreateHToolbar();
1324 
1325  if( IsSymbolTreeShown() )
1326  {
1327  wxCommandEvent evt;
1328  OnToggleSymbolTree( evt );
1329  }
1330 
1331  updateTitle();
1333  SetShowDeMorgan( GetCurSymbol()->HasConversion() );
1335  Refresh();
1336 }
1337 
1338 
1339 bool SYMBOL_EDIT_FRAME::addLibTableEntry( const wxString& aLibFile, TABLE_SCOPE aScope )
1340 {
1341  wxFileName fn = aLibFile;
1342  wxFileName libTableFileName( Prj().GetProjectPath(),
1344  wxString libNickname = fn.GetName();
1345  SYMBOL_LIB_TABLE* libTable = Prj().SchSymbolLibTable();
1346  const ENV_VAR_MAP& envVars = Pgm().GetLocalEnvVariables();
1347 
1348  if( libTable->HasLibrary( libNickname ) )
1349  {
1350  wxString tmp;
1351  int suffix = 1;
1352 
1353  while( libTable->HasLibrary( libNickname ) )
1354  {
1355  tmp.Printf( "%s%d", fn.GetName(), suffix );
1356  libNickname = tmp;
1357  suffix += 1;
1358  }
1359  }
1360 
1362  row->SetNickName( libNickname );
1363 
1364  wxString normalizedPath = NormalizePath( aLibFile, &envVars, Prj().GetProjectPath() );
1365 
1366  if( aScope == GLOBAL_LIB_TABLE )
1367  {
1369  libTableFileName = SYMBOL_LIB_TABLE::GetGlobalTableFileName();
1370 
1371  // We cannot normalize against the current project path when saving to global table.
1372  normalizedPath = NormalizePath( aLibFile, &envVars, wxEmptyString );
1373  }
1374 
1375  if( normalizedPath.IsEmpty() )
1376  normalizedPath = aLibFile;
1377 
1378  row->SetFullURI( normalizedPath );
1379 
1380  wxCHECK( libTable->InsertRow( row ), false );
1381 
1382  try
1383  {
1384  libTable->Save( libTableFileName.GetFullPath() );
1385  }
1386  catch( const IO_ERROR& ioe )
1387  {
1388  wxString msg = aScope == GLOBAL_LIB_TABLE ? _( "Error saving global library table." )
1389  : _( "Error saving project library table." );
1390 
1391  wxMessageDialog dlg( this, msg, _( "File Save Error" ), wxOK | wxICON_ERROR );
1392  dlg.SetExtendedMessage( ioe.What() );
1393  dlg.ShowModal();
1394 
1395  return false;
1396  }
1397 
1398  return true;
1399 }
1400 
1401 
1402 bool SYMBOL_EDIT_FRAME::replaceLibTableEntry( const wxString& aLibNickname,
1403  const wxString& aLibFile )
1404 {
1405  // Check the global library table first because checking the project library table
1406  // checks the global library table as well due to library chaining.
1407  bool isGlobalTable = true;
1408  wxFileName libTableFileName = SYMBOL_LIB_TABLE::GetGlobalTableFileName();;
1409  const ENV_VAR_MAP& envVars = Pgm().GetLocalEnvVariables();
1411  SYMBOL_LIB_TABLE_ROW* row = libTable->FindRow( aLibNickname );
1412 
1413  if( !row )
1414  {
1415  libTableFileName.SetPath( Prj().GetProjectPath() );
1416  libTableFileName.SetName( SYMBOL_LIB_TABLE::GetSymbolLibTableFileName() );
1417  libTable = Prj().SchSymbolLibTable();
1418  isGlobalTable = false;
1419  row = libTable->FindRow( aLibNickname );
1420  }
1421 
1422  wxCHECK( row, false );
1423 
1424  wxString projectPath;
1425 
1426  if( !isGlobalTable )
1427  projectPath = Prj().GetProjectPath();
1428 
1429  wxString normalizedPath = NormalizePath( aLibFile, &envVars, projectPath );
1430 
1431  if( normalizedPath.IsEmpty() )
1432  normalizedPath = aLibFile;
1433 
1434  row->SetFullURI( normalizedPath );
1435  row->SetType( "KiCad" );
1436 
1437  try
1438  {
1439  libTable->Save( libTableFileName.GetFullPath() );
1440  }
1441  catch( const IO_ERROR& ioe )
1442  {
1443  wxString msg = isGlobalTable ? _( "Error saving global library table." )
1444  : _( "Error saving project library table." );
1445 
1446  wxMessageDialog dlg( this, msg, _( "File Save Error" ), wxOK | wxICON_ERROR );
1447  dlg.SetExtendedMessage( ioe.What() );
1448  dlg.ShowModal();
1449 
1450  return false;
1451  }
1452 
1453  return true;
1454 }
1455 
1456 
1458 {
1459  return m_symbol && !m_symbol->IsRoot();
1460 }
1461 
1462 
1464 {
1466 }
void ShutdownAllTools()
Shutdown all tools with a currently registered event loop in this tool manager by waking them up with...
Field Reference of part, i.e. "IC21".
void OnModify() override
Must be called after a schematic change in order to set the "modify" flag of the current symbol.
void ShowChangedLanguage() override
void DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
Definition: confirm.cpp:271
static bool ShowAlways(const SELECTION &aSelection)
The default condition function (always returns true).
bool IsMulti() const
Definition: lib_symbol.h:501
static TOOL_ACTION pinTable
Definition: ee_actions.h:142
KIGFX::SCH_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
static const wxString & GetSymbolLibTableFileName()
void ShowMessage(const wxString &aMessage, int aFlags=wxICON_INFORMATION) override
Show the info bar with the provided message and icon.
Definition: infobar.cpp:142
COLOR_SETTINGS * GetColorSettings() const override
Returns a pointer to the active color theme settings.
Instances are attached to a symbol or sheet and provide a place for the symbol's value,...
Definition: sch_field.h:49
static SYMBOL_LIB_TABLE & GetGlobalLibTable()
LIB_SYMBOL_REF & GetParent()
Definition: lib_symbol.h:124
static TOOL_ACTION showDatasheet
Inspection and Editing.
Definition: ee_actions.h:136
int m_convert
Flag if the symbol being edited was loaded directly from a schematic.
static TOOL_ACTION placeSymbolText
Definition: ee_actions.h:98
static TOOL_ACTION drawSymbolLines
Definition: ee_actions.h:102
BOX2< VECTOR2I > BOX2I
Definition: box2.h:506
SELECTION & GetCurrentSelection() override
Get the current selection from the canvas area.
Carry a payload from one KIWAY_PLAYER to another within a PROJECT.
Definition: kiway_express.h:38
const UTF8 & GetLibItemName() const
Definition: lib_id.h:104
void AddButton(wxButton *aButton)
Add an already created button to the infobar.
Definition: infobar.cpp:245
void OnKiCadExit()
Definition: kiway.cpp:625
Hold a record identifying a symbol library accessed by the appropriate symbol library SCH_PLUGIN obje...
KIWAY & Kiway() const
Return a reference to the KIWAY that this object has an opportunity to participate in.
Definition: kiway_holder.h:53
void ClearHiddenFlags()
Clear the hide flag of all items in the view.
Definition: sch_view.cpp:171
bool HasLibrary(const wxString &aNickname, bool aCheckEnabled=false) const
Test for the existence of aNickname in the library table.
Hold a record identifying a library accessed by the appropriate plug in object in the LIB_TABLE.
SCH_SCREEN * m_dummyScreen
< Helper screen used when no symbol is loaded
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition: confirm.cpp:284
KIGFX::GAL_DISPLAY_OPTIONS & GetGalDisplayOptions()
Return a reference to the gal rendering options used by GAL for rendering.
void ShowChangedLanguage() override
Redraw the menus and what not in current language.
Model changes (required full reload)
Definition: tool_base.h:80
static TOOL_ACTION runERC
Definition: ee_actions.h:137
bool InsertRow(LIB_TABLE_ROW *aRow, bool doReplace=false)
Adds aRow if it does not already exist or if doReplace is true.
void OnUpdateUnitNumber(wxUpdateUIEvent &event)
This file is part of the common library.
static TOOL_ACTION doDelete
Definition: actions.h:72
SELECTION_CONDITION FullscreenCursor()
Create a functor testing if the cursor is full screen in a frame.
wxString GetName() const override
Definition: lib_symbol.h:133
bool backupFile(const wxFileName &aOriginalFile, const wxString &aBackupExt)
Return currently edited symbol.
static TOOL_ACTION showSymbolTree
Definition: ee_actions.h:200
bool AddLibrary(const wxString &aFilePath, SYMBOL_LIB_TABLE *aTable)
Add an existing library.
virtual void SetScreen(BASE_SCREEN *aScreen)
UNDO_REDO_CONTAINER m_undoList
static TOOL_ACTION zoomTool
Definition: actions.h:99
EVT_UPDATE_UI(ID_LOAD_FOOTPRINT_FROM_BOARD, FOOTPRINT_EDIT_FRAME::OnUpdateLoadFootprintFromBoard) EVT_UPDATE_UI(ID_ADD_FOOTPRINT_TO_BOARD
static bool Idle(const SELECTION &aSelection)
Test if there no items selected or being edited.
void SetScreen(BASE_SCREEN *aScreen) override
void SetShowDeMorgan(bool show)
void SetType(const wxString &aType) override
Change the schematic plugin type represented by this row.
LIB_SYMBOL * GetBufferedSymbol(const wxString &aAlias, const wxString &aLibrary)
Return the symbol copy from the buffer.
SYMBOL_EDITOR_SETTINGS * GetSettings() const
static const wxString ShowType(SCH_FILE_T aFileType)
Return a brief name for a plugin, given aFileType enum.
Definition: sch_io_mgr.cpp:79
wxPoint GetPosition() const override
Definition: sch_field.cpp:709
bool LibraryFileBrowser(bool doOpen, wxFileName &aFilename, const wxString &wildcard, const wxString &ext, bool isDirectory=false, bool aIsGlobal=false, const wxString &aGlobalPath=wxEmptyString)
Field object used in symbol libraries.
Definition: lib_field.h:59
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
wxString GetLibNickname() const override
Definition: lib_symbol.h:138
static TOOL_ACTION cancelInteractive
Definition: actions.h:62
SELECTION_CONDITION CurrentTool(const TOOL_ACTION &aTool)
Create a functor testing if the specified tool is the current active tool in the frame.
SCH_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
void InvokeSchEditSymbolLibTable(KIWAY *aKiway, wxWindow *aParent)
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly)
Populate a std::vector with SCH_FIELDs.
Definition: sch_symbol.cpp:711
bool m_SyncPinEdit
Set to true to synchronize pins at the same position when editing symbols with multiple units or mult...
void LoadSymbolFromSchematic(SCH_SYMBOL *aSymbol)
Load a symbol from the schematic to edit in place.
SYMBOL_TREE_PANE * m_treePane
virtual void setupUIConditions()
Setup the UI conditions for the various actions and their controls in this frame.
void SwitchCanvas(EDA_DRAW_PANEL_GAL::GAL_TYPE aCanvasType) override
Switch currently used canvas ( Cairo / OpenGL).
static TOOL_ACTION zoomFitScreen
Definition: actions.h:96
static TOOL_ACTION millimetersUnits
Definition: actions.h:146
int GetId() const
Definition: sch_field.h:113
void RecreateToolbars()
Rebuild all toolbars, and update the checked state of check tools.
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Run the specified action.
Definition: tool_manager.h:143
void storeCurrentSymbol()
Return true if aLibId is an alias for the editor screen symbol.
void SetSize(const Vec &size)
Definition: box2.h:195
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
Definition: kiway.cpp:382
virtual void ExpressMail(FRAME_T aDestination, MAIL_T aCommand, std::string &aPayload, wxWindow *aSource=nullptr)
Send aPayload to aDestination from aSource.
Definition: kiway.cpp:476
KIGFX::SCH_RENDER_SETTINGS * GetRenderSettings()
static bool m_showDeMorgan
Schematic editor (Eeschema) main window.
SELECTION_CONDITION RedoAvailable()
Create a functor that tests if there are any items in the redo queue.
void ClearUndoORRedoList(UNDO_REDO_LIST whichList, int aItemCount=-1) override
Free the undo or redo list from aList element.
wxAuiManager m_auimgr
Manage TOOL_ACTION objects.
static wxString SubReference(int aUnit, bool aAddSeparator=true)
Definition: lib_symbol.cpp:445
static TOOL_ACTION mirrorH
Definition: ee_actions.h:116
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:51
The base class for create windows for drawing purpose.
void SetName(const wxString &aName)
Set a user definable field name to aName.
Definition: lib_field.cpp:385
bool IsValid() const
Check if this LID_ID is valid.
Definition: lib_id.h:159
wxString m_reference
The reference of the symbol.
VECTOR2< int > VECTOR2I
Definition: vector2d.h:623
Define a library symbol object.
Definition: lib_symbol.h:96
LIB_TREE_NODE * GetCurrentTreeNode() const
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:106
static TOOL_ACTION showDeMorganAlternate
Definition: ee_actions.h:124
wxString GetCurLib() const
The nickname of the current library being edited and empty string if none.
SYMBOL_LIB_TABLE * selectSymLibTable(bool aOptional=false)
Display a dialog asking the user to select a symbol library table.
void OnSelectUnit(wxCommandEvent &event)
virtual const wxString GetProjectPath() const
Return the full path of the project.
Definition: project.cpp:122
Class that groups generic conditions for editor states.
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
Definition: lib_symbol.cpp:332
bool GetShowDeMorgan() const
bool InvokeTool(TOOL_ID aToolId)
Call a tool by sending a tool activation event to tool of given ID.
bool IsSymbolFromSchematic() const
The base class for drawable items used by schematic library symbols.
Definition: lib_item.h:61
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
Definition: sch_symbol.h:164
LIB_SYMBOL * getTargetSymbol() const
Return either the library selected in the symbol tree, if context menu is active or the library that ...
static TOOL_ACTION mirrorV
Definition: ee_actions.h:115
static TOOL_ACTION rotateCW
Definition: ee_actions.h:113
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
#define CHECK(x)
static TOOL_ACTION drawSymbolRectangle
Definition: ee_actions.h:99
bool m_axesEnabled
Fullscreen crosshair or small cross.
Library Editor pane with symbol tree and symbol library table selector.
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
#define LIB_EDIT_FRAME_NAME
EE_SELECTION & GetSelection()
Return the set of currently selected items.
void SetShutdownBlockReason(wxWindow *aWindow, const wxString &aReason)
Sets the block reason why the window/application is preventing OS shutdown.
Definition: gtk/app.cpp:83
LIB_ID GetTreeLIBID(int *aUnit=nullptr) const
Return the LIB_ID of the library or symbol selected in the symbol tree.
BOX2I boundingBox(T aObject)
Used by SHAPE_INDEX to get the bounding box of a generic T object.
Definition: shape_index.h:62
Master controller class:
Definition: tool_manager.h:54
A holder to handle a list of undo (or redo) commands.
static TOOL_ACTION copy
Definition: actions.h:67
const wxString & GetNickName() const
static TOOL_ACTION rotateCCW
Definition: ee_actions.h:114
LIB_SYMBOL * GetCurSymbol() const
Return the current symbol being edited or NULL if none selected.
void Dismiss() override
Dismisses the infobar and updates the containing layout and AUI manager (if one is provided).
Definition: infobar.cpp:175
static TOOL_ACTION placeSymbolPin
Definition: ee_actions.h:97
Multi-thread safe progress reporter dialog, intended for use of tasks that parallel reporting back of...
void updateTitle()
Update the main window title bar with the current library name and read only status of the library.
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
Definition: app_settings.h:99
SELECTION_CONDITION GridVisible()
Create a functor testing if the grid is visible in a frame.
wxString GetUniqueLibraryName() const
Return a library name that is not currently in use.
VECTOR2< double > VECTOR2D
Definition: vector2d.h:622
LIB_TREE_NODE * GetCurrentTreeNode() const
Definition: lib_tree.cpp:182
bool IsSymbolAlias() const
Restore the empty editor screen, without any symbol or library selected.
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:30
void Refresh()
Update the board display after modifying it by a python script (note: it is automatically called by a...
SELECTION_CONDITION Units(EDA_UNITS aUnit)
Create a functor that tests if the frame has the specified units.
SYMBOL_LIB_TABLE_ROW * GetLibrary(const wxString &aLibrary) const
Find a single library within the (aggregate) library table.
std::vector< PICKED_ITEMS_LIST * > m_CommandsList
void SetCurSymbol(LIB_SYMBOL *aSymbol, bool aUpdateZoom)
Take ownership of aSymbol and notes that it is the one currently being edited.
void Clear()
Remove all items from the view.
Definition: view.cpp:1107
static TOOL_ACTION toggleGrid
Definition: actions.h:140
LIB_ID GetLibId() const override
Definition: lib_symbol.h:135
virtual void OnSize(wxSizeEvent &event) override
Recalculate the size of toolbars and display panel when the frame size changes.
Class to handle modifications to the symbol libraries.
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
const LIB_TABLE_ROW * FindRowByURI(const wxString &aURI)
static TOOL_ACTION inchesUnits
Definition: actions.h:144
Handles how to draw a screen (a board, a schematic ...)
Definition: base_screen.h:40
bool IsLibraryReadOnly(const wxString &aLibrary) const
Return true if the library is stored in a read-only file.
coord_type GetWidth() const
Definition: box2.h:180
static TOOL_ACTION save
Definition: actions.h:51
virtual void DispatchWxEvent(wxEvent &aEvent)
Process wxEvents (mostly UI events), translate them to TOOL_EVENTs, and make tools handle those.
static TOOL_ACTION symbolProperties
Definition: ee_actions.h:141
int GetUnitCount() const override
For items with units, return the number of units.
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
void SetAxesColor(const COLOR4D &aAxesColor)
Set the axes color.
wxString getTargetLib() const
const wxString GetType() const override
Return the type of symbol library table represented by this row.
SYMBOL_LIBRARY_MANAGER & GetLibManager()
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:168
void HardRedraw() override
Rebuild the GAL and redraw the screen.
int UnsavedChangesDialog(wxWindow *parent, const wxString &aMessage, bool *aApplyToAll)
A specialized version of HandleUnsavedChanges which handles an apply-to-all checkbox.
Definition: confirm.cpp:176
T * GetAppSettings(bool aLoadNow=true)
Returns a handle to the a given settings by type If the settings have already been loaded,...
ACTIONS * m_actions
Definition: tools_holder.h:159
virtual void DrawGrid()
static TOOL_ACTION cut
Definition: actions.h:66
static TOOL_ACTION drawSymbolCircle
Definition: ee_actions.h:100
void Regenerate(bool aKeepState)
Regenerate the tree.
Definition: lib_tree.cpp:216
Definition of file extensions used in Kicad.
void Unselect()
Unselect currently selected item in wxDataViewCtrl.
Definition: lib_tree.cpp:205
void CloseWindow(wxCommandEvent &event)
Trigger the wxCloseEvent, which is handled by the function given to EVT_CLOSE() macro:
void ResetTools(TOOL_BASE::RESET_REASON aReason)
Reset all tools (i.e.
void ReCreateHToolbar() override
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition: kiway.h:260
Definition for symbol library class.
bool saveSymbolLibTables(bool aGlobal, bool aProject)
Save Symbol Library Tables to disk.
KIGFX::GAL * GetGAL() const
Return a pointer to the GAL instance used in the panel.
#define _(s)
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Definition: lib_id.h:90
bool replaceLibTableEntry(const wxString &aLibNickname, const wxString &aLibFile)
Replace the file path of the symbol library table entry aLibNickname with aLibFile.
wxString KiCadSymbolLibFileWildcard()
bool SupportsShutdownBlockReason()
Whether or not the window supports setting a shutdown block reason.
Definition: gtk/app.cpp:72
#define KICAD_DEFAULT_DRAWFRAME_STYLE
static TOOL_ACTION importSymbol
Definition: ee_actions.h:175
static TOOL_ACTION clearSelection
Clears the current selection.
Definition: ee_actions.h:53
void DisplaySymbol(LIB_SYMBOL *aSymbol)
void Sync(const wxString &aForceRefresh, std::function< void(int, int, const wxString &)> aProgressCallback)
Updates the SYMBOL_LIBRARY_MANAGER data to synchronize with Symbol Library Table.
A holder to handle information on schematic or board items.
Model class in the component selector Model-View-Adapter (mediated MVC) architecture.
int SetLibItemName(const UTF8 &aLibItemName)
Override the library item name portion of the LIB_ID to aLibItemName.
Definition: lib_id.cpp:108
void RegenerateLibraryTree()
Filter, sort, and redisplay the library tree.
void OnToggleSymbolTree(wxCommandEvent &event)
bool isCurrentSymbol(const LIB_ID &aLibId) const
Rename LIB_SYMBOL aliases to avoid conflicts before adding a symbol to a library.
wxBitmap KiBitmap(BITMAPS aBitmap, int aHeightTag)
Construct a wxBitmap from an image identifier Returns the image from the active theme if the image ha...
Definition: bitmap.cpp:105
Handle actions that are shared between different applications.
void RefreshLibTree()
Refreshes the tree (mainly to update highlighting and asterisking)
Definition: lib_tree.cpp:234
void SetAxesEnabled(bool aAxesEnabled)
Enable drawing the axes.
bool HasLibModifications() const
Check if any pending libraries have been modified.
void ReCreateMenuBar() override
Recreates the menu bar.
LIB_ITEMS_CONTAINER & GetDrawItems()
Return a reference to the draw item list.
Definition: lib_symbol.h:473
Specialization of the wxAuiPaneInfo class for KiCad panels.
static TOOL_ACTION showDeMorganStandard
Definition: ee_actions.h:123
bool canCloseWindow(wxCloseEvent &aCloseEvent) override
bool addLibTableEntry(const wxString &aLibFile, TABLE_SCOPE aScope=GLOBAL_LIB_TABLE)
Add aLibFile to the symbol library table defined by aScope.
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...
static TOOL_ACTION showElectricalTypes
Definition: ee_actions.h:199
void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Called after the preferences dialog is run.
UNDO_REDO_CONTAINER m_redoList
void RemoveAllButtons()
Remove all the buttons that have been added by the user.
Definition: infobar.cpp:286
static TOOL_ACTION milsUnits
Definition: actions.h:145
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
Definition: kicad_algo.h:99
void UpdateSymbolMsgPanelInfo()
Display the documentation of the selected symbol.
wxString UnescapeString(const wxString &aSource)
TOOL_DISPATCHER * m_toolDispatcher
Definition: tools_holder.h:160
Gather all the actions that are shared by tools.
Definition: ee_actions.h:38
Handles action that are shared between different applications.
Definition: common_tools.h:37
COLOR_SETTINGS * m_colorSettings
The current canvas type.
bool UnitsLocked() const
Check whether symbol units are interchangeable.
Definition: lib_symbol.h:241
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:212
const BOX2I GetDocumentExtents(bool aIncludeAllVisible=true) const override
Returns bbox of document with option to not include some items.
UNDO_REDO_LIST
Specifies whether we are interacting with the undo or redo stacks.
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
void SetContentModified(bool aModified=true)
Definition: base_screen.h:59
The first 4 are mandatory, and must be instantiated in SCH_COMPONENT and LIB_PART constructors.
void setupUIConditions() override
Setup the UI conditions for the various actions and their controls in this frame.
static TOOL_ACTION newSymbol
Definition: ee_actions.h:168
wxArrayString GetLibraryNames() const
Return the array of library names.
void ExpandLibId(const LIB_ID &aLibId)
Expand and item i the tree widget.
Definition: lib_tree.cpp:210
bool LoadSymbolFromCurrentLib(const wxString &aAliasName, int aUnit=0, int aConvert=0)
Load a symbol from the current active library, optionally setting the selected unit and convert.
static TOOL_ACTION saveSymbolAs
Definition: ee_actions.h:167
COLOR_SETTINGS * GetColorSettings(const wxString &aName="user")
Retrieves a color settings object that applications can read colors from.
void doCloseWindow() override
APP_SETTINGS_BASE * config() const override
Returns the settings object used in SaveSettings(), and is overloaded in KICAD_MANAGER_FRAME.
A modified version of the wxInfoBar class that allows us to:
Definition: infobar.h:73
LIB_ID GetTargetLibId() const
static TOOL_ACTION redo
Definition: actions.h:65
COLOR4D GetColor(int aLayer) const
void HideDrawingSheet()
Definition: sch_view.cpp:178
void KiwayMailIn(KIWAY_EXPRESS &mail) override
Receive KIWAY_EXPRESS messages from other players.
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:227
bool IsLibraryModified(const wxString &aLibrary) const
Return true if library has unsaved modifications.
static wxString GetDefaultUserSymbolsPath()
Gets the default path we point users to create projects.
Definition: paths.cpp:97
bool LibraryExists(const wxString &aLibrary, bool aCheckEnabled=false) const
Return true if library exists.
bool IsContentModified() const override
Get if any symbols or libraries have been modified but not saved.
void RefreshLibraryTree()
Redisplay the library tree.
TOOL_MANAGER * m_toolManager
Definition: tools_holder.h:158
void SetFullURI(const wxString &aFullURI)
Change the full URI for the library.
see class PGM_BASE
SYMBOL_EDITOR_SETTINGS * m_settings
std::map< wxString, ENV_VAR_ITEM > ENV_VAR_MAP
Schematic symbol object.
Definition: sch_symbol.h:78
bool IsSymbolEditable() const
Test if a symbol is loaded and can be edited.
virtual void SwitchCanvas(EDA_DRAW_PANEL_GAL::GAL_TYPE aCanvasType)
Changes the current rendering backend.
wxObjectDataPtr< LIB_TREE_MODEL_ADAPTER > & GetAdapter()
Return the adapter object that provides the stored data.
bool saveAllLibraries(bool aRequireConfirmation)
Save the current symbol.
void SetEnvironment(EDA_ITEM *aModel, KIGFX::VIEW *aView, KIGFX::VIEW_CONTROLS *aViewControls, APP_SETTINGS_BASE *aSettings, TOOLS_HOLDER *aFrame)
Set the work environment (model, view, view controls and the parent window).
void SetEventDispatcher(TOOL_DISPATCHER *aEventDispatcher)
Set a dispatcher that processes events and forwards them to tools.
Tool that displays edit points allowing to modify items by dragging the points.
SELECTION_CONDITION UndoAvailable()
Create a functor that tests if there are any items in the undo queue.
void SetNickName(const wxString &aNickName)
Change the logical name of this library, useful for an editor.
Functors that can be used to figure out how the action controls should be displayed in the UI and if ...
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
wxString GetName(bool aUseDefaultName=true) const
Return the field name.
Definition: sch_field.cpp:544
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
Update the board display after modifying it by a python script (note: it is automatically called by a...
void SetOrigin(const Vec &pos)
Definition: box2.h:193
#define EDIT_TOOL(tool)
LIB_FIELD & GetDatasheetField()
Return reference to the datasheet field.
Handle the component boundary box.
Definition: eda_rect.h:42
wxProgressDialog with the option to also update the application progress on the taskbar
static bool empty(const wxTextEntryBase *aCtrl)
void Save(const wxString &aFileName) const
Write this library table to aFileName in s-expression form.
static TOOL_ACTION drawSymbolArc
Definition: ee_actions.h:101
wxPoint GetPosition() const override
Definition: sch_symbol.h:641
coord_type GetHeight() const
Definition: box2.h:181
void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Notification event that some of the common (suite-wide) settings have changed.
void SaveSymbolToSchematic(const LIB_SYMBOL &aSymbol)
Update the LIB_SYMBOL of the currently selected symbol.
LIB_SYMBOL * GetAlias(const wxString &aAlias, const wxString &aLibrary) const
Return either an alias of a working LIB_SYMBOL copy, or alias of the original symbol if there is no w...
ACTION_MANAGER * GetActionManager() const
Definition: tool_manager.h:199
void OnExitKiCad(wxCommandEvent &event)
bool Destroy() override
Our version of Destroy() which is virtual from wxWidgets.
bool UpdateSymbol(LIB_SYMBOL *aSymbol, const wxString &aLibrary)
Update the symbol buffer with a new version of the symbol.
Color settings are a bit different than most of the settings objects in that there can be more than o...
WX_INFOBAR * GetInfoBar()
static TOOL_ACTION deleteTool
Definition: actions.h:73
SYMBOL_LIBRARY_MANAGER * m_libMgr
bool CreateLibrary(const wxString &aFilePath, SYMBOL_LIB_TABLE *aTable)
Create an empty library and adds it to the library table.
static TOOL_ACTION toggleSyncedPinsMode
Definition: ee_actions.h:193
bool IsRoot() const override
For symbols derived from other symbols, IsRoot() indicates no derivation.
Definition: lib_symbol.h:171
static TOOL_ACTION undo
Definition: actions.h:64
void OnGridSettings(wxCommandEvent &event)
static TOOL_ACTION toggleCursorStyle
Definition: actions.h:102
static TOOL_ACTION saveAll
Definition: actions.h:54
void InitTools()
Initializes all registered tools.
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...
const Vec & GetOrigin() const
Definition: box2.h:176
bool AddLibraryFile(bool aCreateNew)
Create or add an existing library to the symbol library table.
int GetUnit() const
Definition: sch_symbol.h:195
void emptyScreen()
Return either the symbol selected in the symbol tree, if context menu is active or the currently modi...
MAIL_T Command()
Returns the MAIL_T associated with this mail.
Definition: kiway_express.h:49
LIB_TREE * GetLibTree() const
BASE_SCREEN class implementation.
void SyncLibraries(bool aShowProgress, const wxString &aForceRefresh=wxEmptyString)
Synchronize the library manager to the symbol library table, and then the symbol tree to the library ...
Handle actions for the various symbol editor and viewers.
static constexpr int Millimeter2iu(double mm)
A shim class between EDA_DRAW_FRAME and several derived classes: SYMBOL_EDIT_FRAME,...
bool IsSymbolFromLegacyLibrary() const
int GetConvert() const
Definition: sch_symbol.h:223
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
Definition: ki_exception.h:75
wxString SetCurLib(const wxString &aLibNickname)
Set the current library nickname and returns the old library nickname.
static TOOL_ACTION selectAll
Definition: actions.h:70
static wxString GetGlobalTableFileName()
Fetch the global symbol library table file name.
virtual void ClearUndoRedoList()
Clear the undo and redo list using ClearUndoORRedoList()
std::string & GetPayload()
Return the payload, which can be any text but it typically self identifying s-expression.
Definition: kiway_express.h:57
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:133
static TOOL_ACTION paste
Definition: actions.h:68
#define ENABLE(x)
static TOOL_ACTION duplicate
Definition: actions.h:71
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:69
static TOOL_ACTION placeSymbolAnchor
Definition: ee_actions.h:103
void ClearListAndDeleteItems()
Delete the list of pickers AND the data pointed by #m_PickedItem or #m_PickedItemLink according to th...
static TOOL_ACTION revert
Definition: actions.h:55
static TOOL_ACTION selectionTool
Definition: actions.h:153
static TOOL_ACTION saveLibraryAs
Definition: ee_actions.h:166
wxComboBox * m_unitSelectBox
void RegisterTool(TOOL_BASE *aTool)
Add a tool to the manager set and sets it up.
void CenterLibId(const LIB_ID &aLibId)
Ensure that an item is visible (preferably centered).
Definition: lib_tree.cpp:199
SYMBOL_EDITOR_DRAWING_TOOLS.
void SelectLibId(const LIB_ID &aLibId)
Select an item in the tree widget.
Definition: lib_tree.cpp:193
bool empty() const
Definition: utf8.h:103
virtual void UpdateMsgPanel()
Redraw the message panel.
const std::string KiCadSymbolLibFileExtension
wxString m_ColorTheme
Active color theme name.
Definition: app_settings.h:184
The symbol library editor main window.