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