From 34e075e112a41b304cf298b4882d68353619bdfc Mon Sep 17 00:00:00 2001 From: Jeff Young Date: Sun, 3 Aug 2025 20:13:58 +0100 Subject: [PATCH] Rework libtree SearchTerms to honour shownColumns. Fixes https://gitlab.com/kicad/code/kicad/-/issues/21419 --- common/design_block_tree_model_adapter.cpp | 2 +- common/lib_tree_model.cpp | 22 ++++++++++++++++--- common/lib_tree_model_adapter.cpp | 5 ++++- common/widgets/lib_tree.cpp | 3 +++ eeschema/lib_symbol.cpp | 8 ------- eeschema/symbol_tree_model_adapter.cpp | 2 +- .../symbol_tree_synchronizing_adapter.cpp | 4 ++-- include/lib_tree_model.h | 10 ++++++++- include/lib_tree_model_adapter.h | 10 +++++++-- pcbnew/fp_tree_model_adapter.cpp | 2 +- pcbnew/fp_tree_synchronizing_adapter.cpp | 4 ++-- 11 files changed, 50 insertions(+), 22 deletions(-) diff --git a/common/design_block_tree_model_adapter.cpp b/common/design_block_tree_model_adapter.cpp index 31c3a1f6e2..0a4d1fa544 100644 --- a/common/design_block_tree_model_adapter.cpp +++ b/common/design_block_tree_model_adapter.cpp @@ -79,7 +79,7 @@ void DESIGN_BLOCK_TREE_MODEL_ADAPTER::AddLibraries( EDA_BASE_FRAME* aParent ) DoAddLibrary( libName, library->GetDescr(), getDesignBlocks( aParent, libName ), pinned, true ); } - m_tree.AssignIntrinsicRanks(); + m_tree.AssignIntrinsicRanks( m_shownColumns ); } diff --git a/common/lib_tree_model.cpp b/common/lib_tree_model.cpp index 08a9fe2ba1..2e43b14bd3 100644 --- a/common/lib_tree_model.cpp +++ b/common/lib_tree_model.cpp @@ -23,6 +23,7 @@ #include #include +#include #include #include #include @@ -30,8 +31,23 @@ -void LIB_TREE_NODE::AssignIntrinsicRanks( bool presorted ) +void LIB_TREE_NODE::RebuildSearchTerms( const std::vector& aShownColumns ) { + m_SearchTerms = m_sourceSearchTerms; + + for( const auto& [name, value] : m_Fields ) + { + if( alg::contains( aShownColumns, name ) ) + m_SearchTerms.push_back( SEARCH_TERM( value, 4 ) ); + } +} + + +void LIB_TREE_NODE::AssignIntrinsicRanks( const std::vector& aShownColumns, bool presorted ) +{ + for( std::unique_ptr& child: m_Children ) + child->RebuildSearchTerms( aShownColumns ); + std::vector sort_buf; if( presorted ) @@ -174,7 +190,7 @@ LIB_TREE_NODE_ITEM::LIB_TREE_NODE_ITEM( LIB_TREE_NODE* aParent, LIB_TREE_ITEM* a aItem->GetChooserFields( m_Fields ); - m_SearchTerms = aItem->GetSearchTerms(); + m_sourceSearchTerms = aItem->GetSearchTerms(); m_IsRoot = aItem->IsRoot(); @@ -204,7 +220,7 @@ void LIB_TREE_NODE_ITEM::Update( LIB_TREE_ITEM* aItem ) aItem->GetChooserFields( m_Fields ); - m_SearchTerms = aItem->GetSearchTerms(); + m_sourceSearchTerms = aItem->GetSearchTerms(); m_IsRoot = aItem->IsRoot(); m_Children.clear(); diff --git a/common/lib_tree_model_adapter.cpp b/common/lib_tree_model_adapter.cpp index 778fdcbede..6ce110aa24 100644 --- a/common/lib_tree_model_adapter.cpp +++ b/common/lib_tree_model_adapter.cpp @@ -242,7 +242,7 @@ LIB_TREE_NODE_LIBRARY& LIB_TREE_MODEL_ADAPTER::DoAddLibrary( const wxString& aNo for( LIB_TREE_ITEM* item: aItemList ) lib_node.AddItem( item ); - lib_node.AssignIntrinsicRanks( presorted ); + lib_node.AssignIntrinsicRanks( m_shownColumns, presorted ); return lib_node; } @@ -453,6 +453,9 @@ void LIB_TREE_MODEL_ADAPTER::SetShownColumns( const std::vector& aColu if( recreate && m_widget ) recreateColumns(); + + for( std::unique_ptr& lib: m_tree.m_Children ) + lib->AssignIntrinsicRanks( m_shownColumns ); } diff --git a/common/widgets/lib_tree.cpp b/common/widgets/lib_tree.cpp index 940741daca..c225f86636 100644 --- a/common/widgets/lib_tree.cpp +++ b/common/widgets/lib_tree.cpp @@ -1012,7 +1012,10 @@ void LIB_TREE::onHeaderContextMenu( wxDataViewEvent& aEvent ) m_adapter->GetShownColumns() ); if( dlg.ShowModal() == wxID_OK ) + { m_adapter->SetShownColumns( dlg.EnabledList() ); + Regenerate( true ); + } } m_previewDisabled = false; diff --git a/eeschema/lib_symbol.cpp b/eeschema/lib_symbol.cpp index 21f15ae188..8e460f2e97 100644 --- a/eeschema/lib_symbol.cpp +++ b/eeschema/lib_symbol.cpp @@ -50,13 +50,6 @@ std::vector LIB_SYMBOL::GetSearchTerms() while( keywordTokenizer.HasMoreTokens() ) terms.emplace_back( SEARCH_TERM( keywordTokenizer.GetNextToken(), 4 ) ); - // TODO(JE) rework this later so we can highlight matches in their column - std::map fields; - GetChooserFields( fields ); - - for( const auto& [ name, text ] : fields ) - terms.emplace_back( SEARCH_TERM( text, 4 ) ); - // Also include keywords as one long string, just in case terms.emplace_back( SEARCH_TERM( GetKeyWords(), 1 ) ); terms.emplace_back( SEARCH_TERM( GetDescription(), 1 ) ); @@ -113,7 +106,6 @@ LIB_SYMBOL::LIB_SYMBOL( const wxString& aName, LIB_SYMBOL* aParent, SYMBOL_LIB* { SCH_FIELD* field = new SCH_FIELD( this, id ); field->SetVisible( visible ); - field->SetShowInChooser( false ); m_drawings[SCH_FIELD_T].push_back( field ); }; diff --git a/eeschema/symbol_tree_model_adapter.cpp b/eeschema/symbol_tree_model_adapter.cpp index 4ae5f833ec..7a7a7715b0 100644 --- a/eeschema/symbol_tree_model_adapter.cpp +++ b/eeschema/symbol_tree_model_adapter.cpp @@ -189,7 +189,7 @@ bool SYMBOL_TREE_MODEL_ADAPTER::AddLibraries( const std::vector& aNick KIID::CreateNilUuids( false ); - m_tree.AssignIntrinsicRanks(); + m_tree.AssignIntrinsicRanks( m_shownColumns ); if( progressReporter ) { diff --git a/eeschema/symbol_tree_synchronizing_adapter.cpp b/eeschema/symbol_tree_synchronizing_adapter.cpp index 04bb2f6dbd..a5ebc13454 100644 --- a/eeschema/symbol_tree_synchronizing_adapter.cpp +++ b/eeschema/symbol_tree_synchronizing_adapter.cpp @@ -136,7 +136,7 @@ void SYMBOL_TREE_SYNCHRONIZING_ADAPTER::Sync( const wxString& aForceRefresh, } } - m_tree.AssignIntrinsicRanks(); + m_tree.AssignIntrinsicRanks( m_shownColumns ); } @@ -198,7 +198,7 @@ void SYMBOL_TREE_SYNCHRONIZING_ADAPTER::updateLibrary( LIB_TREE_NODE_LIBRARY& aL aLibNode.AddItem( symbol ); } - aLibNode.AssignIntrinsicRanks(); + aLibNode.AssignIntrinsicRanks( m_shownColumns ); m_libHashes[aLibNode.m_Name] = m_libMgr->GetLibraryHash( aLibNode.m_Name ); } diff --git a/include/lib_tree_model.h b/include/lib_tree_model.h index 2387cc498f..6f6e1c7d62 100644 --- a/include/lib_tree_model.h +++ b/include/lib_tree_model.h @@ -83,11 +83,16 @@ public: virtual void UpdateScore( const std::vector>& aMatchers, std::function* aFilter ) = 0; + /** + * Rebuild search terms from source search terms and shown fields. + */ + void RebuildSearchTerms( const std::vector& aShownColumns ); + /** * Store intrinsic ranks on all children of this node. See m_IntrinsicRank * member doc for more information. */ - void AssignIntrinsicRanks( bool presorted = false ); + void AssignIntrinsicRanks( const std::vector& aShownColumns, bool presorted = false ); /** * Sort child nodes quickly and recursively (IntrinsicRanks must have been set). @@ -142,6 +147,9 @@ public: bool m_IsRecentlyUsedGroup; bool m_IsAlreadyPlacedGroup; + +protected: + std::vector m_sourceSearchTerms; }; diff --git a/include/lib_tree_model_adapter.h b/include/lib_tree_model_adapter.h index 665b3f88d3..430cd7488d 100644 --- a/include/lib_tree_model_adapter.h +++ b/include/lib_tree_model_adapter.h @@ -204,7 +204,13 @@ public: /** * Sort the tree and assign ranks after adding libraries. */ - void AssignIntrinsicRanks() { m_tree.AssignIntrinsicRanks(); } + void AssignIntrinsicRanks() + { + m_tree.AssignIntrinsicRanks( m_shownColumns ); + + for( const std::unique_ptr& child : m_tree.m_Children ) + child->AssignIntrinsicRanks( m_shownColumns ); + } /** * Set the search string provided by the user. @@ -418,6 +424,7 @@ protected: std::vector m_availableColumns; wxDataViewCtrl* m_widget; + std::vector m_shownColumns; // Stored in display order private: EDA_BASE_FRAME* m_parent; @@ -434,7 +441,6 @@ private: std::vector m_columns; std::map m_colNameMap; std::map m_colWidths; - std::vector m_shownColumns; // Stored in display order }; #endif // LIB_TREE_MODEL_ADAPTER_H diff --git a/pcbnew/fp_tree_model_adapter.cpp b/pcbnew/fp_tree_model_adapter.cpp index 3ade89991e..7ff9d183dc 100644 --- a/pcbnew/fp_tree_model_adapter.cpp +++ b/pcbnew/fp_tree_model_adapter.cpp @@ -71,7 +71,7 @@ void FP_TREE_MODEL_ADAPTER::AddLibraries( EDA_BASE_FRAME* aParent ) DoAddLibrary( libName, library->GetDescr(), getFootprints( libName ), pinned, true ); } - m_tree.AssignIntrinsicRanks(); + m_tree.AssignIntrinsicRanks( m_shownColumns ); } diff --git a/pcbnew/fp_tree_synchronizing_adapter.cpp b/pcbnew/fp_tree_synchronizing_adapter.cpp index 46fa6c59ab..1c81573912 100644 --- a/pcbnew/fp_tree_synchronizing_adapter.cpp +++ b/pcbnew/fp_tree_synchronizing_adapter.cpp @@ -128,7 +128,7 @@ void FP_TREE_SYNCHRONIZING_ADAPTER::Sync( FP_LIB_TABLE* aLibs ) } if( m_libMap.size() > count ) - m_tree.AssignIntrinsicRanks(); + m_tree.AssignIntrinsicRanks( m_shownColumns ); } @@ -173,7 +173,7 @@ void FP_TREE_SYNCHRONIZING_ADAPTER::updateLibrary( LIB_TREE_NODE_LIBRARY& aLibNo for( LIB_TREE_ITEM* footprint : footprints ) aLibNode.AddItem( footprint ); - aLibNode.AssignIntrinsicRanks(); + aLibNode.AssignIntrinsicRanks( m_shownColumns ); m_libMap.insert( aLibNode.m_Name ); }