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 }