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>
18#include <KoSnapGuide.h>
19#include <KoPointerEvent.h>
20#include <KoToolBase.h>
21#include <KoSelection.h>
22#include <klocalizedstring.h>
23#include <kis_global.h>
24
25#include "kis_debug.h"
26
27ShapeMoveStrategy::ShapeMoveStrategy(KoToolBase *tool, KoSelection *selection, const QPointF &clicked)
29 , m_start(clicked)
30 , m_canvas(tool->canvas())
31{
32 QList<KoShape *> selectedShapes = selection->selectedEditableShapes();
33
34 Q_FOREACH (KoShape *shape, selectedShapes) {
35 m_selectedShapes << shape;
36 m_previousPositions << shape->absolutePosition(KoFlake::Center);
37 m_newPositions << shape->absolutePosition(KoFlake::Center);
38 }
39
42 m_canvas->resourceManager()->resource(KoFlake::HotPosition).toInt());
43
44 m_initialOffset = selection->absolutePosition(anchor) - m_start;
45 m_canvas->snapGuide()->setIgnoredShapes(KoShape::linearizeSubtree(m_selectedShapes));
46
47 tool->setStatusText(i18n("Press Shift to hold x- or y-position."));
48}
49
50void ShapeMoveStrategy::handleMouseMove(const QPointF &point, Qt::KeyboardModifiers modifiers)
51{
52 if (m_selectedShapes.isEmpty()) {
53 return;
54 }
55 QPointF diff = point - m_start;
56
57 if (modifiers & Qt::ShiftModifier) {
58 // Limit change to one direction only
59 diff = snapToClosestAxis(diff);
60 } else {
61 QPointF positionToSnap = point + m_initialOffset;
62 QPointF snappedPosition = tool()->canvas()->snapGuide()->snap(positionToSnap, modifiers);
63 diff = snappedPosition - m_initialOffset - m_start;
64 }
65
66 moveSelection(diff);
67 m_finalMove = diff;
68}
69
70void ShapeMoveStrategy::moveSelection(const QPointF &diff)
71{
72 Q_ASSERT(m_newPositions.count());
73
74 int i = 0;
75 Q_FOREACH (KoShape *shape, m_selectedShapes) {
76 QPointF delta = m_previousPositions.at(i) + diff - shape->absolutePosition(KoFlake::Center);
77 if (shape->parent()) {
78 shape->parent()->model()->proposeMove(shape, delta);
79 }
80 tool()->canvas()->clipToDocument(shape, delta);
81 QPointF newPos(shape->absolutePosition(KoFlake::Center) + delta);
82 m_newPositions[i] = newPos;
83
84 const QRectF oldDirtyRect = shape->boundingRect();
86 shape->updateAbsolute(oldDirtyRect | oldDirtyRect.translated(delta));
87 i++;
88 }
89}
90
99
100void ShapeMoveStrategy::finishInteraction(Qt::KeyboardModifiers modifiers)
101{
102 Q_UNUSED(modifiers);
103}
104
105void ShapeMoveStrategy::paint(QPainter &painter, const KoViewConverter &converter)
106{
107 Q_UNUSED(painter);
108 Q_UNUSED(converter);
109}
virtual void clipToDocument(const KoShape *shape, QPointF &move) const
KoSnapGuide * snapGuide
const QList< KoShape * > selectedEditableShapes() const
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:653
virtual QRectF boundingRect() const
Get the bounding box of the shape.
Definition KoShape.cpp:335
KoShapeContainer * parent() const
Definition KoShape.cpp:1039
static QList< KoShape * > linearizeSubtree(const QList< KoShape * > &shapes)
Definition KoShape.cpp:1381
virtual void updateAbsolute(const QRectF &rect) const
Definition KoShape.cpp:616
void setAbsolutePosition(const QPointF &newPosition, KoFlake::AnchorPosition anchor=KoFlake::Center)
Definition KoShape.cpp:668
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