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_PART;
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() 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 
104 
108  void SetCurPart( LIB_PART* aPart, 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 CreateNewPart();
128 
129  void ImportPart();
130  void ExportPart();
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 
158  void DeletePartFromLibrary();
159 
160  void CopyPartToClipboard();
161 
162  void LoadPart( const wxString& aLibrary, const wxString& aPart, int Unit );
163 
169  void DuplicatePart( 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 OnUpdatePartNumber( 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 
242  void DisplaySymbolDatasheet();
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_COMPONENT* 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 savePartAs();
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 LoadOneLibraryPartAux( LIB_PART* 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_PART* getTargetPart() 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 saveCurrentPart();
461 
463  void storeCurrentPart();
464 
466  bool isCurrentPart( const LIB_ID& aLibId ) const;
467 
469  void ensureUniqueName( LIB_PART* aPart, 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_PART* m_my_part; // a part 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  // part has multiple units)
534  SYMBOL_TREE_PANE* m_treePane; // component 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
Redraw the menus and what not in current language.
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 part, 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 part is loaded
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
bool LoadOneLibraryPartAux(LIB_PART *aLibEntry, const wxString &aLibrary, int aUnit, int aConvert)
Create a copy of aLibEntry into memory.
bool backupFile(const wxFileName &aOriginalFile, const wxString &aBackupExt)
Return currently edited part.
void SetScreen(BASE_SCREEN *aScreen) override
void SetShowDeMorgan(bool show)
SYMBOL_EDITOR_SETTINGS * GetSettings() const
bool IsContentModified() override
Get if any parts or libraries have been modified but not saved.
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.
LIB_PART * getTargetPart() const
Return either the library selected in the symbol tree, if context menu is active or the library that ...
void OnUpdatePartNumber(wxUpdateUIEvent &event)
bool m_SyncPinEdit
Set to true to synchronize pins at the same position when editing symbols with multiple units or mult...
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 part or library.
void PrintPage(const RENDER_SETTINGS *aSettings) override
Print a page.
bool saveCurrentPart()
Store the currently modified part in the library manager buffer.
void SaveAll()
Save all modified parts 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.
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:51
bool LoadSymbol(const LIB_ID &aLibId, int aUnit, int aConvert)
Select the currently active library and loads the symbol from aLibId.
wxString m_reference
The reference of the symbol.
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
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)
void LoadPart(const wxString &aLibrary, const wxString &aPart, int Unit)
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)
void DisplaySymbolDatasheet()
Display the documentation of the selected symbol.
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 part or library selected.
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 DuplicatePart(bool aFromClipboard)
Insert a duplicate part.
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.
Define a library symbol object.
Definition: lib_symbol.h:93
void ensureUniqueName(LIB_PART *aPart, const wxString &aLibrary)
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 ClearMsgPanel() override
Clear all messages from the message panel.
void SetCurPart(LIB_PART *aPart, bool aUpdateZoom)
Take ownership of aPart and notes that it is the one currently being edited.
void storeCurrentPart()
Return true if aLibId is an alias for the editor screen part.
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)
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.
LIB_PART * GetCurPart()
Return the current part being edited or NULL if none selected.
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.
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
Remove the aItemCount of old commands from aList and delete commands, pickers and picked items if nee...
void LoadSymbolFromSchematic(SCH_COMPONENT *aSymbol)
Load a symbol from the schematic to edit in place.
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.
void ReCreateOptToolbar() override
void RefreshLibraryTree()
Redisplay the library tree.
SYMBOL_EDITOR_SETTINGS * m_settings
bool IsSymbolEditable() const
Test if a symbol is loaded and can be edited.
bool saveAllLibraries(bool aRequireConfirmation)
Save the current part.
void CreateNewPart()
Create a new part in the selected library.
Schematic symbol object.
Definition: sch_symbol.h:78
bool isCurrentPart(const LIB_ID &aLibId) const
Rename LIB_PART aliases to avoid conflicts before adding a symbol to a library.
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:150
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 part selected in the symbol tree, if context menu is active or the currently modifi...
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 SVGPlotSymbol(const wxString &aFullFileName)
Create the SVG print file for the current edited symbol.
The symbol library editor main window.