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;