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 Qt::KeyboardModifiers modifiersAtStart;
30 QPointF dragOffset;
31 QPointF lastImagePos;
32};
33
34
36 : m_d(new Private(_converter, _snapGuide))
37{
38}
39
43
45{
46 return imagePos;
47}
48
49QPointF KisSimplifiedActionPolicyStrategy::snapDocPoint(const QPointF &point, Qt::KeyboardModifiers modifiers) const
51 QPointF pos = point;
52
53 if (m_d->snapGuide) {
54 Qt::KeyboardModifiers modifiersForSnapping = modifiers;
55
56 if (shiftModifierIsUsed()) {
57 modifiersForSnapping.setFlag(Qt::ShiftModifier, false);
58 }
59
60 pos = m_d->snapGuide->snap(point, m_d->dragOffset, modifiersForSnapping);
61 }
62
63 return pos;
64}
65
67{
68 const QPointF rawImagePoint = m_d->converter->documentToImage(event->point);
69 const QPointF snappedImagePoint = handleSnapPoint(rawImagePoint);
70
78 if (m_d->snapGuide && rawImagePoint != snappedImagePoint) {
79 QPointF imageOffset = snappedImagePoint - rawImagePoint;
80 m_d->dragOffset = m_d->converter->imageToDocument(imageOffset);
81 }
82
83 const QPointF pos = snapDocPoint(event->point, event->modifiers());
84
85 QPointF imagePos = m_d->converter->documentToImage(pos);
86 m_d->lastImagePos = imagePos;
87
88 m_d->modifiersAtStart = event->modifiers();
89
90 return beginPrimaryAction(imagePos);
91}
92
94{
107 const bool shiftIsActive = event->modifiers() & Qt::ShiftModifier;
108 const bool altIsActive = event->modifiers() & Qt::AltModifier;
109
110 const QPointF pos = snapDocPoint(event->point, event->modifiers());
111 QPointF imagePos = m_d->converter->documentToImage(pos);
112 m_d->lastImagePos = imagePos;
113
114 continuePrimaryAction(imagePos, shiftIsActive, altIsActive, m_d->modifiersAtStart == event->modifiers());
115}
116
117void KisSimplifiedActionPolicyStrategy::continuePrimaryAction(const QPointF &imagePos, bool shiftModifierActive, bool altModifierActive, bool hasOriginalModifiersSet)
118{
119 Q_UNUSED(hasOriginalModifiersSet);
120 continuePrimaryAction(imagePos, shiftModifierActive, altModifierActive);
121}
122
124{
125 QPointF imagePos = m_d->converter->documentToImage(event->point);
126 m_d->lastImagePos = imagePos;
127
128 hoverActionCommon(imagePos);
129}
130
132{
133 const QPointF pos = snapDocPoint(event->point, event->modifiers());
134 QPointF imagePos = m_d->converter->documentToImage(pos);
135 m_d->lastImagePos = imagePos;
136
137 return endPrimaryAction();
138}
139
141{
142 setTransformFunction(m_d->lastImagePos, m_d->anySamplerModifierActive && !m_d->sampleFromNodeModifierActive, m_d->changeSizeModifierActive, m_d->sampleFromNodeModifierActive);
143}
144
146{
147 if (action == KisTool::ChangeSize) {
148 m_d->changeSizeModifierActive = true;
149 } else if (action == KisTool::SampleFgNode || action == KisTool::SampleBgNode) {
150 m_d->anySamplerModifierActive = true;
151 m_d->sampleFromNodeModifierActive = true;
152 } else if (action == KisTool::SampleFgImage || action == KisTool::SampleBgImage) {
153 m_d->anySamplerModifierActive = true;
154 m_d->sampleFromNodeModifierActive = false;
155 }
156
157 setTransformFunction(m_d->lastImagePos, m_d->anySamplerModifierActive && !m_d->sampleFromNodeModifierActive, m_d->changeSizeModifierActive, m_d->sampleFromNodeModifierActive);
158}
159
161{
162 if (action == KisTool::ChangeSize) {
163 m_d->changeSizeModifierActive = false;
164 } else if (action == KisTool::SampleFgNode || action == KisTool::SampleBgNode ||
165 action == KisTool::SampleFgImage || action == KisTool::SampleBgImage) {
166
167 m_d->anySamplerModifierActive = false;
168 m_d->sampleFromNodeModifierActive = false;
169 }
170}
171
173{
174 Q_UNUSED(action);
175
176 if (!m_d->changeSizeModifierActive && !m_d->anySamplerModifierActive) return false;
177
178 const QPointF pos = snapDocPoint(event->point, event->modifiers());
179 QPointF imagePos = m_d->converter->documentToImage(pos);
180 m_d->lastImagePos = imagePos;
181
182 m_d->modifiersAtStart = event->modifiers();
183
184 return beginPrimaryAction(imagePos);
185}
186
188{
189 Q_UNUSED(action);
190
191 if (!m_d->changeSizeModifierActive && !m_d->anySamplerModifierActive) return;
192 const bool altIsActive = event->modifiers() & Qt::AltModifier;
193
194 const QPointF pos = snapDocPoint(event->point, event->modifiers());
195 QPointF imagePos = m_d->converter->documentToImage(pos);
196 m_d->lastImagePos = imagePos;
197
198 continuePrimaryAction(imagePos, m_d->changeSizeModifierActive, altIsActive, m_d->modifiersAtStart == event->modifiers());
199}
200
202{
203 Q_UNUSED(action);
204
205 if (!m_d->changeSizeModifierActive && !m_d->anySamplerModifierActive) return false;
206
207 const QPointF pos = snapDocPoint(event->point, event->modifiers());
208 QPointF imagePos = m_d->converter->documentToImage(pos);
209 m_d->lastImagePos = imagePos;
210
211 return endPrimaryAction();
212}
213
215{
216 return false;
217}
218
220{
221 setTransformFunction(pt, m_d->anySamplerModifierActive && !m_d->sampleFromNodeModifierActive, m_d->changeSizeModifierActive, m_d->sampleFromNodeModifierActive);
222}
223
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