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 OnToggleSearchTree( wxCommandEvent& event );
174 
175  bool IsSearchTreeShown();
176  void FreezeSearchTree();
177  void ThawSearchTree();
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  COLOR_SETTINGS* GetColorSettings() const override;
200 
207  void CloseWindow( wxCommandEvent& event )
208  {
209  // Generate a wxCloseEvent
210  Close( false );
211  }
212 
217  void OnModify() override;
218 
219  int GetUnit() const { return m_unit; }
220  void SetUnit( int aUnit ) { m_unit = aUnit; }
221 
222  int GetConvert() const { return m_convert; }
223  void SetConvert( int aConvert ) { m_convert = aConvert; }
224 
225  bool GetShowDeMorgan() const { return m_showDeMorgan; }
226  void SetShowDeMorgan( bool show ) { m_showDeMorgan = show; }
227 
228  void ClearMsgPanel() override
229  {
231  }
232 
234 
235  bool IsSymbolFromLegacyLibrary() const;
236 
240  void DisplaySymbolDatasheet();
241 
242  // General editing
249  void SaveCopyInUndoList( EDA_ITEM* aItem, UNDO_REDO aUndoType = UNDO_REDO::LIBEDIT,
250  bool aAppend = false );
251 
252  void GetSymbolFromUndoList();
253  void GetSymbolFromRedoList();
254 
255  void RollbackSymbolFromUndo();
256 
269  void ClearUndoORRedoList( UNDO_REDO_LIST whichList, int aItemCount = -1 ) override;
270 
279  bool LoadSymbolAndSelectLib( const LIB_ID& aLibId, int aUnit, int aConvert );
280 
284  void PrintPage( const RENDER_SETTINGS* aSettings ) override;
285 
289  void SVGPlotSymbol( const wxString& aFullFileName );
290 
295  void SyncLibraries( bool aShowProgress, const wxString& aForceRefresh = wxEmptyString );
296 
302  void RegenerateLibraryTree();
303 
307  void InstallPreferences( PAGED_DIALOG* aParent, PANEL_HOTKEYS_EDITOR* aHotkeysPanel ) override;
308 
312  void CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged ) override;
313 
314  void ShowChangedLanguage() override;
315 
316  void SetScreen( BASE_SCREEN* aScreen ) override;
317 
318  const BOX2I GetDocumentExtents( bool aIncludeAllVisible = true ) const override;
319 
320  void RebuildView();
321 
325  void HardRedraw() override;
326 
327  void KiwayMailIn( KIWAY_EXPRESS& mail ) override;
328 
334  void LoadSymbolFromSchematic( SCH_COMPONENT* aSymbol );
335 
346  bool IsSymbolEditable() const;
347 
348  bool IsSymbolAlias() const;
349 
351  void emptyScreen();
352 
355  LIB_ID GetTargetLibId() const;
356 
357 protected:
358  void setupUIConditions() override;
359 
360 private:
361  // Set up the tool framework
362  void setupTools();
363 
364  void savePartAs();
365 
376  bool saveLibrary( const wxString& aLibrary, bool aNewFile );
377 
382  void updateTitle();
383 
390  void SelectActiveLibrary( const wxString& aLibrary = wxEmptyString );
391 
400  wxString SelectLibraryFromList();
401 
411  bool LoadSymbolFromCurrentLib( const wxString& aAliasName, int aUnit = 0, int aConvert = 0 );
412 
423  bool LoadOneLibraryPartAux( LIB_PART* aLibEntry, const wxString& aLibrary, int aUnit,
424  int aConvert );
425 
432  SYMBOL_LIB_TABLE* selectSymLibTable( bool aOptional = false );
433 
435  bool backupFile( const wxFileName& aOriginalFile, const wxString& aBackupExt );
436 
438  LIB_PART* getTargetPart() const;
439 
442  wxString getTargetLib() const;
443 
444  /*
445  * Return true when the operation has succeeded (all requested libraries have been saved
446  * or none was selected and confirmed by OK).
447  *
448  * @param aRequireConfirmation when true, the user must be asked to confirm.
449  */
450  bool saveAllLibraries( bool aRequireConfirmation );
451 
453  bool saveCurrentPart();
454 
456  void storeCurrentPart();
457 
459  bool isCurrentPart( const LIB_ID& aLibId ) const;
460 
462  void ensureUniqueName( LIB_PART* aPart, const wxString& aLibrary );
463 
465  {
468  };
469 
479  bool addLibTableEntry( const wxString& aLibFile, TABLE_SCOPE aScope = GLOBAL_LIB_TABLE );
480 
491  bool replaceLibTableEntry( const wxString& aLibNickname, const wxString& aLibFile );
492 
493  DECLARE_EVENT_TABLE()
494 
495 public:
518 
519 private:
522 
523  LIB_PART* m_my_part; // a part I own, it is not in any library, but a
524  // copy could be.
525  wxComboBox* m_unitSelectBox; // a ComboBox to select a unit to edit (if the
526  // part has multiple units)
527  SYMBOL_TREE_PANE* m_treePane; // component search tree widget
528  SYMBOL_LIBRARY_MANAGER* m_libMgr; // manager taking care of temporary modifications
529  SYMBOL_EDITOR_SETTINGS* m_settings; // Handle to the settings
530 
531  // The unit number to edit and show
532  int m_unit;
533 
534  // Show the normal shape ( m_convert <= 1 ) or the converted shape ( m_convert > 1 )
536 
539 
545  wxString m_reference;
546 
547  // True to force DeMorgan/normal tools selection enabled.
548  // They are enabled when the loaded symbol has graphic items for converted shape
549  // But under some circumstances (New symbol created) these tools must left enabled
550  static bool m_showDeMorgan;
551 };
552 
553 #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.
bool LoadSymbolAndSelectLib(const LIB_ID &aLibId, int aUnit, int aConvert)
Select the currently active library and loads the symbol from aLibId.
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
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 component 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 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
LIB_ID GetTargetLibId() const
void KiwayMailIn(KIWAY_EXPRESS &mail) override
Receive KIWAY_EXPRESS messages from other players.
void ReCreateOptToolbar() override
SYMBOL_EDITOR_SETTINGS * m_settings
bool IsSymbolEditable() const
Test if a symbol is loaded and can be edited.
void OnToggleSearchTree(wxCommandEvent &event)
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:79
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:149
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.