Show all library children if library name matches search

This commit is contained in:
Jon Evans 2024-04-02 18:51:19 -04:00
parent 53c2543474
commit a042d1aab4
2 changed files with 17 additions and 5 deletions

View File

@ -295,18 +295,18 @@ LIB_TREE_NODE_ITEM& LIB_TREE_NODE_LIBRARY::AddItem( LIB_TREE_ITEM* aItem )
void LIB_TREE_NODE_LIBRARY::UpdateScore( EDA_COMBINED_MATCHER* aMatcher, const wxString& aLib, void LIB_TREE_NODE_LIBRARY::UpdateScore( EDA_COMBINED_MATCHER* aMatcher, const wxString& aLib,
std::function<bool( LIB_TREE_NODE& aNode )>* aFilter ) std::function<bool( LIB_TREE_NODE& aNode )>* aFilter )
{ {
int newScore = 0; int maxChildScore = 0;
for( std::unique_ptr<LIB_TREE_NODE>& child: m_Children ) for( std::unique_ptr<LIB_TREE_NODE>& child: m_Children )
{ {
child->UpdateScore( aMatcher, aLib, aFilter ); child->UpdateScore( aMatcher, aLib, aFilter );
newScore = std::max( newScore, child->m_Score ); maxChildScore = std::max( maxChildScore, child->m_Score );
} }
// Each time UpdateScore is called for a library, child (item) scores may go up or down. // Each time UpdateScore is called for a library, child (item) scores may go up or down.
// If the all go down to zero, we need to make sure to drop the library from the list. // If the all go down to zero, we need to make sure to drop the library from the list.
if( newScore > 0 ) if( maxChildScore > 0 )
m_Score = std::max( m_Score, newScore ); m_Score = std::max( m_Score, maxChildScore );
else else
m_Score = 0; m_Score = 0;
@ -320,7 +320,17 @@ void LIB_TREE_NODE_LIBRARY::UpdateScore( EDA_COMBINED_MATCHER* aMatcher, const w
// aMatcher test is additive // aMatcher test is additive
if( aMatcher ) if( aMatcher )
m_Score += aMatcher->ScoreTerms( m_SearchTerms ); {
int ownScore = aMatcher->ScoreTerms( m_SearchTerms );
m_Score += ownScore;
// If we have a hit on a library, show all children in that library
if( maxChildScore <= 0 && ownScore > 0 )
{
for( std::unique_ptr<LIB_TREE_NODE>& child: m_Children )
child->ForceScore( 1 );
}
}
// show all nodes if no search/filter/etc. criteria are given // show all nodes if no search/filter/etc. criteria are given
if( m_Children.empty() && !aMatcher && aLib.IsEmpty() && ( !aFilter || (*aFilter)(*this) ) ) if( m_Children.empty() && !aMatcher && aLib.IsEmpty() && ( !aFilter || (*aFilter)(*this) ) )

View File

@ -89,6 +89,8 @@ public:
*/ */
virtual void ResetScore(); virtual void ResetScore();
virtual void ForceScore( int aScore ) { m_Score = aScore; }
/** /**
* Store intrinsic ranks on all children of this node. See m_IntrinsicRank * Store intrinsic ranks on all children of this node. See m_IntrinsicRank
* member doc for more information. * member doc for more information.