KiCad PCB EDA Suite
SYMBOL_TREE_SYNCHRONIZING_ADAPTER Class Reference

#include <symbol_tree_synchronizing_adapter.h>

Inheritance diagram for SYMBOL_TREE_SYNCHRONIZING_ADAPTER:
LIB_TREE_MODEL_ADAPTER

Public Types

enum  CMP_FILTER_TYPE { CMP_FILTER_NONE, CMP_FILTER_POWER }
 This enum allows a selective filtering of components to list. More...
 
enum  TREE_COLS { PART_COL = 0, DESC_COL, NUM_COLS }
 This enum defines the order of the columns in the tree view. More...
 
typedef wxObjectDataPtr< LIB_TREE_MODEL_ADAPTERPTR
 Reference-counting container for a pointer to CMP_TREE_MODEL_ADAPTER_BASE. More...
 

Public Member Functions

bool IsContainer (const wxDataViewItem &aItem) const override
 
void Sync (bool aForce=false, std::function< void(int, int, const wxString &)> aProgressCallback=[](int, int, const wxString &){})
 
int GetLibrariesCount () const override
 Return the number of libraries loaded in the tree. More...
 
TOOL_INTERACTIVEGetContextMenuTool () override
 
void SaveColWidths ()
 Save the column widths to the config file. More...
 
void SavePinnedItems ()
 
std::vector< PARAM_CFG * > & GetProjectFileParameters ()
 
void SetFilter (CMP_FILTER_TYPE aFilter)
 Set the component filter type. More...
 
CMP_FILTER_TYPE GetFilter () const
 Return the active filter. More...
 
void ShowUnits (bool aShow)
 Whether or not to show units. More...
 
void SetPreselectNode (LIB_ID const &aLibId, int aUnit)
 Set the component name to be selected if there are no search results. More...
 
void DoAddLibrary (wxString const &aNodeName, wxString const &aDesc, std::vector< LIB_TREE_ITEM * > const &aItemList, bool presorted)
 Add the given list of components by alias. More...
 
void AssignIntrinsicRanks ()
 Sort the tree and assign ranks after adding libraries. More...
 
void UpdateSearchString (wxString const &aSearch)
 Set the search string provided by the user. More...
 
void AttachTo (wxDataViewCtrl *aDataViewCtrl)
 Attach to a wxDataViewCtrl and initialize it. More...
 
LIB_ID GetAliasFor (const wxDataViewItem &aSelection) const
 Return the alias for the given item. More...
 
int GetUnitFor (const wxDataViewItem &aSelection) const
 Return the unit for the given item. More...
 
LIB_TREE_NODE::TYPE GetTypeFor (const wxDataViewItem &aSelection) const
 Return node type for the given item. More...
 
LIB_TREE_NODEGetTreeNodeFor (const wxDataViewItem &aSelection) const
 
virtual wxString GenerateInfo (LIB_ID const &aLibId, int aUnit)
 
int GetItemCount () const
 Return the number of components loaded in the tree. More...
 
wxDataViewItem FindItem (const LIB_ID &aLibId)
 Returns tree item corresponding to part. More...
 
unsigned int GetChildren (wxDataViewItem const &aItem, wxDataViewItemArray &aChildren) const override
 Populate a list of all the children of an item. More...
 
void Freeze ()
 
void Thaw ()
 
bool IsFrozen () const
 
void RefreshTree ()
 

Static Public Member Functions

static PTR Create (LIB_EDIT_FRAME *aParent, LIB_MANAGER *aLibs)
 

Protected Member Functions

void updateLibrary (LIB_TREE_NODE_LIB &aLibNode)
 
LIB_TREE_NODE::PTR_VECTOR::iterator deleteLibrary (LIB_TREE_NODE::PTR_VECTOR::iterator &aLibNodeIt)
 
void GetValue (wxVariant &aVariant, wxDataViewItem const &aItem, unsigned int aCol) const override
 
bool GetAttr (wxDataViewItem const &aItem, unsigned int aCol, wxDataViewItemAttr &aAttr) const override
 
 SYMBOL_TREE_SYNCHRONIZING_ADAPTER (LIB_EDIT_FRAME *aParent, LIB_MANAGER *aLibMgr)
 
LIB_TREE_NODE_LIBDoAddLibraryNode (wxString const &aNodeName, wxString const &aDesc)
 
bool HasContainerColumns (wxDataViewItem const &aItem) const override
 Check whether a container has columns too. More...
 
wxDataViewItem GetParent (wxDataViewItem const &aItem) const override
 Get the parent of an item. More...
 
unsigned int GetColumnCount () const override
 
wxString GetColumnType (unsigned int aCol) const override
 Return the type of data stored in the column as indicated by wxVariant::GetType() More...
 
bool SetValue (wxVariant const &aVariant, wxDataViewItem const &aItem, unsigned int aCol) override
 Set the value of an item. More...
 
const wxString GetPinningSymbol () const
 

Static Protected Member Functions

static wxDataViewItem ToItem (LIB_TREE_NODE const *aNode)
 Convert CMP_TREE_NODE -> wxDataViewItem. More...
 
static LIB_TREE_NODEToNode (wxDataViewItem aItem)
 Convert wxDataViewItem -> CMP_TREE_NODE. More...
 
static unsigned int IntoArray (LIB_TREE_NODE const &aNode, wxDataViewItemArray &aChildren)
 Convert CMP_TREE_NODE's children to wxDataViewItemArray. More...
 

Protected Attributes

LIB_EDIT_FRAMEm_frame
 
LIB_MANAGERm_libMgr
 
std::map< wxString, int > m_libHashes
 

Hashes to decide whether a library needs an update

More...
 
int m_lastSyncHash
 

LIB_MANAGER hash value returned in the last synchronization

More...
 
LIB_TREE_NODE_ROOT m_tree
 

Detailed Description

Definition at line 34 of file symbol_tree_synchronizing_adapter.h.

Member Typedef Documentation

◆ PTR

typedef wxObjectDataPtr<LIB_TREE_MODEL_ADAPTER> LIB_TREE_MODEL_ADAPTER::PTR
inherited

Reference-counting container for a pointer to CMP_TREE_MODEL_ADAPTER_BASE.

Definition at line 105 of file lib_tree_model_adapter.h.

Member Enumeration Documentation

◆ CMP_FILTER_TYPE

This enum allows a selective filtering of components to list.

Enumerator
CMP_FILTER_NONE 

no filtering

CMP_FILTER_POWER 

list components flagged PWR

Definition at line 116 of file lib_tree_model_adapter.h.

◆ TREE_COLS

This enum defines the order of the columns in the tree view.

Enumerator
PART_COL 

Part name column.

DESC_COL 

Part description column.

NUM_COLS 

The number of tree columns.

Definition at line 125 of file lib_tree_model_adapter.h.

126  {
127  PART_COL = 0,
128  DESC_COL,
129  NUM_COLS
130  };

Constructor & Destructor Documentation

◆ SYMBOL_TREE_SYNCHRONIZING_ADAPTER()

SYMBOL_TREE_SYNCHRONIZING_ADAPTER::SYMBOL_TREE_SYNCHRONIZING_ADAPTER ( LIB_EDIT_FRAME aParent,
LIB_MANAGER aLibMgr 
)
protected

Definition at line 40 of file symbol_tree_synchronizing_adapter.cpp.

41  :
42  LIB_TREE_MODEL_ADAPTER( aParent ),
43  m_frame( aParent ),
44  m_libMgr( aLibMgr ),
45  m_lastSyncHash( -1 )
46 {
47 }
int m_lastSyncHash
LIB_MANAGER hash value returned in the last synchronization
LIB_TREE_MODEL_ADAPTER(EDA_BASE_FRAME *aParent)

Referenced by Create().

Member Function Documentation

◆ AssignIntrinsicRanks()

void LIB_TREE_MODEL_ADAPTER::AssignIntrinsicRanks ( )
inlineinherited

Sort the tree and assign ranks after adding libraries.

Definition at line 185 of file lib_tree_model_adapter.h.

void AssignIntrinsicRanks(bool presorted=false)
Store intrinsic ranks on all children of this node.

References LIB_TREE_NODE::AssignIntrinsicRanks(), and LIB_TREE_MODEL_ADAPTER::m_tree.

◆ AttachTo()

void LIB_TREE_MODEL_ADAPTER::AttachTo ( wxDataViewCtrl *  aDataViewCtrl)
inherited

Attach to a wxDataViewCtrl and initialize it.

This will set up columns and associate the model via the adapter.

Parameters
aDataViewCtrlthe view component in the dialog

Definition at line 263 of file lib_tree_model_adapter.cpp.

264 {
265  wxString partHead = _( "Item" );
266  wxString descHead = _( "Description" );
267 
268  // The extent of the text doesn't take into account the space on either side
269  // in the header, so artificially pad it by M
270  wxSize partHeadMinWidth = GetTextSize( partHead + "M", aDataViewCtrl );
271 
272  if( aDataViewCtrl->GetColumnCount() > 0 )
273  {
274  int partWidth = aDataViewCtrl->GetColumn( PART_COL )->GetWidth();
275  int descWidth = aDataViewCtrl->GetColumn( DESC_COL )->GetWidth();
276 
277  // Only use the widths read back if they are non-zero.
278  // GTK returns the displayed width of the column, which is not calculated immediately
279  // this leads to cases of 0 column width if the user types too fast in the filter
280  if( descWidth > 0 )
281  {
282  m_colWidths[PART_COL] = partWidth;
283  m_colWidths[DESC_COL] = descWidth;
284  }
285  }
286 
287  m_widget = aDataViewCtrl;
288  aDataViewCtrl->SetIndent( kDataViewIndent );
289  aDataViewCtrl->AssociateModel( this );
290  aDataViewCtrl->ClearColumns();
291 
292  m_col_part = aDataViewCtrl->AppendTextColumn( partHead, PART_COL, wxDATAVIEW_CELL_INERT,
294  m_col_desc = aDataViewCtrl->AppendTextColumn( descHead, DESC_COL, wxDATAVIEW_CELL_INERT,
296 
297  // Ensure the part column is wider than the smallest allowable width
298  if( m_colWidths[PART_COL] < partHeadMinWidth.x )
299  {
300  m_colWidths[PART_COL] = partHeadMinWidth.x;
301  m_col_part->SetWidth( partHeadMinWidth.x );
302  }
303 
304  m_col_part->SetMinWidth( partHeadMinWidth.x );
305 }
wxSize GetTextSize(const wxString &aSingleLine, wxWindow *aWindow)
Return the size of aSingleLine of text when it is rendered in aWindow using whatever font is currentl...
Definition: common.cpp:260
static const int kDataViewIndent
#define _(s)
Definition: 3d_actions.cpp:33

References _, LIB_TREE_MODEL_ADAPTER::DESC_COL, GetTextSize(), kDataViewIndent, LIB_TREE_MODEL_ADAPTER::m_col_desc, LIB_TREE_MODEL_ADAPTER::m_col_part, LIB_TREE_MODEL_ADAPTER::m_colWidths, LIB_TREE_MODEL_ADAPTER::m_widget, and LIB_TREE_MODEL_ADAPTER::PART_COL.

Referenced by LIB_TREE_MODEL_ADAPTER::UpdateSearchString().

◆ Create()

LIB_TREE_MODEL_ADAPTER::PTR SYMBOL_TREE_SYNCHRONIZING_ADAPTER::Create ( LIB_EDIT_FRAME aParent,
LIB_MANAGER aLibs 
)
static

Definition at line 33 of file symbol_tree_synchronizing_adapter.cpp.

35 {
36  return PTR( new SYMBOL_TREE_SYNCHRONIZING_ADAPTER( aParent, aLibMgr ) );
37 }
wxObjectDataPtr< LIB_TREE_MODEL_ADAPTER > PTR
Reference-counting container for a pointer to CMP_TREE_MODEL_ADAPTER_BASE.
SYMBOL_TREE_SYNCHRONIZING_ADAPTER(LIB_EDIT_FRAME *aParent, LIB_MANAGER *aLibMgr)

References SYMBOL_TREE_SYNCHRONIZING_ADAPTER().

Referenced by LIB_MANAGER::LIB_MANAGER().

◆ deleteLibrary()

LIB_TREE_NODE::PTR_VECTOR::iterator SYMBOL_TREE_SYNCHRONIZING_ADAPTER::deleteLibrary ( LIB_TREE_NODE::PTR_VECTOR::iterator &  aLibNodeIt)
protected

Definition at line 191 of file symbol_tree_synchronizing_adapter.cpp.

193 {
194  LIB_TREE_NODE* node = aLibNodeIt->get();
195  m_libHashes.erase( node->m_Name );
196  auto it = m_tree.m_Children.erase( aLibNodeIt );
197  return it;
198 }
std::map< wxString, int > m_libHashes
Hashes to decide whether a library needs an update
Model class in the component selector Model-View-Adapter (mediated MVC) architecture.
wxString m_Name
PTR_VECTOR m_Children

References LIB_TREE_NODE::m_Children, m_libHashes, LIB_TREE_NODE::m_Name, and LIB_TREE_MODEL_ADAPTER::m_tree.

Referenced by Sync().

◆ DoAddLibrary()

void LIB_TREE_MODEL_ADAPTER::DoAddLibrary ( wxString const &  aNodeName,
wxString const &  aDesc,
std::vector< LIB_TREE_ITEM * > const &  aItemList,
bool  presorted 
)
inherited

Add the given list of components by alias.

To be called in the setup phase.

Parameters
aNodeNamethe parent node the components will appear under
aDescthe description field of the parent node
aItemListlist of components

Definition at line 174 of file lib_tree_model_adapter.cpp.

177 {
178  LIB_TREE_NODE_LIB& lib_node = DoAddLibraryNode( aNodeName, aDesc );
179 
180  for( LIB_TREE_ITEM* item: aItemList )
181  lib_node.AddItem( item );
182 
183  lib_node.AssignIntrinsicRanks( presorted );
184 }
A mix-in to provide polymorphism between items stored in libraries (symbols, aliases and footprints).
Definition: lib_tree_item.h:39
LIB_TREE_NODE_LIB_ID & AddItem(LIB_TREE_ITEM *aItem)
Construct a new alias node, add it to this library, and return it.
Node type: library.
LIB_TREE_NODE_LIB & DoAddLibraryNode(wxString const &aNodeName, wxString const &aDesc)
void AssignIntrinsicRanks(bool presorted=false)
Store intrinsic ranks on all children of this node.

References LIB_TREE_NODE_LIB::AddItem(), LIB_TREE_NODE::AssignIntrinsicRanks(), and LIB_TREE_MODEL_ADAPTER::DoAddLibraryNode().

Referenced by FP_TREE_MODEL_ADAPTER::AddLibraries(), SYMBOL_TREE_MODEL_ADAPTER::AddLibrary(), and FP_TREE_SYNCHRONIZING_ADAPTER::Sync().

◆ DoAddLibraryNode()

LIB_TREE_NODE_LIB & LIB_TREE_MODEL_ADAPTER::DoAddLibraryNode ( wxString const &  aNodeName,
wxString const &  aDesc 
)
protectedinherited

Definition at line 163 of file lib_tree_model_adapter.cpp.

165 {
166  LIB_TREE_NODE_LIB& lib_node = m_tree.AddLib( aNodeName, aDesc );
167 
168  lib_node.m_Pinned = m_pinnedLibs.Index( lib_node.m_LibId.GetLibNickname() ) != wxNOT_FOUND;
169 
170  return lib_node;
171 }
Node type: library.
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Definition: lib_id.h:97
LIB_TREE_NODE_LIB & AddLib(wxString const &aName, wxString const &aDesc)
Construct an empty library node, add it to the root, and return it.

References LIB_TREE_NODE_ROOT::AddLib(), LIB_ID::GetLibNickname(), LIB_TREE_NODE::m_LibId, LIB_TREE_NODE::m_Pinned, LIB_TREE_MODEL_ADAPTER::m_pinnedLibs, and LIB_TREE_MODEL_ADAPTER::m_tree.

Referenced by LIB_TREE_MODEL_ADAPTER::DoAddLibrary(), and Sync().

◆ FindItem()

wxDataViewItem LIB_TREE_MODEL_ADAPTER::FindItem ( const LIB_ID aLibId)
inherited

Returns tree item corresponding to part.

Parameters
aLibIdspecifies the part and library name to be searched for.
Returns
Tree data item representing the part. Might be invalid if nothings was found.

Definition at line 352 of file lib_tree_model_adapter.cpp.

353 {
354  for( auto& lib: m_tree.m_Children )
355  {
356  if( lib->m_Name != aLibId.GetLibNickname() )
357  continue;
358 
359  // if part name is not specified, return the library node
360  if( aLibId.GetLibItemName() == "" )
361  return ToItem( lib.get() );
362 
363  for( auto& alias: lib->m_Children )
364  {
365  if( alias->m_Name == aLibId.GetLibItemName() )
366  return ToItem( alias.get() );
367  }
368 
369  break; // could not find the part in the requested library
370  }
371 
372  return wxDataViewItem();
373 }
const UTF8 & GetLibItemName() const
Definition: lib_id.h:114
static wxDataViewItem ToItem(LIB_TREE_NODE const *aNode)
Convert CMP_TREE_NODE -> wxDataViewItem.
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Definition: lib_id.h:97
PTR_VECTOR m_Children

References LIB_ID::GetLibItemName(), LIB_ID::GetLibNickname(), LIB_TREE_NODE::m_Children, LIB_TREE_MODEL_ADAPTER::m_tree, and LIB_TREE_MODEL_ADAPTER::ToItem().

◆ Freeze()

void LIB_TREE_MODEL_ADAPTER::Freeze ( )
inlineinherited

◆ GenerateInfo()

virtual wxString LIB_TREE_MODEL_ADAPTER::GenerateInfo ( LIB_ID const &  aLibId,
int  aUnit 
)
inlinevirtualinherited

Reimplemented in SYMBOL_TREE_MODEL_ADAPTER, and FP_TREE_MODEL_ADAPTER.

Definition at line 235 of file lib_tree_model_adapter.h.

235 { return wxEmptyString; };

◆ GetAliasFor()

LIB_ID LIB_TREE_MODEL_ADAPTER::GetAliasFor ( const wxDataViewItem &  aSelection) const
inherited

Return the alias for the given item.

Parameters
aSelectionitem from the wxDataViewCtrl (see wxDataViewCtrl::GetSelection())
Returns
alias, or nullptr if none is selected

Definition at line 308 of file lib_tree_model_adapter.cpp.

309 {
310  const LIB_TREE_NODE* node = ToNode( aSelection );
311 
312  LIB_ID emptyId;
313 
314  if( !node )
315  return emptyId;
316 
317  return node->m_LibId;
318 }
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:51
static LIB_TREE_NODE * ToNode(wxDataViewItem aItem)
Convert wxDataViewItem -> CMP_TREE_NODE.
Model class in the component selector Model-View-Adapter (mediated MVC) architecture.

References LIB_TREE_NODE::m_LibId, and LIB_TREE_MODEL_ADAPTER::ToNode().

◆ GetAttr()

bool SYMBOL_TREE_SYNCHRONIZING_ADAPTER::GetAttr ( wxDataViewItem const &  aItem,
unsigned int  aCol,
wxDataViewItemAttr &  aAttr 
) const
overrideprotected

Definition at line 252 of file symbol_tree_synchronizing_adapter.cpp.

254 {
255  if( IsFrozen() )
256  return false;
257 
258  // change attributes only for the name field
259  if( aCol != 0 )
260  return false;
261 
262  LIB_TREE_NODE* node = ToNode( aItem );
263  wxCHECK( node, false );
264 
265  switch( node->m_Type )
266  {
267  case LIB_TREE_NODE::LIB:
268  // mark modified libs with bold font
269  aAttr.SetBold( m_libMgr->IsLibraryModified( node->m_Name ) );
270 
271 #ifdef __WXGTK__
272  // The native wxGTK+ impl ignores background colour, so set the text colour instead.
273  // This works reasonably well in dark themes, and quite poorly in light ones....
274  if( node->m_Name == m_libMgr->GetCurrentLib() )
275  aAttr.SetColour( wxSystemSettings::GetColour( wxSYS_COLOUR_HIGHLIGHT ) );
276 #else
277  // mark the current library with background color
278  if( node->m_Name == m_libMgr->GetCurrentLib() )
279  {
280  aAttr.SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_HIGHLIGHT ) );
281  aAttr.SetColour( wxSystemSettings::GetColour( wxSYS_COLOUR_LISTBOXHIGHLIGHTTEXT ) );
282  }
283 #endif
284  break;
285 
287  // mark modified part with bold font
288  aAttr.SetBold( m_libMgr->IsPartModified( node->m_Name, node->m_Parent->m_Name ) );
289 
290  // mark aliases with italic font
291  aAttr.SetItalic( !node->m_IsRoot );
292 
293 #ifdef __WXGTK__
294  // The native wxGTK+ impl ignores background colour, so set the text colour instead.
295  // This works reasonably well in dark themes, and quite poorly in light ones....
296  if( node->m_LibId == m_libMgr->GetCurrentLibId() )
297  aAttr.SetColour( wxSystemSettings::GetColour( wxSYS_COLOUR_HIGHLIGHT ) );
298 #else
299  // mark the current part with background color
300  if( node->m_LibId == m_libMgr->GetCurrentLibId() )
301  {
302  aAttr.SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_HIGHLIGHT ) );
303  aAttr.SetColour( wxSystemSettings::GetColour( wxSYS_COLOUR_LISTBOXHIGHLIGHTTEXT ) );
304  }
305 #endif
306  break;
307 
308  default:
309  return false;
310  }
311 
312  return true;
313 }
const wxString & GetCurrentLib() const
Returns the currently modified library name.
Definition: lib_manager.h:276
bool IsPartModified(const wxString &aAlias, const wxString &aLibrary) const
Returns true if part has unsaved modifications.
LIB_TREE_NODE * m_Parent
static LIB_TREE_NODE * ToNode(wxDataViewItem aItem)
Convert wxDataViewItem -> CMP_TREE_NODE.
Model class in the component selector Model-View-Adapter (mediated MVC) architecture.
enum TYPE m_Type
bool IsLibraryModified(const wxString &aLibrary) const
Returns true if library has unsaved modifications.
wxString m_Name
LIB_ID GetCurrentLibId() const
Returns the current library and part name as LIB_ID.
Definition: lib_manager.h:288

References LIB_MANAGER::GetCurrentLib(), LIB_MANAGER::GetCurrentLibId(), LIB_TREE_MODEL_ADAPTER::IsFrozen(), LIB_MANAGER::IsLibraryModified(), LIB_MANAGER::IsPartModified(), LIB_TREE_NODE::LIB, LIB_TREE_NODE::LIBID, LIB_TREE_NODE::m_IsRoot, LIB_TREE_NODE::m_LibId, m_libMgr, LIB_TREE_NODE::m_Name, LIB_TREE_NODE::m_Parent, LIB_TREE_NODE::m_Type, and LIB_TREE_MODEL_ADAPTER::ToNode().

◆ GetChildren()

unsigned int LIB_TREE_MODEL_ADAPTER::GetChildren ( wxDataViewItem const &  aItem,
wxDataViewItemArray &  aChildren 
) const
overrideinherited

Populate a list of all the children of an item.

Returns
number of children

Definition at line 376 of file lib_tree_model_adapter.cpp.

378 {
379  auto node = ( aItem.IsOk() ? ToNode( aItem ) : &m_tree );
380 
381  if( node->m_Type != LIB_TREE_NODE::TYPE::LIBID
382  || ( m_show_units && node->m_Type == LIB_TREE_NODE::TYPE::LIBID ) )
383  return IntoArray( *node, aChildren );
384  else
385  return 0;
386 }
static unsigned int IntoArray(LIB_TREE_NODE const &aNode, wxDataViewItemArray &aChildren)
Convert CMP_TREE_NODE's children to wxDataViewItemArray.
static LIB_TREE_NODE * ToNode(wxDataViewItem aItem)
Convert wxDataViewItem -> CMP_TREE_NODE.

References LIB_TREE_MODEL_ADAPTER::IntoArray(), LIB_TREE_MODEL_ADAPTER::m_show_units, LIB_TREE_MODEL_ADAPTER::m_tree, and LIB_TREE_MODEL_ADAPTER::ToNode().

◆ GetColumnCount()

unsigned int LIB_TREE_MODEL_ADAPTER::GetColumnCount ( ) const
inlineoverrideprotectedinherited

Definition at line 306 of file lib_tree_model_adapter.h.

306 { return NUM_COLS; }

References LIB_TREE_MODEL_ADAPTER::NUM_COLS.

◆ GetColumnType()

wxString LIB_TREE_MODEL_ADAPTER::GetColumnType ( unsigned int  aCol) const
inlineoverrideprotectedinherited

Return the type of data stored in the column as indicated by wxVariant::GetType()

Definition at line 311 of file lib_tree_model_adapter.h.

311 { return "string"; }

◆ GetContextMenuTool()

TOOL_INTERACTIVE * SYMBOL_TREE_SYNCHRONIZING_ADAPTER::GetContextMenuTool ( )
overridevirtual

Reimplemented from LIB_TREE_MODEL_ADAPTER.

Definition at line 50 of file symbol_tree_synchronizing_adapter.cpp.

51 {
53 }
LIB_CONTROL.
Definition: lib_control.h:39
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:74

References TOOL_MANAGER::GetTool(), TOOLS_HOLDER::GetToolManager(), and m_frame.

◆ GetFilter()

CMP_FILTER_TYPE LIB_TREE_MODEL_ADAPTER::GetFilter ( ) const
inlineinherited

Return the active filter.

Definition at line 151 of file lib_tree_model_adapter.h.

151 { return m_filter; }

References LIB_TREE_MODEL_ADAPTER::m_filter.

Referenced by SYMBOL_TREE_MODEL_ADAPTER::AddLibrary().

◆ GetItemCount()

int LIB_TREE_MODEL_ADAPTER::GetItemCount ( ) const
inherited

Return the number of components loaded in the tree.

Definition at line 341 of file lib_tree_model_adapter.cpp.

342 {
343  int n = 0;
344 
345  for( const std::unique_ptr<LIB_TREE_NODE>& lib: m_tree.m_Children )
346  n += lib->m_Children.size();
347 
348  return n;
349 }
PTR_VECTOR m_Children

References LIB_TREE_NODE::m_Children, and LIB_TREE_MODEL_ADAPTER::m_tree.

◆ GetLibrariesCount()

int SYMBOL_TREE_SYNCHRONIZING_ADAPTER::GetLibrariesCount ( ) const
overridevirtual

Return the number of libraries loaded in the tree.

Reimplemented from LIB_TREE_MODEL_ADAPTER.

Definition at line 129 of file symbol_tree_synchronizing_adapter.cpp.

130 {
132 
133  for( const wxString& libName : m_libMgr->GetLibraryNames() )
134  {
135  if( m_libHashes.count( libName ) == 0 )
136  ++count;
137  }
138 
139  return count;
140 }
virtual int GetLibrariesCount() const
Return the number of libraries loaded in the tree.
std::map< wxString, int > m_libHashes
Hashes to decide whether a library needs an update
wxArrayString GetLibraryNames() const
Returns the array of library names.

References LIB_TREE_MODEL_ADAPTER::GetLibrariesCount(), LIB_MANAGER::GetLibraryNames(), m_libHashes, and m_libMgr.

Referenced by Sync().

◆ GetParent()

wxDataViewItem LIB_TREE_MODEL_ADAPTER::GetParent ( wxDataViewItem const &  aItem) const
overrideprotectedinherited

Get the parent of an item.

Returns
parent of aItem, or an invalid wxDataViewItem if parent is root

Definition at line 415 of file lib_tree_model_adapter.cpp.

416 {
417  auto node = ToNode( aItem );
418  auto parent = node ? node->m_Parent : nullptr;
419 
420  // wxDataViewModel has no root node, but rather top-level elements have
421  // an invalid (null) parent.
422  if( !node || !parent || parent->m_Type == LIB_TREE_NODE::TYPE::ROOT )
423  return ToItem( nullptr );
424  else
425  return ToItem( parent );
426 }
static wxDataViewItem ToItem(LIB_TREE_NODE const *aNode)
Convert CMP_TREE_NODE -> wxDataViewItem.
static LIB_TREE_NODE * ToNode(wxDataViewItem aItem)
Convert wxDataViewItem -> CMP_TREE_NODE.

References LIB_TREE_MODEL_ADAPTER::ToItem(), and LIB_TREE_MODEL_ADAPTER::ToNode().

Referenced by LIB_TREE_MODEL_ADAPTER::UpdateSearchString().

◆ GetPinningSymbol()

const wxString LIB_TREE_MODEL_ADAPTER::GetPinningSymbol ( ) const
inlineprotectedinherited
Returns
a unicode string to mark a node name like a pinned library name This is not an ascii7 char, but a unicode char

Definition at line 349 of file lib_tree_model_adapter.h.

350  {
351  return wxString::FromUTF8( "☆ " );
352  }

Referenced by FP_TREE_SYNCHRONIZING_ADAPTER::GetValue(), and GetValue().

◆ GetProjectFileParameters()

std::vector< PARAM_CFG * > & LIB_TREE_MODEL_ADAPTER::GetProjectFileParameters ( )
inherited

◆ GetTreeNodeFor()

LIB_TREE_NODE * LIB_TREE_MODEL_ADAPTER::GetTreeNodeFor ( const wxDataViewItem &  aSelection) const
inherited

Definition at line 335 of file lib_tree_model_adapter.cpp.

336 {
337  return ToNode( aSelection );
338 }
static LIB_TREE_NODE * ToNode(wxDataViewItem aItem)
Convert wxDataViewItem -> CMP_TREE_NODE.

References LIB_TREE_MODEL_ADAPTER::ToNode().

◆ GetTypeFor()

LIB_TREE_NODE::TYPE LIB_TREE_MODEL_ADAPTER::GetTypeFor ( const wxDataViewItem &  aSelection) const
inherited

Return node type for the given item.

Parameters
aSelectionitem from the wxDataViewCtrl (see wxDataViewCtrl::GetSelection())
Returns
Type of the selected node, might be INVALID.

Definition at line 328 of file lib_tree_model_adapter.cpp.

329 {
330  const LIB_TREE_NODE* node = ToNode( aSelection );
331  return node ? node->m_Type : LIB_TREE_NODE::INVALID;
332 }
static LIB_TREE_NODE * ToNode(wxDataViewItem aItem)
Convert wxDataViewItem -> CMP_TREE_NODE.
Model class in the component selector Model-View-Adapter (mediated MVC) architecture.
enum TYPE m_Type

References LIB_TREE_NODE::INVALID, LIB_TREE_NODE::m_Type, and LIB_TREE_MODEL_ADAPTER::ToNode().

◆ GetUnitFor()

int LIB_TREE_MODEL_ADAPTER::GetUnitFor ( const wxDataViewItem &  aSelection) const
inherited

Return the unit for the given item.

Parameters
aSelectionitem from the wxDataViewCtrl (see wxDataViewCtrl::GetSelection())
Returns
Unit, or zero if the alias itself is selected. Return valid is invalid if GetAliasFor() returns nullptr.

Definition at line 321 of file lib_tree_model_adapter.cpp.

322 {
323  const LIB_TREE_NODE* node = ToNode( aSelection );
324  return node ? node->m_Unit : 0;
325 }
static LIB_TREE_NODE * ToNode(wxDataViewItem aItem)
Convert wxDataViewItem -> CMP_TREE_NODE.
Model class in the component selector Model-View-Adapter (mediated MVC) architecture.

References LIB_TREE_NODE::m_Unit, and LIB_TREE_MODEL_ADAPTER::ToNode().

◆ GetValue()

void SYMBOL_TREE_SYNCHRONIZING_ADAPTER::GetValue ( wxVariant &  aVariant,
wxDataViewItem const &  aItem,
unsigned int  aCol 
) const
overrideprotected

Definition at line 201 of file symbol_tree_synchronizing_adapter.cpp.

203 {
204  if( IsFrozen() )
205  {
206  aVariant = wxEmptyString;
207  return;
208  }
209 
210  LIB_TREE_NODE* node = ToNode( aItem );
211  wxASSERT( node );
212 
213  switch( aCol )
214  {
215  case 0:
216  if( m_frame->GetCurPart() && m_frame->GetCurPart()->GetLibId() == node->m_LibId )
218 
219  if( node->m_Pinned )
220  aVariant = GetPinningSymbol() + node->m_Name;
221  else
222  aVariant = node->m_Name;
223 
224  // mark modified items with an asterisk
225  if( node->m_Type == LIB_TREE_NODE::LIB )
226  {
227  if( m_libMgr->IsLibraryModified( node->m_Name ) )
228  aVariant = aVariant.GetString() + " *";
229  }
230  else if( node->m_Type == LIB_TREE_NODE::LIBID )
231  {
232  if( m_libMgr->IsPartModified( node->m_Name, node->m_Parent->m_Name ) )
233  aVariant = aVariant.GetString() + " *";
234  }
235 
236  break;
237 
238  case 1:
239  if( m_frame->GetCurPart() && m_frame->GetCurPart()->GetLibId() == node->m_LibId )
240  node->m_Desc = m_frame->GetCurPart()->GetDescription();
241 
242  aVariant = node->m_Desc;
243  break;
244 
245  default: // column == -1 is used for default Compare function
246  aVariant = node->m_Name;
247  break;
248  }
249 }
const UTF8 & GetLibItemName() const
Definition: lib_id.h:114
LIB_ID GetLibId() const override
LIB_PART * GetCurPart()
Return the current part being edited or NULL if none selected.
bool IsPartModified(const wxString &aAlias, const wxString &aLibrary) const
Returns true if part has unsaved modifications.
LIB_TREE_NODE * m_Parent
static LIB_TREE_NODE * ToNode(wxDataViewItem aItem)
Convert wxDataViewItem -> CMP_TREE_NODE.
wxString GetDescription() override
Model class in the component selector Model-View-Adapter (mediated MVC) architecture.
const wxString GetPinningSymbol() const
enum TYPE m_Type
bool IsLibraryModified(const wxString &aLibrary) const
Returns true if library has unsaved modifications.
wxString m_Name
wxString m_Desc

References LIB_EDIT_FRAME::GetCurPart(), LIB_PART::GetDescription(), LIB_PART::GetLibId(), LIB_ID::GetLibItemName(), LIB_TREE_MODEL_ADAPTER::GetPinningSymbol(), LIB_TREE_MODEL_ADAPTER::IsFrozen(), LIB_MANAGER::IsLibraryModified(), LIB_MANAGER::IsPartModified(), LIB_TREE_NODE::LIB, LIB_TREE_NODE::LIBID, LIB_TREE_NODE::m_Desc, m_frame, LIB_TREE_NODE::m_LibId, m_libMgr, LIB_TREE_NODE::m_Name, LIB_TREE_NODE::m_Parent, LIB_TREE_NODE::m_Pinned, LIB_TREE_NODE::m_Type, and LIB_TREE_MODEL_ADAPTER::ToNode().

◆ HasContainerColumns()

bool LIB_TREE_MODEL_ADAPTER::HasContainerColumns ( wxDataViewItem const &  aItem) const
overrideprotectedinherited

Check whether a container has columns too.

Definition at line 402 of file lib_tree_model_adapter.cpp.

403 {
404  return IsContainer( aItem );
405 }
bool IsContainer(wxDataViewItem const &aItem) const override
Check whether an item can have children.

References LIB_TREE_MODEL_ADAPTER::IsContainer().

◆ IntoArray()

unsigned int LIB_TREE_MODEL_ADAPTER::IntoArray ( LIB_TREE_NODE const &  aNode,
wxDataViewItemArray &  aChildren 
)
staticprotectedinherited

Convert CMP_TREE_NODE's children to wxDataViewItemArray.

Definition at line 59 of file lib_tree_model_adapter.cpp.

61 {
62  unsigned int n = 0;
63 
64  for( auto const& child: aNode.m_Children )
65  {
66  if( child->m_Score > 0 )
67  {
68  aChildren.Add( ToItem( &*child ) );
69  ++n;
70  }
71  }
72 
73  return n;
74 }
static wxDataViewItem ToItem(LIB_TREE_NODE const *aNode)
Convert CMP_TREE_NODE -> wxDataViewItem.

References LIB_TREE_NODE::m_Children, and LIB_TREE_MODEL_ADAPTER::ToItem().

Referenced by LIB_TREE_MODEL_ADAPTER::GetChildren().

◆ IsContainer()

bool SYMBOL_TREE_SYNCHRONIZING_ADAPTER::IsContainer ( const wxDataViewItem &  aItem) const
override

Definition at line 56 of file symbol_tree_synchronizing_adapter.cpp.

57 {
58  const LIB_TREE_NODE* node = ToNode( aItem );
59  return node ? node->m_Type == LIB_TREE_NODE::LIB : true;
60 }
static LIB_TREE_NODE * ToNode(wxDataViewItem aItem)
Convert wxDataViewItem -> CMP_TREE_NODE.
Model class in the component selector Model-View-Adapter (mediated MVC) architecture.
enum TYPE m_Type

References LIB_TREE_NODE::LIB, LIB_TREE_NODE::m_Type, and LIB_TREE_MODEL_ADAPTER::ToNode().

◆ IsFrozen()

◆ RefreshTree()

void LIB_TREE_MODEL_ADAPTER::RefreshTree ( )
inherited

Definition at line 389 of file lib_tree_model_adapter.cpp.

390 {
391  // Yes, this is an enormous hack. But it works on all platforms, it doesn't suffer
392  // the On^2 sorting issues that ItemChanged() does on OSX, and it doesn't lose the
393  // user's scroll position (which re-attaching or deleting/re-inserting columns does).
394  static int walk = 1;
395 
396  m_col_part->SetWidth( m_col_part->GetWidth() + walk );
397  m_col_desc->SetWidth( m_col_desc->GetWidth() - walk );
398  walk = -walk;
399 }

References LIB_TREE_MODEL_ADAPTER::m_col_desc, and LIB_TREE_MODEL_ADAPTER::m_col_part.

◆ SaveColWidths()

void LIB_TREE_MODEL_ADAPTER::SaveColWidths ( )
inherited

Save the column widths to the config file.

This requires the tree view to still be valid.

Definition at line 104 of file lib_tree_model_adapter.cpp.

105 {
106  if( m_widget )
107  {
108  auto cfg = Kiface().KifaceSettings();
109  cfg->m_LibTree.column_width = m_widget->GetColumn( PART_COL )->GetWidth();
110  }
111  else
112  {
113  wxLogDebug( "Error saving column size, tree view doesn't exist" );
114  }
115 }
APP_SETTINGS_BASE * KifaceSettings() const
Definition: kiface_i.h:103
KIFACE_I & Kiface()
Global KIFACE_I "get" accessor.

References APP_SETTINGS_BASE::LIB_TREE::column_width, Kiface(), KIFACE_I::KifaceSettings(), APP_SETTINGS_BASE::m_LibTree, LIB_TREE_MODEL_ADAPTER::m_widget, and LIB_TREE_MODEL_ADAPTER::PART_COL.

◆ SavePinnedItems()

void LIB_TREE_MODEL_ADAPTER::SavePinnedItems ( )
inherited

Definition at line 129 of file lib_tree_model_adapter.cpp.

130 {
131  m_pinnedLibs.clear();
132 
133  for( auto& child: m_tree.m_Children )
134  {
135  if( child->m_Pinned )
136  m_pinnedLibs.push_back( child->m_LibId.GetLibNickname() );
137  }
138 
139  m_parent->Kiway().Prj().ConfigSave( Kiface().KifaceSearch(), m_parent->GetName(),
141 }
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
std::vector< PARAM_CFG * > & GetProjectFileParameters()
VTBL_ENTRY PROJECT & Prj() const
Function Prj returns the PROJECT associated with this KIWAY.
Definition: kiway.cpp:171
KIFACE_I & Kiface()
Global KIFACE_I "get" accessor.
VTBL_ENTRY void ConfigSave(const SEARCH_STACK &aSList, const wxString &aGroupName, const std::vector< PARAM_CFG * > &aParams, const wxString &aFileName=wxEmptyString)
Function ConfigSave saves the current "project" parameters into the wxConfigBase* derivative.
Definition: project.cpp:362
PTR_VECTOR m_Children

References PROJECT::ConfigSave(), LIB_TREE_MODEL_ADAPTER::GetProjectFileParameters(), Kiface(), KIWAY_HOLDER::Kiway(), LIB_TREE_NODE::m_Children, LIB_TREE_MODEL_ADAPTER::m_parent, LIB_TREE_MODEL_ADAPTER::m_pinnedLibs, LIB_TREE_MODEL_ADAPTER::m_tree, and KIWAY::Prj().

◆ SetFilter()

void LIB_TREE_MODEL_ADAPTER::SetFilter ( CMP_FILTER_TYPE  aFilter)
inherited

Set the component filter type.

Must be set before adding libraries

Parameters
aFilterif CMP_FILTER_POWER, only power parts are loaded

Definition at line 144 of file lib_tree_model_adapter.cpp.

145 {
146  m_filter = aFilter;
147 }

References LIB_TREE_MODEL_ADAPTER::m_filter.

◆ SetPreselectNode()

void LIB_TREE_MODEL_ADAPTER::SetPreselectNode ( LIB_ID const &  aLibId,
int  aUnit 
)
inherited

Set the component name to be selected if there are no search results.

May be set at any time; updates at the next UpdateSearchString().

Parameters
aLibIdsymbol LIB_ID to be selected
aUnitunit to be selected, if > 0 (0 selects the alias itself)

Definition at line 156 of file lib_tree_model_adapter.cpp.

157 {
158  m_preselect_lib_id = aLibId;
159  m_preselect_unit = aUnit;
160 }

References LIB_TREE_MODEL_ADAPTER::m_preselect_lib_id, and LIB_TREE_MODEL_ADAPTER::m_preselect_unit.

◆ SetValue()

bool LIB_TREE_MODEL_ADAPTER::SetValue ( wxVariant const &  aVariant,
wxDataViewItem const &  aItem,
unsigned int  aCol 
)
inlineoverrideprotectedinherited

Set the value of an item.

Does nothing - this model doesn't support editing.

Definition at line 328 of file lib_tree_model_adapter.h.

330  { return false; }

◆ ShowUnits()

void LIB_TREE_MODEL_ADAPTER::ShowUnits ( bool  aShow)
inherited

Whether or not to show units.

May be set at any time; updates at the next UpdateSearchString()

Parameters
aShowif true, units are displayed

Definition at line 150 of file lib_tree_model_adapter.cpp.

151 {
152  m_show_units = aShow;
153 }

References LIB_TREE_MODEL_ADAPTER::m_show_units.

◆ Sync()

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

Definition at line 65 of file symbol_tree_synchronizing_adapter.cpp.

67 {
68  wxLongLong nextUpdate = wxGetUTCTimeMillis() + (PROGRESS_INTERVAL_MILLIS / 2);
69 
70  int libMgrHash = m_libMgr->GetHash();
71 
72  if( !aForce && m_lastSyncHash == libMgrHash )
73  return;
74 
75  m_lastSyncHash = libMgrHash;
76  int i = 0, max = GetLibrariesCount();
77 
78  // Process already stored libraries
79  for( auto it = m_tree.m_Children.begin(); it != m_tree.m_Children.end(); /* iteration inside */ )
80  {
81  const wxString& name = it->get()->m_Name;
82 
83  if( wxGetUTCTimeMillis() > nextUpdate )
84  {
85  aProgressCallback( i, max, name );
86  nextUpdate = wxGetUTCTimeMillis() + PROGRESS_INTERVAL_MILLIS;
87  }
88 
89  // There is a bug in LIB_MANAGER::LibraryExists() that uses the buffered modified
90  // libraries before the symbol library table which prevents the library from being
91  // removed from the tree control.
92  if( !m_libMgr->LibraryExists( name, true )
93  || !m_frame->Prj().SchSymbolLibTable()->HasLibrary( name, true ) )
94  {
95  it = deleteLibrary( it );
96  continue;
97  }
98  else if( m_libMgr->GetLibraryHash( name ) != m_libHashes[name] )
99  {
100  updateLibrary( *(LIB_TREE_NODE_LIB*) it->get() );
101  }
102 
103  ++it;
104  ++i;
105  }
106 
107  // Look for new libraries
108  for( const wxString& libName : m_libMgr->GetLibraryNames() )
109  {
110  if( m_libHashes.count( libName ) == 0 )
111  {
112  if( wxGetUTCTimeMillis() > nextUpdate )
113  {
114  aProgressCallback( i++, max, libName );
115  nextUpdate = wxGetUTCTimeMillis() + PROGRESS_INTERVAL_MILLIS;
116  }
117 
118  SYMBOL_LIB_TABLE_ROW* library = m_libMgr->GetLibrary( libName );
119  LIB_TREE_NODE_LIB& lib_node = DoAddLibraryNode( libName, library->GetDescr() );
120 
121  updateLibrary( lib_node );
122  }
123  }
124 
126 }
int m_lastSyncHash
LIB_MANAGER hash value returned in the last synchronization
Hold a record identifying a symbol library accessed by the appropriate symbol library SCH_PLUGIN obje...
std::map< wxString, int > m_libHashes
Hashes to decide whether a library needs an update
int GetLibrariesCount() const override
Return the number of libraries loaded in the tree.
const wxString & GetDescr() const
Return the description of the library referenced by this row.
int GetLibraryHash(const wxString &aLibrary) const
Returns a library hash value to determine if it has changed.
Definition: lib_manager.cpp:89
#define PROGRESS_INTERVAL_MILLIS
PROJECT & Prj() const
Function Prj returns a reference to the PROJECT "associated with" this KIWAY.
Node type: library.
int GetHash() const
Definition: lib_manager.cpp:78
wxArrayString GetLibraryNames() const
Returns the array of library names.
SYMBOL_LIB_TABLE_ROW * GetLibrary(const wxString &aLibrary) const
Finds a single library within the (aggregate) library table.
LIB_TREE_NODE_LIB & DoAddLibraryNode(wxString const &aNodeName, wxString const &aDesc)
LIB_TREE_NODE::PTR_VECTOR::iterator deleteLibrary(LIB_TREE_NODE::PTR_VECTOR::iterator &aLibNodeIt)
void AssignIntrinsicRanks(bool presorted=false)
Store intrinsic ranks on all children of this node.
const char * name
Definition: DXF_plotter.cpp:60
bool LibraryExists(const wxString &aLibrary, bool aCheckEnabled=false) const
Returns true if library exists.
PTR_VECTOR m_Children

References LIB_TREE_NODE::AssignIntrinsicRanks(), deleteLibrary(), LIB_TREE_MODEL_ADAPTER::DoAddLibraryNode(), LIB_TABLE_ROW::GetDescr(), LIB_MANAGER::GetHash(), GetLibrariesCount(), LIB_MANAGER::GetLibrary(), LIB_MANAGER::GetLibraryHash(), LIB_MANAGER::GetLibraryNames(), LIB_MANAGER::LibraryExists(), LIB_TREE_NODE::m_Children, m_frame, m_lastSyncHash, m_libHashes, m_libMgr, LIB_TREE_MODEL_ADAPTER::m_tree, name, KIWAY_HOLDER::Prj(), PROGRESS_INTERVAL_MILLIS, and updateLibrary().

Referenced by LIB_MANAGER::Sync().

◆ Thaw()

void LIB_TREE_MODEL_ADAPTER::Thaw ( )
inlineinherited

◆ ToItem()

wxDataViewItem LIB_TREE_MODEL_ADAPTER::ToItem ( LIB_TREE_NODE const *  aNode)
staticprotectedinherited

Convert CMP_TREE_NODE -> wxDataViewItem.

Definition at line 41 of file lib_tree_model_adapter.cpp.

42 {
43  return wxDataViewItem( const_cast<void*>( static_cast<void const*>( aNode ) ) );
44 }

Referenced by LIB_TREE_MODEL_ADAPTER::FindItem(), LIB_TREE_MODEL_ADAPTER::GetParent(), and LIB_TREE_MODEL_ADAPTER::IntoArray().

◆ ToNode()

◆ updateLibrary()

void SYMBOL_TREE_SYNCHRONIZING_ADAPTER::updateLibrary ( LIB_TREE_NODE_LIB aLibNode)
protected

Definition at line 143 of file symbol_tree_synchronizing_adapter.cpp.

144 {
145  auto hashIt = m_libHashes.find( aLibNode.m_Name );
146 
147  if( hashIt == m_libHashes.end() )
148  {
149  // add a new library
150  for( LIB_PART* alias : m_libMgr->GetAliases( aLibNode.m_Name ) )
151  aLibNode.AddItem( alias );
152  }
153  else if( hashIt->second != m_libMgr->GetLibraryHash( aLibNode.m_Name ) )
154  {
155  // update an existing library
156  std::list<LIB_PART*> aliases = m_libMgr->GetAliases( aLibNode.m_Name );
157 
158  // remove the common part from the aliases list
159  for( auto nodeIt = aLibNode.m_Children.begin(); nodeIt != aLibNode.m_Children.end(); )
160  {
161  auto aliasIt = std::find_if( aliases.begin(), aliases.end(),
162  [&] ( const LIB_PART* a ) {
163  return a->GetName() == (*nodeIt)->m_Name;
164  } );
165 
166  if( aliasIt != aliases.end() )
167  {
168  // alias exists both in the component tree and the library manager,
169  // update only the node data
170  static_cast<LIB_TREE_NODE_LIB_ID*>( nodeIt->get() )->Update( *aliasIt );
171  aliases.erase( aliasIt );
172  ++nodeIt;
173  }
174  else
175  {
176  // node does not exist in the library manager, remove the corresponding node
177  nodeIt = aLibNode.m_Children.erase( nodeIt );
178  }
179  }
180 
181  // now the aliases list contains only new aliases that need to be added to the tree
182  for( LIB_PART* alias : aliases )
183  aLibNode.AddItem( alias );
184  }
185 
186  aLibNode.AssignIntrinsicRanks();
187  m_libHashes[aLibNode.m_Name] = m_libMgr->GetLibraryHash( aLibNode.m_Name );
188 }
std::list< LIB_PART * > GetAliases(const wxString &aLibrary) const
std::map< wxString, int > m_libHashes
Hashes to decide whether a library needs an update
int GetLibraryHash(const wxString &aLibrary) const
Returns a library hash value to determine if it has changed.
Definition: lib_manager.cpp:89
LIB_TREE_NODE_LIB_ID & AddItem(LIB_TREE_ITEM *aItem)
Construct a new alias node, add it to this library, and return it.
Define a library symbol object.
void AssignIntrinsicRanks(bool presorted=false)
Store intrinsic ranks on all children of this node.
wxString m_Name
PTR_VECTOR m_Children

References LIB_TREE_NODE_LIB::AddItem(), LIB_TREE_NODE::AssignIntrinsicRanks(), LIB_MANAGER::GetAliases(), LIB_MANAGER::GetLibraryHash(), LIB_TREE_NODE::m_Children, m_libHashes, m_libMgr, and LIB_TREE_NODE::m_Name.

Referenced by Sync().

◆ UpdateSearchString()

void LIB_TREE_MODEL_ADAPTER::UpdateSearchString ( wxString const &  aSearch)
inherited

Set the search string provided by the user.

Parameters
aSearchfull, unprocessed search text

Definition at line 187 of file lib_tree_model_adapter.cpp.

188 {
189  m_tree.ResetScore();
190 
191  for( auto& child: m_tree.m_Children )
192  {
193  if( child->m_Pinned )
194  child->m_Score *= 2;
195  }
196 
197  wxStringTokenizer tokenizer( aSearch );
198 
199  while( tokenizer.HasMoreTokens() )
200  {
201  const wxString term = tokenizer.GetNextToken().Lower();
202  EDA_COMBINED_MATCHER matcher( term );
203 
204  m_tree.UpdateScore( matcher );
205  }
206 
207  m_tree.SortNodes();
208 
209  {
210  wxWindowUpdateLocker updateLock( m_widget );
211 
212  // Even with the updateLock, wxWidgets sometimes ties its knickers in
213  // a knot when trying to run a wxdataview_selection_changed_callback()
214  // on a row that has been deleted.
215  // https://bugs.launchpad.net/kicad/+bug/1756255
216  m_widget->UnselectAll();
217 
218  Cleared();
219 
220 #ifdef __WXGTK__
221  // The fastest method to update wxDataViewCtrl is to rebuild from
222  // scratch by calling Cleared(). Linux requires to reassociate model to
223  // display data, but Windows will create multiple associations.
224  // On MacOS, this crashes kicad. See https://gitlab.com/kicad/code/kicad/issues/3666
225  // and https://gitlab.com/kicad/code/kicad/issues/3653
226  AttachTo( m_widget );
227 #endif
228  }
229 
230  LIB_TREE_NODE* bestMatch = ShowResults();
231 
232  if( !bestMatch )
233  bestMatch = ShowPreselect();
234 
235  if( !bestMatch )
236  bestMatch = ShowSingleLibrary();
237 
238  if( bestMatch )
239  {
240  auto item = wxDataViewItem( bestMatch );
241  m_widget->Select( item );
242 
243  // Make sure the *parent* item is visible. The selected item is the
244  // first (shown) child of the parent. So it's always right below the parent,
245  // and this way the user can also see what library the selected part belongs to,
246  // without having a case where the selection is off the screen (unless the
247  // window is a single row high, which is unlikely)
248  //
249  // This also happens to circumvent https://bugs.launchpad.net/kicad/+bug/1804400
250  // which appears to be a GTK+3 bug.
251  {
252  wxDataViewItem parent = GetParent( item );
253 
254  if( parent.IsOk() )
255  item = parent;
256  }
257 
258  m_widget->EnsureVisible( item );
259  }
260 }
void SortNodes()
Sort child nodes quickly and recursively (IntrinsicRanks must have been set).
LIB_TREE_NODE * ShowResults()
Find and expand successful search results.
LIB_TREE_NODE * ShowPreselect()
Find and expand preselected node.
wxDataViewItem GetParent(wxDataViewItem const &aItem) const override
Get the parent of an item.
void ResetScore()
Initialize score to kLowestDefaultScore, recursively.
Model class in the component selector Model-View-Adapter (mediated MVC) architecture.
virtual void UpdateScore(EDA_COMBINED_MATCHER &aMatcher) override
Update the score for this part.
LIB_TREE_NODE * ShowSingleLibrary()
Find and expand a library if there is only one.
PTR_VECTOR m_Children
void AttachTo(wxDataViewCtrl *aDataViewCtrl)
Attach to a wxDataViewCtrl and initialize it.

References LIB_TREE_MODEL_ADAPTER::AttachTo(), LIB_TREE_MODEL_ADAPTER::GetParent(), LIB_TREE_NODE::m_Children, LIB_TREE_MODEL_ADAPTER::m_tree, LIB_TREE_MODEL_ADAPTER::m_widget, LIB_TREE_NODE::ResetScore(), LIB_TREE_MODEL_ADAPTER::ShowPreselect(), LIB_TREE_MODEL_ADAPTER::ShowResults(), LIB_TREE_MODEL_ADAPTER::ShowSingleLibrary(), LIB_TREE_NODE::SortNodes(), and LIB_TREE_NODE_ROOT::UpdateScore().

Member Data Documentation

◆ m_frame

LIB_EDIT_FRAME* SYMBOL_TREE_SYNCHRONIZING_ADAPTER::m_frame
protected

Definition at line 61 of file symbol_tree_synchronizing_adapter.h.

Referenced by GetContextMenuTool(), GetValue(), and Sync().

◆ m_lastSyncHash

int SYMBOL_TREE_SYNCHRONIZING_ADAPTER::m_lastSyncHash
protected

LIB_MANAGER hash value returned in the last synchronization

Definition at line 68 of file symbol_tree_synchronizing_adapter.h.

Referenced by Sync().

◆ m_libHashes

std::map<wxString, int> SYMBOL_TREE_SYNCHRONIZING_ADAPTER::m_libHashes
protected

Hashes to decide whether a library needs an update

Definition at line 65 of file symbol_tree_synchronizing_adapter.h.

Referenced by deleteLibrary(), GetLibrariesCount(), Sync(), and updateLibrary().

◆ m_libMgr

LIB_MANAGER* SYMBOL_TREE_SYNCHRONIZING_ADAPTER::m_libMgr
protected

◆ m_tree


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