Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_tool_path.cc
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2007 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_path.h"
9#include <KoPathShape.h>
10#include <KoCanvasBase.h>
11#include <kis_cursor.h>
12#include <KisViewManager.h>
13#include <canvas/kis_canvas2.h>
15
16
18 : DelegatedPathTool(canvas, Qt::ArrowCursor,
19 new __KisToolPathLocalTool(canvas, this))
20{
21 setIsOpacityPresetMode(true);
22 KisCanvas2 *kritaCanvas = dynamic_cast<KisCanvas2*>(canvas);
23
24 connect(kritaCanvas->viewManager()->canvasResourceProvider(), SIGNAL(sigEffectiveCompositeOpChanged()), SLOT(resetCursorStyle()));
25
26}
27
29{
30 if (isEraser() && (nodePaintAbility() == PAINT)) {
31 useCursor(KisCursor::eraserCursor());
32 } else {
33 DelegatedPathTool::resetCursorStyle();
34 }
35
36 overrideCursorIfNotEditable();
37}
38
40{
41 localTool()->endPathWithoutLastPoint();
42}
43
45{
46 localTool()->cancelPath();
47}
48
50{
51 return localTool()->pathStarted() ? nullptr : DelegatedPathTool::popupWidget();
52}
53
55{
56 Q_UNUSED(event)
57}
58
59// Install an event filter to catch right-click events.
60// The simplest way to accommodate the popup palette binding.
61// This code is duplicated in kis_tool_select_path.cc
62bool KisToolPath::eventFilter(QObject *obj, QEvent *event)
63{
64 Q_UNUSED(obj);
65 if (!localTool()->pathStarted()) {
66 return false;
67 }
68 if (event->type() == QEvent::MouseButtonPress ||
69 event->type() == QEvent::MouseButtonDblClick) {
70 QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
71 if (mouseEvent->button() == Qt::RightButton) {
72 localTool()->removeLastPoint();
73 return true;
74 }
75 } else if (event->type() == QEvent::TabletPress) {
76 QTabletEvent *tabletEvent = static_cast<QTabletEvent*>(event);
77 if (tabletEvent->button() == Qt::RightButton) {
78 localTool()->removeLastPoint();
79 return true;
80 }
81 }
82 return false;
83}
84
85void KisToolPath::beginAlternateAction(KoPointerEvent *event, AlternateAction action) {
86 DelegatedPathTool::beginAlternateAction(event, action);
87 if (!nodeEditable()) return;
88
89 if (nodePaintAbility() == KisToolPath::MYPAINTBRUSH_UNPAINTABLE) {
90 KisCanvas2 * kiscanvas = static_cast<KisCanvas2*>(canvas());
91 QString message = i18n("The MyPaint Brush Engine is not available for this colorspace");
92 kiscanvas->viewManager()->showFloatingMessage(message, koIcon("object-locked"));
93 event->ignore();
94 return;
95 }
96}
97
99{
100 if (!nodeEditable()) return;
102}
103
108
113
118
124
125
127 : KoCreatePathTool(canvas)
128 , m_parentTool(parentTool) {
130}
131
132void __KisToolPathLocalTool::paintPath(KoPathShape &pathShape, QPainter &painter, const KoViewConverter &converter)
133{
134 Q_UNUSED(converter);
135
136 QTransform matrix;
137 matrix.scale(m_parentTool->image()->xRes(), m_parentTool->image()->yRes());
138 matrix.translate(pathShape.position().x(), pathShape.position().y());
139 m_parentTool->paintToolOutline(&painter, m_parentTool->pixelToView(matrix.map(pathShape.outline())));
140}
141
143{
145 m_parentTool->addPathShape(pathShape, kundo2_i18n("Draw Bezier Curve"));
146 }
147}
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
void mouseDoubleClickEvent(KoPointerEvent *event) override
DelegateTool * localTool() const
The PopupWidgetInterface abstract class defines the basic interface that will be used by all popup wi...
void requestStrokeCancellation() override
bool eventFilter(QObject *obj, QEvent *event) override
void resetCursorStyle() override
void beginPrimaryDoubleClickAction(KoPointerEvent *event) override
void mousePressEvent(KoPointerEvent *event) override
KisToolPath(KoCanvasBase *canvas)
void endPrimaryAction(KoPointerEvent *event) override
KisPopupWidgetInterface * popupWidget() override
void requestStrokeEnd() override
void beginPrimaryAction(KoPointerEvent *event) override
void beginAlternateAction(KoPointerEvent *event, AlternateAction action) override
void continuePrimaryAction(KoPointerEvent *event) override
QList< QPointer< QWidget > > createOptionWidgets() 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
bool tryMergeInPathShape(KoPathShape *pathShape)
The position of a path point within a path shape.
Definition KoPathShape.h:63
QPainterPath outline() const override
reimplemented
QPointF position() const
Get the position of the shape in pt.
Definition KoShape.cpp:825
void setIsOpacityPresetMode(bool value)
void addPathShape(KoPathShape *pathShape) override
KisToolPath *const m_parentTool
__KisToolPathLocalTool(KoCanvasBase *canvas, KisToolPath *parentTool)
void paintPath(KoPathShape &path, QPainter &painter, const KoViewConverter &converter) override
#define koIcon(name)
Use these macros for icons without any issues.
Definition kis_icon.h:25
KUndo2MagicString kundo2_i18n(const char *text)