Apply selectable logic to delete tool.

Fixes: lp:1838191
* https://bugs.launchpad.net/kicad/+bug/1838191
This commit is contained in:
Jeff Young 2019-07-28 12:30:56 -06:00
parent c03535343c
commit 987642eb8c
3 changed files with 39 additions and 29 deletions

View File

@ -526,6 +526,7 @@ int PCBNEW_CONTROL::DeleteItemCursor( const TOOL_EVENT& aEvent )
[this] ( const VECTOR2D& aPos ) [this] ( const VECTOR2D& aPos )
{ {
BOARD* board = m_frame->GetBoard(); BOARD* board = m_frame->GetBoard();
SELECTION_TOOL* selectionTool = m_toolMgr->GetTool<SELECTION_TOOL>();
GENERAL_COLLECTORS_GUIDE guide = m_frame->GetCollectorsGuide(); GENERAL_COLLECTORS_GUIDE guide = m_frame->GetCollectorsGuide();
GENERAL_COLLECTOR collector; GENERAL_COLLECTOR collector;
collector.m_Threshold = KiROUND( getView()->ToWorld( HITTEST_THRESHOLD_PIXELS ) ); collector.m_Threshold = KiROUND( getView()->ToWorld( HITTEST_THRESHOLD_PIXELS ) );
@ -535,11 +536,20 @@ int PCBNEW_CONTROL::DeleteItemCursor( const TOOL_EVENT& aEvent )
else else
collector.Collect( board, GENERAL_COLLECTOR::BoardLevelItems, (wxPoint) aPos, guide ); collector.Collect( board, GENERAL_COLLECTOR::BoardLevelItems, (wxPoint) aPos, guide );
// Remove unselectable items
for( int i = collector.GetCount() - 1; i >= 0; --i )
{
if( !selectionTool->Selectable( collector[ i ] ) )
collector.Remove( i );
}
if( collector.GetCount() > 1 )
selectionTool->GuessSelectionCandidates( collector, aPos );
BOARD_ITEM* item = collector.GetCount() == 1 ? collector[ 0 ] : nullptr; BOARD_ITEM* item = collector.GetCount() == 1 ? collector[ 0 ] : nullptr;
if( m_pickerItem != item ) if( m_pickerItem != item )
{ {
SELECTION_TOOL* selectionTool = m_toolMgr->GetTool<SELECTION_TOOL>();
if( m_pickerItem ) if( m_pickerItem )
selectionTool->UnbrightenItem( m_pickerItem ); selectionTool->UnbrightenItem( m_pickerItem );

View File

@ -400,7 +400,7 @@ bool SELECTION_TOOL::selectPoint( const VECTOR2I& aWhere, bool aOnDrag,
// Remove unselectable items // Remove unselectable items
for( int i = collector.GetCount() - 1; i >= 0; --i ) for( int i = collector.GetCount() - 1; i >= 0; --i )
{ {
if( !selectable( collector[i] ) || ( aOnDrag && collector[i]->IsLocked() ) ) if( !Selectable( collector[ i ] ) || ( aOnDrag && collector[i]->IsLocked() ) )
collector.Remove( i ); collector.Remove( i );
} }
@ -414,7 +414,7 @@ bool SELECTION_TOOL::selectPoint( const VECTOR2I& aWhere, bool aOnDrag,
// Apply some ugly heuristics to avoid disambiguation menus whenever possible // Apply some ugly heuristics to avoid disambiguation menus whenever possible
if( collector.GetCount() > 1 && !m_skip_heuristics ) if( collector.GetCount() > 1 && !m_skip_heuristics )
{ {
guessSelectionCandidates( collector, aWhere ); GuessSelectionCandidates( collector, aWhere );
} }
// If still more than one item we're going to have to ask the user. // If still more than one item we're going to have to ask the user.
@ -542,7 +542,7 @@ bool SELECTION_TOOL::selectMultiple()
{ {
BOARD_ITEM* item = static_cast<BOARD_ITEM*>( it->first ); BOARD_ITEM* item = static_cast<BOARD_ITEM*>( it->first );
if( !item || !selectable( item ) ) if( !item || !Selectable( item ) )
continue; continue;
if( item->HitTest( selectionRect, windowSelection ) ) if( item->HitTest( selectionRect, windowSelection ) )
@ -1426,7 +1426,7 @@ BOARD_ITEM* SELECTION_TOOL::pickSmallestComponent( GENERAL_COLLECTOR* aCollector
} }
bool SELECTION_TOOL::selectable( const BOARD_ITEM* aItem, bool checkVisibilityOnly ) const bool SELECTION_TOOL::Selectable( const BOARD_ITEM* aItem, bool checkVisibilityOnly ) const
{ {
// Is high contrast mode enabled? // Is high contrast mode enabled?
bool highContrast = getView()->GetPainter()->GetSettings()->GetHighContrast(); bool highContrast = getView()->GetPainter()->GetSettings()->GetHighContrast();
@ -1535,13 +1535,13 @@ bool SELECTION_TOOL::selectable( const BOARD_ITEM* aItem, bool checkVisibilityOn
for( auto item : module->GraphicalItems() ) for( auto item : module->GraphicalItems() )
{ {
if( selectable( item, true ) ) if( Selectable( item, true ) )
return true; return true;
} }
for( auto pad : module->Pads() ) for( auto pad : module->Pads() )
{ {
if( selectable( pad, true ) ) if( Selectable( pad, true ) )
return true; return true;
} }
@ -1884,7 +1884,7 @@ double calcRatio( double a, double b )
// We currently check for pads and text mostly covering a footprint, but we dont check for // We currently check for pads and text mostly covering a footprint, but we dont check for
// smaller footprints mostly covering a larger footprint. // smaller footprints mostly covering a larger footprint.
// //
void SELECTION_TOOL::guessSelectionCandidates( GENERAL_COLLECTOR& aCollector, void SELECTION_TOOL::GuessSelectionCandidates( GENERAL_COLLECTOR& aCollector,
const VECTOR2I& aWhere ) const const VECTOR2I& aWhere ) const
{ {
std::set<BOARD_ITEM*> preferred; std::set<BOARD_ITEM*> preferred;

View File

@ -123,10 +123,21 @@ public:
void UnbrightenItem( BOARD_ITEM* aItem ); void UnbrightenItem( BOARD_ITEM* aItem );
/** /**
* Rebuilds the selection from the EDA_ITEMs' selection flags. Commonly called after * Function selectable()
* rolling back an undo state to make sure there aren't any stale pointers. * Checks conditions for an item to be selected.
*
* @return True if the item fulfills conditions to be selected.
*/ */
void RebuildSelection(); bool Selectable( const BOARD_ITEM* aItem, bool checkVisibilityOnly = false ) const;
/**
* Function guessSelectionCandidates()
* Tries to guess best selection candidates in case multiple items are clicked, by doing
* some brain-dead heuristics.
* @param aCollector is the collector that has a list of items to be queried.
* @param aWhere is the selection point to consider
*/
void GuessSelectionCandidates( GENERAL_COLLECTOR& aCollector, const VECTOR2I& aWhere ) const;
/** /**
* Function SelectionMenu() * Function SelectionMenu()
@ -137,6 +148,12 @@ public:
*/ */
int SelectionMenu( const TOOL_EVENT& aEvent ); int SelectionMenu( const TOOL_EVENT& aEvent );
/**
* Rebuilds the selection from the EDA_ITEMs' selection flags. Commonly called after
* rolling back an undo state to make sure there aren't any stale pointers.
*/
void RebuildSelection();
///> Sets up handlers for various events. ///> Sets up handlers for various events.
void setTransitions() override; void setTransitions() override;
@ -261,14 +278,6 @@ private:
*/ */
BOARD_ITEM* pickSmallestComponent( GENERAL_COLLECTOR* aCollector ); BOARD_ITEM* pickSmallestComponent( GENERAL_COLLECTOR* aCollector );
/**
* Function selectable()
* Checks conditions for an item to be selected.
*
* @return True if the item fulfills conditions to be selected.
*/
bool selectable( const BOARD_ITEM* aItem, bool checkVisibilityOnly = false ) const;
/** /**
* Function select() * Function select()
* Takes necessary action mark an item as selected. * Takes necessary action mark an item as selected.
@ -311,15 +320,6 @@ private:
*/ */
bool selectionContains( const VECTOR2I& aPoint ) const; bool selectionContains( const VECTOR2I& aPoint ) const;
/**
* Function guessSelectionCandidates()
* Tries to guess best selection candidates in case multiple items are clicked, by
* doing some braindead heuristics.
* @param aCollector is the collector that has a list of items to be queried.
* @param aWhere is the selection point to consider
*/
void guessSelectionCandidates( GENERAL_COLLECTOR& aCollector, const VECTOR2I& aWhere ) const;
/** /**
* Event handler to update the selection VIEW_ITEM. * Event handler to update the selection VIEW_ITEM.
*/ */