Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_tool_pencil.cc
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2012 Sven Langkamp <sven.langkamp@gmail.com>
3 * SPDX-FileCopyrightText: 2010 Cyrille Berger <cberger@cberger.net>
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
8#include "kis_tool_pencil.h"
9#include <KoPathShape.h>
10#include <KoCanvasBase.h>
11#include <KoPointerEvent.h>
12#include <KoShapeStroke.h>
13#include <KisViewManager.h>
14#include <canvas/kis_canvas2.h>
16
17#include <kis_cursor.h>
18
20 : DelegatedPencilTool(canvas, Qt::ArrowCursor,
21 new __KisToolPencilLocalTool(canvas, this))
22{
23 setIsOpacityPresetMode(true);
24 KisCanvas2 *kritaCanvas = dynamic_cast<KisCanvas2*>(canvas);
25
26 connect(kritaCanvas->viewManager()->canvasResourceProvider(), SIGNAL(sigEffectiveCompositeOpChanged()), SLOT(resetCursorStyle()));
27}
28
30{
31 if (isEraser() && (nodePaintAbility() == PAINT)) {
32 useCursor(KisCursor::eraserCursor());
33 } else {
34 DelegatedPencilTool::resetCursorStyle();
35 }
36
37 overrideCursorIfNotEditable();
38}
39
41{
42 if (mode() == HOVER_MODE || mode() == PAINT_MODE) {
43 setCursor(value ? Qt::ArrowCursor : Qt::ForbiddenCursor);
45 }
46}
47
49{
50 Q_UNUSED(event);
51}
52
54{
55 Q_UNUSED(event)
56}
57
59{
60 if (!nodeEditable()) return;
61
62 if (nodePaintAbility() == KisToolPencil::MYPAINTBRUSH_UNPAINTABLE) {
63 KisCanvas2 * kiscanvas = static_cast<KisCanvas2*>(canvas());
64 QString message = i18n("The MyPaint Brush Engine is not available for this colorspace");
65 kiscanvas->viewManager()->showFloatingMessage(message, koIcon("object-locked"));
66 event->ignore();
67 return;
68 }
69
71}
72
77
82
84{
85 QList<QPointer<QWidget> > widgetsList =
87
88 QList<QPointer<QWidget> > filteredWidgets;
89 Q_FOREACH (QWidget* widget, widgetsList) {
90 if (widget->objectName() != "Stroke widget") {
91 filteredWidgets.push_back(widget);
92 }
93 }
94 return filteredWidgets;
95}
96
98 : KoPencilTool(canvas), m_parentTool(parentTool) {
100}
101
102void __KisToolPencilLocalTool::paint(QPainter &painter, const KoViewConverter &converter)
103{
104 if (m_parentTool->strokeStyle() == KisToolShapeUtils::StrokeStyleNone) {
105 paintPath(path(), painter, converter);
106 } else {
107 KoPencilTool::paint(painter, converter);
108 }
109}
110
111
112
113void __KisToolPencilLocalTool::paintPath(KoPathShape *pathShape, QPainter &painter, const KoViewConverter &converter)
114{
115 Q_UNUSED(converter);
116 if (!pathShape) {
117 return;
118 }
119
120 QTransform matrix;
121 matrix.scale(m_parentTool->image()->xRes(), m_parentTool->image()->yRes());
122 matrix.translate(pathShape->position().x(), pathShape->position().y());
123 m_parentTool->paintToolOutline(&painter, m_parentTool->pixelToView(matrix.map(pathShape->outline())));
124}
125
127{
128 if (closePath) {
129 pathShape->close();
130 pathShape->normalize();
131 }
132
133 m_parentTool->addPathShape(pathShape, kundo2_i18n("Draw Freehand Path"));
134}
135
137{
138 KoShapeStrokeSP stroke = this->createStroke();
139 m_parentTool->updatePencilCursor(stroke && stroke->isVisible());
140}
float value(const T *src, size_t ch)
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
KisViewManager * viewManager() const
static QCursor eraserCursor()
void mouseMoveEvent(KoPointerEvent *event) override
QList< QPointer< QWidget > > createOptionWidgets() override
void mousePressEvent(KoPointerEvent *event) override
void mouseReleaseEvent(KoPointerEvent *event) override
KisToolPencil(KoCanvasBase *canvas)
QList< QPointer< QWidget > > createOptionWidgets() override
void beginPrimaryAction(KoPointerEvent *event) override
void continuePrimaryAction(KoPointerEvent *event) override
void endPrimaryAction(KoPointerEvent *event) override
void updatePencilCursor(bool value)
void mousePressEvent(KoPointerEvent *event) override
void mouseDoubleClickEvent(KoPointerEvent *event) override
void resetCursorStyle() override
KisCanvasResourceProvider * canvasResourceProvider()
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
The position of a path point within a path shape.
Definition KoPathShape.h:63
virtual QPointF normalize()
Normalizes the path data.
void close()
Closes the current subpath.
QPainterPath outline() const override
reimplemented
KoPathShape * path()
void paint(QPainter &painter, const KoViewConverter &converter) override
KoShapeStrokeSP createStroke()
QPointF position() const
Get the position of the shape in pt.
Definition KoShape.cpp:825
void setIsOpacityPresetMode(bool value)
KisToolPencil *const m_parentTool
void addPathShape(KoPathShape *pathShape, bool closePath) override
virtual void paintPath(KoPathShape *path, QPainter &painter, const KoViewConverter &converter)
void paint(QPainter &painter, const KoViewConverter &converter) override
void slotUpdatePencilCursor() override
__KisToolPencilLocalTool(KoCanvasBase *canvas, KisToolPencil *parentTool)
#define koIcon(name)
Use these macros for icons without any issues.
Definition kis_icon.h:25
KUndo2MagicString kundo2_i18n(const char *text)