Krita Source Code Documentation
Loading...
Searching...
No Matches
ShapeMoveStrategy.cpp
Go to the documentation of this file.
1/* This file is part of the KDE project
2
3 SPDX-FileCopyrightText: 2006 Thorsten Zachmann <zachmann@kde.org>
4 SPDX-FileCopyrightText: 2006-2007 Thomas Zander <zander@kde.org>
5
6 SPDX-License-Identifier: LGPL-2.0-or-later
7*/
8
9#include "ShapeMoveStrategy.h"
10#include "SelectionDecorator.h"
11
12#include <KoCanvasBase.h>
13#include <KoShapeManager.h>
14#include <KoShapeContainer.h>
19#include <KoSnapGuide.h>
20#include <KoPointerEvent.h>
21#include <KoToolBase.h>
22#include <KoSelection.h>
23#include <klocalizedstring.h>
24#include <kis_global.h>
25
26#include "kis_debug.h"
27
28ShapeMoveStrategy::ShapeMoveStrategy(KoToolBase *tool, KoSelection *selection, const QPointF &clicked)
30 , m_start(clicked)
31 , m_canvas(tool->canvas())
32{
33 QList<KoShape *> selectedShapes = selection->selectedEditableShapes();
34
35 Q_FOREACH (KoShape *shape, selectedShapes) {
36 m_selectedShapes << shape;
37 m_previousPositions << shape->absolutePosition(KoFlake::Center);
38 m_newPositions << shape->absolutePosition(KoFlake::Center);
39 }
40
43 m_canvas->resourceManager()->resource(KoFlake::HotPosition).toInt());
44
45 m_initialOffset = selection->absolutePosition(anchor) - m_start;
46 m_canvas->snapGuide()->setIgnoredShapes(KoShape::linearizeSubtree(m_selectedShapes));
47
48 tool->setStatusText(i18n("Press Shift to hold x- or y-position."));
49}
50
51void ShapeMoveStrategy::handleMouseMove(const QPointF &point, Qt::KeyboardModifiers modifiers)
52{
53 if (m_selectedShapes.isEmpty()) {
54 return;
55 }
56 QPointF diff = point - m_start;
57
58 if (modifiers & Qt::ShiftModifier) {
59 // Limit change to one direction only
60 diff = snapToClosestAxis(diff);
61 } else {
62 QPointF positionToSnap = point + m_initialOffset;
63 QPointF snappedPosition = tool()->canvas()->snapGuide()->snap(positionToSnap, modifiers);
64 diff = snappedPosition - m_initialOffset - m_start;
65 }
66
67 moveSelection(diff);
68 m_finalMove = diff;
69}
70
71void ShapeMoveStrategy::moveSelection(const QPointF &diff)
72{
73 Q_ASSERT(m_newPositions.count());
74
76
77 int i = 0;
78 Q_FOREACH (KoShape *shape, m_selectedShapes) {
79 QPointF delta = m_previousPositions.at(i) + diff - shape->absolutePosition(KoFlake::Center);
80 if (shape->parent()) {
81 shape->parent()->model()->proposeMove(shape, delta);
82 }
83 tool()->canvas()->clipToDocument(shape, delta);
84 QPointF newPos(shape->absolutePosition(KoFlake::Center) + delta);
85 m_newPositions[i] = newPos;
86
88 i++;
89 }
90
92}
93
102
103void ShapeMoveStrategy::finishInteraction(Qt::KeyboardModifiers modifiers)
104{
105 Q_UNUSED(modifiers);
106}
107
108void ShapeMoveStrategy::paint(QPainter &painter, const KoViewConverter &converter)
109{
110 Q_UNUSED(painter);
111 Q_UNUSED(converter);
112}
virtual void clipToDocument(const KoShape *shape, QPointF &move) const
KoSnapGuide * snapGuide
const QList< KoShape * > selectedEditableShapes() const
static void bulkShapesUpdate(const UpdatesList &updates)
virtual void proposeMove(KoShape *shape, QPointF &move)
KoShapeContainerModel * model
The undo / redo command for shape moving.
QPointF absolutePosition(KoFlake::AnchorPosition anchor=KoFlake::Center) const
Definition KoShape.cpp:573
KoShapeContainer * parent() const
Definition KoShape.cpp:862
static QList< KoShape * > linearizeSubtree(const QList< KoShape * > &shapes)
Definition KoShape.cpp:1178
void setAbsolutePosition(const QPointF &newPosition, KoFlake::AnchorPosition anchor=KoFlake::Center)
Definition KoShape.cpp:588
void reset()
Resets the snap guide.
QPointF snap(const QPointF &mousePosition, Qt::KeyboardModifiers modifiers)
snaps the mouse position, returns if mouse was snapped
KoCanvasBase * canvas() const
Returns the canvas the tool is working on.
void setStatusText(const QString &statusText)
void paint(QPainter &painter, const KoViewConverter &converter) override
void moveSelection(const QPointF &diff)
QList< QPointF > m_newPositions
ShapeMoveStrategy(KoToolBase *tool, KoSelection *selection, const QPointF &clicked)
QList< QPointF > m_previousPositions
void finishInteraction(Qt::KeyboardModifiers modifiers) override
void handleMouseMove(const QPointF &mouseLocation, Qt::KeyboardModifiers modifiers) override
KUndo2Command * createCommand() override
QList< KoShape * > m_selectedShapes
QPointer< KoCanvasBase > m_canvas
PointType snapToClosestAxis(PointType P)
Definition kis_global.h:199
AnchorPosition
Definition KoFlake.h:85
@ Center
Definition KoFlake.h:90
@ HotPosition
Definition KoFlake.h:102