Krita Source Code Documentation
Loading...
Searching...
No Matches
KisRotateCanvasAction Class Reference

Rotate Canvas implementation of KisAbstractInputAction. More...

#include <kis_rotate_canvas_action.h>

+ Inheritance diagram for KisRotateCanvasAction:

Classes

class  Private
 

Public Types

enum  Shortcut {
  RotateModeShortcut , DiscreteRotateModeShortcut , RotateLeftShortcut , RotateRightShortcut ,
  RotateResetShortcut
}
 

Public Member Functions

void activate (int shortcut) override
 
void begin (int shortcut, QEvent *event) override
 
void cursorMovedAbsolute (const QPointF &startPos, const QPointF &pos) override
 
void deactivate (int shortcut) override
 
void end (QEvent *event) override
 
KisInputActionGroup inputActionGroup (int shortcut) const override
 
void inputEvent (QEvent *event) override
 
 KisRotateCanvasAction ()
 
int priority () const override
 
bool supportsHiResInputEvents (int shortcut) const override
 
 ~KisRotateCanvasAction () override
 
- Public Member Functions inherited from KisAbstractInputAction
virtual bool canIgnoreModifiers () const
 
virtual QString description () const
 
virtual QString id () const
 
virtual bool isAvailable () const
 
virtual bool isShortcutRequired (int shortcut) const
 
 KisAbstractInputAction (const QString &id)
 
virtual QString name () const
 
virtual QHash< QString, int > shortcutIndexes () const
 
virtual bool trySwitchShortcut (int oldShortcut, int newShortcut)
 
virtual ~KisAbstractInputAction ()
 

Private Attributes

Private *const d {nullptr}
 

Additional Inherited Members

- Public Attributes inherited from KisAbstractInputAction
QString description
 
QString id
 
QHash< QString, int > indexes
 
QPointF lastCursorPosition
 
QString name
 
QPointF startCursorPosition
 
- Static Public Attributes inherited from KisAbstractInputAction
static KisInputManager * inputManager
 
- Protected Member Functions inherited from KisAbstractInputAction
virtual void cursorMoved (const QPointF &lastPos, const QPointF &pos)
 
QPoint eventPos (const QEvent *event)
 
QPointF eventPosF (const QEvent *event)
 
KisInputManager * inputManager () const
 
void setDescription (const QString &description)
 
void setName (const QString &name)
 
void setShortcutIndexes (const QHash< QString, int > &indexes)
 

Detailed Description

Rotate Canvas implementation of KisAbstractInputAction.

The Rotate Canvas action rotates the canvas.

Definition at line 18 of file kis_rotate_canvas_action.h.

Member Enumeration Documentation

◆ Shortcut

The different behaviours for this action.

Enumerator
RotateModeShortcut 

Toggle Rotate mode.

DiscreteRotateModeShortcut 

Toggle Discrete Rotate mode.

RotateLeftShortcut 

Rotate left by a fixed amount.

RotateRightShortcut 

Rotate right by a fixed amount.

RotateResetShortcut 

Reset the rotation to 0.

Definition at line 25 of file kis_rotate_canvas_action.h.

25 {
31 };
@ RotateLeftShortcut
Rotate left by a fixed amount.
@ RotateResetShortcut
Reset the rotation to 0.
@ DiscreteRotateModeShortcut
Toggle Discrete Rotate mode.
@ RotateRightShortcut
Rotate right by a fixed amount.
@ RotateModeShortcut
Toggle Rotate mode.

Constructor & Destructor Documentation

◆ KisRotateCanvasAction()

KisRotateCanvasAction::KisRotateCanvasAction ( )
explicit

Definition at line 41 of file kis_rotate_canvas_action.cpp.

42 : KisAbstractInputAction("Rotate Canvas")
43 , d(new Private())
44{
45 setName(i18n("Rotate Canvas"));
46 setDescription(i18n("The <i>Rotate Canvas</i> action rotates the canvas."));
47
48 QHash<QString, int> shortcuts;
49 shortcuts.insert(i18n("Rotate Mode"), RotateModeShortcut);
50 shortcuts.insert(i18n("Discrete Rotate Mode"), DiscreteRotateModeShortcut);
51 shortcuts.insert(i18n("Rotate Left"), RotateLeftShortcut);
52 shortcuts.insert(i18n("Rotate Right"), RotateRightShortcut);
53 shortcuts.insert(i18n("Reset Rotation"), RotateResetShortcut);
54 setShortcutIndexes(shortcuts);
55}
KisAbstractInputAction(const QString &id)
void setShortcutIndexes(const QHash< QString, int > &indexes)
void setName(const QString &name)
void setDescription(const QString &description)

References DiscreteRotateModeShortcut, RotateLeftShortcut, RotateModeShortcut, RotateResetShortcut, RotateRightShortcut, KisAbstractInputAction::setDescription(), KisAbstractInputAction::setName(), and KisAbstractInputAction::setShortcutIndexes().

◆ ~KisRotateCanvasAction()

KisRotateCanvasAction::~KisRotateCanvasAction ( )
override

Definition at line 57 of file kis_rotate_canvas_action.cpp.

58{
59 delete d;
60}

References d.

Member Function Documentation

◆ activate()

void KisRotateCanvasAction::activate ( int shortcut)
overridevirtual

The method is called when the action is yet to be started, that is, e.g. the user has pressed all the modifiers for the action but hasn't started painting yet. This method is a right place to show the user what is going to happen, e.g. change the cursor.

Reimplemented from KisAbstractInputAction.

Definition at line 67 of file kis_rotate_canvas_action.cpp.

68{
69 if (shortcut == DiscreteRotateModeShortcut) {
70 QApplication::setOverrideCursor(KisCursor::rotateCanvasDiscreteCursor());
71 } else /* if (shortcut == SmoothRotateModeShortcut) */ {
72 QApplication::setOverrideCursor(KisCursor::rotateCanvasSmoothCursor());
73 }
74}
static QCursor rotateCanvasDiscreteCursor()
static QCursor rotateCanvasSmoothCursor()

References DiscreteRotateModeShortcut, KisCursor::rotateCanvasDiscreteCursor(), and KisCursor::rotateCanvasSmoothCursor().

◆ begin()

void KisRotateCanvasAction::begin ( int shortcut,
QEvent * event )
overridevirtual

Begin the action.

Parameters
shortcutThe index of the behaviour to trigger.
eventThe mouse event that has triggered this action. Is null for keyboard-activated actions.

Reimplemented from KisAbstractInputAction.

Definition at line 82 of file kis_rotate_canvas_action.cpp.

83{
84 KisAbstractInputAction::begin(shortcut, event);
85
86 KisCanvasController *canvasController =
88 KIS_SAFE_ASSERT_RECOVER_RETURN(canvasController);
89
90 if (event
91 && (event->type() == QEvent::NativeGesture || event->type() == QEvent::TouchBegin
92 || event->type() == QEvent::TouchUpdate)
93 && (shortcut == RotateModeShortcut || shortcut == DiscreteRotateModeShortcut)) {
94
96 using Flags = KisCanvasNavigationActionStrategyNativeGesture::Flags;
97
98 Flags flags;
99 flags.setFlag(Flag::PanEnabled);
100 flags.setFlag(Flag::RotationEnabled);
101 flags.setFlag(Flag::RotationDescrete, shortcut == DiscreteRotateModeShortcut);
102
103 if (event->type() == QEvent::NativeGesture) {
105 } else {
106 const QTouchEvent *tevent = static_cast<const QTouchEvent*>(event);
108 }
109
110 // native gestures don't have cursor tracking by the OS, so they shouldn't show any cursor
111 QApplication::restoreOverrideCursor();
112 return;
113 }
114
115 d->allowRotation = false;
116 d->snapRotation = 0;
117
118 d->mode = (Shortcut)shortcut;
119
120 switch(shortcut) {
123 // If the canvas has been rotated to an angle that is not an exact multiple of DISCRETE_ANGLE_STEP,
124 // we need to adjust the final discrete rotation by that angle difference.
125 // trunc() is used to round the negative numbers towards zero.
126 const qreal startRotation = inputManager()->canvas()->rotationAngle();
127 d->snapRotation = startRotation - std::trunc(startRotation / DISCRETE_ANGLE_STEP) * DISCRETE_ANGLE_STEP;
128 canvasController->beginCanvasRotation();
129 break;
130 }
132 canvasController->rotateCanvasLeft15();
133 break;
135 canvasController->rotateCanvasRight15();
136 break;
138 canvasController->resetCanvasRotation();
139 break;
140 }
141}
static KisInputManager * inputManager
QPointF eventPosF(const QEvent *event)
virtual void begin(int shortcut, QEvent *event)
qreal rotationAngle() const
canvas rotation in degrees
KisCanvas2 * canvas() const
std::unique_ptr< KisCanvasNavigationActionStrategy > actionStrategy
KoCanvasController * canvasController() const
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
constexpr qreal DISCRETE_ANGLE_STEP
KisCanvas2 * canvas

References KisRotateCanvasAction::Private::actionStrategy, KisRotateCanvasAction::Private::allowRotation, KisAbstractInputAction::begin(), KisCanvasController::beginCanvasRotation(), Private::canvas, KisInputManager::canvas(), KoCanvasBase::canvasController(), d, DISCRETE_ANGLE_STEP, DiscreteRotateModeShortcut, KisAbstractInputAction::eventPosF(), KisAbstractInputAction::inputManager, KIS_SAFE_ASSERT_RECOVER_RETURN, KisRotateCanvasAction::Private::mode, KisCanvasController::resetCanvasRotation(), KisCanvasController::rotateCanvasLeft15(), KisCanvasController::rotateCanvasRight15(), RotateLeftShortcut, RotateModeShortcut, RotateResetShortcut, RotateRightShortcut, KisCanvas2::rotationAngle(), and KisRotateCanvasAction::Private::snapRotation.

◆ cursorMovedAbsolute()

void KisRotateCanvasAction::cursorMovedAbsolute ( const QPointF & startPos,
const QPointF & pos )
overridevirtual

Reimplemented from KisAbstractInputAction.

Definition at line 165 of file kis_rotate_canvas_action.cpp.

166{
167 if (d->mode == RotateResetShortcut) {
168 return;
169 }
170
172 const QPointF centerPoint = converter->flakeToWidget(converter->flakeCenterPoint());
173 const QPointF startPoint = startPos - centerPoint;
174 const QPointF newPoint = pos - centerPoint;
175
176 const qreal oldAngle = atan2(startPoint.y(), startPoint.x());
177 const qreal newAngle = atan2(newPoint.y(), newPoint.x());
178
179 qreal newRotation = (180 / M_PI) * (newAngle - oldAngle);
180
182 // Do not snap unless the user rotated half-way in the desired direction.
183 if (qAbs(newRotation) > 0.5 * DISCRETE_ANGLE_STEP || d->allowRotation) {
184 d->allowRotation = true;
185 newRotation = qRound((newRotation + d->snapRotation) / DISCRETE_ANGLE_STEP) * DISCRETE_ANGLE_STEP - d->snapRotation;
186 } else {
187 newRotation = 0.0;
188 }
189 }
190
191 KisCanvasController *canvasController =
193 KIS_SAFE_ASSERT_RECOVER_RETURN(canvasController);
194 canvasController->rotateCanvas(newRotation);
195}
KisCoordinatesConverter * coordinatesConverter
void rotateCanvas(qreal angle, const std::optional< KoViewTransformStillPoint > &stillPoint, bool isNativeGesture=false)
_Private::Traits< T >::Result flakeToWidget(const T &obj) const
#define M_PI
Definition kis_global.h:111
KRITAIMAGE_EXPORT qreal atan2(qreal y, qreal x)
atan2 replacement

References KisRotateCanvasAction::Private::allowRotation, KisInputManager::canvas(), KoCanvasBase::canvasController(), KisCanvas2::coordinatesConverter, d, DISCRETE_ANGLE_STEP, DiscreteRotateModeShortcut, KisCoordinatesConverter::flakeCenterPoint(), KisCoordinatesConverter::flakeToWidget(), KisAbstractInputAction::inputManager, KIS_SAFE_ASSERT_RECOVER_RETURN, M_PI, KisRotateCanvasAction::Private::mode, KisCanvasController::rotateCanvas(), RotateResetShortcut, and KisRotateCanvasAction::Private::snapRotation.

◆ deactivate()

void KisRotateCanvasAction::deactivate ( int shortcut)
overridevirtual

The method is called when the action is not a candidate for the starting anymore. The action should revert everything that was done in activate() method.

See also
activate()

Reimplemented from KisAbstractInputAction.

Definition at line 76 of file kis_rotate_canvas_action.cpp.

77{
78 Q_UNUSED(shortcut);
79 QApplication::restoreOverrideCursor();
80}

◆ end()

void KisRotateCanvasAction::end ( QEvent * event)
overridevirtual

End the action.

Parameters
eventThe mouse event that has finished this action. Is null for keyboard-activated actions.

Reimplemented from KisAbstractInputAction.

Definition at line 143 of file kis_rotate_canvas_action.cpp.

144{
145 Q_UNUSED(event);
146
147 if (d->actionStrategy) {
148 d->actionStrategy.reset();
149 } else {
150 KisCanvasController *canvasController =
152 KIS_SAFE_ASSERT_RECOVER_RETURN(canvasController);
153
154 switch (d->mode) {
157 canvasController->endCanvasRotation();
158 break;
159 default:
160 break;
161 }
162 }
163}

References KisRotateCanvasAction::Private::actionStrategy, KisInputManager::canvas(), KoCanvasBase::canvasController(), d, DiscreteRotateModeShortcut, KisCanvasController::endCanvasRotation(), KisAbstractInputAction::inputManager, KIS_SAFE_ASSERT_RECOVER_RETURN, KisRotateCanvasAction::Private::mode, and RotateModeShortcut.

◆ inputActionGroup()

KisInputActionGroup KisRotateCanvasAction::inputActionGroup ( int shortcut) const
overridevirtual
Returns
the group of the action the specified shortcut belongs to

Reimplemented from KisAbstractInputAction.

Definition at line 210 of file kis_rotate_canvas_action.cpp.

211{
212 Q_UNUSED(shortcut);
214}
@ ViewTransformActionGroup

References ViewTransformActionGroup.

◆ inputEvent()

void KisRotateCanvasAction::inputEvent ( QEvent * event)
overridevirtual

Process an input event.

By default handles MouseMove events and passes the data to a convenience cursorMoved() method

Parameters
eventAn event to process.

Reimplemented from KisAbstractInputAction.

Definition at line 197 of file kis_rotate_canvas_action.cpp.

198{
199 if(!event) {
200 return;
201 }
202
203 if (d->actionStrategy && d->actionStrategy->supportsEvent(event)) {
204 d->actionStrategy->inputEvent(event);
205 } else {
207 }
208}
virtual void inputEvent(QEvent *event)

References KisRotateCanvasAction::Private::actionStrategy, d, and KisAbstractInputAction::inputEvent().

◆ priority()

int KisRotateCanvasAction::priority ( ) const
overridevirtual

The priority for this action.

Priority determines how "important" the action is and is used to resolve conflicts when multiple actions can be activated.

Reimplemented from KisAbstractInputAction.

Definition at line 62 of file kis_rotate_canvas_action.cpp.

63{
64 return 3;
65}

◆ supportsHiResInputEvents()

bool KisRotateCanvasAction::supportsHiResInputEvents ( int shortcut) const
overridevirtual

Returns true if the action can handle HiRes flow of move events which is generated by the tablet. If the function returns false, some of the events will be dropped or postponed. For most of the actions in Krita (except of real painting) it is perfectly acceptable, so 'false' is the default value.

Reimplemented from KisAbstractInputAction.

Definition at line 216 of file kis_rotate_canvas_action.cpp.

217{
218 Q_UNUSED(shortcut);
219 return true;
220}

Member Data Documentation

◆ d

Private* const KisRotateCanvasAction::d {nullptr}
private

Definition at line 49 of file kis_rotate_canvas_action.h.

49{nullptr};

The documentation for this class was generated from the following files: