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#include <kis_tool_utils.h>
35
37
38
39#include "tool_transform_args.h"
44
46
47class QTouchEvent;
55
56
80{
81
82 Q_OBJECT
83
85
86 Q_PROPERTY(double translateX READ translateX WRITE setTranslateX NOTIFY freeTransformChanged)
87 Q_PROPERTY(double translateY READ translateY WRITE setTranslateY NOTIFY freeTransformChanged)
88
89 Q_PROPERTY(double rotateX READ rotateX WRITE setRotateX NOTIFY freeTransformChanged)
90 Q_PROPERTY(double rotateY READ rotateY WRITE setRotateY NOTIFY freeTransformChanged)
91 Q_PROPERTY(double rotateZ READ rotateZ WRITE setRotateZ NOTIFY freeTransformChanged)
92
93 Q_PROPERTY(double scaleX READ scaleX WRITE setScaleX NOTIFY freeTransformChanged)
94 Q_PROPERTY(double scaleY READ scaleY WRITE setScaleY NOTIFY freeTransformChanged)
95
96 Q_PROPERTY(double shearX READ shearX WRITE setShearX NOTIFY freeTransformChanged)
97 Q_PROPERTY(double shearY READ shearY WRITE setShearY NOTIFY freeTransformChanged)
98
102
103
104
105public:
114 Q_ENUMS(TransformToolMode)
115
121 Q_ENUMS(WarpType)
122
124 ~KisToolTransform() override;
125
134 bool wantsAutoScroll() const override {
135 return false;
136 }
137
138 QWidget* createOptionWidget() override;
139
140 void mousePressEvent(KoPointerEvent *e) override;
141 void mouseMoveEvent(KoPointerEvent *e) override;
142 void mouseReleaseEvent(KoPointerEvent *e) override;
143 void beginActionImpl(KoPointerEvent *event, bool usePrimaryAction, KisTool::AlternateAction action);
144 void continueActionImpl(KoPointerEvent *event, bool usePrimaryAction, KisTool::AlternateAction action);
145 void endActionImpl(KoPointerEvent *event, bool usePrimaryAction, KisTool::AlternateAction action);
146 QMenu* popupActionsMenu() override;
147
148 void activatePrimaryAction() override;
149 void deactivatePrimaryAction() override;
150 void beginPrimaryAction(KoPointerEvent *event) override;
151 void continuePrimaryAction(KoPointerEvent *event) override;
152 void endPrimaryAction(KoPointerEvent *event) override;
153
159
160 void paint(QPainter& gc, const KoViewConverter &converter) override;
161
162 void newActivationWithExternalSource(KisPaintDeviceSP externalSource) override;
163
166
167 double translateX() const;
168 double translateY() const;
169
170 double rotateX() const;
171 double rotateY() const;
172 double rotateZ() const;
173
174 double scaleX() const;
175 double scaleY() const;
176
177 double shearX() const;
178 double shearY() const;
179
180 WarpType warpType() const;
181 double warpFlexibility() const;
182 int warpPointDensity() const;
183
185
186public Q_SLOTS:
187 void activate(const QSet<KoShape*> &shapes) override;
188 void deactivate() override;
189 // Applies the current transformation to the original paint device and commits it to the undo stack
190 void applyTransform();
191
193
195
196 void setTranslateX(double translateX);
197 void setTranslateY(double translateY);
198
199 void setRotateX(double rotation);
200 void setRotateY(double rotation);
201 void setRotateZ(double rotation);
202
203 void setScaleX(double scaleX);
204 void setScaleY(double scaleY);
205
206 void setShearX(double shearX);
207 void setShearY(double shearY);
208
209 void setWarpType(WarpType type);
210 void setWarpFlexibility(double flexibility);
211 void setWarpPointDensity(int density);
212
213protected Q_SLOTS:
214 void resetCursorStyle() override;
216
217Q_SIGNALS:
221
222public Q_SLOTS:
223 void requestUndoDuringStroke() override;
224 void requestRedoDuringStroke() override;
225 void requestStrokeEnd() override;
226 void requestStrokeCancellation() override;
228 void cursorOutlineUpdateRequested(const QPointF &imagePos);
229
230 // Update the widget according to m_currentArgs
231 void updateOptionWidget();
232
234 void imageTooBigRequested(bool value);
236 void slotConvexHullCalculated(QPolygon hull, void *strokeStrategyCookie);
237
238private:
239 QScopedPointer<QMenu> m_contextMenu;
240
242 void endStroke();
243 void cancelStroke();
244
245private:
246 void outlineChanged();
247 // Sets the cursor according to mouse position (doesn't take shearing into account well yet)
248 void setFunctionalCursor();
249 // Sets m_function according to mouse position and modifier
250 void setTransformFunction(QPointF mousePos, Qt::KeyboardModifiers modifiers);
251
252 void commitChanges();
253
256
257 void initThumbnailImage(KisPaintDeviceSP previewDevice);
259
260private:
262
263 // Set by newActivationWithExternalSource before starting a new stroke.
264 // The source pixels for the next transform will be read from this device.
266
267 bool m_actuallyMoveWhileSelected {false}; // true <=> selection has been moved while clicked
268
274 bool m_forceLodMode {false};
275
276
277 QPainterPath m_selectionPath; // original (unscaled) selection outline, used for painting decorations
278
281
285
287
297
298 // a few extra context click options if free transform is active
304
305
306
307
313 QRectF m_refRect;
314
315 QScopedPointer<KisWarpTransformStrategy> m_warpStrategy;
316 QScopedPointer<KisCageTransformStrategy> m_cageStrategy;
317 QScopedPointer<KisLiquifyTransformStrategy> m_liquifyStrategy;
318 QScopedPointer<KisMeshTransformStrategy> m_meshStrategy;
319 QScopedPointer<KisFreeTransformStrategy> m_freeStrategy;
320 QScopedPointer<KisPerspectiveTransformStrategy> m_perspectiveStrategy;
322
323 QPainterPath m_cursorOutline;
324
326
328
329private Q_SLOTS:
331 void slotUiChangedConfig(bool needsPreviewRecalculation);
332 void slotApplyTransform();
334 void slotCancelTransform();
337 void slotEditingFinished();
338
339 void slotMoveDiscreteUp();
347
348 void slotTransactionGenerated(TransformTransactionProperties transaction, ToolTransformArgs args, void *strokeStrategyCookie);
350
351 // context menu options for updating the transform type
352 // this is to help with discoverability since come people can't find the tool options
359};
360
362{
363
364 Q_OBJECT
365
366public:
367
369 : KisToolPaintFactoryBase("KisToolTransform") {
370 setToolTip(i18n("Transform a layer or a selection"));
372 setIconName(koIconNameCStr("krita_tool_transform"));
373 setShortcut(QKeySequence(Qt::CTRL + Qt::Key_T));
374 setPriority(2);
376 }
377
379
381 return new KisToolTransform(canvas);
382 }
383
385
386private:
388
389private Q_SLOTS:
390 void activateSubtoolFree();
392 void activateSubtoolWarp();
393 void activateSubtoolCage();
395 void activateSubtoolMesh();
396};
397
398
399
400#endif // KIS_TOOL_TRANSFORM_H_
401
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()
KisToolUtils::MoveShortcutsHelper m_moveShortcutsHelper
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