32#include <wx/tokenzr.h>
33#include <wx/wupdlock.h>
34#include <wx/settings.h>
61 wxSize size( GetOwner()->GetWidth(), GetTextExtent(
m_text ).y + 2 );
63#if defined( __WXGTK__ ) && !wxCHECK_VERSION( 3, 2, 7 )
71 size.IncTo( wxSize( 1, 1 ) );
77 bool GetValue( wxVariant& aValue )
const override
83 bool SetValue(
const wxVariant& aValue )
override
85 m_text = aValue.GetString();
89 void SetAttr(
const wxDataViewItemAttr& aAttr )
override
94 wxDataViewItemAttr realAttr = aAttr;
95 realAttr.SetStrikethrough(
false );
97 wxDataViewCustomRenderer::SetAttr( realAttr );
100 bool Render( wxRect aRect, wxDC *dc,
int aState )
override
102 RenderBackground( dc, aRect );
107 points[0] = aRect.GetTopLeft();
108 points[1] = aRect.GetTopRight() + wxPoint( -4, 0 );
109 points[2] = aRect.GetTopRight() + wxPoint( 0, aRect.GetHeight() / 2 );
110 points[3] = aRect.GetBottomRight() + wxPoint( -4, 1 );
111 points[4] = aRect.GetBottomLeft() + wxPoint( 0, 1 );
112 points[5] = aRect.GetTopLeft();
115 dc->DrawLines( 6, points );
124 if( aState & wxDATAVIEW_CELL_SELECTED )
125 dc->SetTextForeground( wxSystemSettings::GetColour( wxSYS_COLOUR_LISTBOXHIGHLIGHTTEXT ) );
127 RenderText(
m_text, 0, aRect, dc, 0 );
129 RenderText(
m_text, 0, aRect, dc, aState );
142 return wxDataViewItem(
const_cast<void*
>(
static_cast<void const*
>( aNode ) ) );
155 m_cfg( aSettingsStruct ),
180 return m_parent->GetToolDispatcher();
186 for(
const std::pair<const wxString, int>& pair :
m_cfg.column_widths )
204 std::vector<wxString> openLibs;
205 wxDataViewItem rootItem(
nullptr );
206 wxDataViewItemArray children;
210 for(
const wxDataViewItem& child : children )
213 openLibs.emplace_back(
ToNode( child )->m_LibId.GetLibNickname().wx_str() );
222 wxWindowUpdateLocker updateLock(
m_widget );
224 for(
const wxString& lib : aLibs )
239 m_cfg.column_widths.clear();
241 for(
const std::pair<const wxString, wxDataViewColumn*>& pair :
m_colNameMap )
244 m_cfg.column_widths[pair.first] = pair.second->GetWidth();
277 const std::vector<LIB_TREE_ITEM*>& aItemList,
278 bool pinned,
bool presorted )
296 m_tree.RemoveGroup( aRecentGroup, aPlacedGroup );
305 wxWindowUpdateLocker updateLock(
m_widget );
321 if( !aState && !aSearch.IsNull() &&
m_tree.m_Children.size() )
323 for( std::unique_ptr<LIB_TREE_NODE>& child:
m_tree.m_Children )
324 m_widget->Collapse( wxDataViewItem( &*child ) );
340 constexpr int MAX_TERMS = 100;
342 wxStringTokenizer tokenizer( aSearch,
" \t\r\n", wxTOKEN_STRTOK );
343 std::vector<std::unique_ptr<EDA_COMBINED_MATCHER>> termMatchers;
345 while( tokenizer.HasMoreTokens() && termMatchers.size() < MAX_TERMS )
347 wxString term = tokenizer.GetNextToken().Lower();
348 termMatchers.emplace_back( std::make_unique<EDA_COMBINED_MATCHER>( term,
CTX_LIBITEM ) );
378 wxDataViewItem item =
ToItem( firstMatch );
398 aDataViewCtrl->AssociateModel(
this );
422 doAddColumn( colName, colName == wxT(
"Description" ) );
467 for(
const std::unique_ptr<LIB_TREE_NODE>& lib:
m_tree.m_Children )
469 if( lib->m_IsRecentlyUsedGroup )
470 lib->m_Name = wxT(
"-- " ) +
_(
"Recently Used" ) + wxT(
" --" );
471 else if( lib->m_IsAlreadyPlacedGroup )
472 lib->m_Name = wxT(
"-- " ) +
_(
"Already Placed" ) + wxT(
" --" );
479 wxString translatedHeader = aTranslate ? wxGetTranslation( aHeader ) : aHeader;
492 wxDATAVIEW_CELL_INERT | (
int) wxDATAVIEW_COL_RESIZABLE );
495 col->SetMinWidth( headerMinWidth.x );
525 for( std::unique_ptr<LIB_TREE_NODE>& lib:
m_tree.m_Children )
540 return node ? node->
m_Unit : 0;
547 return node ? node->
m_Type : LIB_TREE_NODE::TYPE::INVALID;
553 return ToNode( aSelection );
561 for(
const std::unique_ptr<LIB_TREE_NODE>& lib:
m_tree.m_Children )
562 n += lib->m_Children.size();
570 for( std::unique_ptr<LIB_TREE_NODE>& lib:
m_tree.m_Children )
577 return ToItem( lib.get() );
579 for( std::unique_ptr<LIB_TREE_NODE>& alias: lib->m_Children )
582 return ToItem( alias.get() );
588 return wxDataViewItem();
599 wxDataViewItemArray& aChildren )
const
602 unsigned int count = 0;
604 if( node->
m_Type == LIB_TREE_NODE::TYPE::ROOT
605 || node->
m_Type == LIB_TREE_NODE::TYPE::LIBRARY
608 for( std::unique_ptr<LIB_TREE_NODE>
const& child: node->
m_Children )
610 if( child->m_Score > 0 )
612 aChildren.Add(
ToItem( &*child ) );
624 wxDataViewColumn* col =
nullptr;
629 for( ; idx <
m_columns.size() - 1; idx++ )
639 totalWidth += col->GetWidth();
642 int remainingWidth =
m_widget->GetSize().x - totalWidth;
656 std::vector<int> widths;
658 for(
const wxDataViewColumn* col :
m_columns )
659 widths.emplace_back( col->GetWidth() );
661 wxASSERT( widths.size() );
671 if( i >= widths.size() )
674 int width = widths[i++];
684 colIt->second += walk;
688 colIt->second -= walk;
692 if( colPtr ==
m_columns[0] || colPtr ==
nullptr )
723 if( !node || node->
m_Type == LIB_TREE_NODE::TYPE::INVALID )
729 if( !parent || parent->
m_Type == LIB_TREE_NODE::TYPE::ROOT )
737 unsigned int aCol )
const
741 aVariant = wxEmptyString;
764 if( key == wxT(
"Description" ) )
766 else if( node->
m_Fields.count( key ) )
769 valueStr = wxEmptyString;
775 valueStr.Replace( wxS(
"\n" ), wxS(
" " ) );
782 wxDataViewItemAttr& aAttr )
const
788 wxCHECK( node,
false );
790 if( node->
m_Type == LIB_TREE_NODE::TYPE::ITEM )
795 aAttr.SetItalic(
true );
806 for( std::unique_ptr<LIB_TREE_NODE>& node: aNode.
m_Children )
808 int r = f( node.get() );
828 if( n->
m_Type == LIB_TREE_NODE::TYPE::ITEM && n->
m_Score > 1 )
853 if( n->
m_Name.StartsWith(
"-- " ) )
856 if( n->
m_Type == LIB_TREE_NODE::TYPE::ITEM
864 else if( n->
m_Type == LIB_TREE_NODE::TYPE::UNIT
882 for(
const std::unique_ptr<LIB_TREE_NODE>& child :
m_tree.m_Children )
884 if( !child->m_Name.StartsWith(
"-- " ) )
894 if( n->
m_Type == LIB_TREE_NODE::TYPE::ITEM )
The base frame for deriving all KiCad main window classes.
A logical library item identifier and consists of various portions much like a URI.
const UTF8 & GetLibItemName() const
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
A mix-in to provide polymorphism between items stored in libraries (symbols, aliases and footprints).
LIB_TREE_MODEL_ADAPTER(EDA_BASE_FRAME *aParent, const wxString &aPinnedKey, APP_SETTINGS_BASE::LIB_TREE &aSettingsStruct)
Create the adapter.
void createMissingColumns()
std::vector< wxString > GetOpenLibs() const
int GetUnitFor(const wxDataViewItem &aSelection) const
Return the unit for the given item.
LIB_ID m_preselect_lib_id
static bool IsValidColumnWidth(int aWidth)
LIB_TREE_NODE::TYPE GetTypeFor(const wxDataViewItem &aSelection) const
Return node type for the given item.
APP_SETTINGS_BASE::LIB_TREE & m_cfg
bool GetAttr(const wxDataViewItem &aItem, unsigned int aCol, wxDataViewItemAttr &aAttr) const override
Get any formatting for an item.
LIB_TREE_NODE_ROOT m_tree
std::map< wxString, int > m_colWidths
const LIB_TREE_NODE * showResults()
Find and expand successful search results.
void FinishTreeInitialization()
A final-stage initialization to be called after the window hierarchy has been realized and the window...
void addColumnIfNecessary(const wxString &aHeader)
void PinLibrary(LIB_TREE_NODE *aTreeNode)
virtual PROJECT::LIB_TYPE_T getLibType()=0
virtual wxDataViewItem GetCurrentDataViewItem()
void SetPreselectNode(const LIB_ID &aLibId, int aUnit)
Set the symbol name to be selected if there are no search results.
static LIB_TREE_NODE * ToNode(wxDataViewItem aItem)
Convert wxDataViewItem -> #SYM_TREE_NODE.
LIB_ID GetAliasFor(const wxDataViewItem &aSelection) const
Return the alias for the given item.
~LIB_TREE_MODEL_ADAPTER()
Destructor.
TOOL_DISPATCHER * GetToolDispatcher() const
void AttachTo(wxDataViewCtrl *aDataViewCtrl)
Attach to a wxDataViewCtrl and initialize it.
void SetShownColumns(const std::vector< wxString > &aColumnNames)
Sets which columns are shown in the widget.
std::function< void()> m_lazyLoadHandler
static wxDataViewItem ToItem(const LIB_TREE_NODE *aNode)
Convert #SYM_TREE_NODE -> wxDataViewItem.
virtual void loadColumnConfig()
bool IsContainer(const wxDataViewItem &aItem) const override
Check whether an item can have children.
static const wxString GetPinningSymbol()
void ShowUnits(bool aShow)
Whether or not to show units.
LIB_TREE_NODE * GetTreeNodeFor(const wxDataViewItem &aSelection) const
unsigned int GetChildren(const wxDataViewItem &aItem, wxDataViewItemArray &aChildren) const override
Populate a list of all the children of an item.
void SaveSettings()
Save the column widths to the config file.
@ NAME_COL
Library or library item name column.
std::map< unsigned, wxString > m_colIdxMap
wxDataViewColumn * doAddColumn(const wxString &aHeader, bool aTranslate=true)
std::vector< wxDataViewColumn * > m_columns
std::vector< wxString > GetShownColumns() const
wxDataViewCtrl * m_widget
int GetItemCount() const
Return the number of symbols loaded in the tree.
void ShowChangedLanguage()
std::vector< wxString > m_shownColumns
void RemoveGroup(bool aRecentlyUsedGroup, bool aAlreadyPlacedGroup)
Remove one of the system groups from the library.
void GetValue(wxVariant &aVariant, const wxDataViewItem &aItem, unsigned int aCol) const override
Get the value of an item.
void UnpinLibrary(LIB_TREE_NODE *aTreeNode)
std::map< wxString, wxDataViewColumn * > m_colNameMap
bool HasContainerColumns(const wxDataViewItem &aItem) const override
Check whether a container has columns too.
wxDataViewItem GetParent(const wxDataViewItem &aItem) const override
Get the parent of an item.
LIB_TREE_NODE_LIBRARY & DoAddLibraryNode(const wxString &aNodeName, const wxString &aDesc, bool pinned)
std::vector< wxString > m_availableColumns
EDA_BASE_FRAME * m_parent
static constexpr int MAX_COL_WIDTH
Upper bound for a persisted column width; larger values are treated as corrupt settings.
LIB_TREE_NODE_LIBRARY & DoAddLibrary(const wxString &aNodeName, const wxString &aDesc, const std::vector< LIB_TREE_ITEM * > &aItemList, bool pinned, bool presorted)
Add the given list of symbols by alias.
wxDataViewItem FindItem(const LIB_ID &aLibId)
Returns tree item corresponding to part.
void UpdateSearchString(const wxString &aSearch, bool aState)
Set the search string provided by the user.
std::function< bool(LIB_TREE_NODE &aNode)> * m_filter
void OpenLibs(const std::vector< wxString > &aLibs)
LIB_TREE_NODE_ITEM & AddItem(LIB_TREE_ITEM *aItem)
Construct a new alias node, add it to this library, and return it.
Model class in the component selector Model-View-Adapter (mediated MVC) architecture.
std::map< wxString, wxString > m_Fields
List of weighted search terms.
void AssignIntrinsicRanks(const std::vector< wxString > &aShownColumns, bool presorted=false)
Store intrinsic ranks on all children of this node.
void SetAttr(const wxDataViewItemAttr &aAttr) override
bool SetValue(const wxVariant &aValue) override
wxSize GetSize() const override
bool GetValue(wxVariant &aValue) const override
bool Render(wxRect aRect, wxDC *dc, int aState) override
static void recursiveDescent(wxSizer *aSizer, std::map< int, wxString > &aLabels)
Base window classes and related definitions.
Abstract pattern-matching tool and implementations.
void recursiveDescent(LIB_TREE_NODE &aNode, const std::function< int(const LIB_TREE_NODE *)> &f)
static const int kDataViewIndent
KICOMMON_API 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...
wxString UnescapeString(const wxString &aSource)
std::vector< std::string > header
Functions to provide common constants and other functions to assist in making a consistent UI.
void EnsureVisibleIfEnabled(wxDataViewCtrl *aWidget, const wxDataViewItem &aItem)
Scroll aItem into view only when aWidget is currently enabled.