File indexing completed on 2025-02-09 05:13:16

0001 /*
0002  *  SPDX-FileCopyrightText: 2012 Sven Langkamp <sven.langkamp@gmail.com>
0003  *  SPDX-FileCopyrightText: 2010 Cyrille Berger <cberger@cberger.net>
0004  *
0005  *  SPDX-License-Identifier: GPL-2.0-or-later
0006  */
0007 
0008 #include "kis_tool_pencil.h"
0009 #include <KoPathShape.h>
0010 #include <KoCanvasBase.h>
0011 #include <KoPointerEvent.h>
0012 #include <KoShapeStroke.h>
0013 #include <KisViewManager.h>
0014 #include <canvas/kis_canvas2.h>
0015 #include <kis_canvas_resource_provider.h>
0016 
0017 #include <kis_cursor.h>
0018 
0019 KisToolPencil::KisToolPencil(KoCanvasBase * canvas)
0020     : DelegatedPencilTool(canvas, Qt::ArrowCursor,
0021                           new __KisToolPencilLocalTool(canvas, this))
0022 {
0023     KisCanvas2 *kritaCanvas = dynamic_cast<KisCanvas2*>(canvas);
0024 
0025     connect(kritaCanvas->viewManager()->canvasResourceProvider(), SIGNAL(sigEffectiveCompositeOpChanged()), SLOT(resetCursorStyle()));
0026 }
0027 
0028 void KisToolPencil::resetCursorStyle()
0029 {
0030     if (isEraser() && (nodePaintAbility() == PAINT)) {
0031         useCursor(KisCursor::eraserCursor());
0032     } else {
0033         DelegatedPencilTool::resetCursorStyle();
0034     }
0035 
0036     overrideCursorIfNotEditable();
0037 }
0038 
0039 void KisToolPencil::updatePencilCursor(bool value)
0040 {
0041     if (mode() == HOVER_MODE || mode() == PAINT_MODE) {
0042         setCursor(value ? Qt::ArrowCursor : Qt::ForbiddenCursor);
0043         resetCursorStyle();
0044     }
0045 }
0046 
0047 void KisToolPencil::mousePressEvent(KoPointerEvent *event)
0048 {
0049     Q_UNUSED(event);
0050 }
0051 
0052 void KisToolPencil::mouseDoubleClickEvent(KoPointerEvent *event)
0053 {
0054     Q_UNUSED(event)
0055 }
0056 
0057 void KisToolPencil::beginPrimaryAction(KoPointerEvent *event)
0058 {
0059     if (!nodeEditable()) return;
0060 
0061     if (nodePaintAbility() == KisToolPencil::MYPAINTBRUSH_UNPAINTABLE) {
0062         KisCanvas2 * kiscanvas = static_cast<KisCanvas2*>(canvas());
0063         QString message = i18n("The MyPaint Brush Engine is not available for this colorspace");
0064         kiscanvas->viewManager()->showFloatingMessage(message, koIcon("object-locked"));
0065         event->ignore();
0066         return;
0067     }
0068 
0069     DelegatedPencilTool::mousePressEvent(event);
0070 }
0071 
0072 void KisToolPencil::continuePrimaryAction(KoPointerEvent *event)
0073 {
0074     mouseMoveEvent(event);
0075 }
0076 
0077 void KisToolPencil::endPrimaryAction(KoPointerEvent *event)
0078 {
0079     mouseReleaseEvent(event);
0080 }
0081 
0082 QList<QPointer<QWidget> > KisToolPencil::createOptionWidgets()
0083 {
0084     QList<QPointer<QWidget> > widgetsList =
0085             DelegatedPencilTool::createOptionWidgets();
0086 
0087     QList<QPointer<QWidget> > filteredWidgets;
0088     Q_FOREACH (QWidget* widget, widgetsList) {
0089         if (widget->objectName() != "Stroke widget") {
0090             filteredWidgets.push_back(widget);
0091         }
0092     }
0093     return filteredWidgets;
0094 }
0095 
0096 __KisToolPencilLocalTool::__KisToolPencilLocalTool(KoCanvasBase * canvas, KisToolPencil* parentTool)
0097     : KoPencilTool(canvas), m_parentTool(parentTool) {}
0098 
0099 void __KisToolPencilLocalTool::paint(QPainter &painter, const KoViewConverter &converter)
0100 {
0101     if (m_parentTool->strokeStyle() == KisToolShapeUtils::StrokeStyleNone) {
0102         paintPath(path(), painter, converter);
0103     } else {
0104         KoPencilTool::paint(painter, converter);
0105     }
0106 }
0107 
0108 
0109 
0110 void __KisToolPencilLocalTool::paintPath(KoPathShape *pathShape, QPainter &painter, const KoViewConverter &converter)
0111 {
0112     Q_UNUSED(converter);
0113     if (!pathShape) {
0114         return;
0115     }
0116 
0117     QTransform matrix;
0118     matrix.scale(m_parentTool->image()->xRes(), m_parentTool->image()->yRes());
0119     matrix.translate(pathShape->position().x(), pathShape->position().y());
0120     m_parentTool->paintToolOutline(&painter, m_parentTool->pixelToView(matrix.map(pathShape->outline())));
0121 }
0122 
0123 void __KisToolPencilLocalTool::addPathShape(KoPathShape* pathShape, bool closePath)
0124 {
0125     if (closePath) {
0126         pathShape->close();
0127         pathShape->normalize();
0128     }
0129 
0130     m_parentTool->addPathShape(pathShape, kundo2_i18n("Draw Freehand Path"));
0131 }
0132 
0133 void __KisToolPencilLocalTool::slotUpdatePencilCursor()
0134 {
0135     KoShapeStrokeSP stroke = this->createStroke();
0136     m_parentTool->updatePencilCursor(stroke && stroke->isVisible());
0137 }