diff --git a/plugins/tools/basictools/kis_tool_move.h b/plugins/tools/basictools/kis_tool_move.h --- a/plugins/tools/basictools/kis_tool_move.h +++ b/plugins/tools/basictools/kis_tool_move.h @@ -31,6 +31,8 @@ #include #include +#include "kis_canvas2.h" + class KoCanvasBase; class MoveToolOptionsWidget; @@ -83,6 +85,7 @@ void endAction(KoPointerEvent *event); void paint(QPainter& gc, const KoViewConverter &converter) override; + void initHandles(const KisNodeList &nodes); QWidget* createOptionWidget() override; void updateUIUnit(int newUnit); @@ -131,6 +134,12 @@ int m_resolution; QAction *m_showCoordinatesAction; + + KisCanvas2* m_canvas; + + QPoint m_pos; + QRect m_handlesRect; + bool m_dragInProgress = false; }; diff --git a/plugins/tools/basictools/kis_tool_move.cc b/plugins/tools/basictools/kis_tool_move.cc --- a/plugins/tools/basictools/kis_tool_move.cc +++ b/plugins/tools/basictools/kis_tool_move.cc @@ -48,6 +48,8 @@ KisToolMove::KisToolMove(KoCanvasBase * canvas) : KisTool(canvas, KisCursor::moveCursor()) { + m_canvas = dynamic_cast(canvas); + setObjectName("tool_move"); m_optionsWidget = 0; m_moveInProgress = false; @@ -139,6 +141,8 @@ return false; } + initHandles(nodes); + /** * If the target node has changed, the stroke should be * restarted. Otherwise just continue processing current node. @@ -216,7 +220,6 @@ image()->addJob(m_strokeId, new MoveStrokeStrategy::Data(m_accumulatedOffset + offset)); m_accumulatedOffset += offset; - m_moveInProgress = false; emit moveInProgressChanged(); setMode(KisTool::HOVER_MODE); @@ -246,8 +249,23 @@ void KisToolMove::paint(QPainter& gc, const KoViewConverter &converter) { - Q_UNUSED(gc); Q_UNUSED(converter); + + if (m_dragInProgress) { + QPainterPath handles; + handles.addRect(m_handlesRect.translated(m_pos)); + + QPainterPath path = pixelToView(handles); + paintToolOutline(&gc, path); + } +} + +void KisToolMove::initHandles(const KisNodeList &nodes) +{ + m_handlesRect = QRect(); + for (KisNodeSP node : nodes) { + m_handlesRect |= node->exactBounds(); + } } void KisToolMove::deactivate() @@ -315,14 +333,17 @@ { QPoint pos = convertToPixelCoordAndSnap(event).toPoint(); m_dragStart = pos; + m_pos = QPoint(); m_moveInProgress = true; + m_dragInProgress = true; emit moveInProgressChanged(); if (startStrokeImpl(mode, &pos)) { setMode(KisTool::PAINT_MODE); } else { event->ignore(); } + m_canvas->updateCanvas(); } void KisToolMove::continueAction(KoPointerEvent *event) @@ -352,6 +373,8 @@ pos = applyModifiers(event->modifiers(), pos); drag(pos); + m_pos = pos - m_dragStart; + m_canvas->updateCanvas(); } void KisToolMove::endAction(KoPointerEvent *event) @@ -363,9 +386,12 @@ QPoint pos = convertToPixelCoordAndSnap(event).toPoint(); pos = applyModifiers(event->modifiers(), pos); drag(pos); + m_pos = pos - m_dragStart; + m_dragInProgress = false; m_startPosition += pos - m_dragStart; m_accumulatedOffset += pos - m_dragStart; + m_canvas->updateCanvas(); } void KisToolMove::drag(const QPoint& newPos)