KiCad PCB EDA Suite
SYMBOL_TREE_MODEL_ADAPTER Class Reference

#include <symbol_tree_model_adapter.h>

Inheritance diagram for SYMBOL_TREE_MODEL_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

 ~SYMBOL_TREE_MODEL_ADAPTER ()
 Destructor. More...
 
void AddLibraries (const std::vector< wxString > &aNicknames, wxWindow *aParent)
 Add all the libraries in a SYMBOL_LIB_TABLE to the model. More...
 
void AddLibrary (wxString const &aLibNickname)
 
wxString GenerateInfo (LIB_ID const &aLibId, int aUnit) override
 
void SaveColWidths ()
 Save the column widths to the config file. More...
 
void SavePinnedItems ()
 
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
 
int GetItemCount () const
 Return the number of components loaded in the tree. More...
 
virtual int GetLibrariesCount () const
 Return the number of libraries 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 ()
 
virtual TOOL_INTERACTIVEGetContextMenuTool ()
 

Static Public Member Functions

static PTR Create (EDA_BASE_FRAME *aParent, LIB_TABLE *aLibs)
 Factory function: create a model adapter in a reference-counting container. More...
 

Protected Member Functions

 SYMBOL_TREE_MODEL_ADAPTER (EDA_BASE_FRAME *aParent, LIB_TABLE *aLibs)
 Constructor; takes a set of libraries to be included in the search. More...
 
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...
 
bool IsContainer (wxDataViewItem const &aItem) const override
 Check whether an item can have children. 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...
 
void GetValue (wxVariant &aVariant, wxDataViewItem const &aItem, unsigned int aCol) const override
 Get the value of an item. More...
 
bool SetValue (wxVariant const &aVariant, wxDataViewItem const &aItem, unsigned int aCol) override
 Set the value of an item. More...
 
bool GetAttr (wxDataViewItem const &aItem, unsigned int aCol, wxDataViewItemAttr &aAttr) const override
 Get any formatting for 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_TREE_NODE_ROOT m_tree
 

Private Attributes

SYMBOL_LIB_TABLEm_libs
 

Static Private Attributes

static bool m_show_progress = true
 Flag to only show the symbol library table load progress dialog the first time. More...
 

Detailed Description

Definition at line 30 of file symbol_tree_model_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_MODEL_ADAPTER()

SYMBOL_TREE_MODEL_ADAPTER::~SYMBOL_TREE_MODEL_ADAPTER ( )

Destructor.

Do NOT delete this class manually; it is reference-counted by wxObject.

Definition at line 51 of file symbol_tree_model_adapter.cpp.

52 {}

◆ SYMBOL_TREE_MODEL_ADAPTER()

SYMBOL_TREE_MODEL_ADAPTER::SYMBOL_TREE_MODEL_ADAPTER ( EDA_BASE_FRAME aParent,
LIB_TABLE aLibs 
)
protected

Constructor; takes a set of libraries to be included in the search.

Definition at line 45 of file symbol_tree_model_adapter.cpp.

45  :
46  LIB_TREE_MODEL_ADAPTER( aParent, "pinned_symbol_libs" ),
47  m_libs( (SYMBOL_LIB_TABLE*) aLibs )
48 {}
LIB_TREE_MODEL_ADAPTER(EDA_BASE_FRAME *aParent, wxString aPinnedKey)
Creates the adapter.

Referenced by Create().

Member Function Documentation

◆ AddLibraries()

void SYMBOL_TREE_MODEL_ADAPTER::AddLibraries ( const std::vector< wxString > &  aNicknames,
wxWindow *  aParent 
)

Add all the libraries in a SYMBOL_LIB_TABLE to the model.

Displays a progress dialog attached to the parent frame the first time it is run.

Parameters
aNicknamesis the list of library nicknames
aParentis the parent window to display the progress dialog

Definition at line 55 of file symbol_tree_model_adapter.cpp.

57 {
58  wxProgressDialog* prg = nullptr;
59  wxLongLong nextUpdate = wxGetUTCTimeMillis() + (PROGRESS_INTERVAL_MILLIS / 2);
60 
61  if( m_show_progress )
62  {
63  prg = new wxProgressDialog( _( "Loading Symbol Libraries" ), wxEmptyString,
64  aNicknames.size(), aParent );
65  }
66 
67  unsigned int ii = 0;
68 
69  for( const auto& nickname : aNicknames )
70  {
71  if( prg && wxGetUTCTimeMillis() > nextUpdate )
72  {
73  prg->Update( ii, wxString::Format( _( "Loading library \"%s\"" ), nickname ) );
74  nextUpdate = wxGetUTCTimeMillis() + PROGRESS_INTERVAL_MILLIS;
75  }
76 
77  AddLibrary( nickname );
78  ii++;
79  }
80 
82 
83  if( prg )
84  {
85  prg->Destroy();
86  m_show_progress = false;
87  }
88 }
void AddLibrary(wxString const &aLibNickname)
void AssignIntrinsicRanks(bool presorted=false)
Store intrinsic ranks on all children of this node.
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
static bool m_show_progress
Flag to only show the symbol library table load progress dialog the first time.
#define _(s)
Definition: 3d_actions.cpp:33
#define PROGRESS_INTERVAL_MILLIS

References _, AddLibrary(), LIB_TREE_NODE::AssignIntrinsicRanks(), Format(), m_show_progress, LIB_TREE_MODEL_ADAPTER::m_tree, and PROGRESS_INTERVAL_MILLIS.

◆ AddLibrary()

void SYMBOL_TREE_MODEL_ADAPTER::AddLibrary ( wxString const &  aLibNickname)

Definition at line 91 of file symbol_tree_model_adapter.cpp.

92 {
93  bool onlyPowerSymbols = ( GetFilter() == CMP_FILTER_POWER );
94  std::vector<LIB_PART*> symbols;
95  std::vector<LIB_TREE_ITEM*> comp_list;
96 
97  try
98  {
99  m_libs->LoadSymbolLib( symbols, aLibNickname, onlyPowerSymbols );
100  }
101  catch( const IO_ERROR& ioe )
102  {
103  wxLogError( wxString::Format( _( "Error loading symbol library %s.\n\n%s" ),
104  aLibNickname,
105  ioe.What() ) );
106  return;
107  }
108 
109  if( symbols.size() > 0 )
110  {
111  comp_list.assign( symbols.begin(), symbols.end() );
112  DoAddLibrary( aLibNickname, m_libs->GetDescription( aLibNickname ), comp_list, false );
113  }
114 }
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.
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:33
const wxString GetDescription(const wxString &aNickname)
void LoadSymbolLib(std::vector< LIB_PART * > &aAliasList, const wxString &aNickname, bool aPowerSymbolsOnly=false)
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
#define _(s)
Definition: 3d_actions.cpp:33
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
CMP_FILTER_TYPE GetFilter() const
Return the active filter.

References _, LIB_TREE_MODEL_ADAPTER::CMP_FILTER_POWER, LIB_TREE_MODEL_ADAPTER::DoAddLibrary(), Format(), LIB_TABLE::GetDescription(), LIB_TREE_MODEL_ADAPTER::GetFilter(), SYMBOL_LIB_TABLE::LoadSymbolLib(), m_libs, and IO_ERROR::What().

Referenced by AddLibraries().

◆ AssignIntrinsicRanks()

void LIB_TREE_MODEL_ADAPTER::AssignIntrinsicRanks ( )
inlineinherited

Sort the tree and assign ranks after adding libraries.

Definition at line 183 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 273 of file lib_tree_model_adapter.cpp.

274 {
275  wxString partHead = _( "Item" );
276  wxString descHead = _( "Description" );
277 
278  // The extent of the text doesn't take into account the space on either side
279  // in the header, so artificially pad it by M
280  wxSize partHeadMinWidth = GetTextSize( partHead + "M", aDataViewCtrl );
281 
282  if( aDataViewCtrl->GetColumnCount() > 0 )
283  {
284  int partWidth = aDataViewCtrl->GetColumn( PART_COL )->GetWidth();
285  int descWidth = aDataViewCtrl->GetColumn( DESC_COL )->GetWidth();
286 
287  // Only use the widths read back if they are non-zero.
288  // GTK returns the displayed width of the column, which is not calculated immediately
289  // this leads to cases of 0 column width if the user types too fast in the filter
290  if( descWidth > 0 )
291  {
292  m_colWidths[PART_COL] = partWidth;
293  m_colWidths[DESC_COL] = descWidth;
294  }
295  }
296 
297  m_widget = aDataViewCtrl;
298  aDataViewCtrl->SetIndent( kDataViewIndent );
299  aDataViewCtrl->AssociateModel( this );
300  aDataViewCtrl->ClearColumns();
301 
302  m_col_part = aDataViewCtrl->AppendTextColumn( partHead, PART_COL, wxDATAVIEW_CELL_INERT,
304  m_col_desc = aDataViewCtrl->AppendTextColumn( descHead, DESC_COL, wxDATAVIEW_CELL_INERT,
306 
307  // Ensure the part column is wider than the smallest allowable width
308  if( m_colWidths[PART_COL] < partHeadMinWidth.x )
309  {
310  m_colWidths[PART_COL] = partHeadMinWidth.x;
311  m_col_part->SetWidth( partHeadMinWidth.x );
312  }
313 
314  m_col_part->SetMinWidth( partHeadMinWidth.x );
315 }
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:268
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()

SYMBOL_TREE_MODEL_ADAPTER::PTR SYMBOL_TREE_MODEL_ADAPTER::Create ( EDA_BASE_FRAME aParent,
LIB_TABLE aLibs 
)
static

Factory function: create a model adapter in a reference-counting container.

Parameters
aLibslibrary set from which parts will be loaded

Definition at line 38 of file symbol_tree_model_adapter.cpp.

40 {
41  return PTR( new SYMBOL_TREE_MODEL_ADAPTER( aParent, aLibs ) );
42 }
SYMBOL_TREE_MODEL_ADAPTER(EDA_BASE_FRAME *aParent, LIB_TABLE *aLibs)
Constructor; takes a set of libraries to be included in the search.
wxObjectDataPtr< LIB_TREE_MODEL_ADAPTER > PTR
Reference-counting container for a pointer to CMP_TREE_MODEL_ADAPTER_BASE.

References SYMBOL_TREE_MODEL_ADAPTER().

Referenced by LIB_VIEW_FRAME::OnSelectSymbol(), and SCH_BASE_FRAME::SelectCompFromLibTree().

◆ 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 180 of file lib_tree_model_adapter.cpp.

183 {
184  LIB_TREE_NODE_LIB& lib_node = DoAddLibraryNode( aNodeName, aDesc );
185 
186  for( LIB_TREE_ITEM* item: aItemList )
187  lib_node.AddItem( item );
188 
189  lib_node.AssignIntrinsicRanks( presorted );
190 }
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(), 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 169 of file lib_tree_model_adapter.cpp.

171 {
172  LIB_TREE_NODE_LIB& lib_node = m_tree.AddLib( aNodeName, aDesc );
173 
174  lib_node.m_Pinned = m_pinnedLibs.Index( lib_node.m_LibId.GetLibNickname() ) != wxNOT_FOUND;
175 
176  return lib_node;
177 }
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 SYMBOL_TREE_SYNCHRONIZING_ADAPTER::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 362 of file lib_tree_model_adapter.cpp.

363 {
364  for( auto& lib: m_tree.m_Children )
365  {
366  if( lib->m_Name != aLibId.GetLibNickname() )
367  continue;
368 
369  // if part name is not specified, return the library node
370  if( aLibId.GetLibItemName() == "" )
371  return ToItem( lib.get() );
372 
373  for( auto& alias: lib->m_Children )
374  {
375  if( alias->m_Name == aLibId.GetLibItemName() )
376  return ToItem( alias.get() );
377  }
378 
379  break; // could not find the part in the requested library
380  }
381 
382  return wxDataViewItem();
383 }
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()

wxString SYMBOL_TREE_MODEL_ADAPTER::GenerateInfo ( LIB_ID const &  aLibId,
int  aUnit 
)
overridevirtual

Reimplemented from LIB_TREE_MODEL_ADAPTER.

Definition at line 117 of file symbol_tree_model_adapter.cpp.

118 {
119  return GenerateAliasInfo( m_libs, aLibId, aUnit );
120 }
wxString GenerateAliasInfo(SYMBOL_LIB_TABLE *aSymLibTable, LIB_ID const &aLibId, int aUnit)
Return an HTML page describing a LIB_ID in a SYMBOL_LIB_TABLE.

References GenerateAliasInfo(), and m_libs.

◆ 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 318 of file lib_tree_model_adapter.cpp.

319 {
320  const LIB_TREE_NODE* node = ToNode( aSelection );
321 
322  LIB_ID emptyId;
323 
324  if( !node )
325  return emptyId;
326 
327  return node->m_LibId;
328 }
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 LIB_TREE_MODEL_ADAPTER::GetAttr ( wxDataViewItem const &  aItem,
unsigned int  aCol,
wxDataViewItemAttr &  aAttr 
) const
overrideprotectedinherited

Get any formatting for an item.

Parameters
aItemitem to get formatting for
aColcolumn number of interest
aAttrreceiver for attributes
Returns
true iff the item has non-default attributes

Definition at line 482 of file lib_tree_model_adapter.cpp.

485 {
486  if( IsFrozen() )
487  return false;
488 
489  auto node = ToNode( aItem );
490  wxASSERT( node );
491 
492  if( node->m_Type != LIB_TREE_NODE::LIBID )
493  {
494  // Currently only aliases are formatted at all
495  return false;
496  }
497 
498  if( !node->m_IsRoot && aCol == 0 )
499  {
500  // Names of non-root aliases are italicized
501  aAttr.SetItalic( true );
502  return true;
503  }
504  else
505  {
506  return false;
507  }
508 }
static LIB_TREE_NODE * ToNode(wxDataViewItem aItem)
Convert wxDataViewItem -> CMP_TREE_NODE.

References LIB_TREE_MODEL_ADAPTER::IsFrozen(), LIB_TREE_NODE::LIBID, 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 386 of file lib_tree_model_adapter.cpp.

388 {
389  auto node = ( aItem.IsOk() ? ToNode( aItem ) : &m_tree );
390 
391  if( node->m_Type != LIB_TREE_NODE::TYPE::LIBID
392  || ( m_show_units && node->m_Type == LIB_TREE_NODE::TYPE::LIBID ) )
393  return IntoArray( *node, aChildren );
394  else
395  return 0;
396 }
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 309 of file lib_tree_model_adapter.h.

309 { 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 314 of file lib_tree_model_adapter.h.

314 { return "string"; }

◆ GetContextMenuTool()

virtual TOOL_INTERACTIVE* LIB_TREE_MODEL_ADAPTER::GetContextMenuTool ( )
inlinevirtualinherited

Reimplemented in SYMBOL_TREE_SYNCHRONIZING_ADAPTER, and FP_TREE_SYNCHRONIZING_ADAPTER.

Definition at line 274 of file lib_tree_model_adapter.h.

274 { return nullptr; }

◆ GetFilter()

CMP_FILTER_TYPE LIB_TREE_MODEL_ADAPTER::GetFilter ( ) const
inlineinherited

Return the active filter.

Definition at line 149 of file lib_tree_model_adapter.h.

149 { return m_filter; }

References LIB_TREE_MODEL_ADAPTER::m_filter.

Referenced by AddLibrary().

◆ GetItemCount()

int LIB_TREE_MODEL_ADAPTER::GetItemCount ( ) const
inherited

Return the number of components loaded in the tree.

Definition at line 351 of file lib_tree_model_adapter.cpp.

352 {
353  int n = 0;
354 
355  for( const std::unique_ptr<LIB_TREE_NODE>& lib: m_tree.m_Children )
356  n += lib->m_Children.size();
357 
358  return n;
359 }
PTR_VECTOR m_Children

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

◆ GetLibrariesCount()

virtual int LIB_TREE_MODEL_ADAPTER::GetLibrariesCount ( ) const
inlinevirtualinherited

Return the number of libraries loaded in the tree.

Reimplemented in SYMBOL_TREE_SYNCHRONIZING_ADAPTER, and FP_TREE_SYNCHRONIZING_ADAPTER.

Definition at line 243 of file lib_tree_model_adapter.h.

244  {
245  return m_tree.m_Children.size();
246  }
PTR_VECTOR m_Children

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

Referenced by SYMBOL_TREE_SYNCHRONIZING_ADAPTER::GetLibrariesCount().

◆ 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 439 of file lib_tree_model_adapter.cpp.

440 {
441  if( m_freeze )
442  return ToItem( nullptr );
443 
444  auto node = ToNode( aItem );
445  auto parent = node ? node->m_Parent : nullptr;
446 
447  // wxDataViewModel has no root node, but rather top-level elements have
448  // an invalid (null) parent.
449  if( !node || !parent || parent->m_Type == LIB_TREE_NODE::TYPE::ROOT )
450  return ToItem( nullptr );
451  else
452  return ToItem( parent );
453 }
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::m_freeze, 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 352 of file lib_tree_model_adapter.h.

353  {
354  return wxString::FromUTF8( "☆ " );
355  }

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

◆ GetTreeNodeFor()

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

Definition at line 345 of file lib_tree_model_adapter.cpp.

346 {
347  return ToNode( aSelection );
348 }
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 338 of file lib_tree_model_adapter.cpp.

339 {
340  const LIB_TREE_NODE* node = ToNode( aSelection );
341  return node ? node->m_Type : LIB_TREE_NODE::INVALID;
342 }
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 331 of file lib_tree_model_adapter.cpp.

332 {
333  const LIB_TREE_NODE* node = ToNode( aSelection );
334  return node ? node->m_Unit : 0;
335 }
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 LIB_TREE_MODEL_ADAPTER::GetValue ( wxVariant &  aVariant,
wxDataViewItem const &  aItem,
unsigned int  aCol 
) const
overrideprotectedinherited

Get the value of an item.

Parameters
aVariantwxVariant to receive the data
aItemitem whose data will be placed into aVariant
aColcolumn number of the data

Definition at line 456 of file lib_tree_model_adapter.cpp.

459 {
460  if( IsFrozen() )
461  {
462  aVariant = wxEmptyString;
463  return;
464  }
465 
466  auto node = ToNode( aItem );
467  wxASSERT( node );
468 
469  switch( aCol )
470  {
471  default: // column == -1 is used for default Compare function
472  case 0:
473  aVariant = node->m_Name;
474  break;
475  case 1:
476  aVariant = node->m_Desc;
477  break;
478  }
479 }
static LIB_TREE_NODE * ToNode(wxDataViewItem aItem)
Convert wxDataViewItem -> CMP_TREE_NODE.

References LIB_TREE_MODEL_ADAPTER::IsFrozen(), 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 426 of file lib_tree_model_adapter.cpp.

427 {
428  return IsContainer( aItem );
429 }
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 LIB_TREE_MODEL_ADAPTER::IsContainer ( wxDataViewItem const &  aItem) const
overrideprotectedinherited

Check whether an item can have children.

Definition at line 432 of file lib_tree_model_adapter.cpp.

433 {
434  auto node = ToNode( aItem );
435  return node ? node->m_Children.size() : true;
436 }
static LIB_TREE_NODE * ToNode(wxDataViewItem aItem)
Convert wxDataViewItem -> CMP_TREE_NODE.

References LIB_TREE_MODEL_ADAPTER::ToNode().

Referenced by LIB_TREE_MODEL_ADAPTER::HasContainerColumns().

◆ IsFrozen()

◆ RefreshTree()

void LIB_TREE_MODEL_ADAPTER::RefreshTree ( )
inherited

Definition at line 399 of file lib_tree_model_adapter.cpp.

400 {
401  // Yes, this is an enormous hack. But it works on all platforms, it doesn't suffer
402  // the On^2 sorting issues that ItemChanged() does on OSX, and it doesn't lose the
403  // user's scroll position (which re-attaching or deleting/re-inserting columns does).
404  static int walk = 1;
405 
406  int partWidth = m_col_part->GetWidth();
407  int descWidth = m_col_desc->GetWidth();
408 
409  // Only use the widths read back if they are non-zero.
410  // GTK returns the displayed width of the column, which is not calculated immediately
411  if( descWidth > 0 )
412  {
413  m_colWidths[PART_COL] = partWidth;
414  m_colWidths[DESC_COL] = descWidth;
415  }
416 
417  m_colWidths[PART_COL] += walk;
418  m_colWidths[DESC_COL] -= walk;
419 
420  m_col_part->SetWidth( m_colWidths[PART_COL] );
421  m_col_desc->SetWidth( m_colWidths[DESC_COL] );
422  walk = -walk;
423 }

References LIB_TREE_MODEL_ADAPTER::DESC_COL, LIB_TREE_MODEL_ADAPTER::m_col_desc, LIB_TREE_MODEL_ADAPTER::m_col_part, LIB_TREE_MODEL_ADAPTER::m_colWidths, and LIB_TREE_MODEL_ADAPTER::PART_COL.

◆ 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 112 of file lib_tree_model_adapter.cpp.

113 {
114  if( m_widget )
115  {
116  auto cfg = Kiface().KifaceSettings();
117  cfg->m_LibTree.column_width = m_widget->GetColumn( PART_COL )->GetWidth();
118  }
119  else
120  {
121  wxLogDebug( "Error saving column size, tree view doesn't exist" );
122  }
123 }
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 126 of file lib_tree_model_adapter.cpp.

127 {
128  PROJECT_FILE& project = m_parent->Kiway().Prj().GetProjectFile();
129 
130  std::vector<wxString>& entries = ( m_pinnedKey == "pinned_symbol_libs" ) ?
131  project.m_PinnedSymbolLibs :
132  project.m_PinnedFootprintLibs;
133 
134  entries.clear();
135  m_pinnedLibs.clear();
136 
137  for( auto& child: m_tree.m_Children )
138  {
139  if( child->m_Pinned )
140  {
141  m_pinnedLibs.push_back( child->m_LibId.GetLibNickname() );
142  entries.push_back( child->m_LibId.GetLibNickname() );
143  }
144  }
145 
146 
147 }
std::vector< wxString > m_PinnedSymbolLibs
Below are project-level settings that have not been moved to a dedicated file.
Definition: project_file.h:122
std::vector< wxString > m_PinnedFootprintLibs
The list of pinned footprint libraries.
Definition: project_file.h:125
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
VTBL_ENTRY PROJECT & Prj() const
Function Prj returns the PROJECT associated with this KIWAY.
Definition: kiway.cpp:172
PROJECT_FILE is the backing store for a PROJECT, in JSON format.
Definition: project_file.h:61
VTBL_ENTRY PROJECT_FILE & GetProjectFile() const
Definition: project.h:129
PTR_VECTOR m_Children

References PROJECT::GetProjectFile(), KIWAY_HOLDER::Kiway(), LIB_TREE_NODE::m_Children, LIB_TREE_MODEL_ADAPTER::m_parent, PROJECT_FILE::m_PinnedFootprintLibs, LIB_TREE_MODEL_ADAPTER::m_pinnedKey, LIB_TREE_MODEL_ADAPTER::m_pinnedLibs, PROJECT_FILE::m_PinnedSymbolLibs, 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 150 of file lib_tree_model_adapter.cpp.

151 {
152  m_filter = aFilter;
153 }

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 162 of file lib_tree_model_adapter.cpp.

163 {
164  m_preselect_lib_id = aLibId;
165  m_preselect_unit = aUnit;
166 }

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 331 of file lib_tree_model_adapter.h.

333  { 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 156 of file lib_tree_model_adapter.cpp.

157 {
158  m_show_units = aShow;
159 }

References LIB_TREE_MODEL_ADAPTER::m_show_units.

◆ 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()

◆ 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 193 of file lib_tree_model_adapter.cpp.

194 {
195  m_tree.ResetScore();
196 
197  for( auto& child: m_tree.m_Children )
198  {
199  if( child->m_Pinned )
200  child->m_Score *= 2;
201  }
202 
203  wxStringTokenizer tokenizer( aSearch );
204 
205  while( tokenizer.HasMoreTokens() )
206  {
207  const wxString term = tokenizer.GetNextToken().Lower();
208  EDA_COMBINED_MATCHER matcher( term );
209 
210  m_tree.UpdateScore( matcher );
211  }
212 
213  m_tree.SortNodes();
214 
215  {
216  wxWindowUpdateLocker updateLock( m_widget );
217 
218  Freeze();
219  // Even with the updateLock, wxWidgets sometimes ties its knickers in
220  // a knot when trying to run a wxdataview_selection_changed_callback()
221  // on a row that has been deleted.
222  // https://bugs.launchpad.net/kicad/+bug/1756255
223  m_widget->UnselectAll();
224 
225  Cleared();
226  Thaw();
227 
228  // This was fixed in wxWidgets 3.0.5 and 3.1.3.
229 #if defined( __WXGTK__ ) && ( (wxVERSION_NUMBER < 030005 ) || \
230  ( ( wxVERSION_NUMBER >= 030100 ) && ( wxVERSION_NUMBER < 030103 ) ) )
231  // The fastest method to update wxDataViewCtrl is to rebuild from
232  // scratch by calling Cleared(). Linux requires to reassociate model to
233  // display data, but Windows will create multiple associations.
234  // On MacOS, this crashes kicad. See https://gitlab.com/kicad/code/kicad/issues/3666
235  // and https://gitlab.com/kicad/code/kicad/issues/3653
236  AttachTo( m_widget );
237 #endif
238  }
239 
240  LIB_TREE_NODE* bestMatch = ShowResults();
241 
242  if( !bestMatch )
243  bestMatch = ShowPreselect();
244 
245  if( !bestMatch )
246  bestMatch = ShowSingleLibrary();
247 
248  if( bestMatch )
249  {
250  auto item = wxDataViewItem( bestMatch );
251  m_widget->Select( item );
252 
253  // Make sure the *parent* item is visible. The selected item is the
254  // first (shown) child of the parent. So it's always right below the parent,
255  // and this way the user can also see what library the selected part belongs to,
256  // without having a case where the selection is off the screen (unless the
257  // window is a single row high, which is unlikely)
258  //
259  // This also happens to circumvent https://bugs.launchpad.net/kicad/+bug/1804400
260  // which appears to be a GTK+3 bug.
261  {
262  wxDataViewItem parent = GetParent( item );
263 
264  if( parent.IsOk() )
265  item = parent;
266  }
267 
268  m_widget->EnsureVisible( item );
269  }
270 }
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::Freeze(), 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(), LIB_TREE_MODEL_ADAPTER::Thaw(), and LIB_TREE_NODE_ROOT::UpdateScore().

Member Data Documentation

◆ m_libs

SYMBOL_LIB_TABLE* SYMBOL_TREE_MODEL_ADAPTER::m_libs
private

Definition at line 70 of file symbol_tree_model_adapter.h.

Referenced by AddLibrary(), and GenerateInfo().

◆ m_show_progress

bool SYMBOL_TREE_MODEL_ADAPTER::m_show_progress = true
staticprivate

Flag to only show the symbol library table load progress dialog the first time.

Definition at line 68 of file symbol_tree_model_adapter.h.

Referenced by AddLibraries().

◆ m_tree


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