Krita Source Code Documentation
Loading...
Searching...
No Matches
KisToolMove Class Reference

#include <kis_tool_move.h>

+ Inheritance diagram for KisToolMove:

Public Types

enum  MoveDirection { Up , Down , Left , Right }
 
enum  MoveToolMode { MoveSelectedLayer , MoveFirstLayer , MoveGroup }
 
- Public Types inherited from KisTool
enum  { FLAG_USES_CUSTOM_PRESET =0x01 , FLAG_USES_CUSTOM_COMPOSITEOP =0x02 , FLAG_USES_CUSTOM_SIZE =0x04 }
 
enum  AlternateAction {
  ChangeSize = AlternateChangeSize , ChangeSizeSnap = AlternateChangeSizeSnap , SampleFgNode = AlternateSampleFgNode , SampleBgNode = AlternateSampleBgNode ,
  SampleFgImage = AlternateSampleFgImage , SampleBgImage = AlternateSampleBgImage , Secondary = AlternateSecondary , Third = AlternateThird ,
  Fourth = AlternateFourth , Fifth = AlternateFifth , NONE = 10000
}
 
enum  NodePaintAbility {
  VECTOR , CLONE , PAINT , UNPAINTABLE ,
  MYPAINTBRUSH_UNPAINTABLE
}
 
enum  ToolAction {
  Primary , AlternateChangeSize , AlternateChangeSizeSnap , AlternateSampleFgNode ,
  AlternateSampleBgNode , AlternateSampleFgImage , AlternateSampleBgImage , AlternateSecondary ,
  AlternateThird , AlternateFourth , AlternateFifth , Alternate_NONE = 10000
}
 

Public Slots

void activate (const QSet< KoShape * > &shapes) override
 
void commitChanges ()
 
void deactivate () override
 
void moveBySpinX (int newX)
 
void moveBySpinY (int newY)
 
void moveDiscrete (MoveDirection direction, bool big)
 
void requestRedoDuringStroke () override
 
void requestStrokeCancellation () override
 
void requestStrokeEnd () override
 
void requestUndoDuringStroke () override
 
void slotHandlesRectCalculated (const QRect &handlesRect)
 
void slotNodeChanged (const KisNodeList &nodes)
 
void slotSelectionChanged ()
 
void slotStrokePickedLayers (const KisNodeList &nodes)
 
void slotStrokeStartedEmpty ()
 
- Public Slots inherited from KisTool
void activate (const QSet< KoShape * > &shapes) override
 
void canvasResourceChanged (int key, const QVariant &res) override
 
void deactivate () override
 
virtual void updateSettingsViews ()
 
- Public Slots inherited from KoToolBase
virtual void activate (const QSet< KoShape * > &shapes)
 
virtual void canvasResourceChanged (int key, const QVariant &res)
 
virtual void deactivate ()
 
virtual void documentResourceChanged (int key, const QVariant &res)
 
virtual void repaintDecorations ()
 
virtual void requestRedoDuringStroke ()
 
virtual void requestStrokeCancellation ()
 
virtual void requestStrokeEnd ()
 
virtual void requestUndoDuringStroke ()
 
void setStatusText (const QString &statusText)
 
void updateOptionsWidgetIcons ()
 

Signals

void moveInNewPosition (QPoint)
 
void moveToolModeChanged ()
 
- Signals inherited from KisTool
void isActiveChanged (bool isActivated)
 
- Signals inherited from KoToolBase
void activateTool (const QString &id)
 
void cursorChanged (const QCursor &cursor)
 
void selectionChanged (bool hasSelection)
 
void statusTextChanged (const QString &statusText)
 
void textModeChanged (bool inTextMode)
 

Public Member Functions

void beginAlternateAction (KoPointerEvent *event, AlternateAction action) override
 
void beginPrimaryAction (KoPointerEvent *event) override
 
void continueAction (KoPointerEvent *event)
 
void continueAlternateAction (KoPointerEvent *event, AlternateAction action) override
 
void continuePrimaryAction (KoPointerEvent *event) override
 
QWidget * createOptionWidget () override
 
void endAction (KoPointerEvent *event)
 
void endAlternateAction (KoPointerEvent *event, AlternateAction action) override
 
void endPrimaryAction (KoPointerEvent *event) override
 
 KisToolMove (KoCanvasBase *canvas)
 
void mouseMoveEvent (KoPointerEvent *event) override
 
MoveToolMode moveToolMode () const
 
void paint (QPainter &gc, const KoViewConverter &converter) override
 
void setShowCoordinates (bool value)
 
void startAction (KoPointerEvent *event, MoveToolMode mode)
 
void updateUIUnit (int newUnit)
 
bool wantsAutoScroll () const override
 wantsAutoScroll reimplemented from KoToolBase there's an issue where autoscrolling with this tool never makes the stroke end, so we return false here so that users don't get stuck with the tool. See bug 362659
 
 ~KisToolMove () override
 
- Public Member Functions inherited from KisTool
virtual void activateAlternateAction (AlternateAction action)
 
virtual void activatePrimaryAction ()
 
virtual bool alternateActionSupportsHiResEvents (AlternateAction action) const
 
virtual void beginAlternateDoubleClickAction (KoPointerEvent *event, AlternateAction action)
 
virtual void beginPrimaryDoubleClickAction (KoPointerEvent *event)
 
virtual void deactivateAlternateAction (AlternateAction action)
 
virtual void deactivatePrimaryAction ()
 
void deleteSelection () override
 
virtual int flags () const
 
bool isActive () const
 
 KisTool (KoCanvasBase *canvas, const QCursor &cursor)
 
void mouseDoubleClickEvent (KoPointerEvent *event) override
 
void mousePressEvent (KoPointerEvent *event) override
 
void mouseReleaseEvent (KoPointerEvent *event) override
 
void mouseTripleClickEvent (KoPointerEvent *event) override
 
virtual void newActivationWithExternalSource (KisPaintDeviceSP externalSource)
 newActivationWithExternalSource Makes sure that the tool is active and starts a new stroke, which will be able to access the pixels from the specified external source.
 
KisTool::NodePaintAbility nodePaintAbility ()
 
virtual bool primaryActionSupportsHiResEvents () const
 
virtual bool supportsPaintingAssistants () const
 
 ~KisTool () override
 
- Public Member Functions inherited from Private
 Private (KisCanvas2 *c)
 
- Public Member Functions inherited from KoToolBase
QAction * action (const QString &name) const
 
KoCanvasBasecanvas () const
 Returns the canvas the tool is working on.
 
virtual void copy () const
 
QCursor cursor () const
 return the last emitted cursor
 
virtual void customMoveEvent (KoPointerEvent *event)
 
virtual void customPressEvent (KoPointerEvent *event)
 
virtual void customReleaseEvent (KoPointerEvent *event)
 
virtual void cut ()
 
virtual QRectF decorationsRect () const
 
int decorationThickness () const
 decorationThickness The minimum thickness for tool decoration lines, this is derived from the screen magnification, thus the HiDPI settings. Note: to use this effectively, also set the pen to isCosmetic(true);
 
virtual void deselect ()
 deselect the tool should clear the selection if it has one.
 
virtual void dragLeaveEvent (QDragLeaveEvent *event)
 
virtual void dragMoveEvent (QDragMoveEvent *event, const QPointF &point)
 
virtual void dropEvent (QDropEvent *event, const QPointF &point)
 
virtual void explicitUserStrokeEndRequest ()
 explicitUserStrokeEndRequest is called by the input manager when the user presses Enter key or any equivalent. This callback comes before requestStrokeEnd(), which comes from a different source.
 
KoToolFactoryBasefactory () const
 
virtual void focusInEvent (QFocusEvent *event)
 
virtual void focusOutEvent (QFocusEvent *event)
 
virtual bool hasSelection ()
 
virtual void inputMethodEvent (QInputMethodEvent *event)
 
virtual QVariant inputMethodQuery (Qt::InputMethodQuery query) const
 
bool isInTextMode () const
 
bool isOpacityPresetMode () const
 
virtual void keyPressEvent (QKeyEvent *event)
 
virtual void keyReleaseEvent (QKeyEvent *event)
 
 KoToolBase (KoCanvasBase *canvas)
 
bool maskSyntheticEvents () const
 
QList< QPointer< QWidget > > optionWidgets ()
 
virtual bool paste ()
 
virtual QMenu * popupActionsMenu ()
 
virtual KisPopupWidgetInterfacepopupWidget ()
 
virtual bool selectAll ()
 selectAll select all data the tool can select.
 
virtual KoToolSelectionselection ()
 
Q_INVOKABLE QString toolId () const
 
 ~KoToolBase () override
 

Protected Slots

void resetCursorStyle () override
 
- Protected Slots inherited from KisTool
virtual void resetCursorStyle ()
 

Private Slots

void endStroke ()
 
void slotMoveDiscreteDown ()
 
void slotMoveDiscreteDownMore ()
 
void slotMoveDiscreteLeft ()
 
void slotMoveDiscreteLeftMore ()
 
void slotMoveDiscreteRight ()
 
void slotMoveDiscreteRightMore ()
 
void slotMoveDiscreteUp ()
 
void slotMoveDiscreteUpMore ()
 
void slotTrackerChangedConfig (KisToolChangesTrackerDataSP state)
 

Private Member Functions

QPoint applyModifiers (Qt::KeyboardModifiers modifiers, QPoint pos)
 
void cancelStroke ()
 
QPoint currentOffset () const
 
void drag (const QPoint &newPos)
 
void notifyGuiAfterMove (bool showFloatingMessage=true)
 
 Q_ENUMS (MoveToolMode)
 
void requestHandlesRectUpdate ()
 
bool startStrokeImpl (MoveToolMode mode, const QPoint *pos)
 
bool tryEndPreviousStroke (const KisNodeList &nodes)
 

Private Attributes

QPoint m_accumulatedOffset
 Total offset including multiple clicks, up/down/left/right keys, etc. added together.
 
KisSignalAutoConnectionsStore m_actionConnections
 
KisAsynchronousStrokeUpdateHelper m_asyncUpdateHelper
 
KisSignalAutoConnectionsStore m_canvasConnections
 
KisToolChangesTracker m_changesTracker
 
KisNodeList m_currentlyProcessingNodes
 
bool m_currentlyUsingSelection {false}
 
MoveToolMode m_currentMode {MoveSelectedLayer}
 
QPoint m_dragPos
 
QPoint m_dragStart
 Point where current cursor dragging began.
 
QRect m_handlesRect
 
QPoint m_lastCursorPos
 
MoveToolOptionsWidgetm_optionsWidget {0}
 
int m_resolution {0}
 
QAction * m_showCoordinatesAction {0}
 
KisStrokeId m_strokeId
 
KisSignalCompressor m_updateCursorCompressor
 

Additional Inherited Members

- Static Public Member Functions inherited from KisTool
static AlternateAction actionToAlternateAction (ToolAction action)
 
- Public Attributes inherited from KisTool
KoColor currentBgColor
 
float currentExposure {1.0}
 
KoColor currentFgColor
 
KisFilterConfigurationSP currentGenerator
 
KoAbstractGradientSP currentGradient
 
KoPatternSP currentPattern
 
QCursor cursor
 
bool m_isActive {false}
 
ToolMode m_mode {HOVER_MODE}
 
QWidget * optionWidget {0}
 
- Public Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 
- Protected Types inherited from KisTool
enum  ToolMode : int {
  HOVER_MODE , PAINT_MODE , SECONDARY_PAINT_MODE , MIRROR_AXIS_SETUP_MODE ,
  GESTURE_MODE , PAN_MODE , OTHER , OTHER_1
}
 
- Protected Member Functions inherited from KisTool
bool blockUntilOperationsFinished ()
 
void blockUntilOperationsFinishedForced ()
 
QPointF convertDocumentToWidget (const QPointF &pt)
 
QPoint convertToImagePixelCoordFloored (KoPointerEvent *e)
 
QPointF convertToPixelCoord (const QPointF &pt)
 
QPointF convertToPixelCoord (KoPointerEvent *e)
 
QPointF convertToPixelCoordAndAlignOnWidget (const QPointF &pt)
 
QPointF convertToPixelCoordAndSnap (const QPointF &pt, const QPointF &offset=QPointF())
 
QPointF convertToPixelCoordAndSnap (KoPointerEvent *e, const QPointF &offset=QPointF(), bool useModifiers=true)
 
QRectF convertToPt (const QRectF &rect)
 
qreal convertToPt (qreal value)
 
KoColor currentBgColor ()
 
KoColor currentFgColor ()
 
KisFilterConfigurationSP currentGenerator ()
 
KoAbstractGradientSP currentGradient ()
 
KisImageWSP currentImage ()
 
KisNodeSP currentNode () const
 
KisPaintOpPresetSP currentPaintOpPreset ()
 
KoPatternSP currentPattern ()
 
QCursor cursor () const
 
KisImageWSP image () const
 
virtual bool listeningToModifiers ()
 
virtual void listenToModifiers (bool listen)
 
virtual ToolMode mode () const
 
bool nodeEditable ()
 Checks checks if the current node is editable.
 
bool overrideCursorIfNotEditable ()
 Override the cursor appropriately if current node is not editable.
 
void paintToolOutline (QPainter *painter, const KisOptimizedBrushOutline &path)
 
KisOptimizedBrushOutline pixelToView (const KisOptimizedBrushOutline &path) const
 
QPainterPath pixelToView (const QPainterPath &pixelPath) const
 Convert a pixel path into a view path.
 
QPointF pixelToView (const QPoint &pixelCoord) const
 
QPointF pixelToView (const QPointF &pixelCoord) const
 Convert a floating point pixel coordinate into a view coordinate.
 
QPolygonF pixelToView (const QPolygonF &pixelPolygon) const
 Convert a pixel polygon into a view path.
 
QRectF pixelToView (const QRectF &pixelRect) const
 Convert a pixel rectangle into a view rectangle.
 
KisNodeList selectedNodes () const
 
bool selectionEditable ()
 Checks checks if the selection is editable, only applies to local selection as global selection is always editable.
 
void setCursor (const QCursor &cursor)
 
virtual void setMode (ToolMode mode)
 
void updateCanvasPixelRect (const QRectF &pixelRect)
 Update the canvas for the given rectangle in image pixel coordinates.
 
void updateCanvasViewRect (const QRectF &viewRect)
 Update the canvas for the given rectangle in view coordinates.
 
QPointF viewToPixel (const QPointF &viewCoord) const
 
QPointF widgetCenterInWidgetPixels ()
 
- Protected Member Functions inherited from KoToolBase
virtual QList< QPointer< QWidget > > createOptionWidgets ()
 
int grabSensitivity () const
 Convenience function to get the current grab sensitivity.
 
qreal handleDocRadius () const
 
QRectF handleGrabRect (const QPointF &position) const
 
QRectF handlePaintRect (const QPointF &position) const
 
int handleRadius () const
 Convenience function to get the current handle radius.
 
bool isActivated () const
 
 KoToolBase (KoToolBasePrivate &dd)
 
KoPointerEventlastDeliveredPointerEvent () const
 
void setAbstractResource (KoAbstractCanvasResourceInterfaceSP abstractResource)
 
void setConverter (KoDerivedResourceConverterSP converter)
 
void setIsOpacityPresetMode (bool value)
 
void setMaskSyntheticEvents (bool value)
 
void setTextMode (bool value)
 
QHash< int, KoAbstractCanvasResourceInterfaceSPtoolAbstractResources ()
 
QHash< int, KoDerivedResourceConverterSPtoolConverters ()
 
void useCursor (const QCursor &cursor)
 
- Protected Attributes inherited from KoToolBase
KoToolBasePrivated_ptr
 
- Properties inherited from KisTool
bool isActive
 

Detailed Description

Definition at line 33 of file kis_tool_move.h.

Member Enumeration Documentation

◆ MoveDirection

Enumerator
Up 
Down 
Left 
Right 

Definition at line 73 of file kis_tool_move.h.

◆ MoveToolMode

Enumerator
MoveSelectedLayer 
MoveFirstLayer 
MoveGroup 

Definition at line 67 of file kis_tool_move.h.

Constructor & Destructor Documentation

◆ KisToolMove()

KisToolMove::KisToolMove ( KoCanvasBase * canvas)

Definition at line 55 of file kis_tool_move.cc.

58{
59 setObjectName("tool_move");
60
61 m_showCoordinatesAction = action("movetool-show-coordinates");
62 m_showCoordinatesAction = action("movetool-show-coordinates");
63 connect(&m_updateCursorCompressor, SIGNAL(timeout()), this, SLOT(resetCursorStyle()));
64
65 m_optionsWidget = new MoveToolOptionsWidget(nullptr, currentImage()->xRes(), toolId());
66
67 // See https://bugs.kde.org/show_bug.cgi?id=316896
68 QWidget *specialSpacer = new QWidget(m_optionsWidget);
69 specialSpacer->setObjectName("SpecialSpacer");
70 specialSpacer->setFixedSize(0, 0);
71 m_optionsWidget->layout()->addWidget(specialSpacer);
72
73 m_optionsWidget->setFixedHeight(m_optionsWidget->sizeHint().height());
74
76
78
79 connect(this, SIGNAL(moveInNewPosition(QPoint)), m_optionsWidget, SLOT(slotSetTranslate(QPoint)), Qt::UniqueConnection);
80}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
static QCursor moveCursor()
void moveInNewPosition(QPoint)
KisSignalCompressor m_updateCursorCompressor
QPoint currentOffset() const
void resetCursorStyle() override
QAction * m_showCoordinatesAction
QRect m_handlesRect
MoveToolOptionsWidget * m_optionsWidget
Q_INVOKABLE QString toolId() const
QAction * action(const QString &name) const
KisImageWSP currentImage()
Definition kis_tool.cc:393
KisTool(KoCanvasBase *canvas, const QCursor &cursor)
Definition kis_tool.cc:78
KisCanvas2 * canvas

References KoToolBase::action(), connect(), KisTool::currentImage(), currentOffset(), m_handlesRect, m_optionsWidget, m_showCoordinatesAction, m_updateCursorCompressor, moveInNewPosition(), resetCursorStyle(), MoveToolOptionsWidget::showCoordinates(), MoveToolOptionsWidget::slotSetTranslate(), and KoToolBase::toolId().

◆ ~KisToolMove()

KisToolMove::~KisToolMove ( )
override

Definition at line 82 of file kis_tool_move.cc.

83{
84 endStroke();
85 delete m_optionsWidget;
86}

References endStroke(), and m_optionsWidget.

Member Function Documentation

◆ activate

void KisToolMove::activate ( const QSet< KoShape * > & shapes)
overrideslot

Definition at line 391 of file kis_tool_move.cc.

392{
393 KisTool::activate(shapes);
394
395 m_actionConnections.addConnection(action("movetool-move-up"), SIGNAL(triggered(bool)),
396 this, SLOT(slotMoveDiscreteUp()));
397 m_actionConnections.addConnection(action("movetool-move-down"), SIGNAL(triggered(bool)),
398 this, SLOT(slotMoveDiscreteDown()));
399 m_actionConnections.addConnection(action("movetool-move-left"), SIGNAL(triggered(bool)),
400 this, SLOT(slotMoveDiscreteLeft()));
401 m_actionConnections.addConnection(action("movetool-move-right"), SIGNAL(triggered(bool)),
402 this, SLOT(slotMoveDiscreteRight()));
403
404 m_actionConnections.addConnection(action("movetool-move-up-more"), SIGNAL(triggered(bool)),
405 this, SLOT(slotMoveDiscreteUpMore()));
406 m_actionConnections.addConnection(action("movetool-move-down-more"), SIGNAL(triggered(bool)),
407 this, SLOT(slotMoveDiscreteDownMore()));
408 m_actionConnections.addConnection(action("movetool-move-left-more"), SIGNAL(triggered(bool)),
409 this, SLOT(slotMoveDiscreteLeftMore()));
410 m_actionConnections.addConnection(action("movetool-move-right-more"), SIGNAL(triggered(bool)),
411 this, SLOT(slotMoveDiscreteRightMore()));
412
413 m_canvasConnections.addUniqueConnection(qobject_cast<KisCanvas2*>(canvas())->viewManager()->nodeManager(), SIGNAL(sigUiNeedChangeSelectedNodes(KisNodeList)), this, SLOT(slotNodeChanged(KisNodeList)));
414 m_canvasConnections.addUniqueConnection(qobject_cast<KisCanvas2*>(canvas())->viewManager()->selectionManager(), SIGNAL(currentSelectionChanged()), this, SLOT(slotSelectionChanged()));
415
416 connect(m_showCoordinatesAction, SIGNAL(triggered(bool)), m_optionsWidget, SLOT(setShowCoordinates(bool)), Qt::UniqueConnection);
417 connect(m_optionsWidget, SIGNAL(showCoordinatesChanged(bool)), m_showCoordinatesAction, SLOT(setChecked(bool)), Qt::UniqueConnection);
418 connect(m_optionsWidget, SIGNAL(sigSetTranslateX(int)), SLOT(moveBySpinX(int)), Qt::UniqueConnection);
419 connect(m_optionsWidget, SIGNAL(sigSetTranslateY(int)), SLOT(moveBySpinY(int)), Qt::UniqueConnection);
420 connect(m_optionsWidget, SIGNAL(sigRequestCommitOffsetChanges()), this, SLOT(commitChanges()), Qt::UniqueConnection);
421
423 SIGNAL(sigConfigChanged(KisToolChangesTrackerDataSP)),
425
426
428}
void addUniqueConnection(Sender sender, Signal signal, Receiver receiver, Method method)
void addConnection(Sender sender, Signal signal, Receiver receiver, Method method, Qt::ConnectionType type=Qt::AutoConnection)
void setShowCoordinates(bool value)
void slotMoveDiscreteLeftMore()
void moveBySpinX(int newX)
void slotMoveDiscreteRight()
void slotMoveDiscreteUp()
KisSignalAutoConnectionsStore m_canvasConnections
void slotMoveDiscreteLeft()
void moveBySpinY(int newY)
void slotMoveDiscreteRightMore()
void slotTrackerChangedConfig(KisToolChangesTrackerDataSP state)
KisSignalAutoConnectionsStore m_actionConnections
void slotMoveDiscreteDownMore()
void slotNodeChanged(const KisNodeList &nodes)
void slotMoveDiscreteUpMore()
KisToolChangesTracker m_changesTracker
void commitChanges()
void slotMoveDiscreteDown()
void slotSelectionChanged()
KisNodeList selectedNodes() const
Definition kis_tool.cc:376
void activate(const QSet< KoShape * > &shapes) override
Definition kis_tool.cc:93

References KoToolBase::action(), KisTool::activate(), KisSignalAutoConnectionsStore::addConnection(), KisSignalAutoConnectionsStore::addUniqueConnection(), Private::canvas, commitChanges(), connect(), m_actionConnections, m_canvasConnections, m_changesTracker, m_optionsWidget, m_showCoordinatesAction, moveBySpinX(), moveBySpinY(), KisTool::selectedNodes(), setShowCoordinates(), slotMoveDiscreteDown(), slotMoveDiscreteDownMore(), slotMoveDiscreteLeft(), slotMoveDiscreteLeftMore(), slotMoveDiscreteRight(), slotMoveDiscreteRightMore(), slotMoveDiscreteUp(), slotMoveDiscreteUpMore(), slotNodeChanged(), slotSelectionChanged(), and slotTrackerChangedConfig().

◆ applyModifiers()

QPoint KisToolMove::applyModifiers ( Qt::KeyboardModifiers modifiers,
QPoint pos )
private

Definition at line 723 of file kis_tool_move.cc.

724{
725 QPoint move = pos - m_dragStart;
726
727 // Snap to axis
728 if (modifiers & Qt::ShiftModifier) {
729 move = snapToClosestAxis(move);
730 }
731
732 // "Precision mode" - scale down movement by 1/5
733 if (modifiers & Qt::AltModifier) {
734 const qreal SCALE_FACTOR = .2;
735 move = SCALE_FACTOR * move;
736 }
737
738 return m_dragStart + move;
739}
QPoint m_dragStart
Point where current cursor dragging began.
PointType snapToClosestAxis(PointType P)
Definition kis_global.h:199

References m_dragStart, and snapToClosestAxis().

◆ beginAlternateAction()

void KisToolMove::beginAlternateAction ( KoPointerEvent * event,
AlternateAction action )
overridevirtual

Reimplemented from KisTool.

Definition at line 502 of file kis_tool_move.cc.

503{
504 // Ctrl+Right click toggles between moving current layer and moving layer w/ content
507
508 if (mode == MoveSelectedLayer) {
510 } else if (mode == MoveFirstLayer) {
512 }
513
514 startAction(event, mode);
515 } else {
516 startAction(event, MoveGroup);
517 }
518}
MoveToolMode moveToolMode() const
void startAction(KoPointerEvent *event, MoveToolMode mode)
virtual ToolMode mode() const
Definition kis_tool.cc:407
@ SampleFgNode
Definition kis_tool.h:137
@ SampleBgImage
Definition kis_tool.h:140

References KoToolBase::action(), KisTool::mode(), MoveFirstLayer, MoveGroup, MoveSelectedLayer, moveToolMode(), KisTool::SampleBgImage, KisTool::SampleFgNode, and startAction().

◆ beginPrimaryAction()

void KisToolMove::beginPrimaryAction ( KoPointerEvent * event)
overridevirtual

Called by KisToolProxy when a primary action for the tool is started. The event stores the original event that started the stroke. The event is accepted by default. If the tool decides to ignore this particular action (e.g. when the node is not editable), it should call event->ignore(). Then no further continuePrimaryAction() or endPrimaryAction() will be called until the next user action.

Reimplemented from KisTool.

Definition at line 487 of file kis_tool_move.cc.

488{
489 startAction(event, moveToolMode());
490}

References moveToolMode(), and startAction().

◆ cancelStroke()

void KisToolMove::cancelStroke ( )
private

Definition at line 691 of file kis_tool_move.cc.

692{
693 if (!m_strokeId) return;
694
697 }
698
701 m_strokeId.clear();
706 m_accumulatedOffset = QPoint();
708 qobject_cast<KisCanvas2*>(canvas())->updateCanvas();
709}
bool cancelStroke(KisStrokeId id) override
KisAsynchronousStrokeUpdateHelper m_asyncUpdateHelper
void notifyGuiAfterMove(bool showFloatingMessage=true)
bool m_currentlyUsingSelection
MoveToolMode m_currentMode
QPoint m_accumulatedOffset
Total offset including multiple clicks, up/down/left/right keys, etc. added together.
KisNodeList m_currentlyProcessingNodes
KisStrokeId m_strokeId
KisImageWSP image() const
Definition kis_tool.cc:332

References KisImage::cancelStroke(), KisAsynchronousStrokeUpdateHelper::cancelUpdateStream(), Private::canvas, KisTool::currentImage(), KisTool::image(), KisAsynchronousStrokeUpdateHelper::isActive(), m_accumulatedOffset, m_asyncUpdateHelper, m_changesTracker, m_currentlyProcessingNodes, m_currentlyUsingSelection, m_currentMode, m_strokeId, MoveSelectedLayer, notifyGuiAfterMove(), and KisToolChangesTracker::reset().

◆ commitChanges

void KisToolMove::commitChanges ( )
slot

Definition at line 314 of file kis_tool_move.cc.

315{
317
319 KisToolMoveState *lastState = dynamic_cast<KisToolMoveState*>(m_changesTracker.lastState().data());
320 if (lastState && *lastState == *newState) return;
321
323}
void commitConfig(KisToolChangesTrackerDataSP state)
KisToolChangesTrackerDataSP lastState() const
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128

References KisToolChangesTracker::commitConfig(), KIS_SAFE_ASSERT_RECOVER_RETURN, KisToolChangesTracker::lastState(), m_accumulatedOffset, m_changesTracker, and m_strokeId.

◆ continueAction()

void KisToolMove::continueAction ( KoPointerEvent * event)

Definition at line 567 of file kis_tool_move.cc.

568{
570
571 if (!m_strokeId) return;
572
573 QPoint pos = convertToPixelCoordAndSnap(event).toPoint();
574 pos = applyModifiers(event->modifiers(), pos);
575 m_dragPos = pos;
576
577 drag(pos);
579
580 qobject_cast<KisCanvas2*>(canvas())->updateCanvas();
581}
QPoint applyModifiers(Qt::KeyboardModifiers modifiers, QPoint pos)
void drag(const QPoint &newPos)
Qt::KeyboardModifiers modifiers() const
#define CHECK_MODE_SANITY_OR_RETURN(_mode)
Definition kis_tool.h:27
@ PAINT_MODE
Definition kis_tool.h:300
QPointF convertToPixelCoordAndSnap(KoPointerEvent *e, const QPointF &offset=QPointF(), bool useModifiers=true)
Definition kis_tool.cc:214

References applyModifiers(), Private::canvas, CHECK_MODE_SANITY_OR_RETURN, KisTool::convertToPixelCoordAndSnap(), drag(), m_dragPos, m_strokeId, KoPointerEvent::modifiers(), notifyGuiAfterMove(), and KisTool::PAINT_MODE.

◆ continueAlternateAction()

void KisToolMove::continueAlternateAction ( KoPointerEvent * event,
AlternateAction action )
overridevirtual

Reimplemented from KisTool.

Definition at line 520 of file kis_tool_move.cc.

521{
522 Q_UNUSED(action);
523 continueAction(event);
524}
void continueAction(KoPointerEvent *event)

References KoToolBase::action(), and continueAction().

◆ continuePrimaryAction()

void KisToolMove::continuePrimaryAction ( KoPointerEvent * event)
overridevirtual

Called by KisToolProxy when the primary action is in progress of pointer movement. If the tool has ignored the event in beginPrimaryAction(), this method will not be called.

Reimplemented from KisTool.

Definition at line 492 of file kis_tool_move.cc.

493{
494 continueAction(event);
495}

References continueAction().

◆ createOptionWidget()

QWidget * KisToolMove::createOptionWidget ( )
overridevirtual

Reimplement this if your tool actually has an option widget. Sets the option widget to 0 by default.

Reimplemented from KisTool.

Definition at line 711 of file kis_tool_move.cc.

712{
713 return m_optionsWidget;
714}

References m_optionsWidget.

◆ currentOffset()

QPoint KisToolMove::currentOffset ( ) const
private

Definition at line 270 of file kis_tool_move.cc.

271{
273}

References m_accumulatedOffset, m_dragPos, and m_dragStart.

◆ deactivate

void KisToolMove::deactivate ( )
overrideslot

◆ drag()

void KisToolMove::drag ( const QPoint & newPos)
private

Definition at line 609 of file kis_tool_move.cc.

610{
612
613 QPoint offset = m_accumulatedOffset + newPos - m_dragStart;
614
616 new MoveStrokeStrategy::Data(offset));
617}
void addJob(KisStrokeId id, KisStrokeJobData *data) override

References KisImage::addJob(), KisTool::currentImage(), KisTool::image(), m_accumulatedOffset, m_dragStart, and m_strokeId.

◆ endAction()

◆ endAlternateAction()

void KisToolMove::endAlternateAction ( KoPointerEvent * event,
AlternateAction action )
overridevirtual

Reimplemented from KisTool.

Definition at line 526 of file kis_tool_move.cc.

527{
528 Q_UNUSED(action);
529 endAction(event);
530}
void endAction(KoPointerEvent *event)

References KoToolBase::action(), and endAction().

◆ endPrimaryAction()

void KisToolMove::endPrimaryAction ( KoPointerEvent * event)
overridevirtual

Called by KisToolProxy when the primary action is being finished, that is while mouseRelease or tabletRelease event. If the tool has ignored the event in beginPrimaryAction(), this method will not be called.

Reimplemented from KisTool.

Definition at line 497 of file kis_tool_move.cc.

498{
499 endAction(event);
500}

References endAction().

◆ endStroke

◆ mouseMoveEvent()

void KisToolMove::mouseMoveEvent ( KoPointerEvent * event)
overridevirtual

Called when the mouse or stylus moved over the canvas. Implementors should call event->ignore() if they do not actually use the event.

Parameters
eventstate and reason of this mouse or stylus move

Reimplemented from KisTool.

Definition at line 532 of file kis_tool_move.cc.

533{
534 m_lastCursorPos = convertToPixelCoord(event).toPoint();
536
539
541 }
542}
QPoint m_lastCursorPos
QPointF convertToPixelCoord(KoPointerEvent *e)
Definition kis_tool.cc:189
void mouseMoveEvent(KoPointerEvent *event) override
Definition kis_tool.cc:520

References KisTool::convertToPixelCoord(), m_currentMode, m_lastCursorPos, m_strokeId, m_updateCursorCompressor, KisTool::mouseMoveEvent(), MoveSelectedLayer, moveToolMode(), and KisSignalCompressor::start().

◆ moveBySpinX

void KisToolMove::moveBySpinX ( int newX)
slot

Definition at line 741 of file kis_tool_move.cc.

742{
743 if (mode() == KisTool::PAINT_MODE || // Don't interact with dragging
744 !currentNode()->isEditable() || // Don't move invisible nodes
745 m_handlesRect.isEmpty()) {
746 return;
747 }
748
749 // starting a new stroke resets m_handlesRect and it gets updated asynchronously,
750 // but in this case no change is expected
751 int handlesRectX = m_handlesRect.x();
752
753 if (startStrokeImpl(MoveSelectedLayer, nullptr)) {
755 }
756
757 m_accumulatedOffset.rx() = newX - handlesRectX;
758
760
761 notifyGuiAfterMove(false);
763}
bool startStrokeImpl(MoveToolMode mode, const QPoint *pos)
KisNodeSP currentNode() const
Definition kis_tool.cc:370

References KisImage::addJob(), KisTool::currentNode(), KisTool::HOVER_MODE, KisTool::image(), m_accumulatedOffset, m_handlesRect, m_strokeId, KisTool::mode(), MoveSelectedLayer, notifyGuiAfterMove(), KisTool::PAINT_MODE, KisTool::setMode(), and startStrokeImpl().

◆ moveBySpinY

void KisToolMove::moveBySpinY ( int newY)
slot

Definition at line 765 of file kis_tool_move.cc.

766{
767 if (mode() == KisTool::PAINT_MODE || // Don't interact with dragging
768 !currentNode()->isEditable() || // Don't move invisible nodes
769 m_handlesRect.isEmpty()) {
770 return;
771 }
772
773 // starting a new stroke resets m_handlesRect and it gets updated asynchronously,
774 // but in this case no change is expected
775 int handlesRectY = m_handlesRect.y();
776
777 if (startStrokeImpl(MoveSelectedLayer, nullptr)) {
779 }
780
781 m_accumulatedOffset.ry() = newY - handlesRectY;
782
784
785 notifyGuiAfterMove(false);
787}

References KisImage::addJob(), KisTool::currentNode(), KisTool::HOVER_MODE, KisTool::image(), m_accumulatedOffset, m_handlesRect, m_strokeId, KisTool::mode(), MoveSelectedLayer, notifyGuiAfterMove(), KisTool::PAINT_MODE, KisTool::setMode(), and startStrokeImpl().

◆ moveDiscrete

void KisToolMove::moveDiscrete ( MoveDirection direction,
bool big )
slot

Definition at line 362 of file kis_tool_move.cc.

363{
364 if (mode() == KisTool::PAINT_MODE) return; // Don't interact with dragging
365 if (!currentNode()) return;
366 if (!image()) return;
367 if (!currentNode()->isEditable()) return; // Don't move invisible nodes
368
369 if (startStrokeImpl(MoveSelectedLayer, nullptr)) {
371 }
372
373 // Larger movement if "shift" key is pressed.
374 qreal scale = big ? m_optionsWidget->moveScale() : 1.0;
375 qreal moveStep = m_optionsWidget->moveStep() * scale;
376
377 const QPoint offset =
378 direction == Up ? QPoint( 0, -moveStep) :
379 direction == Down ? QPoint( 0, moveStep) :
380 direction == Left ? QPoint(-moveStep, 0) :
381 QPoint( moveStep, 0) ;
382
383 m_accumulatedOffset += offset;
385
389}

References KisImage::addJob(), commitChanges(), KisTool::currentNode(), Down, KisTool::HOVER_MODE, KisTool::image(), Left, m_accumulatedOffset, m_optionsWidget, m_strokeId, KisTool::mode(), MoveToolOptionsWidget::moveScale(), MoveSelectedLayer, MoveToolOptionsWidget::moveStep(), notifyGuiAfterMove(), KisTool::PAINT_MODE, KisTool::setMode(), startStrokeImpl(), and Up.

◆ moveInNewPosition

void KisToolMove::moveInNewPosition ( QPoint )
signal

◆ moveToolMode()

KisToolMove::MoveToolMode KisToolMove::moveToolMode ( ) const

Definition at line 716 of file kis_tool_move.cc.

717{
718 if (m_optionsWidget)
719 return m_optionsWidget->mode();
720 return MoveSelectedLayer;
721}

References m_optionsWidget, MoveToolOptionsWidget::mode(), and MoveSelectedLayer.

◆ moveToolModeChanged

void KisToolMove::moveToolModeChanged ( )
signal

◆ notifyGuiAfterMove()

void KisToolMove::notifyGuiAfterMove ( bool showFloatingMessage = true)
private

Definition at line 275 of file kis_tool_move.cc.

276{
277 if (!m_optionsWidget) return;
278 if (m_handlesRect.isEmpty()) return;
279
280 const QPoint currentTopLeft = m_handlesRect.topLeft() + currentOffset();
281
283 Q_EMIT moveInNewPosition(currentTopLeft);
284
285 // TODO: fetch this info not from options widget, but from config
286 const bool showCoordinates = m_optionsWidget->showCoordinates();
287
288 if (showCoordinates && showFloatingMessage) {
289 KisCanvas2 *kisCanvas = static_cast<KisCanvas2*>(canvas());
290 kisCanvas->viewManager()->
291 showFloatingMessage(
292 i18nc("floating message in move tool",
293 "X: %1 px, Y: %2 px",
294 QLocale().toString(currentTopLeft.x()),
295 QLocale().toString(currentTopLeft.y())),
296 QIcon(), 1000, KisFloatingMessage::High);
297 }
298}
KisViewManager * viewManager() const
QString toString(const QString &value)

References Private::canvas, currentOffset(), KisFloatingMessage::High, m_handlesRect, m_optionsWidget, moveInNewPosition(), MoveToolOptionsWidget::showCoordinates(), and KisCanvas2::viewManager().

◆ paint()

void KisToolMove::paint ( QPainter & painter,
const KoViewConverter & converter )
overridevirtual

Called by the canvas to paint any decorations that the tool deems needed. The painter has the top left of the canvas as its origin.

Parameters
painterused for painting the shape
converterto convert between internal and view coordinates.

Implements KoToolBase.

Definition at line 432 of file kis_tool_move.cc.

433{
434 Q_UNUSED(converter);
435
436 if (m_strokeId && !m_handlesRect.isEmpty() && !m_currentlyUsingSelection) {
437 QPainterPath handles;
438 handles.addRect(m_handlesRect.translated(currentOffset()));
439
440 QPainterPath path = pixelToView(handles);
441 paintToolOutline(&gc, path);
442 }
443}
QPointF pixelToView(const QPoint &pixelCoord) const
Definition kis_tool.cc:269
void paintToolOutline(QPainter *painter, const KisOptimizedBrushOutline &path)
Definition kis_tool.cc:589

References currentOffset(), m_currentlyUsingSelection, m_handlesRect, m_strokeId, KisTool::paintToolOutline(), and KisTool::pixelToView().

◆ Q_ENUMS()

KisToolMove::Q_ENUMS ( MoveToolMode )
private

◆ requestHandlesRectUpdate()

void KisToolMove::requestHandlesRectUpdate ( )
private

Definition at line 789 of file kis_tool_move.cc.

790{
791 KisResourcesSnapshotSP resources =
792 new KisResourcesSnapshot(image(), currentNode(), canvas()->resourceManager());
794
796 selection, this);
797 connect(job,
798 SIGNAL(sigCalculationFinished(const QRect&)),
799 SLOT(slotHandlesRectCalculated(const QRect &)));
800
801 KisImageSP image = this->image();
802 image->addSpontaneousJob(job);
803
804 notifyGuiAfterMove(false);
805}
void addSpontaneousJob(KisSpontaneousJob *spontaneousJob)
The KisResourcesSnapshot class takes a snapshot of the various resources like colors and settings use...
KisSelectionSP activeSelection() const
void slotHandlesRectCalculated(const QRect &handlesRect)
virtual KoToolSelection * selection()

References KisResourcesSnapshot::activeSelection(), KisImage::addSpontaneousJob(), Private::canvas, connect(), KisTool::currentNode(), KisTool::image(), notifyGuiAfterMove(), KisTool::selectedNodes(), KoToolBase::selection(), and slotHandlesRectCalculated().

◆ requestRedoDuringStroke

void KisToolMove::requestRedoDuringStroke ( )
overrideslot

◆ requestStrokeCancellation

void KisToolMove::requestStrokeCancellation ( )
overrideslot

Definition at line 462 of file kis_tool_move.cc.

463{
464 cancelStroke();
465}
void cancelStroke()

References cancelStroke().

◆ requestStrokeEnd

void KisToolMove::requestStrokeEnd ( )
overrideslot

Definition at line 457 of file kis_tool_move.cc.

458{
459 endStroke();
460}

References endStroke().

◆ requestUndoDuringStroke

void KisToolMove::requestUndoDuringStroke ( )
overrideslot

◆ resetCursorStyle

void KisToolMove::resetCursorStyle ( )
overrideprotectedslot

noop; whatever the cursor position, we always show move cursor, because we don't use 'layer under cursor' mode for moving selections

we cannot pick layer's pixel data while the stroke is running, because it may run in lodN mode; therefore, we delegate this work to the stroke itself

Definition at line 88 of file kis_tool_move.cc.

89{
90 if (!isActive()) return;
91
92 bool canMove = true;
93
103 (m_handlesRect.isEmpty() ||
104 !m_handlesRect.translated(currentOffset()).contains(m_lastCursorPos))) {
105
107 return;
108 }
109 } else {
110 KisResourcesSnapshotSP resources =
111 new KisResourcesSnapshot(this->image(), currentNode(), canvas()->resourceManager());
113
114 KisPaintLayerSP paintLayer =
115 dynamic_cast<KisPaintLayer*>(this->currentNode().data());
116
117 const bool canUseSelectionMode =
118 paintLayer && selection &&
119 !selection->selectedRect().isEmpty() &&
120 !selection->selectedExactRect().isEmpty();
121
122 if (canUseSelectionMode) {
123 canMove = (m_currentMode == MoveSelectedLayer ? paintLayer->isEditable() : true);
124 } else {
125 KisNodeSelectionRecipe nodeSelection =
127 this->selectedNodes(),
130
131 if (nodeSelection.selectNodesToProcess().isEmpty()) {
132 canMove = false;
133 }
134 }
135 }
136
137 if (canMove) {
139 } else {
140 useCursor(Qt::ForbiddenCursor);
141 }
142}
KisNodeList selectNodesToProcess() const
void useCursor(const QCursor &cursor)
bool isEditable(bool checkVisibility=true) const
virtual void resetCursorStyle()
Definition kis_tool.cc:613
bool isActive
Definition kis_tool.h:44

References KisResourcesSnapshot::activeSelection(), KisImage::addJob(), Private::canvas, KisTool::currentNode(), currentOffset(), KisSharedPtr< T >::data(), KisTool::image(), KisTool::isActive, KisBaseNode::isEditable(), m_currentlyUsingSelection, m_currentMode, m_handlesRect, m_lastCursorPos, m_strokeId, MoveSelectedLayer, moveToolMode(), KisTool::resetCursorStyle(), KisTool::selectedNodes(), KoToolBase::selection(), KisNodeSelectionRecipe::selectNodesToProcess(), and KoToolBase::useCursor().

◆ setShowCoordinates()

void KisToolMove::setShowCoordinates ( bool value)

◆ slotHandlesRectCalculated

void KisToolMove::slotHandlesRectCalculated ( const QRect & handlesRect)
slot

Definition at line 325 of file kis_tool_move.cc.

326{
327 m_handlesRect = handlesRect;
328 notifyGuiAfterMove(false);
329}

References m_handlesRect, and notifyGuiAfterMove().

◆ slotMoveDiscreteDown

void KisToolMove::slotMoveDiscreteDown ( )
privateslot

Definition at line 666 of file kis_tool_move.cc.

667{
669}
void moveDiscrete(MoveDirection direction, bool big)

References Down, and moveDiscrete().

◆ slotMoveDiscreteDownMore

void KisToolMove::slotMoveDiscreteDownMore ( )
privateslot

Definition at line 686 of file kis_tool_move.cc.

687{
689}

References Down, and moveDiscrete().

◆ slotMoveDiscreteLeft

void KisToolMove::slotMoveDiscreteLeft ( )
privateslot

Definition at line 651 of file kis_tool_move.cc.

652{
654}

References Left, and moveDiscrete().

◆ slotMoveDiscreteLeftMore

void KisToolMove::slotMoveDiscreteLeftMore ( )
privateslot

Definition at line 671 of file kis_tool_move.cc.

672{
674}

References Left, and moveDiscrete().

◆ slotMoveDiscreteRight

void KisToolMove::slotMoveDiscreteRight ( )
privateslot

Definition at line 656 of file kis_tool_move.cc.

657{
659}

References moveDiscrete(), and Right.

◆ slotMoveDiscreteRightMore

void KisToolMove::slotMoveDiscreteRightMore ( )
privateslot

Definition at line 676 of file kis_tool_move.cc.

677{
679}

References moveDiscrete(), and Right.

◆ slotMoveDiscreteUp

void KisToolMove::slotMoveDiscreteUp ( )
privateslot

Definition at line 661 of file kis_tool_move.cc.

662{
664}

References moveDiscrete(), and Up.

◆ slotMoveDiscreteUpMore

void KisToolMove::slotMoveDiscreteUpMore ( )
privateslot

Definition at line 681 of file kis_tool_move.cc.

682{
684}

References moveDiscrete(), and Up.

◆ slotNodeChanged

void KisToolMove::slotNodeChanged ( const KisNodeList & nodes)
slot

Definition at line 807 of file kis_tool_move.cc.

808{
809 if (m_strokeId && !tryEndPreviousStroke(nodes)) {
810 return;
811 }
813}
bool tryEndPreviousStroke(const KisNodeList &nodes)
void requestHandlesRectUpdate()

References m_strokeId, requestHandlesRectUpdate(), and tryEndPreviousStroke().

◆ slotSelectionChanged

void KisToolMove::slotSelectionChanged ( )
slot

Definition at line 815 of file kis_tool_move.cc.

816{
817 if (m_strokeId) return;
819}

References m_strokeId, and requestHandlesRectUpdate().

◆ slotStrokePickedLayers

void KisToolMove::slotStrokePickedLayers ( const KisNodeList & nodes)
slot

Definition at line 353 of file kis_tool_move.cc.

354{
355 if (nodes.isEmpty()) {
356 useCursor(Qt::ForbiddenCursor);
357 } else {
359 }
360}

References KisTool::resetCursorStyle(), and KoToolBase::useCursor().

◆ slotStrokeStartedEmpty

void KisToolMove::slotStrokeStartedEmpty ( )
slot

Notify that move-selection stroke ended unexpectedly

Since the choice of nodes for the operation happens in the stroke itself, it may happen that there are no nodes at all. In such a case, we should just cancel already started stroke.

Definition at line 331 of file kis_tool_move.cc.

332{
337 KisCanvas2 *kisCanvas = static_cast<KisCanvas2*>(canvas());
338 kisCanvas->viewManager()->
339 showFloatingMessage(
340 i18nc("floating message in move tool",
341 "Selected area has no pixels"),
342 QIcon(), 1000, KisFloatingMessage::High);
343 }
344
350 cancelStroke();
351}

References cancelStroke(), Private::canvas, KisFloatingMessage::High, m_currentlyUsingSelection, and KisCanvas2::viewManager().

◆ slotTrackerChangedConfig

void KisToolMove::slotTrackerChangedConfig ( KisToolChangesTrackerDataSP state)
privateslot

◆ startAction()

void KisToolMove::startAction ( KoPointerEvent * event,
MoveToolMode mode )

Definition at line 544 of file kis_tool_move.cc.

545{
546 QPoint pos = convertToPixelCoordAndSnap(event).toPoint();
547 m_dragStart = pos;
548 m_dragPos = pos;
549
550 if (startStrokeImpl(mode, &pos)) {
552
557 }
558
559 } else {
560 event->ignore();
561 m_dragPos = QPoint();
562 m_dragStart = QPoint();
563 }
564 qobject_cast<KisCanvas2*>(canvas())->updateCanvas();
565}

References KisImage::addJob(), Private::canvas, KisTool::convertToPixelCoordAndSnap(), KisTool::currentImage(), KisTool::image(), m_currentlyUsingSelection, m_dragPos, m_dragStart, m_strokeId, KisTool::mode(), KisTool::PAINT_MODE, KisTool::setMode(), and startStrokeImpl().

◆ startStrokeImpl()

bool KisToolMove::startStrokeImpl ( MoveToolMode mode,
const QPoint * pos )
private

Definition at line 144 of file kis_tool_move.cc.

145{
146 KisNodeSP node;
147 KisImageSP image = this->image();
148
149 KisResourcesSnapshotSP resources =
150 new KisResourcesSnapshot(image, currentNode(), canvas()->resourceManager());
152
153 KisPaintLayerSP paintLayer =
154 dynamic_cast<KisPaintLayer*>(this->currentNode().data());
155
156
157
158 const bool canUseSelectionMode =
159 paintLayer && selection &&
160 !selection->selectedRect().isEmpty() &&
161 !selection->selectedExactRect().isEmpty();
162
163 if (pos) {
164 // finish stroke by clicking outside image bounds
165 if (m_strokeId && !image->bounds().contains(*pos)) {
166 endStroke();
167 return false;
168 }
169
170 // restart stroke when the mode has changed or the user tried to
171 // pick another layer in "layer under cursor" mode.
172 if (m_strokeId &&
173 (m_currentMode != mode ||
174 m_currentlyUsingSelection != canUseSelectionMode ||
177 !m_handlesRect.translated(currentOffset()).contains(*pos)))) {
178
179 endStroke();
180 }
181 }
182
183 if (m_strokeId) return true;
184
185
186 if (canUseSelectionMode && !nodeEditable()) {
187 // if there is a selection, it would only use the current layer anyway
188 // if the current layer is not editable, don't continue
189 return false;
190 }
191
192 KisNodeList nodes;
193
194 KisStrokeStrategy *strategy;
195
196 bool isMoveSelection = false;
197 if (canUseSelectionMode) {
199
200 MoveSelectionStrokeStrategy *moveStrategy =
201 new MoveSelectionStrokeStrategy(paintLayer,
202 selection,
203 image.data(),
204 image.data());
205
206 connect(moveStrategy,
207 SIGNAL(sigHandlesRectCalculated(const QRect&)),
208 SLOT(slotHandlesRectCalculated(const QRect&)));
209 connect(moveStrategy,
210 SIGNAL(sigStrokeStartedEmpty()),
211 SLOT(slotStrokeStartedEmpty()));
212
213 strategy = moveStrategy;
214 isMoveSelection = true;
215 nodes = {paintLayer};
216
217 } else {
218 KisNodeSelectionRecipe nodeSelection =
219 pos ?
221 this->selectedNodes(),
223 *pos) :
225
226
227 MoveStrokeStrategy *moveStrategy =
228 new MoveStrokeStrategy(nodeSelection, image.data(), image.data());
229 connect(moveStrategy,
230 SIGNAL(sigHandlesRectCalculated(const QRect&)),
231 SLOT(slotHandlesRectCalculated(const QRect&)));
232 connect(moveStrategy,
233 SIGNAL(sigStrokeStartedEmpty()),
234 SLOT(slotStrokeStartedEmpty()));
235 connect(moveStrategy,
236 SIGNAL(sigLayersPicked(const KisNodeList&)),
237 SLOT(slotStrokePickedLayers(const KisNodeList&)));
238
239 strategy = moveStrategy;
240 nodes = nodeSelection.selectedNodes;
241 }
242
243 {
244 KConfigGroup group = KSharedConfig::openConfig()->group(toolId());
245 const bool forceLodMode = group.readEntry("forceLodMode", false);
246 strategy->setForceLodModeIfPossible(forceLodMode);
247 }
248
249 // disable outline feedback until the stroke calculates
250 // correct bounding rect
251 m_handlesRect = QRect();
252 m_strokeId = image->startStroke(strategy);
254 m_currentlyUsingSelection = isMoveSelection;
256 m_accumulatedOffset = QPoint();
257
258 if (!isMoveSelection) {
260 }
261
264 }
266
267 return true;
268}
void startUpdateStream(KisStrokesFacade *strokesFacade, KisStrokeId strokeId)
KisStrokeId startStroke(KisStrokeStrategy *strokeStrategy) override
QRect bounds() const override
void setForceLodModeIfPossible(bool forceLodModeIfPossible)
void slotStrokeStartedEmpty()
void slotStrokePickedLayers(const KisNodeList &nodes)
#define KIS_SAFE_ASSERT_RECOVER(cond)
Definition kis_assert.h:126
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129
bool nodeEditable()
Checks checks if the current node is editable.
Definition kis_tool.cc:651

References KisResourcesSnapshot::activeSelection(), KisImage::bounds(), Private::canvas, commitChanges(), connect(), KisTool::currentNode(), currentOffset(), KisSharedPtr< T >::data(), KisWeakSharedPtr< T >::data(), endStroke(), KisTool::image(), KisToolChangesTracker::isEmpty(), KIS_SAFE_ASSERT_RECOVER, KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE, m_accumulatedOffset, m_asyncUpdateHelper, m_changesTracker, m_currentlyProcessingNodes, m_currentlyUsingSelection, m_currentMode, m_handlesRect, m_strokeId, KisTool::mode(), MoveSelectedLayer, KisTool::nodeEditable(), KisToolChangesTracker::reset(), KisTool::selectedNodes(), KisNodeSelectionRecipe::selectedNodes, KoToolBase::selection(), KisStrokeStrategy::setForceLodModeIfPossible(), slotHandlesRectCalculated(), slotStrokePickedLayers(), slotStrokeStartedEmpty(), KisImage::startStroke(), KisAsynchronousStrokeUpdateHelper::startUpdateStream(), and KoToolBase::toolId().

◆ tryEndPreviousStroke()

bool KisToolMove::tryEndPreviousStroke ( const KisNodeList & nodes)
private

Definition at line 300 of file kis_tool_move.cc.

301{
302 if (!m_strokeId) return false;
303
304 bool strokeEnded = false;
305
307 endStroke();
308 strokeEnded = true;
309 }
310
311 return strokeEnded;
312}
bool compareListsUnordered(const QList< T > &a, const QList< T > &b)

References KritaUtils::compareListsUnordered(), endStroke(), m_currentlyProcessingNodes, and m_strokeId.

◆ updateUIUnit()

void KisToolMove::updateUIUnit ( int newUnit)

◆ wantsAutoScroll()

bool KisToolMove::wantsAutoScroll ( ) const
inlineoverridevirtual

wantsAutoScroll reimplemented from KoToolBase there's an issue where autoscrolling with this tool never makes the stroke end, so we return false here so that users don't get stuck with the tool. See bug 362659

Returns
false

Reimplemented from KoToolBase.

Definition at line 49 of file kis_tool_move.h.

49 {
50 return false;
51 }

Member Data Documentation

◆ m_accumulatedOffset

QPoint KisToolMove::m_accumulatedOffset
private

Total offset including multiple clicks, up/down/left/right keys, etc. added together.

Definition at line 151 of file kis_tool_move.h.

◆ m_actionConnections

KisSignalAutoConnectionsStore KisToolMove::m_actionConnections
private

Definition at line 170 of file kis_tool_move.h.

◆ m_asyncUpdateHelper

KisAsynchronousStrokeUpdateHelper KisToolMove::m_asyncUpdateHelper
private

Definition at line 173 of file kis_tool_move.h.

◆ m_canvasConnections

KisSignalAutoConnectionsStore KisToolMove::m_canvasConnections
private

Definition at line 171 of file kis_tool_move.h.

◆ m_changesTracker

KisToolChangesTracker KisToolMove::m_changesTracker
private

Definition at line 166 of file kis_tool_move.h.

◆ m_currentlyProcessingNodes

KisNodeList KisToolMove::m_currentlyProcessingNodes
private

Definition at line 155 of file kis_tool_move.h.

◆ m_currentlyUsingSelection

bool KisToolMove::m_currentlyUsingSelection {false}
private

Definition at line 156 of file kis_tool_move.h.

156{false};

◆ m_currentMode

MoveToolMode KisToolMove::m_currentMode {MoveSelectedLayer}
private

Definition at line 157 of file kis_tool_move.h.

◆ m_dragPos

QPoint KisToolMove::m_dragPos
private

Definition at line 163 of file kis_tool_move.h.

◆ m_dragStart

QPoint KisToolMove::m_dragStart
private

Point where current cursor dragging began.

Definition at line 150 of file kis_tool_move.h.

◆ m_handlesRect

QRect KisToolMove::m_handlesRect
private

Definition at line 164 of file kis_tool_move.h.

◆ m_lastCursorPos

QPoint KisToolMove::m_lastCursorPos
private

Definition at line 168 of file kis_tool_move.h.

◆ m_optionsWidget

MoveToolOptionsWidget* KisToolMove::m_optionsWidget {0}
private

Definition at line 149 of file kis_tool_move.h.

149{0};

◆ m_resolution

int KisToolMove::m_resolution {0}
private

Definition at line 159 of file kis_tool_move.h.

159{0};

◆ m_showCoordinatesAction

QAction* KisToolMove::m_showCoordinatesAction {0}
private

Definition at line 161 of file kis_tool_move.h.

161{0};

◆ m_strokeId

KisStrokeId KisToolMove::m_strokeId
private

Definition at line 153 of file kis_tool_move.h.

◆ m_updateCursorCompressor

KisSignalCompressor KisToolMove::m_updateCursorCompressor
private

Definition at line 169 of file kis_tool_move.h.


The documentation for this class was generated from the following files: