KiCad PCB EDA Suite
symbol_edit_frame.h
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) 2014 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  * Copyright (C) 2017 CERN
8  * @author Maciej Suminski <maciej.suminski@cern.ch>
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version 2
13  * of the License, or (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, you may find one here:
22  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
23  * or you may search the http://www.gnu.org website for the version 2 license,
24  * or you may write to the Free Software Foundation, Inc.,
25  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
26  */
27 
28 #ifndef SYMBOL_EDIT_FRAME_H
29 #define SYMBOL_EDIT_FRAME_H
30 
31 #include <sch_base_frame.h>
32 #include <sch_screen.h>
33 #include <lib_item.h>
34 #include <ee_collectors.h>
35 #include <core/optional.h>
36 
37 class SCH_EDIT_FRAME;
38 class SYMBOL_LIB_TABLE;
39 class LIB_SYMBOL;
40 class LIB_FIELD;
42 class SYMBOL_TREE_PANE;
43 class LIB_TREE_NODE;
44 class LIB_ID;
47 
48 
53 {
54 public:
55  SYMBOL_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent );
56 
57  ~SYMBOL_EDIT_FRAME() override;
58 
62  void SwitchCanvas( EDA_DRAW_PANEL_GAL::GAL_TYPE aCanvasType ) override;
63 
69  bool IsContentModified() const override;
70 
79  bool HasLibModifications() const;
80 
84  wxString GetCurLib() const;
85 
89  wxString SetCurLib( const wxString& aLibNickname );
90 
92 
96  LIB_ID GetTreeLIBID( int* aUnit = nullptr ) const;
97 
103  LIB_SYMBOL* GetCurSymbol() const { return m_symbol; }
104 
108  void SetCurSymbol( LIB_SYMBOL* aSymbol, bool aUpdateZoom );
109 
111 
112  SELECTION& GetCurrentSelection() override;
113 
114  void ReCreateMenuBar() override;
115 
116  // See comments for m_SyncPinEdit.
117  bool SynchronizePins();
118 
122  bool AddLibraryFile( bool aCreateNew );
123 
127  void CreateNewSymbol();
128 
129  void ImportSymbol();
130  void ExportSymbol();
131 
135  void Save();
136 
140  void SaveSymbolAs();
141 
145  void SaveLibraryAs();
146 
150  void SaveAll();
151 
155  void Revert( bool aConfirm = true );
156  void RevertAll();
157 
159 
160  void CopySymbolToClipboard();
161 
162  void LoadSymbol( const wxString& aLibrary, const wxString& aSymbol, int Unit );
163 
169  void DuplicateSymbol( bool aFromClipboard );
170 
171  void OnSelectUnit( wxCommandEvent& event );
172 
173  void OnToggleSymbolTree( wxCommandEvent& event );
174 
175  bool IsSymbolTreeShown();
176  void FreezeLibraryTree();
177  void ThawLibraryTree();
178 
179  void OnUpdateUnitNumber( wxUpdateUIEvent& event );
180 
181  void UpdateAfterSymbolProperties( wxString* aOldName = nullptr );
182  void RebuildSymbolUnitsList();
183 
184  bool canCloseWindow( wxCloseEvent& aCloseEvent ) override;
185  void doCloseWindow() override;
186  void OnExitKiCad( wxCommandEvent& event );
187  void ReCreateHToolbar() override;
188  void ReCreateVToolbar() override;
189  void ReCreateOptToolbar() override;
190 
191  void LoadSettings( APP_SETTINGS_BASE* aCfg ) override;
192  void SaveSettings( APP_SETTINGS_BASE* aCfg ) override;
193 
195  {
196  return m_settings;
197  }
198 
199  APP_SETTINGS_BASE* config() const override;
200 
201  COLOR_SETTINGS* GetColorSettings() const override;
202 
209  void CloseWindow( wxCommandEvent& event )
210  {
211  // Generate a wxCloseEvent
212  Close( false );
213  }
214 
219  void OnModify() override;
220 
221  int GetUnit() const { return m_unit; }
222  void SetUnit( int aUnit ) { m_unit = aUnit; }
223 
224  int GetConvert() const { return m_convert; }
225  void SetConvert( int aConvert ) { m_convert = aConvert; }
226 
227  bool GetShowDeMorgan() const { return m_showDeMorgan; }
228  void SetShowDeMorgan( bool show ) { m_showDeMorgan = show; }
229 
230  void ClearMsgPanel() override
231  {
233  }
234 
236 
237  bool IsSymbolFromLegacyLibrary() const;
238 
243 
244  // General editing
251  void SaveCopyInUndoList( EDA_ITEM* aItem, UNDO_REDO aUndoType = UNDO_REDO::LIBEDIT,
252  bool aAppend = false );
253 
254  void GetSymbolFromUndoList();
255  void GetSymbolFromRedoList();
256 
257  void RollbackSymbolFromUndo();
258 
271  void ClearUndoORRedoList( UNDO_REDO_LIST whichList, int aItemCount = -1 ) override;
272 
281  bool LoadSymbol( const LIB_ID& aLibId, int aUnit, int aConvert );
282 
286  void PrintPage( const RENDER_SETTINGS* aSettings ) override;
287 
291  void SVGPlotSymbol( const wxString& aFullFileName );
292 
297  void SyncLibraries( bool aShowProgress, const wxString& aForceRefresh = wxEmptyString );
298 
304  void RegenerateLibraryTree();
305 
309  void RefreshLibraryTree();
310 
314  void InstallPreferences( PAGED_DIALOG* aParent, PANEL_HOTKEYS_EDITOR* aHotkeysPanel ) override;
315 
319  void CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged ) override;
320 
321  void ShowChangedLanguage() override;
322 
323  void SetScreen( BASE_SCREEN* aScreen ) override;
324 
325  const BOX2I GetDocumentExtents( bool aIncludeAllVisible = true ) const override;
326 
327  void RebuildView();
328 
332  void HardRedraw() override;
333 
334  void KiwayMailIn( KIWAY_EXPRESS& mail ) override;
335 
341  void LoadSymbolFromSchematic( SCH_SYMBOL* aSymbol );
342 
353  bool IsSymbolEditable() const;
354 
355  bool IsSymbolAlias() const;
356 
358  void emptyScreen();
359 
362  LIB_ID GetTargetLibId() const;
363 
364 protected:
365  void setupUIConditions() override;
366 
367 private:
368  // Set up the tool framework
369  void setupTools();
370 
371  void saveSymbolAs();
372 
383  bool saveLibrary( const wxString& aLibrary, bool aNewFile );
384 
389  void updateTitle();
390 
397  void SelectActiveLibrary( const wxString& aLibrary = wxEmptyString );
398 
407  wxString SelectLibraryFromList();
408 
418  bool LoadSymbolFromCurrentLib( const wxString& aAliasName, int aUnit = 0, int aConvert = 0 );
419 
430  bool LoadOneLibrarySymbolAux( LIB_SYMBOL* aLibEntry, const wxString& aLibrary, int aUnit,
431  int aConvert );
432 
439  SYMBOL_LIB_TABLE* selectSymLibTable( bool aOptional = false );
440 
442  bool backupFile( const wxFileName& aOriginalFile, const wxString& aBackupExt );
443 
445  LIB_SYMBOL* getTargetSymbol() const;
446 
449  wxString getTargetLib() const;
450 
451  /*
452  * Return true when the operation has succeeded (all requested libraries have been saved
453  * or none was selected and confirmed by OK).
454  *
455  * @param aRequireConfirmation when true, the user must be asked to confirm.
456  */
457  bool saveAllLibraries( bool aRequireConfirmation );
458 
460  bool saveCurrentSymbol();
461 
463  void storeCurrentSymbol();
464 
466  bool isCurrentSymbol( const LIB_ID& aLibId ) const;
467 
469  void ensureUniqueName( LIB_SYMBOL* aSymbol, const wxString& aLibrary );
470 
472  {
475  };
476 
486  bool addLibTableEntry( const wxString& aLibFile, TABLE_SCOPE aScope = GLOBAL_LIB_TABLE );
487 
498  bool replaceLibTableEntry( const wxString& aLibNickname, const wxString& aLibFile );
499 
500  DECLARE_EVENT_TABLE()
501 
502 public:
525 
526 private:
529 
530  LIB_SYMBOL* m_symbol; // a symbol I own, it is not in any library, but a
531  // copy could be.
532  wxComboBox* m_unitSelectBox; // a ComboBox to select a unit to edit (if the
533  // symbol has multiple units)
534  SYMBOL_TREE_PANE* m_treePane; // symbol search tree widget
535  SYMBOL_LIBRARY_MANAGER* m_libMgr; // manager taking care of temporary modifications
536  SYMBOL_EDITOR_SETTINGS* m_settings; // Handle to the settings
537 
538  // The unit number to edit and show
539  int m_unit;
540 
541  // Show the normal shape ( m_convert <= 1 ) or the converted shape ( m_convert > 1 )
543 
546 
552  wxString m_reference;
553 
554  // True to force DeMorgan/normal tools selection enabled.
555  // They are enabled when the loaded symbol has graphic items for converted shape
556  // But under some circumstances (New symbol created) these tools must left enabled
557  static bool m_showDeMorgan;
558 };
559 
560 #endif // SYMBOL_EDIT_FRAME_H
void OnModify() override
Must be called after a schematic change in order to set the "modify" flag of the current symbol.
void ShowChangedLanguage() override
COLOR_SETTINGS * GetColorSettings() const override
Returns a pointer to the active color theme settings.
int m_convert
Flag if the symbol being edited was loaded directly from a schematic.
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
void Revert(bool aConfirm=true)
Revert unsaved changes in a symbol, restoring to the last saved state.
void SelectActiveLibrary(const wxString &aLibrary=wxEmptyString)
Set the current active library to aLibrary.
SCH_SCREEN * m_dummyScreen
< Helper screen used when no symbol is loaded
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
void OnUpdateUnitNumber(wxUpdateUIEvent &event)
bool backupFile(const wxFileName &aOriginalFile, const wxString &aBackupExt)
Return currently edited symbol.
void SetScreen(BASE_SCREEN *aScreen) override
void SetShowDeMorgan(bool show)
SYMBOL_EDITOR_SETTINGS * GetSettings() const
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.
void ensureUniqueName(LIB_SYMBOL *aSymbol, const wxString &aLibrary)
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
void SwitchCanvas(EDA_DRAW_PANEL_GAL::GAL_TYPE aCanvasType) override
Switch currently used canvas ( Cairo / OpenGL).
void Save()
Save the selected symbol or library.
void PrintPage(const RENDER_SETTINGS *aSettings) override
Print a page.
void storeCurrentSymbol()
Return true if aLibId is an alias for the editor screen symbol.
void SaveAll()
Save all modified symbols and libraries.
static bool m_showDeMorgan
Schematic editor (Eeschema) main window.
void ClearUndoORRedoList(UNDO_REDO_LIST whichList, int aItemCount=-1) override
Free the undo or redo list from aList element.
bool LoadOneLibrarySymbolAux(LIB_SYMBOL *aLibEntry, const wxString &aLibrary, int aUnit, int aConvert)
Create a copy of aLibEntry into memory.
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:51
wxString m_reference
The reference of the symbol.
Define a library symbol object.
Definition: lib_symbol.h:96
LIB_TREE_NODE * GetCurrentTreeNode() const
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.
UNDO_REDO
Undo Redo considerations: Basically we have 3 cases New item Deleted item Modified item there is also...
void OnSelectUnit(wxCommandEvent &event)
bool GetShowDeMorgan() const
bool IsSymbolFromSchematic() const
LIB_SYMBOL * getTargetSymbol() const
Return either the library selected in the symbol tree, if context menu is active or the library that ...
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
Library Editor pane with symbol tree and symbol library table selector.
void UpdateAfterSymbolProperties(wxString *aOldName=nullptr)
LIB_ID GetTreeLIBID(int *aUnit=nullptr) const
Return the LIB_ID of the library or symbol selected in the symbol tree.
void SetUnit(int aUnit)
LIB_SYMBOL * GetCurSymbol() const
Return the current symbol being edited or NULL if none selected.
void LoadSymbol(const wxString &aLibrary, const wxString &aSymbol, int Unit)
SYMBOL_EDIT_FRAME(KIWAY *aKiway, wxWindow *aParent)
void updateTitle()
Update the main window title bar with the current library name and read only status of the library.
void SaveSymbolAs()
Save the currently selected symbol to a new name and/or location.
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
Definition: app_settings.h:99
bool IsSymbolAlias() const
Restore the empty editor screen, without any symbol or library selected.
void SetCurSymbol(LIB_SYMBOL *aSymbol, bool aUpdateZoom)
Take ownership of aSymbol and notes that it is the one currently being edited.
void SetConvert(int aConvert)
Class to handle modifications to the symbol libraries.
Handles how to draw a screen (a board, a schematic ...)
Definition: base_screen.h:40
void SaveCopyInUndoList(EDA_ITEM *aItem, UNDO_REDO aUndoType=UNDO_REDO::LIBEDIT, bool aAppend=false)
Create a copy of the current symbol, and save it in the undo list.
wxString getTargetLib() const
SYMBOL_LIBRARY_MANAGER & GetLibManager()
void HardRedraw() override
Rebuild the GAL and redraw the screen.
void CloseWindow(wxCommandEvent &event)
Trigger the wxCloseEvent, which is handled by the function given to EVT_CLOSE() macro:
void ReCreateHToolbar() override
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition: kiway.h:260
wxString SelectLibraryFromList()
Display a list of loaded libraries in the symbol library and allows the user to select a library.
bool replaceLibTableEntry(const wxString &aLibNickname, const wxString &aLibFile)
Replace the file path of the symbol library table entry aLibNickname with aLibFile.
void DeleteSymbolFromLibrary()
void ClearMsgPanel() override
Clear all messages from the message panel.
bool saveCurrentSymbol()
Store the currently modified symbol in the library manager buffer.
Model class in the component selector Model-View-Adapter (mediated MVC) architecture.
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.
void InstallPreferences(PAGED_DIALOG *aParent, PANEL_HOTKEYS_EDITOR *aHotkeysPanel) override
Allow the symbol editor to install its preferences panel into the preferences dialog.
bool HasLibModifications() const
Check if any pending libraries have been modified.
void ReCreateMenuBar() override
Recreates the menu bar.
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 CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Called after the preferences dialog is run.
void UpdateSymbolMsgPanelInfo()
Display the documentation of the selected symbol.
bool saveLibrary(const wxString &aLibrary, bool aNewFile)
Save the changes to the current library.
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 setupUIConditions() override
Setup the UI conditions for the various actions and their controls in this frame.
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.
void doCloseWindow() override
APP_SETTINGS_BASE * config() const override
Returns the settings object used in SaveSettings(), and is overloaded in KICAD_MANAGER_FRAME.
LIB_ID GetTargetLibId() const
void KiwayMailIn(KIWAY_EXPRESS &mail) override
Receive KIWAY_EXPRESS messages from other players.
bool IsContentModified() const override
Get if any symbols or libraries have been modified but not saved.
void ReCreateOptToolbar() override
void RefreshLibraryTree()
Redisplay the library tree.
SYMBOL_EDITOR_SETTINGS * m_settings
Schematic symbol object.
Definition: sch_symbol.h:78
bool IsSymbolEditable() const
Test if a symbol is loaded and can be edited.
bool saveAllLibraries(bool aRequireConfirmation)
Save the current symbol.
void DuplicateSymbol(bool aFromClipboard)
Insert a duplicate symbol.
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:100
void OnExitKiCad(wxCommandEvent &event)
void ReCreateVToolbar() override
Color settings are a bit different than most of the settings objects in that there can be more than o...
SYMBOL_LIBRARY_MANAGER * m_libMgr
bool AddLibraryFile(bool aCreateNew)
Create or add an existing library to the symbol library table.
void SaveLibraryAs()
Save the currently selected library to a new file.
void emptyScreen()
Return either the symbol selected in the symbol tree, if context menu is active or the currently modi...
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 ...
A shim class between EDA_DRAW_FRAME and several derived classes: SYMBOL_EDIT_FRAME,...
bool IsSymbolFromLegacyLibrary() const
wxString SetCurLib(const wxString &aLibNickname)
Set the current library nickname and returns the old library nickname.
wxComboBox * m_unitSelectBox
void CreateNewSymbol()
Create a new symbol in the selected library.
void SVGPlotSymbol(const wxString &aFullFileName)
Create the SVG print file for the current edited symbol.
The symbol library editor main window.