Treat Reference and Unit as separate words when searching.

Fixes https://gitlab.com/kicad/code/kicad/issues/4630
This commit is contained in:
Jeff Young 2020-09-20 18:52:56 +01:00
parent 884bed7e12
commit fdbb28aea2
3 changed files with 39 additions and 30 deletions

View File

@ -328,19 +328,23 @@ bool SCH_FIELD::Matches( wxFindReplaceData& aSearchData, void* aAuxData )
if( !IsVisible() && !searchHiddenFields )
return false;
if( m_Parent && m_Parent->Type() == SCH_COMPONENT_T )
if( m_Parent && m_Parent->Type() == SCH_COMPONENT_T && m_id == REFERENCE )
{
SCH_COMPONENT* parentComponent = static_cast<SCH_COMPONENT*>( m_Parent );
if( searchAndReplace && m_id == REFERENCE && !replaceReferences )
if( searchAndReplace && !replaceReferences )
return false;
SCH_COMPONENT* parentComponent = static_cast<SCH_COMPONENT*>( m_Parent );
wxASSERT( aAuxData );
// Take sheet path into account which effects the reference field and the unit for
// components with multiple parts.
if( m_id == REFERENCE && aAuxData != NULL )
if( aAuxData )
{
text = parentComponent->GetRef( (SCH_SHEET_PATH*) aAuxData );
if( SCH_ITEM::Matches( text, aSearchData ) )
return true;
if( parentComponent->GetUnitCount() > 1 )
text << LIB_PART::SubReference( parentComponent->GetUnit() );
}

View File

@ -246,9 +246,9 @@ int SCH_EDITOR_CONTROL::UpdateFind( const TOOL_EVENT& aEvent )
{
wxFindReplaceData* data = m_frame->GetFindReplaceData();
auto visit = [&] ( EDA_ITEM* aItem )
auto visit = [&]( EDA_ITEM* aItem, SCH_SHEET_PATH* aSheet )
{
if( data && aItem->Matches( *data, nullptr ) )
if( data && aItem->Matches( *data, aSheet ) )
{
aItem->SetForceVisible( true );
m_selectionTool->BrightenItem( aItem );
@ -267,27 +267,27 @@ int SCH_EDITOR_CONTROL::UpdateFind( const TOOL_EVENT& aEvent )
for( SCH_ITEM* item : m_frame->GetScreen()->Items() )
{
visit( item );
visit( item, &m_frame->GetCurrentSheet() );
if( item->Type() == SCH_COMPONENT_T )
{
SCH_COMPONENT* cmp = static_cast<SCH_COMPONENT*>( item );
for( SCH_FIELD& field : cmp->GetFields() )
visit( &field );
visit( &field, &m_frame->GetCurrentSheet() );
for( SCH_PIN* pin : cmp->GetPins() )
visit( pin );
visit( pin, &m_frame->GetCurrentSheet() );
}
else if( item->Type() == SCH_SHEET_T )
{
SCH_SHEET* sheet = static_cast<SCH_SHEET*>( item );
for( SCH_FIELD& field : sheet->GetFields() )
visit( &field );
visit( &field, &m_frame->GetCurrentSheet() );
for( SCH_SHEET_PIN* pin : sheet->GetPins() )
visit( pin );
visit( pin, &m_frame->GetCurrentSheet() );
}
}
@ -295,7 +295,7 @@ int SCH_EDITOR_CONTROL::UpdateFind( const TOOL_EVENT& aEvent )
else if( aEvent.Matches( EVENTS::SelectedItemsModified ) )
{
for( EDA_ITEM* item : m_selectionTool->GetSelection() )
visit( item );
visit( item, &m_frame->GetCurrentSheet() );
}
getView()->UpdateItems();
@ -306,8 +306,8 @@ int SCH_EDITOR_CONTROL::UpdateFind( const TOOL_EVENT& aEvent )
}
SCH_ITEM* SCH_EDITOR_CONTROL::nextMatch( SCH_SCREEN* aScreen, SCH_ITEM* aAfter,
wxFindReplaceData* aData )
SCH_ITEM* SCH_EDITOR_CONTROL::nextMatch( SCH_SCREEN* aScreen, SCH_SHEET_PATH* aSheet,
SCH_ITEM* aAfter, wxFindReplaceData* aData )
{
bool past_item = true;
@ -331,7 +331,7 @@ SCH_ITEM* SCH_EDITOR_CONTROL::nextMatch( SCH_SCREEN* aScreen, SCH_ITEM* aAfter,
if( aData == &g_markersOnly && item->Type() == SCH_MARKER_T )
return item;
if( item->Matches( *aData, nullptr ) )
if( item->Matches( *aData, aSheet ) )
return item;
if( item->Type() == SCH_COMPONENT_T )
@ -340,13 +340,13 @@ SCH_ITEM* SCH_EDITOR_CONTROL::nextMatch( SCH_SCREEN* aScreen, SCH_ITEM* aAfter,
for( SCH_FIELD& field : cmp->GetFields() )
{
if( field.Matches( *aData, nullptr ) )
if( field.Matches( *aData, aSheet ) )
return &field;
}
for( SCH_PIN* pin : cmp->GetPins() )
{
if( pin->Matches( *aData, nullptr ) )
if( pin->Matches( *aData, aSheet ) )
return pin;
}
}
@ -357,13 +357,13 @@ SCH_ITEM* SCH_EDITOR_CONTROL::nextMatch( SCH_SCREEN* aScreen, SCH_ITEM* aAfter,
for( SCH_FIELD& field : sheet->GetFields() )
{
if( field.Matches( *aData, nullptr ) )
if( field.Matches( *aData, aSheet ) )
return &field;
}
for( SCH_SHEET_PIN* pin : sheet->GetPins() )
{
if( pin->Matches( *aData, nullptr ) )
if( pin->Matches( *aData, aSheet ) )
return pin;
}
}
@ -410,7 +410,7 @@ int SCH_EDITOR_CONTROL::FindNext( const TOOL_EVENT& aEvent )
m_selectionTool->ClearSelection();
if( afterScreen || !searchAllSheets )
item = nextMatch( m_frame->GetScreen(), afterItem, data );
item = nextMatch( m_frame->GetScreen(), &m_frame->GetCurrentSheet(), afterItem, data );
if( !item && searchAllSheets )
{
@ -427,11 +427,12 @@ int SCH_EDITOR_CONTROL::FindNext( const TOOL_EVENT& aEvent )
continue;
}
item = nextMatch( screen, nullptr, data );
SCH_SHEET_PATH* sheet = schematic.FindSheetForScreen( screen );
item = nextMatch( screen, sheet, nullptr, data );
if( item )
{
SCH_SHEET_PATH* sheet = schematic.FindSheetForScreen( screen );
wxCHECK_MSG( sheet, 0, "Sheet not found for " + screen->GetFileName() );
m_frame->Schematic().SetCurrentSheet( *sheet );
@ -473,7 +474,7 @@ bool SCH_EDITOR_CONTROL::HasMatch()
wxFindReplaceData* data = m_frame->GetFindReplaceData();
EDA_ITEM* item = m_selectionTool->GetSelection().Front();
return data && item && item->Matches( *data, nullptr );
return data && item && item->Matches( *data, &m_frame->GetCurrentSheet() );
}
@ -481,13 +482,14 @@ int SCH_EDITOR_CONTROL::ReplaceAndFindNext( const TOOL_EVENT& aEvent )
{
wxFindReplaceData* data = m_frame->GetFindReplaceData();
EDA_ITEM* item = m_selectionTool->GetSelection().Front();
SCH_SHEET_PATH* sheet = &m_frame->GetCurrentSheet();
if( !data )
return FindAndReplace( ACTIONS::find.MakeEvent() );
if( item && item->Matches( *data, nullptr ) )
if( item && item->Matches( *data, sheet ) )
{
if( item->Replace( *data, &m_frame->GetCurrentSheet() ) )
if( item->Replace( *data, sheet ) )
{
m_frame->UpdateItem( item );
m_frame->OnModify();
@ -512,15 +514,17 @@ int SCH_EDITOR_CONTROL::ReplaceAll( const TOOL_EVENT& aEvent )
for( SCH_SCREEN* screen = screens.GetFirst(); screen; screen = screens.GetNext() )
{
for( EDA_ITEM* item = nextMatch( screen, nullptr, data ); item; )
SCH_SHEET_PATH* sheet = schematic.FindSheetForScreen( screen );
for( EDA_ITEM* item = nextMatch( screen, sheet, nullptr, data ); item; )
{
if( item->Replace( *data, schematic.FindSheetForScreen( screen ) ) )
if( item->Replace( *data, sheet ) )
{
m_frame->UpdateItem( item );
m_frame->OnModify();
}
item = nextMatch( screen, dynamic_cast<SCH_ITEM*>( item ), data );
item = nextMatch( screen, sheet, dynamic_cast<SCH_ITEM*>( item ), data );
}
}

View File

@ -200,7 +200,8 @@ private:
* @param aData Search data to compare against or NULL to match the first item found
* @return pointer to the next search item found or NULL if nothing found
*/
SCH_ITEM* nextMatch( SCH_SCREEN* aScreen, SCH_ITEM* aAfter, wxFindReplaceData* aData );
SCH_ITEM* nextMatch( SCH_SCREEN* aScreen, SCH_SHEET_PATH* aSheet, SCH_ITEM* aAfter,
wxFindReplaceData* aData );
private:
bool m_probingPcbToSch; // Recursion guard when cross-probing to PCBNew