groups: add search handlers

This commit is contained in:
Mike Williams 2025-05-13 12:54:02 -04:00
parent a64278a12c
commit 8e480445bc
10 changed files with 166 additions and 1 deletions

View File

@ -424,6 +424,12 @@ void SCH_GROUP::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_I
} }
bool SCH_GROUP::Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const
{
return EDA_ITEM::Matches( UnescapeString( GetName() ), aSearchData );
}
void SCH_GROUP::RunOnChildren( const std::function<void( SCH_ITEM* )>& aFunction, RECURSE_MODE aMode ) void SCH_GROUP::RunOnChildren( const std::function<void( SCH_ITEM* )>& aFunction, RECURSE_MODE aMode )
{ {
try try

View File

@ -160,6 +160,9 @@ public:
/// @copydoc EDA_ITEM::GetMsgPanelInfo /// @copydoc EDA_ITEM::GetMsgPanelInfo
void GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList ) override; void GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList ) override;
/// @copydoc EDA_ITEM::Matches
bool Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const override;
///< @copydoc SCH_ITEM::RunOnChildren ///< @copydoc SCH_ITEM::RunOnChildren
void RunOnChildren( const std::function<void( SCH_ITEM* )>& aFunction, RECURSE_MODE aMode ) override; void RunOnChildren( const std::function<void( SCH_ITEM* )>& aFunction, RECURSE_MODE aMode ) override;

View File

@ -50,6 +50,7 @@ SCH_SEARCH_PANE::SCH_SEARCH_PANE( SCH_EDIT_FRAME* aFrame ) :
AddSearcher( new POWER_SEARCH_HANDLER( aFrame ) ); AddSearcher( new POWER_SEARCH_HANDLER( aFrame ) );
AddSearcher( new TEXT_SEARCH_HANDLER( aFrame ) ); AddSearcher( new TEXT_SEARCH_HANDLER( aFrame ) );
AddSearcher( new LABEL_SEARCH_HANDLER( aFrame ) ); AddSearcher( new LABEL_SEARCH_HANDLER( aFrame ) );
AddSearcher( new GROUP_SEARCH_HANDLER( aFrame ) );
} }

View File

@ -21,6 +21,7 @@
#include <sch_edit_frame.h> #include <sch_edit_frame.h>
#include <sch_painter.h> #include <sch_painter.h>
#include <sch_symbol.h> #include <sch_symbol.h>
#include <sch_group.h>
#include <sch_label.h> #include <sch_label.h>
#include <sch_text.h> #include <sch_text.h>
#include <sch_textbox.h> #include <sch_textbox.h>
@ -489,3 +490,68 @@ wxString LABEL_SEARCH_HANDLER::getResultCell( const SCH_SEARCH_HIT& aHit, int aC
return wxEmptyString; return wxEmptyString;
} }
GROUP_SEARCH_HANDLER::GROUP_SEARCH_HANDLER( SCH_EDIT_FRAME* aFrame ) :
SCH_SEARCH_HANDLER( _HKI( "Groups" ), aFrame )
{
m_columns.emplace_back( _HKI( "Name" ), 6, wxLIST_FORMAT_LEFT );
m_columns.emplace_back( _HKI( "Page" ), 2, wxLIST_FORMAT_CENTER );
m_columns.emplace_back( wxT( "X" ), 3, wxLIST_FORMAT_CENTER );
m_columns.emplace_back( wxT( "Y" ), 3, wxLIST_FORMAT_CENTER);
}
int GROUP_SEARCH_HANDLER::Search( const wxString& aQuery )
{
m_hitlist.clear();
APP_SETTINGS_BASE::SEARCH_PANE& settings = m_frame->config()->m_SearchPane;
SCH_SEARCH_DATA frp;
frp.searchAllFields = settings.search_hidden_fields;
frp.searchMetadata = settings.search_metadata;
frp.findString = aQuery;
// Try to handle whatever the user throws at us (substring, wildcards, regex, etc.)
frp.matchMode = EDA_SEARCH_MATCH_MODE::PERMISSIVE;
frp.searchCurrentSheetOnly = false;
auto search =
[&frp]( SCH_ITEM* item, SCH_SHEET_PATH* sheet )
{
if( item->IsType( { SCH_GROUP_T } ) )
{
SCH_GROUP* group = static_cast<SCH_GROUP*>( item );
if( frp.findString.IsEmpty() || group->Matches( frp, sheet ) )
return true;
}
return false;
};
FindAll( search );
return (int) m_hitlist.size();
}
wxString GROUP_SEARCH_HANDLER::getResultCell( const SCH_SEARCH_HIT& aHit, int aCol )
{
SCH_GROUP* group = dynamic_cast<SCH_GROUP*>( aHit.item );
if( !group )
return wxEmptyString;
if( aCol == 0 )
return group->GetName();
else if( aCol == 1 )
return aHit.sheetPath->GetPageNumber();
else if( aCol == 2 )
return m_frame->MessageTextFromValue( group->GetPosition().x );
else if( aCol == 3 )
return m_frame->MessageTextFromValue( group->GetPosition().y );
return wxEmptyString;
}

View File

@ -115,4 +115,15 @@ protected:
wxString getResultCell( const SCH_SEARCH_HIT& hit, int aCol ) override; wxString getResultCell( const SCH_SEARCH_HIT& hit, int aCol ) override;
}; };
class GROUP_SEARCH_HANDLER : public SCH_SEARCH_HANDLER
{
public:
GROUP_SEARCH_HANDLER( SCH_EDIT_FRAME* aFrame );
int Search( const wxString& aQuery ) override;
protected:
wxString getResultCell( const SCH_SEARCH_HIT& hit, int aCol ) override;
};
#endif #endif

View File

@ -440,6 +440,12 @@ void PCB_GROUP::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_I
} }
bool PCB_GROUP::Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const
{
return EDA_ITEM::Matches( UnescapeString( GetName() ), aSearchData );
}
void PCB_GROUP::RunOnChildren( const std::function<void( BOARD_ITEM* )>& aFunction, RECURSE_MODE aMode ) const void PCB_GROUP::RunOnChildren( const std::function<void( BOARD_ITEM* )>& aFunction, RECURSE_MODE aMode ) const
{ {
try try

View File

@ -190,6 +190,9 @@ public:
/// @copydoc EDA_ITEM::GetMsgPanelInfo /// @copydoc EDA_ITEM::GetMsgPanelInfo
void GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList ) override; void GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList ) override;
/// @copydoc EDA_ITEM::Matches
bool Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const override;
///< @copydoc BOARD_ITEM::RunOnChildren ///< @copydoc BOARD_ITEM::RunOnChildren
void RunOnChildren( const std::function<void( BOARD_ITEM* )>& aFunction, RECURSE_MODE aMode ) const override; void RunOnChildren( const std::function<void( BOARD_ITEM* )>& aFunction, RECURSE_MODE aMode ) const override;

View File

@ -46,6 +46,7 @@ PCB_SEARCH_PANE::PCB_SEARCH_PANE( PCB_EDIT_FRAME* aFrame ) :
AddSearcher( new NETS_SEARCH_HANDLER( aFrame ) ); AddSearcher( new NETS_SEARCH_HANDLER( aFrame ) );
AddSearcher( new RATSNEST_SEARCH_HANDLER( aFrame ) ); AddSearcher( new RATSNEST_SEARCH_HANDLER( aFrame ) );
AddSearcher( new TEXT_SEARCH_HANDLER( aFrame ) ); AddSearcher( new TEXT_SEARCH_HANDLER( aFrame ) );
AddSearcher( new GROUP_SEARCH_HANDLER( aFrame ) );
} }
@ -158,4 +159,4 @@ void PCB_SEARCH_PANE::OnBoardCompositeUpdate( BOARD& aBoard, std::vector<BOARD_I
return; return;
RefreshSearch(); RefreshSearch();
} }

View File

@ -22,6 +22,7 @@
#include <pcb_edit_frame.h> #include <pcb_edit_frame.h>
#include <pcb_marker.h> #include <pcb_marker.h>
#include <pcb_painter.h> #include <pcb_painter.h>
#include <pcb_group.h>
#include <pcb_textbox.h> #include <pcb_textbox.h>
#include <pcb_text.h> #include <pcb_text.h>
#include <pcb_dimension.h> #include <pcb_dimension.h>
@ -336,6 +337,61 @@ wxString TEXT_SEARCH_HANDLER::getResultCell( BOARD_ITEM* aItem, int aCol )
} }
GROUP_SEARCH_HANDLER::GROUP_SEARCH_HANDLER( PCB_EDIT_FRAME* aFrame ) :
PCB_SEARCH_HANDLER( _HKI( "Groups" ), aFrame )
{
m_columns.emplace_back( _HKI( "Type" ), 2, wxLIST_FORMAT_LEFT );
m_columns.emplace_back( _HKI( "Name" ), 6, wxLIST_FORMAT_LEFT );
m_columns.emplace_back( wxT( "X" ), 3, wxLIST_FORMAT_CENTER );
m_columns.emplace_back( wxT( "Y" ), 3, wxLIST_FORMAT_CENTER );
}
int GROUP_SEARCH_HANDLER::Search( const wxString& aQuery )
{
m_hitlist.clear();
BOARD* board = m_frame->GetBoard();
APP_SETTINGS_BASE::SEARCH_PANE& settings = m_frame->config()->m_SearchPane;
EDA_SEARCH_DATA frp;
frp.searchAllFields = settings.search_hidden_fields;
frp.searchMetadata = settings.search_metadata;
frp.findString = aQuery;
// Try to handle whatever the user throws at us (substring, wildcards, regex, etc.)
frp.matchMode = EDA_SEARCH_MATCH_MODE::PERMISSIVE;
for( BOARD_ITEM* item : board->Groups() )
{
if( frp.findString.IsEmpty() || item->Matches( frp, nullptr ) )
m_hitlist.push_back( item );
}
return (int) m_hitlist.size();
}
wxString GROUP_SEARCH_HANDLER::getResultCell( BOARD_ITEM* aItem, int aCol )
{
if( aCol == 0 )
{
if( aItem->Type() == PCB_GROUP_T )
return _( "Group" );
else if( aItem->Type() == PCB_GENERATOR_T )
return _( "Generator" );
}
else if( aCol == 1 )
return static_cast<PCB_GROUP*>( aItem )->GetName();
else if( aCol == 2 )
return m_frame->MessageTextFromCoord( aItem->GetX(), ORIGIN_TRANSFORMS::ABS_X_COORD );
else if( aCol == 3 )
return m_frame->MessageTextFromCoord( aItem->GetY(), ORIGIN_TRANSFORMS::ABS_Y_COORD );
return wxEmptyString;
}
NETS_SEARCH_HANDLER::NETS_SEARCH_HANDLER( PCB_EDIT_FRAME* aFrame ) : NETS_SEARCH_HANDLER::NETS_SEARCH_HANDLER( PCB_EDIT_FRAME* aFrame ) :
PCB_SEARCH_HANDLER( _HKI( "Nets" ), aFrame ) PCB_SEARCH_HANDLER( _HKI( "Nets" ), aFrame )
{ {

View File

@ -100,6 +100,18 @@ private:
}; };
class GROUP_SEARCH_HANDLER : public PCB_SEARCH_HANDLER
{
public:
GROUP_SEARCH_HANDLER( PCB_EDIT_FRAME* aFrame );
int Search( const wxString& aQuery ) override;
private:
wxString getResultCell( BOARD_ITEM* aItem, int aCol ) override;
};
class NETS_SEARCH_HANDLER : public PCB_SEARCH_HANDLER class NETS_SEARCH_HANDLER : public PCB_SEARCH_HANDLER
{ {
public: public: