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_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_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_PAN_TO_SELECTION 14001
#define ID_TOGGLE_SEARCH_HIDDEN_FIELDS 14002
#define ID_TOGGLE_SEARCH_METADATA 14003
class SEARCH_PANE_MENU : public ACTION_MENU
@ -50,6 +51,8 @@ public:
AppendSeparator();
Add( _( "Search Hidden Fields" ), wxEmptyString,
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();
}
@ -79,6 +82,12 @@ public:
updateZoomPanCheckboxes();
m_searchPane->RefreshSearch();
break;
case ID_TOGGLE_SEARCH_METADATA:
settings.search_metadata = item->IsChecked();
updateZoomPanCheckboxes();
m_searchPane->RefreshSearch();
break;
}
return OPT_TOOL_EVENT();
@ -92,10 +101,12 @@ private:
wxMenuItem* zoomCb = FindItem( ID_TOGGLE_ZOOM_TO_SELECTION );
wxMenuItem* panCb = FindItem( ID_TOGGLE_PAN_TO_SELECTION );
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 );
panCb->Check( settings.selection_zoom == APP_SETTINGS_BASE::SEARCH_PANE::SELECTION_ZOOM::PAN );
hiddenFieldsCb->Check( settings.search_hidden_fields );
metadataCb->Check( settings.search_metadata );
}
private:

View File

@ -264,6 +264,7 @@ void SCH_EDIT_FRAME::LoadSettings( APP_SETTINGS_BASE* aCfg )
{
searchData->replaceReferences = cfg->m_FindReplaceExtra.replace_references;
searchData->searchAllFields = cfg->m_FindReplaceExtra.search_all_fields;
searchData->searchMetadata = cfg->m_FindReplaceExtra.search_metadata;
searchData->searchAllPins = cfg->m_FindReplaceExtra.search_all_pins;
searchData->searchCurrentSheetOnly = cfg->m_FindReplaceExtra.search_current_sheet_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.search_all_fields = searchData->searchAllFields;
cfg->m_FindReplaceExtra.search_metadata = searchData->searchMetadata;
cfg->m_FindReplaceExtra.search_all_pins = searchData->searchAllPins;
cfg->m_FindReplaceExtra.search_current_sheet_only =
searchData->searchCurrentSheetOnly;

View File

@ -317,6 +317,7 @@ public:
struct FIND_REPLACE_EXTRA
{
bool search_all_fields;
bool search_metadata;
bool search_all_pins;
bool search_current_sheet_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 searchHiddenFields = false;
bool searchAndReplace = false;
bool searchHiddenFields = aSearchData.searchAllFields;
bool searchMetadata = aSearchData.searchMetadata;
bool searchAndReplace = aSearchData.searchAndReplace;
bool replaceReferences = false;
try
{
// downcast
const SCH_SEARCH_DATA& schSearchData = dynamic_cast<const SCH_SEARCH_DATA&>( aSearchData );
searchHiddenFields = schSearchData.searchAllFields;
searchAndReplace = schSearchData.searchAndReplace;
replaceReferences = schSearchData.replaceReferences;
}
catch( const std::bad_cast& )
@ -673,6 +672,9 @@ bool SCH_FIELD::Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) co
if( !parentSymbol )
return false;
if( parentSymbol->Matches( aSearchData, aAuxData ) )
return true;
wxASSERT( aAuxData );
// 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
{
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() )
{
if( drawItem.Matches( aSearchData, aAuxData ) )

View File

@ -179,6 +179,7 @@ int SYMBOL_SEARCH_HANDLER::Search( const wxString& aQuery )
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.)
@ -267,6 +268,7 @@ int POWER_SEARCH_HANDLER::Search( const wxString& aQuery )
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.)
@ -341,6 +343,7 @@ int TEXT_SEARCH_HANDLER::Search( const wxString& aQuery )
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.)
@ -428,6 +431,7 @@ int LABEL_SEARCH_HANDLER::Search( const wxString& aQuery )
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.)

View File

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

View File

@ -115,6 +115,7 @@ public:
SELECTION_ZOOM selection_zoom;
bool search_hidden_fields;
bool search_metadata;
};
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
INSPECT_RESULT FOOTPRINT::Visit( INSPECTOR inspector, void* testData,
const std::vector<KICAD_T>& aScanTypes )

View File

@ -588,6 +588,8 @@ public:
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.
*

View File

@ -137,6 +137,7 @@ int FOOTPRINT_SEARCH_HANDLER::Search( const wxString& aQuery )
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.)
@ -144,20 +145,28 @@ int FOOTPRINT_SEARCH_HANDLER::Search( const wxString& aQuery )
for( FOOTPRINT* fp : board->Footprints() )
{
if( frp.findString.IsEmpty() )
{
m_hitlist.push_back( fp );
continue;
}
bool found = false;
for( PCB_FIELD* field : fp->GetFields() )
if( frp.findString.IsEmpty() )
found = true;
if( !found && fp->Matches( frp, nullptr ) )
found = true;
if( !found )
{
if( field->Matches( frp, nullptr ) )
for( PCB_FIELD* field : fp->GetFields() )
{
m_hitlist.push_back( fp );
break;
if( field->Matches( frp, nullptr ) )
{
found = true;
break;
}
}
}
if( found )
m_hitlist.push_back( fp );
}
return (int) m_hitlist.size();
@ -208,6 +217,7 @@ int ZONE_SEARCH_HANDLER::Search( const wxString& aQuery )
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.)
@ -273,6 +283,7 @@ int TEXT_SEARCH_HANDLER::Search( const wxString& aQuery )
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.)
@ -341,6 +352,7 @@ int NETS_SEARCH_HANDLER::Search( const wxString& aQuery )
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.)
@ -423,6 +435,7 @@ int RATSNEST_SEARCH_HANDLER::Search( const wxString& aQuery )
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.)