Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_tool.cc
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2006, 2010 Boudewijn Rempt <boud@valdyas.org>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6#include "kis_tool.h"
7#include <QCursor>
8#include <QLabel>
9#include <QWidget>
10#include <QPolygonF>
11#include <QTransform>
12
13#include <klocalizedstring.h>
14#include <QAction>
15#include <kactioncollection.h>
16
17#include <kis_icon.h>
18#include <KoConfig.h>
21#include <KoColor.h>
22#include <KoCanvasBase.h>
23#include <KoCanvasController.h>
24#include <KoToolBase.h>
25#include <KoID.h>
26#include <KoPointerEvent.h>
27#include <KoViewConverter.h>
28#include <KoSelection.h>
30#include <KoSnapGuide.h>
31
32#include <KisViewManager.h>
33#include "kis_node_manager.h"
34#include <kis_selection.h>
35#include <kis_image.h>
36#include <kis_group_layer.h>
38#include <kis_mask.h>
39#include <kis_paint_layer.h>
40#include <kis_painter.h>
43#include <resources/KoPattern.h>
46
49#include "canvas/kis_canvas2.h"
52#include "kis_config.h"
53#include "kis_config_notifier.h"
54#include "kis_cursor.h"
55#include <kis_selection_mask.h>
57#include <KisView.h>
58#include "kis_action_registry.h"
59#include "kis_tool_utils.h"
61
62
63struct Q_DECL_HIDDEN KisTool::Private {
64 QCursor cursor; // the cursor that should be shown on tool activation.
65
66 // From the canvas resources
71 float currentExposure{1.0};
73 QWidget* optionWidget{0};
74 ToolMode m_mode{HOVER_MODE};
75 bool m_isActive{false};
76};
77
78KisTool::KisTool(KoCanvasBase * canvas, const QCursor & cursor)
79 : KoToolBase(canvas)
80 , d(new Private)
81{
82 d->cursor = cursor;
83
84 connect(KisConfigNotifier::instance(), SIGNAL(configChanged()), SLOT(resetCursorStyle()));
85 connect(this, SIGNAL(isActiveChanged(bool)), SLOT(resetCursorStyle()));
86}
87
89{
90 delete d;
91}
92
93void KisTool::activate(const QSet<KoShape*> &shapes)
94{
96
98
99 if (!canvas()) return;
100 if (!canvas()->resourceManager()) return;
101
102
103 d->currentFgColor = canvas()->resourceManager()->resource(KoCanvasResource::ForegroundColor).value<KoColor>();
104 d->currentBgColor = canvas()->resourceManager()->resource(KoCanvasResource::BackgroundColor).value<KoColor>();
105
107 d->currentPattern = canvas()->resourceManager()->resource(KoCanvasResource::CurrentPattern).value<KoPatternSP>();
108 }
109
111 d->currentGradient = canvas()->resourceManager()->resource(KoCanvasResource::CurrentGradient).value<KoAbstractGradientSP>();
112 }
113
115 if (preset && preset->settings()) {
116 preset->settings()->activate();
117 }
118
120 d->currentExposure = static_cast<float>(canvas()->resourceManager()->resource(KoCanvasResource::HdrExposure).toDouble());
121 }
122
125 }
126
127 d->m_isActive = true;
128 Q_EMIT isActiveChanged(true);
129}
130
132{
133 d->m_isActive = false;
134 Q_EMIT isActiveChanged(false);
135
137}
138
139void KisTool::canvasResourceChanged(int key, const QVariant & v)
140{
141 switch (key) {
143 d->currentFgColor = v.value<KoColor>();
144 break;
146 d->currentBgColor = v.value<KoColor>();
147 break;
149 d->currentPattern = v.value<KoPatternSP>();
150 break;
152 d->currentGradient = v.value<KoAbstractGradientSP>();
153 break;
155 d->currentExposure = static_cast<float>(v.toDouble());
156 break;
158 d->currentGenerator = static_cast<KisFilterConfiguration*>(v.value<void *>());
159 break;
162 break;
163 default:
164 break; // Do nothing
165 };
166}
167
171
173{
174 KisCanvas2 *kritaCanvas = dynamic_cast<KisCanvas2*>(canvas());
175 Q_ASSERT(kritaCanvas);
176
177 const KisCoordinatesConverter *converter = kritaCanvas->coordinatesConverter();
178 return converter->flakeToWidget(converter->flakeCenterPoint());
179}
180
181QPointF KisTool::convertDocumentToWidget(const QPointF& pt)
182{
183 KisCanvas2 *kritaCanvas = dynamic_cast<KisCanvas2*>(canvas());
184 Q_ASSERT(kritaCanvas);
185
186 return kritaCanvas->coordinatesConverter()->documentToWidget(pt);
187}
188
190{
191 if (!image())
192 return e->point;
193
194 return image()->documentToPixel(e->point);
195}
196
197QPointF KisTool::convertToPixelCoord(const QPointF& pt)
198{
199 if (!image())
200 return pt;
201
202 return image()->documentToPixel(pt);
203}
204
206{
207 KisCanvas2 *canvas2 = dynamic_cast<KisCanvas2 *>(canvas());
208 KIS_ASSERT(canvas2);
209 const KisCoordinatesConverter *converter = canvas2->coordinatesConverter();
210 const QPointF imagePos = converter->widgetToImage(QPointF(converter->documentToWidget(pt).toPoint()));
211 return imagePos;
212}
213
214QPointF KisTool::convertToPixelCoordAndSnap(KoPointerEvent *e, const QPointF &offset, bool useModifiers)
215{
216 if (!image())
217 return e->point;
218
219 KoSnapGuide *snapGuide = canvas()->snapGuide();
220 QPointF pos = snapGuide->snap(e->point, offset, useModifiers ? e->modifiers() : Qt::NoModifier);
221
222 return image()->documentToPixel(pos);
223}
224
225QPointF KisTool::convertToPixelCoordAndSnap(const QPointF& pt, const QPointF &offset)
226{
227 if (!image())
228 return pt;
229
230 KoSnapGuide *snapGuide = canvas()->snapGuide();
231 QPointF pos = snapGuide->snap(pt, offset, Qt::NoModifier);
232
233 return image()->documentToPixel(pos);
234}
235
237{
238 if (!image())
239 return e->point.toPoint();
240
242}
243
244QPointF KisTool::viewToPixel(const QPointF &viewCoord) const
245{
246 if (!image())
247 return viewCoord;
248
249 return image()->documentToPixel(canvas()->viewConverter()->viewToDocument(viewCoord));
250}
251
252QRectF KisTool::convertToPt(const QRectF &rect)
253{
254 if (!image())
255 return rect;
256 QRectF r;
257 //We add 1 in the following to the extreme coords because a pixel always has size
258 r.setCoords(int(rect.left()) / image()->xRes(), int(rect.top()) / image()->yRes(),
259 int(rect.right()) / image()->xRes(), int( rect.bottom()) / image()->yRes());
260 return r;
261}
262
264{
265 const qreal avgResolution = 0.5 * (image()->xRes() + image()->yRes());
266 return value / avgResolution;
267}
268
269QPointF KisTool::pixelToView(const QPoint &pixelCoord) const
270{
271 if (!image())
272 return pixelCoord;
273 QPointF documentCoord = image()->pixelToDocument(pixelCoord);
274 return canvas()->viewConverter()->documentToView(documentCoord);
275}
276
277QPointF KisTool::pixelToView(const QPointF &pixelCoord) const
278{
279 if (!image())
280 return pixelCoord;
281 QPointF documentCoord = image()->pixelToDocument(pixelCoord);
282 return canvas()->viewConverter()->documentToView(documentCoord);
283}
284
285QRectF KisTool::pixelToView(const QRectF &pixelRect) const
286{
287 if (!image()) {
288 return pixelRect;
289 }
290 QPointF topLeft = pixelToView(pixelRect.topLeft());
291 QPointF bottomRight = pixelToView(pixelRect.bottomRight());
292 return {topLeft, bottomRight};
293}
294
295QPainterPath KisTool::pixelToView(const QPainterPath &pixelPolygon) const
296{
297 QTransform matrix;
298 qreal zoomX, zoomY;
299 canvas()->viewConverter()->zoom(&zoomX, &zoomY);
300 matrix.scale(zoomX/image()->xRes(), zoomY/ image()->yRes());
301 return matrix.map(pixelPolygon);
302}
303
305{
306 KisCanvas2 *canvas2 = dynamic_cast<KisCanvas2 *>(canvas());
307 KIS_ASSERT(canvas2);
308 const KisCoordinatesConverter *coordsConverter = canvas2->coordinatesConverter();
309 return path.mapped(coordsConverter->imageToDocumentTransform() * coordsConverter->documentToFlakeTransform());
310}
311
312
313QPolygonF KisTool::pixelToView(const QPolygonF &pixelPath) const
314{
315 QTransform matrix;
316 qreal zoomX, zoomY;
317 canvas()->viewConverter()->zoom(&zoomX, &zoomY);
318 matrix.scale(zoomX/image()->xRes(), zoomY/ image()->yRes());
319 return matrix.map(pixelPath);
320}
321
322void KisTool::updateCanvasPixelRect(const QRectF &pixelRect)
323{
324 canvas()->updateCanvas(convertToPt(pixelRect));
325}
326
327void KisTool::updateCanvasViewRect(const QRectF &viewRect)
328{
329 canvas()->updateCanvas(canvas()->viewConverter()->viewToDocument(viewRect));
330}
331
333{
334 // For now, krita tools only work in krita, not for a krita shape. Krita shapes are for 2.1
335 KisCanvas2 * kisCanvas = dynamic_cast<KisCanvas2*>(canvas());
336 if (kisCanvas) {
337 return kisCanvas->currentImage();
338 }
339
340 return 0;
341
342}
343
344QCursor KisTool::cursor() const
345{
346 return d->cursor;
347}
348
350{
351 return d->currentPattern;
352}
353
355{
356 return d->currentGradient;
357}
358
360{
362 if (v.isNull()) {
363 return 0;
364 }
365 else {
366 return v.value<KisPaintOpPresetSP>();
367 }
368}
369
371{
373 return node;
374}
375
377{
378 KisCanvas2 * kiscanvas = static_cast<KisCanvas2*>(canvas());
379 KisViewManager* viewManager = kiscanvas->viewManager();
380 return viewManager->nodeManager()->selectedNodes();
381}
382
384{
385 return d->currentFgColor;
386}
387
389{
390 return d->currentBgColor;
391}
392
394{
395 return image();
396}
397
399{
400 return d->currentGenerator;
401}
402
404 d->m_mode = mode;
405}
406
408 return d->m_mode;
409}
410
411void KisTool::setCursor(const QCursor &cursor)
412{
413 d->cursor = cursor;
414}
415
420
425
430
432{
433 Q_UNUSED(event);
434}
435
440
442{
443 Q_UNUSED(event);
444}
445
447{
448 Q_UNUSED(event);
449}
450
452{
453 return false;
454}
455
457{
458 Q_UNUSED(action);
459}
460
462{
463 Q_UNUSED(action);
464}
465
467{
468 Q_UNUSED(event);
469 Q_UNUSED(action);
470}
471
476
478{
479 Q_UNUSED(event);
480 Q_UNUSED(action);
481}
482
484{
485 Q_UNUSED(event);
486 Q_UNUSED(action);
487}
488
490{
491 Q_UNUSED(action);
492 return false;
493}
494
496{
497 return false;
498}
499
501{
502 Q_UNUSED(event);
503}
504
509
511{
512 Q_UNUSED(event);
513}
514
516{
517 Q_UNUSED(event);
518}
519
521{
522 Q_UNUSED(event);
523}
524
526{
527 KisResourcesSnapshotSP resources =
528 new KisResourcesSnapshot(image(), currentNode(), this->canvas()->resourceManager(), 0, selectedNodes());
529
531 return;
532 }
533
534 if (!KisToolUtils::clearImage(image(), resources->selectedNodes(), resources->activeSelection())) {
536 }
537}
538
540{
541 KisNodeSP node = currentNode();
542
543 if (canvas()->resourceManager()->resource(KoCanvasResource::CurrentPaintOpPreset).isNull()) {
545 }
546
547 if (!node) {
549 }
550
551 if (node->inherits("KisShapeLayer")) {
553 }
554 if (node->inherits("KisCloneLayer")) {
556 }
557 if (node->paintDevice()) {
558
560 if (currentPaintOpPreset->paintOp().id() == "mypaintbrush") {
561 const KoColorSpace *colorSpace = node->paintDevice()->colorSpace();
562 if (colorSpace->colorModelId() != RGBAColorModelID) {
564 }
565 }
566
568 }
569
571}
572
574{
575 Q_UNUSED(externalSource);
576}
577
579{
580 d->optionWidget = new QLabel(i18n("No options"));
581 d->optionWidget->setObjectName("SpecialSpacer");
582 return d->optionWidget;
583}
584
585#define NEAR_VAL -1000.0
586#define FAR_VAL 1000.0
587#define PROGRAM_VERTEX_ATTRIBUTE 0
588
589void KisTool::paintToolOutline(QPainter* painter, const KisOptimizedBrushOutline &path)
590{
591 KisOpenGLCanvas2 *canvasWidget = dynamic_cast<KisOpenGLCanvas2 *>(canvas()->canvasWidget());
592 if (canvasWidget) {
593 painter->beginNativePainting();
594 canvasWidget->paintToolOutline(path, decorationThickness());
595 painter->endNativePainting();
596 }
597 else {
598 painter->save();
599 painter->setCompositionMode(QPainter::RasterOp_SourceXorDestination);
600 QPen p = QColor(128, 255, 128);
601 p.setCosmetic(true);
602 p.setWidth(decorationThickness());
603 painter->setPen(p);
604
605 for (auto it = path.begin(); it != path.end(); ++it) {
606 painter->drawPolyline(*it);
607 }
608
609 painter->restore();
610 }
611}
612
614{
615 useCursor(d->cursor);
616}
617
619{
620 // override cursor for canvas iff this tool is active
621 // and we can't paint on the active layer
622 if (isActive()) {
623 KisNodeSP node = currentNode();
624 if (node && !node->isEditable()) {
625 canvas()->setCursor(Qt::ForbiddenCursor);
626 return true;
627 }
628 }
629 return false;
630}
631
633{
634 KisCanvas2 * kiscanvas = static_cast<KisCanvas2*>(canvas());
635 KisViewManager* viewManager = kiscanvas->viewManager();
636 return viewManager->blockUntilOperationsFinished(image());
637}
638
640{
641 KisCanvas2 * kiscanvas = static_cast<KisCanvas2*>(canvas());
642 KisViewManager* viewManager = kiscanvas->viewManager();
644}
645
647{
648 return d->m_isActive;
649}
650
652{
653 KisNodeSP node = currentNode();
654 if (!node) {
655 return false;
656 }
657
658 if (!currentPaintOpPreset()) {
659 return false;
660 }
661
662 bool blockedNoIndirectPainting = false;
663
664 const bool presetUsesIndirectPainting =
665 !currentPaintOpPreset()->settings()->paintIncremental();
666
667 if (!presetUsesIndirectPainting) {
668 const KisIndirectPaintingSupport *indirectPaintingLayer =
669 dynamic_cast<const KisIndirectPaintingSupport*>(node.data());
670 if (indirectPaintingLayer) {
671 blockedNoIndirectPainting = !indirectPaintingLayer->supportsNonIndirectPainting();
672 }
673 }
674
675 bool nodeEditable = node->isEditable() && !blockedNoIndirectPainting;
676
677 if (!nodeEditable) {
678 KisCanvas2 * kiscanvas = static_cast<KisCanvas2*>(canvas());
679 QString message;
680 if (!node->visible() && node->userLocked()) {
681 message = i18n("Layer is locked and invisible.");
682 } else if (node->userLocked()) {
683 message = i18n("Layer is locked.");
684 } else if(!node->visible()) {
685 message = i18n("Layer is invisible.");
686 } else if (blockedNoIndirectPainting) {
687 message = i18n("Layer can be painted in Wash Mode only.");
688 } else {
689 message = i18n("Group not editable.");
690 }
691 kiscanvas->viewManager()->showFloatingMessage(message, KisIconUtils::loadIcon("object-locked"));
692 }
693 return nodeEditable;
694}
695
697{
698 KisCanvas2 * kisCanvas = static_cast<KisCanvas2*>(canvas());
699 KisViewManager * view = kisCanvas->viewManager();
700
701 bool editable = view->selectionEditable();
702 if (!editable) {
703 KisCanvas2 * kiscanvas = static_cast<KisCanvas2*>(canvas());
704 kiscanvas->viewManager()->showFloatingMessage(i18n("Local selection is locked."), KisIconUtils::loadIcon("object-locked"));
705 }
706 return editable;
707}
708
710{
711 Q_UNUSED(listen);
712}
713
715{
716 return false;
717}
float value(const T *src, size_t ch)
const Params2D p
qreal v
const KoID RGBAColorModelID("RGBA", ki18n("RGB/Alpha"))
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
void setCursor(const QCursor &cursor) override
KisImageWSP currentImage() const
KisCoordinatesConverter * coordinatesConverter
void updateCanvas(const QRectF &rc) override
KisViewManager * viewManager() const
KisAbstractCanvasWidget * canvasWidget
const KoViewConverter * viewConverter() const override
static KisConfigNotifier * instance()
_Private::Traits< T >::Result documentToWidget(const T &obj) const
_Private::Traits< T >::Result flakeToWidget(const T &obj) const
_Private::Traits< T >::Result widgetToImage(const T &obj) const
QPointF documentToPixel(const QPointF &documentCoord) const
QPointF pixelToDocument(const QPointF &pixelCoord) const
QPoint documentToImagePixelFloored(const QPointF &documentCoord) const
double xRes() const
double yRes() const
KisNodeList selectedNodes()
void paintToolOutline(const KisOptimizedBrushOutline &path, int thickness=1)
const KoColorSpace * colorSpace() const
The KisResourcesSnapshot class takes a snapshot of the various resources like colors and settings use...
KisNodeList selectedNodes() const
KisSelectionSP activeSelection() const
bool blockUntilOperationsFinished(KisImageSP image)
blockUntilOperationsFinished blocks the GUI of the application until execution of actions on image is...
void blockUntilOperationsFinishedForced(KisImageSP image)
blockUntilOperationsFinished blocks the GUI of the application until execution of actions on image is...
KisNodeManager * nodeManager() const
The node manager handles everything about nodes.
bool selectionEditable()
Checks if the current global or local selection is editable.
void showFloatingMessage(const QString &message, const QIcon &icon, int timeout=4500, KisFloatingMessage::Priority priority=KisFloatingMessage::Medium, int alignment=Qt::AlignCenter|Qt::TextWordWrap)
shows a floating message in the top right corner of the canvas
KoSnapGuide * snapGuide
QPointer< KoCanvasResourceProvider > resourceManager
virtual KoID colorModelId() const =0
Qt::KeyboardModifiers modifiers() const
QPointF point
The point in document coordinates.
QPointF snap(const QPointF &mousePosition, Qt::KeyboardModifiers modifiers)
snaps the mouse position, returns if mouse was snapped
virtual void deleteSelection()
void useCursor(const QCursor &cursor)
virtual void activate(const QSet< KoShape * > &shapes)
virtual void deactivate()
QAction * action(const QString &name) const
int decorationThickness() const
decorationThickness The minimum thickness for tool decoration lines, this is derived from the screen ...
virtual void zoom(qreal *zoomX, qreal *zoomY) const
virtual QPointF documentToView(const QPointF &documentPoint) const
#define KIS_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:85
#define KIS_ASSERT(cond)
Definition kis_assert.h:33
QIcon loadIcon(const QString &name)
bool clearImage(KisImageSP image, KisNodeList nodes, KisSelectionSP selection)
@ BackgroundColor
The active background color selected for this canvas.
@ ForegroundColor
The active foreground color selected for this canvas.
bool isEditable(bool checkVisibility=true) const
bool userLocked() const
virtual KisPaintDeviceSP paintDevice() const =0
virtual bool visible(bool recursive=false) const
virtual void updateSettingsViews()
Definition kis_tool.cc:168
QPointF convertToPixelCoord(KoPointerEvent *e)
Definition kis_tool.cc:189
KisNodeList selectedNodes() const
Definition kis_tool.cc:376
virtual ToolMode mode() const
Definition kis_tool.cc:407
void isActiveChanged(bool isActivated)
virtual bool listeningToModifiers()
Definition kis_tool.cc:714
virtual void activatePrimaryAction()
Definition kis_tool.cc:421
void updateCanvasPixelRect(const QRectF &pixelRect)
Update the canvas for the given rectangle in image pixel coordinates.
Definition kis_tool.cc:322
KisImageWSP currentImage()
Definition kis_tool.cc:393
KisTool(KoCanvasBase *canvas, const QCursor &cursor)
Definition kis_tool.cc:78
void deleteSelection() override
Definition kis_tool.cc:525
KisTool::NodePaintAbility nodePaintAbility()
Definition kis_tool.cc:539
QWidget * createOptionWidget() override
Definition kis_tool.cc:578
KoPatternSP currentPattern
Definition kis_tool.cc:67
void mouseReleaseEvent(KoPointerEvent *event) override
Definition kis_tool.cc:515
virtual void resetCursorStyle()
Definition kis_tool.cc:613
bool nodeEditable()
Checks checks if the current node is editable.
Definition kis_tool.cc:651
QPointF widgetCenterInWidgetPixels()
Definition kis_tool.cc:172
KisFilterConfigurationSP currentGenerator
Definition kis_tool.cc:72
virtual void beginPrimaryAction(KoPointerEvent *event)
Definition kis_tool.cc:431
virtual void continueAlternateAction(KoPointerEvent *event, AlternateAction action)
Definition kis_tool.cc:477
void mouseDoubleClickEvent(KoPointerEvent *event) override
Definition kis_tool.cc:500
@ Primary
Definition kis_tool.h:118
QPoint convertToImagePixelCoordFloored(KoPointerEvent *e)
Definition kis_tool.cc:236
Private *const d
Definition kis_tool.h:321
KisPaintOpPresetSP currentPaintOpPreset()
Definition kis_tool.cc:359
QPointF pixelToView(const QPoint &pixelCoord) const
Definition kis_tool.cc:269
virtual void activateAlternateAction(AlternateAction action)
Definition kis_tool.cc:456
KoColor currentBgColor
Definition kis_tool.cc:70
virtual void listenToModifiers(bool listen)
Definition kis_tool.cc:709
void mouseTripleClickEvent(KoPointerEvent *event) override
Definition kis_tool.cc:505
virtual void newActivationWithExternalSource(KisPaintDeviceSP externalSource)
newActivationWithExternalSource Makes sure that the tool is active and starts a new stroke,...
Definition kis_tool.cc:573
virtual void deactivateAlternateAction(AlternateAction action)
Definition kis_tool.cc:461
bool isActive
Definition kis_tool.h:44
virtual void endAlternateAction(KoPointerEvent *event, AlternateAction action)
Definition kis_tool.cc:483
KisNodeSP currentNode() const
Definition kis_tool.cc:370
void mousePressEvent(KoPointerEvent *event) override
Definition kis_tool.cc:510
KoAbstractGradientSP currentGradient
Definition kis_tool.cc:68
virtual void endPrimaryAction(KoPointerEvent *event)
Definition kis_tool.cc:446
void canvasResourceChanged(int key, const QVariant &res) override
Definition kis_tool.cc:139
virtual void continuePrimaryAction(KoPointerEvent *event)
Definition kis_tool.cc:441
KoColor currentFgColor
Definition kis_tool.cc:69
void mouseMoveEvent(KoPointerEvent *event) override
Definition kis_tool.cc:520
bool overrideCursorIfNotEditable()
Override the cursor appropriately if current node is not editable.
Definition kis_tool.cc:618
void activate(const QSet< KoShape * > &shapes) override
Definition kis_tool.cc:93
void paintToolOutline(QPainter *painter, const KisOptimizedBrushOutline &path)
Definition kis_tool.cc:589
void deactivate() override
Definition kis_tool.cc:131
QRectF convertToPt(const QRectF &rect)
Definition kis_tool.cc:252
KisImageWSP image() const
Definition kis_tool.cc:332
QPointF viewToPixel(const QPointF &viewCoord) const
Definition kis_tool.cc:244
QPointF convertToPixelCoordAndSnap(KoPointerEvent *e, const QPointF &offset=QPointF(), bool useModifiers=true)
Definition kis_tool.cc:214
bool selectionEditable()
Checks checks if the selection is editable, only applies to local selection as global selection is al...
Definition kis_tool.cc:696
~KisTool() override
Definition kis_tool.cc:88
void updateCanvasViewRect(const QRectF &viewRect)
Update the canvas for the given rectangle in view coordinates.
Definition kis_tool.cc:327
virtual bool alternateActionSupportsHiResEvents(AlternateAction action) const
Definition kis_tool.cc:489
QCursor cursor
Definition kis_tool.cc:64
QPointF convertToPixelCoordAndAlignOnWidget(const QPointF &pt)
Definition kis_tool.cc:205
QPointF convertDocumentToWidget(const QPointF &pt)
Definition kis_tool.cc:181
void blockUntilOperationsFinishedForced()
Definition kis_tool.cc:639
virtual void beginAlternateDoubleClickAction(KoPointerEvent *event, AlternateAction action)
Definition kis_tool.cc:472
virtual void beginAlternateAction(KoPointerEvent *event, AlternateAction action)
Definition kis_tool.cc:466
void setCursor(const QCursor &cursor)
Definition kis_tool.cc:411
virtual void deactivatePrimaryAction()
Definition kis_tool.cc:426
AlternateAction
Definition kis_tool.h:134
@ Secondary
Definition kis_tool.h:141
virtual bool primaryActionSupportsHiResEvents() const
Definition kis_tool.cc:451
bool blockUntilOperationsFinished()
Definition kis_tool.cc:632
NodePaintAbility
Definition kis_tool.h:148
@ MYPAINTBRUSH_UNPAINTABLE
Definition kis_tool.h:153
@ UNPAINTABLE
Definition kis_tool.h:152
virtual void beginPrimaryDoubleClickAction(KoPointerEvent *event)
Definition kis_tool.cc:436
static AlternateAction actionToAlternateAction(ToolAction action)
Definition kis_tool.cc:416
virtual void setMode(ToolMode mode)
Definition kis_tool.cc:403
virtual bool supportsPaintingAssistants() const
Definition kis_tool.cc:495
KisCanvas2 * canvas