Krita Source Code Documentation
Loading...
Searching...
No Matches
KisDynamicDelegatedTool.h
Go to the documentation of this file.
1/*
2 * KDE. Krita Project.
3 *
4 * SPDX-FileCopyrightText: 2021 Deif Lou <ginoba@gmail.com>
5 *
6 * SPDX-License-Identifier: GPL-2.0-or-later
7 */
8
9#ifndef KISDYNAMICDELEGATEDTOOL_H
10#define KISDYNAMICDELEGATEDTOOL_H
11
12#include <functional>
13#include <type_traits>
14
15#include <KoToolBase.h>
16#include <KoToolBase_p.h>
17#include <KoToolFactoryBase.h>
18#include <KoCanvasBase.h>
19#include <KoPointerEvent.h>
22#include <KoViewConverter.h>
23#include <KoShapeController.h>
25#include <KoToolSelection.h>
26#include <KoCanvasController.h>
27
28template <typename BaseClass>
29class KisDynamicDelegateTool : public BaseClass
30{
31public:
32 template <typename ... Args>
33 explicit KisDynamicDelegateTool(Args ... args) : BaseClass(args...) {}
38
39 using BaseClass::createOptionWidget;
40 using BaseClass::listeningToModifiers;
41 using BaseClass::listenToModifiers;
42 using BaseClass::cursor;
43 using BaseClass::setMode;
44 using BaseClass::mode;
45 using BaseClass::setCursor;
46 using BaseClass::resetCursorStyle;
47 using BaseClass::canvasResourceChanged;
48 using BaseClass::paint;
49 using BaseClass::activatePrimaryAction;
50 using BaseClass::deactivatePrimaryAction;
51 using BaseClass::activateAlternateAction;
52 using BaseClass::deactivateAlternateAction;
53 using BaseClass::beginAlternateAction;
54 using BaseClass::continueAlternateAction;
55 using BaseClass::endAlternateAction;
56 using BaseClass::requestUpdateOutline;
57 using BaseClass::getOutlinePath;
58};
59
60template <typename BaseClass>
61class KisDynamicDelegatedTool : public BaseClass
62{
63public:
65
66 explicit KisDynamicDelegatedTool(KoCanvasBase *canvas, const QCursor &cursor)
67 : BaseClass(canvas, cursor)
68 , m_delegateTool(nullptr)
69 {}
70
74
76 {
77 if (m_delegateTool) {
78 delete m_delegateTool;
79 }
80 }
81
83 {
84 return m_delegateTool;
85 }
86
87 void setDelegateTool(DelegateType *newDelegateTool)
88 {
89 if (m_delegateTool == newDelegateTool) {
90 return;
91 }
92 if (m_delegateTool) {
93 delete m_delegateTool;
94 }
95 m_delegateTool = newDelegateTool;
96 if (m_delegateTool) {
97 BaseClass::connect(m_delegateTool, SIGNAL(activateTool(QString)), SIGNAL(activateTool(QString)));
98 BaseClass::connect(m_delegateTool, &DelegateType::cursorChanged, [this](const QCursor &c) { this->BaseClass::useCursor(c); });
99 BaseClass::connect(m_delegateTool, SIGNAL(selectionChanged(bool)), SIGNAL(selectionChanged(bool)));
100 BaseClass::connect(m_delegateTool, SIGNAL(statusTextChanged(QString)), SIGNAL(statusTextChanged(QString)));
101 }
102 }
103
104 QRectF decorationsRect() const override
105 {
106 if (m_delegateTool) return m_delegateTool->decorationsRect();
107 return QRect();
108 }
109
110 bool wantsAutoScroll() const override
111 {
112 if (m_delegateTool) return m_delegateTool->wantsAutoScroll();
113 return false;
114 }
115
116 void paint(QPainter &painter, const KoViewConverter &converter) override
117 {
118 if (m_delegateTool) m_delegateTool->paint(painter, converter);
119 }
120
121 void mousePressEvent(KoPointerEvent *event) override
122 {
123 if (m_delegateTool) m_delegateTool->mousePressEvent(event);
124 }
125
127 {
128 if (m_delegateTool) m_delegateTool->mouseDoubleClickEvent(event);
129 }
130
132 {
133 if (m_delegateTool) m_delegateTool->mouseTripleClickEvent(event);
134 }
135
136 void mouseMoveEvent(KoPointerEvent *event) override
137 {
138 if (m_delegateTool) m_delegateTool->mouseMoveEvent(event);
139 }
140
141 void mouseReleaseEvent(KoPointerEvent *event) override
142 {
143 if (m_delegateTool) m_delegateTool->mouseReleaseEvent(event);
144 }
145
146 void keyPressEvent(QKeyEvent *event) override
147 {
148 if (m_delegateTool) m_delegateTool->keyPressEvent(event);
149 }
150
151 void keyReleaseEvent(QKeyEvent *event) override
152 {
153 if (m_delegateTool) m_delegateTool->keyReleaseEvent(event);
154 }
155
157 {
158 if (m_delegateTool) m_delegateTool->explicitUserStrokeEndRequest();
159 }
160
161 QMenu* popupActionsMenu() override
162 {
163 if (m_delegateTool) return m_delegateTool->popupActionsMenu();
164 return nullptr;
165 }
166
168 {
169 if (m_delegateTool) return m_delegateTool->popupWidget();
170 return nullptr;
171 }
172
173 void activatePrimaryAction() override
174 {
175 if (m_delegateTool) m_delegateTool->activatePrimaryAction();
176 }
177
179 {
180 if (m_delegateTool) m_delegateTool->deactivatePrimaryAction();
181 }
182
183 void beginPrimaryAction(KoPointerEvent *event) override
184 {
185 if (m_delegateTool) m_delegateTool->beginPrimaryAction(event);
186 }
187
189 {
190 if (m_delegateTool) m_delegateTool->continuePrimaryAction(event);
191 }
192
193 void endPrimaryAction(KoPointerEvent *event) override
194 {
195 if (m_delegateTool) m_delegateTool->endPrimaryAction(event);
196 }
197
199 {
200 if (m_delegateTool) m_delegateTool->beginPrimaryDoubleClickAction(event);
201 }
202
204 {
205 if (m_delegateTool) return m_delegateTool->primaryActionSupportsHiResEvents();
206 return false;
207 }
208
209 void activateAlternateAction(typename BaseClass::AlternateAction action) override
210 {
211 if (m_delegateTool) m_delegateTool->activateAlternateAction(action);
212 }
213
214 void deactivateAlternateAction(typename BaseClass::AlternateAction action) override
215 {
216 if (m_delegateTool) m_delegateTool->deactivateAlternateAction(action);
217 }
218
219 void beginAlternateAction(KoPointerEvent *event, typename BaseClass::AlternateAction action) override
220 {
221 if (m_delegateTool) m_delegateTool->beginAlternateAction(event, action);
222 }
223
224 void continueAlternateAction(KoPointerEvent *event, typename BaseClass::AlternateAction action) override
225 {
226 if (m_delegateTool) m_delegateTool->continueAlternateAction(event, action);
227 }
228
229 void endAlternateAction(KoPointerEvent *event, typename BaseClass::AlternateAction action) override
230 {
231 if (m_delegateTool) m_delegateTool->endAlternateAction(event, action);
232 }
233
234 void beginAlternateDoubleClickAction(KoPointerEvent *event, typename BaseClass::AlternateAction action) override
235 {
236 if (m_delegateTool) m_delegateTool->beginAlternateDoubleClickAction(event, action);
237 }
238
239 bool alternateActionSupportsHiResEvents(typename BaseClass::AlternateAction action) const override
240 {
241 if (m_delegateTool) return m_delegateTool->alternateActionSupportsHiResEvents(action);
242 return false;
243 }
244
246 {
247 if (m_delegateTool) m_delegateTool->newActivationWithExternalSource(externalSource);
248 }
249
250 void requestUpdateOutline(const QPointF &outlineDocPoint, const KoPointerEvent *event) override
251 {
252 if (m_delegateTool) m_delegateTool->requestUpdateOutline(outlineDocPoint, event);
253 }
254
255public Q_SLOTS:
257 {
258 if (m_delegateTool) m_delegateTool->requestUndoDuringStroke();
259 }
260
262 {
263 if (m_delegateTool) m_delegateTool->requestRedoDuringStroke();
264 }
265
267 {
268 if (m_delegateTool) m_delegateTool->requestStrokeCancellation();
269 }
270
271 void requestStrokeEnd() override
272 {
273 if (m_delegateTool) m_delegateTool->requestStrokeEnd();
274 }
275
276 void activate(const QSet<KoShape*> &shapes) override
277 {
278 if (m_delegateTool) m_delegateTool->activate(shapes);
279 KisTool::activate(shapes);
280 }
281
282 void deactivate() override
283 {
284 if (m_delegateTool) m_delegateTool->deactivate();
286 }
287
288 void canvasResourceChanged(int key, const QVariant &res) override
289 {
290 if (m_delegateTool) m_delegateTool->canvasResourceChanged(key, res);
291 }
292
293 void documentResourceChanged(int key, const QVariant &res) override
294 {
295 if (m_delegateTool) m_delegateTool->documentResourceChanged(key, res);
296 }
297
298 void repaintDecorations() override
299 {
300 if (m_delegateTool) m_delegateTool->repaintDecorations();
301 }
302
303 void updateSettingsViews() override
304 {
305 if (m_delegateTool) m_delegateTool->updateSettingsViews();
306 }
307
308protected:
309 QWidget* createOptionWidget() override
310 {
311 if (m_delegateTool) return m_delegateTool->createOptionWidget();
312 return nullptr;
313 }
314
315 bool listeningToModifiers() override
316 {
317 if (m_delegateTool) return m_delegateTool->listeningToModifiers();
318 return false;
319 }
320
321 void listenToModifiers(bool listen) override
322 {
323 if (m_delegateTool) m_delegateTool->listenToModifiers(listen);
324 }
325
326 QCursor cursor() const
327 {
328 if (m_delegateTool) return m_delegateTool->cursor();
329 return BaseClass::cursor();
330 }
331
332 void setCursor(const QCursor &cursor)
333 {
334 if (m_delegateTool) m_delegateTool->setCursor(cursor);
335 BaseClass::setCursor(cursor);
336 }
337
338 void setMode(typename BaseClass::ToolMode mode) override
339 {
340 if (m_delegateTool) m_delegateTool->setMode(mode);
341 BaseClass::setMode(mode);
342 }
343
344 typename BaseClass::ToolMode mode() const override
345 {
346 if (m_delegateTool) return m_delegateTool->mode();
347 return BaseClass::mode();
348 }
349
350protected Q_SLOTS:
351 void resetCursorStyle() override
352 {
353 if (m_delegateTool) m_delegateTool->resetCursorStyle();
354 BaseClass::resetCursorStyle();
355 }
356
357private:
359
360};
361
362#endif
KisDynamicDelegateTool()=delete
KisDynamicDelegateTool & operator=(const KisDynamicDelegateTool &)=delete
KisDynamicDelegateTool(const KisDynamicDelegateTool &)=delete
BaseClass::ToolMode mode() const override
void explicitUserStrokeEndRequest() override
void beginPrimaryAction(KoPointerEvent *event) override
void mouseTripleClickEvent(KoPointerEvent *event) override
QWidget * createOptionWidget() override
bool primaryActionSupportsHiResEvents() const override
void endPrimaryAction(KoPointerEvent *event) override
void newActivationWithExternalSource(KisPaintDeviceSP externalSource) override
void requestUpdateOutline(const QPointF &outlineDocPoint, const KoPointerEvent *event) override
void activateAlternateAction(typename BaseClass::AlternateAction action) override
void documentResourceChanged(int key, const QVariant &res) override
void beginPrimaryDoubleClickAction(KoPointerEvent *event) override
void paint(QPainter &painter, const KoViewConverter &converter) override
void listenToModifiers(bool listen) override
void canvasResourceChanged(int key, const QVariant &res) override
bool wantsAutoScroll() const override
QRectF decorationsRect() const override
void continueAlternateAction(KoPointerEvent *event, typename BaseClass::AlternateAction action) override
void beginAlternateDoubleClickAction(KoPointerEvent *event, typename BaseClass::AlternateAction action) override
DelegateType * delegateTool() const
KisDynamicDelegatedTool(KoCanvasBase *canvas, const QCursor &cursor)
void setCursor(const QCursor &cursor)
void keyReleaseEvent(QKeyEvent *event) override
void setMode(typename BaseClass::ToolMode mode) override
void endAlternateAction(KoPointerEvent *event, typename BaseClass::AlternateAction action) override
void beginAlternateAction(KoPointerEvent *event, typename BaseClass::AlternateAction action) override
void mouseDoubleClickEvent(KoPointerEvent *event) override
void keyPressEvent(QKeyEvent *event) override
void mouseMoveEvent(KoPointerEvent *event) override
KisPopupWidgetInterface * popupWidget() override
bool alternateActionSupportsHiResEvents(typename BaseClass::AlternateAction action) const override
void activate(const QSet< KoShape * > &shapes) override
void setDelegateTool(DelegateType *newDelegateTool)
void mousePressEvent(KoPointerEvent *event) override
KisDynamicDelegatedTool()=delete
KisDynamicDelegatedTool & operator=(const KisDynamicDelegatedTool &)=delete
void deactivateAlternateAction(typename BaseClass::AlternateAction action) override
KisDynamicDelegatedTool(const KisDynamicDelegatedTool &)=delete
void mouseReleaseEvent(KoPointerEvent *event) override
void continuePrimaryAction(KoPointerEvent *event) override
The PopupWidgetInterface abstract class defines the basic interface that will be used by all popup wi...
void activate(const QSet< KoShape * > &shapes) override
Definition kis_tool.cc:93
void deactivate() override
Definition kis_tool.cc:131