diff --git a/eeschema/tools/ee_selection_tool.cpp b/eeschema/tools/ee_selection_tool.cpp index 84a724acb5..0b2c3b6bb4 100644 --- a/eeschema/tools/ee_selection_tool.cpp +++ b/eeschema/tools/ee_selection_tool.cpp @@ -613,6 +613,14 @@ SELECTION& EE_SELECTION_TOOL::RequestSelection( const KICAD_T aFilterList[] ) m_selection.ClearReferencePoint(); } + updateReferencePoint(); + + return m_selection; +} + + +void EE_SELECTION_TOOL::updateReferencePoint() +{ VECTOR2I refP( 0, 0 ); if( m_selection.Size() > 0 ) @@ -624,8 +632,6 @@ SELECTION& EE_SELECTION_TOOL::RequestSelection( const KICAD_T aFilterList[] ) } m_selection.SetReferencePoint( refP ); - - return m_selection; } @@ -923,6 +929,8 @@ void EE_SELECTION_TOOL::RebuildSelection() }; EDA_ITEM::IterateForward( start, inspector, nullptr, EE_COLLECTOR::AllItems ); + + updateReferencePoint(); } diff --git a/eeschema/tools/ee_selection_tool.h b/eeschema/tools/ee_selection_tool.h index 6cfc978d32..c3e5cfa5a6 100644 --- a/eeschema/tools/ee_selection_tool.h +++ b/eeschema/tools/ee_selection_tool.h @@ -222,6 +222,11 @@ private: */ void unhighlight( EDA_ITEM* aItem, int aHighlightMode, SELECTION* aGroup = nullptr ); + /** + * Sets the reference point to the anchor of the top-left item. + */ + void updateReferencePoint(); + /** * Function selectionContains() * Checks if the given point is placed within any of selected items' bounding box. diff --git a/eeschema/tools/sch_move_tool.cpp b/eeschema/tools/sch_move_tool.cpp index 5582bc8dee..c0bd319d18 100644 --- a/eeschema/tools/sch_move_tool.cpp +++ b/eeschema/tools/sch_move_tool.cpp @@ -127,9 +127,41 @@ int SCH_MOVE_TOOL::Main( const TOOL_EVENT& aEvent ) KIGFX::VIEW_CONTROLS* controls = getViewControls(); controls->SetSnapping( true ); VECTOR2I originalCursorPos = controls->GetCursorPosition(); - bool moveMode = true; // For move item option. Alternate option is drag - m_anchorPoint.reset(); + m_anchorPos.reset(); + + if( aEvent.IsAction( &EE_ACTIONS::move ) ) + m_isDragOperation = false; + else if( aEvent.IsAction( &EE_ACTIONS::drag ) ) + m_isDragOperation = true; + else if( aEvent.IsAction( &EE_ACTIONS::moveActivate ) ) + m_isDragOperation = !m_frame->GetDragActionIsMove(); + else + return 0; + + if( m_isDragOperation ) + m_frame->SetToolID( ID_SCH_DRAG, wxCURSOR_DEFAULT, _( "Drag Items" ) ); + else + m_frame->SetToolID( ID_SCH_MOVE, wxCURSOR_DEFAULT, _( "Move Items" ) ); + + if( m_moveInProgress ) + { + if( !m_selectionTool->GetSelection().Front()->IsNew() ) + { + // User must have switched from move to drag or vice-versa. Reset the selected + // items so we can start again with the current m_isDragOperation. + m_frame->RollbackSchematicFromUndo(); + m_selectionTool->RemoveItemsFromSel( &m_dragAdditions, QUIET_MODE ); + m_moveInProgress = false; + controls->SetAutoPan( false ); + + // And give it a kick so it doesn't have to wait for the first mouse movement to + // refresh. + m_toolMgr->RunAction( EE_ACTIONS::refreshPreview ); + } + + return 0; + } // Be sure that there is at least one item that we can move. If there's no selection try // looking for the stuff under mouse cursor (i.e. Kicad old-style hover selection). @@ -139,22 +171,6 @@ int SCH_MOVE_TOOL::Main( const TOOL_EVENT& aEvent ) if( selection.Empty() ) return 0; - bool doMove = aEvent.IsAction( &EE_ACTIONS::move ) || - ( aEvent.IsAction( &EE_ACTIONS::moveActivate ) && m_frame->GetDragActionIsMove() ); - bool doDrag = aEvent.IsAction( &EE_ACTIONS::drag ) || - ( aEvent.IsAction( &EE_ACTIONS::moveActivate ) && !m_frame->GetDragActionIsMove() ); - - if( doMove ) - { - m_frame->SetToolID( ID_SCH_MOVE, wxCURSOR_DEFAULT, _( "Move Items" ) ); - moveMode = true; - } - else if ( doDrag ) - { - m_frame->SetToolID( ID_SCH_DRAG, wxCURSOR_DEFAULT, _( "Drag Items" ) ); - moveMode = false; - } - Activate(); controls->ShowCursor( true ); @@ -163,22 +179,6 @@ int SCH_MOVE_TOOL::Main( const TOOL_EVENT& aEvent ) OPT_TOOL_EVENT evt = aEvent; VECTOR2I prevPos; - if( m_moveInProgress ) - { - if( !selection.Front()->IsNew() ) - { - // User must have switched from move to drag or vice-versa. Reset the moved items - // so we can start again with the current m_isDragOperation and m_moveOffset. - m_frame->RollbackSchematicFromUndo(); - m_selectionTool->RemoveItemsFromSel( &m_dragAdditions, QUIET_MODE ); - m_moveInProgress = false; - // And give it a kick so it doesn't have to wait for the first mouse movement to - // refresh. - m_toolMgr->RunAction( EE_ACTIONS::refreshPreview ); - } - return 0; - } - m_cursor = controls->GetCursorPosition(); // Main loop: keep receiving events @@ -206,10 +206,10 @@ int SCH_MOVE_TOOL::Main( const TOOL_EVENT& aEvent ) it->ClearFlags( STARTPOINT | ENDPOINT | SELECTEDNODE ); } - // Add connections to the selection for a drag. - // - if( !moveMode ) + if( m_isDragOperation ) { + // Add connections to the selection for a drag. + // for( EDA_ITEM* item : selection ) { if( static_cast( item )->IsConnectable() ) @@ -224,11 +224,10 @@ int SCH_MOVE_TOOL::Main( const TOOL_EVENT& aEvent ) m_selectionTool->AddItemsToSel( &m_dragAdditions, QUIET_MODE ); } - - // Mark the edges of the block with dangling flags for a move. - // - if( moveMode ) + else { + // Mark the edges of the block with dangling flags for a move. + // std::vector internalPoints; for( EDA_ITEM* item : selection ) @@ -244,9 +243,7 @@ int SCH_MOVE_TOOL::Main( const TOOL_EVENT& aEvent ) { if( item->IsNew() ) { - // TODO(snh): Remove extra tooling check after moving to schematic_commit model - if( ( item->GetFlags() & SELECTEDNODE ) != 0 - && ( m_frame->GetToolId() == ID_SCH_DRAG ) ) + if( ( item->GetFlags() & SELECTEDNODE ) != 0 && m_isDragOperation ) { // Item was added in getConnectedDragItems saveCopyInUndoList( (SCH_ITEM*) item, UR_NEW, appendUndo ); @@ -270,11 +267,6 @@ int SCH_MOVE_TOOL::Main( const TOOL_EVENT& aEvent ) SCH_ITEM* schItem = (SCH_ITEM*) item; schItem->SetStoredPos( schItem->GetPosition() ); - - // Apply any initial offset in case we're coming from a previous command. - // - if( !item->GetParent() || !item->GetParent()->IsSelected() ) - moveItem( item, m_moveOffset, !moveMode ); } // Set up the starting position and move/drag offset @@ -283,17 +275,18 @@ int SCH_MOVE_TOOL::Main( const TOOL_EVENT& aEvent ) if( selection.HasReferencePoint() ) { - m_anchorPoint = selection.GetReferencePoint(); + m_anchorPos = selection.GetReferencePoint(); + if( m_frame->GetMoveWarpsCursor() ) { - getViewControls()->WarpCursor( *m_anchorPoint ); - m_cursor = *m_anchorPoint; + getViewControls()->WarpCursor( *m_anchorPos ); + m_cursor = *m_anchorPos; } } - if( m_anchorPoint ) + if( m_anchorPos ) { - VECTOR2I delta = m_cursor - (*m_anchorPoint); + VECTOR2I delta = m_cursor - (*m_anchorPos); // Drag items to the current cursor position for( EDA_ITEM* item : selection ) @@ -302,11 +295,11 @@ int SCH_MOVE_TOOL::Main( const TOOL_EVENT& aEvent ) if( item->GetParent() && item->GetParent()->IsSelected() ) continue; - moveItem( item, delta, !moveMode ); + moveItem( item, delta, m_isDragOperation ); updateView( item ); } - m_anchorPoint = m_cursor; + m_anchorPos = m_cursor; } else if( selection.Size() == 1 ) { @@ -333,7 +326,7 @@ int SCH_MOVE_TOOL::Main( const TOOL_EVENT& aEvent ) // m_cursor = controls->GetCursorPosition(); VECTOR2I delta( m_cursor - prevPos ); - m_anchorPoint = m_cursor; + m_anchorPos = m_cursor; m_moveOffset += delta; prevPos = m_cursor; @@ -437,7 +430,7 @@ int SCH_MOVE_TOOL::Main( const TOOL_EVENT& aEvent ) m_moveInProgress = false; m_frame->SetNoToolSelected(); - m_anchorPoint.reset(); + m_anchorPos.reset(); for( EDA_ITEM* item : selection ) item->ClearEditFlags(); @@ -447,13 +440,9 @@ int SCH_MOVE_TOOL::Main( const TOOL_EVENT& aEvent ) m_frame->RollbackSchematicFromUndo(); if( unselect ) - { m_toolMgr->RunAction( EE_ACTIONS::clearSelection, true ); - } else - { m_toolMgr->ProcessEvent( EVENTS::SelectedEvent ); - } } else { @@ -595,8 +584,10 @@ void SCH_MOVE_TOOL::addJunctionsIfNeeded( SELECTION& aSelection ) { SCH_LINE* line = (SCH_LINE*) item; for( auto i : connections ) + { if( IsPointOnSegment( line->GetStartPoint(), line->GetEndPoint(), i ) ) pts.push_back( i ); + } } else { @@ -676,14 +667,14 @@ bool SCH_MOVE_TOOL::updateModificationPoint( SELECTION& aSelection ) // hierarchical sheets or components can have the anchor outside the view) if( item->IsMovableFromAnchorPoint() ) { - m_anchorPoint = item->GetPosition(); + m_anchorPos = item->GetPosition(); return true; } } // ...otherwise modify items with regard to the grid-snapped cursor position m_cursor = getViewControls()->GetCursorPosition( true ); - m_anchorPoint = m_cursor; + m_anchorPos = m_cursor; return true; } diff --git a/eeschema/tools/sch_move_tool.h b/eeschema/tools/sch_move_tool.h index 679c84215e..20b190213b 100644 --- a/eeschema/tools/sch_move_tool.h +++ b/eeschema/tools/sch_move_tool.h @@ -70,6 +70,7 @@ private: private: ///> Flag determining if anything is being dragged right now bool m_moveInProgress; + bool m_isDragOperation; ///> Items (such as wires) which were added to the selection for a drag EDA_ITEMS m_dragAdditions; @@ -81,7 +82,7 @@ private: ///> of edit reference point). VECTOR2I m_cursor; - boost::optional m_anchorPoint; + boost::optional m_anchorPos; }; #endif //KICAD_SCH_MOVE_TOOL_H