ADDED: metadata searching.

Symbol and footprint search panels can now optionally
search library links, descriptions and keywords.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/10602
This commit is contained in:
Jeff Young 2025-04-08 09:42:56 +01:00
parent ec6bc85a29
commit 98ec2d7ba2
12 changed files with 85 additions and 13 deletions

View File

@ -196,6 +196,9 @@ APP_SETTINGS_BASE::APP_SETTINGS_BASE( const std::string& aFilename, int aSchemaV
m_params.emplace_back( new PARAM<bool>( "search_pane.search_hidden_fields", m_params.emplace_back( new PARAM<bool>( "search_pane.search_hidden_fields",
&m_SearchPane.search_hidden_fields, true ) ); &m_SearchPane.search_hidden_fields, true ) );
m_params.emplace_back( new PARAM<bool>( "search_pane.search_metadata",
&m_SearchPane.search_metadata, false ) );
m_params.emplace_back( new PARAM<bool>( "system.first_run_shown", m_params.emplace_back( new PARAM<bool>( "system.first_run_shown",
&m_System.first_run_shown, false ) ); //@todo RFB remove? - not used &m_System.first_run_shown, false ) ); //@todo RFB remove? - not used

View File

@ -32,6 +32,7 @@
#define ID_TOGGLE_ZOOM_TO_SELECTION 14000 #define ID_TOGGLE_ZOOM_TO_SELECTION 14000
#define ID_TOGGLE_PAN_TO_SELECTION 14001 #define ID_TOGGLE_PAN_TO_SELECTION 14001
#define ID_TOGGLE_SEARCH_HIDDEN_FIELDS 14002 #define ID_TOGGLE_SEARCH_HIDDEN_FIELDS 14002
#define ID_TOGGLE_SEARCH_METADATA 14003
class SEARCH_PANE_MENU : public ACTION_MENU class SEARCH_PANE_MENU : public ACTION_MENU
@ -50,6 +51,8 @@ public:
AppendSeparator(); AppendSeparator();
Add( _( "Search Hidden Fields" ), wxEmptyString, Add( _( "Search Hidden Fields" ), wxEmptyString,
ID_TOGGLE_SEARCH_HIDDEN_FIELDS, BITMAPS::invisible_text, true ); ID_TOGGLE_SEARCH_HIDDEN_FIELDS, BITMAPS::invisible_text, true );
Add( _( "Search Metadata" ), _( "Search library links, descriptions and keywords" ),
ID_TOGGLE_SEARCH_METADATA, BITMAPS::library, true );
updateZoomPanCheckboxes(); updateZoomPanCheckboxes();
} }
@ -79,6 +82,12 @@ public:
updateZoomPanCheckboxes(); updateZoomPanCheckboxes();
m_searchPane->RefreshSearch(); m_searchPane->RefreshSearch();
break; break;
case ID_TOGGLE_SEARCH_METADATA:
settings.search_metadata = item->IsChecked();
updateZoomPanCheckboxes();
m_searchPane->RefreshSearch();
break;
} }
return OPT_TOOL_EVENT(); return OPT_TOOL_EVENT();
@ -92,10 +101,12 @@ private:
wxMenuItem* zoomCb = FindItem( ID_TOGGLE_ZOOM_TO_SELECTION ); wxMenuItem* zoomCb = FindItem( ID_TOGGLE_ZOOM_TO_SELECTION );
wxMenuItem* panCb = FindItem( ID_TOGGLE_PAN_TO_SELECTION ); wxMenuItem* panCb = FindItem( ID_TOGGLE_PAN_TO_SELECTION );
wxMenuItem* hiddenFieldsCb = FindItem( ID_TOGGLE_SEARCH_HIDDEN_FIELDS ); wxMenuItem* hiddenFieldsCb = FindItem( ID_TOGGLE_SEARCH_HIDDEN_FIELDS );
wxMenuItem* metadataCb = FindItem( ID_TOGGLE_SEARCH_METADATA );
zoomCb->Check( settings.selection_zoom == APP_SETTINGS_BASE::SEARCH_PANE::SELECTION_ZOOM::ZOOM ); zoomCb->Check( settings.selection_zoom == APP_SETTINGS_BASE::SEARCH_PANE::SELECTION_ZOOM::ZOOM );
panCb->Check( settings.selection_zoom == APP_SETTINGS_BASE::SEARCH_PANE::SELECTION_ZOOM::PAN ); panCb->Check( settings.selection_zoom == APP_SETTINGS_BASE::SEARCH_PANE::SELECTION_ZOOM::PAN );
hiddenFieldsCb->Check( settings.search_hidden_fields ); hiddenFieldsCb->Check( settings.search_hidden_fields );
metadataCb->Check( settings.search_metadata );
} }
private: private:

View File

@ -264,6 +264,7 @@ void SCH_EDIT_FRAME::LoadSettings( APP_SETTINGS_BASE* aCfg )
{ {
searchData->replaceReferences = cfg->m_FindReplaceExtra.replace_references; searchData->replaceReferences = cfg->m_FindReplaceExtra.replace_references;
searchData->searchAllFields = cfg->m_FindReplaceExtra.search_all_fields; searchData->searchAllFields = cfg->m_FindReplaceExtra.search_all_fields;
searchData->searchMetadata = cfg->m_FindReplaceExtra.search_metadata;
searchData->searchAllPins = cfg->m_FindReplaceExtra.search_all_pins; searchData->searchAllPins = cfg->m_FindReplaceExtra.search_all_pins;
searchData->searchCurrentSheetOnly = cfg->m_FindReplaceExtra.search_current_sheet_only; searchData->searchCurrentSheetOnly = cfg->m_FindReplaceExtra.search_current_sheet_only;
searchData->searchSelectedOnly = cfg->m_FindReplaceExtra.search_selected_only; searchData->searchSelectedOnly = cfg->m_FindReplaceExtra.search_selected_only;
@ -300,6 +301,7 @@ void SCH_EDIT_FRAME::SaveSettings( APP_SETTINGS_BASE* aCfg )
{ {
cfg->m_FindReplaceExtra.replace_references = searchData->replaceReferences; cfg->m_FindReplaceExtra.replace_references = searchData->replaceReferences;
cfg->m_FindReplaceExtra.search_all_fields = searchData->searchAllFields; cfg->m_FindReplaceExtra.search_all_fields = searchData->searchAllFields;
cfg->m_FindReplaceExtra.search_metadata = searchData->searchMetadata;
cfg->m_FindReplaceExtra.search_all_pins = searchData->searchAllPins; cfg->m_FindReplaceExtra.search_all_pins = searchData->searchAllPins;
cfg->m_FindReplaceExtra.search_current_sheet_only = cfg->m_FindReplaceExtra.search_current_sheet_only =
searchData->searchCurrentSheetOnly; searchData->searchCurrentSheetOnly;

View File

@ -317,6 +317,7 @@ public:
struct FIND_REPLACE_EXTRA struct FIND_REPLACE_EXTRA
{ {
bool search_all_fields; bool search_all_fields;
bool search_metadata;
bool search_all_pins; bool search_all_pins;
bool search_current_sheet_only; bool search_current_sheet_only;
bool search_selected_only; bool search_selected_only;

View File

@ -640,16 +640,15 @@ GR_TEXT_V_ALIGN_T SCH_FIELD::GetEffectiveVertJustify() const
bool SCH_FIELD::Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const bool SCH_FIELD::Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const
{ {
bool searchHiddenFields = false; bool searchHiddenFields = aSearchData.searchAllFields;
bool searchAndReplace = false; bool searchMetadata = aSearchData.searchMetadata;
bool searchAndReplace = aSearchData.searchAndReplace;
bool replaceReferences = false; bool replaceReferences = false;
try try
{ {
// downcast // downcast
const SCH_SEARCH_DATA& schSearchData = dynamic_cast<const SCH_SEARCH_DATA&>( aSearchData ); const SCH_SEARCH_DATA& schSearchData = dynamic_cast<const SCH_SEARCH_DATA&>( aSearchData );
searchHiddenFields = schSearchData.searchAllFields;
searchAndReplace = schSearchData.searchAndReplace;
replaceReferences = schSearchData.replaceReferences; replaceReferences = schSearchData.replaceReferences;
} }
catch( const std::bad_cast& ) catch( const std::bad_cast& )
@ -673,6 +672,9 @@ bool SCH_FIELD::Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) co
if( !parentSymbol ) if( !parentSymbol )
return false; return false;
if( parentSymbol->Matches( aSearchData, aAuxData ) )
return true;
wxASSERT( aAuxData ); wxASSERT( aAuxData );
// Take sheet path into account which effects the reference field and the unit for // Take sheet path into account which effects the reference field and the unit for

View File

@ -2083,6 +2083,18 @@ void SCH_SYMBOL::Rotate( const VECTOR2I& aCenter, bool aRotateCCW )
bool SCH_SYMBOL::Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const bool SCH_SYMBOL::Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const
{ {
if( aSearchData.searchMetadata )
{
if( EDA_ITEM::Matches( GetSchSymbolLibraryName(), aSearchData ) )
return true;
if( EDA_ITEM::Matches( GetDescription(), aSearchData ) )
return true;
if( EDA_ITEM::Matches( GetKeyWords(), aSearchData ) )
return true;
}
for( SCH_ITEM& drawItem : GetLibSymbolRef()->GetDrawItems() ) for( SCH_ITEM& drawItem : GetLibSymbolRef()->GetDrawItems() )
{ {
if( drawItem.Matches( aSearchData, aAuxData ) ) if( drawItem.Matches( aSearchData, aAuxData ) )

View File

@ -179,6 +179,7 @@ int SYMBOL_SEARCH_HANDLER::Search( const wxString& aQuery )
SCH_SEARCH_DATA frp; SCH_SEARCH_DATA frp;
frp.searchAllFields = settings.search_hidden_fields; frp.searchAllFields = settings.search_hidden_fields;
frp.searchMetadata = settings.search_metadata;
frp.findString = aQuery; frp.findString = aQuery;
// Try to handle whatever the user throws at us (substring, wildcards, regex, etc.) // Try to handle whatever the user throws at us (substring, wildcards, regex, etc.)
@ -267,6 +268,7 @@ int POWER_SEARCH_HANDLER::Search( const wxString& aQuery )
SCH_SEARCH_DATA frp; SCH_SEARCH_DATA frp;
frp.searchAllFields = settings.search_hidden_fields; frp.searchAllFields = settings.search_hidden_fields;
frp.searchMetadata = settings.search_metadata;
frp.findString = aQuery; frp.findString = aQuery;
// Try to handle whatever the user throws at us (substring, wildcards, regex, etc.) // Try to handle whatever the user throws at us (substring, wildcards, regex, etc.)
@ -341,6 +343,7 @@ int TEXT_SEARCH_HANDLER::Search( const wxString& aQuery )
SCH_SEARCH_DATA frp; SCH_SEARCH_DATA frp;
frp.searchAllFields = settings.search_hidden_fields; frp.searchAllFields = settings.search_hidden_fields;
frp.searchMetadata = settings.search_metadata;
frp.findString = aQuery; frp.findString = aQuery;
// Try to handle whatever the user throws at us (substring, wildcards, regex, etc.) // Try to handle whatever the user throws at us (substring, wildcards, regex, etc.)
@ -428,6 +431,7 @@ int LABEL_SEARCH_HANDLER::Search( const wxString& aQuery )
SCH_SEARCH_DATA frp; SCH_SEARCH_DATA frp;
frp.searchAllFields = settings.search_hidden_fields; frp.searchAllFields = settings.search_hidden_fields;
frp.searchMetadata = settings.search_metadata;
frp.findString = aQuery; frp.findString = aQuery;
// Try to handle whatever the user throws at us (substring, wildcards, regex, etc.) // Try to handle whatever the user throws at us (substring, wildcards, regex, etc.)

View File

@ -47,6 +47,7 @@ struct EDA_SEARCH_DATA
bool searchAndReplace; bool searchAndReplace;
bool searchAllFields; bool searchAllFields;
bool searchMetadata;
bool matchCase; bool matchCase;
bool markersOnly; bool markersOnly;
@ -57,6 +58,7 @@ struct EDA_SEARCH_DATA
replaceString(), replaceString(),
searchAndReplace( false ), searchAndReplace( false ),
searchAllFields( false ), searchAllFields( false ),
searchMetadata( false ),
matchCase( false ), matchCase( false ),
markersOnly( false ), markersOnly( false ),
matchMode( EDA_SEARCH_MATCH_MODE::PLAIN ) matchMode( EDA_SEARCH_MATCH_MODE::PLAIN )
@ -70,6 +72,7 @@ struct EDA_SEARCH_DATA
regex_string( other.regex_string ), regex_string( other.regex_string ),
searchAndReplace( other.searchAndReplace ), searchAndReplace( other.searchAndReplace ),
searchAllFields( other.searchAllFields ), searchAllFields( other.searchAllFields ),
searchMetadata( other.searchMetadata ),
matchCase( other.matchCase ), matchCase( other.matchCase ),
markersOnly( other.markersOnly ), markersOnly( other.markersOnly ),
matchMode( other.matchMode ) matchMode( other.matchMode )

View File

@ -115,6 +115,7 @@ public:
SELECTION_ZOOM selection_zoom; SELECTION_ZOOM selection_zoom;
bool search_hidden_fields; bool search_hidden_fields;
bool search_metadata;
}; };
struct GRAPHICS struct GRAPHICS

View File

@ -2070,6 +2070,24 @@ void FOOTPRINT::Add3DModel( FP_3DMODEL* a3DModel )
} }
bool FOOTPRINT::Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const
{
if( aSearchData.searchMetadata )
{
if( EDA_ITEM::Matches( GetFPIDAsString(), aSearchData ) )
return true;
if( EDA_ITEM::Matches( GetLibDescription(), aSearchData ) )
return true;
if( EDA_ITEM::Matches( GetKeywords(), aSearchData ) )
return true;
}
return false;
}
// see footprint.h // see footprint.h
INSPECT_RESULT FOOTPRINT::Visit( INSPECTOR inspector, void* testData, INSPECT_RESULT FOOTPRINT::Visit( INSPECTOR inspector, void* testData,
const std::vector<KICAD_T>& aScanTypes ) const std::vector<KICAD_T>& aScanTypes )

View File

@ -588,6 +588,8 @@ public:
bool HitTest( const VECTOR2I& aPosition, int aAccuracy = 0 ) const override; bool HitTest( const VECTOR2I& aPosition, int aAccuracy = 0 ) const override;
bool Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const override;
/** /**
* Test if a point is inside the bounding polygon of the footprint. * Test if a point is inside the bounding polygon of the footprint.
* *

View File

@ -137,6 +137,7 @@ int FOOTPRINT_SEARCH_HANDLER::Search( const wxString& aQuery )
EDA_SEARCH_DATA frp; EDA_SEARCH_DATA frp;
frp.searchAllFields = settings.search_hidden_fields; frp.searchAllFields = settings.search_hidden_fields;
frp.searchMetadata = settings.search_metadata;
frp.findString = aQuery; frp.findString = aQuery;
// Try to handle whatever the user throws at us (substring, wildcards, regex, etc.) // Try to handle whatever the user throws at us (substring, wildcards, regex, etc.)
@ -144,22 +145,30 @@ int FOOTPRINT_SEARCH_HANDLER::Search( const wxString& aQuery )
for( FOOTPRINT* fp : board->Footprints() ) for( FOOTPRINT* fp : board->Footprints() )
{ {
if( frp.findString.IsEmpty() ) bool found = false;
{
m_hitlist.push_back( fp );
continue;
}
if( frp.findString.IsEmpty() )
found = true;
if( !found && fp->Matches( frp, nullptr ) )
found = true;
if( !found )
{
for( PCB_FIELD* field : fp->GetFields() ) for( PCB_FIELD* field : fp->GetFields() )
{ {
if( field->Matches( frp, nullptr ) ) if( field->Matches( frp, nullptr ) )
{ {
m_hitlist.push_back( fp ); found = true;
break; break;
} }
} }
} }
if( found )
m_hitlist.push_back( fp );
}
return (int) m_hitlist.size(); return (int) m_hitlist.size();
} }
@ -208,6 +217,7 @@ int ZONE_SEARCH_HANDLER::Search( const wxString& aQuery )
EDA_SEARCH_DATA frp; EDA_SEARCH_DATA frp;
frp.searchAllFields = settings.search_hidden_fields; frp.searchAllFields = settings.search_hidden_fields;
frp.searchMetadata = settings.search_metadata;
frp.findString = aQuery; frp.findString = aQuery;
// Try to handle whatever the user throws at us (substring, wildcards, regex, etc.) // Try to handle whatever the user throws at us (substring, wildcards, regex, etc.)
@ -273,6 +283,7 @@ int TEXT_SEARCH_HANDLER::Search( const wxString& aQuery )
EDA_SEARCH_DATA frp; EDA_SEARCH_DATA frp;
frp.searchAllFields = settings.search_hidden_fields; frp.searchAllFields = settings.search_hidden_fields;
frp.searchMetadata = settings.search_metadata;
frp.findString = aQuery; frp.findString = aQuery;
// Try to handle whatever the user throws at us (substring, wildcards, regex, etc.) // Try to handle whatever the user throws at us (substring, wildcards, regex, etc.)
@ -341,6 +352,7 @@ int NETS_SEARCH_HANDLER::Search( const wxString& aQuery )
EDA_SEARCH_DATA frp; EDA_SEARCH_DATA frp;
frp.searchAllFields = settings.search_hidden_fields; frp.searchAllFields = settings.search_hidden_fields;
frp.searchMetadata = settings.search_metadata;
frp.findString = aQuery; frp.findString = aQuery;
// Try to handle whatever the user throws at us (substring, wildcards, regex, etc.) // Try to handle whatever the user throws at us (substring, wildcards, regex, etc.)
@ -423,6 +435,7 @@ int RATSNEST_SEARCH_HANDLER::Search( const wxString& aQuery )
EDA_SEARCH_DATA frp; EDA_SEARCH_DATA frp;
frp.searchAllFields = settings.search_hidden_fields; frp.searchAllFields = settings.search_hidden_fields;
frp.searchMetadata = settings.search_metadata;
frp.findString = aQuery; frp.findString = aQuery;
// Try to handle whatever the user throws at us (substring, wildcards, regex, etc.) // Try to handle whatever the user throws at us (substring, wildcards, regex, etc.)