KiCad PCB EDA Suite
Loading...
Searching...
No Matches
lib_tree_model_adapter.h
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2017 Chris Pavlina <[email protected]>
5 * Copyright (C) 2014 Henner Zeller <[email protected]>
6 * Copyright (C) 2023 CERN
7 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
8 *
9 * This program is free software: you can redistribute it and/or modify it
10 * under the terms of the GNU General Public License as published by the
11 * Free Software Foundation, either version 3 of the License, or (at your
12 * option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License along
20 * with this program. If not, see <http://www.gnu.org/licenses/>.
21 */
22
23#ifndef LIB_TREE_MODEL_ADAPTER_H
24#define LIB_TREE_MODEL_ADAPTER_H
25
26#include <eda_base_frame.h>
27#include <lib_id.h>
28#include <lib_tree_model.h>
30#include <wx/hashmap.h>
31#include <wx/dataview.h>
32#include <wx/headerctrl.h>
33#include <vector>
34#include <functional>
35#include <set>
36#include <map>
37
95
96#include <project.h>
97
98;
100class EDA_BASE_FRAME;
101
102
103class LIB_TREE_MODEL_ADAPTER: public wxDataViewModel
104{
105public:
110 static const wxString GetPinningSymbol()
111 {
112 return wxString::FromUTF8( "☆ " );
113 }
114
115public:
121
131
137
142 void SaveSettings();
143
147 void SetFilter( std::function<bool( LIB_TREE_NODE& aNode )>* aFilter ) { m_filter = aFilter; }
148
152 std::function<bool( LIB_TREE_NODE& aNode )>* GetFilter() const { return m_filter; }
153
154 void SetSortMode( SORT_MODE aMode ) { m_sort_mode = aMode; }
156
163 void ShowUnits( bool aShow );
164
172 void SetPreselectNode( const LIB_ID& aLibId, int aUnit );
173
182 LIB_TREE_NODE_LIBRARY& DoAddLibrary( const wxString& aNodeName, const wxString& aDesc,
183 const std::vector<LIB_TREE_ITEM*>& aItemList,
184 bool pinned, bool presorted );
185
189 void RemoveGroup( bool aRecentlyUsedGroup, bool aAlreadyPlacedGroup );
190
191 std::vector<wxString> GetAvailableColumns() const { return m_availableColumns; }
192
193 std::vector<wxString> GetShownColumns() const { return m_shownColumns; }
194
195 std::vector<wxString> GetOpenLibs() const;
196 void OpenLibs( const std::vector<wxString>& aLibs );
197
199 void RegisterLazyLoadHandler( std::function<void()>&& aHandler )
200 {
201 m_lazyLoadHandler = aHandler;
202 }
203
208 void SetShownColumns( const std::vector<wxString>& aColumnNames );
209
214 {
215 m_tree.AssignIntrinsicRanks( m_shownColumns );
216
217 for( const std::unique_ptr<LIB_TREE_NODE>& child : m_tree.m_Children )
218 child->AssignIntrinsicRanks( m_shownColumns );
219 }
220
227 void UpdateSearchString( const wxString& aSearch, bool aState );
228
235 void AttachTo( wxDataViewCtrl* aDataViewCtrl );
236
242
251 LIB_ID GetAliasFor( const wxDataViewItem& aSelection ) const;
252
262 int GetUnitFor( const wxDataViewItem& aSelection ) const;
263
272 LIB_TREE_NODE::TYPE GetTypeFor( const wxDataViewItem& aSelection ) const;
273
274 LIB_TREE_NODE* GetTreeNodeFor( const wxDataViewItem& aSelection ) const;
275
276 virtual wxString GenerateInfo( const LIB_ID& aLibId, int aUnit ) { return wxEmptyString; }
277
278 virtual bool HasPreview( const wxDataViewItem& aItem ) { return false; }
279 virtual void ShowPreview( wxWindow* aParent, const wxDataViewItem& aItem ) {}
280 virtual void ShutdownPreview( wxWindow* aParent ) {}
281
282 TOOL_DISPATCHER* GetToolDispatcher() const { return m_parent->GetToolDispatcher(); }
283
287 int GetItemCount() const;
288
292 virtual int GetLibrariesCount() const
293 {
294 return m_tree.m_Children.size();
295 }
296
303 wxDataViewItem FindItem( const LIB_ID& aLibId );
304
305 virtual wxDataViewItem GetCurrentDataViewItem();
306
312 unsigned int GetChildren( const wxDataViewItem& aItem,
313 wxDataViewItemArray& aChildren ) const override;
314
315 // Freezing/Thawing. Used when updating the table model so that we don't try and fetch
316 // values during updating. Primarily a problem on OSX which doesn't pay attention to the
317 // wxDataViewCtrl's freeze count when updating the keyWindow.
318 void Freeze() { m_freeze++; }
319 void Thaw() { m_freeze--; }
320 bool IsFrozen() const { return m_freeze; }
321
322 void RefreshTree();
323
324 // Allows subclasses to nominate a context menu handler.
325 virtual TOOL_INTERACTIVE* GetContextMenuTool() { return nullptr; }
326
327 void PinLibrary( LIB_TREE_NODE* aTreeNode );
328 void UnpinLibrary( LIB_TREE_NODE* aTreeNode );
329
330 void ShowChangedLanguage();
331
332protected:
336 static wxDataViewItem ToItem( const LIB_TREE_NODE* aNode );
337
341 static LIB_TREE_NODE* ToNode( wxDataViewItem aItem );
342
350 LIB_TREE_MODEL_ADAPTER( EDA_BASE_FRAME* aParent, const wxString& aPinnedKey,
351 APP_SETTINGS_BASE::LIB_TREE& aSettingsStruct );
352
353 LIB_TREE_NODE_LIBRARY& DoAddLibraryNode( const wxString& aNodeName, const wxString& aDesc,
354 bool pinned );
355
359 bool HasContainerColumns( const wxDataViewItem& aItem ) const override;
360
364 bool IsContainer( const wxDataViewItem& aItem ) const override;
365
371 wxDataViewItem GetParent( const wxDataViewItem& aItem ) const override;
372
373 unsigned int GetColumnCount() const override { return m_columns.size(); }
374
378 wxString GetColumnType( unsigned int aCol ) const override { return "string"; }
379
387 void GetValue( wxVariant& aVariant,
388 const wxDataViewItem& aItem,
389 unsigned int aCol ) const override;
390
395 bool SetValue( const wxVariant& aVariant,
396 const wxDataViewItem& aItem,
397 unsigned int aCol ) override { return false; }
398
407 bool GetAttr( const wxDataViewItem& aItem,
408 unsigned int aCol,
409 wxDataViewItemAttr& aAttr ) const override;
410
412
413 void resortTree();
414
415private:
419 const LIB_TREE_NODE* ShowResults();
420
421 wxDataViewColumn* doAddColumn( const wxString& aHeader, bool aTranslate = true );
422
423protected:
424 void addColumnIfNecessary( const wxString& aHeader );
425
426 void recreateColumns();
428
430 std::map<unsigned, wxString> m_colIdxMap;
431 std::vector<wxString> m_availableColumns;
432
433 wxDataViewCtrl* m_widget;
434 std::vector<wxString> m_shownColumns; // Stored in display order
435 std::function<void()> m_lazyLoadHandler;
436
437private:
440
446
447 std::function<bool( LIB_TREE_NODE& aNode )>* m_filter;
448
449 std::vector<wxDataViewColumn*> m_columns;
450 std::map<wxString, wxDataViewColumn*> m_colNameMap;
451 std::map<wxString, int> m_colWidths;
452};
453
454#endif // LIB_TREE_MODEL_ADAPTER_H
455
The base frame for deriving all KiCad main window classes.
A logical library item identifier and consists of various portions much like a URI.
Definition lib_id.h:49
wxString GetColumnType(unsigned int aCol) const override
Return the type of data stored in the column as indicated by wxVariant::GetType()
LIB_TREE_MODEL_ADAPTER(EDA_BASE_FRAME *aParent, const wxString &aPinnedKey, APP_SETTINGS_BASE::LIB_TREE &aSettingsStruct)
Create the adapter.
std::vector< wxString > GetOpenLibs() const
int GetUnitFor(const wxDataViewItem &aSelection) const
Return the unit for the given item.
LIB_TREE_NODE::TYPE GetTypeFor(const wxDataViewItem &aSelection) const
Return node type for the given item.
void SetSortMode(SORT_MODE aMode)
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.
std::map< wxString, int > m_colWidths
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 void ShutdownPreview(wxWindow *aParent)
virtual TOOL_INTERACTIVE * GetContextMenuTool()
virtual wxString GenerateInfo(const LIB_ID &aLibId, int aUnit)
void RegisterLazyLoadHandler(std::function< void()> &&aHandler)
Registers a function to be called whenever new lazy-loaded library content is available.
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.
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.
bool IsContainer(const wxDataViewItem &aItem) const override
Check whether an item can have children.
static const wxString GetPinningSymbol()
void AssignIntrinsicRanks()
Sort the tree and assign ranks after adding libraries.
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.
TREE_COLS
This enum defines the order of the default columns in the tree view.
@ NUM_COLS
The number of default tree columns.
@ NAME_COL
Library or library item name column.
@ DESC_COL
Library or library description column.
std::function< bool(LIB_TREE_NODE &aNode)> * GetFilter() const
Return the active filter.
std::map< unsigned, wxString > m_colIdxMap
wxDataViewColumn * doAddColumn(const wxString &aHeader, bool aTranslate=true)
virtual bool HasPreview(const wxDataViewItem &aItem)
std::vector< wxDataViewColumn * > m_columns
virtual int GetLibrariesCount() const
Return the number of libraries loaded in the tree.
std::vector< wxString > GetShownColumns() const
int GetItemCount() const
Return the number of symbols loaded in the tree.
const LIB_TREE_NODE * ShowResults()
Find and expand successful search results.
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.
bool SetValue(const wxVariant &aVariant, const wxDataViewItem &aItem, unsigned int aCol) override
Set the value of an item.
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
unsigned int GetColumnCount() const override
std::vector< wxString > GetAvailableColumns() const
virtual void ShowPreview(wxWindow *aParent, const wxDataViewItem &aItem)
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.
void SetFilter(std::function< bool(LIB_TREE_NODE &aNode)> *aFilter)
Set the filter.
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)
Node type: library.
Node type: root.
Model class in the component selector Model-View-Adapter (mediated MVC) architecture.
Base window classes and related definitions.