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 }