Added preference for selecting tracks/vias/graphics if there is a module present in the selection point.
This commit is contained in:
parent
7fd9fc4911
commit
6b222d19d5
|
@ -227,6 +227,7 @@ bool SELECTION_TOOL::selectSingle( const VECTOR2I& aWhere, bool aAllowDisambigua
|
|||
BOARD_ITEM* item;
|
||||
GENERAL_COLLECTORS_GUIDE guide = getEditFrame<PCB_EDIT_FRAME>()->GetCollectorsGuide();
|
||||
GENERAL_COLLECTOR collector;
|
||||
const KICAD_T types[] = { PCB_TRACE_T, PCB_VIA_T, PCB_LINE_T, EOT }; // preferred types
|
||||
|
||||
collector.Collect( pcb, GENERAL_COLLECTOR::AllBoardItems,
|
||||
wxPoint( aWhere.x, aWhere.y ), guide );
|
||||
|
@ -252,6 +253,14 @@ bool SELECTION_TOOL::selectSingle( const VECTOR2I& aWhere, bool aAllowDisambigua
|
|||
collector.Remove( i );
|
||||
}
|
||||
|
||||
// Check if among the selection candidates there is only one instance of preferred type
|
||||
if( item = prefer( collector, types ) )
|
||||
{
|
||||
toggleSelection( item );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Let's see if there is still disambiguation in selection..
|
||||
if( collector.GetCount() == 1 )
|
||||
{
|
||||
|
@ -681,6 +690,38 @@ void SELECTION_TOOL::highlightNet( const VECTOR2I& aPoint )
|
|||
}
|
||||
|
||||
|
||||
BOARD_ITEM* SELECTION_TOOL::prefer( GENERAL_COLLECTOR& aCollector, const KICAD_T aTypes[] ) const
|
||||
{
|
||||
BOARD_ITEM* preferred = NULL;
|
||||
|
||||
int typesNr = 0;
|
||||
while( aTypes[typesNr++] != EOT ); // count number of types, excluding the sentinel (EOT)
|
||||
|
||||
for( int i = 0; i < aCollector.GetCount(); ++i )
|
||||
{
|
||||
KICAD_T type = aCollector[i]->Type();
|
||||
|
||||
for( int j = 0; j < typesNr - 1; ++j ) // Check if the item's type is in our list
|
||||
{
|
||||
if( aTypes[j] == type )
|
||||
{
|
||||
if( preferred == NULL )
|
||||
{
|
||||
preferred = aCollector[i]; // save the first matching item
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
return NULL; // there is more than one preferred item, so there is no clear choice
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return preferred;
|
||||
}
|
||||
|
||||
|
||||
void SELECTION_TOOL::SELECTION::clear()
|
||||
{
|
||||
items.ClearItemsList();
|
||||
|
|
|
@ -229,6 +229,16 @@ private:
|
|||
*/
|
||||
void highlightNet( const VECTOR2I& aPoint );
|
||||
|
||||
/**
|
||||
* Function prefer()
|
||||
* Checks if collector's list contains only single entry of asked types. If so, it returns it.
|
||||
* @param aCollector is the collector that has a list of items to be queried.
|
||||
* @param aTypes is the list of searched/preferred types.
|
||||
* @return Pointer to the preferred item, if there is only one entry of given type or NULL
|
||||
* if there are more entries or no entries at all.
|
||||
*/
|
||||
BOARD_ITEM* prefer( GENERAL_COLLECTOR& aCollector, const KICAD_T aTypes[] ) const;
|
||||
|
||||
/// Visual representation of selection box
|
||||
SELECTION_AREA* m_selArea;
|
||||
|
||||
|
|
Loading…
Reference in New Issue