File indexing completed on 2024-05-26 04:34:30

0001 /*
0002  *  SPDX-FileCopyrightText: 2007 Sven Langkamp <sven.langkamp@gmail.com>
0003  *  SPDX-FileCopyrightText: 2015 Michael Abrahams <miabraha@gmail.com>
0004  *
0005  *  SPDX-License-Identifier: GPL-2.0-or-later
0006  */
0007 
0008 #ifndef KIS_TOOL_SELECT_PATH_H_
0009 #define KIS_TOOL_SELECT_PATH_H_
0010 
0011 #include <KoCreatePathTool.h>
0012 #include <KisSelectionToolFactoryBase.h>
0013 #include "kis_tool_select_base.h"
0014 #include "kis_delegated_tool.h"
0015 
0016 #include <kis_icon.h>
0017 
0018 class KoCanvasBase;
0019 class KisToolSelectPath;
0020 
0021 
0022 class __KisToolSelectPathLocalTool : public KoCreatePathTool {
0023 public:
0024     __KisToolSelectPathLocalTool(KoCanvasBase *canvas, KisToolSelectPath *parentTool);
0025     void paintPath(KoPathShape &path, QPainter &painter, const KoViewConverter &converter) override;
0026     void addPathShape(KoPathShape* pathShape) override;
0027 
0028     using KoCreatePathTool::createOptionWidgets;
0029     using KoCreatePathTool::endPathWithoutLastPoint;
0030     using KoCreatePathTool::endPath;
0031     using KoCreatePathTool::cancelPath;
0032     using KoCreatePathTool::removeLastPoint;
0033 
0034 private:
0035     KisToolSelectPath* const m_selectionTool;
0036 
0037     void beginShape() override;
0038     void endShape() override;
0039 };
0040 
0041 typedef KisDelegatedTool<KisTool, __KisToolSelectPathLocalTool,
0042 DeselectShapesActivationPolicy> DelegatedSelectPathTool;
0043 
0044 struct KisDelegatedSelectPathWrapper : public DelegatedSelectPathTool {
0045     KisDelegatedSelectPathWrapper(KoCanvasBase *canvas,
0046                                   const QCursor &cursor,
0047                                   KoToolBase *delegateTool)
0048         : DelegatedSelectPathTool(canvas, cursor, dynamic_cast<__KisToolSelectPathLocalTool*>(delegateTool))
0049     {
0050         Q_ASSERT(dynamic_cast<__KisToolSelectPathLocalTool*>(delegateTool));
0051     }
0052 
0053     // If an event is explicitly forwarded only as an action (e.g. shift-click is captured by "change size")
0054     // we will receive a primary action but no mousePressEvent.  Thus these events must be explicitly forwarded.
0055     void beginPrimaryAction(KoPointerEvent *event) override;
0056     void continuePrimaryAction(KoPointerEvent *event) override;
0057     void endPrimaryAction(KoPointerEvent *event) override;
0058     void beginPrimaryDoubleClickAction(KoPointerEvent *event) override;
0059 
0060 
0061     void mousePressEvent(KoPointerEvent *event) override;
0062     void mouseMoveEvent(KoPointerEvent *event) override;
0063     void mouseReleaseEvent(KoPointerEvent *event) override;
0064     void mouseDoubleClickEvent(KoPointerEvent *event) override;
0065 };
0066 
0067 
0068 class KisToolSelectPath : public KisToolSelectBase<KisDelegatedSelectPathWrapper>
0069 {
0070     Q_OBJECT
0071 public:
0072     KisToolSelectPath(KoCanvasBase * canvas);
0073     bool eventFilter(QObject *obj, QEvent *event) override;
0074     void resetCursorStyle() override;
0075 
0076 protected:
0077     void requestStrokeCancellation() override;
0078     void requestStrokeEnd() override;
0079     friend class __KisToolSelectPathLocalTool;
0080     QList<QPointer<QWidget> > createOptionWidgets() override;
0081 };
0082 
0083 class KisToolSelectPathFactory : public KisSelectionToolFactoryBase
0084 {
0085 public:
0086     KisToolSelectPathFactory()
0087         : KisSelectionToolFactoryBase("KisToolSelectPath") {
0088         setToolTip(i18n("Bezier Curve Selection Tool"));
0089         setSection(ToolBoxSection::Select);
0090         setActivationShapeId(KRITA_TOOL_ACTIVATION_ID);
0091         setIconName(koIconNameCStr("tool_path_selection"));
0092         setPriority(6);
0093     }
0094 
0095     ~KisToolSelectPathFactory() override {}
0096 
0097     KoToolBase * createTool(KoCanvasBase *canvas) override {
0098         return new KisToolSelectPath(canvas);
0099     }
0100 
0101 
0102 };
0103 
0104 
0105 
0106 #endif // KIS_TOOL_SELECT_PATH_H_