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_mgr.h>
37#include <sch_screen.h>
38
39class LIB_SYMBOL;
40class SYMBOL_LIB;
42class SCH_PLUGIN;
43class SCH_BASE_FRAME;
46class LIB_LOGGER;
47
48
50{
51 ALL,
54};
55
56
61{
62public:
65
71 void Preload( PROGRESS_REPORTER& aReporter );
72
73 int GetHash() const;
74
75 bool HasModifications() const;
76
84 int GetLibraryHash( const wxString& aLibrary ) const;
85
89 wxArrayString GetLibraryNames() const;
90
94 SYMBOL_LIB_TABLE_ROW* GetLibrary( const wxString& aLibrary ) const;
95
96 std::list<LIB_SYMBOL*> GetAliases( const wxString& aLibrary ) const;
97
101 bool CreateLibrary( const wxString& aFilePath, SYMBOL_LIB_TABLE* aTable )
102 {
103 return addLibrary( aFilePath, true, aTable );
104 }
105
109 bool AddLibrary( const wxString& aFilePath, SYMBOL_LIB_TABLE* aTable )
110 {
111 return addLibrary( aFilePath, false, aTable );
112 }
113
119 bool UpdateSymbol( LIB_SYMBOL* aSymbol, const wxString& aLibrary );
120
125 bool UpdateSymbolAfterRename( LIB_SYMBOL* aSymbol, const wxString& oldAlias,
126 const wxString& aLibrary );
127
131 bool UpdateLibraryBuffer( const wxString& aLibrary );
132
137 bool RemoveSymbol( const wxString& aName, const wxString& aLibrary );
138
143 LIB_SYMBOL* GetAlias( const wxString& aAlias, const wxString& aLibrary ) const;
144
149 LIB_SYMBOL* GetBufferedSymbol( const wxString& aAlias, const wxString& aLibrary );
150
155 SCH_SCREEN* GetScreen( const wxString& aAlias, const wxString& aLibrary );
156
161 bool SymbolExists( const wxString& aAlias, const wxString& aLibrary ) const;
162
167 bool LibraryExists( const wxString& aLibrary, bool aCheckEnabled = false ) const;
168
172 bool IsLibraryLoaded( const wxString& aLibrary ) const;
173
177 bool IsLibraryModified( const wxString& aLibrary ) const;
178
182 bool IsSymbolModified( const wxString& aAlias, const wxString& aLibrary ) const;
183
184 void SetSymbolModified( const wxString& aAlias, const wxString& aLibrary );
185
189 bool ClearLibraryModified( const wxString& aLibrary ) const;
190
194 bool ClearSymbolModified( const wxString& aAlias, const wxString& aLibrary ) const;
195
201 bool IsLibraryReadOnly( const wxString& aLibrary ) const;
202
209 bool FlushSymbol( const wxString& aAlias, const wxString& aLibrary );
210
218 bool SaveLibrary( const wxString& aLibrary, const wxString& aFileName,
219 SCH_IO_MGR::SCH_FILE_T aFileType = SCH_IO_MGR::SCH_FILE_T::SCH_LEGACY );
220
227 LIB_ID RevertSymbol( const wxString& aAlias, const wxString& aLibrary );
228
234 bool RevertLibrary( const wxString& aLibrary );
235
241 bool RevertAll();
242
247 wxString GetUniqueLibraryName() const;
248
249 void GetSymbolNames( const wxString& aLibName, wxArrayString& aSymbolNames,
250 SYMBOL_NAME_FILTER aFilter = SYMBOL_NAME_FILTER::ALL );
251
258 bool HasDerivedSymbols( const wxString& aSymbolName, const wxString& aLibraryName );
259
260 size_t GetLibraryCount() const;
261
262protected:
263 virtual void OnDataChanged() const {}
264
266 static wxString getLibraryName( const wxString& aFilePath );
267
269 bool addLibrary( const wxString& aFilePath, bool aCreate, SYMBOL_LIB_TABLE* aTable );
270
271
273 SYMBOL_LIB_TABLE* symTable() const;
274
277 {
278 public:
279 SYMBOL_BUFFER( LIB_SYMBOL* aSymbol = nullptr,
280 std::unique_ptr<SCH_SCREEN> aScreen = nullptr );
282
283 LIB_SYMBOL* GetSymbol() const { return m_symbol; }
284 void SetSymbol( LIB_SYMBOL* aSymbol );
285
286 LIB_SYMBOL* GetOriginal() const { return m_original; }
287 void SetOriginal( LIB_SYMBOL* aSymbol );
288
289 bool IsModified() const;
290 SCH_SCREEN* GetScreen() const { return m_screen.get(); }
291
293 std::unique_ptr<SCH_SCREEN> RemoveScreen()
294 {
295 return std::move( m_screen );
296 }
297
298 bool SetScreen( std::unique_ptr<SCH_SCREEN> aScreen )
299 {
300 bool ret = !!m_screen;
301 m_screen = std::move( aScreen );
302 return ret;
303 }
304
305 private:
306 std::unique_ptr<SCH_SCREEN> m_screen;
307
308 LIB_SYMBOL* m_symbol; // Working copy
309 LIB_SYMBOL* m_original; // Initial state of the symbol
310 };
311
312
315 {
316 public:
317 LIB_BUFFER( const wxString& aLibrary ) :
318 m_libName( aLibrary ),
319 m_hash( 1 )
320 { }
321
322 bool IsModified() const
323 {
324 if( !m_deleted.empty() )
325 return true;
326
327 for( const std::shared_ptr<SYMBOL_BUFFER>& symbolBuf : m_symbols )
328 {
329 if( symbolBuf->IsModified() )
330 return true;
331 }
332
333 return false;
334 }
335
336 int GetHash() const { return m_hash; }
337
339 LIB_SYMBOL* GetSymbol( const wxString& aAlias ) const;
340
342 bool CreateBuffer( LIB_SYMBOL* aCopy, SCH_SCREEN* aScreen );
343
345 bool UpdateBuffer( std::shared_ptr<SYMBOL_BUFFER> aSymbolBuf, LIB_SYMBOL* aCopy );
346
347 bool DeleteBuffer( std::shared_ptr<SYMBOL_BUFFER> aSymbolBuf );
348
350 {
351 m_deleted.clear();
352 }
353
356 bool SaveBuffer( std::shared_ptr<SYMBOL_BUFFER> aSymbolBuf, SYMBOL_LIB_TABLE* aLibTable );
357
360 bool SaveBuffer( std::shared_ptr<SYMBOL_BUFFER> aSymbolBuf, const wxString& aFileName,
361 SCH_PLUGIN* aPlugin, bool aBuffer );
362
364 std::shared_ptr<SYMBOL_BUFFER> GetBuffer( const wxString& aAlias ) const;
365
367 const std::deque< std::shared_ptr<SYMBOL_BUFFER> >& GetBuffers() const { return m_symbols; }
368
376 bool HasDerivedSymbols( const wxString& aParentName ) const;
377
384 void GetSymbolNames( wxArrayString& aSymbolNames,
385 SYMBOL_NAME_FILTER aFilter = SYMBOL_NAME_FILTER::ALL );
386
395 size_t GetDerivedSymbolNames( const wxString& aSymbolName, wxArrayString& aList );
396
397 private:
404 int removeChildSymbols( std::shared_ptr<SYMBOL_BUFFER>& aSymbolBuf );
405
406 std::deque< std::shared_ptr<SYMBOL_BUFFER> > m_symbols;
407
409 std::deque< std::shared_ptr<SYMBOL_BUFFER> > m_deleted;
410 const wxString m_libName; // Buffered library name
412 };
413
417 std::set<LIB_SYMBOL*> getOriginalSymbols( const wxString& aLibrary );
418
423 LIB_BUFFER& getLibraryBuffer( const wxString& aLibrary );
424
426 std::map<wxString, LIB_BUFFER> m_libs;
427
430};
431
432#endif /* SYMBOL_LIBRARY_MANAGER_H */
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:99
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_mgr.h:145
std::deque< std::shared_ptr< SYMBOL_BUFFER > > m_deleted
LIB_SYMBOL * GetSymbol(const wxString &aAlias) const
Create a new buffer to store a symbol. LIB_BUFFER takes ownership of aCopy.
void ClearDeletedBuffer()
Save stored modifications to Symbol Lib Table.
int removeChildSymbols(std::shared_ptr< SYMBOL_BUFFER > &aSymbolBuf)
Remove all symbols derived from aParent from the library buffer.
bool HasDerivedSymbols(const wxString &aParentName) const
Check to see any symbols in the buffer are derived from a parent named aParentName.
std::deque< std::shared_ptr< SYMBOL_BUFFER > > m_symbols
Buffer for deleted symbols until library is saved.
bool SaveBuffer(std::shared_ptr< SYMBOL_BUFFER > aSymbolBuf, SYMBOL_LIB_TABLE *aLibTable)
Save stored modifications using a plugin.
const std::deque< std::shared_ptr< SYMBOL_BUFFER > > & GetBuffers() const
int GetHash() const
Return the working copy of a LIB_SYMBOL root object with specified alias.
std::shared_ptr< SYMBOL_BUFFER > GetBuffer(const wxString &aAlias) const
Return all buffered symbols.
bool UpdateBuffer(std::shared_ptr< SYMBOL_BUFFER > aSymbolBuf, LIB_SYMBOL *aCopy)
bool DeleteBuffer(std::shared_ptr< SYMBOL_BUFFER > aSymbolBuf)
void GetSymbolNames(wxArrayString &aSymbolNames, SYMBOL_NAME_FILTER aFilter=SYMBOL_NAME_FILTER::ALL)
Fetch a list of root symbols names from the library buffer.
bool CreateBuffer(LIB_SYMBOL *aCopy, SCH_SCREEN *aScreen)
Update the buffered symbol with the contents of aCopy.
size_t GetDerivedSymbolNames(const wxString &aSymbolName, wxArrayString &aList)
Fetch all of the symbols derived from a aSymbolName into aList.
Store a working copy of a library.
bool SetScreen(std::unique_ptr< SCH_SCREEN > aScreen)
std::unique_ptr< SCH_SCREEN > RemoveScreen()
SCH_SCREEN * GetScreen() const
Transfer the screen ownership.
std::unique_ptr< SCH_SCREEN > m_screen
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).
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.
LIB_BUFFER & getLibraryBuffer(const wxString &aLibrary)
Return an existing library buffer or creates one to using Symbol Library Table to get the original da...
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
bool UpdateLibraryBuffer(const wxString &aLibrary)
Update the library buffer with a new version of the library.
bool FlushSymbol(const wxString &aAlias, const wxString &aLibrary)
Save symbol changes to the library copy used by the schematic editor.
Hold a record identifying a symbol library accessed by the appropriate symbol library SCH_PLUGIN obje...
Object used to load, save, search, and otherwise manipulate symbol library files.
SYMBOL_NAME_FILTER