From 98ec2d7ba2b3da55be9e784b196712122f39d52b Mon Sep 17 00:00:00 2001 From: Jeff Young Date: Tue, 8 Apr 2025 09:42:56 +0100 Subject: [PATCH] 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 --- common/settings/app_settings.cpp | 3 +++ common/widgets/search_pane.cpp | 11 ++++++++++ eeschema/eeschema_config.cpp | 2 ++ eeschema/eeschema_settings.h | 1 + eeschema/sch_field.cpp | 10 +++++---- eeschema/sch_symbol.cpp | 12 +++++++++++ eeschema/widgets/search_handlers.cpp | 4 ++++ include/eda_search_data.h | 3 +++ include/settings/app_settings.h | 1 + pcbnew/footprint.cpp | 18 ++++++++++++++++ pcbnew/footprint.h | 2 ++ pcbnew/widgets/search_handlers.cpp | 31 ++++++++++++++++++++-------- 12 files changed, 85 insertions(+), 13 deletions(-) diff --git a/common/settings/app_settings.cpp b/common/settings/app_settings.cpp index 8239406c2a..491ace9c23 100644 --- a/common/settings/app_settings.cpp +++ b/common/settings/app_settings.cpp @@ -196,6 +196,9 @@ APP_SETTINGS_BASE::APP_SETTINGS_BASE( const std::string& aFilename, int aSchemaV m_params.emplace_back( new PARAM( "search_pane.search_hidden_fields", &m_SearchPane.search_hidden_fields, true ) ); + m_params.emplace_back( new PARAM( "search_pane.search_metadata", + &m_SearchPane.search_metadata, false ) ); + m_params.emplace_back( new PARAM( "system.first_run_shown", &m_System.first_run_shown, false ) ); //@todo RFB remove? - not used diff --git a/common/widgets/search_pane.cpp b/common/widgets/search_pane.cpp index 7344b1e590..97a0a4b216 100644 --- a/common/widgets/search_pane.cpp +++ b/common/widgets/search_pane.cpp @@ -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: diff --git a/eeschema/eeschema_config.cpp b/eeschema/eeschema_config.cpp index f75fa98f61..43b339af23 100644 --- a/eeschema/eeschema_config.cpp +++ b/eeschema/eeschema_config.cpp @@ -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; diff --git a/eeschema/eeschema_settings.h b/eeschema/eeschema_settings.h index fe5d964950..50d6600d1e 100644 --- a/eeschema/eeschema_settings.h +++ b/eeschema/eeschema_settings.h @@ -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; diff --git a/eeschema/sch_field.cpp b/eeschema/sch_field.cpp index 6bc7ee65c7..b151623aa0 100644 --- a/eeschema/sch_field.cpp +++ b/eeschema/sch_field.cpp @@ -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( 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 diff --git a/eeschema/sch_symbol.cpp b/eeschema/sch_symbol.cpp index a0ee103052..db4d2afd03 100644 --- a/eeschema/sch_symbol.cpp +++ b/eeschema/sch_symbol.cpp @@ -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 ) ) diff --git a/eeschema/widgets/search_handlers.cpp b/eeschema/widgets/search_handlers.cpp index bbb5b09807..705bc46179 100644 --- a/eeschema/widgets/search_handlers.cpp +++ b/eeschema/widgets/search_handlers.cpp @@ -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.) diff --git a/include/eda_search_data.h b/include/eda_search_data.h index cf86d52695..02d8ce20a5 100644 --- a/include/eda_search_data.h +++ b/include/eda_search_data.h @@ -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 ) diff --git a/include/settings/app_settings.h b/include/settings/app_settings.h index 4e83e6489a..cf9211bf2c 100644 --- a/include/settings/app_settings.h +++ b/include/settings/app_settings.h @@ -115,6 +115,7 @@ public: SELECTION_ZOOM selection_zoom; bool search_hidden_fields; + bool search_metadata; }; struct GRAPHICS diff --git a/pcbnew/footprint.cpp b/pcbnew/footprint.cpp index e64d53e5e6..6a3259fb96 100644 --- a/pcbnew/footprint.cpp +++ b/pcbnew/footprint.cpp @@ -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& aScanTypes ) diff --git a/pcbnew/footprint.h b/pcbnew/footprint.h index 44b74f7183..8b580b27a3 100644 --- a/pcbnew/footprint.h +++ b/pcbnew/footprint.h @@ -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. * diff --git a/pcbnew/widgets/search_handlers.cpp b/pcbnew/widgets/search_handlers.cpp index 98745a72c8..9df3ffb9a8 100644 --- a/pcbnew/widgets/search_handlers.cpp +++ b/pcbnew/widgets/search_handlers.cpp @@ -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.)