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>
28
29#include <klocalizedstring.h>
30#include <kactioncollection.h>
31#include <QWidget>
32#include <QFile>
33#include <QDomDocument>
34#include <QDomElement>
35#include <QApplication>
36
37#include <QKeyEvent>
38#include <QInputMethodEvent>
39#include <QFocusEvent>
40
42 : d_ptr(new KoToolBasePrivate(this, canvas))
43{
44 Q_D(KoToolBase);
45 d->connectSignals();
46}
47
49 : d_ptr(&dd)
50{
51 Q_D(KoToolBase);
52 d->connectSignals();
53}
54
56{
57 delete d_ptr;
58}
59
60
62{
63 Q_D(const KoToolBase);
64 return d->isActivated;
65}
66
68{
69 Q_D(const KoToolBase);
70
71 if (!d->canvas) return 0;
72 if (!d->canvas->toolProxy()) return 0;
73
74 return d->canvas->toolProxy()->lastDeliveredPointerEvent();
75}
76
77void KoToolBase::activate(const QSet<KoShape *> &shapes)
78{
79 Q_UNUSED(shapes);
80
81 Q_D(KoToolBase);
82 d->isActivated = true;
83}
84
86{
87 Q_D(KoToolBase);
88 d->isActivated = false;
89}
90
91void KoToolBase::canvasResourceChanged(int key, const QVariant & res)
92{
93 Q_UNUSED(key);
94 Q_UNUSED(res);
95}
96
97void KoToolBase::documentResourceChanged(int key, const QVariant &res)
98{
99 Q_UNUSED(key);
100 Q_UNUSED(res);
101}
102
104{
105 return true;
106}
107
109{
110 event->ignore();
111}
112
114{
115 event->ignore();
116}
117
119{
120 e->ignore();
121}
122
124{
125 e->ignore();
126}
127
128
132
133QVariant KoToolBase::inputMethodQuery(Qt::InputMethodQuery query) const
134{
135 Q_D(const KoToolBase);
136 if (d->canvas->canvasWidget() == 0)
137 return QVariant();
138
139 switch (query) {
140 case Qt::ImEnabled:
141 return isInTextMode();
142 case Qt::ImCursorRectangle:
143 return QRect(d->canvas->canvasWidget()->width() / 2, 0, 1, d->canvas->canvasWidget()->height());
144 case Qt::ImFont:
145 return d->canvas->canvasWidget()->font();
146 default:
147 return QVariant();
148 }
149}
150
151void KoToolBase::inputMethodEvent(QInputMethodEvent * event)
152{
153 if (! event->commitString().isEmpty()) {
154 QKeyEvent ke(QEvent::KeyPress, -1, QFlags<Qt::KeyboardModifier>(), event->commitString());
155 keyPressEvent(&ke);
156 }
157 event->accept();
158}
159
160void KoToolBase::focusInEvent(QFocusEvent *event)
161{
162 event->ignore();
163}
164
165void KoToolBase::focusOutEvent(QFocusEvent *event)
166{
167 event->ignore();
168}
169
171{
172 event->ignore();
173}
174
176{
177 event->ignore();
178}
179
181{
182 event->ignore();
183}
184
185void KoToolBase::useCursor(const QCursor &cursor)
186{
187 Q_D(KoToolBase);
188 d->currentCursor = cursor;
189 Q_EMIT cursorChanged(d->currentCursor);
190}
191
193{
194 Q_D(KoToolBase);
195 if (!d->optionWidgetsCreated) {
196 d->optionWidgets = createOptionWidgets();
197 d->optionWidgetsCreated = true;
198 }
199 return d->optionWidgets;
200}
201
202QAction *KoToolBase::action(const QString &name) const
203{
204 Q_D(const KoToolBase);
205 if (d->canvas && d->canvas->canvasController() && d->canvas->canvasController()) {
206 return d->canvas->canvasController()->actionCollection()->action(name);
207 }
208 return 0;
209}
210
212{
213 return 0;
214}
215
217{
219 if (QWidget *widget = createOptionWidget()) {
220 if (widget->objectName().isEmpty()) {
221 widget->setObjectName(toolId());
222 }
223 ow.append(widget);
224 }
225 return ow;
226}
227
229{
230 Q_D(KoToolBase);
231 d->factory = factory;
232}
233
235{
236 Q_D(const KoToolBase);
237 return d->factory;
238}
239
240QString KoToolBase::toolId() const
241{
242 Q_D(const KoToolBase);
243 return d->factory ? d->factory->id() : 0;
244}
245
246QCursor KoToolBase::cursor() const
247{
248 Q_D(const KoToolBase);
249 return d->currentCursor;
250}
251
255
257{
258 copy();
260}
261
263{
264 Q_D(const KoToolBase);
265 return d->canvas;
266}
267
268void KoToolBase::setStatusText(const QString &statusText)
269{
270 Q_EMIT statusTextChanged(statusText);
271}
272
274{
275 Q_D(const KoToolBase);
276 if (d->canvas
277 && d->canvas->resourceManager()
278 )
279 {
280 return d->canvas->resourceManager()->handleRadius();
281 }
282 else {
283 return 3;
284 }
285}
286
288{
289 Q_D(const KoToolBase);
290 const KoViewConverter * converter = d->canvas->viewConverter();
291 const QPointF doc = converter->viewToDocument(QPointF(handleRadius(), handleRadius()));
292 return qMax(doc.x(), doc.y());
293}
294
296{
297 Q_D(const KoToolBase);
298 if (d->canvas
299 && d->canvas->resourceManager()
300 )
301 {
302 return d->canvas->resourceManager()->decorationThickness();
303 }
304 else {
305 return 1;
306 }
307}
308
310{
311 Q_D(const KoToolBase);
312 if(d->canvas->shapeController()->resourceManager())
313 {
314 return d->canvas->shapeController()->resourceManager()->grabSensitivity();
315 } else {
316 return 3;
317 }
318}
319
320QRectF KoToolBase::handleGrabRect(const QPointF &position) const
321{
322 Q_D(const KoToolBase);
323 const KoViewConverter * converter = d->canvas->viewConverter();
324 uint handleSize = 2*grabSensitivity();
325 QRectF r = converter->viewToDocument(QRectF(0, 0, handleSize, handleSize));
326 r.moveCenter(position);
327 return r;
328}
329
330QRectF KoToolBase::handlePaintRect(const QPointF &position) const
331{
332 Q_D(const KoToolBase);
333 const KoViewConverter * converter = d->canvas->viewConverter();
334 uint handleSize = 2*handleRadius();
335 QRectF r = converter->viewToDocument(QRectF(0, 0, handleSize, handleSize));
336 r.moveCenter(position);
337 return r;
338}
339
341{
342 Q_D(KoToolBase);
343 d->isInTextMode = value;
344 qApp->inputMethod()->update(Qt::ImEnabled);
345 Q_EMIT textModeChanged(d->isInTextMode);
346}
347
349{
350 return false;
351}
352
354{
355 return false;
356}
357
359{
360}
361
363{
364}
365
366void KoToolBase::dragMoveEvent(QDragMoveEvent *event, const QPointF &point)
367{
368 Q_UNUSED(event);
369 Q_UNUSED(point);
370}
371
372void KoToolBase::dragLeaveEvent(QDragLeaveEvent *event)
373{
374 Q_UNUSED(event);
375}
376
377void KoToolBase::dropEvent(QDropEvent *event, const QPointF &point)
378{
379 Q_UNUSED(event);
380 Q_UNUSED(point);
381}
382
384{
385 KoToolSelection *sel = selection();
386 return (sel && sel->hasSelection());
387}
388
390{
391 return 0;
392}
393
395{
396 Q_D(KoToolBase);
397
398 QRectF dirtyRect = d->lastDecorationsRect;
399 d->lastDecorationsRect = decorationsRect();
400 dirtyRect |= d->lastDecorationsRect;
401
402 if (!dirtyRect.isEmpty()) {
403 canvas()->updateCanvas(dirtyRect);
404 }
405}
406
408{
409 return QRectF();
410}
411
413{
414 Q_D(const KoToolBase);
415 return d->isInTextMode;
416}
417
425
426
430
434
438
440{
441 Q_D(const KoToolBase);
442 return d->maskSyntheticEvents;
443}
444
446{
447 Q_D(KoToolBase);
448 d->maskSyntheticEvents = value;
449}
450
452{
453 Q_D(const KoToolBase);
454 return d->isOpacityPresetMode;
455}
456
458{
459 Q_D(KoToolBase);
460 d->isOpacityPresetMode = value;
461}
462
464 Q_D(KoToolBase);
465 d->toolCanvasResources.converters[converter->key()] = converter;
466}
467
469 Q_D(KoToolBase);
470 d->toolCanvasResources.abstractResources[abstractResource->key()] = abstractResource;
471}
472
473QHash<int, KoAbstractCanvasResourceInterfaceSP> KoToolBase::toolAbstractResources()
474{
475 Q_D(KoToolBase);
476 return d->toolCanvasResources.abstractResources;
477}
478
479QHash<int, KoDerivedResourceConverterSP> KoToolBase::toolConverters()
480{
481 Q_D(KoToolBase);
482 return d->toolCanvasResources.converters;
483}
484
486{
487 Q_D(KoToolBase);
488 if (d->optionWidgetsCreated) {
489 QObjectList objects;
490 Q_FOREACH (QPointer<QWidget> widget, d->optionWidgets) {
491 objects.append(widget);
492 }
493 while (!objects.isEmpty()) {
494 QObject* object = objects.takeFirst();
495 objects.append(object->children());
497 }
498 }
499}
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)