File indexing completed on 2025-02-02 04:22:31

0001 /*
0002  *
0003  *  SPDX-FileCopyrightText: 2007 Sven Langkamp <sven.langkamp@gmail.com>
0004  *
0005  *  SPDX-License-Identifier: GPL-2.0-or-later
0006  */
0007 
0008 #ifndef KIS_TOOL_MEASURE_H_
0009 #define KIS_TOOL_MEASURE_H_
0010 
0011 #include <QLabel>
0012 
0013 #include <KoUnit.h>
0014 
0015 #include "kis_tool.h"
0016 #include "kis_global.h"
0017 #include "kis_types.h"
0018 #include "KoToolFactoryBase.h"
0019 #include "flake/kis_node_shape.h"
0020 #include <kis_icon.h>
0021 
0022 #include <QVector2D>
0023 
0024 class QPointF;
0025 class QWidget;
0026 class QVector2D;
0027 
0028 class KoCanvasBase;
0029 
0030 
0031 class KisToolMeasureOptionsWidget : public QWidget
0032 {
0033     Q_OBJECT
0034 
0035 public:
0036     KisToolMeasureOptionsWidget(QWidget* parent, KisImageWSP image);
0037 
0038 public Q_SLOTS:
0039     void slotSetDistance(double distance);
0040     void slotSetAngle(double angle);
0041     void slotUnitChanged(int index);
0042     void slotResolutionChanged(double xRes, double yRes);
0043 
0044 private:
0045     void updateDistance();
0046 
0047     QLabel* m_angleLabel {nullptr};
0048     double m_distance {0.0};
0049 public:
0050     QLabel* m_distanceLabel {nullptr};
0051     double m_resolution;
0052     KoUnit m_unit;
0053 };
0054 
0055 class KisToolMeasure : public KisTool
0056 {
0057 
0058     Q_OBJECT
0059 
0060 public:
0061     KisToolMeasure(KoCanvasBase * canvas);
0062     ~KisToolMeasure() override;
0063 
0064     void beginPrimaryAction(KoPointerEvent *event) override;
0065     void continuePrimaryAction(KoPointerEvent *event) override;
0066     void endPrimaryAction(KoPointerEvent *event) override;
0067     void showDistanceAngleOnCanvas();
0068 
0069     QPointF lockedAngle(QPointF pos);
0070 
0071     void paint(QPainter& gc, const KoViewConverter &converter) override;
0072 
0073     QWidget * createOptionWidget() override;
0074 
0075 Q_SIGNALS:
0076     void sigDistanceChanged(double distance);
0077     void sigAngleChanged(double angle);
0078 
0079 private:
0080     QRectF boundingRect();
0081     double angle();
0082     double distance();
0083 
0084 private:
0085     KisToolMeasureOptionsWidget *m_optionsWidget {nullptr};
0086 
0087     QPointF m_startPos {QPointF(0, 0)};
0088     QPointF m_endPos {QPointF(0, 0)}; 
0089     QVector2D m_baseLineVec {QPointF(1, 0)};
0090     bool m_chooseBaseLineVec {false};
0091 };
0092 
0093 
0094 class KisToolMeasureFactory : public KoToolFactoryBase
0095 {
0096 
0097 public:
0098 
0099     KisToolMeasureFactory()
0100             : KoToolFactoryBase("KritaShape/KisToolMeasure") {
0101         setSection(ToolBoxSection::View);
0102         setToolTip(i18n("Measure Tool"));
0103         setIconName(koIconNameCStr("krita_tool_measure"));
0104         setPriority(1);
0105         setActivationShapeId(KRITA_TOOL_ACTIVATION_ID);
0106     }
0107 
0108     ~KisToolMeasureFactory() override {}
0109 
0110     KoToolBase * createTool(KoCanvasBase *canvas) override {
0111         return new KisToolMeasure(canvas);
0112     }
0113 
0114 };
0115 
0116 
0117 
0118 
0119 #endif //KIS_TOOL_MEASURE_H_