65        if( buffer.IsModified() )
 
 
   82    if( 
const auto libBufIt = 
m_libs.find( aLibrary ); libBufIt != 
m_libs.end() )
 
   83        return libBufIt->second.GetHash();
 
   89        return std::hash<std::string>{}( aLibrary.ToStdString() + uri->ToStdString() );
 
 
  108        res.Add( row->Nickname() );
 
 
  116                                          SCH_IO_MGR::SCH_FILE_T aFileType )
 
  118    wxCHECK( aFileType != SCH_IO_MGR::SCH_FILE_T::SCH_LEGACY, 
false );
 
  120    wxFileName fn( aFileName );
 
  122    if( fn.FileExists() && !fn.IsFileWritable() )
 
  127    std::map<std::string, UTF8>     properties;
 
  131    auto it = 
m_libs.find( aLibrary );
 
  138        const auto& symbolBuffers = libBuf.
GetBuffers();
 
  140        for( 
const std::shared_ptr<SYMBOL_BUFFER>& symbolBuf : symbolBuffers )
 
  142            wxCHECK2( symbolBuf, 
continue );
 
  144            if( !libBuf.
SaveBuffer( *symbolBuf, aFileName, &*pi, 
true ) )
 
  152        wxFileName original, destination( aFileName );
 
  163        if( 
res && original == destination )
 
  175                if( symbol->IsDerived() )
 
  177                    std::shared_ptr< LIB_SYMBOL > oldParent = symbol->GetParent().lock();
 
  179                    wxCHECK_MSG( oldParent, 
false,
 
  180                                 wxString::Format( wxT( 
"Derived symbol '%s' found with undefined parent." ),
 
  181                                                   symbol->GetName() ) );
 
  183                    LIB_SYMBOL* libParent = pi->LoadSymbol( aLibrary, oldParent->
GetName(), &properties );
 
  188                        pi->SaveSymbol( aLibrary, libParent, &properties );
 
  193                    pi->SaveSymbol( aLibrary, newSymbol, &properties );
 
  195                else if( !pi->LoadSymbol( aLibrary, symbol->GetName(), &properties ) )
 
  197                    pi->SaveSymbol( aLibrary, 
new LIB_SYMBOL( *symbol ), &properties );
 
  210        pi->SaveLibrary( aFileName );
 
 
  225    auto it = 
m_libs.find( aLibrary );
 
  226    return it != 
m_libs.end() ? it->second.IsModified() : 
false;
 
 
  232    auto libIt = 
m_libs.find( aLibrary );
 
  234    if( libIt == 
m_libs.end() )
 
  238    const std::shared_ptr<SYMBOL_BUFFER> symbolBuf = buf.
GetBuffer( aSymbolName );
 
  240    return symbolBuf ? symbolBuf->IsModified() : 
false;
 
 
  246    auto libIt = 
m_libs.find( aLibrary );
 
  248    if( libIt == 
m_libs.end() )
 
  252    std::shared_ptr<SYMBOL_BUFFER> symbolBuf = buf.
GetBuffer( aSymbolName );
 
  254    wxCHECK( symbolBuf,  );
 
  256    symbolBuf->GetScreen()->SetContentModified();
 
 
  262    auto libIt = 
m_libs.find( aLibrary );
 
  264    if( libIt == 
m_libs.end() )
 
  267    for( 
auto& symbolBuf : libIt->second.GetBuffers() )
 
 
  281    auto libIt = 
m_libs.find( aLibrary );
 
  283    if( libIt == 
m_libs.end() )
 
  286    auto symbolBuf = libIt->second.GetBuffer( aSymbolName );
 
  287    wxCHECK( symbolBuf, 
false );
 
  289    symbolBuf->GetScreen()->SetContentModified( 
false );
 
 
  310    std::list<LIB_SYMBOL*> ret;
 
  311    auto libIt = 
m_libs.find( aLibrary );
 
  313    if( libIt != 
m_libs.end() )
 
  315        for( 
const std::shared_ptr<SYMBOL_BUFFER>& symbolBuf : libIt->second.GetBuffers() )
 
  316            ret.push_back( &symbolBuf->GetSymbol() );
 
  321        std::vector<LIB_SYMBOL*> symbols = adapter->
GetSymbols( aLibrary );
 
  323        std::copy( symbols.begin(), symbols.end(), std::back_inserter( ret ) );
 
 
  336    if( !bufferedSymbol ) 
 
  345            if( symbol == 
nullptr )
 
  353                std::shared_ptr<LIB_SYMBOL> parent = symbol->
GetParent().lock();
 
  354                wxCHECK_MSG( parent, 
nullptr, wxString::Format( 
"Derived symbol '%s' found with undefined parent.",
 
  358                bufferedParent = libBuf.
GetSymbol( parent->GetName() );
 
  360                if( !bufferedParent )
 
  362                    std::unique_ptr<LIB_SYMBOL> newParent = std::make_unique<LIB_SYMBOL>( *parent );
 
  363                    bufferedParent = newParent.get();
 
  364                    libBuf.
CreateBuffer( std::move( newParent ), std::make_unique<SCH_SCREEN>() );
 
  368            std::unique_ptr<LIB_SYMBOL> newSymbol = std::make_unique<LIB_SYMBOL>( *symbol );
 
  369            bufferedSymbol = newSymbol.get();
 
  372                newSymbol->SetParent( bufferedParent );
 
  374            libBuf.
CreateBuffer( std::move( newSymbol ), std::make_unique<SCH_SCREEN>() );
 
  380            msg.Printf( 
_( 
"Error loading symbol %s from library '%s'." ),
 
  384            bufferedSymbol = 
nullptr;
 
  388    return bufferedSymbol;
 
 
  394    auto it = 
m_libs.find( aLibrary );
 
  395    wxCHECK( it != 
m_libs.end(), 
nullptr );
 
  398    std::shared_ptr<SYMBOL_BUFFER> symbolBuf = buf.
GetBuffer( aSymbolName );
 
  400    return symbolBuf ? symbolBuf->GetScreen() : 
nullptr;
 
 
  407    std::shared_ptr<SYMBOL_BUFFER> symbolBuf = libBuf.
GetBuffer( aSymbol->
GetName() );
 
  411        LIB_SYMBOL& bufferedSymbol = symbolBuf->GetSymbol();
 
  415        bufferedSymbol = *aSymbol;
 
  418        symbolBuf->GetScreen()->SetContentModified();
 
  422        std::unique_ptr<LIB_SYMBOL> symbolCopy = std::make_unique<LIB_SYMBOL>( *aSymbol, 
nullptr );
 
  426        auto        newScreen = std::make_unique<SCH_SCREEN>();
 
  428        libBuf.
CreateBuffer( std::move( symbolCopy ), std::move( newScreen ) );
 
 
  437                                                      const wxString& aLibrary )
 
  440    std::shared_ptr<SYMBOL_BUFFER> symbolBuf = libBuf.
GetBuffer( aOldName );
 
  442    wxCHECK( symbolBuf && aSymbol, 
false );
 
 
  453    auto it = 
m_libs.find( aLibrary );
 
  456        return LIB_ID( aLibrary, aSymbolName );
 
  458    std::shared_ptr<SYMBOL_BUFFER> symbolBuf = it->second.GetBuffer( aSymbolName );
 
  459    wxCHECK( symbolBuf, 
LIB_ID( aLibrary, aSymbolName ) );
 
  460    LIB_SYMBOL original( symbolBuf->GetOriginal() );
 
  462    if( original.
GetName() != aSymbolName )
 
  469        symbolBuf->GetSymbol() = original;
 
 
  479    auto it = 
m_libs.find( aLibrary );
 
 
  499    for( 
const auto& lib : 
m_libs )
 
  501        if( !lib.second.IsModified() )
 
  504        for( 
const std::shared_ptr<SYMBOL_BUFFER>& buffer : lib.second.GetBuffers() )
 
  506            if( !buffer->IsModified() )
 
  509            RevertSymbol( lib.first, buffer->GetOriginal().GetName() );
 
 
  520    std::shared_ptr<SYMBOL_BUFFER> symbolBuf = libBuf.
GetBuffer( aSymbolName );
 
  521    wxCHECK( symbolBuf, 
false );
 
 
  535    auto libIt = 
m_libs.find( aLibrary );
 
  537    if( libIt != 
m_libs.end() )
 
  539        LIB_SYMBOL* symbol = libIt->second.GetSymbol( aSymbolName );
 
  551        symbol = adapter->
LoadSymbol( aLibrary, aSymbolName );
 
  557        msg.Printf( 
_( 
"Cannot load symbol '%s' from library '%s'." ),
 
 
  568                                           const wxString& aLibrary )
 const 
  570    auto        libBufIt = 
m_libs.find( aLibrary );
 
  573    if( libBufIt != 
m_libs.end() )
 
  574        return libBufIt->second.GetBuffer( aSymbolName ) != 
nullptr;
 
  580        symbol = adapter->
LoadSymbol( aLibrary, aSymbolName );
 
  587    return symbol != 
nullptr;
 
 
  593    wxArrayString existing;
 
  600    for( wxString& candidate : existing )
 
  602        if( candidate.CmpNoCase( unescapedName ) == 0 )
 
 
  612    if( aLibrary.IsEmpty() )
 
  615    if( 
m_libs.count( aLibrary ) > 0 )
 
  620    return adapter->
HasLibrary( aLibrary, aCheckEnabled );
 
 
  626    wxString 
name = 
"New_Library";
 
  633    for( 
unsigned int i = 0; i < std::numeric_limits<unsigned int>::max(); ++i )
 
  636            return name + wxString::Format( 
"%u", i );
 
  640    return wxEmptyString;
 
 
  654                                                      wxArrayString& aList )
 
 
  671    wxFileName fn( aFilePath );
 
 
  688    if( schFileType == SCH_IO_MGR::SCH_FILE_UNKNOWN )
 
  689        schFileType = SCH_IO_MGR::SCH_LEGACY;
 
  691    std::optional<LIBRARY_TABLE*> optTable =
 
  693    wxCHECK( optTable, 
false );
 
  704        wxCHECK( schFileType != SCH_IO_MGR::SCH_FILE_T::SCH_LEGACY, 
false );
 
  710            table->Rows().erase( 
table->Rows().end() - 1 );
 
 
  723    std::set<LIB_SYMBOL*> symbols;
 
  729        symbols.insert( symbol );
 
 
  737    auto it = 
m_libs.find( aLibrary );
 
  748        if( symbol->IsDerived() )
 
  750            std::shared_ptr<LIB_SYMBOL> oldParent = symbol->GetParent().lock();
 
  752            wxCHECK_MSG( oldParent, buf, wxString::Format( 
"Derived symbol '%s' found with undefined parent.",
 
  753                                                           symbol->GetName() ) );
 
  759                std::unique_ptr<LIB_SYMBOL> newParent = std::make_unique<LIB_SYMBOL>( *oldParent.get() );
 
  760                libParent = newParent.get();
 
  761                buf.
CreateBuffer( std::move( newParent ), std::make_unique<SCH_SCREEN>() );
 
  764            std::unique_ptr<LIB_SYMBOL> newSymbol = std::make_unique<LIB_SYMBOL>( *symbol );
 
  765            newSymbol->SetParent( libParent );
 
  766            buf.
CreateBuffer( std::move( newSymbol ), std::make_unique<SCH_SCREEN>() );
 
  768        else if( !buf.
GetSymbol( symbol->GetName() ) )
 
  770            buf.
CreateBuffer( std::make_unique<LIB_SYMBOL>( *symbol ), std::make_unique<SCH_SCREEN>() );
 
 
  785    catch(
const std::exception& e)
 
  787        wxLogError( 
_( 
"Error updating library buffer: %s" ), e.what() );
 
  792        wxLogError( 
_( 
"Error updating library buffer: %s" ), e.What() );
 
  797        wxLogError( 
_( 
"Error updating library buffer." ) );
 
 
  808                              std::unique_ptr<SCH_SCREEN> aScreen ) :
 
 
  830    if( 
m_original->GetLibId().GetLibNickname() != 
m_symbol->GetLibId().GetLibNickname() )
 
 
  845    if( 
m_original->GetLibId().GetLibNickname() != 
m_symbol->GetLibId().GetLibNickname() )
 
 
  872                               std::unique_ptr<SCH_SCREEN> aScreen )
 
  875    wxASSERT( aCopy->GetLib() == 
nullptr );
 
  879    LIB_ID libId = aCopy->GetLibId();
 
  881    aCopy->SetLibId( libId );
 
  883    auto symbolBuf = std::make_shared<SYMBOL_BUFFER>( std::move( aCopy ), std::move( aScreen ) );
 
  884    m_symbols.push_back( std::move( symbolBuf ) );
 
 
  896    bufferedSymbol = aCopy;
 
 
  905    const auto sameBufferPredicate = [&]( 
const std::shared_ptr<SYMBOL_BUFFER>& aBuf )
 
  907        return aBuf.get() == &aSymbolBuf;
 
  910    auto symbolBufIt = std::find_if( 
m_symbols.begin(), 
m_symbols.end(), sameBufferPredicate );
 
  911    wxCHECK( symbolBufIt != 
m_symbols.end(), 
false );
 
 
  933    wxCHECK( !aFileName.IsEmpty(), 
false );
 
  935    wxString errorMsg = 
_( 
"Error saving symbol %s to library '%s'." ) + wxS( 
"\n%s" );
 
  938    std::map<std::string, UTF8> properties;
 
  945        const wxString originalName = originalSymbol.
GetName();
 
  952                if( aPlugin->
LoadSymbol( aFileName, originalName ) )
 
  953                    aPlugin->
DeleteSymbol( aFileName, originalName, &properties );
 
  968        std::shared_ptr<LIB_SYMBOL> bufferedParent = libSymbol.
GetParent().lock();
 
  969        parentSymbol = newCachedSymbol;
 
  971        wxCHECK( bufferedParent, 
false );
 
  977            cachedParent = aPlugin->
LoadSymbol( aFileName, bufferedParent->GetName() );
 
  986            cachedParent = 
new LIB_SYMBOL( *bufferedParent.get() );
 
  987            newCachedSymbol->
SetParent( cachedParent );
 
  991                aPlugin->
SaveSymbol( aFileName, cachedParent, aBuffer ? &properties : 
nullptr );
 
 1002                aPlugin->
SaveSymbol( aFileName, newCachedSymbol, aBuffer ? &properties : 
nullptr );
 
 1011            auto        originalParent = std::make_unique<LIB_SYMBOL>( *bufferedParent.get() );
 
 1013            aSymbolBuf.
SetOriginal( std::move( originalParent ) );
 
 1015            auto newSymbol = std::make_unique<LIB_SYMBOL>( libSymbol );
 
 1016            newSymbol->SetParent( &parentRef );
 
 1021            newCachedSymbol->
SetParent( cachedParent );
 
 1025                aPlugin->
SaveSymbol( aFileName, newCachedSymbol, aBuffer ? &properties : 
nullptr );
 
 1034            auto originalBufferedParent = 
GetBuffer( bufferedParent->GetName() );
 
 1035            wxCHECK( originalBufferedParent, 
false );
 
 1037            auto newSymbol = std::make_unique<LIB_SYMBOL>( libSymbol );
 
 1038            newSymbol->SetParent( &originalBufferedParent->GetSymbol() );
 
 1048            aPlugin->
SaveSymbol( aFileName, parentSymbol, aBuffer ? &properties : 
nullptr );
 
 1056        aSymbolBuf.
SetOriginal( std::make_unique<LIB_SYMBOL>( libSymbol ) );
 
 1059    wxArrayString derivedSymbols;
 
 1065        for( 
const wxString& entry : derivedSymbols )
 
 1067            std::shared_ptr<SYMBOL_BUFFER> symbol = 
GetBuffer( entry );
 
 1069            wxCHECK2( symbol, 
continue );
 
 1072            derivedSymbol->
SetParent( parentSymbol );
 
 1077                                     aBuffer ? &properties : 
nullptr );
 
 
 1095    for( std::shared_ptr<SYMBOL_BUFFER> entry : 
m_symbols )
 
 1097        if( entry->GetSymbol().GetName() == aSymbolName )
 
 1101    return std::shared_ptr<SYMBOL_BUFFER>( 
nullptr );
 
 
 1107    for( 
const std::shared_ptr<SYMBOL_BUFFER>& entry : 
m_symbols )
 
 1109        if( std::shared_ptr<LIB_SYMBOL> parent = entry->GetSymbol().GetParent().lock() )
 
 1111            if( parent->GetName() == aParentName )
 
 
 1122    for( std::shared_ptr<SYMBOL_BUFFER>& entry : 
m_symbols )
 
 1124        const LIB_SYMBOL& symbol = entry->GetSymbol();
 
 
 1137    wxCHECK( !aSymbolName.IsEmpty(), 0 );
 
 1140    std::unordered_map<std::shared_ptr<LIB_SYMBOL>, std::vector<std::shared_ptr<LIB_SYMBOL>>> derivedMap;
 
 1145    for( std::shared_ptr<SYMBOL_BUFFER>& entry : 
m_symbols )
 
 1147        std::shared_ptr<LIB_SYMBOL> symbol = entry->GetSymbol().SharedPtr();
 
 1149        if( std::shared_ptr<LIB_SYMBOL> parent = symbol->GetParent().lock() )
 
 1150            derivedMap[parent].emplace_back( std::move( symbol ) );
 
 1156                aList.Add( aSymbol.GetName() );
 
 1160    const std::function<void( std::shared_ptr<LIB_SYMBOL>& )> getDerived =
 
 1161            [&]( std::shared_ptr<LIB_SYMBOL>& aSymbol )
 
 1163                auto it = derivedMap.find( aSymbol );
 
 1165                if( it != derivedMap.end() )
 
 1167                    for( std::shared_ptr<LIB_SYMBOL>& derivedSymbol : it->second )
 
 1169                        visit( *derivedSymbol );
 
 1172                        getDerived( derivedSymbol );
 
 1179    getDerived( symbol );
 
 1181    return aList.GetCount();
 
 
 1188    wxArrayString                                        derivedSymbolNames;
 
 1189    std::deque<std::shared_ptr<SYMBOL_BUFFER>>::iterator it;
 
 1193        for( 
const wxString& symbolName : derivedSymbolNames )
 
 1196                               [symbolName]( std::shared_ptr<SYMBOL_BUFFER>& buf )
 
 1198                                   return buf->GetSymbol().GetName() == symbolName;
 
 1201            wxCHECK2( it != 
m_symbols.end(), 
continue );
 
 
void SetContentModified(bool aModified=true)
 
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
 
virtual const wxString What() const
A composite of Problem() and Where()
 
bool IsLibraryLoaded(const wxString &aNickname)
 
bool HasLibrary(const wxString &aNickname, bool aCheckEnabled=false) const
Test for the existence of aNickname in the library tables.
 
std::vector< wxString > GetLibraryNames() const
Returns a list of library nicknames that are available (skips any that failed to load)
 
std::optional< LIBRARY_TABLE * > Table(LIBRARY_TABLE_TYPE aType, LIBRARY_TABLE_SCOPE aScope)
Retrieves a given table; creating a new empty project table if a valid project is loaded and the give...
 
std::optional< wxString > GetFullURI(LIBRARY_TABLE_TYPE aType, const wxString &aNickname, bool aSubstituted=false) const
Return the full location specifying URI for the LIB, either in original UI form or in environment var...
 
std::vector< LIBRARY_TABLE_ROW * > Rows(LIBRARY_TABLE_TYPE aType, LIBRARY_TABLE_SCOPE aScope=LIBRARY_TABLE_SCOPE::BOTH, bool aIncludeInvalid=false) const
Returns a flattened list of libraries of the given type.
 
void SetNickname(const wxString &aNickname)
 
void SetType(const wxString &aType)
 
void SetURI(const wxString &aUri)
 
Store a working copy of a library.
 
size_t GetDerivedSymbolNames(const wxString &aSymbolName, wxArrayString &aList)
Fetch all of the symbols derived from a aSymbolName into aList.
 
bool CreateBuffer(std::unique_ptr< LIB_SYMBOL > aCopy, std::unique_ptr< SCH_SCREEN > aScreen)
Create a new buffer to store a symbol. LIB_BUFFER takes ownership of aCopy.
 
bool DeleteBuffer(const SYMBOL_BUFFER &aSymbolBuf)
Delete the given symbol buffer from the library buffer.
 
void ClearDeletedBuffer()
 
void GetSymbolNames(wxArrayString &aSymbolNames, SYMBOL_NAME_FILTER aFilter=SYMBOL_NAME_FILTER::ALL)
Fetch a list of root symbols names from the library buffer.
 
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.
 
bool SaveBuffer(SYMBOL_BUFFER &aSymbolBuf, const wxString &aFileName, SCH_IO *aPlugin, bool aBuffer)
Save stored modifications using a plugin.
 
const std::deque< std::shared_ptr< SYMBOL_BUFFER > > & GetBuffers() const
Return all buffered symbols.
 
std::shared_ptr< SYMBOL_BUFFER > GetBuffer(const wxString &aAlias) const
Return a symbol buffer with LIB_SYMBOL holding a symbolic alias.
 
LIB_SYMBOL * GetSymbol(const wxString &aAlias) const
Return the working copy of a LIB_SYMBOL root object with specified alias.
 
int removeChildSymbols(const 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.
 
bool UpdateBuffer(SYMBOL_BUFFER &aSymbolBuf, const LIB_SYMBOL &aCopy)
Update the buffered symbol with the contents of aCopy.
 
const wxString m_libName
Buffered library name.
 
A logical library item identifier and consists of various portions much like a URI.
 
int SetLibNickname(const UTF8 &aLibNickname)
Override the logical library name portion of the LIB_ID to aLibNickname.
 
const UTF8 & GetLibItemName() const
 
Define a library symbol object.
 
const LIB_ID & GetLibId() const override
 
std::weak_ptr< LIB_SYMBOL > & GetParent()
 
bool IsRoot() const override
For symbols derived from other symbols, IsRoot() indicates no derivation.
 
void SetParent(LIB_SYMBOL *aParent=nullptr)
 
wxString GetName() const override
 
std::shared_ptr< LIB_SYMBOL > SharedPtr() const
http://www.boost.org/doc/libs/1_55_0/libs/smart_ptr/sp_techniques.html#weak_without_shared.
 
void SetLibId(const LIB_ID &aLibId)
 
virtual LIBRARY_MANAGER & GetLibraryManager() const
 
static SYMBOL_LIBRARY_ADAPTER * SymbolLibAdapter(PROJECT *aProject)
Accessor for project symbol library manager adapter.
 
A shim class between EDA_DRAW_FRAME and several derived classes: SYMBOL_EDIT_FRAME,...
 
static const char * PropBuffering
The property used internally by the plugin to enable cache buffering which prevents the library file ...
 
static const wxString ShowType(SCH_FILE_T aFileType)
Return a brief name for a plugin, given aFileType enum.
 
static SCH_FILE_T GuessPluginTypeFromLibPath(const wxString &aLibPath, int aCtl=0)
Return a plugin type given a symbol library using the file extension of aLibPath.
 
Base class that schematic file and library loading and saving plugins should derive from.
 
virtual void SaveSymbol(const wxString &aLibraryPath, const LIB_SYMBOL *aSymbol, const std::map< std::string, UTF8 > *aProperties=nullptr)
Write aSymbol to an existing library located at aLibraryPath.
 
virtual void DeleteSymbol(const wxString &aLibraryPath, const wxString &aSymbolName, const std::map< std::string, UTF8 > *aProperties=nullptr)
Delete the entire LIB_SYMBOL associated with aAliasName from the library aLibraryPath.
 
virtual LIB_SYMBOL * LoadSymbol(const wxString &aLibraryPath, const wxString &aPartName, const std::map< std::string, UTF8 > *aProperties=nullptr)
Load a LIB_SYMBOL object having aPartName from the aLibraryPath containing a library format that this...
 
std::unique_ptr< LIB_SYMBOL > m_symbol
 
std::unique_ptr< SCH_SCREEN > m_screen
 
void SetSymbol(std::unique_ptr< LIB_SYMBOL > aSymbol)
 
LIB_SYMBOL & GetSymbol() const
 
SYMBOL_BUFFER(std::unique_ptr< LIB_SYMBOL > aSymbol=nullptr, std::unique_ptr< SCH_SCREEN > aScreen=nullptr)
 
std::unique_ptr< LIB_SYMBOL > m_original
 
LIB_SYMBOL & GetOriginal() const
 
void SetOriginal(std::unique_ptr< LIB_SYMBOL > aSymbol)
 
An interface to the global shared library manager that is schematic-specific and linked to one projec...
 
LIB_SYMBOL * LoadSymbol(const wxString &aNickname, const wxString &aName)
Load a LIB_SYMBOL having aName from the library given by aNickname.
 
bool CreateLibrary(const wxString &aNickname)
Creates the library (i.e. saves to disk) for the given row if it exists.
 
int GetModifyHash() const
 
std::vector< LIB_SYMBOL * > GetSymbols(const wxString &aNickname, SYMBOL_TYPE aType=SYMBOL_TYPE::ALL_SYMBOLS)
 
bool IsSymbolLibWritable(const wxString &aNickname)
Return true if the library given by aNickname is writable.
 
bool IsLibraryReadOnly(const wxString &aLibrary) const
Return true if the library is stored in a read-only file.
 
bool LibraryExists(const wxString &aLibrary, bool aCheckEnabled=false) const
Return true if library exists.
 
size_t GetLibraryCount() const
 
bool ClearLibraryModified(const wxString &aLibrary) const
Clear the modified flag for all symbols in a library.
 
LIB_SYMBOL * GetBufferedSymbol(const wxString &aSymbolName, const wxString &aLibrary)
Return the symbol copy from the buffer.
 
bool ClearSymbolModified(const wxString &aSymbolName, const wxString &aLibrary) const
Clear the modified flag for a symbol.
 
bool addLibrary(const wxString &aFilePath, bool aCreate, LIBRARY_TABLE_SCOPE aScope)
Helper function to add either existing or create new library.
 
SCH_SCREEN * GetScreen(const wxString &aSymbolName, const wxString &aLibrary)
Return the screen used to edit a specific symbol.
 
bool SymbolNameInUse(const wxString &aName, const wxString &aLibrary)
Return true if the symbol name is already in use in the specified library.
 
bool IsLibraryModified(const wxString &aLibrary) const
Return true if library has unsaved modifications.
 
LIB_SYMBOL * GetSymbol(const wxString &aSymbolName, 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...
 
bool RemoveSymbol(const wxString &aSymbolName, const wxString &aLibrary)
Remove the symbol from the symbol buffer.
 
wxArrayString GetLibraryNames() const
Return the array of library names.
 
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 HasModifications() const
 
static wxString getLibraryName(const wxString &aFilePath)
Extract library name basing on the file name.
 
bool UpdateSymbolAfterRename(LIB_SYMBOL *aSymbol, const wxString &aOldSymbolName, const wxString &aLibrary)
Update the symbol buffer with a new version of the symbol when the name has changed.
 
bool IsSymbolModified(const wxString &aSymbolName, const wxString &aLibrary) const
Return true if symbol has unsaved modifications.
 
virtual void OnDataChanged() const
 
bool IsLibraryLoaded(const wxString &aLibrary) const
Return true if the library was successfully loaded.
 
void SetSymbolModified(const wxString &aSymbolName, const wxString &aLibrary)
 
virtual ~SYMBOL_LIBRARY_MANAGER()
 
bool RevertLibrary(const wxString &aLibrary)
Revert unsaved changes for a symbol library.
 
LIB_ID RevertSymbol(const wxString &aSymbolName, const wxString &aLibrary)
Revert unsaved changes for a symbol.
 
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.
 
size_t GetDerivedSymbolNames(const wxString &aSymbolName, const wxString &aLibraryName, wxArrayString &aList)
Fetch all of the symbols derived from a aSymbolName into aList.
 
bool RevertAll()
Revert all pending changes.
 
SYMBOL_LIBRARY_MANAGER(SCH_BASE_FRAME &aFrame)
 
bool SymbolExists(const wxString &aSymbolName, const wxString &aLibrary) const
Return true if symbol with a specific alias exists in library (either original one or buffered).
 
SCH_BASE_FRAME & m_frame
Parent frame.
 
std::list< LIB_SYMBOL * > EnumerateSymbols(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.
 
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.
 
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
 
This file is part of the common library.
 
wxString NormalizePath(const wxFileName &aFilePath, const ENV_VAR_MAP *aEnvVars, const wxString &aProjectPath)
Normalize a file path to an environmental variable, if possible.
 
Helper functions to substitute paths with environmental variables.
 
std::unique_ptr< T > IO_RELEASER
Helper to hold and release an IO_BASE object when exceptions are thrown.
 
#define THROW_IO_ERROR(msg)
macro which captures the "call site" values of FILE_, __FUNCTION & LINE
 
#define KICTL_CREATE
caller thinks requested project files may not exist.
 
PGM_BASE & Pgm()
The global program "get" accessor.
 
wxString UnescapeString(const wxString &aSource)
 
#define FN_NORMALIZE_FLAGS
Default flags to pass to wxFileName::Normalize().