diff --git a/krita/data/actions/CMakeLists.txt b/krita/data/actions/CMakeLists.txt
--- a/krita/data/actions/CMakeLists.txt
+++ b/krita/data/actions/CMakeLists.txt
@@ -5,4 +5,5 @@
TextTool.action
ConnectionTool.action
ReferencesTool.action
-DESTINATION ${DATA_INSTALL_DIR}/krita/actions)
+ MoveTool.action
+ DESTINATION ${DATA_INSTALL_DIR}/krita/actions)
diff --git a/krita/data/actions/MoveTool.action b/krita/data/actions/MoveTool.action
new file mode 100644
--- /dev/null
+++ b/krita/data/actions/MoveTool.action
@@ -0,0 +1,50 @@
+
+
+
+ Path Tool
+
+ Move up
+ Up
+ Move up
+
+
+
+ false
+ Move up
+ Up
+
+
+ Move down
+ Down
+ Move down
+
+
+
+ false
+ Move down
+ Down
+
+
+ Move left
+ Left
+ Move left
+
+
+
+ false
+ Move left
+ Left
+
+
+ Move right
+ Right
+ Move right
+
+
+
+ false
+ Move right
+ Right
+
+
+
diff --git a/krita/plugins/tools/defaulttools/kis_tool_move.h b/krita/plugins/tools/defaulttools/kis_tool_move.h
--- a/krita/plugins/tools/defaulttools/kis_tool_move.h
+++ b/krita/plugins/tools/defaulttools/kis_tool_move.h
@@ -65,6 +65,13 @@
MoveGroup
};
+ enum MoveDirection {
+ Up,
+ Down,
+ Left,
+ Right
+ };
+
void beginPrimaryAction(KoPointerEvent *event);
void continuePrimaryAction(KoPointerEvent *event);
void endPrimaryAction(KoPointerEvent *event);
@@ -86,6 +93,8 @@
public Q_SLOTS:
void setMoveToolMode(MoveToolMode newMode);
void slotWidgetRadioToggled(bool checked);
+ void moveDiscrete(MoveDirection direction);
+ void slotSetMoveStep(int newMoveStep);
Q_SIGNALS:
void moveToolModeChanged();
@@ -112,6 +121,12 @@
bool m_moveInProgress;
KisNodeSP m_currentlyProcessingNode;
KConfigGroup configGroup;
+ int m_moveStep;
+
+ QAction * m_actionMoveUp;
+ QAction * m_actionMoveDown;
+ QAction * m_actionMoveLeft;
+ QAction * m_actionMoveRight;
};
diff --git a/krita/plugins/tools/defaulttools/kis_tool_move.cc b/krita/plugins/tools/defaulttools/kis_tool_move.cc
--- a/krita/plugins/tools/defaulttools/kis_tool_move.cc
+++ b/krita/plugins/tools/defaulttools/kis_tool_move.cc
@@ -3,6 +3,7 @@
* 1999 Michael Koch
* 2002 Patrick Julien
* 2004 Boudewijn Rempt
+ * 2016 Michael Abrahams
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -36,15 +37,32 @@
#include "kis_tool_movetooloptionswidget.h"
#include "strokes/move_selection_stroke_strategy.h"
#include "kis_resources_snapshot.h"
-
+#include "kis_action_registry.h"
KisToolMove::KisToolMove(KoCanvasBase * canvas)
: KisTool(canvas, KisCursor::moveCursor())
{
setObjectName("tool_move");
m_optionsWidget = 0;
m_moveToolMode = MoveSelectedLayer;
m_moveInProgress = false;
+
+ KisActionRegistry *actionRegistry = KisActionRegistry::instance();
+ m_actionMoveUp = actionRegistry->makeQAction("movetool-move-up", this);
+ addAction("movetool-move-up", m_actionMoveUp);
+ connect(m_actionMoveUp, &QAction::triggered, [&](){moveDiscrete(MoveDirection::Up);});
+
+ m_actionMoveDown = actionRegistry->makeQAction("movetool-move-down", this);
+ addAction("movetool-move-down", m_actionMoveDown);
+ connect(m_actionMoveDown, &QAction::triggered, [&](){moveDiscrete(MoveDirection::Down);});
+
+ m_actionMoveLeft = actionRegistry->makeQAction("movetool-move-left", this);
+ addAction("movetool-move-left", m_actionMoveLeft);
+ connect(m_actionMoveLeft, &QAction::triggered, [&](){moveDiscrete(MoveDirection::Left);});
+
+ m_actionMoveRight = actionRegistry->makeQAction("movetool-move-right", this);
+ addAction("movetool-move-right", m_actionMoveRight);
+ connect(m_actionMoveRight, &QAction::triggered, [&](){moveDiscrete(MoveDirection::Right);});
}
KisToolMove::~KisToolMove()
@@ -59,6 +77,73 @@
overrideCursorIfNotEditable();
}
+void KisToolMove::moveDiscrete(MoveDirection direction)
+{
+ if (mode() == KisTool::PAINT_MODE) return; // Don't interact with dragging
+
+ setMode(KisTool::PAINT_MODE);
+
+ KisNodeSP node;
+ KisImageSP image = this->image();
+
+ KisResourcesSnapshotSP resources =
+ new KisResourcesSnapshot(image, currentNode(), 0, this->canvas()->resourceManager());
+ KisSelectionSP selection = resources->activeSelection();
+
+ // Move current layer by default.
+ if ((!node && !(node = resources->currentNode())) || !node->isEditable()) {
+ return;
+ }
+
+
+ // If node has changed, end current stroke.
+ if (m_strokeId && (node != m_currentlyProcessingNode)) {
+ endStroke();
+ }
+
+
+ /**
+ * Begin a new stroke if necessary.
+ */
+ if (!m_strokeId) {
+ KisStrokeStrategy *strategy;
+
+ KisPaintLayerSP paintLayer =
+ dynamic_cast(node.data());
+
+ if (paintLayer && selection &&
+ !selection->isTotallyUnselected(image->bounds())) {
+
+ strategy =
+ new MoveSelectionStrokeStrategy(paintLayer,
+ selection,
+ image.data(),
+ image->postExecutionUndoAdapter());
+ } else {
+ strategy =
+ new MoveStrokeStrategy(node, image.data(),
+ image->postExecutionUndoAdapter());
+ }
+
+ m_strokeId = image->startStroke(strategy);
+ m_currentlyProcessingNode = node;
+ m_accumulatedOffset = QPoint();
+ }
+
+ QPoint offset = direction == Up ? QPoint( 0, -m_moveStep) :
+ direction == Down ? QPoint( 0, m_moveStep) :
+ direction == Left ? QPoint(-m_moveStep, 0) :
+ QPoint( m_moveStep, 0) ;
+
+ image->addJob(m_strokeId, new MoveStrokeStrategy::Data(m_accumulatedOffset + offset));
+ m_accumulatedOffset += offset;
+
+
+ m_moveInProgress = false;
+ emit moveInProgressChanged();
+ setMode(KisTool::HOVER_MODE);
+}
+
void KisToolMove::activate(ToolActivation toolActivation, const QSet &shapes)
{
KisTool::activate(toolActivation, shapes);
@@ -279,6 +364,10 @@
connect(m_optionsWidget->radioGroup, SIGNAL(toggled(bool)),
this, SLOT(slotWidgetRadioToggled(bool)));
+ connect(m_optionsWidget->sliderMoveStep, SIGNAL(valueChanged(int)),
+ this, SLOT(slotSetMoveStep(int)));
+
+
// load config for correct radio button
MoveToolMode newMode = static_cast(configGroup.readEntry("moveToolMode", 0));
@@ -291,6 +380,9 @@
m_moveToolMode = newMode; // set the internal variable for calculations
+ int moveStep = configGroup.readEntry("moveToolStep", 5);
+ m_optionsWidget->sliderMoveStep->setValue(moveStep);
+ m_moveStep = moveStep;
return m_optionsWidget;
}
@@ -301,6 +393,12 @@
configGroup.writeEntry("moveToolMode", static_cast(newMode));
}
+void KisToolMove::slotSetMoveStep(int newMoveStep)
+{
+ m_moveStep = newMoveStep;
+ configGroup.writeEntry("moveToolStep", newMoveStep);
+}
+
KisToolMove::MoveToolMode KisToolMove::moveToolMode() const
{
return m_moveToolMode;