File indexing completed on 2024-06-16 04:17:45

0001 /*
0002  *  SPDX-FileCopyrightText: 2007 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_path.h"
0009 #include <KoPathShape.h>
0010 #include <KoCanvasBase.h>
0011 #include <kis_cursor.h>
0012 #include <KisViewManager.h>
0013 #include <canvas/kis_canvas2.h>
0014 #include <kis_canvas_resource_provider.h>
0015 
0016 
0017 KisToolPath::KisToolPath(KoCanvasBase * canvas)
0018     : DelegatedPathTool(canvas, Qt::ArrowCursor,
0019                         new __KisToolPathLocalTool(canvas, this))
0020 {
0021     KisCanvas2 *kritaCanvas = dynamic_cast<KisCanvas2*>(canvas);
0022 
0023     connect(kritaCanvas->viewManager()->canvasResourceProvider(), SIGNAL(sigEffectiveCompositeOpChanged()), SLOT(resetCursorStyle()));
0024 
0025 }
0026 
0027 void KisToolPath::resetCursorStyle()
0028 {
0029     if (isEraser() && (nodePaintAbility() == PAINT)) {
0030         useCursor(KisCursor::eraserCursor());
0031     } else {
0032         DelegatedPathTool::resetCursorStyle();
0033     }
0034 
0035     overrideCursorIfNotEditable();
0036 }
0037 
0038 void KisToolPath::requestStrokeEnd()
0039 {
0040     localTool()->endPathWithoutLastPoint();
0041 }
0042 
0043 void KisToolPath::requestStrokeCancellation()
0044 {
0045     localTool()->cancelPath();
0046 }
0047 
0048 KisPopupWidgetInterface* KisToolPath::popupWidget()
0049 {
0050     return localTool()->pathStarted() ? nullptr : DelegatedPathTool::popupWidget();
0051 }
0052 
0053 void KisToolPath::mousePressEvent(KoPointerEvent *event)
0054 {
0055     Q_UNUSED(event)
0056 }
0057 
0058 // Install an event filter to catch right-click events.
0059 // The simplest way to accommodate the popup palette binding.
0060 // This code is duplicated in kis_tool_select_path.cc
0061 bool KisToolPath::eventFilter(QObject *obj, QEvent *event)
0062 {
0063     Q_UNUSED(obj);
0064     if (!localTool()->pathStarted()) {
0065         return false;
0066     }
0067     if (event->type() == QEvent::MouseButtonPress ||
0068             event->type() == QEvent::MouseButtonDblClick) {
0069         QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
0070         if (mouseEvent->button() == Qt::RightButton) {
0071             localTool()->removeLastPoint();
0072             return true;
0073         }
0074     } else if (event->type() == QEvent::TabletPress) {
0075         QTabletEvent *tabletEvent = static_cast<QTabletEvent*>(event);
0076         if (tabletEvent->button() == Qt::RightButton) {
0077             localTool()->removeLastPoint();
0078             return true;
0079         }
0080     }
0081     return false;
0082 }
0083 
0084 void KisToolPath::beginAlternateAction(KoPointerEvent *event, AlternateAction action) {
0085     DelegatedPathTool::beginAlternateAction(event, action);
0086     if (!nodeEditable()) return;
0087 
0088     if (nodePaintAbility() == KisToolPath::MYPAINTBRUSH_UNPAINTABLE) {
0089         KisCanvas2 * kiscanvas = static_cast<KisCanvas2*>(canvas());
0090         QString message = i18n("The MyPaint Brush Engine is not available for this colorspace");
0091         kiscanvas->viewManager()->showFloatingMessage(message, koIcon("object-locked"));
0092         event->ignore();
0093         return;
0094     }
0095 }
0096 
0097 void KisToolPath::beginPrimaryAction(KoPointerEvent* event)
0098 {
0099     if (!nodeEditable()) return;
0100     DelegatedPathTool::mousePressEvent(event);
0101 }
0102 
0103 void KisToolPath::continuePrimaryAction(KoPointerEvent *event)
0104 {
0105     mouseMoveEvent(event);
0106 }
0107 
0108 void KisToolPath::endPrimaryAction(KoPointerEvent *event)
0109 {
0110     mouseReleaseEvent(event);
0111 }
0112 
0113 void KisToolPath::beginPrimaryDoubleClickAction(KoPointerEvent *event)
0114 {
0115     DelegatedPathTool::mouseDoubleClickEvent(event);
0116 }
0117 
0118 QList<QPointer<QWidget> > KisToolPath::createOptionWidgets()
0119 {
0120     QList<QPointer<QWidget> > widgets = DelegatedPathTool::createOptionWidgets();
0121     return widgets;
0122 }
0123 
0124 
0125 __KisToolPathLocalTool::__KisToolPathLocalTool(KoCanvasBase * canvas, KisToolPath* parentTool)
0126     : KoCreatePathTool(canvas)
0127     , m_parentTool(parentTool) {}
0128 
0129 void __KisToolPathLocalTool::paintPath(KoPathShape &pathShape, QPainter &painter, const KoViewConverter &converter)
0130 {
0131     Q_UNUSED(converter);
0132 
0133     QTransform matrix;
0134     matrix.scale(m_parentTool->image()->xRes(), m_parentTool->image()->yRes());
0135     matrix.translate(pathShape.position().x(), pathShape.position().y());
0136     m_parentTool->paintToolOutline(&painter, m_parentTool->pixelToView(matrix.map(pathShape.outline())));
0137 }
0138 
0139 void __KisToolPathLocalTool::addPathShape(KoPathShape* pathShape)
0140 {
0141     if (!KoCreatePathTool::tryMergeInPathShape(pathShape)) {
0142         m_parentTool->addPathShape(pathShape, kundo2_i18n("Draw Bezier Curve"));
0143     }
0144 }