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_i.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 
76 
78 
79 
80 BEGIN_EVENT_TABLE( SYMBOL_EDIT_FRAME, EDA_DRAW_FRAME )
81  EVT_SIZE( SYMBOL_EDIT_FRAME::OnSize )
82 
84 
85  // menubar commands
86  EVT_MENU( wxID_EXIT, SYMBOL_EDIT_FRAME::OnExitKiCad )
87  EVT_MENU( wxID_CLOSE, SYMBOL_EDIT_FRAME::CloseWindow )
89 
90  // Update user interface elements.
92 
93 END_EVENT_TABLE()
94 
95 
96 SYMBOL_EDIT_FRAME::SYMBOL_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
97  SCH_BASE_FRAME( aKiway, aParent, FRAME_SCH_SYMBOL_EDITOR, _( "Library Editor" ),
98  wxDefaultPosition, wxDefaultSize, KICAD_DEFAULT_DRAWFRAME_STYLE,
100  m_unitSelectBox( nullptr ),
101  m_isSymbolFromSchematic( false )
102 {
103  SetShowDeMorgan( false );
104  m_SyncPinEdit = false;
105 
106  m_symbol = nullptr;
107  m_treePane = nullptr;
108  m_libMgr = nullptr;
109  m_unit = 1;
110  m_convert = 1;
111  m_aboutTitle = _( "KiCad Symbol Editor" );
112 
113  wxIcon icon;
114  wxIconBundle icon_bundle;
115 
116  icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit ) );
117  icon_bundle.AddIcon( icon );
118  icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit_32 ) );
119  icon_bundle.AddIcon( icon );
120  icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_libedit_16 ) );
121  icon_bundle.AddIcon( icon );
122 
123  SetIcons( icon_bundle );
124 
125  m_settings = Pgm().GetSettingsManager().GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
126  LoadSettings( m_settings );
127 
128  // Ensure axis are always drawn
129  KIGFX::GAL_DISPLAY_OPTIONS& gal_opts = GetGalDisplayOptions();
130  gal_opts.m_axesEnabled = true;
131 
132  m_dummyScreen = new SCH_SCREEN();
133  SetScreen( m_dummyScreen );
134  GetScreen()->m_Center = true;
135 
136  GetCanvas()->GetViewControls()->SetCrossHairCursorPosition( VECTOR2D( 0, 0 ), false );
137 
138  GetRenderSettings()->LoadColors( GetColorSettings() );
139  GetCanvas()->GetGAL()->SetAxesColor( m_colorSettings->GetColor( LAYER_SCHEMATIC_GRID_AXES ) );
140 
141  setupTools();
142  setupUIConditions();
143 
144  m_libMgr = new SYMBOL_LIBRARY_MANAGER( *this );
145 
146  // Preload libraries before using SyncLibraries the first time, as the preload is threaded
147  WX_PROGRESS_REPORTER reporter( this, _( "Loading Symbol Libraries" ),
148  m_libMgr->GetLibraryCount(), true );
149  m_libMgr->Preload( reporter );
150 
151  SyncLibraries( false );
152  m_treePane = new SYMBOL_TREE_PANE( this, m_libMgr );
153 
154  ReCreateMenuBar();
155  ReCreateHToolbar();
156  ReCreateVToolbar();
157  ReCreateOptToolbar();
158 
159  updateTitle();
160  DisplaySymbolDatasheet();
161  RebuildSymbolUnitsList();
162 
163  m_auimgr.SetManagedWindow( this );
164 
165  CreateInfoBar();
166  m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( "MainToolbar" )
167  .Top().Layer( 6 ) );
168  m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( "MsgPanel" )
169  .Bottom().Layer( 6 ) );
170 
171  m_auimgr.AddPane( m_optionsToolBar, EDA_PANE().VToolbar().Name( "OptToolbar" )
172  .Left().Layer( 3 ) );
173  m_auimgr.AddPane( m_treePane, EDA_PANE().Palette().Name( "SymbolTree" )
174  .Left().Layer( 2 )
175  .Caption( _( "Libraries" ) )
176  .MinSize( 250, -1 ).BestSize( 250, -1 ) );
177  m_auimgr.AddPane( m_drawToolBar, EDA_PANE().VToolbar().Name( "ToolsToolbar" )
178  .Right().Layer( 2 ) );
179 
180  m_auimgr.AddPane( GetCanvas(), wxAuiPaneInfo().Name( "DrawFrame" )
181  .CentrePane() );
182 
183  FinishAUIInitialization();
184 
185  if( m_settings->m_LibWidth > 0 )
186  {
187  wxAuiPaneInfo& treePane = m_auimgr.GetPane( "SymbolTree" );
188 
189  // wxAUI hack: force width by setting MinSize() and then Fixed()
190  // thanks to ZenJu http://trac.wxwidgets.org/ticket/13180
191  treePane.MinSize( m_settings->m_LibWidth, -1 );
192  treePane.Fixed();
193  m_auimgr.Update();
194 
195  // now make it resizable again
196  treePane.Resizable();
197  m_auimgr.Update();
198 
199  // Note: DO NOT call m_auimgr.Update() anywhere after this; it will nuke the size
200  // back to minimum.
201  treePane.MinSize( 250, -1 );
202  }
203 
204  Raise();
205  Show( true );
206 
207  SyncView();
208  GetCanvas()->GetView()->UseDrawPriority( true );
209  GetCanvas()->GetGAL()->SetAxesEnabled( true );
210 
211  setupUnits( m_settings );
212 
213  // Set the working/draw area size to display a symbol to a reasonable value:
214  // A 600mm x 600mm with a origin at the area center looks like a large working area
215  double max_size_x = Millimeter2iu( 600 );
216  double max_size_y = Millimeter2iu( 600 );
217  BOX2D bbox;
218  bbox.SetOrigin( -max_size_x /2, -max_size_y/2 );
219  bbox.SetSize( max_size_x, max_size_y );
220  GetCanvas()->GetView()->SetBoundary( bbox );
221 
222  m_toolManager->RunAction( ACTIONS::zoomFitScreen, true );
223 
224  KIPLATFORM::APP::SetShutdownBlockReason( this, _( "Library changes are unsaved" ) );
225 
226  // Catch unhandled accelerator command characters that were no handled by the library tree
227  // panel.
228  Bind( wxEVT_CHAR, &TOOL_DISPATCHER::DispatchWxEvent, m_toolDispatcher );
229  Bind( wxEVT_CHAR_HOOK, &TOOL_DISPATCHER::DispatchWxEvent, m_toolDispatcher );
230 
231  // Ensure the window is on top
232  Raise();
233 }
234 
235 
237 {
238  // Shutdown all running tools
239  if( m_toolManager )
241 
242  if( IsSymbolFromSchematic() )
243  {
244  delete m_symbol;
245  m_symbol = nullptr;
246 
247  SCH_SCREEN* screen = GetScreen();
248  delete screen;
249  m_isSymbolFromSchematic = false;
250  }
251  // current screen is destroyed in EDA_DRAW_FRAME
253 
254  auto libedit = Pgm().GetSettingsManager().GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
255  Pgm().GetSettingsManager().Save( libedit );
256 
257  delete m_libMgr;
258 }
259 
260 
262 {
263  wxCHECK_RET( m_settings, "Call to SYMBOL_EDIT_FRAME::LoadSettings with null m_settings" );
264 
266 
268 
269  // Hidden elements must be editable
273 }
274 
275 
277 {
278  wxCHECK_RET( m_settings, "Call to SYMBOL_EDIT_FRAME::LoadSettings with null m_settings" );
279 
281 
283 
285  m_settings->m_LibWidth = m_treePane->GetSize().x;
286 }
287 
288 
290 {
291  return static_cast<APP_SETTINGS_BASE*>( GetSettings() );
292 }
293 
294 
296 {
297  SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
298 
299  if( GetSettings()->m_UseEeschemaColorSettings )
301  else
302  return mgr.GetColorSettings( GetSettings()->m_ColorTheme );
303 }
304 
305 
307 {
308  // Create the manager and dispatcher & route draw panel events to the dispatcher
311  GetCanvas()->GetViewControls(), GetSettings(), this );
312  m_actions = new EE_ACTIONS();
314 
315  // Register tools
329 
330  // Run the selection tool, it is supposed to be always active
331  m_toolManager->InvokeTool( "eeschema.InteractiveSelection" );
332 
334 }
335 
336 
338 {
340 
342  EDITOR_CONDITIONS cond( this );
343 
344  wxASSERT( mgr );
345 
346 #define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
347 #define CHECK( x ) ACTION_CONDITIONS().Check( x )
348 
349  auto haveSymbolCond =
350  [this] ( const SELECTION& )
351  {
352  return m_symbol;
353  };
354 
355  auto isEditableCond =
356  [this] ( const SELECTION& )
357  {
358  // Only root symbols from the new s-expression libraries or the schematic
359  // are editable.
360  return IsSymbolEditable() && !IsSymbolAlias();
361  };
362 
363  auto libModifiedCondition =
364  [this] ( const SELECTION& sel )
365  {
366  return m_libMgr->HasModifications();
367  };
368 
369  auto libSelectedCondition =
370  [this] ( const SELECTION& sel )
371  {
372  return !GetTargetLibId().GetLibNickname().empty();
373  };
374 
375  auto canEditProperties =
376  [this] ( const SELECTION& sel )
377  {
379  };
380 
381  auto saveSymbolAsCondition =
382  [ this ]( const SELECTION& aSel )
383  {
384  LIB_ID sel = GetTargetLibId();
385  return !sel.GetLibNickname().empty() && !sel.GetLibItemName().empty();
386  };
387 
390  mgr->SetConditions( EE_ACTIONS::saveLibraryAs, ENABLE( libSelectedCondition ) );
391  mgr->SetConditions( EE_ACTIONS::saveSymbolAs, ENABLE( saveSymbolAsCondition ) );
394 
395  mgr->SetConditions( ACTIONS::undo, ENABLE( haveSymbolCond && cond.UndoAvailable() ) );
396  mgr->SetConditions( ACTIONS::redo, ENABLE( haveSymbolCond && cond.RedoAvailable() ) );
397  mgr->SetConditions( ACTIONS::revert, ENABLE( haveSymbolCond && libModifiedCondition ) );
398 
404 
405  mgr->SetConditions( ACTIONS::cut, ENABLE( isEditableCond ) );
406  mgr->SetConditions( ACTIONS::copy, ENABLE( haveSymbolCond ) );
407  mgr->SetConditions( ACTIONS::paste, ENABLE( isEditableCond && SELECTION_CONDITIONS::Idle ) );
408  mgr->SetConditions( ACTIONS::doDelete, ENABLE( isEditableCond ) );
409  mgr->SetConditions( ACTIONS::duplicate, ENABLE( isEditableCond ) );
410  mgr->SetConditions( ACTIONS::selectAll, ENABLE( haveSymbolCond ) );
411 
412  mgr->SetConditions( EE_ACTIONS::rotateCW, ENABLE( isEditableCond ) );
413  mgr->SetConditions( EE_ACTIONS::rotateCCW, ENABLE( isEditableCond ) );
414  mgr->SetConditions( EE_ACTIONS::mirrorH, ENABLE( isEditableCond ) );
415  mgr->SetConditions( EE_ACTIONS::mirrorV, ENABLE( isEditableCond ) );
416 
419 
420  auto pinTypeCond =
421  [this] ( const SELECTION& )
422  {
424  };
425 
426  auto showCompTreeCond =
427  [this] ( const SELECTION& )
428  {
429  return IsSymbolTreeShown();
430  };
431 
432  mgr->SetConditions( EE_ACTIONS::showElectricalTypes, CHECK( pinTypeCond ) );
433  mgr->SetConditions( EE_ACTIONS::showSymbolTree, CHECK( showCompTreeCond ) );
434 
435  auto demorganCond =
436  [this] ( const SELECTION& )
437  {
438  return GetShowDeMorgan();
439  };
440 
441  auto demorganStandardCond =
442  [this] ( const SELECTION& )
443  {
444  return m_convert == LIB_ITEM::LIB_CONVERT::BASE;
445  };
446 
447  auto demorganAlternateCond =
448  [this] ( const SELECTION& )
449  {
450  return m_convert == LIB_ITEM::LIB_CONVERT::DEMORGAN;
451  };
452 
453  auto multiUnitModeCond =
454  [this] ( const SELECTION& )
455  {
456  return m_symbol && m_symbol->IsMulti() && !m_symbol->UnitsLocked();
457  };
458 
459  auto syncedPinsModeCond =
460  [this] ( const SELECTION& )
461  {
462  return m_SyncPinEdit;
463  };
464 
465  auto haveDatasheetCond =
466  [this] ( const SELECTION& )
467  {
468  return m_symbol && !m_symbol->GetDatasheetField().GetText().IsEmpty();
469  };
470 
471  mgr->SetConditions( EE_ACTIONS::showDatasheet, ENABLE( haveDatasheetCond ) );
472  mgr->SetConditions( EE_ACTIONS::symbolProperties, ENABLE( canEditProperties && haveSymbolCond ) );
473  mgr->SetConditions( EE_ACTIONS::runERC, ENABLE( haveSymbolCond ) );
474  mgr->SetConditions( EE_ACTIONS::pinTable, ENABLE( isEditableCond && haveSymbolCond ) );
475 
477  ACTION_CONDITIONS().Enable( demorganCond ).Check( demorganStandardCond ) );
479  ACTION_CONDITIONS().Enable( demorganCond ).Check( demorganAlternateCond ) );
481  ACTION_CONDITIONS().Enable( multiUnitModeCond ).Check( syncedPinsModeCond ) );
482 
483 // Only enable a tool if the symbol is edtable
484 #define EDIT_TOOL( tool ) ACTION_CONDITIONS().Enable( isEditableCond ).Check( cond.CurrentTool( tool ) )
485 
494 
495 #undef CHECK
496 #undef ENABLE
497 #undef EDIT_TOOL
498 }
499 
500 
501 bool SYMBOL_EDIT_FRAME::canCloseWindow( wxCloseEvent& aEvent )
502 {
503  // Shutdown blocks must be determined and vetoed as early as possible
504  if( KIPLATFORM::APP::SupportsShutdownBlockReason() && aEvent.GetId() == wxEVT_QUERY_END_SESSION
505  && IsContentModified() )
506  {
507  return false;
508  }
509 
511  {
512  SCH_EDIT_FRAME* schframe = (SCH_EDIT_FRAME*) Kiway().Player( FRAME_SCH, false );
513 
514  switch( UnsavedChangesDialog( this,
515  _( "Save changes to schematic before closing?" ),
516  nullptr ) )
517  {
518  case wxID_YES:
519  if( schframe && GetCurSymbol() ) // Should be always the case
520  schframe->SaveSymbolToSchematic( *GetCurSymbol());
521 
522  return true;
523 
524  case wxID_NO: return true;
525 
526  default:
527  case wxID_CANCEL: return false;
528  }
529  }
530 
531  if( !saveAllLibraries( true ) )
532  {
533  return false;
534  }
535 
536  return true;
537 }
538 
539 
541 {
542  Destroy();
543 }
544 
545 
547 {
548  if( !m_unitSelectBox )
549  return;
550 
551  if( m_unitSelectBox->GetCount() != 0 )
552  m_unitSelectBox->Clear();
553 
554  if( !m_symbol || m_symbol->GetUnitCount() <= 1 )
555  {
556  m_unit = 1;
557  m_unitSelectBox->Append( wxEmptyString );
558  }
559  else
560  {
561  for( int i = 0; i < m_symbol->GetUnitCount(); i++ )
562  {
563  wxString sub = LIB_SYMBOL::SubReference( i+1, false );
564  wxString unit = wxString::Format( _( "Unit %s" ), sub );
565  m_unitSelectBox->Append( unit );
566  }
567  }
568 
569  // Ensure the selected unit is compatible with the number of units of the current symbol:
570  if( m_symbol && m_symbol->GetUnitCount() < m_unit )
571  m_unit = 1;
572 
573  m_unitSelectBox->SetSelection(( m_unit > 0 ) ? m_unit - 1 : 0 );
574 }
575 
576 
577 void SYMBOL_EDIT_FRAME::OnToggleSymbolTree( wxCommandEvent& event )
578 {
579  auto& treePane = m_auimgr.GetPane( m_treePane );
580  treePane.Show( !IsSymbolTreeShown() );
581  m_auimgr.Update();
582 }
583 
584 
586 {
587  return m_auimgr.GetPane( m_treePane ).IsShown();
588 }
589 
590 
592 {
593  m_treePane->Freeze();
594  m_libMgr->GetAdapter()->Freeze();
595 }
596 
597 
599 {
600  m_libMgr->GetAdapter()->Thaw();
601  m_treePane->Thaw();
602 }
603 
604 
605 void SYMBOL_EDIT_FRAME::OnExitKiCad( wxCommandEvent& event )
606 {
607  Kiway().OnKiCadExit();
608 }
609 
610 
611 void SYMBOL_EDIT_FRAME::OnUpdateUnitNumber( wxUpdateUIEvent& event )
612 {
613  event.Enable( m_symbol && m_symbol->GetUnitCount() > 1 );
614 }
615 
616 
617 void SYMBOL_EDIT_FRAME::OnSelectUnit( wxCommandEvent& event )
618 {
619  int i = event.GetSelection();
620 
621  if( ( i == wxNOT_FOUND ) || ( ( i + 1 ) == m_unit ) )
622  return;
623 
626 
627  m_unit = i + 1;
628 
630  RebuildView();
631 }
632 
633 
635 {
636  if( m_symbol )
637  {
639 
640  if( row && row->GetType() == SCH_IO_MGR::ShowType( SCH_IO_MGR::SCH_LEGACY ) )
641  return true;
642  }
643 
644  return false;
645 }
646 
647 
649 {
650  wxString libNickname = Prj().GetRString( PROJECT::SCH_LIBEDIT_CUR_LIB );
651 
652  if( !libNickname.empty() )
653  {
654  if( !Prj().SchSymbolLibTable()->HasLibrary( libNickname ) )
655  {
656  Prj().SetRString( PROJECT::SCH_LIBEDIT_CUR_LIB, wxEmptyString );
657  libNickname = wxEmptyString;
658  }
659  }
660 
661  return libNickname;
662 }
663 
664 
665 wxString SYMBOL_EDIT_FRAME::SetCurLib( const wxString& aLibNickname )
666 {
667  wxString old = GetCurLib();
668 
669  if( aLibNickname.empty() || !Prj().SchSymbolLibTable()->HasLibrary( aLibNickname ) )
670  Prj().SetRString( PROJECT::SCH_LIBEDIT_CUR_LIB, wxEmptyString );
671  else
672  Prj().SetRString( PROJECT::SCH_LIBEDIT_CUR_LIB, aLibNickname );
673 
674  return old;
675 }
676 
677 
678 void SYMBOL_EDIT_FRAME::SetCurSymbol( LIB_SYMBOL* aSymbol, bool aUpdateZoom )
679 {
681  GetCanvas()->GetView()->Clear();
682  delete m_symbol;
683 
684  m_symbol = aSymbol;
685 
686  // select the current symbol in the tree widget
687  if( !IsSymbolFromSchematic() && m_symbol )
689  else
691 
692  wxString symbolName = m_symbol ? m_symbol->GetName() : wxString();
693 
694  // retain in case this wxFrame is re-opened later on the same PROJECT
696 
697  // Ensure synchronized pin edit can be enabled only symbols with interchangeable units
698  m_SyncPinEdit = aSymbol && aSymbol->IsRoot() && aSymbol->IsMulti() && !aSymbol->UnitsLocked();
699 
701 
709 
710  if( aUpdateZoom )
712 
713  GetCanvas()->Refresh();
714 
715  WX_INFOBAR* infobar = GetInfoBar();
716 
717  if( IsSymbolFromSchematic() )
718  {
719  wxString msg;
720  msg.Printf( _( "Editing symbol %s from schematic. Saving will update the schematic "
721  "only." ), m_reference );
722 
723  infobar->RemoveAllButtons();
724  infobar->ShowMessage( msg, wxICON_INFORMATION );
725  }
726  else if( IsSymbolFromLegacyLibrary() )
727  {
728  wxHyperlinkCtrl* button = new wxHyperlinkCtrl( infobar, wxID_ANY,
729  _( "Manage symbol libraries" ),
730  wxEmptyString );
731 
732  button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
733  [&]( wxHyperlinkEvent& aEvent )
734  {
736  } ) );
737 
738  infobar->RemoveAllButtons();
739  infobar->AddButton( button );
740  infobar->ShowMessage( _( "Symbols in legacy libraries are not editable. Use Manage "
741  "Symbol Libraries to migrate to current format." ),
742  wxICON_INFORMATION );
743  }
744  else if( IsSymbolAlias() )
745  {
746  wxString parentSymbolName = m_symbol->GetParent().lock()->GetName();
747  wxString msg;
748  wxString link;
749 
750  msg.Printf( _( "Symbol %s is derived from %s. Symbol graphics will not be editable." ),
751  symbolName,
752  parentSymbolName );
753 
754  link.Printf( _( "Open %s" ), parentSymbolName );
755 
756  wxHyperlinkCtrl* button = new wxHyperlinkCtrl( infobar, wxID_ANY, link, wxEmptyString );
757  button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<void( wxHyperlinkEvent& aEvent )>(
758  [&]( wxHyperlinkEvent& aEvent )
759  {
760  LoadSymbolFromCurrentLib( m_symbol->GetParent().lock()->GetName(),
761  GetUnit(), GetConvert() );
762  } ) );
763 
764  infobar->RemoveAllButtons();
765  infobar->AddButton( button );
766  infobar->ShowMessage( msg, wxICON_INFORMATION );
767  }
768  else
769  {
770  infobar->Dismiss();
771  }
772 }
773 
774 
776 {
777  wxASSERT( m_libMgr );
778  return *m_libMgr;
779 }
780 
781 
783 {
786 
788 
789  if( !GetTitle().StartsWith( "*" ) )
790  updateTitle();
791 }
792 
793 
795 {
797 }
798 
799 
800 bool SYMBOL_EDIT_FRAME::AddLibraryFile( bool aCreateNew )
801 {
802  // Select the target library table (global/project)
803  SYMBOL_LIB_TABLE* libTable = selectSymLibTable();
804 
805  if( !libTable )
806  return false;
807 
808  wxFileName fn = m_libMgr->GetUniqueLibraryName();
809 
810  if( !LibraryFileBrowser( !aCreateNew, fn, KiCadSymbolLibFileWildcard(),
812  ( libTable == &SYMBOL_LIB_TABLE::GetGlobalLibTable() ),
814  {
815  return false;
816  }
817 
818  wxString libName = fn.GetName();
819 
820  if( libName.IsEmpty() )
821  return false;
822 
823  if( m_libMgr->LibraryExists( libName ) )
824  {
825  DisplayError( this, wxString::Format( _( "Library \"%s\" already exists" ), libName ) );
826  return false;
827  }
828 
829  if( aCreateNew )
830  {
831  if( !m_libMgr->CreateLibrary( fn.GetFullPath(), libTable ) )
832  {
833  DisplayError( this, wxString::Format( _( "Could not create the library file '%s'.\n"
834  "Check write permission." ),
835  fn.GetFullPath() ) );
836  return false;
837  }
838  }
839  else
840  {
841  if( !m_libMgr->AddLibrary( fn.GetFullPath(), libTable ) )
842  {
843  DisplayError( this, _( "Could not open the library file." ) );
844  return false;
845  }
846  }
847 
848  bool globalTable = ( libTable == &SYMBOL_LIB_TABLE::GetGlobalLibTable() );
849  saveSymbolLibTables( globalTable, !globalTable );
850 
851  return true;
852 }
853 
854 
856 {
857  return m_treePane->GetLibTree()->GetSelectedLibId( aUnit );
858 }
859 
860 
862 {
863  LIB_ID libId = GetTreeLIBID();
864 
865  if( libId.IsValid() )
866  {
867  LIB_SYMBOL* alias = m_libMgr->GetAlias( libId.GetLibItemName(), libId.GetLibNickname() );
868  return alias;
869  }
870 
871  return m_symbol;
872 }
873 
874 
876 {
877  LIB_ID id = GetTreeLIBID();
878 
879  if( id.GetLibNickname().empty() && m_symbol )
880  id = m_symbol->GetLibId();
881 
882  return id;
883 }
884 
885 
887 {
889 }
890 
891 
893 {
894  return GetTargetLibId().GetLibNickname();
895 }
896 
897 
898 void SYMBOL_EDIT_FRAME::SyncLibraries( bool aShowProgress, const wxString& aForceRefresh )
899 {
900  LIB_ID selected;
901 
902  if( m_treePane )
903  selected = m_treePane->GetLibTree()->GetSelectedLibId();
904 
905  if( aShowProgress )
906  {
907  APP_PROGRESS_DIALOG progressDlg( _( "Loading Symbol Libraries" ), wxEmptyString,
908  m_libMgr->GetAdapter()->GetLibrariesCount(), this );
909 
910  m_libMgr->Sync( aForceRefresh,
911  [&]( int progress, int max, const wxString& libName )
912  {
913  progressDlg.Update( progress,
914  wxString::Format( _( "Loading library '%s'" ), libName ) );
915  } );
916  }
917  else
918  {
919  m_libMgr->Sync( aForceRefresh,
920  [&]( int progress, int max, const wxString& libName )
921  {
922  } );
923  }
924 
925  if( m_treePane )
926  {
927  wxDataViewItem found;
928 
929  if( selected.IsValid() )
930  {
931  // Check if the previously selected item is still valid,
932  // if not - it has to be unselected to prevent crash
933  found = m_libMgr->GetAdapter()->FindItem( selected );
934 
935  if( !found )
937  }
938 
939  m_treePane->GetLibTree()->Regenerate( true );
940 
941  // Try to select the parent library, in case the symbol is not found
942  if( !found && selected.IsValid() )
943  {
944  selected.SetLibItemName( "" );
945  found = m_libMgr->GetAdapter()->FindItem( selected );
946 
947  if( found )
948  m_treePane->GetLibTree()->SelectLibId( selected );
949  }
950 
951  // If no selection, see if there's a current symbol to centre
952  if( !selected.IsValid() && m_symbol )
953  {
954  LIB_ID current( GetCurLib(), m_symbol->GetName() );
955  m_treePane->GetLibTree()->CenterLibId( current );
956  }
957  }
958 }
959 
960 
962 {
963  LIB_ID target = GetTargetLibId();
964 
965  m_treePane->GetLibTree()->Regenerate( true );
966 
967  if( target.IsValid() )
968  m_treePane->GetLibTree()->CenterLibId( target );
969 }
970 
971 
973 {
975 }
976 
977 
979 {
980  // If no project is loaded, always work with the global table
981  if( Prj().IsNullProject() )
982  {
984 
985  if( aOptional )
986  {
987  wxMessageDialog dlg( this, _( "Add the library to the global library table?" ),
988  _( "Add To Global Library Table" ), wxYES_NO );
989 
990  if( dlg.ShowModal() != wxID_OK )
991  ret = nullptr;
992  }
993 
994  return ret;
995  }
996 
997  wxArrayString libTableNames;
998  libTableNames.Add( _( "Global" ) );
999  libTableNames.Add( _( "Project" ) );
1000 
1001  wxSingleChoiceDialog dlg( this, _( "Choose the Library Table to add the library to:" ),
1002  _( "Add To Library Table" ), libTableNames );
1003 
1004  if( aOptional )
1005  {
1006  dlg.FindWindow( wxID_CANCEL )->SetLabel( _( "Skip" ) );
1007  dlg.FindWindow( wxID_OK )->SetLabel( _( "Add" ) );
1008  }
1009 
1010  if( dlg.ShowModal() != wxID_OK )
1011  return nullptr;
1012 
1013  switch( dlg.GetSelection() )
1014  {
1015  case 0: return &SYMBOL_LIB_TABLE::GetGlobalLibTable();
1016  case 1: return Prj().SchSymbolLibTable();
1017  default: return nullptr;
1018  }
1019 }
1020 
1021 
1022 bool SYMBOL_EDIT_FRAME::backupFile( const wxFileName& aOriginalFile, const wxString& aBackupExt )
1023 {
1024  if( aOriginalFile.FileExists() )
1025  {
1026  wxFileName backupFileName( aOriginalFile );
1027  backupFileName.SetExt( aBackupExt );
1028 
1029  if( backupFileName.FileExists() )
1030  wxRemoveFile( backupFileName.GetFullPath() );
1031 
1032  if( !wxCopyFile( aOriginalFile.GetFullPath(), backupFileName.GetFullPath() ) )
1033  {
1034  DisplayError( this, wxString::Format( _( "Failed to save backup to \"%s\"" ),
1035  backupFileName.GetFullPath() ) );
1036  return false;
1037  }
1038  }
1039 
1040  return true;
1041 }
1042 
1043 
1045 {
1046  if( m_symbol && !GetCurLib().IsEmpty() && GetScreen()->IsContentModified() )
1047  m_libMgr->UpdateSymbol( m_symbol, GetCurLib() ); // UpdateSymbol() makes a copy
1048 }
1049 
1050 
1051 bool SYMBOL_EDIT_FRAME::isCurrentSymbol( const LIB_ID& aLibId ) const
1052 {
1053  // This will return the root symbol of any alias
1054  LIB_SYMBOL* symbol = m_libMgr->GetBufferedSymbol( aLibId.GetLibItemName(),
1055  aLibId.GetLibNickname() );
1056 
1057  // Now we can compare the libId of the current symbol and the root symbol
1058  return ( symbol && m_symbol && symbol->GetLibId() == m_symbol->GetLibId() );
1059 }
1060 
1061 
1063 {
1065  SetCurLib( wxEmptyString );
1066  SetCurSymbol( nullptr, false );
1070  Refresh();
1071 }
1072 
1073 
1074 void SYMBOL_EDIT_FRAME::CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged )
1075 {
1076  SCH_BASE_FRAME::CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
1077 
1079  GetCanvas()->GetGAL()->DrawGrid();
1080 
1081  RecreateToolbars();
1082 
1083  if( aEnvVarsChanged )
1084  SyncLibraries( true );
1085 
1086  Layout();
1087  SendSizeEvent();
1088 }
1089 
1090 
1092 {
1093  // call my base class
1095 
1096  // tooltips in toolbars
1097  RecreateToolbars();
1098 
1099  // status bar
1100  UpdateMsgPanel();
1101 }
1102 
1103 
1105 {
1106  SCH_BASE_FRAME::SetScreen( aScreen );
1107 }
1108 
1109 
1111 {
1119 
1120  GetCanvas()->Refresh();
1121 }
1122 
1123 
1125 {
1126  SyncLibraries( true );
1127 
1128  if( m_symbol )
1129  {
1131  EE_SELECTION& selection = selectionTool->GetSelection();
1132 
1133  for( LIB_ITEM& item : m_symbol->GetDrawItems() )
1134  {
1135  if( !alg::contains( selection, &item ) )
1136  item.ClearSelected();
1137  else
1138  item.SetSelected();
1139  }
1140  }
1141 
1142  RebuildView();
1143 }
1144 
1145 
1146 const BOX2I SYMBOL_EDIT_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
1147 {
1148  if( !m_symbol )
1149  {
1150  return BOX2I( VECTOR2I( Mils2iu( -100 ), Mils2iu( -100 ) ),
1151  VECTOR2I( Mils2iu( 200 ), Mils2iu( 200 ) ) );
1152  }
1153  else
1154  {
1155  EDA_RECT boundingBox = m_symbol->Flatten()->GetUnitBoundingBox( m_unit, m_convert );
1157  boundingBox.GetHeight() ) );
1158  }
1159 }
1160 
1161 
1163 {
1164  const std::string& payload = mail.GetPayload();
1165 
1166  switch( mail.Command() )
1167  {
1168  case MAIL_LIB_EDIT:
1169  if( !payload.empty() )
1170  {
1171  wxString libFileName( payload );
1172  wxString libNickname;
1173  wxString msg;
1174 
1175  SYMBOL_LIB_TABLE* libTable = Prj().SchSymbolLibTable();
1176  const LIB_TABLE_ROW* libTableRow = libTable->FindRowByURI( libFileName );
1177 
1178  if( !libTableRow )
1179  {
1180  msg.Printf( _( "The current configuration does not include the library '%s'.\n"
1181  "Use Manage Symbol Libraries to edit the configuration." ),
1182  libFileName );
1183  DisplayErrorMessage( this, _( "Library not found in symbol library table." ), msg );
1184  break;
1185  }
1186 
1187  libNickname = libTableRow->GetNickName();
1188 
1189  if( !libTable->HasLibrary( libNickname, true ) )
1190  {
1191  msg.Printf( _( "The library '%s' is not enabled in the current configuration.\n"
1192  "Use Manage Symbol Libraries to edit the configuration." ),
1193  libNickname );
1194  DisplayErrorMessage( this, _( "Symbol library not enabled." ), msg );
1195  break;
1196  }
1197 
1198  SetCurLib( libNickname );
1199 
1200  if( m_treePane )
1201  {
1202  LIB_ID id( libNickname, wxEmptyString );
1203  m_treePane->GetLibTree()->ExpandLibId( id );
1204  m_treePane->GetLibTree()->CenterLibId( id );
1205  }
1206  }
1207 
1208  break;
1209 
1210  default:
1211  ;
1212  }
1213 }
1214 
1215 
1217 {
1218  // switches currently used canvas ( Cairo / OpenGL):
1219  SCH_BASE_FRAME::SwitchCanvas( aCanvasType );
1220 
1221  // Set options specific to symbol editor (axies are always enabled):
1222  GetCanvas()->GetGAL()->SetAxesEnabled( true );
1224 }
1225 
1226 
1228 {
1229  wxCHECK( m_libMgr, false );
1230 
1231  return m_libMgr->HasModifications();
1232 }
1233 
1234 
1236 {
1237  wxCHECK( m_libMgr, false );
1238 
1239  // Test if the currently edited symbol is modified
1240  if( GetScreen() && GetScreen()->IsContentModified() && GetCurSymbol() )
1241  return true;
1242 
1243  // Test if any library has been modified
1244  for( const wxString& libName : m_libMgr->GetLibraryNames() )
1245  {
1246  if( m_libMgr->IsLibraryModified( libName ) && !m_libMgr->IsLibraryReadOnly( libName ) )
1247  return true;
1248  }
1249 
1250  return false;
1251 }
1252 
1253 
1255 {
1256  if( aItemCount == 0 )
1257  return;
1258 
1259  UNDO_REDO_CONTAINER& list = whichList == UNDO_LIST ? m_undoList : m_redoList;
1260 
1261  for( PICKED_ITEMS_LIST* command : list.m_CommandsList )
1262  {
1263  command->ClearListAndDeleteItems();
1264  delete command;
1265  }
1266 
1267  list.m_CommandsList.clear();
1268 }
1269 
1270 
1272 {
1273  return m_toolManager->GetTool<EE_SELECTION_TOOL>()->GetSelection();
1274 }
1275 
1276 
1278 {
1279  std::unique_ptr<LIB_SYMBOL> symbol = aSymbol->GetLibSymbolRef()->Flatten();
1280  wxCHECK( symbol, /* void */ );
1281 
1282  std::vector<LIB_FIELD> fullSetOfFields;
1283 
1284  for( int i = 0; i < (int) aSymbol->GetFields().size(); ++i )
1285  {
1286  const SCH_FIELD& field = aSymbol->GetFields()[i];
1287  wxPoint pos = field.GetPosition() - aSymbol->GetPosition();
1288  LIB_FIELD libField( symbol.get(), field.GetId() );
1289 
1290  if( i >= MANDATORY_FIELDS && !field.GetName( false ).IsEmpty() )
1291  libField.SetName( field.GetName( false ) );
1292 
1293  libField.SetText( field.GetText() );
1294  libField.SetEffects( field );
1295  libField.SetPosition( wxPoint( pos.x, -pos.y ) );
1296 
1297  fullSetOfFields.emplace_back( std::move( libField ) );
1298  }
1299 
1300  symbol->SetFields( fullSetOfFields );
1301 
1302  if( m_symbol )
1303  SetCurSymbol( nullptr, false );
1304 
1305  m_isSymbolFromSchematic = true;
1306  m_reference = symbol->GetFieldById( REFERENCE_FIELD )->GetText();
1307  m_unit = std::max( 1, aSymbol->GetUnit() );
1308  m_convert = std::max( 1, aSymbol->GetConvert() );
1309 
1310  // The buffered screen for the symbol
1311  SCH_SCREEN* tmpScreen = new SCH_SCREEN();
1312 
1313  SetScreen( tmpScreen );
1314  SetCurSymbol( symbol.release(), true );
1315 
1316  ReCreateMenuBar();
1317  ReCreateHToolbar();
1318 
1319  if( IsSymbolTreeShown() )
1320  {
1321  wxCommandEvent evt;
1322  OnToggleSymbolTree( evt );
1323  }
1324 
1325  updateTitle();
1327  SetShowDeMorgan( GetCurSymbol()->HasConversion() );
1329  Refresh();
1330 }
1331 
1332 
1333 bool SYMBOL_EDIT_FRAME::addLibTableEntry( const wxString& aLibFile, TABLE_SCOPE aScope )
1334 {
1335  wxFileName fn = aLibFile;
1336  wxFileName libTableFileName( Prj().GetProjectPath(),
1338  wxString libNickname = fn.GetName();
1339  SYMBOL_LIB_TABLE* libTable = Prj().SchSymbolLibTable();
1340  const ENV_VAR_MAP& envVars = Pgm().GetLocalEnvVariables();
1341 
1342  if( libTable->HasLibrary( libNickname ) )
1343  {
1344  wxString tmp;
1345  int suffix = 1;
1346 
1347  while( libTable->HasLibrary( libNickname ) )
1348  {
1349  tmp.Printf( "%s%d", fn.GetName(), suffix );
1350  libNickname = tmp;
1351  suffix += 1;
1352  }
1353  }
1354 
1356  row->SetNickName( libNickname );
1357 
1358  wxString normalizedPath = NormalizePath( aLibFile, &envVars, Prj().GetProjectPath() );
1359 
1360  if( aScope == GLOBAL_LIB_TABLE )
1361  {
1363  libTableFileName = SYMBOL_LIB_TABLE::GetGlobalTableFileName();
1364 
1365  // We cannot normalize against the current project path when saving to global table.
1366  normalizedPath = NormalizePath( aLibFile, &envVars, wxEmptyString );
1367  }
1368 
1369  if( normalizedPath.IsEmpty() )
1370  normalizedPath = aLibFile;
1371 
1372  row->SetFullURI( normalizedPath );
1373 
1374  wxCHECK( libTable->InsertRow( row ), false );
1375 
1376  try
1377  {
1378  libTable->Save( libTableFileName.GetFullPath() );
1379  }
1380  catch( const IO_ERROR& ioe )
1381  {
1382  wxString msg = aScope == GLOBAL_LIB_TABLE ? _( "Error saving global library table." )
1383  : _( "Error saving project library table." );
1384 
1385  wxMessageDialog dlg( this, msg, _( "File Save Error" ), wxOK | wxICON_ERROR );
1386  dlg.SetExtendedMessage( ioe.What() );
1387  dlg.ShowModal();
1388 
1389  return false;
1390  }
1391 
1392  return true;
1393 }
1394 
1395 
1396 bool SYMBOL_EDIT_FRAME::replaceLibTableEntry( const wxString& aLibNickname,
1397  const wxString& aLibFile )
1398 {
1399  // Check the global library table first because checking the project library table
1400  // checks the global library table as well due to library chaining.
1401  bool isGlobalTable = true;
1402  wxFileName libTableFileName = SYMBOL_LIB_TABLE::GetGlobalTableFileName();;
1403  const ENV_VAR_MAP& envVars = Pgm().GetLocalEnvVariables();
1405  SYMBOL_LIB_TABLE_ROW* row = libTable->FindRow( aLibNickname );
1406 
1407  if( !row )
1408  {
1409  libTableFileName.SetPath( Prj().GetProjectPath() );
1410  libTableFileName.SetName( SYMBOL_LIB_TABLE::GetSymbolLibTableFileName() );
1411  libTable = Prj().SchSymbolLibTable();
1412  isGlobalTable = false;
1413  row = libTable->FindRow( aLibNickname );
1414  }
1415 
1416  wxCHECK( row, false );
1417 
1418  wxString projectPath;
1419 
1420  if( !isGlobalTable )
1421  projectPath = Prj().GetProjectPath();
1422 
1423  wxString normalizedPath = NormalizePath( aLibFile, &envVars, projectPath );
1424 
1425  if( normalizedPath.IsEmpty() )
1426  normalizedPath = aLibFile;
1427 
1428  row->SetFullURI( normalizedPath );
1429  row->SetType( "KiCad" );
1430 
1431  try
1432  {
1433  libTable->Save( libTableFileName.GetFullPath() );
1434  }
1435  catch( const IO_ERROR& ioe )
1436  {
1437  wxString msg = isGlobalTable ? _( "Error saving global library table." )
1438  : _( "Error saving project library table." );
1439 
1440  wxMessageDialog dlg( this, msg, _( "File Save Error" ), wxOK | wxICON_ERROR );
1441  dlg.SetExtendedMessage( ioe.What() );
1442  dlg.ShowModal();
1443 
1444  return false;
1445  }
1446 
1447  return true;
1448 }
1449 
1450 
1452 {
1453  return m_symbol && !m_symbol->IsRoot();
1454 }
1455 
1456 
1458 {
1460 }
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
Redraw the menus and what not in current language.
void DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
Definition: confirm.cpp:252
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:134
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:512
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:106
void AddButton(wxButton *aButton)
Add an already created button to the infobar.
Definition: infobar.cpp:246
void OnKiCadExit()
Definition: kiway.cpp:615
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:265
KIGFX::GAL_DISPLAY_OPTIONS & GetGalDisplayOptions()
Return a reference to the gal rendering options used by GAL for rendering.
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:713
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:701
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:202
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
Definition: kiway.cpp:373
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:447
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:386
bool IsValid() const
Check if this LID_ID is valid.
Definition: lib_id.h:168
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:123
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:334
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)
boundingBox template method
Definition: shape_index.h:60
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:176
static TOOL_ACTION placeSymbolPin
Definition: ee_actions.h:97
void DisplaySymbolDatasheet()
Display the documentation of the selected symbol.
Multi-thread safe progress reporter dialog, intended for use of tasks that paralleize reporting back ...
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:168
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:1092
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:187
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:150
void HardRedraw() override
Rebuild the GAL and redraw the screen.
ACTIONS * m_actions
Definition: tools_holder.h:157
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:202
Definition of file extensions used in Kicad.
void Unselect()
Unselect currently selected item in wxDataViewCtrl.
Definition: lib_tree.cpp:191
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:258
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:92
AppSettings * GetAppSettings(bool aLoadNow=true)
Returns a handle to the a given settings by type If the settings have already been loaded,...
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.
void RegenerateLibraryTree()
Filter, sort, and redisplay the library tree.
int UnsavedChangesDialog(wxWindow *parent, wxString aMessage, bool *aApplyToAll)
A specialized version of HandleUnsavedChanges which handles an apply-to-all checkbox.
Definition: confirm.cpp:154
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:220
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:287
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:81
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=NULL) override
Update the board display after modifying it by a python script (note: it is automatically called by a...
int SetLibItemName(const UTF8 &aLibItemName, bool aTestForRev=true)
Override the library item name portion of the LIB_ID to aLibItemName.
Definition: lib_id.cpp:204
TOOL_DISPATCHER * m_toolDispatcher
Definition: tools_holder.h:158
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:213
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:196
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:228
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:156
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:548
void SetOrigin(const Vec &pos)
Definition: box2.h:200
#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:188
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:183
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
virtual void ShowChangedLanguage()
Redraw the menus and what not in current language.
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:185
SYMBOL_EDITOR_DRAWING_TOOLS.
void SelectLibId(const LIB_ID &aLibId)
Select an item in the tree widget.
Definition: lib_tree.cpp:179
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.