Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_simplified_action_policy_strategy.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2014 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
9#include "KoPointerEvent.h"
10#include <KoSnapGuide.h>
12
13
15{
16 Private(const KisCoordinatesConverter *_converter, KoSnapGuide *_snapGuide)
17 : converter(_converter),
18 snapGuide(_snapGuide),
22
25
29 QPointF dragOffset;
30 QPointF lastImagePos;
31};
32
33
35 : m_d(new Private(_converter, _snapGuide))
36{
37}
38
42
44{
45 return imagePos;
46}
47
48QPointF KisSimplifiedActionPolicyStrategy::snapDocPoint(const QPointF &point, Qt::KeyboardModifiers modifiers) const
49{
50 QPointF pos = point;
51
52 if (m_d->snapGuide) {
53 Qt::KeyboardModifiers modifiersForSnapping = modifiers;
54
55 if (shiftModifierIsUsed()) {
56 modifiersForSnapping.setFlag(Qt::ShiftModifier, false);
57 }
58
59 pos = m_d->snapGuide->snap(point, m_d->dragOffset, modifiersForSnapping);
60 }
61
62 return pos;
63}
64
66{
67 const QPointF rawImagePoint = m_d->converter->documentToImage(event->point);
68 const QPointF snappedImagePoint = handleSnapPoint(rawImagePoint);
69
77 if (m_d->snapGuide && rawImagePoint != snappedImagePoint) {
78 QPointF imageOffset = snappedImagePoint - rawImagePoint;
79 m_d->dragOffset = m_d->converter->imageToDocument(imageOffset);
80 }
81
82 const QPointF pos = snapDocPoint(event->point, event->modifiers());
83
84 QPointF imagePos = m_d->converter->documentToImage(pos);
85 m_d->lastImagePos = imagePos;
86
87 return beginPrimaryAction(imagePos);
88}
89
91{
104 const bool shiftIsActive = event->modifiers() & Qt::ShiftModifier;
105 const bool altIsActive = event->modifiers() & Qt::AltModifier;
106
107 const QPointF pos = snapDocPoint(event->point, event->modifiers());
108 QPointF imagePos = m_d->converter->documentToImage(pos);
109 m_d->lastImagePos = imagePos;
110
111 return continuePrimaryAction(imagePos, shiftIsActive, altIsActive);
112}
113
115{
116 QPointF imagePos = m_d->converter->documentToImage(event->point);
117 m_d->lastImagePos = imagePos;
118
119 hoverActionCommon(imagePos);
120}
121
123{
124 const QPointF pos = snapDocPoint(event->point, event->modifiers());
125 QPointF imagePos = m_d->converter->documentToImage(pos);
126 m_d->lastImagePos = imagePos;
127
128 return endPrimaryAction();
129}
130
132{
133 setTransformFunction(m_d->lastImagePos, m_d->anySamplerModifierActive && !m_d->sampleFromNodeModifierActive, m_d->changeSizeModifierActive, m_d->sampleFromNodeModifierActive);
134}
135
137{
138 if (action == KisTool::ChangeSize) {
139 m_d->changeSizeModifierActive = true;
140 } else if (action == KisTool::SampleFgNode || action == KisTool::SampleBgNode) {
141 m_d->anySamplerModifierActive = true;
142 m_d->sampleFromNodeModifierActive = true;
143 } else if (action == KisTool::SampleFgImage || action == KisTool::SampleBgImage) {
144 m_d->anySamplerModifierActive = true;
145 m_d->sampleFromNodeModifierActive = false;
146 }
147
148 setTransformFunction(m_d->lastImagePos, m_d->anySamplerModifierActive && !m_d->sampleFromNodeModifierActive, m_d->changeSizeModifierActive, m_d->sampleFromNodeModifierActive);
149}
150
152{
153 if (action == KisTool::ChangeSize) {
154 m_d->changeSizeModifierActive = false;
155 } else if (action == KisTool::SampleFgNode || action == KisTool::SampleBgNode ||
156 action == KisTool::SampleFgImage || action == KisTool::SampleBgImage) {
157
158 m_d->anySamplerModifierActive = false;
159 m_d->sampleFromNodeModifierActive = false;
160 }
161}
162
164{
165 Q_UNUSED(action);
166
167 if (!m_d->changeSizeModifierActive && !m_d->anySamplerModifierActive) return false;
168
169 const QPointF pos = snapDocPoint(event->point, event->modifiers());
170 QPointF imagePos = m_d->converter->documentToImage(pos);
171 m_d->lastImagePos = imagePos;
172
173 return beginPrimaryAction(imagePos);
174}
175
177{
178 Q_UNUSED(action);
179
180 if (!m_d->changeSizeModifierActive && !m_d->anySamplerModifierActive) return;
181 const bool altIsActive = event->modifiers() & Qt::AltModifier;
182
183 const QPointF pos = snapDocPoint(event->point, event->modifiers());
184 QPointF imagePos = m_d->converter->documentToImage(pos);
185 m_d->lastImagePos = imagePos;
186
187 continuePrimaryAction(imagePos, m_d->changeSizeModifierActive, altIsActive);
188}
189
191{
192 Q_UNUSED(action);
193
194 if (!m_d->changeSizeModifierActive && !m_d->anySamplerModifierActive) return false;
195
196 const QPointF pos = snapDocPoint(event->point, event->modifiers());
197 QPointF imagePos = m_d->converter->documentToImage(pos);
198 m_d->lastImagePos = imagePos;
199
200 return endPrimaryAction();
201}
202
204{
205 return false;
206}
207
209{
210 setTransformFunction(pt, m_d->anySamplerModifierActive && !m_d->sampleFromNodeModifierActive, m_d->changeSizeModifierActive, m_d->sampleFromNodeModifierActive);
211}
212
void deactivateAlternateAction(KisTool::AlternateAction action) override
void continueAlternateAction(KoPointerEvent *event, KisTool::AlternateAction action) override
virtual void setTransformFunction(const QPointF &mousePos, bool perspectiveModifierActive, bool shiftModifierActive, bool altModifierActive)=0
virtual QPointF handleSnapPoint(const QPointF &imagePos)
bool beginPrimaryAction(KoPointerEvent *event) override
void activateAlternateAction(KisTool::AlternateAction action) override
bool beginAlternateAction(KoPointerEvent *event, KisTool::AlternateAction action) override
bool endAlternateAction(KoPointerEvent *event, KisTool::AlternateAction action) override
void continuePrimaryAction(KoPointerEvent *event) override
void hoverActionCommon(KoPointerEvent *event) override
QPointF snapDocPoint(const QPointF &point, Qt::KeyboardModifiers modifiers) const
KisSimplifiedActionPolicyStrategy(const KisCoordinatesConverter *_converter, KoSnapGuide *snapGuide=0)
Qt::KeyboardModifiers modifiers() const
QPointF point
The point in document coordinates.
Private(const KisCoordinatesConverter *_converter, KoSnapGuide *_snapGuide)
AlternateAction
Definition kis_tool.h:134
@ SampleFgImage
Definition kis_tool.h:139
@ SampleFgNode
Definition kis_tool.h:137
@ SampleBgImage
Definition kis_tool.h:140
@ SampleBgNode
Definition kis_tool.h:138
@ ChangeSize
Definition kis_tool.h:135