KiCad PCB EDA Suite
LIB_MANAGER Class Reference

Class to handle modifications to the symbol libraries. More...

#include <lib_manager.h>

Classes

class  LIB_BUFFER
 

Class to store a working copy of a library

More...
 
class  PART_BUFFER
 

Class to store a working copy of a LIB_PART object and editor context.

More...
 

Public Member Functions

 LIB_MANAGER (LIB_EDIT_FRAME &aFrame)
 
void Sync (bool aForce=false, std::function< void(int, int, const wxString &)> aProgressCallback=[](int, int, const wxString &){})
 Updates the LIB_MANAGER data to synchronize with Symbol Library Table. More...
 
int GetHash () const
 
bool HasModifications () const
 
int GetLibraryHash (const wxString &aLibrary) const
 Returns a library hash value to determine if it has changed. More...
 
wxArrayString GetLibraryNames () const
 Returns the array of library names. More...
 
SYMBOL_LIB_TABLE_ROWGetLibrary (const wxString &aLibrary) const
 Finds a single library within the (aggregate) library table. More...
 
std::list< LIB_PART * > GetAliases (const wxString &aLibrary) const
 
bool CreateLibrary (const wxString &aFilePath, SYMBOL_LIB_TABLE *aTable)
 Creates an empty library and adds it to the library table. More...
 
bool AddLibrary (const wxString &aFilePath, SYMBOL_LIB_TABLE *aTable)
 Adds an existing library. More...
 
bool UpdatePart (LIB_PART *aPart, const wxString &aLibrary)
 Updates the part buffer with a new version of the part. More...
 
bool UpdatePartAfterRename (LIB_PART *aPart, const wxString &oldAlias, const wxString &aLibrary)
 Updates the part buffer with a new version of the part when the name has changed. More...
 
bool RemovePart (const wxString &aName, const wxString &aLibrary)
 Removes the part from the part buffer. More...
 
LIB_PARTGetAlias (const wxString &aAlias, const wxString &aLibrary) const
 Returns either an alias of a working LIB_PART copy, or alias of the original part if there is no working copy. More...
 
LIB_PARTGetBufferedPart (const wxString &aAlias, const wxString &aLibrary)
 Returns the part copy from the buffer. More...
 
SCH_SCREENGetScreen (const wxString &aAlias, const wxString &aLibrary)
 Returns the screen used to edit a specific part. More...
 
bool PartExists (const wxString &aAlias, const wxString &aLibrary) const
 Returns true if part with a specific alias exists in library (either original one or buffered). More...
 
bool LibraryExists (const wxString &aLibrary, bool aCheckEnabled=false) const
 Returns true if library exists. More...
 
bool IsLibraryModified (const wxString &aLibrary) const
 Returns true if library has unsaved modifications. More...
 
bool IsPartModified (const wxString &aAlias, const wxString &aLibrary) const
 Returns true if part has unsaved modifications. More...
 
bool ClearLibraryModified (const wxString &aLibrary) const
 Clears the modified flag for all parts in a library. More...
 
bool ClearPartModified (const wxString &aAlias, const wxString &aLibrary) const
 Clears the modified flag for a part. More...
 
bool IsLibraryReadOnly (const wxString &aLibrary) const
 Returns true if the library is stored in a read-only file. More...
 
bool FlushPart (const wxString &aAlias, const wxString &aLibrary)
 Saves part changes to the library copy used by the schematic editor. More...
 
bool SaveLibrary (const wxString &aLibrary, const wxString &aFileName)
 Saves library to a file, including unsaved changes. More...
 
LIB_ID RevertPart (const wxString &aAlias, const wxString &aLibrary)
 Reverts unsaved changes for a particular part. More...
 
bool RevertLibrary (const wxString &aLibrary)
 Reverts unsaved changes for a particular library. More...
 
bool RevertAll ()
 Revert all pending changes. More...
 
wxString GetUniqueLibraryName () const
 Returns a library name that is not currently in use. More...
 
LIB_TREE_MODEL_ADAPTER::PTRGetAdapter ()
 Returns the adapter object that provides the stored data. More...
 
const wxString & GetCurrentLib () const
 Returns the currently modified library name. More...
 
void SetCurrentLib (const wxString &aLibrary)
 
const wxString & GetCurrentPart () const
 Returns the currently modified part name. More...
 
void SetCurrentPart (const wxString &aPart)
 
LIB_ID GetCurrentLibId () const
 Returns the current library and part name as LIB_ID. More...
 
void GetRootSymbolNames (const wxString &aLibName, wxArrayString &aRootSymbolNames)
 
bool HasDerivedSymbols (const wxString &aSymbolName, const wxString &aLibraryName)
 Check if symbol aSymbolName in library aLibraryName is a root symbol that has derived symbols. More...
 

Private Member Functions

bool addLibrary (const wxString &aFilePath, bool aCreate, SYMBOL_LIB_TABLE *aTable)
 

Helper function to add either existing or create new library

More...
 
SYMBOL_LIB_TABLEsymTable () const
 

Returns the current Symbol Library Table

More...
 
std::set< LIB_PART * > getOriginalParts (const wxString &aLibrary)
 

Returns a set of LIB_PART objects belonging to the original library

More...
 
LIB_BUFFERgetLibraryBuffer (const wxString &aLibrary)
 

Returns an existing library buffer or creates one to using Symbol Library Table to get the original data.

More...
 
SYMBOL_TREE_SYNCHRONIZING_ADAPTERgetAdapter ()
 

Static Private Member Functions

static wxString getLibraryName (const wxString &aFilePath)
 

Extracts library name basing on the file name

More...
 

Private Attributes

std::map< wxString, LIB_BUFFERm_libs
 

The library buffers

More...
 
LIB_EDIT_FRAMEm_frame
 
LIB_LOGGER m_logger
 
int m_syncHash
 
wxString m_currentLib
 
wxString m_currentPart
 
SYMBOL_TREE_SYNCHRONIZING_ADAPTER::PTR m_adapter
 

Detailed Description

Class to handle modifications to the symbol libraries.

Definition at line 98 of file lib_manager.h.

Constructor & Destructor Documentation

◆ LIB_MANAGER()

LIB_MANAGER::LIB_MANAGER ( LIB_EDIT_FRAME aFrame)

Definition at line 39 of file lib_manager.cpp.

39  :
40  m_frame( aFrame ),
41  m_syncHash( 0 )
42 {
44  m_adapter->ShowUnits( false );
45 }
static PTR Create(LIB_EDIT_FRAME *aParent, LIB_MANAGER *aLibs)
LIB_EDIT_FRAME & m_frame
Definition: lib_manager.h:460
SYMBOL_TREE_SYNCHRONIZING_ADAPTER::PTR m_adapter
Definition: lib_manager.h:467

References SYMBOL_TREE_SYNCHRONIZING_ADAPTER::Create(), m_adapter, and m_frame.

Member Function Documentation

◆ AddLibrary()

bool LIB_MANAGER::AddLibrary ( const wxString &  aFilePath,
SYMBOL_LIB_TABLE aTable 
)
inline

Adds an existing library.

The library is added to the library table as well.

Definition at line 145 of file lib_manager.h.

146  {
147  return addLibrary( aFilePath, false, aTable );
148  }
bool addLibrary(const wxString &aFilePath, bool aCreate, SYMBOL_LIB_TABLE *aTable)
Helper function to add either existing or create new library

References addLibrary().

Referenced by LIB_EDIT_FRAME::AddLibraryFile(), and LIB_EDIT_FRAME::ExportPart().

◆ addLibrary()

bool LIB_MANAGER::addLibrary ( const wxString &  aFilePath,
bool  aCreate,
SYMBOL_LIB_TABLE aTable 
)
private

Helper function to add either existing or create new library

Definition at line 630 of file lib_manager.cpp.

631 {
632  wxCHECK( aTable, false );
633  wxString libName = getLibraryName( aFilePath );
634  wxCHECK( !LibraryExists( libName ), false ); // either create or add an existing one
635 
636  // try to use path normalized to an environmental variable or project path
637  wxString relPath = NormalizePath( aFilePath, &Pgm().GetLocalEnvVariables(), &m_frame.Prj() );
638 
639  if( relPath.IsEmpty() )
640  relPath = aFilePath;
641 
642  wxString typeName = SCH_IO_MGR::ShowType( SCH_IO_MGR::SCH_LEGACY );
643  SYMBOL_LIB_TABLE_ROW* libRow = new SYMBOL_LIB_TABLE_ROW( libName, relPath, typeName );
644  aTable->InsertRow( libRow );
645 
646  if( aCreate )
647  {
648  try
649  {
650  aTable->CreateSymbolLib( libName );
651  }
652  catch( const IO_ERROR& e )
653  {
654  aTable->RemoveRow( libRow );
655  return false;
656  }
657  }
658 
659  m_frame.SyncLibraries( false );
660 
661  return true;
662 }
Hold a record identifying a symbol library accessed by the appropriate symbol library SCH_PLUGIN obje...
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:98
void CreateSymbolLib(const wxString &aNickname)
bool InsertRow(LIB_TABLE_ROW *aRow, bool doReplace=false)
Adds aRow if it does not already exist or if doReplace is true.
static const wxString ShowType(SCH_FILE_T aFileType)
Return a brief name for a plugin, given aFileType enum.
Definition: sch_io_mgr.cpp:76
PROJECT & Prj() const
Function Prj returns a reference to the PROJECT "associated with" this KIWAY.
LIB_EDIT_FRAME & m_frame
Definition: lib_manager.h:460
bool RemoveRow(LIB_TABLE_ROW *aRow)
Removes a row from the table.
void SyncLibraries(bool aShowProgress)
Synchronize the library manager to the symbol library table, and then the symbol tree to the library ...
bool LibraryExists(const wxString &aLibrary, bool aCheckEnabled=false) const
Returns true if library exists.
static wxString getLibraryName(const wxString &aFilePath)
Extracts library name basing on the file name
Struct IO_ERROR is a class used to hold an error message and may be used when throwing exceptions con...
Definition: ki_exception.h:76
wxString NormalizePath(const wxFileName &aFilePath, const ENV_VAR_MAP *aEnvVars, const wxString &aProjectPath)
Normalizes a file path to an environmental variable, if possible.
Definition: env_paths.cpp:67

References SYMBOL_LIB_TABLE::CreateSymbolLib(), getLibraryName(), LIB_TABLE::InsertRow(), LibraryExists(), m_frame, NormalizePath(), Pgm(), KIWAY_HOLDER::Prj(), LIB_TABLE::RemoveRow(), SCH_IO_MGR::ShowType(), and LIB_EDIT_FRAME::SyncLibraries().

Referenced by AddLibrary(), and CreateLibrary().

◆ ClearLibraryModified()

bool LIB_MANAGER::ClearLibraryModified ( const wxString &  aLibrary) const

Clears the modified flag for all parts in a library.

Definition at line 235 of file lib_manager.cpp.

236 {
237  auto libIt = m_libs.find( aLibrary );
238 
239  if( libIt == m_libs.end() )
240  return false;
241 
242  for( auto& partBuf : libIt->second.GetBuffers() )
243  {
244  SCH_SCREEN* screen = partBuf->GetScreen();
245 
246  if( screen )
247  screen->ClrModify();
248  }
249 
250  return true;
251 }
void ClrModify()
Definition: base_screen.h:225
std::map< wxString, LIB_BUFFER > m_libs
The library buffers
Definition: lib_manager.h:458

References BASE_SCREEN::ClrModify(), and m_libs.

Referenced by LIB_EDIT_FRAME::saveLibrary().

◆ ClearPartModified()

bool LIB_MANAGER::ClearPartModified ( const wxString &  aAlias,
const wxString &  aLibrary 
) const

Clears the modified flag for a part.

Definition at line 254 of file lib_manager.cpp.

255 {
256  auto libI = m_libs.find( aLibrary );
257 
258  if( libI == m_libs.end() )
259  return false;
260 
261  auto partBuf = libI->second.GetBuffer( aAlias );
262  wxCHECK( partBuf, false );
263 
264  partBuf->GetScreen()->ClrModify();
265  return true;
266 }
std::map< wxString, LIB_BUFFER > m_libs
The library buffers
Definition: lib_manager.h:458

References m_libs.

Referenced by LIB_EDIT_FRAME::Revert(), LIB_EDIT_FRAME::Save(), and LIB_EDIT_FRAME::saveCurrentPart().

◆ CreateLibrary()

bool LIB_MANAGER::CreateLibrary ( const wxString &  aFilePath,
SYMBOL_LIB_TABLE aTable 
)
inline

Creates an empty library and adds it to the library table.

The library file is created.

Definition at line 137 of file lib_manager.h.

138  {
139  return addLibrary( aFilePath, true, aTable );
140  }
bool addLibrary(const wxString &aFilePath, bool aCreate, SYMBOL_LIB_TABLE *aTable)
Helper function to add either existing or create new library

References addLibrary().

Referenced by LIB_EDIT_FRAME::AddLibraryFile().

◆ FlushPart()

bool LIB_MANAGER::FlushPart ( const wxString &  aAlias,
const wxString &  aLibrary 
)

Saves part changes to the library copy used by the schematic editor.

Not it is not necessarily saved to the file.

Returns
True on success, false otherwise.

Definition at line 428 of file lib_manager.cpp.

429 {
430  auto it = m_libs.find( aLibrary );
431 
432  if( it == m_libs.end() ) // no items to flush
433  return true;
434 
435  auto partBuf = it->second.GetBuffer( aAlias );
436  wxCHECK( partBuf, false );
437 
438  return it->second.SaveBuffer( partBuf, symTable() );
439 }
SYMBOL_LIB_TABLE * symTable() const
Returns the current Symbol Library Table
std::map< wxString, LIB_BUFFER > m_libs
The library buffers
Definition: lib_manager.h:458

References m_libs, and symTable().

Referenced by LIB_EDIT_FRAME::Save(), and LIB_EDIT_FRAME::saveCurrentPart().

◆ GetAdapter()

LIB_TREE_MODEL_ADAPTER::PTR& LIB_MANAGER::GetAdapter ( )
inline

Returns the adapter object that provides the stored data.

Definition at line 269 of file lib_manager.h.

269 { return m_adapter; }
SYMBOL_TREE_SYNCHRONIZING_ADAPTER::PTR m_adapter
Definition: lib_manager.h:467

References m_adapter.

Referenced by LIB_EDIT_FRAME::FreezeSearchTree(), SYMBOL_TREE_PANE::SYMBOL_TREE_PANE(), LIB_EDIT_FRAME::SyncLibraries(), and LIB_EDIT_FRAME::ThawSearchTree().

◆ getAdapter()

SYMBOL_TREE_SYNCHRONIZING_ADAPTER* LIB_MANAGER::getAdapter ( )
inlineprivate

Definition at line 468 of file lib_manager.h.

469  {
470  return static_cast<SYMBOL_TREE_SYNCHRONIZING_ADAPTER*>( m_adapter.get() );
471  }
SYMBOL_TREE_SYNCHRONIZING_ADAPTER::PTR m_adapter
Definition: lib_manager.h:467

References m_adapter.

Referenced by Sync().

◆ GetAlias()

LIB_PART * LIB_MANAGER::GetAlias ( const wxString &  aAlias,
const wxString &  aLibrary 
) const

Returns either an alias of a working LIB_PART copy, or alias of the original part if there is no working copy.

Definition at line 522 of file lib_manager.cpp.

523 {
524  // Try the library buffers first
525  auto libIt = m_libs.find( aLibrary );
526 
527  if( libIt != m_libs.end() )
528  {
529  LIB_PART* part = libIt->second.GetPart( aAlias );
530 
531  if( part )
532  return part;
533  }
534 
535  // Get the original part
536  LIB_PART* alias = nullptr;
537 
538  try
539  {
540  alias = symTable()->LoadSymbol( aLibrary, aAlias );
541  }
542  catch( const IO_ERROR& e )
543  {
544  wxLogMessage( _( "Cannot load symbol \"%s\" from library \"%s\" (%s)" ),
545  aAlias, aLibrary, e.What() );
546  }
547 
548  return alias;
549 }
LIB_PART * LoadSymbol(const wxString &aNickname, const wxString &aName)
Load a LIB_PART having aName from the library given by aNickname.
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:33
Define a library symbol object.
#define _(s)
Definition: 3d_actions.cpp:31
SYMBOL_LIB_TABLE * symTable() const
Returns the current Symbol Library Table
std::map< wxString, LIB_BUFFER > m_libs
The library buffers
Definition: lib_manager.h:458
Struct IO_ERROR is a class used to hold an error message and may be used when throwing exceptions con...
Definition: ki_exception.h:76

References _, SYMBOL_LIB_TABLE::LoadSymbol(), m_libs, symTable(), and IO_ERROR::What().

Referenced by LIB_EDIT_FRAME::CreateNewPart(), and LIB_EDIT_FRAME::getTargetPart().

◆ GetAliases()

std::list< LIB_PART * > LIB_MANAGER::GetAliases ( const wxString &  aLibrary) const

Definition at line 277 of file lib_manager.cpp.

278 {
279  std::list<LIB_PART*> ret;
280  wxCHECK( LibraryExists( aLibrary ), ret );
281 
282  auto libIt = m_libs.find( aLibrary );
283 
284  if( libIt != m_libs.end() )
285  {
286  for( auto& partBuf : libIt->second.GetBuffers() )
287  {
288  ret.push_back( partBuf->GetPart() );
289  }
290  }
291  else
292  {
293  std::vector<LIB_PART*> aliases;
294 
295  try
296  {
297  symTable()->LoadSymbolLib( aliases, aLibrary );
298  }
299  catch( const IO_ERROR& e )
300  {
301  wxLogWarning( e.Problem() );
302  }
303 
304  std::copy( aliases.begin(), aliases.end(), std::back_inserter( ret ) );
305  }
306 
307  return ret;
308 }
virtual const wxString Problem() const
what was the problem?
Definition: exceptions.cpp:49
void LoadSymbolLib(std::vector< LIB_PART * > &aAliasList, const wxString &aNickname, bool aPowerSymbolsOnly=false)
bool LibraryExists(const wxString &aLibrary, bool aCheckEnabled=false) const
Returns true if library exists.
SYMBOL_LIB_TABLE * symTable() const
Returns the current Symbol Library Table
std::map< wxString, LIB_BUFFER > m_libs
The library buffers
Definition: lib_manager.h:458
Struct IO_ERROR is a class used to hold an error message and may be used when throwing exceptions con...
Definition: ki_exception.h:76

References LibraryExists(), SYMBOL_LIB_TABLE::LoadSymbolLib(), m_libs, IO_ERROR::Problem(), and symTable().

Referenced by SYMBOL_TREE_SYNCHRONIZING_ADAPTER::updateLibrary().

◆ GetBufferedPart()

LIB_PART * LIB_MANAGER::GetBufferedPart ( const wxString &  aAlias,
const wxString &  aLibrary 
)

Returns the part copy from the buffer.

In case it does not exist yet, the copy is created. LIB_MANAGER retains the ownership.

Definition at line 311 of file lib_manager.cpp.

312 {
313  wxCHECK( LibraryExists( aLibrary ), nullptr );
314 
315  // try the library buffers first
316  LIB_BUFFER& libBuf = getLibraryBuffer( aLibrary );
317  LIB_PART* bufferedPart = libBuf.GetPart( aAlias );
318 
319  if( !bufferedPart ) // no buffer part found
320  {
321  // create a copy of the part
322  try
323  {
324  LIB_PART* part = symTable()->LoadSymbol( aLibrary, aAlias );
325 
326  if( part == nullptr )
327  THROW_IO_ERROR( _( "Symbol not found." ) );
328 
329  LIB_PART* bufferedParent = nullptr;
330 
331  // Create parent symbols on demand so parent symbol can be set.
332  if( part->IsAlias() )
333  {
334  std::shared_ptr< LIB_PART > parent = part->GetParent().lock();
335  wxCHECK_MSG( parent, nullptr,
336  wxString::Format( "Derived symbol '%s' found with undefined parent.",
337  part->GetName() ) );
338 
339  // Check if the parent symbol buffer has already be created.
340  bufferedParent = libBuf.GetPart( parent->GetName() );
341 
342  if( !bufferedParent )
343  {
344  bufferedParent = new LIB_PART( *parent.get() );
345  libBuf.CreateBuffer( bufferedParent, new SCH_SCREEN( &m_frame.Kiway() ) );
346  }
347  }
348 
349  bufferedPart = new LIB_PART( *part );
350 
351  if( bufferedParent )
352  bufferedPart->SetParent( bufferedParent );
353 
354  libBuf.CreateBuffer( bufferedPart, new SCH_SCREEN( &m_frame.Kiway() ) );
355  }
356  catch( const IO_ERROR& e )
357  {
358  wxLogMessage( _( "Error loading symbol \"%s\" from library \"%s\". (%s)" ),
359  aAlias, aLibrary, e.What() );
360  bufferedPart = nullptr;
361  }
362  }
363 
364  return bufferedPart;
365 }
KIWAY & Kiway() const
Function Kiway returns a reference to the KIWAY that this object has an opportunity to participate in...
Definition: kiway_holder.h:56
wxString GetName() const override
LIB_PART * LoadSymbol(const wxString &aNickname, const wxString &aName)
Load a LIB_PART having aName from the library given by aNickname.
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:33
LIB_EDIT_FRAME & m_frame
Definition: lib_manager.h:460
void SetParent(LIB_PART *aParent=nullptr)
PART_REF & GetParent()
Define a library symbol object.
#define THROW_IO_ERROR(msg)
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
LIB_BUFFER & getLibraryBuffer(const wxString &aLibrary)
Returns an existing library buffer or creates one to using Symbol Library Table to get the original d...
#define _(s)
Definition: 3d_actions.cpp:31
bool LibraryExists(const wxString &aLibrary, bool aCheckEnabled=false) const
Returns true if library exists.
SYMBOL_LIB_TABLE * symTable() const
Returns the current Symbol Library Table
bool IsAlias() const
Struct IO_ERROR is a class used to hold an error message and may be used when throwing exceptions con...
Definition: ki_exception.h:76

References _, LIB_MANAGER::LIB_BUFFER::CreateBuffer(), Format(), getLibraryBuffer(), LIB_PART::GetName(), LIB_PART::GetParent(), LIB_MANAGER::LIB_BUFFER::GetPart(), LIB_PART::IsAlias(), KIWAY_HOLDER::Kiway(), LIB_PART::LIB_PART(), LibraryExists(), SYMBOL_LIB_TABLE::LoadSymbol(), m_frame, LIB_PART::SetParent(), symTable(), THROW_IO_ERROR, and IO_ERROR::What().

Referenced by LIB_EDIT_FRAME::CopyPartToClipboard(), LIB_EDIT_FRAME::DuplicatePart(), LIB_EDIT_FRAME::isCurrentPart(), LIB_EDIT_FRAME::LoadOneLibraryPartAux(), LIB_EDIT_FRAME::LoadPart(), and LIB_EDIT_FRAME::savePartAs().

◆ GetCurrentLib()

const wxString& LIB_MANAGER::GetCurrentLib ( ) const
inline

Returns the currently modified library name.

Definition at line 274 of file lib_manager.h.

274 { return m_currentLib; }
wxString m_currentLib
Definition: lib_manager.h:464

References m_currentLib.

Referenced by SYMBOL_TREE_SYNCHRONIZING_ADAPTER::GetAttr().

◆ GetCurrentLibId()

LIB_ID LIB_MANAGER::GetCurrentLibId ( ) const
inline

Returns the current library and part name as LIB_ID.

Definition at line 286 of file lib_manager.h.

287  {
288  return LIB_ID( m_currentLib, m_currentPart );
289  }
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:51
wxString m_currentLib
Definition: lib_manager.h:464
wxString m_currentPart
Definition: lib_manager.h:465

References m_currentLib, and m_currentPart.

Referenced by SYMBOL_TREE_SYNCHRONIZING_ADAPTER::GetAttr().

◆ GetCurrentPart()

const wxString& LIB_MANAGER::GetCurrentPart ( ) const
inline

Returns the currently modified part name.

Definition at line 280 of file lib_manager.h.

280 { return m_currentPart; }
wxString m_currentPart
Definition: lib_manager.h:465

References m_currentPart.

◆ GetHash()

int LIB_MANAGER::GetHash ( ) const

Definition at line 77 of file lib_manager.cpp.

78 {
79  int hash = symTable()->GetModifyHash();
80 
81  for( const auto& lib : m_libs )
82  hash += lib.second.GetHash();
83 
84  return hash;
85 }
SYMBOL_LIB_TABLE * symTable() const
Returns the current Symbol Library Table
std::map< wxString, LIB_BUFFER > m_libs
The library buffers
Definition: lib_manager.h:458

References SYMBOL_LIB_TABLE::GetModifyHash(), m_libs, and symTable().

Referenced by RevertAll(), and SYMBOL_TREE_SYNCHRONIZING_ADAPTER::Sync().

◆ GetLibrary()

SYMBOL_LIB_TABLE_ROW * LIB_MANAGER::GetLibrary ( const wxString &  aLibrary) const

Finds a single library within the (aggregate) library table.

Definition at line 114 of file lib_manager.cpp.

115 {
116  SYMBOL_LIB_TABLE_ROW* row = nullptr;
117 
118  try
119  {
120  row = symTable()->FindRow( aLibrary );
121  }
122  catch( const IO_ERROR& e )
123  {
124  wxLogMessage( _( "Cannot find library \"%s\" in the Symbol Library Table (%s)" ),
125  aLibrary, e.What() );
126  }
127 
128  return row;
129 }
SYMBOL_LIB_TABLE_ROW * FindRow(const wxString &aNickName)
Return an SYMBOL_LIB_TABLE_ROW if aNickName is found in this table or in any chained fallBack table f...
Hold a record identifying a symbol library accessed by the appropriate symbol library SCH_PLUGIN obje...
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:33
#define _(s)
Definition: 3d_actions.cpp:31
SYMBOL_LIB_TABLE * symTable() const
Returns the current Symbol Library Table
Struct IO_ERROR is a class used to hold an error message and may be used when throwing exceptions con...
Definition: ki_exception.h:76

References _, SYMBOL_LIB_TABLE::FindRow(), symTable(), and IO_ERROR::What().

Referenced by GetLibraryHash(), SaveLibrary(), and SYMBOL_TREE_SYNCHRONIZING_ADAPTER::Sync().

◆ getLibraryBuffer()

LIB_MANAGER::LIB_BUFFER & LIB_MANAGER::getLibraryBuffer ( const wxString &  aLibrary)
private

Returns an existing library buffer or creates one to using Symbol Library Table to get the original data.

Definition at line 696 of file lib_manager.cpp.

697 {
698  auto it = m_libs.find( aLibrary );
699 
700  if( it != m_libs.end() )
701  return it->second;
702 
703  // The requested buffer does not exist yet, so create one
704  auto ret = m_libs.emplace( aLibrary, LIB_BUFFER( aLibrary ) );
705  LIB_BUFFER& buf = ret.first->second;
706 
707  for( auto part : getOriginalParts( aLibrary ) )
708  {
709  LIB_PART* newSymbol;
710 
711  if( part->IsAlias() )
712  {
713  std::shared_ptr< LIB_PART > oldParent = part->GetParent().lock();
714 
715  wxCHECK_MSG( oldParent, buf,
716  wxString::Format( "Derived symbol '%s' found with undefined parent.",
717  part->GetName() ) );
718 
719  LIB_PART* libParent = buf.GetPart( oldParent->GetName() );
720 
721  if( !libParent )
722  {
723  libParent = new LIB_PART( *oldParent.get() );
724  buf.CreateBuffer( libParent, new SCH_SCREEN( &m_frame.Kiway() ) );
725  }
726 
727  newSymbol = new LIB_PART( *part );
728  newSymbol->SetParent( libParent );
729  buf.CreateBuffer( newSymbol, new SCH_SCREEN( &m_frame.Kiway() ) );
730  }
731  else if( !buf.GetPart( part->GetName() ) )
732  {
733  buf.CreateBuffer( new LIB_PART( *part ), new SCH_SCREEN( &m_frame.Kiway() ) );
734  }
735  }
736 
737  return buf;
738 }
KIWAY & Kiway() const
Function Kiway returns a reference to the KIWAY that this object has an opportunity to participate in...
Definition: kiway_holder.h:56
LIB_EDIT_FRAME & m_frame
Definition: lib_manager.h:460
void SetParent(LIB_PART *aParent=nullptr)
PART_REF & GetParent()
Define a library symbol object.
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
std::set< LIB_PART * > getOriginalParts(const wxString &aLibrary)
Returns a set of LIB_PART objects belonging to the original library
std::map< wxString, LIB_BUFFER > m_libs
The library buffers
Definition: lib_manager.h:458

References LIB_MANAGER::LIB_BUFFER::CreateBuffer(), Format(), getOriginalParts(), LIB_PART::GetParent(), LIB_MANAGER::LIB_BUFFER::GetPart(), KIWAY_HOLDER::Kiway(), LIB_PART::LIB_PART(), m_frame, m_libs, and LIB_PART::SetParent().

Referenced by GetBufferedPart(), GetRootSymbolNames(), HasDerivedSymbols(), RemovePart(), UpdatePart(), and UpdatePartAfterRename().

◆ GetLibraryHash()

int LIB_MANAGER::GetLibraryHash ( const wxString &  aLibrary) const

Returns a library hash value to determine if it has changed.

For buffered libraries, it returns a number corresponding to the number of modifications. For original libraries, hash is computed basing on the library URI. Returns -1 when the requested library does not exist.

Definition at line 88 of file lib_manager.cpp.

89 {
90  const auto libBufIt = m_libs.find( aLibrary );
91 
92  if( libBufIt != m_libs.end() )
93  return libBufIt->second.GetHash();
94 
95  auto row = GetLibrary( aLibrary );
96 
97  // return -1 if library does not exist or 0 if not modified
98  return row ? std::hash<std::string>{}( aLibrary.ToStdString() +
99  row->GetFullURI( true ).ToStdString() ) : -1;
100 }
SYMBOL_LIB_TABLE_ROW * GetLibrary(const wxString &aLibrary) const
Finds a single library within the (aggregate) library table.
std::map< wxString, LIB_BUFFER > m_libs
The library buffers
Definition: lib_manager.h:458

References GetLibrary(), and m_libs.

Referenced by SYMBOL_TREE_SYNCHRONIZING_ADAPTER::Sync(), and SYMBOL_TREE_SYNCHRONIZING_ADAPTER::updateLibrary().

◆ getLibraryName()

wxString LIB_MANAGER::getLibraryName ( const wxString &  aFilePath)
staticprivate

Extracts library name basing on the file name

Definition at line 623 of file lib_manager.cpp.

624 {
625  wxFileName fn( aFilePath );
626  return fn.GetName();
627 }

Referenced by addLibrary().

◆ GetLibraryNames()

wxArrayString LIB_MANAGER::GetLibraryNames ( ) const

Returns the array of library names.

Definition at line 103 of file lib_manager.cpp.

104 {
105  wxArrayString res;
106 
107  for( const auto& libName : symTable()->GetLogicalLibs() )
108  res.Add( libName );
109 
110  return res;
111 }
SYMBOL_LIB_TABLE * symTable() const
Returns the current Symbol Library Table

References symTable().

Referenced by SYMBOL_TREE_SYNCHRONIZING_ADAPTER::GetLibrariesCount(), LIB_EDIT_FRAME::IsContentModified(), LIB_EDIT_FRAME::saveAllLibraries(), and SYMBOL_TREE_SYNCHRONIZING_ADAPTER::Sync().

◆ getOriginalParts()

std::set< LIB_PART * > LIB_MANAGER::getOriginalParts ( const wxString &  aLibrary)
private

Returns a set of LIB_PART objects belonging to the original library

Definition at line 671 of file lib_manager.cpp.

672 {
673  std::set<LIB_PART*> parts;
674  wxCHECK( LibraryExists( aLibrary ), parts );
675 
676  try
677  {
678  wxArrayString aliases;
679  symTable()->EnumerateSymbolLib( aLibrary, aliases );
680 
681  for( const auto& aliasName : aliases )
682  {
683  LIB_PART* alias = symTable()->LoadSymbol( aLibrary, aliasName );
684  parts.insert( alias );
685  }
686  }
687  catch( const IO_ERROR& e )
688  {
689  wxLogMessage( _( "Cannot enumerate library \"%s\" (%s)" ), aLibrary, e.What() );
690  }
691 
692  return parts;
693 }
void EnumerateSymbolLib(const wxString &aNickname, wxArrayString &aAliasNames, bool aPowerSymbolsOnly=false)
Return a list of symbol alias names contained within the library given by aNickname.
LIB_PART * LoadSymbol(const wxString &aNickname, const wxString &aName)
Load a LIB_PART having aName from the library given by aNickname.
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:33
Define a library symbol object.
#define _(s)
Definition: 3d_actions.cpp:31
bool LibraryExists(const wxString &aLibrary, bool aCheckEnabled=false) const
Returns true if library exists.
SYMBOL_LIB_TABLE * symTable() const
Returns the current Symbol Library Table
Struct IO_ERROR is a class used to hold an error message and may be used when throwing exceptions con...
Definition: ki_exception.h:76

References _, SYMBOL_LIB_TABLE::EnumerateSymbolLib(), LibraryExists(), SYMBOL_LIB_TABLE::LoadSymbol(), symTable(), and IO_ERROR::What().

Referenced by getLibraryBuffer(), and SaveLibrary().

◆ GetRootSymbolNames()

void LIB_MANAGER::GetRootSymbolNames ( const wxString &  aLibName,
wxArrayString &  aRootSymbolNames 
)

Definition at line 605 of file lib_manager.cpp.

607 {
608  LIB_BUFFER& libBuf = getLibraryBuffer( aLibraryName );
609 
610  libBuf.GetRootSymbolNames( aRootSymbolNames );
611 }
LIB_BUFFER & getLibraryBuffer(const wxString &aLibrary)
Returns an existing library buffer or creates one to using Symbol Library Table to get the original d...

References getLibraryBuffer(), and LIB_MANAGER::LIB_BUFFER::GetRootSymbolNames().

Referenced by LIB_EDIT_FRAME::CreateNewPart(), and DIALOG_EDIT_COMPONENT_IN_LIBRARY::TransferDataToWindow().

◆ GetScreen()

SCH_SCREEN * LIB_MANAGER::GetScreen ( const wxString &  aAlias,
const wxString &  aLibrary 
)

Returns the screen used to edit a specific part.

LIB_MANAGER retains the ownership.

Definition at line 368 of file lib_manager.cpp.

369 {
370  wxCHECK( LibraryExists( aLibrary ), nullptr );
371  wxCHECK( !aAlias.IsEmpty(), nullptr );
372  auto it = m_libs.find( aLibrary );
373  wxCHECK( it != m_libs.end(), nullptr );
374 
375  LIB_BUFFER& buf = it->second;
376  auto partBuf = buf.GetBuffer( aAlias );
377  return partBuf ? partBuf->GetScreen() : nullptr;
378 }
bool LibraryExists(const wxString &aLibrary, bool aCheckEnabled=false) const
Returns true if library exists.
std::map< wxString, LIB_BUFFER > m_libs
The library buffers
Definition: lib_manager.h:458

References LIB_MANAGER::LIB_BUFFER::GetBuffer(), LibraryExists(), and m_libs.

Referenced by LIB_EDIT_FRAME::LoadOneLibraryPartAux().

◆ GetUniqueLibraryName()

wxString LIB_MANAGER::GetUniqueLibraryName ( ) const

Returns a library name that is not currently in use.

Used for generating names for new libraries.

Definition at line 585 of file lib_manager.cpp.

586 {
587  wxString name = "New_Library";
588 
589  if( !LibraryExists( name ) )
590  return name;
591 
592  name += "_";
593 
594  for( unsigned int i = 0; i < std::numeric_limits<unsigned int>::max(); ++i )
595  {
596  if( !LibraryExists( name + wxString::Format( "%u", i ) ) )
597  return name + wxString::Format( "%u", i );
598  }
599 
600  wxFAIL;
601  return wxEmptyString;
602 }
const char * name
Definition: DXF_plotter.cpp:60
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
bool LibraryExists(const wxString &aLibrary, bool aCheckEnabled=false) const
Returns true if library exists.

References Format(), LibraryExists(), and name.

Referenced by LIB_EDIT_FRAME::AddLibraryFile().

◆ HasDerivedSymbols()

bool LIB_MANAGER::HasDerivedSymbols ( const wxString &  aSymbolName,
const wxString &  aLibraryName 
)

Check if symbol aSymbolName in library aLibraryName is a root symbol that has derived symbols.

Returns
true if \aSymbolName in aLibraryName has derived symbols.

Definition at line 614 of file lib_manager.cpp.

616 {
617  LIB_BUFFER& libBuf = getLibraryBuffer( aLibraryName );
618 
619  return libBuf.HasDerivedSymbols( aSymbolName );
620 }
LIB_BUFFER & getLibraryBuffer(const wxString &aLibrary)
Returns an existing library buffer or creates one to using Symbol Library Table to get the original d...

References getLibraryBuffer(), and LIB_MANAGER::LIB_BUFFER::HasDerivedSymbols().

Referenced by LIB_MANAGER::LIB_BUFFER::DeleteBuffer(), and LIB_EDIT_FRAME::DeletePartFromLibrary().

◆ HasModifications()

bool LIB_MANAGER::HasModifications ( ) const

Definition at line 65 of file lib_manager.cpp.

66 {
67  for( const auto& lib : m_libs )
68  {
69  if( lib.second.IsModified() )
70  return true;
71  }
72 
73  return false;
74 }
std::map< wxString, LIB_BUFFER > m_libs
The library buffers
Definition: lib_manager.h:458

References m_libs.

Referenced by LIB_EDIT_FRAME::HasLibModifications().

◆ IsLibraryModified()

bool LIB_MANAGER::IsLibraryModified ( const wxString &  aLibrary) const

Returns true if library has unsaved modifications.

Definition at line 215 of file lib_manager.cpp.

216 {
217  auto it = m_libs.find( aLibrary );
218  return it != m_libs.end() ? it->second.IsModified() : false;
219 }
std::map< wxString, LIB_BUFFER > m_libs
The library buffers
Definition: lib_manager.h:458

References m_libs.

Referenced by SYMBOL_TREE_SYNCHRONIZING_ADAPTER::GetAttr(), SYMBOL_TREE_SYNCHRONIZING_ADAPTER::GetValue(), LIB_EDIT_FRAME::IsContentModified(), LIB_EDIT_FRAME::ReCreateMenuBar(), and LIB_EDIT_FRAME::saveAllLibraries().

◆ IsLibraryReadOnly()

bool LIB_MANAGER::IsLibraryReadOnly ( const wxString &  aLibrary) const

Returns true if the library is stored in a read-only file.

Returns
True on success, false otherwise.

Definition at line 269 of file lib_manager.cpp.

270 {
271  wxCHECK( LibraryExists( aLibrary ), true );
272  wxFileName fn( symTable()->GetFullURI( aLibrary ) );
273  return ( fn.FileExists() && !fn.IsFileWritable() ) || !fn.IsDirWritable();
274 }
bool LibraryExists(const wxString &aLibrary, bool aCheckEnabled=false) const
Returns true if library exists.
SYMBOL_LIB_TABLE * symTable() const
Returns the current Symbol Library Table

References LibraryExists(), and symTable().

Referenced by LIB_EDIT_FRAME::ReCreateMenuBar().

◆ IsPartModified()

bool LIB_MANAGER::IsPartModified ( const wxString &  aAlias,
const wxString &  aLibrary 
) const

Returns true if part has unsaved modifications.

Definition at line 222 of file lib_manager.cpp.

223 {
224  auto libIt = m_libs.find( aLibrary );
225 
226  if( libIt == m_libs.end() )
227  return false;
228 
229  const LIB_BUFFER& buf = libIt->second;
230  auto partBuf = buf.GetBuffer( aAlias );
231  return partBuf ? partBuf->IsModified() : false;
232 }
std::map< wxString, LIB_BUFFER > m_libs
The library buffers
Definition: lib_manager.h:458

References LIB_MANAGER::LIB_BUFFER::GetBuffer(), and m_libs.

Referenced by LIB_EDIT_FRAME::DeletePartFromLibrary(), SYMBOL_TREE_SYNCHRONIZING_ADAPTER::GetAttr(), SYMBOL_TREE_SYNCHRONIZING_ADAPTER::GetValue(), and LIB_EDIT_FRAME::ReCreateMenuBar().

◆ LibraryExists()

bool LIB_MANAGER::LibraryExists ( const wxString &  aLibrary,
bool  aCheckEnabled = false 
) const

Returns true if library exists.

If aCheckEnabled is set, then the library must also be enabled in the library table.

Definition at line 573 of file lib_manager.cpp.

574 {
575  if( aLibrary.IsEmpty() )
576  return false;
577 
578  if( m_libs.count( aLibrary ) > 0 )
579  return true;
580 
581  return symTable()->HasLibrary( aLibrary, aCheckEnabled );
582 }
bool HasLibrary(const wxString &aNickname, bool aCheckEnabled=false) const
Test for the existence of aNickname in the library table.
SYMBOL_LIB_TABLE * symTable() const
Returns the current Symbol Library Table
std::map< wxString, LIB_BUFFER > m_libs
The library buffers
Definition: lib_manager.h:458

References LIB_TABLE::HasLibrary(), m_libs, and symTable().

Referenced by addLibrary(), LIB_EDIT_FRAME::AddLibraryFile(), LIB_EDIT_FRAME::CreateNewPart(), LIB_EDIT_FRAME::DuplicatePart(), GetAliases(), GetBufferedPart(), getOriginalParts(), GetScreen(), GetUniqueLibraryName(), LIB_EDIT_FRAME::ImportPart(), IsLibraryReadOnly(), SaveLibrary(), SYMBOL_TREE_SYNCHRONIZING_ADAPTER::Sync(), and UpdatePart().

◆ PartExists()

bool LIB_MANAGER::PartExists ( const wxString &  aAlias,
const wxString &  aLibrary 
) const

Returns true if part with a specific alias exists in library (either original one or buffered).

Definition at line 552 of file lib_manager.cpp.

553 {
554  auto libBufIt = m_libs.find( aLibrary );
555  LIB_PART* alias = nullptr;
556 
557  if( libBufIt != m_libs.end() )
558  return !!libBufIt->second.GetBuffer( aAlias );
559 
560  try
561  {
562  alias = symTable()->LoadSymbol( aLibrary, aAlias );
563  }
564  catch( IO_ERROR& )
565  {
566  // checking if certain symbol exists, so its absence is perfectly fine
567  }
568 
569  return alias != nullptr;
570 }
LIB_PART * LoadSymbol(const wxString &aNickname, const wxString &aName)
Load a LIB_PART having aName from the library given by aNickname.
Define a library symbol object.
SYMBOL_LIB_TABLE * symTable() const
Returns the current Symbol Library Table
std::map< wxString, LIB_BUFFER > m_libs
The library buffers
Definition: lib_manager.h:458
Struct IO_ERROR is a class used to hold an error message and may be used when throwing exceptions con...
Definition: ki_exception.h:76

References SYMBOL_LIB_TABLE::LoadSymbol(), m_libs, and symTable().

Referenced by LIB_EDIT_FRAME::CreateNewPart(), LIB_EDIT_FRAME::fixDuplicateAliases(), LIB_EDIT_FRAME::ImportPart(), LIB_EDIT_FRAME::Revert(), LIB_EDIT_FRAME::savePartAs(), DIALOG_EDIT_COMPONENT_IN_LIBRARY::TransferDataFromWindow(), and LIB_EDIT_FRAME::UpdateAfterSymbolProperties().

◆ RemovePart()

bool LIB_MANAGER::RemovePart ( const wxString &  aName,
const wxString &  aLibrary 
)

Removes the part from the part buffer.

It is required to save the library to have the part removed in the schematic editor.

Definition at line 507 of file lib_manager.cpp.

508 {
509  LIB_BUFFER& libBuf = getLibraryBuffer( aLibrary );
510  auto partBuf = libBuf.GetBuffer( aAlias );
511  wxCHECK( partBuf, false );
512 
513  bool retv = true;
514 
515  retv &= libBuf.DeleteBuffer( partBuf );
516  m_frame.SyncLibraries( false );
517 
518  return retv;
519 }
LIB_EDIT_FRAME & m_frame
Definition: lib_manager.h:460
void SyncLibraries(bool aShowProgress)
Synchronize the library manager to the symbol library table, and then the symbol tree to the library ...
LIB_BUFFER & getLibraryBuffer(const wxString &aLibrary)
Returns an existing library buffer or creates one to using Symbol Library Table to get the original d...

References LIB_MANAGER::LIB_BUFFER::DeleteBuffer(), LIB_MANAGER::LIB_BUFFER::GetBuffer(), getLibraryBuffer(), m_frame, and LIB_EDIT_FRAME::SyncLibraries().

Referenced by LIB_EDIT_FRAME::DeletePartFromLibrary().

◆ RevertAll()

bool LIB_MANAGER::RevertAll ( )

Revert all pending changes.

Returns
True if all changes successfully reverted.

Definition at line 481 of file lib_manager.cpp.

482 {
483  bool retv = true;
484 
485  // Nothing to revert.
486  if( GetHash() == 0 )
487  return true;
488 
489  for( const auto& lib : m_libs )
490  {
491  if( !lib.second.IsModified() )
492  continue;
493 
494  for( const auto& buffer : lib.second.GetBuffers() )
495  {
496  if( !buffer->IsModified() )
497  continue;
498 
499  RevertPart( lib.first, buffer->GetOriginal()->GetName() );
500  }
501  }
502 
503  return retv;
504 }
LIB_ID RevertPart(const wxString &aAlias, const wxString &aLibrary)
Reverts unsaved changes for a particular part.
int GetHash() const
Definition: lib_manager.cpp:77
std::map< wxString, LIB_BUFFER > m_libs
The library buffers
Definition: lib_manager.h:458

References GetHash(), m_libs, and RevertPart().

Referenced by LIB_EDIT_FRAME::RevertAll().

◆ RevertLibrary()

bool LIB_MANAGER::RevertLibrary ( const wxString &  aLibrary)

Reverts unsaved changes for a particular library.

Returns
True on success, false otherwise.

Definition at line 467 of file lib_manager.cpp.

468 {
469  auto it = m_libs.find( aLibrary );
470 
471  if( it == m_libs.end() ) // nothing to reverse
472  return false;
473 
474  m_libs.erase( it );
475  m_frame.SyncLibraries( false );
476 
477  return true;
478 }
LIB_EDIT_FRAME & m_frame
Definition: lib_manager.h:460
void SyncLibraries(bool aShowProgress)
Synchronize the library manager to the symbol library table, and then the symbol tree to the library ...
std::map< wxString, LIB_BUFFER > m_libs
The library buffers
Definition: lib_manager.h:458

References m_frame, m_libs, and LIB_EDIT_FRAME::SyncLibraries().

Referenced by LIB_EDIT_FRAME::Revert().

◆ RevertPart()

LIB_ID LIB_MANAGER::RevertPart ( const wxString &  aAlias,
const wxString &  aLibrary 
)

Reverts unsaved changes for a particular part.

Returns
The LIB_ID of the reverted part (which may be different in the case of a rename)

Definition at line 442 of file lib_manager.cpp.

443 {
444  auto it = m_libs.find( aLibrary );
445 
446  if( it == m_libs.end() ) // no items to flush
447  return LIB_ID( aLibrary, aAlias );
448 
449  auto partBuf = it->second.GetBuffer( aAlias );
450  wxCHECK( partBuf, LIB_ID( aLibrary, aAlias ) );
451  LIB_PART original( *partBuf->GetOriginal() );
452 
453  if( original.GetName() != aAlias )
454  {
455  UpdatePartAfterRename( &original, aAlias, aLibrary );
456  }
457  else
458  {
459  partBuf->SetPart( new LIB_PART( original ) );
460  m_frame.SyncLibraries( false );
461  }
462 
463  return LIB_ID( aLibrary, original.GetName() );
464 }
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:51
LIB_EDIT_FRAME & m_frame
Definition: lib_manager.h:460
Define a library symbol object.
void SyncLibraries(bool aShowProgress)
Synchronize the library manager to the symbol library table, and then the symbol tree to the library ...
std::map< wxString, LIB_BUFFER > m_libs
The library buffers
Definition: lib_manager.h:458
bool UpdatePartAfterRename(LIB_PART *aPart, const wxString &oldAlias, const wxString &aLibrary)
Updates the part buffer with a new version of the part when the name has changed.

References LIB_PART::LIB_PART(), m_frame, m_libs, LIB_EDIT_FRAME::SyncLibraries(), and UpdatePartAfterRename().

Referenced by LIB_EDIT_FRAME::Revert(), and RevertAll().

◆ SaveLibrary()

bool LIB_MANAGER::SaveLibrary ( const wxString &  aLibrary,
const wxString &  aFileName 
)

Saves library to a file, including unsaved changes.

Parameters
aLibraryis the library name.
aFileNameis the target file name.
Returns
True on success, false otherwise.

Definition at line 132 of file lib_manager.cpp.

133 {
134  wxCHECK( LibraryExists( aLibrary ), false );
135  wxFileName fn( aFileName );
136  wxCHECK( !fn.FileExists() || fn.IsFileWritable(), false );
137  SCH_PLUGIN::SCH_PLUGIN_RELEASER pi( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_LEGACY ) );
138  bool res = true; // assume all libraries are successfully saved
139 
140  auto it = m_libs.find( aLibrary );
141 
142  if( it != m_libs.end() )
143  {
144  // Handle buffered library
145  LIB_BUFFER& libBuf = it->second;
146 
147  const auto& partBuffers = libBuf.GetBuffers();
148 
149  for( const auto& partBuf : partBuffers )
150  {
151  if( !libBuf.SaveBuffer( partBuf, &*pi, true ) )
152  {
153  // Something went wrong, but try to save other libraries
154  res = false;
155  }
156  }
157 
158  // clear the deleted parts buffer only if data is saved to the original file
159  wxFileName original, destination( aFileName );
160  auto row = GetLibrary( aLibrary );
161 
162  if( row )
163  {
164  original = row->GetFullURI( true );
165  original.Normalize();
166  }
167 
168  destination.Normalize();
169 
170  if( res && original == destination )
171  libBuf.ClearDeletedBuffer();
172  }
173  else
174  {
175  // Handle original library
176  PROPERTIES properties;
177  properties.emplace( SCH_LEGACY_PLUGIN::PropBuffering, "" );
178 
179  for( auto part : getOriginalParts( aLibrary ) )
180  {
181  LIB_PART* newSymbol;
182 
183  if( part->IsAlias() )
184  {
185  std::shared_ptr< LIB_PART > oldParent = part->GetParent().lock();
186 
187  wxCHECK_MSG( oldParent, false,
188  wxString::Format( "Derived symbol '%s' found with undefined parent.",
189  part->GetName() ) );
190 
191  LIB_PART* libParent = pi->LoadSymbol( aLibrary, oldParent->GetName(), &properties );
192 
193  if( !libParent )
194  {
195  libParent = new LIB_PART( *oldParent.get() );
196  pi->SaveSymbol( aLibrary, libParent, &properties );
197  }
198 
199  newSymbol = new LIB_PART( *part );
200  newSymbol->SetParent( libParent );
201  pi->SaveSymbol( aLibrary, newSymbol, &properties );
202  }
203  else if( !pi->LoadSymbol( aLibrary, part->GetName(), &properties ) )
204  {
205  pi->SaveSymbol( aLibrary, new LIB_PART( *part ), &properties );
206  }
207  }
208  }
209 
210  pi->SaveLibrary( aFileName );
211  return res;
212 }
PROPERTIES is a name/value tuple with unique names and optional values.
Definition: properties.h:34
void SetParent(LIB_PART *aParent=nullptr)
PART_REF & GetParent()
Define a library symbol object.
SYMBOL_LIB_TABLE_ROW * GetLibrary(const wxString &aLibrary) const
Finds a single library within the (aggregate) library table.
Helper object to release a SCH_PLUGIN in the context of a potential thrown exception through its dest...
Definition: sch_io_mgr.h:497
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
std::set< LIB_PART * > getOriginalParts(const wxString &aLibrary)
Returns a set of LIB_PART objects belonging to the original library
bool LibraryExists(const wxString &aLibrary, bool aCheckEnabled=false) const
Returns true if library exists.
static const char * PropBuffering
The property used internally by the plugin to enable cache buffering which prevents the library file ...
std::map< wxString, LIB_BUFFER > m_libs
The library buffers
Definition: lib_manager.h:458

References LIB_MANAGER::LIB_BUFFER::ClearDeletedBuffer(), Format(), LIB_MANAGER::LIB_BUFFER::GetBuffers(), GetLibrary(), getOriginalParts(), LIB_PART::GetParent(), LIB_PART::LIB_PART(), LibraryExists(), m_libs, SCH_LEGACY_PLUGIN::PropBuffering, LIB_MANAGER::LIB_BUFFER::SaveBuffer(), and LIB_PART::SetParent().

Referenced by LIB_EDIT_FRAME::saveLibrary().

◆ SetCurrentLib()

void LIB_MANAGER::SetCurrentLib ( const wxString &  aLibrary)
inline

Definition at line 275 of file lib_manager.h.

275 { m_currentLib = aLibrary; }
wxString m_currentLib
Definition: lib_manager.h:464

References m_currentLib.

Referenced by LIB_EDIT_FRAME::SetCurLib().

◆ SetCurrentPart()

void LIB_MANAGER::SetCurrentPart ( const wxString &  aPart)
inline

Definition at line 281 of file lib_manager.h.

281 { m_currentPart = aPart; }
wxString m_currentPart
Definition: lib_manager.h:465

References m_currentPart.

Referenced by LIB_EDIT_FRAME::SetCurPart(), and UpdatePartAfterRename().

◆ symTable()

SYMBOL_LIB_TABLE * LIB_MANAGER::symTable ( ) const
private

Returns the current Symbol Library Table

Definition at line 665 of file lib_manager.cpp.

666 {
667  return m_frame.Prj().SchSymbolLibTable();
668 }
PROJECT & Prj() const
Function Prj returns a reference to the PROJECT "associated with" this KIWAY.
LIB_EDIT_FRAME & m_frame
Definition: lib_manager.h:460

References m_frame, and KIWAY_HOLDER::Prj().

Referenced by FlushPart(), GetAlias(), GetAliases(), GetBufferedPart(), GetHash(), GetLibrary(), GetLibraryNames(), getOriginalParts(), IsLibraryReadOnly(), LibraryExists(), PartExists(), and Sync().

◆ Sync()

void LIB_MANAGER::Sync ( bool  aForce = false,
std::function< void(int, int, const wxString &)>  aProgressCallback = [](int, int, const wxString&){} 
)

Updates the LIB_MANAGER data to synchronize with Symbol Library Table.

Definition at line 48 of file lib_manager.cpp.

50 {
52  {
53  int libTableHash = symTable()->GetModifyHash();
54 
55  if( aForce || m_syncHash != libTableHash )
56  {
57  getAdapter()->Sync( aForce, aProgressCallback );
58  m_syncHash = libTableHash;
59  }
60  }
62 }
LIB_LOGGER m_logger
Definition: lib_manager.h:461
void Activate()
Definition: lib_manager.h:59
void Deactivate()
Definition: lib_manager.h:69
SYMBOL_LIB_TABLE * symTable() const
Returns the current Symbol Library Table
void Sync(bool aForce=false, std::function< void(int, int, const wxString &)> aProgressCallback=[](int, int, const wxString &){})
SYMBOL_TREE_SYNCHRONIZING_ADAPTER * getAdapter()
Definition: lib_manager.h:468

References LIB_LOGGER::Activate(), LIB_LOGGER::Deactivate(), getAdapter(), SYMBOL_LIB_TABLE::GetModifyHash(), m_logger, m_syncHash, symTable(), and SYMBOL_TREE_SYNCHRONIZING_ADAPTER::Sync().

Referenced by LIB_EDIT_FRAME::SyncLibraries().

◆ UpdatePart()

bool LIB_MANAGER::UpdatePart ( LIB_PART aPart,
const wxString &  aLibrary 
)

Updates the part buffer with a new version of the part.

The library buffer creates a copy of the part. It is required to save the library to use the updated part in the schematic editor.

Definition at line 381 of file lib_manager.cpp.

382 {
383  wxCHECK( LibraryExists( aLibrary ), false );
384  wxCHECK( aPart, false );
385  LIB_BUFFER& libBuf = getLibraryBuffer( aLibrary );
386  auto partBuf = libBuf.GetBuffer( aPart->GetName() );
387 
388  if( partBuf ) // Existing symbol.
389  {
390  LIB_PART* bufferedPart = const_cast< LIB_PART* >( partBuf->GetPart() );
391 
392  wxCHECK( bufferedPart, false );
393 
394  *bufferedPart = *aPart;
395  partBuf->GetScreen()->SetModify();
396  }
397  else // New symbol
398  {
399  LIB_PART* partCopy = new LIB_PART( *aPart, nullptr );
400 
401  partCopy->SetLibId( LIB_ID( aLibrary, aPart->GetLibId().GetLibItemName() ) );
402 
403  SCH_SCREEN* screen = new SCH_SCREEN( &m_frame.Kiway() );
404  libBuf.CreateBuffer( partCopy, screen );
405  screen->SetModify();
406  }
407 
408  return true;
409 }
const UTF8 & GetLibItemName() const
Definition: lib_id.h:114
KIWAY & Kiway() const
Function Kiway returns a reference to the KIWAY that this object has an opportunity to participate in...
Definition: kiway_holder.h:56
LIB_ID GetLibId() const override
wxString GetName() const override
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:51
LIB_EDIT_FRAME & m_frame
Definition: lib_manager.h:460
Define a library symbol object.
LIB_BUFFER & getLibraryBuffer(const wxString &aLibrary)
Returns an existing library buffer or creates one to using Symbol Library Table to get the original d...
bool LibraryExists(const wxString &aLibrary, bool aCheckEnabled=false) const
Returns true if library exists.
void SetModify()
Definition: base_screen.h:224
void SetLibId(const LIB_ID &aLibId)

References LIB_MANAGER::LIB_BUFFER::CreateBuffer(), LIB_MANAGER::LIB_BUFFER::GetBuffer(), LIB_PART::GetLibId(), LIB_ID::GetLibItemName(), getLibraryBuffer(), LIB_PART::GetName(), KIWAY_HOLDER::Kiway(), LIB_PART::LIB_PART(), LibraryExists(), m_frame, LIB_PART::SetLibId(), and BASE_SCREEN::SetModify().

Referenced by LIB_EDIT_FRAME::CreateNewPart(), LIB_EDIT_FRAME::DuplicatePart(), LIB_EDIT_FRAME::ImportPart(), LIB_EDIT_FRAME::savePartAs(), and LIB_EDIT_FRAME::storeCurrentPart().

◆ UpdatePartAfterRename()

bool LIB_MANAGER::UpdatePartAfterRename ( LIB_PART aPart,
const wxString &  oldAlias,
const wxString &  aLibrary 
)

Updates the part buffer with a new version of the part when the name has changed.

The old library buffer will be deleted and a new one created with the new name.

Definition at line 412 of file lib_manager.cpp.

414 {
415  LIB_BUFFER& libBuf = getLibraryBuffer( aLibrary );
416  auto partBuf = libBuf.GetBuffer( aOldName );
417 
418  wxCHECK( partBuf, false );
419 
420  libBuf.UpdateBuffer( partBuf, aPart );
421  SetCurrentPart( aPart->GetName() );
422  m_frame.SyncLibraries( false );
423 
424  return true;
425 }
wxString GetName() const override
LIB_EDIT_FRAME & m_frame
Definition: lib_manager.h:460
void SetCurrentPart(const wxString &aPart)
Definition: lib_manager.h:281
void SyncLibraries(bool aShowProgress)
Synchronize the library manager to the symbol library table, and then the symbol tree to the library ...
LIB_BUFFER & getLibraryBuffer(const wxString &aLibrary)
Returns an existing library buffer or creates one to using Symbol Library Table to get the original d...

References LIB_MANAGER::LIB_BUFFER::GetBuffer(), getLibraryBuffer(), LIB_PART::GetName(), m_frame, SetCurrentPart(), LIB_EDIT_FRAME::SyncLibraries(), and LIB_MANAGER::LIB_BUFFER::UpdateBuffer().

Referenced by LIB_EDIT_FRAME::GetComponentFromRedoList(), LIB_EDIT_FRAME::GetComponentFromUndoList(), RevertPart(), and LIB_EDIT_FRAME::UpdateAfterSymbolProperties().

Member Data Documentation

◆ m_adapter

SYMBOL_TREE_SYNCHRONIZING_ADAPTER::PTR LIB_MANAGER::m_adapter
private

Definition at line 467 of file lib_manager.h.

Referenced by GetAdapter(), getAdapter(), and LIB_MANAGER().

◆ m_currentLib

wxString LIB_MANAGER::m_currentLib
private

Definition at line 464 of file lib_manager.h.

Referenced by GetCurrentLib(), GetCurrentLibId(), and SetCurrentLib().

◆ m_currentPart

wxString LIB_MANAGER::m_currentPart
private

Definition at line 465 of file lib_manager.h.

Referenced by GetCurrentLibId(), GetCurrentPart(), and SetCurrentPart().

◆ m_frame

◆ m_libs

◆ m_logger

LIB_LOGGER LIB_MANAGER::m_logger
private

Definition at line 461 of file lib_manager.h.

Referenced by Sync().

◆ m_syncHash

int LIB_MANAGER::m_syncHash
private

Definition at line 462 of file lib_manager.h.

Referenced by Sync().


The documentation for this class was generated from the following files: