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 <[email protected]>
6 * Copyright (C) 2004-2023 KiCad Developers, see AUTHORS.txt for contributors.
7 * Copyright (C) 2017 CERN
8 * @author Maciej Suminski <[email protected]>
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 <optional>
36
37class SCH_EDIT_FRAME;
39class LIB_SYMBOL;
40class LIB_FIELD;
43class LIB_TREE_NODE;
44class LIB_ID;
47class EDA_LIST_DIALOG;
48
49
54{
55public:
56 SYMBOL_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent );
57
58 ~SYMBOL_EDIT_FRAME() override;
59
63 void SwitchCanvas( EDA_DRAW_PANEL_GAL::GAL_TYPE aCanvasType ) override;
64
70 bool IsContentModified() const override;
71
80 bool HasLibModifications() const;
81
82 bool CanCloseSymbolFromSchematic( bool doClose );
83
87 wxString GetCurLib() const;
88
92 wxString SetCurLib( const wxString& aLibNickname );
93
95
99 LIB_ID GetTreeLIBID( int* aUnit = nullptr ) const;
100
101 int GetTreeSelectionCount() const;
102
103 int GetTreeLIBIDs( std::vector<LIB_ID>& aSelection ) const;
104
110 LIB_SYMBOL* GetCurSymbol() const { return m_symbol; }
111
115 void SetCurSymbol( LIB_SYMBOL* aSymbol, bool aUpdateZoom );
116
118
119 SELECTION& GetCurrentSelection() override;
120
121 // See comments for m_SyncPinEdit.
122 bool SynchronizePins();
123
127 wxString AddLibraryFile( bool aCreateNew );
128
132 void DdAddLibrary( wxString aLibFile );
133
137 void CreateNewSymbol( const wxString& inheritFromSymbolName = wxEmptyString );
138
139 void ImportSymbol();
140 void ExportSymbol();
141
145 void Save();
146
150 void SaveSymbolAs();
151
155 void SaveLibraryAs();
156
160 void SaveAll();
161
165 void Revert( bool aConfirm = true );
166 void RevertAll();
167
169
171
172 void LoadSymbol( const wxString& aLibrary, const wxString& aSymbol, int Unit );
173
179 void DuplicateSymbol( bool aFromClipboard );
180
181 void OnSelectUnit( wxCommandEvent& event );
182
183 void OnToggleSymbolTree( wxCommandEvent& event );
184
185 bool IsSymbolTreeShown() const;
186 void FreezeLibraryTree();
187 void ThawLibraryTree();
188
189 void OnUpdateUnitNumber( wxUpdateUIEvent& event );
190
191 void UpdateAfterSymbolProperties( wxString* aOldName = nullptr );
193
194 bool canCloseWindow( wxCloseEvent& aCloseEvent ) override;
195 void doCloseWindow() override;
196 void OnExitKiCad( wxCommandEvent& event );
197 void ReCreateHToolbar() override;
198 void ReCreateVToolbar() override;
199 void ReCreateOptToolbar() override;
200
201 void LoadSettings( APP_SETTINGS_BASE* aCfg ) override;
202 void SaveSettings( APP_SETTINGS_BASE* aCfg ) override;
203
205 {
206 return m_settings;
207 }
208
209 APP_SETTINGS_BASE* config() const override;
210
211 COLOR_SETTINGS* GetColorSettings( bool aForceRefresh = false ) const override;
212
219 void CloseWindow( wxCommandEvent& event )
220 {
221 // Generate a wxCloseEvent
222 Close( false );
223 }
224
229 void OnModify() override;
230
231 int GetUnit() const { return m_unit; }
232 void SetUnit( int aUnit ) { m_unit = aUnit; }
233
234 int GetConvert() const { return m_convert; }
235 void SetConvert( int aConvert ) { m_convert = aConvert; }
236
237 bool GetShowDeMorgan() const { return m_showDeMorgan; }
238 void SetShowDeMorgan( bool show ) { m_showDeMorgan = show; }
239
240 void ClearMsgPanel() override
241 {
243 }
244
245 void UpdateMsgPanel() override
246 {
248 }
249
251
252 bool IsSymbolFromLegacyLibrary() const;
253
258
259 // General editing
267 bool aAppend = false );
268
271
273
286 void ClearUndoORRedoList( UNDO_REDO_LIST whichList, int aItemCount = -1 ) override;
287
296 bool LoadSymbol( const LIB_ID& aLibId, int aUnit, int aConvert );
297
301 void PrintPage( const RENDER_SETTINGS* aSettings ) override;
302
308 void SVGPlotSymbol( const wxString& aFullFileName, VECTOR2I aOffset );
309
314 void SyncLibraries( bool aShowProgress, bool aPreloadCancelled = false,
315 const wxString& aForceRefresh = wxEmptyString );
316
323
327 void RefreshLibraryTree();
328
332 void UpdateLibraryTree( const wxDataViewItem& aTreeItem, LIB_SYMBOL* aSymbol );
333
338 LIB_ID GetTargetLibId() const;
339
343 std::vector<LIB_ID> GetSelectedLibIds() const;
344
345 void FocusOnLibId( const LIB_ID& aLibID );
346
350 void CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged ) override;
351
352 void ShowChangedLanguage() override;
353
354 void SetScreen( BASE_SCREEN* aScreen ) override;
355
356 const BOX2I GetDocumentExtents( bool aIncludeAllVisible = true ) const override;
357
358 void RebuildView();
359
360 void UpdateItem( EDA_ITEM* aItem, bool isAddOrDelete = false,
361 bool aUpdateRtree = false ) override;
362
366 void HardRedraw() override;
367
368 void KiwayMailIn( KIWAY_EXPRESS& mail ) override;
369
375 void LoadSymbolFromSchematic( SCH_SYMBOL* aSymbol );
376
387 bool IsSymbolEditable() const;
388
389 bool IsSymbolAlias() const;
390
392 bool IsCurrentSymbol( const LIB_ID& aLibId ) const;
393
395 void emptyScreen();
396
397protected:
398 void setupUIConditions() override;
399
400 void doReCreateMenuBar() override;
401
402private:
403 // Set up the tool framework
404 void setupTools();
405
406 EDA_LIST_DIALOG* buildSaveAsDialog( const wxString& aSymbolName,
407 const wxString& aLibraryPreselect );
408
409 void saveSymbolAs();
410
421 bool saveLibrary( const wxString& aLibrary, bool aNewFile );
422
427 void updateTitle();
428
435 void SelectActiveLibrary( const wxString& aLibrary = wxEmptyString );
436
446 bool LoadSymbolFromCurrentLib( const wxString& aAliasName, int aUnit = 0, int aConvert = 0 );
447
458 bool LoadOneLibrarySymbolAux( LIB_SYMBOL* aLibEntry, const wxString& aLibrary, int aUnit,
459 int aConvert );
460
462 bool backupFile( const wxFileName& aOriginalFile, const wxString& aBackupExt );
463
466
469 wxString getTargetLib() const;
470
471 void centerItemIdleHandler( wxIdleEvent& aEvent );
472
473 /*
474 * Return true when the operation has succeeded (all requested libraries have been saved
475 * or none was selected and confirmed by OK).
476 *
477 * @param aRequireConfirmation when true, the user must be asked to confirm.
478 */
479 bool saveAllLibraries( bool aRequireConfirmation );
480
482 bool saveCurrentSymbol();
483
485 void storeCurrentSymbol();
486
488 void ensureUniqueName( LIB_SYMBOL* aSymbol, const wxString& aLibrary );
489
491 {
494 };
495
505 bool addLibTableEntry( const wxString& aLibFile, TABLE_SCOPE aScope = GLOBAL_LIB_TABLE );
506
517 bool replaceLibTableEntry( const wxString& aLibNickname, const wxString& aLibFile );
518
519 DECLARE_EVENT_TABLE()
520
521public:
544
545private:
548
549 LIB_SYMBOL* m_symbol; // a symbol I own, it is not in any library, but a
550 // copy could be.
551 wxComboBox* m_unitSelectBox; // a ComboBox to select a unit to edit (if the
552 // symbol has multiple units)
553 SYMBOL_TREE_PANE* m_treePane; // symbol search tree widget
554 LIB_SYMBOL_LIBRARY_MANAGER* m_libMgr; // manager taking care of temporary modifications
555 SYMBOL_EDITOR_SETTINGS* m_settings; // Handle to the settings
556
558
559 // The unit number to edit and show
561
562 // Show the normal shape ( m_convert <= 1 ) or the converted shape ( m_convert > 1 )
564
568
570 wxString m_reference;
571
572 // True to force DeMorgan/normal tools selection enabled.
573 // They are enabled when the loaded symbol has graphic items for converted shape
574 // But under some circumstances (New symbol created) these tools must left enabled
575 static bool m_showDeMorgan;
576};
577
578#endif // SYMBOL_EDIT_FRAME_H
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
Definition: app_settings.h:110
Handles how to draw a screen (a board, a schematic ...)
Definition: base_screen.h:41
Color settings are a bit different than most of the settings objects in that there can be more than o...
UNDO_REDO_LIST
Specifies whether we are interacting with the undo or redo stacks.
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:85
A dialog which shows:
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
Definition: kiid.h:48
Carry a payload from one KIWAY_PLAYER to another within a PROJECT.
Definition: kiway_express.h:39
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition: kiway.h:279
Field object used in symbol libraries.
Definition: lib_field.h:61
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:49
Symbol library management helper that is specific to the symbol library editor frame.
Define a library symbol object.
Definition: lib_symbol.h:99
Model class in the component selector Model-View-Adapter (mediated MVC) architecture.
A shim class between EDA_DRAW_FRAME and several derived classes: SYMBOL_EDIT_FRAME,...
Schematic editor (Eeschema) main window.
Schematic symbol object.
Definition: sch_symbol.h:81
The symbol library editor main window.
void CreateNewSymbol(const wxString &inheritFromSymbolName=wxEmptyString)
Create a new symbol in the selected library.
void ClearMsgPanel() override
Clear all messages from the message panel.
void OnExitKiCad(wxCommandEvent &event)
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
void UpdateItem(EDA_ITEM *aItem, bool isAddOrDelete=false, bool aUpdateRtree=false) override
Mark an item for refresh.
int m_convert
Flag if the symbol being edited was loaded directly from a schematic.
void UpdateAfterSymbolProperties(wxString *aOldName=nullptr)
void SaveAll()
Save all modified symbols and libraries.
void DeleteSymbolFromLibrary()
void setupUIConditions() override
Setup the UI conditions for the various actions and their controls in this frame.
APP_SETTINGS_BASE * config() const override
Returns the settings object used in SaveSettings(), and is overloaded in KICAD_MANAGER_FRAME.
bool addLibTableEntry(const wxString &aLibFile, TABLE_SCOPE aScope=GLOBAL_LIB_TABLE)
Add aLibFile to the symbol library table defined by aScope.
void storeCurrentSymbol()
Rename LIB_SYMBOL aliases to avoid conflicts before adding a symbol to a library.
void updateTitle()
Update the main window title bar with the current library name and read only status of the library.
const BOX2I GetDocumentExtents(bool aIncludeAllVisible=true) const override
Returns bbox of document with option to not include some items.
SELECTION & GetCurrentSelection() override
Get the current selection from the canvas area.
wxString getTargetLib() const
bool IsCurrentSymbol(const LIB_ID &aLibId) const
Restore the empty editor screen, without any symbol or library selected.
bool backupFile(const wxFileName &aOriginalFile, const wxString &aBackupExt)
Return currently edited symbol.
void RefreshLibraryTree()
Redisplay the library tree.
void ReCreateVToolbar() override
wxComboBox * m_unitSelectBox
int GetTreeLIBIDs(std::vector< LIB_ID > &aSelection) const
LIB_ID GetTreeLIBID(int *aUnit=nullptr) const
Return the LIB_ID of the library or symbol selected in the symbol tree.
LIB_SYMBOL_LIBRARY_MANAGER * m_libMgr
bool LoadOneLibrarySymbolAux(LIB_SYMBOL *aLibEntry, const wxString &aLibrary, int aUnit, int aConvert)
Create a copy of aLibEntry into memory.
wxString GetCurLib() const
The nickname of the current library being edited and empty string if none.
LIB_ID GetTargetLibId() const
Return either the symbol selected in the symbol tree (if context menu is active) or the symbol on the...
void FocusOnLibId(const LIB_ID &aLibID)
bool IsSymbolAlias() const
Return true if aLibId is an alias for the editor screen symbol.
void PrintPage(const RENDER_SETTINGS *aSettings) override
Print a page.
void Save()
Save the selected symbol or library.
SYMBOL_EDITOR_SETTINGS * m_settings
void LoadSymbol(const wxString &aLibrary, const wxString &aSymbol, int Unit)
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 HardRedraw() override
Rebuild the GAL and redraw the screen.
bool GetShowDeMorgan() const
void SaveSymbolAs()
Save the currently selected symbol to a new name and/or location.
bool IsSymbolTreeShown() const
bool m_SyncPinEdit
Set to true to synchronize pins at the same position when editing symbols with multiple units or mult...
int GetTreeSelectionCount() const
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
bool CanCloseSymbolFromSchematic(bool doClose)
void Revert(bool aConfirm=true)
Revert unsaved changes in a symbol, restoring to the last saved state.
bool IsSymbolFromLegacyLibrary() const
void centerItemIdleHandler(wxIdleEvent &aEvent)
bool replaceLibTableEntry(const wxString &aLibNickname, const wxString &aLibFile)
Replace the file path of the symbol library table entry aLibNickname with aLibFile.
bool IsSymbolFromSchematic() const
void OnToggleSymbolTree(wxCommandEvent &event)
static bool m_showDeMorgan
void SetScreen(BASE_SCREEN *aScreen) override
void SetConvert(int aConvert)
SYMBOL_EDITOR_SETTINGS * GetSettings() const
void DuplicateSymbol(bool aFromClipboard)
Insert a duplicate symbol.
SCH_SCREEN * m_dummyScreen
< Helper screen used when no symbol is loaded
void KiwayMailIn(KIWAY_EXPRESS &mail) override
Receive KIWAY_EXPRESS messages from other players.
void SetCurSymbol(LIB_SYMBOL *aSymbol, bool aUpdateZoom)
Take ownership of aSymbol and notes that it is the one currently being edited.
KIID m_schematicSymbolUUID
RefDes of the symbol (only valid if symbol was loaded from schematic)
SYMBOL_EDIT_FRAME(KIWAY *aKiway, wxWindow *aParent)
bool IsSymbolEditable() const
Test if a symbol is loaded and can be edited.
std::vector< LIB_ID > GetSelectedLibIds() const
LIB_TREE_NODE * GetCurrentTreeNode() const
void SyncLibraries(bool aShowProgress, bool aPreloadCancelled=false, const wxString &aForceRefresh=wxEmptyString)
Synchronize the library manager to the symbol library table, and then the symbol tree to the library ...
void RegenerateLibraryTree()
Filter, sort, and redisplay the library tree.
void OnSelectUnit(wxCommandEvent &event)
LIB_SYMBOL * GetCurSymbol() const
Return the current symbol being edited or NULL if none selected.
void UpdateSymbolMsgPanelInfo()
Display the documentation of the selected symbol.
bool canCloseWindow(wxCloseEvent &aCloseEvent) override
bool saveLibrary(const wxString &aLibrary, bool aNewFile)
Save the changes to the current library.
void SelectActiveLibrary(const wxString &aLibrary=wxEmptyString)
Set the current active library to aLibrary.
bool saveAllLibraries(bool aRequireConfirmation)
Save the current symbol.
EDA_LIST_DIALOG * buildSaveAsDialog(const wxString &aSymbolName, const wxString &aLibraryPreselect)
void SetUnit(int aUnit)
void UpdateMsgPanel() override
Redraw the message panel.
void ClearUndoORRedoList(UNDO_REDO_LIST whichList, int aItemCount=-1) override
Free the undo or redo list from aList element.
wxString SetCurLib(const wxString &aLibNickname)
Set the current library nickname and returns the old library nickname.
void ReCreateHToolbar() override
void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Called after the preferences dialog is run.
void SVGPlotSymbol(const wxString &aFullFileName, VECTOR2I aOffset)
Create the SVG print file for the current edited symbol.
bool HasLibModifications() const
Check if any pending libraries have been modified.
SYMBOL_TREE_PANE * m_treePane
void LoadSymbolFromSchematic(SCH_SYMBOL *aSymbol)
Load a symbol from the schematic to edit in place.
bool saveCurrentSymbol()
Store the currently modified symbol in the library manager buffer.
COLOR_SETTINGS * GetColorSettings(bool aForceRefresh=false) const override
Returns a pointer to the active color theme settings.
LIB_SYMBOL_LIBRARY_MANAGER & GetLibManager()
void SwitchCanvas(EDA_DRAW_PANEL_GAL::GAL_TYPE aCanvasType) override
Switch currently used canvas ( Cairo / OpenGL).
void doCloseWindow() override
void DdAddLibrary(wxString aLibFile)
Add a library dropped file to the symbol library table.
wxString AddLibraryFile(bool aCreateNew)
Create or add an existing library to the symbol library table.
void ReCreateOptToolbar() override
void ensureUniqueName(LIB_SYMBOL *aSymbol, const wxString &aLibrary)
void CloseWindow(wxCommandEvent &event)
Trigger the wxCloseEvent, which is handled by the function given to EVT_CLOSE() macro:
void UpdateLibraryTree(const wxDataViewItem &aTreeItem, LIB_SYMBOL *aSymbol)
Update a symbol node in the library tree.
void OnModify() override
Must be called after a schematic change in order to set the "modify" flag of the current symbol.
void SetShowDeMorgan(bool show)
void ShowChangedLanguage() override
void SaveLibraryAs()
Save the currently selected library to a new file.
bool IsContentModified() const override
Get if any symbols or libraries have been modified but not saved.
void doReCreateMenuBar() override
LIB_SYMBOL * getTargetSymbol() const
Return either the library selected in the symbol tree, if context menu is active or the library that ...
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.
void OnUpdateUnitNumber(wxUpdateUIEvent &event)
Library Editor pane with symbol tree and symbol library table selector.
UNDO_REDO
Undo Redo considerations: Basically we have 3 cases New item Deleted item Modified item there is also...