File indexing completed on 2024-06-23 04:28:07

0001 /*
0002  *  kis_tool_line.h - part of Krayon
0003  *
0004  *  SPDX-FileCopyrightText: 2000 John Califf <jcaliff@comuzone.net>
0005  *  SPDX-FileCopyrightText: 2002 Patrick Julien <freak@codepimps.org>
0006  *  SPDX-FileCopyrightText: 2004 Boudewijn Rempt <boud@valdyas.org>
0007  *
0008  *  SPDX-License-Identifier: GPL-2.0-or-later
0009  */
0010 
0011 #ifndef KIS_TOOL_LINE_H_
0012 #define KIS_TOOL_LINE_H_
0013 
0014 #include "kis_tool_shape.h"
0015 
0016 #include <kconfig.h>
0017 #include <kconfiggroup.h>
0018 #include <QScopedPointer>
0019 #include <kis_global.h>
0020 #include <kis_types.h>
0021 #include <KisToolPaintFactoryBase.h>
0022 #include <flake/kis_node_shape.h>
0023 #include <kis_signal_compressor.h>
0024 #include <kis_icon.h>
0025 #include <KoIcon.h>
0026 
0027 class QPoint;
0028 class KoCanvasBase;
0029 class QCheckBox;
0030 class KisPaintingInformationBuilder;
0031 class KisToolLineHelper;
0032 
0033 
0034 class KisToolLine : public KisToolShape
0035 {
0036     Q_OBJECT
0037 
0038 public:
0039     KisToolLine(KoCanvasBase * canvas);
0040     ~KisToolLine() override;
0041 
0042     void requestStrokeCancellation() override;
0043     void requestStrokeEnd() override;
0044 
0045     void beginPrimaryAction(KoPointerEvent *event) override;
0046     void continuePrimaryAction(KoPointerEvent *event) override;
0047     void endPrimaryAction(KoPointerEvent *event) override;
0048     void activate(const QSet<KoShape*> &shapes) override;
0049     void deactivate() override;
0050     bool primaryActionSupportsHiResEvents() const override;
0051 
0052     void paint(QPainter& gc, const KoViewConverter &converter) override;
0053 
0054     QString quickHelp() const override;
0055 
0056     bool supportsPaintingAssistants() const override;
0057 
0058 protected Q_SLOTS:
0059     void resetCursorStyle() override;
0060 
0061 private Q_SLOTS:
0062     void updateStroke();
0063     void setUseSensors(bool value);
0064     void setShowPreview(bool value);
0065     void setShowGuideline(bool value);
0066     void setSnapToAssistants(bool value);
0067     void setSnapEraser(bool value);
0068 
0069 
0070 private:
0071     void paintLine(QPainter& gc, const QRect& rc);
0072     QPointF straightLine(QPointF point);
0073     QPointF snapToAssistants(QPointF point);
0074     void updateGuideline();
0075     void showSize();
0076     void updatePreviewTimer(bool showGuide);
0077     QWidget* createOptionWidget() override;
0078 
0079     void endStroke();
0080     void cancelStroke();
0081 
0082 private:
0083     bool m_showGuideline {true};
0084 
0085     QPointF m_startPoint; // start point to use when painting (after the line was snapped to assistant already)
0086     QPointF m_endPoint;
0087     QPointF m_originalStartPoint; // original starting point (to use when searching for suitable assistant)
0088     QPointF m_lastUpdatedPoint;
0089 
0090     bool m_strokeIsRunning {false};
0091 
0092 
0093     QCheckBox *m_chkUseSensors {nullptr};
0094     QCheckBox *m_chkShowPreview {nullptr};
0095     QCheckBox *m_chkShowGuideline {nullptr};
0096     QCheckBox *m_chkSnapToAssistants {nullptr};
0097     QCheckBox *m_chkSnapEraser {nullptr};
0098 
0099     QScopedPointer<KisPaintingInformationBuilder> m_infoBuilder;
0100     QScopedPointer<KisToolLineHelper> m_helper;
0101     KisSignalCompressor m_strokeUpdateCompressor;
0102     KisSignalCompressor m_longStrokeUpdateCompressor;
0103 
0104     KConfigGroup configGroup;
0105 };
0106 
0107 
0108 class KisToolLineFactory : public KisToolPaintFactoryBase
0109 {
0110 
0111 public:
0112 
0113     KisToolLineFactory()
0114             : KisToolPaintFactoryBase("KritaShape/KisToolLine") {
0115         setToolTip(i18n("Line Tool"));
0116         // Temporarily
0117         setSection(ToolBoxSection::Shape);
0118         setActivationShapeId(KRITA_TOOL_ACTIVATION_ID);
0119         setPriority(1);
0120         setIconName(koIconNameCStr("krita_tool_line"));
0121     }
0122 
0123     ~KisToolLineFactory() override {}
0124 
0125     KoToolBase * createTool(KoCanvasBase *canvas) override {
0126         return new KisToolLine(canvas);
0127     }
0128 
0129 };
0130 
0131 
0132 
0133 
0134 #endif //KIS_TOOL_LINE_H_