mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2025-09-14 10:13:19 +02:00
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:
parent
ec6bc85a29
commit
98ec2d7ba2
@ -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
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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 ) )
|
||||||
|
@ -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.)
|
||||||
|
@ -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 )
|
||||||
|
@ -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
|
||||||
|
@ -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 )
|
||||||
|
@ -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.
|
||||||
*
|
*
|
||||||
|
@ -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.)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user