diff --git a/pcbnew/tools/pcb_selection_tool.cpp b/pcbnew/tools/pcb_selection_tool.cpp index 5c157483fc..a33d7feaad 100644 --- a/pcbnew/tools/pcb_selection_tool.cpp +++ b/pcbnew/tools/pcb_selection_tool.cpp @@ -272,10 +272,10 @@ int PCB_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent ) setModifiersState( evt->Modifier( MD_SHIFT ), evt->Modifier( MD_CTRL ), evt->Modifier( MD_ALT ) ); - bool modifier_enabled = m_subtractive || m_additive || m_exclusive_or; + bool modifier_enabled = m_subtractive || m_additive || m_exclusive_or; PCB_BASE_FRAME* frame = getEditFrame(); - bool brd_editor = frame && frame->IsType( FRAME_PCB_EDITOR ); - ROUTER_TOOL* router = m_toolMgr->GetTool(); + bool brd_editor = frame && frame->IsType( FRAME_PCB_EDITOR ); + ROUTER_TOOL* router = m_toolMgr->GetTool(); // If the router tool is active, don't override if( router && router->IsToolActive() && router->RoutingInProgress() ) @@ -342,13 +342,9 @@ int PCB_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent ) selectPoint( evt->Position() ); if( m_selection.GetSize() == 1 && m_selection[0]->Type() == PCB_GROUP_T ) - { EnterGroup(); - } else - { m_toolMgr->RunAction( PCB_ACTIONS::properties, true ); - } } else if( evt->IsDblClick( BUT_MIDDLE ) ) { @@ -411,33 +407,39 @@ int PCB_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent ) aCollector.Remove( item ); }; - // Selection is empty? try to start dragging the item under the point where drag - // started - if( m_selection.Empty() && selectCursor( false, zoneFilledAreaFilter ) ) - m_selection.SetIsHover( true ); + // See if we can drag before falling back to selectMultiple() + bool doDrag = false; - // Check if dragging has started within any of selected items bounding box. - // We verify "HasPosition()" first to protect against edge case involving - // moving off menus that causes problems (issue #5250) - if( evt->HasPosition() && selectionContains( evt->Position() ) ) + if( evt->HasPosition() ) { - // Yes -> run the move tool and wait till it finishes - PCB_TRACK* track = dynamic_cast( m_selection.GetItem( 0 ) ); + if( m_selection.Empty() + && selectPoint( evt->DragOrigin(), false, nullptr, zoneFilledAreaFilter ) ) + { + m_selection.SetIsHover( true ); + doDrag = true; + } + // Check if dragging has started within any of selected items bounding box. + else if( selectionContains( evt->DragOrigin() ) ) + { + doDrag = true; + } + } - // If there is only item in the selection and it's a track, then we need - // to route it. - bool doRouting = ( track && ( 1 == m_selection.GetSize() ) ); + if( doDrag ) + { + bool haveTrack = m_selection.GetSize() == 1 + && dynamic_cast( m_selection.GetItem( 0 ) ); - if( doRouting && trackDragAction == TRACK_DRAG_ACTION::DRAG ) + if( haveTrack && trackDragAction == TRACK_DRAG_ACTION::DRAG ) m_toolMgr->RunAction( PCB_ACTIONS::drag45Degree, true ); - else if( doRouting && trackDragAction == TRACK_DRAG_ACTION::DRAG_FREE_ANGLE ) + else if( haveTrack && trackDragAction == TRACK_DRAG_ACTION::DRAG_FREE_ANGLE ) m_toolMgr->RunAction( PCB_ACTIONS::dragFreeAngle, true ); else m_toolMgr->RunAction( PCB_ACTIONS::move, true ); } else { - // No -> drag a selection box + // Otherwise drag a selection box selectMultiple(); } }