Krita Source Code Documentation
Loading...
Searching...
No Matches
KoToolBase.cpp
Go to the documentation of this file.
1/* This file is part of the KDE project
2 * SPDX-FileCopyrightText: 2006, 2010 Thomas Zander <zander@kde.org>
3 * SPDX-FileCopyrightText: 2011 Jan Hambrecht <jaham@gmx.net>
4 *
5 * SPDX-License-Identifier: LGPL-2.0-or-later
6 */
7
8#include <QDebug>
9
10#include <QAction>
11
12#include "KoToolBase.h"
13#include "KoToolBase_p.h"
14#include "KoToolFactoryBase.h"
15#include "KoCanvasBase.h"
16#include "KoPointerEvent.h"
19#include "KoViewConverter.h"
20#include "KoShapeController.h"
22#include "KoToolSelection.h"
23#include "KoCanvasController.h"
24#include "KoToolProxy.h"
25#include <kis_icon_utils.h>
29
30#include <klocalizedstring.h>
31#include <kactioncollection.h>
32#include <QWidget>
33#include <QFile>
34#include <QDomDocument>
35#include <QDomElement>
36#include <QApplication>
37
38#include <QKeyEvent>
39#include <QInputMethodEvent>
40#include <QFocusEvent>
41
43 : d_ptr(new KoToolBasePrivate(this, canvas))
44{
45 Q_D(KoToolBase);
46 d->connectSignals();
47}
48
50 : d_ptr(&dd)
51{
52 Q_D(KoToolBase);
53 d->connectSignals();
54}
55
57{
58 delete d_ptr;
59}
60
61
63{
64 Q_D(const KoToolBase);
65 return d->isActivated;
66}
67
69{
70 Q_D(const KoToolBase);
71
72 if (!d->canvas) return 0;
73 if (!d->canvas->toolProxy()) return 0;
74
75 return d->canvas->toolProxy()->lastDeliveredPointerEvent();
76}
77
78void KoToolBase::activate(const QSet<KoShape *> &shapes)
79{
80 Q_UNUSED(shapes);
81
82 Q_D(KoToolBase);
83 d->isActivated = true;
84}
85
87{
88 Q_D(KoToolBase);
89 d->isActivated = false;
90}
91
92void KoToolBase::canvasResourceChanged(int key, const QVariant & res)
93{
94 Q_UNUSED(key);
95 Q_UNUSED(res);
96}
97
98void KoToolBase::documentResourceChanged(int key, const QVariant &res)
99{
100 Q_UNUSED(key);
101 Q_UNUSED(res);
102}
103
105{
106 return true;
107}
108
110{
111 event->ignore();
112}
113
115{
116 event->ignore();
117}
118
120{
121 e->ignore();
122}
123
125{
126 e->ignore();
127}
128
129
133
134QVariant KoToolBase::inputMethodQuery(Qt::InputMethodQuery query) const
135{
136 Q_D(const KoToolBase);
137 if (d->canvas->canvasWidget() == 0)
138 return QVariant();
139
140 switch (query) {
141 case Qt::ImEnabled:
142 return isInTextMode();
143 case Qt::ImCursorRectangle:
144 return QRect(d->canvas->canvasWidget()->width() / 2, 0, 1, d->canvas->canvasWidget()->height());
145 case Qt::ImFont:
146 return d->canvas->canvasWidget()->font();
147 default:
148 return QVariant();
149 }
150}
151
152void KoToolBase::inputMethodEvent(QInputMethodEvent * event)
153{
154 if (! event->commitString().isEmpty()) {
155 QKeyEvent ke(QEvent::KeyPress, -1, QFlags<Qt::KeyboardModifier>(), event->commitString());
156 keyPressEvent(&ke);
157 }
158 event->accept();
159}
160
161void KoToolBase::focusInEvent(QFocusEvent *event)
162{
163 event->ignore();
164}
165
166void KoToolBase::focusOutEvent(QFocusEvent *event)
167{
168 event->ignore();
169}
170
172{
173 event->ignore();
174}
175
177{
178 event->ignore();
179}
180
182{
183 event->ignore();
184}
185
186void KoToolBase::useCursor(const QCursor &cursor)
187{
188 Q_D(KoToolBase);
189 d->currentCursor = cursor;
190 Q_EMIT cursorChanged(d->currentCursor);
191}
192
194{
195 Q_D(KoToolBase);
196 if (!d->optionWidgetsCreated) {
197 KisScopedPerformanceLogger perfLog(QStringLiteral("KoToolBase::optionWidgets(%1)").arg(toolId()));
198 d->optionWidgets = createOptionWidgets();
199 d->optionWidgetsCreated = true;
200 }
201 return d->optionWidgets;
202}
203
204QAction *KoToolBase::action(const QString &name) const
205{
206 Q_D(const KoToolBase);
207 if (d->canvas && d->canvas->canvasController() && d->canvas->canvasController()) {
208 return d->canvas->canvasController()->actionCollection()->action(name);
209 }
210 return 0;
211}
212
214{
215 return 0;
216}
217
219{
221 if (QWidget *widget = createOptionWidget()) {
222 if (widget->objectName().isEmpty()) {
223 widget->setObjectName(toolId());
224 }
225 ow.append(widget);
226 }
227 return ow;
228}
229
231{
232 Q_D(KoToolBase);
233 d->factory = factory;
234}
235
237{
238 Q_D(const KoToolBase);
239 return d->factory;
240}
241
242QString KoToolBase::toolId() const
243{
244 Q_D(const KoToolBase);
245 return d->factory ? d->factory->id() : 0;
246}
247
248QCursor KoToolBase::cursor() const
249{
250 Q_D(const KoToolBase);
251 return d->currentCursor;
252}
253
257
259{
260 copy();
262}
263
265{
266 Q_D(const KoToolBase);
267 return d->canvas;
268}
269
270void KoToolBase::setStatusText(const QString &statusText)
271{
272 Q_EMIT statusTextChanged(statusText);
273}
274
276{
277 Q_D(const KoToolBase);
278 if (d->canvas
279 && d->canvas->resourceManager()
280 )
281 {
282 return d->canvas->resourceManager()->handleRadius();
283 }
284 else {
285 return 3;
286 }
287}
288
290{
291 Q_D(const KoToolBase);
292 const KoViewConverter * converter = d->canvas->viewConverter();
293 const QPointF doc = converter->viewToDocument(QPointF(handleRadius(), handleRadius()));
294 return qMax(doc.x(), doc.y());
295}
296
298{
299 Q_D(const KoToolBase);
300 if (d->canvas
301 && d->canvas->resourceManager()
302 )
303 {
304 return d->canvas->resourceManager()->decorationThickness();
305 }
306 else {
307 return 1;
308 }
309}
310
312{
313 Q_D(const KoToolBase);
314 if(d->canvas->shapeController()->resourceManager())
315 {
316 return d->canvas->shapeController()->resourceManager()->grabSensitivity();
317 } else {
318 return 3;
319 }
320}
321
322QRectF KoToolBase::handleGrabRect(const QPointF &position) const
323{
324 Q_D(const KoToolBase);
325 const KoViewConverter * converter = d->canvas->viewConverter();
326 uint handleSize = 2*grabSensitivity();
327 QRectF r = converter->viewToDocument(QRectF(0, 0, handleSize, handleSize));
328 r.moveCenter(position);
329 return r;
330}
331
332QRectF KoToolBase::handlePaintRect(const QPointF &position) const
333{
334 Q_D(const KoToolBase);
335 const KoViewConverter * converter = d->canvas->viewConverter();
336 uint handleSize = 2*handleRadius();
337 QRectF r = converter->viewToDocument(QRectF(0, 0, handleSize, handleSize));
338 r.moveCenter(position);
339 return r;
340}
341
343{
344 Q_D(KoToolBase);
345 d->isInTextMode = value;
346 qApp->inputMethod()->update(Qt::ImEnabled);
347 Q_EMIT textModeChanged(d->isInTextMode);
348}
349
351{
352 return false;
353}
354
356{
357 return false;
358}
359
361{
362}
363
365{
366}
367
368void KoToolBase::dragMoveEvent(QDragMoveEvent *event, const QPointF &point)
369{
370 Q_UNUSED(event);
371 Q_UNUSED(point);
372}
373
374void KoToolBase::dragLeaveEvent(QDragLeaveEvent *event)
375{
376 Q_UNUSED(event);
377}
378
379void KoToolBase::dropEvent(QDropEvent *event, const QPointF &point)
380{
381 Q_UNUSED(event);
382 Q_UNUSED(point);
383}
384
386{
387 KoToolSelection *sel = selection();
388 return (sel && sel->hasSelection());
389}
390
392{
393 return 0;
394}
395
397{
398 Q_D(KoToolBase);
399
400 QRectF dirtyRect = d->lastDecorationsRect;
401 d->lastDecorationsRect = decorationsRect();
402 dirtyRect |= d->lastDecorationsRect;
403
404 if (!dirtyRect.isEmpty()) {
405 canvas()->updateCanvas(dirtyRect);
406 }
407}
408
410{
411 return QRectF();
412}
413
415{
416 Q_D(const KoToolBase);
417 return d->isInTextMode;
418}
419
427
428
432
436
440
442{
443 Q_D(const KoToolBase);
444 return d->maskSyntheticEvents;
445}
446
448{
449 Q_D(KoToolBase);
450 d->maskSyntheticEvents = value;
451}
452
454{
455 Q_D(const KoToolBase);
456 return d->isOpacityPresetMode;
457}
458
460{
461 Q_D(KoToolBase);
462 d->isOpacityPresetMode = value;
463}
464
466 Q_D(KoToolBase);
467 d->toolCanvasResources.converters[converter->key()] = converter;
468}
469
471 Q_D(KoToolBase);
472 d->toolCanvasResources.abstractResources[abstractResource->key()] = abstractResource;
473}
474
475QHash<int, KoAbstractCanvasResourceInterfaceSP> KoToolBase::toolAbstractResources()
476{
477 Q_D(KoToolBase);
478 return d->toolCanvasResources.abstractResources;
479}
480
481QHash<int, KoDerivedResourceConverterSP> KoToolBase::toolConverters()
482{
483 Q_D(KoToolBase);
484 return d->toolCanvasResources.converters;
485}
486
488{
489 Q_D(KoToolBase);
490 if (d->optionWidgetsCreated) {
491 QObjectList objects;
492 Q_FOREACH (QPointer<QWidget> widget, d->optionWidgets) {
493 objects.append(widget);
494 }
495 while (!objects.isEmpty()) {
496 QObject* object = objects.takeFirst();
497 objects.append(object->children());
499 }
500 }
501}
float value(const T *src, size_t ch)
unsigned int uint
virtual void updateCanvas(const QRectF &rc)=0
QHash< int, KoDerivedResourceConverterSP > toolConverters()
KoToolBasePrivate * d_ptr
Definition KoToolBase.h:567
virtual void customMoveEvent(KoPointerEvent *event)
qreal handleDocRadius() const
void textModeChanged(bool inTextMode)
virtual void requestRedoDuringStroke()
KoCanvasBase * canvas() const
Returns the canvas the tool is working on.
virtual void deleteSelection()
void setConverter(KoDerivedResourceConverterSP converter)
virtual void requestUndoDuringStroke()
virtual void requestStrokeCancellation()
virtual void mouseTripleClickEvent(KoPointerEvent *event)
Q_INVOKABLE QString toolId() const
QRectF handlePaintRect(const QPointF &position) const
virtual QWidget * createOptionWidget()
void setMaskSyntheticEvents(bool value)
virtual QList< QPointer< QWidget > > createOptionWidgets()
QCursor cursor() const
return the last emitted cursor
int grabSensitivity() const
Convenience function to get the current grab sensitivity.
void statusTextChanged(const QString &statusText)
virtual void keyReleaseEvent(QKeyEvent *event)
virtual void focusInEvent(QFocusEvent *event)
void updateOptionsWidgetIcons()
void setStatusText(const QString &statusText)
virtual void dropEvent(QDropEvent *event, const QPointF &point)
void setIsOpacityPresetMode(bool value)
QHash< int, KoAbstractCanvasResourceInterfaceSP > toolAbstractResources()
virtual void copy() const
virtual bool paste()
virtual void focusOutEvent(QFocusEvent *event)
virtual void customPressEvent(KoPointerEvent *event)
~KoToolBase() override
bool maskSyntheticEvents() const
virtual KoToolSelection * selection()
virtual void deselect()
deselect the tool should clear the selection if it has one.
void setTextMode(bool value)
virtual void repaintDecorations()
bool isOpacityPresetMode() const
int handleRadius() const
Convenience function to get the current handle radius.
void useCursor(const QCursor &cursor)
virtual void activate(const QSet< KoShape * > &shapes)
virtual void canvasResourceChanged(int key, const QVariant &res)
virtual bool hasSelection()
virtual void keyPressEvent(QKeyEvent *event)
void setAbstractResource(KoAbstractCanvasResourceInterfaceSP abstractResource)
bool isInTextMode() const
QRectF handleGrabRect(const QPointF &position) const
virtual bool selectAll()
selectAll select all data the tool can select.
virtual void deactivate()
QAction * action(const QString &name) const
QList< QPointer< QWidget > > optionWidgets()
virtual QRectF decorationsRect() const
bool isActivated() const
virtual void cut()
void cursorChanged(const QCursor &cursor)
virtual void mouseDoubleClickEvent(KoPointerEvent *event)
virtual void requestStrokeEnd()
virtual void inputMethodEvent(QInputMethodEvent *event)
virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const
int decorationThickness() const
decorationThickness The minimum thickness for tool decoration lines, this is derived from the screen ...
virtual void documentResourceChanged(int key, const QVariant &res)
virtual void customReleaseEvent(KoPointerEvent *event)
virtual bool wantsAutoScroll() const
KoPointerEvent * lastDeliveredPointerEvent() const
virtual void dragMoveEvent(QDragMoveEvent *event, const QPointF &point)
virtual void explicitUserStrokeEndRequest()
explicitUserStrokeEndRequest is called by the input manager when the user presses Enter key or any eq...
virtual void dragLeaveEvent(QDragLeaveEvent *event)
void setFactory(KoToolFactoryBase *factory)
KoToolFactoryBase * factory() const
virtual bool hasSelection()
return true if the tool currently has something selected that can be copied or deleted.
virtual QPointF viewToDocument(const QPointF &viewPoint) const
void updateIconCommon(QObject *object)