Pcbnew, modifiers for left click behavior.

Due to last changes fixing the ALT key problems, the highlight net is
CTRL+SHIFT + left click on Windows and Linux
CTRL+ALT + left click on OSX
Fix also a bad behavior of "remove from selection" left click option

Fixes #6599
https://gitlab.com/kicad/code/kicad/issues/6599
This commit is contained in:
jean-pierre charras 2020-12-04 12:05:46 +01:00
parent 19576ae167
commit 789284f519
1 changed files with 52 additions and 15 deletions

View File

@ -267,35 +267,72 @@ int SELECTION_TOOL::Main( const TOOL_EVENT& aEvent )
// Main loop: keep receiving events // Main loop: keep receiving events
while( OPT_TOOL_EVENT evt = Wait() ) while( OPT_TOOL_EVENT evt = Wait() )
{ {
// on left click, a selection is made, depending on modifiers ALT, SHIFT, CTRL:
// Due to the fact ALT key modifier cannot be useed freely on Windows, actoins
// are different on OSX and others
// No modifier = select items and deselect previous selection
// ALT (on OSX) = skip heuristic and show full selection choice
// ALT (on other) = do nothing (same as no modifier)
//
// CTRL (on OSX) = add selected items to the current selection
// CTRL (on others) = skip heuristic and show full selection choice
//
// SHIFT (on OSX) = do nothing (same as no modifier)
// SHIFT (on other) = add selected items to the current selection
//
// CTRL+SHIFT (on OSX) = remove selected items from the current selection
// CTRL+SHIFT (on others) = highlight net
//
// CTRL+ALT (on OSX) = highlight net
// CTRL+ALT (on others) = do nothing (same as no modifier)
#ifdef __WXOSX_MAC__ #ifdef __WXOSX_MAC__
if( evt->Modifier( MD_CTRL ) && evt->Modifier( MD_SHIFT ) ) m_subtractive = evt->Modifier( MD_CTRL ) &&
m_subtractive = true; evt->Modifier( MD_SHIFT ) &&
else if( evt->Modifier( MD_CTRL ) ) !evt->Modifier( MD_ALT );
m_additive = true;
m_additive = evt->Modifier( MD_CTRL ) &&
!evt->Modifier( MD_SHIFT ) &&
!evt->Modifier( MD_ALT );
// Is the user requesting that the selection list include all possible // Is the user requesting that the selection list include all possible
// items without removing less likely selection candidates // items without removing less likely selection candidates
m_skip_heuristics = evt->Modifier( MD_ALT ); m_skip_heuristics = evt->Modifier( MD_ALT ) &&
#else !evt->Modifier( MD_SHIFT ) &&
if( evt->Modifier( MD_ALT ) && evt->Modifier( MD_SHIFT ) ) !evt->Modifier( MD_ALT );
m_subtractive = true;
else if( evt->Modifier( MD_ALT ) )
m_additive = true;
m_skip_heuristics = evt->Modifier( MD_CTRL ); bool highlight_modifier = evt->Modifier( MD_CTRL ) &&
evt->Modifier( MD_ALT ) &&
!evt->Modifier( MD_SHIFT );
#else
m_subtractive = evt->Modifier( MD_ALT ) &&
evt->Modifier( MD_SHIFT ) &&
!evt->Modifier( MD_CTRL );
m_additive = evt->Modifier( MD_SHIFT ) &&
!evt->Modifier( MD_ALT ) &&
!evt->Modifier( MD_CTRL );
m_skip_heuristics = evt->Modifier( MD_CTRL ) &&
!evt->Modifier( MD_ALT ) &&
!evt->Modifier( MD_SHIFT );
bool highlight_modifier = evt->Modifier( MD_CTRL )
&& evt->Modifier( MD_SHIFT )
&& !evt->Modifier( MD_ALT );
#endif #endif
// Single click? Select single object // Single click? Select single object
if( evt->IsClick( BUT_LEFT ) ) if( evt->IsClick( BUT_LEFT ) )
{ {
if( evt->Modifier( MD_CTRL ) && !m_editModules ) if( highlight_modifier && !m_editModules )
{ {
m_toolMgr->RunAction( PCB_ACTIONS::highlightNet, true ); m_toolMgr->RunAction( PCB_ACTIONS::highlightNet, true );
} }
else else
{ {
// If no modifier keys are pressed, clear the selection // If no modifier keys are pressed, clear the selection
if( !m_additive ) if( !m_additive && !m_subtractive )
clearSelection(); clearSelection();
selectPoint( evt->Position() ); selectPoint( evt->Position() );
@ -476,7 +513,7 @@ void SELECTION_TOOL::toggleSelection( BOARD_ITEM* aItem, bool aForce )
} }
else else
{ {
if( !m_additive ) if( !m_additive && !m_subtractive)
clearSelection(); clearSelection();
// Prevent selection of invisible or inactive items // Prevent selection of invisible or inactive items
@ -550,7 +587,7 @@ bool SELECTION_TOOL::selectPoint( const VECTOR2I& aWhere, bool aOnDrag,
if( collector.GetCount() == 0 ) if( collector.GetCount() == 0 )
{ {
if( !m_additive && anyCollected ) if( !m_additive && !m_subtractive && anyCollected )
{ {
clearSelection(); clearSelection();
} }