Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_tool_transform.h
Go to the documentation of this file.
1/*
2 * kis_tool_transform.h - part of Krita
3 *
4 * SPDX-FileCopyrightText: 2004 Boudewijn Rempt <boud@valdyas.org>
5 * SPDX-FileCopyrightText: 2005 C. Boemann <cbo@boemann.dk>
6 * SPDX-FileCopyrightText: 2010 Marc Pegon <pe.marc@free.fr>
7 *
8 * SPDX-License-Identifier: GPL-2.0-or-later
9 */
10
11#ifndef KIS_TOOL_TRANSFORM_H_
12#define KIS_TOOL_TRANSFORM_H_
13
14#include <kis_icon.h>
15
16#include <QPoint>
17#include <QPointF>
18#include <QVector2D>
19#include <QVector3D>
20#include <QButtonGroup>
21#include <QPointer>
22
23#include <QKeySequence>
24
25#include <KoToolFactoryBase.h>
26
27#include <kis_shape_selection.h>
28#include <kis_undo_adapter.h>
29#include <kis_types.h>
31#include <kis_tool.h>
32#include <kis_canvas2.h>
33#include <kis_action.h>
34
36
37
38#include "tool_transform_args.h"
43
45
46class QTouchEvent;
54
55
79{
80
81 Q_OBJECT
82
84
85 Q_PROPERTY(double translateX READ translateX WRITE setTranslateX NOTIFY freeTransformChanged)
86 Q_PROPERTY(double translateY READ translateY WRITE setTranslateY NOTIFY freeTransformChanged)
87
88 Q_PROPERTY(double rotateX READ rotateX WRITE setRotateX NOTIFY freeTransformChanged)
89 Q_PROPERTY(double rotateY READ rotateY WRITE setRotateY NOTIFY freeTransformChanged)
90 Q_PROPERTY(double rotateZ READ rotateZ WRITE setRotateZ NOTIFY freeTransformChanged)
91
92 Q_PROPERTY(double scaleX READ scaleX WRITE setScaleX NOTIFY freeTransformChanged)
93 Q_PROPERTY(double scaleY READ scaleY WRITE setScaleY NOTIFY freeTransformChanged)
94
95 Q_PROPERTY(double shearX READ shearX WRITE setShearX NOTIFY freeTransformChanged)
96 Q_PROPERTY(double shearY READ shearY WRITE setShearY NOTIFY freeTransformChanged)
97
101
102
103
104public:
113 Q_ENUMS(TransformToolMode)
114
120 Q_ENUMS(WarpType)
121
123 ~KisToolTransform() override;
124
133 bool wantsAutoScroll() const override {
134 return false;
135 }
136
137 QWidget* createOptionWidget() override;
138
139 void mousePressEvent(KoPointerEvent *e) override;
140 void mouseMoveEvent(KoPointerEvent *e) override;
141 void mouseReleaseEvent(KoPointerEvent *e) override;
142 void beginActionImpl(KoPointerEvent *event, bool usePrimaryAction, KisTool::AlternateAction action);
143 void continueActionImpl(KoPointerEvent *event, bool usePrimaryAction, KisTool::AlternateAction action);
144 void endActionImpl(KoPointerEvent *event, bool usePrimaryAction, KisTool::AlternateAction action);
145 QMenu* popupActionsMenu() override;
146
147 void activatePrimaryAction() override;
148 void deactivatePrimaryAction() override;
149 void beginPrimaryAction(KoPointerEvent *event) override;
150 void continuePrimaryAction(KoPointerEvent *event) override;
151 void endPrimaryAction(KoPointerEvent *event) override;
152
158
159 void paint(QPainter& gc, const KoViewConverter &converter) override;
160
161 void newActivationWithExternalSource(KisPaintDeviceSP externalSource) override;
162
164
165 double translateX() const;
166 double translateY() const;
167
168 double rotateX() const;
169 double rotateY() const;
170 double rotateZ() const;
171
172 double scaleX() const;
173 double scaleY() const;
174
175 double shearX() const;
176 double shearY() const;
177
178 WarpType warpType() const;
179 double warpFlexibility() const;
180 int warpPointDensity() const;
181
182public Q_SLOTS:
183 void activate(const QSet<KoShape*> &shapes) override;
184 void deactivate() override;
185 // Applies the current transformation to the original paint device and commits it to the undo stack
186 void applyTransform();
187
189
191
192 void setTranslateX(double translateX);
193 void setTranslateY(double translateY);
194
195 void setRotateX(double rotation);
196 void setRotateY(double rotation);
197 void setRotateZ(double rotation);
198
199 void setScaleX(double scaleX);
200 void setScaleY(double scaleY);
201
202 void setShearX(double shearX);
203 void setShearY(double shearY);
204
205 void setWarpType(WarpType type);
206 void setWarpFlexibility(double flexibility);
207 void setWarpPointDensity(int density);
208
209protected Q_SLOTS:
210 void resetCursorStyle() override;
212
213Q_SIGNALS:
217
218public Q_SLOTS:
219 void requestUndoDuringStroke() override;
220 void requestRedoDuringStroke() override;
221 void requestStrokeEnd() override;
222 void requestStrokeCancellation() override;
224 void cursorOutlineUpdateRequested(const QPointF &imagePos);
225
226 // Update the widget according to m_currentArgs
227 void updateOptionWidget();
228
230 void imageTooBigRequested(bool value);
232 void slotConvexHullCalculated(QPolygon hull, void *strokeStrategyCookie);
233
234private:
235 QScopedPointer<QMenu> m_contextMenu;
236
238 void endStroke();
239 void cancelStroke();
240
241private:
242 void outlineChanged();
243 // Sets the cursor according to mouse position (doesn't take shearing into account well yet)
244 void setFunctionalCursor();
245 // Sets m_function according to mouse position and modifier
246 void setTransformFunction(QPointF mousePos, Qt::KeyboardModifiers modifiers);
247
248 void commitChanges();
249
252
253 void initThumbnailImage(KisPaintDeviceSP previewDevice);
255
256private:
258
259 // Set by newActivationWithExternalSource before starting a new stroke.
260 // The source pixels for the next transform will be read from this device.
262
263 bool m_actuallyMoveWhileSelected {false}; // true <=> selection has been moved while clicked
264
270 bool m_forceLodMode {false};
271
272
273 QPainterPath m_selectionPath; // original (unscaled) selection outline, used for painting decorations
274
277
281
282
292
293 // a few extra context click options if free transform is active
299
300
301
302
308 QRectF m_refRect;
309
310 QScopedPointer<KisWarpTransformStrategy> m_warpStrategy;
311 QScopedPointer<KisCageTransformStrategy> m_cageStrategy;
312 QScopedPointer<KisLiquifyTransformStrategy> m_liquifyStrategy;
313 QScopedPointer<KisMeshTransformStrategy> m_meshStrategy;
314 QScopedPointer<KisFreeTransformStrategy> m_freeStrategy;
315 QScopedPointer<KisPerspectiveTransformStrategy> m_perspectiveStrategy;
317
318 QPainterPath m_cursorOutline;
319
321
322private Q_SLOTS:
324 void slotUiChangedConfig(bool needsPreviewRecalculation);
325 void slotApplyTransform();
327 void slotCancelTransform();
330 void slotEditingFinished();
331
332 void slotMoveDiscreteUp();
340
341 void slotTransactionGenerated(TransformTransactionProperties transaction, ToolTransformArgs args, void *strokeStrategyCookie);
343
344 // context menu options for updating the transform type
345 // this is to help with discoverability since come people can't find the tool options
352};
353
355{
356public:
357
359 : KisToolPaintFactoryBase("KisToolTransform") {
360 setToolTip(i18n("Transform a layer or a selection"));
362 setIconName(koIconNameCStr("krita_tool_transform"));
363 setShortcut(QKeySequence(Qt::CTRL + Qt::Key_T));
364 setPriority(2);
366 }
367
369
371 return new KisToolTransform(canvas);
372 }
373
375};
376
377
378
379#endif // KIS_TOOL_TRANSFORM_H_
380
float value(const T *src, size_t ch)
QList< QAction * > createActionsImpl() override
createActionsImpl should be reimplemented if the tool needs any actions. The actions should have a va...
KoToolBase * createTool(KoCanvasBase *canvas) override
void setRotateZ(double rotation)
void requestStrokeEnd() override
void deactivateAlternateAction(AlternateAction action) override
void setWarpType(WarpType type)
KisAction * perspectiveAction
void paint(QPainter &gc, const KoViewConverter &converter) override
KisAction * resetTransformation
void setRotateY(double rotation)
void setScaleX(double scaleX)
void setTranslateY(double translateY)
void mouseReleaseEvent(KoPointerEvent *e) override
KisAction * applyTransformation
KisToolTransformConfigWidget * m_optionsWidget
void mouseMoveEvent(KoPointerEvent *e) override
void slotUiChangedConfig(bool needsPreviewRecalculation)
void beginActionImpl(KoPointerEvent *event, bool usePrimaryAction, KisTool::AlternateAction action)
void endActionImpl(KoPointerEvent *event, bool usePrimaryAction, KisTool::AlternateAction action)
KisToolChangesTracker m_changesTracker
KisAction * keepAspectRatioAction
void initTransformMode(ToolTransformArgs::TransformMode mode)
void warpTransformChanged()
void setShearY(double shearY)
TransformToolMode transformMode
void deactivate() override
void setWarpFlexibility(double flexibility)
QScopedPointer< KisMeshTransformStrategy > m_meshStrategy
void requestUndoDuringStroke() override
void slotTrackerChangedConfig(KisToolChangesTrackerDataSP status)
QScopedPointer< KisFreeTransformStrategy > m_freeStrategy
void freeTransformChanged()
void initThumbnailImage(KisPaintDeviceSP previewDevice)
void setWarpPointDensity(int density)
void activateAlternateAction(AlternateAction action) override
void cursorOutlineUpdateRequested(const QPointF &imagePos)
void imageTooBigRequested(bool value)
void setRotateX(double rotation)
void slotConvexHullCalculated(QPolygon hull, void *strokeStrategyCookie)
void beginPrimaryAction(KoPointerEvent *event) override
void slotPreviewDeviceGenerated(KisPaintDeviceSP device)
QMenu * popupActionsMenu() override
void newActivationWithExternalSource(KisPaintDeviceSP externalSource) override
newActivationWithExternalSource Makes sure that the tool is active and starts a new stroke,...
void requestStrokeCancellation() override
ToolTransformArgs m_currentArgs
QPointer< KisCanvas2 > m_canvas
void activatePrimaryAction() override
QScopedPointer< KisCageTransformStrategy > m_cageStrategy
QScopedPointer< QMenu > m_contextMenu
void setScaleY(double scaleY)
void mousePressEvent(KoPointerEvent *e) override
KisAction * mirrorVerticalAction
void continueAlternateAction(KoPointerEvent *event, AlternateAction action) override
void beginAlternateAction(KoPointerEvent *event, AlternateAction action) override
void continueActionImpl(KoPointerEvent *event, bool usePrimaryAction, KisTool::AlternateAction action)
QPainterPath m_selectionPath
void startStroke(ToolTransformArgs::TransformMode mode, bool forceReset)
QScopedPointer< KisPerspectiveTransformStrategy > m_perspectiveStrategy
QPainterPath m_cursorOutline
KisAction * mirrorHorizontalAction
void setTransformFunction(QPointF mousePos, Qt::KeyboardModifiers modifiers)
KisPaintDeviceSP m_externalSourceForNextActivation
QWidget * createOptionWidget() override
void setTranslateX(double translateX)
KisSignalAutoConnectionsStore m_actionConnections
KisToolTransform(KoCanvasBase *canvas)
void activate(const QSet< KoShape * > &shapes) override
void endAlternateAction(KoPointerEvent *event, AlternateAction action) override
void setTransformMode(KisToolTransform::TransformToolMode newMode)
KisAction * rotateNinetyCWAction
TransformTransactionProperties m_transaction
KisAction * warpAction
actions for the context click menu
void endPrimaryAction(KoPointerEvent *event) override
void resetRotationCenterButtonsRequested()
void transformModeChanged()
void continuePrimaryAction(KoPointerEvent *event) override
void setShearX(double shearX)
KisAction * freeTransformAction
KisAction * rotateNinetyCCWAction
KisPaintDeviceSP m_selectedPortionCache
void slotResetTransform(ToolTransformArgs::TransformMode mode)
void deactivatePrimaryAction() override
bool wantsAutoScroll() const override
wantsAutoScroll reimplemented from KoToolBase there's an issue where autoscrolling with this tool nev...
void slotTransactionGenerated(TransformTransactionProperties transaction, ToolTransformArgs args, void *strokeStrategyCookie)
void resetCursorStyle() override
QScopedPointer< KisWarpTransformStrategy > m_warpStrategy
KisAsynchronousStrokeUpdateHelper m_asyncUpdateHelper
QScopedPointer< KisLiquifyTransformStrategy > m_liquifyStrategy
KisTransformStrategyBase * currentStrategy() const
void requestRedoDuringStroke() override
QAction * action(const QString &name) const
void setShortcut(const QKeySequence &shortcut)
void setSection(const QString &section)
void setActivationShapeId(const QString &activationShapeId)
void setIconName(const char *iconName)
void setToolTip(const QString &tooltip)
void setPriority(int newPriority)
#define koIconNameCStr(name)
Definition kis_icon.h:28
static const QString KRITA_TOOL_ACTIVATION_ID
Definition kis_tool.h:37
static const QString Transform
Tools that transform the layer.
virtual ToolMode mode() const
Definition kis_tool.cc:407
AlternateAction
Definition kis_tool.h:134
KisCanvas2 * canvas