ADDED: menu item to control searching of hidden fields.

Applies to both PCBNew & Eeschema search panels.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/20370
This commit is contained in:
Jeff Young 2025-04-07 17:00:27 +01:00
parent 0659290417
commit 3def4afaec
8 changed files with 99 additions and 37 deletions

View File

@ -193,6 +193,9 @@ APP_SETTINGS_BASE::APP_SETTINGS_BASE( const std::string& aFilename, int aSchemaV
reinterpret_cast<int*>( &m_SearchPane.selection_zoom ),
static_cast<int>( SEARCH_PANE::SELECTION_ZOOM::PAN ) ) );
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>( "system.first_run_shown",
&m_System.first_run_shown, false ) ); //@todo RFB remove? - not used

View File

@ -29,22 +29,28 @@
#include <widgets/std_bitmap_button.h>
#define ID_TOGGLE_ZOOM_TO_SELECTION 14000
#define ID_TOGGLE_PAN_TO_SELECTION 14001
#define ID_TOGGLE_ZOOM_TO_SELECTION 14000
#define ID_TOGGLE_PAN_TO_SELECTION 14001
#define ID_TOGGLE_SEARCH_HIDDEN_FIELDS 14002
class SEARCH_PANE_MENU : public ACTION_MENU
{
public:
SEARCH_PANE_MENU( EDA_DRAW_FRAME& aFrame ) :
SEARCH_PANE_MENU( SEARCH_PANE* aSearchPane, EDA_DRAW_FRAME& aFrame ) :
ACTION_MENU( true, nullptr ),
m_frame( aFrame )
m_frame( aFrame ),
m_searchPane( aSearchPane )
{
Add( _( "Zoom to Selection" ), _( "Toggle zooming to selections in the search pane" ),
ID_TOGGLE_ZOOM_TO_SELECTION, BITMAPS::zoom_fit_to_objects, true );
Add( _( "Pan to Selection" ), _( "Toggle panning to selections in the search pane" ),
ID_TOGGLE_PAN_TO_SELECTION, BITMAPS::zoom_center_on_screen, true );
AppendSeparator();
Add( _( "Search Hidden Fields" ), wxEmptyString,
ID_TOGGLE_SEARCH_HIDDEN_FIELDS, BITMAPS::invisible_text, true );
updateZoomPanCheckboxes();
}
@ -61,12 +67,20 @@ public:
: APP_SETTINGS_BASE::SEARCH_PANE::SELECTION_ZOOM::NONE;
updateZoomPanCheckboxes();
break;
case ID_TOGGLE_PAN_TO_SELECTION:
settings.selection_zoom = item->IsChecked() ? APP_SETTINGS_BASE::SEARCH_PANE::SELECTION_ZOOM::PAN
: APP_SETTINGS_BASE::SEARCH_PANE::SELECTION_ZOOM::NONE;
updateZoomPanCheckboxes();
break;
case ID_TOGGLE_SEARCH_HIDDEN_FIELDS:
settings.search_hidden_fields = item->IsChecked();
updateZoomPanCheckboxes();
m_searchPane->RefreshSearch();
break;
}
return OPT_TOOL_EVENT();
}
@ -77,13 +91,16 @@ 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 );
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 );
}
private:
EDA_DRAW_FRAME& m_frame;
SEARCH_PANE* m_searchPane;
};
@ -93,7 +110,7 @@ SEARCH_PANE::SEARCH_PANE( EDA_DRAW_FRAME* aFrame ) :
{
m_frame->Bind( EDA_LANG_CHANGED, &SEARCH_PANE::OnLanguageChange, this );
m_menu = new SEARCH_PANE_MENU( *m_frame );
m_menu = new SEARCH_PANE_MENU( this, *m_frame );
m_menuButton->SetBitmap( KiBitmapBundle( BITMAPS::config ) );
m_menuButton->Bind( wxEVT_LEFT_DOWN,

View File

@ -173,8 +173,10 @@ int SYMBOL_SEARCH_HANDLER::Search( const wxString& aQuery )
{
m_hitlist.clear();
SCH_SEARCH_DATA frp;
frp.searchAllFields = true;
APP_SETTINGS_BASE::SEARCH_PANE& settings = m_frame->config()->m_SearchPane;
SCH_SEARCH_DATA frp;
frp.searchAllFields = settings.search_hidden_fields;
frp.findString = aQuery;
// Try to handle whatever the user throws at us (substring, wildcards, regex, etc.)
@ -255,8 +257,10 @@ int POWER_SEARCH_HANDLER::Search( const wxString& aQuery )
{
m_hitlist.clear();
SCH_SEARCH_DATA frp;
frp.searchAllFields = true;
APP_SETTINGS_BASE::SEARCH_PANE& settings = m_frame->config()->m_SearchPane;
SCH_SEARCH_DATA frp;
frp.searchAllFields = settings.search_hidden_fields;
frp.findString = aQuery;
// Try to handle whatever the user throws at us (substring, wildcards, regex, etc.)
@ -327,8 +331,10 @@ int TEXT_SEARCH_HANDLER::Search( const wxString& aQuery )
{
m_hitlist.clear();
SCH_SEARCH_DATA frp;
frp.searchAllFields = true;
APP_SETTINGS_BASE::SEARCH_PANE& settings = m_frame->config()->m_SearchPane;
SCH_SEARCH_DATA frp;
frp.searchAllFields = settings.search_hidden_fields;
frp.findString = aQuery;
// Try to handle whatever the user throws at us (substring, wildcards, regex, etc.)
@ -412,8 +418,10 @@ int LABEL_SEARCH_HANDLER::Search( const wxString& aQuery )
{
m_hitlist.clear();
SCH_SEARCH_DATA frp;
frp.searchAllFields = true;
APP_SETTINGS_BASE::SEARCH_PANE& settings = m_frame->config()->m_SearchPane;
SCH_SEARCH_DATA frp;
frp.searchAllFields = settings.search_hidden_fields;
frp.findString = aQuery;
// Try to handle whatever the user throws at us (substring, wildcards, regex, etc.)

View File

@ -39,13 +39,14 @@ enum class EDA_SEARCH_MATCH_MODE
struct EDA_SEARCH_DATA
{
wxString findString;
wxString replaceString;
wxString findString;
wxString replaceString;
mutable wxRegEx regex;
mutable wxString regex_string;
bool searchAndReplace;
bool searchAndReplace;
bool searchAllFields;
bool matchCase;
bool markersOnly;
@ -55,6 +56,7 @@ struct EDA_SEARCH_DATA
findString(),
replaceString(),
searchAndReplace( false ),
searchAllFields( false ),
matchCase( false ),
markersOnly( false ),
matchMode( EDA_SEARCH_MATCH_MODE::PLAIN )
@ -83,7 +85,6 @@ struct EDA_SEARCH_DATA
struct SCH_SEARCH_DATA : public EDA_SEARCH_DATA
{
bool searchAllFields;
bool searchAllPins;
bool searchCurrentSheetOnly;
bool searchSelectedOnly;
@ -93,7 +94,6 @@ struct SCH_SEARCH_DATA : public EDA_SEARCH_DATA
SCH_SEARCH_DATA() :
EDA_SEARCH_DATA(),
searchAllFields( false ),
searchAllPins( false ),
searchCurrentSheetOnly( false ),
searchSelectedOnly( false ),

View File

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

View File

@ -138,6 +138,15 @@ wxString PCB_FIELD::GetTextTypeDescription() const
}
bool PCB_FIELD::Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const
{
if( !IsVisible() && !aSearchData.searchAllFields )
return false;
return PCB_TEXT::Matches( aSearchData, aAuxData );
}
wxString PCB_FIELD::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const
{
wxString content = aFull ? GetShownText( false ) : KIUI::EllipsizeMenuText( GetText() );

View File

@ -76,6 +76,8 @@ public:
wxString GetTextTypeDescription() const override;
bool Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const override;
wxString GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const override;
double ViewGetLOD( int aLayer, const KIGFX::VIEW* aView ) const override;

View File

@ -131,7 +131,10 @@ int FOOTPRINT_SEARCH_HANDLER::Search( const wxString& aQuery )
if( board == nullptr )
return 0;
EDA_SEARCH_DATA frp;
APP_SETTINGS_BASE::SEARCH_PANE& settings = m_frame->config()->m_SearchPane;
EDA_SEARCH_DATA frp;
frp.searchAllFields = settings.search_hidden_fields;
frp.findString = aQuery;
// Try to handle whatever the user throws at us (substring, wildcards, regex, etc.)
@ -139,11 +142,19 @@ int FOOTPRINT_SEARCH_HANDLER::Search( const wxString& aQuery )
for( FOOTPRINT* fp : board->Footprints() )
{
if( aQuery.IsEmpty()
|| fp->Reference().Matches( frp, nullptr )
|| fp->Value().Matches( frp, nullptr ) )
if( frp.findString.IsEmpty() )
{
m_hitlist.push_back( fp );
continue;
}
for( PCB_FIELD* field : fp->GetFields() )
{
if( field->Matches( frp, nullptr ) )
{
m_hitlist.push_back( fp );
break;
}
}
}
@ -187,7 +198,10 @@ int ZONE_SEARCH_HANDLER::Search( const wxString& aQuery )
m_hitlist.clear();
BOARD* board = m_frame->GetBoard();
EDA_SEARCH_DATA frp;
APP_SETTINGS_BASE::SEARCH_PANE& settings = m_frame->config()->m_SearchPane;
EDA_SEARCH_DATA frp;
frp.searchAllFields = settings.search_hidden_fields;
frp.findString = aQuery;
// Try to handle whatever the user throws at us (substring, wildcards, regex, etc.)
@ -195,10 +209,8 @@ int ZONE_SEARCH_HANDLER::Search( const wxString& aQuery )
for( BOARD_ITEM* item : board->Zones() )
{
ZONE* zoneItem = dynamic_cast<ZONE*>( item );
if( zoneItem && ( aQuery.IsEmpty() || zoneItem->Matches( frp, nullptr ) ) )
m_hitlist.push_back( zoneItem );
if( frp.findString.IsEmpty() || item->Matches( frp, nullptr ) )
m_hitlist.push_back( item );
}
return (int) m_hitlist.size();
@ -251,7 +263,10 @@ int TEXT_SEARCH_HANDLER::Search( const wxString& aQuery )
m_hitlist.clear();
BOARD* board = m_frame->GetBoard();
EDA_SEARCH_DATA frp;
APP_SETTINGS_BASE::SEARCH_PANE& settings = m_frame->config()->m_SearchPane;
EDA_SEARCH_DATA frp;
frp.searchAllFields = settings.search_hidden_fields;
frp.findString = aQuery;
// Try to handle whatever the user throws at us (substring, wildcards, regex, etc.)
@ -259,13 +274,14 @@ int TEXT_SEARCH_HANDLER::Search( const wxString& aQuery )
for( BOARD_ITEM* item : board->Drawings() )
{
PCB_TEXT* textItem = dynamic_cast<PCB_TEXT*>( item );
PCB_TEXTBOX* textBoxItem = dynamic_cast<PCB_TEXTBOX*>( item );
if( textItem && ( aQuery.IsEmpty() || textItem->Matches( frp, nullptr ) ) )
m_hitlist.push_back( textItem );
else if( textBoxItem && ( aQuery.IsEmpty() || textBoxItem->Matches( frp, nullptr ) ) )
m_hitlist.push_back( textBoxItem );
if( item->Type() == PCB_TEXT_T
|| BaseType( item->Type() ) == PCB_DIMENSION_T
|| item->Type() == PCB_TEXTBOX_T
|| item->Type() == PCB_TABLECELL_T )
{
if( frp.findString.IsEmpty() || item->Matches( frp, nullptr ) )
m_hitlist.push_back( item );
}
}
return (int) m_hitlist.size();
@ -315,7 +331,10 @@ int NETS_SEARCH_HANDLER::Search( const wxString& aQuery )
{
m_hitlist.clear();
EDA_SEARCH_DATA frp;
APP_SETTINGS_BASE::SEARCH_PANE& settings = m_frame->config()->m_SearchPane;
EDA_SEARCH_DATA frp;
frp.searchAllFields = settings.search_hidden_fields;
frp.findString = aQuery;
// Try to handle whatever the user throws at us (substring, wildcards, regex, etc.)
@ -394,7 +413,10 @@ int RATSNEST_SEARCH_HANDLER::Search( const wxString& aQuery )
{
m_hitlist.clear();
EDA_SEARCH_DATA frp;
APP_SETTINGS_BASE::SEARCH_PANE& settings = m_frame->config()->m_SearchPane;
EDA_SEARCH_DATA frp;
frp.searchAllFields = settings.search_hidden_fields;
frp.findString = aQuery;
// Try to handle whatever the user throws at us (substring, wildcards, regex, etc.)