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-2022 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 void ReCreateMenuBar() override;
122
123 // See comments for m_SyncPinEdit.
124 bool SynchronizePins();
125
129 wxString AddLibraryFile( bool aCreateNew );
130
134 void DdAddLibrary( wxString aLibFile );
135
139 void CreateNewSymbol();
140
141 void ImportSymbol();
142 void ExportSymbol();
143
147 void Save();
148
152 void SaveSymbolAs();
153
157 void SaveLibraryAs();
158
162 void SaveAll();
163
167 void Revert( bool aConfirm = true );
168 void RevertAll();
169
171
173
174 void LoadSymbol( const wxString& aLibrary, const wxString& aSymbol, int Unit );
175
181 void DuplicateSymbol( bool aFromClipboard );
182
183 void OnSelectUnit( wxCommandEvent& event );
184
185 void OnToggleSymbolTree( wxCommandEvent& event );
186
187 bool IsSymbolTreeShown() const;
188 void FreezeLibraryTree();
189 void ThawLibraryTree();
190
191 void OnUpdateUnitNumber( wxUpdateUIEvent& event );
192
193 void UpdateAfterSymbolProperties( wxString* aOldName = nullptr );
195
196 bool canCloseWindow( wxCloseEvent& aCloseEvent ) override;
197 void doCloseWindow() override;
198 void OnExitKiCad( wxCommandEvent& event );
199 void ReCreateHToolbar() override;
200 void ReCreateVToolbar() override;
201 void ReCreateOptToolbar() override;
202
203 void LoadSettings( APP_SETTINGS_BASE* aCfg ) override;
204 void SaveSettings( APP_SETTINGS_BASE* aCfg ) override;
205
207 {
208 return m_settings;
209 }
210
211 APP_SETTINGS_BASE* config() const override;
212
213 COLOR_SETTINGS* GetColorSettings( bool aForceRefresh = false ) const override;
214
221 void CloseWindow( wxCommandEvent& event )
222 {
223 // Generate a wxCloseEvent
224 Close( false );
225 }
226
231 void OnModify() override;
232
233 int GetUnit() const { return m_unit; }
234 void SetUnit( int aUnit ) { m_unit = aUnit; }
235
236 int GetConvert() const { return m_convert; }
237 void SetConvert( int aConvert ) { m_convert = aConvert; }
238
239 bool GetShowDeMorgan() const { return m_showDeMorgan; }
240 void SetShowDeMorgan( bool show ) { m_showDeMorgan = show; }
241
242 void ClearMsgPanel() override
243 {
245 }
246
248
249 bool IsSymbolFromLegacyLibrary() const;
250
255
256 // General editing
264 bool aAppend = false );
265
268
270
283 void ClearUndoORRedoList( UNDO_REDO_LIST whichList, int aItemCount = -1 ) override;
284
293 bool LoadSymbol( const LIB_ID& aLibId, int aUnit, int aConvert );
294
298 void PrintPage( const RENDER_SETTINGS* aSettings ) override;
299
303 void SVGPlotSymbol( const wxString& aFullFileName );
304
309 void SyncLibraries( bool aShowProgress, bool aPreloadCancelled = false,
310 const wxString& aForceRefresh = wxEmptyString );
311
318
322 void RefreshLibraryTree();
323
327 void UpdateLibraryTree( const wxDataViewItem& aTreeItem, LIB_SYMBOL* aSymbol );
328
333 LIB_ID GetTargetLibId() const;
334
338 std::vector<LIB_ID> GetSelectedLibIds() const;
339
340 void FocusOnLibId( const LIB_ID& aLibID );
341
345 void CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged ) override;
346
347 void ShowChangedLanguage() override;
348
349 void SetScreen( BASE_SCREEN* aScreen ) override;
350
351 const BOX2I GetDocumentExtents( bool aIncludeAllVisible = true ) const override;
352
353 void RebuildView();
354
355 void UpdateItem( EDA_ITEM* aItem, bool isAddOrDelete = false,
356 bool aUpdateRtree = false ) override;
357
361 void HardRedraw() override;
362
363 void KiwayMailIn( KIWAY_EXPRESS& mail ) override;
364
370 void LoadSymbolFromSchematic( SCH_SYMBOL* aSymbol );
371
382 bool IsSymbolEditable() const;
383
384 bool IsSymbolAlias() const;
385
387 bool IsCurrentSymbol( const LIB_ID& aLibId ) const;
388
390 void emptyScreen();
391
392protected:
393 void setupUIConditions() override;
394
395private:
396 // Set up the tool framework
397 void setupTools();
398
399 EDA_LIST_DIALOG* buildSaveAsDialog( const wxString& aSymbolName,
400 const wxString& aLibraryPreselect );
401
402 void saveSymbolAs();
403
414 bool saveLibrary( const wxString& aLibrary, bool aNewFile );
415
420 void updateTitle();
421
428 void SelectActiveLibrary( const wxString& aLibrary = wxEmptyString );
429
439 bool LoadSymbolFromCurrentLib( const wxString& aAliasName, int aUnit = 0, int aConvert = 0 );
440
451 bool LoadOneLibrarySymbolAux( LIB_SYMBOL* aLibEntry, const wxString& aLibrary, int aUnit,
452 int aConvert );
453
455 bool backupFile( const wxFileName& aOriginalFile, const wxString& aBackupExt );
456
459
462 wxString getTargetLib() const;
463
464 void centerItemIdleHandler( wxIdleEvent& aEvent );
465
466 /*
467 * Return true when the operation has succeeded (all requested libraries have been saved
468 * or none was selected and confirmed by OK).
469 *
470 * @param aRequireConfirmation when true, the user must be asked to confirm.
471 */
472 bool saveAllLibraries( bool aRequireConfirmation );
473
475 bool saveCurrentSymbol();
476
478 void storeCurrentSymbol();
479
481 void ensureUniqueName( LIB_SYMBOL* aSymbol, const wxString& aLibrary );
482
484 {
487 };
488
498 bool addLibTableEntry( const wxString& aLibFile, TABLE_SCOPE aScope = GLOBAL_LIB_TABLE );
499
510 bool replaceLibTableEntry( const wxString& aLibNickname, const wxString& aLibFile );
511
512 DECLARE_EVENT_TABLE()
513
514public:
537
538private:
541
542 LIB_SYMBOL* m_symbol; // a symbol I own, it is not in any library, but a
543 // copy could be.
544 wxComboBox* m_unitSelectBox; // a ComboBox to select a unit to edit (if the
545 // symbol has multiple units)
546 SYMBOL_TREE_PANE* m_treePane; // symbol search tree widget
547 LIB_SYMBOL_LIBRARY_MANAGER* m_libMgr; // manager taking care of temporary modifications
548 SYMBOL_EDITOR_SETTINGS* m_settings; // Handle to the settings
549
551
552 // The unit number to edit and show
554
555 // Show the normal shape ( m_convert <= 1 ) or the converted shape ( m_convert > 1 )
557
561
563 wxString m_reference;
564
565 // True to force DeMorgan/normal tools selection enabled.
566 // They are enabled when the loaded symbol has graphic items for converted shape
567 // But under some circumstances (New symbol created) these tools must left enabled
568 static bool m_showDeMorgan;
569};
570
571#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:101
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:273
Field object used in symbol libraries.
Definition: lib_field.h:60
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:98
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:80
The symbol library editor main window.
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 SVGPlotSymbol(const wxString &aFullFileName)
Create the SVG print file for the current 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 ReCreateMenuBar() override
Recreates the menu bar.
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 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.
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.
void CreateNewSymbol()
Create a new symbol in the selected library.
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.
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...