2017-03-06 09:50:48 -05:00
|
|
|
/*
|
|
|
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
2023-11-08 12:29:14 +00:00
|
|
|
*
|
2017-03-06 09:50:48 -05:00
|
|
|
* Copyright (C) 2017 Chris Pavlina <pavlina.chris@gmail.com>
|
|
|
|
* Copyright (C) 2014 Henner Zeller <h.zeller@acm.org>
|
2023-11-08 12:29:14 +00:00
|
|
|
* Copyright (C) 2023 CERN
|
2025-01-01 13:30:11 -08:00
|
|
|
* Copyright The KiCad Developers, see AUTHORS.txt for contributors.
|
2017-03-06 09:50:48 -05:00
|
|
|
*
|
|
|
|
* This program is free software: you can redistribute it and/or modify it
|
|
|
|
* under the terms of the GNU General Public License as published by the
|
|
|
|
* Free Software Foundation, either version 3 of the License, or (at your
|
|
|
|
* option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful, but
|
|
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License along
|
|
|
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
2018-07-27 21:47:51 +01:00
|
|
|
#include <lib_tree_model.h>
|
2017-03-06 09:50:48 -05:00
|
|
|
|
2020-05-11 16:23:04 +00:00
|
|
|
#include <algorithm>
|
2025-08-03 20:13:58 +01:00
|
|
|
#include <core/kicad_algo.h>
|
2017-03-06 09:50:48 -05:00
|
|
|
#include <eda_pattern_match.h>
|
2018-07-27 21:47:51 +01:00
|
|
|
#include <lib_tree_item.h>
|
2018-01-25 23:49:04 +00:00
|
|
|
#include <pgm_base.h>
|
2021-07-29 10:56:22 +01:00
|
|
|
#include <string_utils.h>
|
2017-03-06 09:50:48 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
2025-08-03 20:13:58 +01:00
|
|
|
void LIB_TREE_NODE::RebuildSearchTerms( const std::vector<wxString>& aShownColumns )
|
2017-03-06 09:50:48 -05:00
|
|
|
{
|
2025-08-03 20:13:58 +01:00
|
|
|
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<wxString>& aShownColumns, bool presorted )
|
|
|
|
{
|
|
|
|
for( std::unique_ptr<LIB_TREE_NODE>& child: m_Children )
|
|
|
|
child->RebuildSearchTerms( aShownColumns );
|
|
|
|
|
2018-07-27 21:47:51 +01:00
|
|
|
std::vector<LIB_TREE_NODE*> sort_buf;
|
2017-03-06 09:50:48 -05:00
|
|
|
|
2018-08-05 12:56:02 +01:00
|
|
|
if( presorted )
|
|
|
|
{
|
2020-02-07 17:06:24 +00:00
|
|
|
int max = m_Children.size() - 1;
|
2018-08-05 12:56:02 +01:00
|
|
|
|
|
|
|
for( int i = 0; i <= max; ++i )
|
2020-02-07 17:06:24 +00:00
|
|
|
m_Children[i]->m_IntrinsicRank = max - i;
|
2018-08-05 12:56:02 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-12-24 19:42:41 +00:00
|
|
|
for( std::unique_ptr<LIB_TREE_NODE>& child: m_Children )
|
|
|
|
sort_buf.push_back( child.get() );
|
2017-03-06 09:50:48 -05:00
|
|
|
|
2018-08-05 12:56:02 +01:00
|
|
|
std::sort( sort_buf.begin(), sort_buf.end(),
|
|
|
|
[]( LIB_TREE_NODE* a, LIB_TREE_NODE* b ) -> bool
|
2020-02-07 17:06:24 +00:00
|
|
|
{
|
|
|
|
return StrNumCmp( a->m_Name, b->m_Name, true ) > 0;
|
|
|
|
} );
|
2017-03-06 09:50:48 -05:00
|
|
|
|
2018-08-05 12:56:02 +01:00
|
|
|
for( int i = 0; i < (int) sort_buf.size(); ++i )
|
2020-02-07 17:06:24 +00:00
|
|
|
sort_buf[i]->m_IntrinsicRank = i;
|
2018-08-05 12:56:02 +01:00
|
|
|
}
|
2017-03-06 09:50:48 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2023-05-01 21:26:29 +01:00
|
|
|
void LIB_TREE_NODE::SortNodes( bool aUseScores )
|
2017-03-06 09:50:48 -05:00
|
|
|
{
|
2020-02-07 17:06:24 +00:00
|
|
|
std::sort( m_Children.begin(), m_Children.end(),
|
2023-05-01 21:26:29 +01:00
|
|
|
[&]( std::unique_ptr<LIB_TREE_NODE>& a, std::unique_ptr<LIB_TREE_NODE>& b )
|
|
|
|
{
|
|
|
|
return Compare( *a, *b, aUseScores );
|
|
|
|
} );
|
2017-03-06 09:50:48 -05:00
|
|
|
|
2020-02-07 17:06:24 +00:00
|
|
|
for( std::unique_ptr<LIB_TREE_NODE>& node: m_Children )
|
2023-05-01 21:26:29 +01:00
|
|
|
node->SortNodes( aUseScores );
|
2017-03-06 09:50:48 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2023-05-01 21:26:29 +01:00
|
|
|
bool LIB_TREE_NODE::Compare( LIB_TREE_NODE const& aNode1, LIB_TREE_NODE const& aNode2,
|
|
|
|
bool aUseScores )
|
2017-03-06 09:50:48 -05:00
|
|
|
{
|
2020-02-07 17:06:24 +00:00
|
|
|
if( aNode1.m_Type != aNode2.m_Type )
|
2023-02-16 12:56:19 -08:00
|
|
|
return aNode1.m_Type < aNode2.m_Type;
|
2017-03-06 09:50:48 -05:00
|
|
|
|
2022-07-09 12:19:58 -06:00
|
|
|
// Recently used sorts at top
|
2025-01-28 14:58:28 +00:00
|
|
|
if( aNode1.m_IsRecentlyUsedGroup )
|
2023-02-16 12:56:19 -08:00
|
|
|
{
|
2025-01-28 14:58:28 +00:00
|
|
|
if( aNode2.m_IsRecentlyUsedGroup )
|
2023-02-16 12:56:19 -08:00
|
|
|
{
|
2025-01-28 14:58:28 +00:00
|
|
|
// Make sure "-- Recently Used" is always at the top
|
|
|
|
// Start by checking the name of aNode2, because we want to satisfy the irreflexive
|
|
|
|
// property of the strict weak ordering.
|
|
|
|
if( aNode2.m_IsRecentlyUsedGroup )
|
2023-12-13 09:40:28 -05:00
|
|
|
return false;
|
2025-01-28 14:58:28 +00:00
|
|
|
else if( aNode1.m_IsRecentlyUsedGroup )
|
2024-05-05 07:32:34 -07:00
|
|
|
return true;
|
2023-12-13 09:40:28 -05:00
|
|
|
|
2023-02-16 12:56:19 -08:00
|
|
|
return aNode1.m_IntrinsicRank > aNode2.m_IntrinsicRank;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
2022-07-09 12:19:58 -06:00
|
|
|
else if( aNode2.m_Name.StartsWith( wxT( "-- " ) ) )
|
2023-02-16 12:56:19 -08:00
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
2022-07-09 12:19:58 -06:00
|
|
|
|
|
|
|
// Pinned nodes go next
|
|
|
|
if( aNode1.m_Pinned && !aNode2.m_Pinned )
|
2023-02-16 12:56:19 -08:00
|
|
|
return true;
|
2022-07-09 12:19:58 -06:00
|
|
|
else if( aNode2.m_Pinned && !aNode1.m_Pinned )
|
2023-02-16 12:56:19 -08:00
|
|
|
return false;
|
2022-07-09 12:19:58 -06:00
|
|
|
|
2023-05-01 21:26:29 +01:00
|
|
|
if( aUseScores && aNode1.m_Score != aNode2.m_Score )
|
|
|
|
return aNode1.m_Score > aNode2.m_Score;
|
|
|
|
|
2023-02-16 12:56:19 -08:00
|
|
|
if( aNode1.m_IntrinsicRank != aNode2.m_IntrinsicRank )
|
|
|
|
return aNode1.m_IntrinsicRank > aNode2.m_IntrinsicRank;
|
2017-03-06 09:50:48 -05:00
|
|
|
|
2023-02-16 12:56:19 -08:00
|
|
|
return reinterpret_cast<const void*>( &aNode1 ) < reinterpret_cast<const void*>( &aNode2 );
|
2017-03-06 09:50:48 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-07-27 21:47:51 +01:00
|
|
|
LIB_TREE_NODE::LIB_TREE_NODE()
|
2020-02-07 17:06:24 +00:00
|
|
|
: m_Parent( nullptr ),
|
2024-06-21 16:16:03 +03:00
|
|
|
m_Type( TYPE::INVALID ),
|
2020-02-07 17:06:24 +00:00
|
|
|
m_IntrinsicRank( 0 ),
|
2023-10-31 14:48:12 +00:00
|
|
|
m_Score( 0 ),
|
2020-02-07 17:06:24 +00:00
|
|
|
m_Pinned( false ),
|
2023-12-18 16:09:13 -05:00
|
|
|
m_PinCount( 0 ),
|
2020-02-07 17:06:24 +00:00
|
|
|
m_Unit( 0 ),
|
2025-01-28 14:58:28 +00:00
|
|
|
m_IsRoot( false ),
|
|
|
|
m_IsRecentlyUsedGroup( false ),
|
|
|
|
m_IsAlreadyPlacedGroup( false )
|
2017-03-06 09:50:48 -05:00
|
|
|
{}
|
|
|
|
|
|
|
|
|
2018-07-27 21:47:51 +01:00
|
|
|
LIB_TREE_NODE_UNIT::LIB_TREE_NODE_UNIT( LIB_TREE_NODE* aParent, LIB_TREE_ITEM* aItem, int aUnit )
|
2017-03-06 09:50:48 -05:00
|
|
|
{
|
2020-02-07 17:06:24 +00:00
|
|
|
m_Parent = aParent;
|
2024-06-21 16:16:03 +03:00
|
|
|
m_Type = TYPE::UNIT;
|
2017-03-06 09:50:48 -05:00
|
|
|
|
2020-02-07 17:06:24 +00:00
|
|
|
m_Unit = aUnit;
|
|
|
|
m_LibId = aParent->m_LibId;
|
2025-07-23 14:33:29 +01:00
|
|
|
m_Name = aItem->GetUnitName( aUnit );
|
2017-03-06 09:50:48 -05:00
|
|
|
|
2020-02-07 17:06:24 +00:00
|
|
|
m_IntrinsicRank = -aUnit;
|
2017-03-06 09:50:48 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2025-04-11 11:39:49 +01:00
|
|
|
void LIB_TREE_NODE_UNIT::UpdateScore( const std::vector<std::unique_ptr<EDA_COMBINED_MATCHER>>& aMatchers,
|
2023-11-17 18:13:14 +00:00
|
|
|
std::function<bool( LIB_TREE_NODE& aNode )>* aFilter )
|
|
|
|
{
|
2025-07-01 11:03:07 -06:00
|
|
|
m_Score = 1;
|
|
|
|
|
2025-04-11 11:39:49 +01:00
|
|
|
// aMatchers test results are inherited from parent
|
|
|
|
if( !aMatchers.empty() )
|
2023-11-17 18:13:14 +00:00
|
|
|
m_Score = m_Parent->m_Score;
|
|
|
|
|
|
|
|
if( aFilter && !(*aFilter)(*this) )
|
|
|
|
m_Score = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2023-11-17 18:17:50 +00:00
|
|
|
LIB_TREE_NODE_ITEM::LIB_TREE_NODE_ITEM( LIB_TREE_NODE* aParent, LIB_TREE_ITEM* aItem )
|
2017-03-06 09:50:48 -05:00
|
|
|
{
|
2024-06-21 16:16:03 +03:00
|
|
|
m_Type = TYPE::ITEM;
|
2020-02-07 17:06:24 +00:00
|
|
|
m_Parent = aParent;
|
2018-07-30 14:18:37 +01:00
|
|
|
|
2020-02-07 17:06:24 +00:00
|
|
|
m_LibId.SetLibNickname( aItem->GetLibNickname() );
|
2021-06-30 12:00:06 +01:00
|
|
|
m_LibId.SetLibItemName( aItem->GetName() );
|
2018-07-30 14:18:37 +01:00
|
|
|
|
2020-02-07 17:06:24 +00:00
|
|
|
m_Name = aItem->GetName();
|
2024-04-02 17:10:23 +01:00
|
|
|
m_Desc = aItem->GetDesc();
|
2022-06-05 18:58:27 +01:00
|
|
|
m_Footprint = aItem->GetFootprint();
|
2023-09-29 17:02:57 +01:00
|
|
|
m_PinCount = aItem->GetPinCount();
|
2018-07-30 14:18:37 +01:00
|
|
|
|
2022-08-28 19:02:12 -04:00
|
|
|
aItem->GetChooserFields( m_Fields );
|
|
|
|
|
2025-08-03 20:13:58 +01:00
|
|
|
m_sourceSearchTerms = aItem->GetSearchTerms();
|
2018-07-30 14:18:37 +01:00
|
|
|
|
2020-02-07 17:06:24 +00:00
|
|
|
m_IsRoot = aItem->IsRoot();
|
2018-07-30 14:18:37 +01:00
|
|
|
|
2024-04-02 18:28:17 +01:00
|
|
|
if( aItem->GetSubUnitCount() > 1 )
|
2018-08-05 14:03:23 +01:00
|
|
|
{
|
2024-04-02 18:28:17 +01:00
|
|
|
for( int u = 1; u <= aItem->GetSubUnitCount(); ++u )
|
2018-08-05 14:03:23 +01:00
|
|
|
AddUnit( aItem, u );
|
|
|
|
}
|
2018-01-10 12:04:34 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2023-11-17 18:17:50 +00:00
|
|
|
LIB_TREE_NODE_UNIT& LIB_TREE_NODE_ITEM::AddUnit( LIB_TREE_ITEM* aItem, int aUnit )
|
2018-01-10 12:04:34 +01:00
|
|
|
{
|
2018-07-27 21:47:51 +01:00
|
|
|
LIB_TREE_NODE_UNIT* unit = new LIB_TREE_NODE_UNIT( this, aItem, aUnit );
|
2020-02-07 17:06:24 +00:00
|
|
|
m_Children.push_back( std::unique_ptr<LIB_TREE_NODE>( unit ) );
|
2018-01-10 12:04:34 +01:00
|
|
|
return *unit;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2023-11-17 18:17:50 +00:00
|
|
|
void LIB_TREE_NODE_ITEM::Update( LIB_TREE_ITEM* aItem )
|
2018-01-10 12:04:34 +01:00
|
|
|
{
|
2024-04-02 17:10:23 +01:00
|
|
|
m_LibId.SetLibNickname( aItem->GetLIB_ID().GetLibNickname() );
|
2022-04-21 11:57:15 +01:00
|
|
|
m_LibId.SetLibItemName( aItem->GetName() );
|
2017-09-15 10:17:44 -04:00
|
|
|
|
2022-04-21 11:57:15 +01:00
|
|
|
m_Name = aItem->GetName();
|
2024-04-02 17:10:23 +01:00
|
|
|
m_Desc = aItem->GetDesc();
|
2017-03-06 09:50:48 -05:00
|
|
|
|
2022-08-28 19:02:12 -04:00
|
|
|
aItem->GetChooserFields( m_Fields );
|
|
|
|
|
2025-08-03 20:13:58 +01:00
|
|
|
m_sourceSearchTerms = aItem->GetSearchTerms();
|
2017-07-09 23:08:33 +10:00
|
|
|
|
2020-02-07 17:06:24 +00:00
|
|
|
m_IsRoot = aItem->IsRoot();
|
|
|
|
m_Children.clear();
|
2018-01-10 12:04:34 +01:00
|
|
|
|
2024-04-02 18:28:17 +01:00
|
|
|
for( int u = 1; u <= aItem->GetSubUnitCount(); ++u )
|
2018-07-27 21:47:51 +01:00
|
|
|
AddUnit( aItem, u );
|
2017-03-06 09:50:48 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2025-04-11 11:39:49 +01:00
|
|
|
void LIB_TREE_NODE_ITEM::UpdateScore( const std::vector<std::unique_ptr<EDA_COMBINED_MATCHER>>& aMatchers,
|
2023-11-17 18:17:50 +00:00
|
|
|
std::function<bool( LIB_TREE_NODE& aNode )>* aFilter )
|
2023-09-29 17:02:57 +01:00
|
|
|
{
|
2025-07-01 11:03:07 -06:00
|
|
|
m_Score = 1;
|
2025-04-11 11:39:49 +01:00
|
|
|
|
|
|
|
for( const std::unique_ptr<EDA_COMBINED_MATCHER>& matcher : aMatchers )
|
2025-07-01 11:03:07 -06:00
|
|
|
{
|
|
|
|
int score = matcher->ScoreTerms( m_SearchTerms );
|
|
|
|
|
|
|
|
if( score == 0 )
|
|
|
|
{
|
|
|
|
m_Score = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
m_Score += score;
|
|
|
|
}
|
2023-09-29 17:02:57 +01:00
|
|
|
|
2023-11-08 12:29:14 +00:00
|
|
|
if( aFilter && !(*aFilter)(*this) )
|
|
|
|
m_Score = 0;
|
2023-09-29 17:02:57 +01:00
|
|
|
|
2023-11-17 18:13:14 +00:00
|
|
|
for( std::unique_ptr<LIB_TREE_NODE>& child: m_Children )
|
2025-04-11 11:39:49 +01:00
|
|
|
child->UpdateScore( aMatchers, aFilter );
|
2017-03-06 09:50:48 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2023-11-08 17:34:14 +00:00
|
|
|
LIB_TREE_NODE_LIBRARY::LIB_TREE_NODE_LIBRARY( LIB_TREE_NODE* aParent, wxString const& aName,
|
|
|
|
wxString const& aDesc )
|
2017-03-06 09:50:48 -05:00
|
|
|
{
|
2024-06-21 16:16:03 +03:00
|
|
|
m_Type = TYPE::LIBRARY;
|
2020-02-07 17:06:24 +00:00
|
|
|
m_Name = aName;
|
|
|
|
m_Desc = aDesc;
|
|
|
|
m_Parent = aParent;
|
|
|
|
m_LibId.SetLibNickname( aName );
|
2023-10-23 18:23:24 +01:00
|
|
|
|
|
|
|
m_SearchTerms.emplace_back( SEARCH_TERM( aName, 8 ) );
|
2017-03-06 09:50:48 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2023-11-17 18:17:50 +00:00
|
|
|
LIB_TREE_NODE_ITEM& LIB_TREE_NODE_LIBRARY::AddItem( LIB_TREE_ITEM* aItem )
|
2017-03-06 09:50:48 -05:00
|
|
|
{
|
2023-11-17 18:17:50 +00:00
|
|
|
LIB_TREE_NODE_ITEM* item = new LIB_TREE_NODE_ITEM( this, aItem );
|
2020-02-07 17:06:24 +00:00
|
|
|
m_Children.push_back( std::unique_ptr<LIB_TREE_NODE>( item ) );
|
2018-07-30 14:18:37 +01:00
|
|
|
return *item;
|
2017-03-06 09:50:48 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2025-04-11 11:39:49 +01:00
|
|
|
void LIB_TREE_NODE_LIBRARY::UpdateScore( const std::vector<std::unique_ptr<EDA_COMBINED_MATCHER>>& aMatchers,
|
2023-11-08 17:34:14 +00:00
|
|
|
std::function<bool( LIB_TREE_NODE& aNode )>* aFilter )
|
2017-03-06 09:50:48 -05:00
|
|
|
{
|
2025-04-11 11:39:49 +01:00
|
|
|
if( m_Children.empty() )
|
2017-03-06 09:50:48 -05:00
|
|
|
{
|
2025-07-01 11:03:07 -06:00
|
|
|
m_Score = 1;
|
|
|
|
|
2025-04-11 11:39:49 +01:00
|
|
|
for( const std::unique_ptr<EDA_COMBINED_MATCHER>& matcher : aMatchers )
|
2025-07-01 11:03:07 -06:00
|
|
|
{
|
|
|
|
int score = matcher->ScoreTerms( m_SearchTerms );
|
|
|
|
|
|
|
|
if( score == 0 )
|
|
|
|
{
|
|
|
|
m_Score = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
m_Score += score;
|
|
|
|
}
|
2025-04-11 11:39:49 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2025-07-01 11:03:07 -06:00
|
|
|
m_Score = 0;
|
2025-04-11 11:39:49 +01:00
|
|
|
|
2024-08-14 20:34:21 -06:00
|
|
|
for( std::unique_ptr<LIB_TREE_NODE>& child: m_Children )
|
|
|
|
{
|
2025-04-11 11:39:49 +01:00
|
|
|
child->UpdateScore( aMatchers, aFilter );
|
2025-07-01 11:03:07 -06:00
|
|
|
m_Score = std::max( m_Score, child->m_Score );
|
2024-08-14 20:34:21 -06:00
|
|
|
}
|
|
|
|
}
|
2017-03-06 09:50:48 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-07-27 21:47:51 +01:00
|
|
|
LIB_TREE_NODE_ROOT::LIB_TREE_NODE_ROOT()
|
2017-03-06 09:50:48 -05:00
|
|
|
{
|
2024-06-21 16:16:03 +03:00
|
|
|
m_Type = TYPE::ROOT;
|
2017-03-06 09:50:48 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2023-11-08 17:34:14 +00:00
|
|
|
LIB_TREE_NODE_LIBRARY& LIB_TREE_NODE_ROOT::AddLib( wxString const& aName, wxString const& aDesc )
|
2017-03-06 09:50:48 -05:00
|
|
|
{
|
2023-11-08 17:34:14 +00:00
|
|
|
LIB_TREE_NODE_LIBRARY* lib = new LIB_TREE_NODE_LIBRARY( this, aName, aDesc );
|
2020-02-07 17:06:24 +00:00
|
|
|
m_Children.push_back( std::unique_ptr<LIB_TREE_NODE>( lib ) );
|
2017-03-06 09:50:48 -05:00
|
|
|
return *lib;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2025-01-28 14:58:28 +00:00
|
|
|
void LIB_TREE_NODE_ROOT::RemoveGroup( bool aRecentlyUsedGroup, bool aAlreadyPlacedGroup )
|
2024-02-21 11:35:09 -05:00
|
|
|
{
|
|
|
|
m_Children.erase( std::remove_if( m_Children.begin(), m_Children.end(),
|
|
|
|
[&]( std::unique_ptr<LIB_TREE_NODE>& aNode )
|
|
|
|
{
|
2025-01-28 14:58:28 +00:00
|
|
|
if( aRecentlyUsedGroup && aNode->m_IsRecentlyUsedGroup )
|
|
|
|
return true;
|
|
|
|
|
|
|
|
if( aAlreadyPlacedGroup && aNode->m_IsAlreadyPlacedGroup )
|
|
|
|
return true;
|
|
|
|
|
|
|
|
return false;
|
2024-02-21 11:35:09 -05:00
|
|
|
} ),
|
|
|
|
m_Children.end() );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void LIB_TREE_NODE_ROOT::Clear()
|
|
|
|
{
|
|
|
|
m_Children.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2025-04-11 11:39:49 +01:00
|
|
|
void LIB_TREE_NODE_ROOT::UpdateScore( const std::vector<std::unique_ptr<EDA_COMBINED_MATCHER>>& aMatchers,
|
2023-11-08 12:29:14 +00:00
|
|
|
std::function<bool( LIB_TREE_NODE& aNode )>* aFilter )
|
2017-03-06 09:50:48 -05:00
|
|
|
{
|
2020-12-24 19:42:41 +00:00
|
|
|
for( std::unique_ptr<LIB_TREE_NODE>& child: m_Children )
|
2025-04-11 11:39:49 +01:00
|
|
|
child->UpdateScore( aMatchers, aFilter );
|
2017-03-06 09:50:48 -05:00
|
|
|
}
|
|
|
|
|