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
165
166 double translateX() const;
167 double translateY() const;
168
169 double rotateX() const;
170 double rotateY() const;
171 double rotateZ() const;
172
173 double scaleX() const;
174 double scaleY() const;
175
176 double shearX() const;
177 double shearY() const;
178
179 WarpType warpType() const;
180 double warpFlexibility() const;
181 int warpPointDensity() const;
182
184
185public Q_SLOTS:
186 void activate(const QSet<KoShape*> &shapes) override;
187 void deactivate() override;
188 // Applies the current transformation to the original paint device and commits it to the undo stack
189 void applyTransform();
190
192
194
195 void setTranslateX(double translateX);
196 void setTranslateY(double translateY);
197
198 void setRotateX(double rotation);
199 void setRotateY(double rotation);
200 void setRotateZ(double rotation);
201
202 void setScaleX(double scaleX);
203 void setScaleY(double scaleY);
204
205 void setShearX(double shearX);
206 void setShearY(double shearY);
207
208 void setWarpType(WarpType type);
209 void setWarpFlexibility(double flexibility);
210 void setWarpPointDensity(int density);
211
212protected Q_SLOTS:
213 void resetCursorStyle() override;
215
216Q_SIGNALS:
220
221public Q_SLOTS:
222 void requestUndoDuringStroke() override;
223 void requestRedoDuringStroke() override;
224 void requestStrokeEnd() override;
225 void requestStrokeCancellation() override;
227 void cursorOutlineUpdateRequested(const QPointF &imagePos);
228
229 // Update the widget according to m_currentArgs
230 void updateOptionWidget();
231
233 void imageTooBigRequested(bool value);
235 void slotConvexHullCalculated(QPolygon hull, void *strokeStrategyCookie);
236
237private:
238 QScopedPointer<QMenu> m_contextMenu;
239
241 void endStroke();
242 void cancelStroke();
243
244private:
245 void outlineChanged();
246 // Sets the cursor according to mouse position (doesn't take shearing into account well yet)
247 void setFunctionalCursor();
248 // Sets m_function according to mouse position and modifier
249 void setTransformFunction(QPointF mousePos, Qt::KeyboardModifiers modifiers);
250
251 void commitChanges();
252
255
256 void initThumbnailImage(KisPaintDeviceSP previewDevice);
258
259private:
261
262 // Set by newActivationWithExternalSource before starting a new stroke.
263 // The source pixels for the next transform will be read from this device.
265
266 bool m_actuallyMoveWhileSelected {false}; // true <=> selection has been moved while clicked
267
273 bool m_forceLodMode {false};
274
275
276 QPainterPath m_selectionPath; // original (unscaled) selection outline, used for painting decorations
277
280
284
286
296
297 // a few extra context click options if free transform is active
303
304
305
306
312 QRectF m_refRect;
313
314 QScopedPointer<KisWarpTransformStrategy> m_warpStrategy;
315 QScopedPointer<KisCageTransformStrategy> m_cageStrategy;
316 QScopedPointer<KisLiquifyTransformStrategy> m_liquifyStrategy;
317 QScopedPointer<KisMeshTransformStrategy> m_meshStrategy;
318 QScopedPointer<KisFreeTransformStrategy> m_freeStrategy;
319 QScopedPointer<KisPerspectiveTransformStrategy> m_perspectiveStrategy;
321
322 QPainterPath m_cursorOutline;
323
325
326private Q_SLOTS:
328 void slotUiChangedConfig(bool needsPreviewRecalculation);
329 void slotApplyTransform();
331 void slotCancelTransform();
334 void slotEditingFinished();
335
336 void slotMoveDiscreteUp();
344
345 void slotTransactionGenerated(TransformTransactionProperties transaction, ToolTransformArgs args, void *strokeStrategyCookie);
347
348 // context menu options for updating the transform type
349 // this is to help with discoverability since come people can't find the tool options
356};
357
359{
360
361 Q_OBJECT
362
363public:
364
366 : KisToolPaintFactoryBase("KisToolTransform") {
367 setToolTip(i18n("Transform a layer or a selection"));
369 setIconName(koIconNameCStr("krita_tool_transform"));
370 setShortcut(QKeySequence(Qt::CTRL + Qt::Key_T));
371 setPriority(2);
373 }
374
376
378 return new KisToolTransform(canvas);
379 }
380
382
383private:
385
386private Q_SLOTS:
387 void activateSubtoolFree();
389 void activateSubtoolWarp();
390 void activateSubtoolCage();
392 void activateSubtoolMesh();
393};
394
395
396
397#endif // KIS_TOOL_TRANSFORM_H_
398
float value(const T *src, size_t ch)
void activateSubtool(KisToolTransform::TransformToolMode mode)
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)
static ToolTransformArgs::TransformMode toArgsMode(KisToolTransform::TransformToolMode toolMode)
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
TransformToolMode nextActivationTransformMode
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)
void setNextActivationTransformMode(TransformToolMode mode)
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