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
 
KisToolUtils::MoveShortcutsHelper m_moveShortcutsHelper
 
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 34 of file kis_tool_move.h.

Member Enumeration Documentation

◆ MoveDirection

Enumerator
Up 
Down 
Left 
Right 

Definition at line 74 of file kis_tool_move.h.

◆ MoveToolMode

Enumerator
MoveSelectedLayer 
MoveFirstLayer 
MoveGroup 

Definition at line 68 of file kis_tool_move.h.

Constructor & Destructor Documentation

◆ KisToolMove()

KisToolMove::KisToolMove ( KoCanvasBase * canvas)

Definition at line 55 of file kis_tool_move.cc.

59{
60 setObjectName("tool_move");
61
62 m_showCoordinatesAction = action("movetool-show-coordinates");
63 m_showCoordinatesAction = action("movetool-show-coordinates");
64 connect(&m_updateCursorCompressor, SIGNAL(timeout()), this, SLOT(resetCursorStyle()));
65
66 m_optionsWidget = new MoveToolOptionsWidget(nullptr, currentImage()->xRes(), toolId());
67
68 // See https://bugs.kde.org/show_bug.cgi?id=316896
69 QWidget *specialSpacer = new QWidget(m_optionsWidget);
70 specialSpacer->setObjectName("SpecialSpacer");
71 specialSpacer->setFixedSize(0, 0);
72 m_optionsWidget->layout()->addWidget(specialSpacer);
73
74 m_optionsWidget->setFixedHeight(m_optionsWidget->sizeHint().height());
75
77
79
80 connect(this, SIGNAL(moveInNewPosition(QPoint)), m_optionsWidget, SLOT(slotSetTranslate(QPoint)), Qt::UniqueConnection);
81}
static QCursor moveCursor()
void moveInNewPosition(QPoint)
KisSignalCompressor m_updateCursorCompressor
QPoint currentOffset() const
KisToolUtils::MoveShortcutsHelper m_moveShortcutsHelper
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(), 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 83 of file kis_tool_move.cc.

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

References endStroke(), and m_optionsWidget.

Member Function Documentation

◆ activate

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

Definition at line 392 of file kis_tool_move.cc.

393{
394 KisTool::activate(shapes);
395
397
398 m_actionConnections.addConnection(action("movetool-move-up"), SIGNAL(triggered(bool)),
399 this, SLOT(slotMoveDiscreteUp()));
400 m_actionConnections.addConnection(action("movetool-move-down"), SIGNAL(triggered(bool)),
401 this, SLOT(slotMoveDiscreteDown()));
402 m_actionConnections.addConnection(action("movetool-move-left"), SIGNAL(triggered(bool)),
403 this, SLOT(slotMoveDiscreteLeft()));
404 m_actionConnections.addConnection(action("movetool-move-right"), SIGNAL(triggered(bool)),
405 this, SLOT(slotMoveDiscreteRight()));
406
407 m_actionConnections.addConnection(action("movetool-move-up-more"), SIGNAL(triggered(bool)),
408 this, SLOT(slotMoveDiscreteUpMore()));
409 m_actionConnections.addConnection(action("movetool-move-down-more"), SIGNAL(triggered(bool)),
410 this, SLOT(slotMoveDiscreteDownMore()));
411 m_actionConnections.addConnection(action("movetool-move-left-more"), SIGNAL(triggered(bool)),
412 this, SLOT(slotMoveDiscreteLeftMore()));
413 m_actionConnections.addConnection(action("movetool-move-right-more"), SIGNAL(triggered(bool)),
414 this, SLOT(slotMoveDiscreteRightMore()));
415
416 m_canvasConnections.addUniqueConnection(qobject_cast<KisCanvas2*>(canvas())->viewManager()->nodeManager(), SIGNAL(sigUiNeedChangeSelectedNodes(KisNodeList)), this, SLOT(slotNodeChanged(KisNodeList)));
417 m_canvasConnections.addUniqueConnection(qobject_cast<KisCanvas2*>(canvas())->viewManager()->selectionManager(), SIGNAL(currentSelectionChanged()), this, SLOT(slotSelectionChanged()));
418
419 connect(m_showCoordinatesAction, SIGNAL(triggered(bool)), m_optionsWidget, SLOT(setShowCoordinates(bool)), Qt::UniqueConnection);
420 connect(m_optionsWidget, SIGNAL(showCoordinatesChanged(bool)), m_showCoordinatesAction, SLOT(setChecked(bool)), Qt::UniqueConnection);
421 connect(m_optionsWidget, SIGNAL(sigSetTranslateX(int)), SLOT(moveBySpinX(int)), Qt::UniqueConnection);
422 connect(m_optionsWidget, SIGNAL(sigSetTranslateY(int)), SLOT(moveBySpinY(int)), Qt::UniqueConnection);
423 connect(m_optionsWidget, SIGNAL(sigRequestCommitOffsetChanges()), this, SLOT(commitChanges()), Qt::UniqueConnection);
424
425 connect(&m_changesTracker,
426 SIGNAL(sigConfigChanged(KisToolChangesTrackerDataSP)),
428
429
431}
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(), KisToolUtils::MoveShortcutsHelper::activate(), KisTool::activate(), KisSignalAutoConnectionsStore::addConnection(), KisSignalAutoConnectionsStore::addUniqueConnection(), Private::canvas, commitChanges(), m_actionConnections, m_canvasConnections, m_changesTracker, m_moveShortcutsHelper, 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 728 of file kis_tool_move.cc.

729{
730 QPoint move = pos - m_dragStart;
731
732 // Snap to axis
733 if (modifiers & Qt::ShiftModifier) {
734 move = snapToClosestAxis(move);
735 }
736
737 // "Precision mode" - scale down movement by 1/5
738 if (modifiers & Qt::AltModifier) {
739 const qreal SCALE_FACTOR = .2;
740 move = SCALE_FACTOR * move;
741 }
742
743 return m_dragStart + move;
744}
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 504 of file kis_tool_move.cc.

505{
506 // Ctrl+Right click toggles between moving current layer and moving layer w/ content
509
510 if (mode == MoveSelectedLayer) {
512 } else if (mode == MoveFirstLayer) {
514 }
515
516 startAction(event, mode);
517 } else {
518 startAction(event, MoveGroup);
519 }
520}
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 489 of file kis_tool_move.cc.

490{
491 startAction(event, moveToolMode());
492}

References moveToolMode(), and startAction().

◆ cancelStroke()

void KisToolMove::cancelStroke ( )
private

Definition at line 695 of file kis_tool_move.cc.

696{
697 if (!m_strokeId) return;
698
701 }
702
706 m_strokeId.clear();
711 m_accumulatedOffset = QPoint();
713 qobject_cast<KisCanvas2*>(canvas())->updateCanvas();
714}
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 KisToolUtils::MoveShortcutsHelper::cancelMoveAction(), 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_moveShortcutsHelper, m_strokeId, MoveSelectedLayer, notifyGuiAfterMove(), and KisToolChangesTracker::reset().

◆ commitChanges

void KisToolMove::commitChanges ( )
slot

Definition at line 315 of file kis_tool_move.cc.

316{
318
320 KisToolMoveState *lastState = dynamic_cast<KisToolMoveState*>(m_changesTracker.lastState().data());
321 if (lastState && *lastState == *newState) return;
322
324}
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 569 of file kis_tool_move.cc.

570{
572
573 if (!m_strokeId) return;
574
575 QPoint pos = convertToPixelCoordAndSnap(event).toPoint();
576 pos = applyModifiers(event->modifiers(), pos);
577 m_dragPos = pos;
578
579 drag(pos);
581
582 qobject_cast<KisCanvas2*>(canvas())->updateCanvas();
583}
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 522 of file kis_tool_move.cc.

523{
524 Q_UNUSED(action);
525 continueAction(event);
526}
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 494 of file kis_tool_move.cc.

495{
496 continueAction(event);
497}

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 716 of file kis_tool_move.cc.

717{
718 return m_optionsWidget;
719}

References m_optionsWidget.

◆ currentOffset()

QPoint KisToolMove::currentOffset ( ) const
private

Definition at line 272 of file kis_tool_move.cc.

273{
275}

References m_accumulatedOffset, m_dragPos, and m_dragStart.

◆ deactivate

◆ drag()

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

Definition at line 611 of file kis_tool_move.cc.

612{
614
615 QPoint offset = m_accumulatedOffset + newPos - m_dragStart;
616
618 new MoveStrokeStrategy::Data(offset));
619}
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 528 of file kis_tool_move.cc.

529{
530 Q_UNUSED(action);
531 endAction(event);
532}
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 499 of file kis_tool_move.cc.

500{
501 endAction(event);
502}

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 534 of file kis_tool_move.cc.

535{
536 m_lastCursorPos = convertToPixelCoord(event).toPoint();
538
541
543 }
544}
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 746 of file kis_tool_move.cc.

747{
748 if (mode() == KisTool::PAINT_MODE || // Don't interact with dragging
749 !currentNode()->isEditable() || // Don't move invisible nodes
750 m_handlesRect.isEmpty()) {
751 return;
752 }
753
754 // starting a new stroke resets m_handlesRect and it gets updated asynchronously,
755 // but in this case no change is expected
756 int handlesRectX = m_handlesRect.x();
757
758 if (startStrokeImpl(MoveSelectedLayer, nullptr)) {
760 }
761
762 m_accumulatedOffset.rx() = newX - handlesRectX;
763
765
766 notifyGuiAfterMove(false);
768}
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 770 of file kis_tool_move.cc.

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

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 363 of file kis_tool_move.cc.

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

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 721 of file kis_tool_move.cc.

722{
723 if (m_optionsWidget)
724 return m_optionsWidget->mode();
725 return MoveSelectedLayer;
726}

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

◆ moveToolModeChanged

void KisToolMove::moveToolModeChanged ( )
signal

◆ notifyGuiAfterMove()

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

Definition at line 277 of file kis_tool_move.cc.

278{
279 if (!m_optionsWidget) return;
280 if (m_handlesRect.isEmpty()) return;
281
282 const QPoint currentTopLeft = m_handlesRect.topLeft() + currentOffset();
283
285 Q_EMIT moveInNewPosition(currentTopLeft);
286
287 const bool showCoordinates = m_optionsWidget->showCoordinates();
288
289 if (showCoordinates && showFloatingMessage) {
290 KisCanvas2 *kisCanvas = static_cast<KisCanvas2*>(canvas());
291 kisCanvas->viewManager()->
292 showFloatingMessage(
293 i18nc("floating message in move tool",
294 "X: %1 px, Y: %2 px",
295 QLocale().toString(currentTopLeft.x()),
296 QLocale().toString(currentTopLeft.y())),
297 QIcon(), 1000, KisFloatingMessage::High);
298 }
299}
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 433 of file kis_tool_move.cc.

434{
435 Q_UNUSED(converter);
436
437 if (m_strokeId && !m_handlesRect.isEmpty() && !m_currentlyUsingSelection) {
438 QPainterPath handles;
439 handles.addRect(m_handlesRect.translated(currentOffset()));
440
441 QPainterPath path = pixelToView(handles);
442 paintToolOutline(&gc, path);
443 }
444}
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 794 of file kis_tool_move.cc.

795{
796 KisResourcesSnapshotSP resources =
797 new KisResourcesSnapshot(image(), currentNode(), canvas()->resourceManager());
799
801 selection, this);
802 connect(job,
803 SIGNAL(sigCalculationFinished(const QRect&)),
804 SLOT(slotHandlesRectCalculated(const QRect &)));
805
806 KisImageSP image = this->image();
807 image->addSpontaneousJob(job);
808
809 notifyGuiAfterMove(false);
810}
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, KisTool::currentNode(), KisTool::image(), notifyGuiAfterMove(), KisTool::selectedNodes(), KoToolBase::selection(), and slotHandlesRectCalculated().

◆ requestRedoDuringStroke

void KisToolMove::requestRedoDuringStroke ( )
overrideslot

◆ requestStrokeCancellation

void KisToolMove::requestStrokeCancellation ( )
overrideslot

Definition at line 464 of file kis_tool_move.cc.

465{
466 cancelStroke();
467}
void cancelStroke()

References cancelStroke().

◆ requestStrokeEnd

void KisToolMove::requestStrokeEnd ( )
overrideslot

Definition at line 459 of file kis_tool_move.cc.

460{
461 endStroke();
462}

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 89 of file kis_tool_move.cc.

90{
91 if (!isActive()) return;
92
93 bool canMove = true;
94
104 (m_handlesRect.isEmpty() ||
105 !m_handlesRect.translated(currentOffset()).contains(m_lastCursorPos))) {
106
108 return;
109 }
110 } else {
111 KisResourcesSnapshotSP resources =
112 new KisResourcesSnapshot(this->image(), currentNode(), canvas()->resourceManager());
114
115 KisPaintLayerSP paintLayer =
116 dynamic_cast<KisPaintLayer*>(this->currentNode().data());
117
118 const bool canUseSelectionMode =
119 paintLayer && selection &&
120 !selection->selectedRect().isEmpty() &&
121 !selection->selectedExactRect().isEmpty();
122
123 if (canUseSelectionMode) {
124 canMove = (m_currentMode == MoveSelectedLayer ? paintLayer->isEditable() : true);
125 } else {
126 KisNodeSelectionRecipe nodeSelection =
128 this->selectedNodes(),
131
132 if (nodeSelection.selectNodesToProcess().isEmpty()) {
133 canMove = false;
134 }
135 }
136 }
137
138 if (canMove) {
140 } else {
141 useCursor(Qt::ForbiddenCursor);
142 }
143}
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 326 of file kis_tool_move.cc.

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

References m_handlesRect, and notifyGuiAfterMove().

◆ slotMoveDiscreteDown

void KisToolMove::slotMoveDiscreteDown ( )
privateslot

Definition at line 670 of file kis_tool_move.cc.

671{
673}
void moveDiscrete(MoveDirection direction, bool big)

References Down, and moveDiscrete().

◆ slotMoveDiscreteDownMore

void KisToolMove::slotMoveDiscreteDownMore ( )
privateslot

Definition at line 690 of file kis_tool_move.cc.

691{
693}

References Down, and moveDiscrete().

◆ slotMoveDiscreteLeft

void KisToolMove::slotMoveDiscreteLeft ( )
privateslot

Definition at line 655 of file kis_tool_move.cc.

656{
658}

References Left, and moveDiscrete().

◆ slotMoveDiscreteLeftMore

void KisToolMove::slotMoveDiscreteLeftMore ( )
privateslot

Definition at line 675 of file kis_tool_move.cc.

676{
678}

References Left, and moveDiscrete().

◆ slotMoveDiscreteRight

void KisToolMove::slotMoveDiscreteRight ( )
privateslot

Definition at line 660 of file kis_tool_move.cc.

661{
663}

References moveDiscrete(), and Right.

◆ slotMoveDiscreteRightMore

void KisToolMove::slotMoveDiscreteRightMore ( )
privateslot

Definition at line 680 of file kis_tool_move.cc.

681{
683}

References moveDiscrete(), and Right.

◆ slotMoveDiscreteUp

void KisToolMove::slotMoveDiscreteUp ( )
privateslot

Definition at line 665 of file kis_tool_move.cc.

666{
668}

References moveDiscrete(), and Up.

◆ slotMoveDiscreteUpMore

void KisToolMove::slotMoveDiscreteUpMore ( )
privateslot

Definition at line 685 of file kis_tool_move.cc.

686{
688}

References moveDiscrete(), and Up.

◆ slotNodeChanged

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

Definition at line 812 of file kis_tool_move.cc.

813{
814 if (m_strokeId && !tryEndPreviousStroke(nodes)) {
815 return;
816 }
818}
bool tryEndPreviousStroke(const KisNodeList &nodes)
void requestHandlesRectUpdate()

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

◆ slotSelectionChanged

void KisToolMove::slotSelectionChanged ( )
slot

Definition at line 820 of file kis_tool_move.cc.

821{
822 if (m_strokeId) return;
824}

References m_strokeId, and requestHandlesRectUpdate().

◆ slotStrokePickedLayers

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

Definition at line 354 of file kis_tool_move.cc.

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

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 332 of file kis_tool_move.cc.

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

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 546 of file kis_tool_move.cc.

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

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 145 of file kis_tool_move.cc.

146{
147 KisNodeSP node;
148 KisImageSP image = this->image();
149
150 KisResourcesSnapshotSP resources =
151 new KisResourcesSnapshot(image, currentNode(), canvas()->resourceManager());
153
154 KisPaintLayerSP paintLayer =
155 dynamic_cast<KisPaintLayer*>(this->currentNode().data());
156
157
158
159 const bool canUseSelectionMode =
160 paintLayer && selection &&
161 !selection->selectedRect().isEmpty() &&
162 !selection->selectedExactRect().isEmpty();
163
164 if (pos) {
165 // finish stroke by clicking outside image bounds
166 if (m_strokeId && !image->bounds().contains(*pos)) {
167 endStroke();
168 return false;
169 }
170
171 // restart stroke when the mode has changed or the user tried to
172 // pick another layer in "layer under cursor" mode.
173 if (m_strokeId &&
174 (m_currentMode != mode ||
175 m_currentlyUsingSelection != canUseSelectionMode ||
178 !m_handlesRect.translated(currentOffset()).contains(*pos)))) {
179
180 endStroke();
181 }
182 }
183
184 if (m_strokeId) return true;
185
186
187 if (canUseSelectionMode && !nodeEditable()) {
188 // if there is a selection, it would only use the current layer anyway
189 // if the current layer is not editable, don't continue
190 return false;
191 }
192
193 KisNodeList nodes;
194
195 KisStrokeStrategy *strategy;
196
197 bool isMoveSelection = false;
198 if (canUseSelectionMode) {
200
201 MoveSelectionStrokeStrategy *moveStrategy =
202 new MoveSelectionStrokeStrategy(paintLayer,
203 selection,
204 image.data(),
205 image.data());
206
207 connect(moveStrategy,
208 SIGNAL(sigHandlesRectCalculated(const QRect&)),
209 SLOT(slotHandlesRectCalculated(const QRect&)));
210 connect(moveStrategy,
211 SIGNAL(sigStrokeStartedEmpty()),
212 SLOT(slotStrokeStartedEmpty()));
213
214 strategy = moveStrategy;
215 isMoveSelection = true;
216 nodes = {paintLayer};
217
218 } else {
219 KisNodeSelectionRecipe nodeSelection =
220 pos ?
222 this->selectedNodes(),
224 *pos) :
226
227
228 MoveStrokeStrategy *moveStrategy =
229 new MoveStrokeStrategy(nodeSelection, image.data(), image.data());
230 connect(moveStrategy,
231 SIGNAL(sigHandlesRectCalculated(const QRect&)),
232 SLOT(slotHandlesRectCalculated(const QRect&)));
233 connect(moveStrategy,
234 SIGNAL(sigStrokeStartedEmpty()),
235 SLOT(slotStrokeStartedEmpty()));
236 connect(moveStrategy,
237 SIGNAL(sigLayersPicked(const KisNodeList&)),
238 SLOT(slotStrokePickedLayers(const KisNodeList&)));
239
240 strategy = moveStrategy;
241 nodes = nodeSelection.selectedNodes;
242 }
243
244 {
245 KConfigGroup group = KSharedConfig::openConfig()->group(toolId());
246 const bool forceLodMode = group.readEntry("forceLodMode", false);
247 strategy->setForceLodModeIfPossible(forceLodMode);
248 }
249
250 // disable outline feedback until the stroke calculates
251 // correct bounding rect
252 m_handlesRect = QRect();
253 m_strokeId = image->startStroke(strategy);
256 m_currentlyUsingSelection = isMoveSelection;
258 m_accumulatedOffset = QPoint();
259
260 if (!isMoveSelection) {
262 }
263
266 }
268
269 return true;
270}
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(), 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_moveShortcutsHelper, m_strokeId, KisTool::mode(), MoveSelectedLayer, KisTool::nodeEditable(), KisToolChangesTracker::reset(), KisTool::selectedNodes(), KisNodeSelectionRecipe::selectedNodes, KoToolBase::selection(), KisStrokeStrategy::setForceLodModeIfPossible(), slotHandlesRectCalculated(), slotStrokePickedLayers(), slotStrokeStartedEmpty(), KisToolUtils::MoveShortcutsHelper::startMoveAction(), KisImage::startStroke(), KisAsynchronousStrokeUpdateHelper::startUpdateStream(), and KoToolBase::toolId().

◆ tryEndPreviousStroke()

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

Definition at line 301 of file kis_tool_move.cc.

302{
303 if (!m_strokeId) return false;
304
305 bool strokeEnded = false;
306
308 endStroke();
309 strokeEnded = true;
310 }
311
312 return strokeEnded;
313}
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 50 of file kis_tool_move.h.

50 {
51 return false;
52 }

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_moveShortcutsHelper

KisToolUtils::MoveShortcutsHelper KisToolMove::m_moveShortcutsHelper
private

Definition at line 175 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: