KiCad PCB EDA Suite
Loading...
Searching...
No Matches
symbol_library_manager.h
Go to the documentation of this file.
1/*
2 * This program source code file is symbol of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2017 CERN
5 * Copyright (C) 2019-2023 KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * @author Maciej Suminski <[email protected]>
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 3
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A SYMBOLICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, you may find one here:
21 * https://www.gnu.org/licenses/gpl-3.0.html
22 * or you may search the http://www.gnu.org website for the version 3 license,
23 * or you may write to the Free Software Foundation, Inc.,
24 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
25 */
26
27#ifndef SYMBOL_LIBRARY_MANAGER_H
28#define SYMBOL_LIBRARY_MANAGER_H
29
30#include <map>
31#include <list>
32#include <deque>
33#include <set>
34#include <memory>
35#include <wx/arrstr.h>
36#include <sch_io/sch_io_mgr.h>
37#include <sch_screen.h>
38
39class LIB_SYMBOL;
40class SYMBOL_LIB;
42class SCH_IO;
43class SCH_BASE_FRAME;
46class LIB_LOGGER;
47
48
50{
51 ALL,
54};
55
56
58{
59public:
60 SYMBOL_BUFFER( LIB_SYMBOL* aSymbol = nullptr, std::unique_ptr<SCH_SCREEN> aScreen = nullptr );
62
63 LIB_SYMBOL* GetSymbol() const { return m_symbol; }
64 void SetSymbol( LIB_SYMBOL* aSymbol );
65
66 LIB_SYMBOL* GetOriginal() const { return m_original; }
67 void SetOriginal( LIB_SYMBOL* aSymbol );
68
69 bool IsModified() const;
70 SCH_SCREEN* GetScreen() const { return m_screen.get(); }
71
72private:
73 std::unique_ptr<SCH_SCREEN> m_screen;
74 LIB_SYMBOL* m_symbol; // Working copy
75 LIB_SYMBOL* m_original; // Initial state of the symbol
76};
77
78
81{
82public:
83 LIB_BUFFER( const wxString& aLibrary ) :
84 m_libName( aLibrary ),
85 m_hash( 1 )
86 {}
87
88 bool IsModified() const
89 {
90 if( !m_deleted.empty() )
91 return true;
92
93 for( const std::shared_ptr<SYMBOL_BUFFER>& symbolBuf : m_symbols )
94 {
95 if( symbolBuf->IsModified() )
96 return true;
97 }
98
99 return false;
100 }
101
102 int GetHash() const { return m_hash; }
103
105 LIB_SYMBOL* GetSymbol( const wxString& aAlias ) const;
106
108 bool CreateBuffer( LIB_SYMBOL* aCopy, SCH_SCREEN* aScreen );
109
111 bool UpdateBuffer( std::shared_ptr<SYMBOL_BUFFER> aSymbolBuf, LIB_SYMBOL* aCopy );
112
113 bool DeleteBuffer( std::shared_ptr<SYMBOL_BUFFER> aSymbolBuf );
114
115 void ClearDeletedBuffer() { m_deleted.clear(); }
116
119 bool SaveBuffer( std::shared_ptr<SYMBOL_BUFFER> aSymbolBuf, const wxString& aFileName,
120 SCH_IO* aPlugin, bool aBuffer );
121
123 std::shared_ptr<SYMBOL_BUFFER> GetBuffer( const wxString& aAlias ) const;
124
126 const std::deque<std::shared_ptr<SYMBOL_BUFFER>>& GetBuffers() const { return m_symbols; }
127
135 bool HasDerivedSymbols( const wxString& aParentName ) const;
136
143 void GetSymbolNames( wxArrayString& aSymbolNames,
144 SYMBOL_NAME_FILTER aFilter = SYMBOL_NAME_FILTER::ALL );
145
154 size_t GetDerivedSymbolNames( const wxString& aSymbolName, wxArrayString& aList );
155
156private:
163 int removeChildSymbols( std::shared_ptr<SYMBOL_BUFFER>& aSymbolBuf );
164
165private:
166 std::deque<std::shared_ptr<SYMBOL_BUFFER>> m_symbols;
167 std::deque<std::shared_ptr<SYMBOL_BUFFER>> m_deleted;
169 const wxString m_libName;
171};
172
173
178{
179public:
181 virtual ~SYMBOL_LIBRARY_MANAGER();
182
188 void Preload( PROGRESS_REPORTER& aReporter );
189
190 int GetHash() const;
191
192 bool HasModifications() const;
193
201 int GetLibraryHash( const wxString& aLibrary ) const;
202
206 wxArrayString GetLibraryNames() const;
207
211 SYMBOL_LIB_TABLE_ROW* GetLibrary( const wxString& aLibrary ) const;
212
213 std::list<LIB_SYMBOL*> GetAliases( const wxString& aLibrary ) const;
214
218 bool CreateLibrary( const wxString& aFilePath, SYMBOL_LIB_TABLE* aTable )
219 {
220 return addLibrary( aFilePath, true, aTable );
221 }
222
226 bool AddLibrary( const wxString& aFilePath, SYMBOL_LIB_TABLE* aTable )
227 {
228 return addLibrary( aFilePath, false, aTable );
229 }
230
236 bool UpdateSymbol( LIB_SYMBOL* aSymbol, const wxString& aLibrary );
237
242 bool UpdateSymbolAfterRename( LIB_SYMBOL* aSymbol, const wxString& oldAlias,
243 const wxString& aLibrary );
244
248 bool UpdateLibraryBuffer( const wxString& aLibrary );
249
254 bool RemoveSymbol( const wxString& aName, const wxString& aLibrary );
255
260 LIB_SYMBOL* GetAlias( const wxString& aAlias, const wxString& aLibrary ) const;
261
266 LIB_SYMBOL* GetBufferedSymbol( const wxString& aAlias, const wxString& aLibrary );
267
272 SCH_SCREEN* GetScreen( const wxString& aAlias, const wxString& aLibrary );
273
278 bool SymbolExists( const wxString& aAlias, const wxString& aLibrary ) const;
279
284 bool LibraryExists( const wxString& aLibrary, bool aCheckEnabled = false ) const;
285
289 bool IsLibraryLoaded( const wxString& aLibrary ) const;
290
294 bool IsLibraryModified( const wxString& aLibrary ) const;
295
299 bool IsSymbolModified( const wxString& aAlias, const wxString& aLibrary ) const;
300
301 void SetSymbolModified( const wxString& aAlias, const wxString& aLibrary );
302
306 bool ClearLibraryModified( const wxString& aLibrary ) const;
307
311 bool ClearSymbolModified( const wxString& aAlias, const wxString& aLibrary ) const;
312
318 bool IsLibraryReadOnly( const wxString& aLibrary ) const;
319
327 bool SaveLibrary( const wxString& aLibrary, const wxString& aFileName,
328 SCH_IO_MGR::SCH_FILE_T aFileType = SCH_IO_MGR::SCH_FILE_T::SCH_LEGACY );
329
336 LIB_ID RevertSymbol( const wxString& aAlias, const wxString& aLibrary );
337
343 bool RevertLibrary( const wxString& aLibrary );
344
350 bool RevertAll();
351
356 wxString GetUniqueLibraryName() const;
357
358 void GetSymbolNames( const wxString& aLibName, wxArrayString& aSymbolNames,
359 SYMBOL_NAME_FILTER aFilter = SYMBOL_NAME_FILTER::ALL );
360
367 bool HasDerivedSymbols( const wxString& aSymbolName, const wxString& aLibraryName );
368
369 size_t GetLibraryCount() const;
370
371protected:
372 virtual void OnDataChanged() const {}
373
375 static wxString getLibraryName( const wxString& aFilePath );
376
378 bool addLibrary( const wxString& aFilePath, bool aCreate, SYMBOL_LIB_TABLE* aTable );
379
380
382 SYMBOL_LIB_TABLE* symTable() const;
383
385
388 std::set<LIB_SYMBOL*> getOriginalSymbols( const wxString& aLibrary );
389
394 LIB_BUFFER& getLibraryBuffer( const wxString& aLibrary );
395
396protected:
397 std::map<wxString, LIB_BUFFER> m_libs;
400};
401
402#endif /* SYMBOL_LIBRARY_MANAGER_H */
size_t GetDerivedSymbolNames(const wxString &aSymbolName, wxArrayString &aList)
Fetch all of the symbols derived from a aSymbolName into aList.
int removeChildSymbols(std::shared_ptr< SYMBOL_BUFFER > &aSymbolBuf)
Remove all symbols derived from aParent from the library buffer.
bool DeleteBuffer(std::shared_ptr< SYMBOL_BUFFER > aSymbolBuf)
bool CreateBuffer(LIB_SYMBOL *aCopy, SCH_SCREEN *aScreen)
Update the buffered symbol with the contents of aCopy.
bool IsModified() const
void ClearDeletedBuffer()
Save stored modifications using a plugin.
void GetSymbolNames(wxArrayString &aSymbolNames, SYMBOL_NAME_FILTER aFilter=SYMBOL_NAME_FILTER::ALL)
Fetch a list of root symbols names from the library buffer.
LIB_BUFFER(const wxString &aLibrary)
bool UpdateBuffer(std::shared_ptr< SYMBOL_BUFFER > aSymbolBuf, LIB_SYMBOL *aCopy)
std::deque< std::shared_ptr< SYMBOL_BUFFER > > m_symbols
std::deque< std::shared_ptr< SYMBOL_BUFFER > > m_deleted
Buffer for deleted symbols until library is saved.
const std::deque< std::shared_ptr< SYMBOL_BUFFER > > & GetBuffers() const
std::shared_ptr< SYMBOL_BUFFER > GetBuffer(const wxString &aAlias) const
Return all buffered symbols.
LIB_SYMBOL * GetSymbol(const wxString &aAlias) const
Create a new buffer to store a symbol. LIB_BUFFER takes ownership of aCopy.
int GetHash() const
Return the working copy of a LIB_SYMBOL root object with specified alias.
bool HasDerivedSymbols(const wxString &aParentName) const
Check to see any symbols in the buffer are derived from a parent named aParentName.
const wxString m_libName
Buffered library name.
bool SaveBuffer(std::shared_ptr< SYMBOL_BUFFER > aSymbolBuf, const wxString &aFileName, SCH_IO *aPlugin, bool aBuffer)
Return a symbol buffer with LIB_SYMBOL holding a symbolicular alias.
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:49
Define a library symbol object.
Definition: lib_symbol.h:78
A progress reporter interface for use in multi-threaded environments.
A shim class between EDA_DRAW_FRAME and several derived classes: SYMBOL_EDIT_FRAME,...
Base class that schematic file and library loading and saving plugins should derive from.
Definition: sch_io.h:57
Store a working copy of a library.
std::unique_ptr< SCH_SCREEN > m_screen
SCH_SCREEN * GetScreen() const
LIB_SYMBOL * GetOriginal() const
void SetOriginal(LIB_SYMBOL *aSymbol)
void SetSymbol(LIB_SYMBOL *aSymbol)
LIB_SYMBOL * GetSymbol() const
LIB_SYMBOL * m_original
Class to handle modifications to the symbol libraries.
LIB_SYMBOL * GetBufferedSymbol(const wxString &aAlias, const wxString &aLibrary)
Return the symbol copy from the buffer.
bool UpdateSymbolAfterRename(LIB_SYMBOL *aSymbol, const wxString &oldAlias, const wxString &aLibrary)
Update the symbol buffer with a new version of the symbol when the name has changed.
bool IsLibraryReadOnly(const wxString &aLibrary) const
Return true if the library is stored in a read-only file.
bool addLibrary(const wxString &aFilePath, bool aCreate, SYMBOL_LIB_TABLE *aTable)
Return the current Symbol Library Table.
bool ClearSymbolModified(const wxString &aAlias, const wxString &aLibrary) const
Clear the modified flag for a symbol.
bool LibraryExists(const wxString &aLibrary, bool aCheckEnabled=false) const
Return true if library exists.
bool ClearLibraryModified(const wxString &aLibrary) const
Clear the modified flag for all symbols in a library.
LIB_SYMBOL * GetAlias(const wxString &aAlias, const wxString &aLibrary) const
Return either an alias of a working LIB_SYMBOL copy, or alias of the original symbol if there is no w...
SCH_SCREEN * GetScreen(const wxString &aAlias, const wxString &aLibrary)
Return the screen used to edit a specific symbol.
bool IsLibraryModified(const wxString &aLibrary) const
Return true if library has unsaved modifications.
wxArrayString GetLibraryNames() const
Return the array of library names.
void SetSymbolModified(const wxString &aAlias, const wxString &aLibrary)
bool SymbolExists(const wxString &aAlias, const wxString &aLibrary) const
Return true if symbol with a specific alias exists in library (either original one or buffered).
LIB_BUFFER & getLibraryBuffer(const wxString &aLibrary)
Return an existing library buffer or creates one to using Symbol Library Table to get the original da...
wxString GetUniqueLibraryName() const
Return a library name that is not currently in use.
bool RemoveSymbol(const wxString &aName, const wxString &aLibrary)
Remove the symbol from the symbol buffer.
static wxString getLibraryName(const wxString &aFilePath)
Helper function to add either existing or create new library.
bool AddLibrary(const wxString &aFilePath, SYMBOL_LIB_TABLE *aTable)
Add an existing library.
virtual void OnDataChanged() const
Extract library name basing on the file name.
bool CreateLibrary(const wxString &aFilePath, SYMBOL_LIB_TABLE *aTable)
Create an empty library and adds it to the library table.
bool IsSymbolModified(const wxString &aAlias, const wxString &aLibrary) const
Return true if symbol has unsaved modifications.
bool IsLibraryLoaded(const wxString &aLibrary) const
Return true if the library was successfully loaded.
SYMBOL_LIB_TABLE * symTable() const
Class to store a working copy of a LIB_SYMBOL object and editor context.
bool RevertLibrary(const wxString &aLibrary)
Revert unsaved changes for a symbolicular library.
void GetSymbolNames(const wxString &aLibName, wxArrayString &aSymbolNames, SYMBOL_NAME_FILTER aFilter=SYMBOL_NAME_FILTER::ALL)
std::set< LIB_SYMBOL * > getOriginalSymbols(const wxString &aLibrary)
Return a set of LIB_SYMBOL objects belonging to the original library.
int GetLibraryHash(const wxString &aLibrary) const
Return a library hash value to determine if it has changed.
void Preload(PROGRESS_REPORTER &aReporter)
Preloads all symbol libraries in the symbol library table using SYMBOL_ASYNC_LOADER.
bool RevertAll()
Revert all pending changes.
LIB_ID RevertSymbol(const wxString &aAlias, const wxString &aLibrary)
Revert unsaved changes for a symbolicular symbol.
SYMBOL_LIB_TABLE_ROW * GetLibrary(const wxString &aLibrary) const
Find a single library within the (aggregate) library table.
SCH_BASE_FRAME & m_frame
Parent frame.
std::list< LIB_SYMBOL * > GetAliases(const wxString &aLibrary) const
bool UpdateSymbol(LIB_SYMBOL *aSymbol, const wxString &aLibrary)
Update the symbol buffer with a new version of the symbol.
bool SaveLibrary(const wxString &aLibrary, const wxString &aFileName, SCH_IO_MGR::SCH_FILE_T aFileType=SCH_IO_MGR::SCH_FILE_T::SCH_LEGACY)
Save library to a file, including unsaved changes.
bool HasDerivedSymbols(const wxString &aSymbolName, const wxString &aLibraryName)
Check if symbol aSymbolName in library aLibraryName is a root symbol that has derived symbols.
std::map< wxString, LIB_BUFFER > m_libs
The library buffers.
bool UpdateLibraryBuffer(const wxString &aLibrary)
Update the library buffer with a new version of the library.
Hold a record identifying a symbol library accessed by the appropriate symbol library SCH_IO object i...
Object used to load, save, search, and otherwise manipulate symbol library files.
SYMBOL_NAME_FILTER