File indexing completed on 2024-04-28 15:52:04

0001 // SPDX-FileCopyrightText: 2021 Carl Schwan <carlschwan@kde.org>
0002 //
0003 // SPDX-License-Identifier: LGPL-2.1-or-later
0004 
0005 #pragma once
0006 
0007 #include <QQuickItem>
0008 #include <QTime>
0009 #include <tessellation.rs.h>
0010 #include <QList>
0011 #include <QCursor>
0012 #include <optional>
0013 #include <QPainterPath>
0014 
0015 class DrawEvent
0016 {
0017 public:
0018     DrawEvent()
0019         : penWidth(10)
0020         , penColor(Qt::black)
0021         , fill(false)
0022     {
0023     }
0024 
0025     DrawEvent(float width, const QColor& color)
0026         : penWidth(width)
0027         , penColor(color)
0028         , fill(false)
0029     {
0030     }
0031 
0032     void lineTo(const QPoint& pos)
0033     {
0034         path.lineTo(pos);
0035     }
0036 
0037     float penWidth;
0038     QColor penColor;
0039     QPainterPath path;
0040     bool fill;
0041 };
0042 
0043 /**
0044  * @class DrawingArea
0045  * @brief The document view
0046  * 
0047  * This @c QQuickItem should be used in a @c Scene only.
0048  */
0049 class DrawingArea : public QQuickItem
0050 {
0051     Q_OBJECT
0052 
0053     Q_PROPERTY(QColor penColor READ penColor WRITE setPenColor NOTIFY penColorChanged)
0054     Q_PROPERTY(float penWidth READ penWidth WRITE setPenWidth NOTIFY penWidthChanged)
0055     Q_PROPERTY(bool canUndo READ canUndo NOTIFY canUndoChanged)
0056     Q_PROPERTY(Tool tool READ tool WRITE setTool NOTIFY toolChanged)
0057 
0058 public:
0059     enum Tool {
0060         Drawing,
0061         Rectangle,
0062         Circle,
0063     };
0064     Q_ENUM(Tool);
0065 
0066     explicit DrawingArea(QQuickItem *parent = nullptr);
0067     ~DrawingArea();
0068 
0069     Q_INVOKABLE void saveSvg(const QUrl &file);
0070 
0071     QColor penColor() const;
0072     void setPenColor(const QColor &color);
0073 
0074     double penWidth() const;
0075     void setPenWidth(double penWidth);
0076 
0077     Tool tool() const;
0078     void setTool(Tool tool);
0079 
0080     bool canUndo() const;
0081 
0082     void mouseReleaseEvent(QMouseEvent* e) override;
0083     void mouseMoveEvent(QMouseEvent* e) override;
0084     void mousePressEvent(QMouseEvent* e) override;
0085 
0086 public Q_SLOTS:
0087     void undo();
0088 
0089 Q_SIGNALS:
0090     void penColorChanged();
0091     void penWidthChanged();
0092     void canUndoChanged();
0093     void toolChanged();
0094 
0095 protected:
0096     QSGNode *updatePaintNode(QSGNode *, QQuickItem::UpdatePaintNodeData *) override;
0097 
0098 private:
0099     DrawEvent &currentDrawEvent();
0100     void ensureNewDrawEvent();
0101 
0102     QSGNode *createRootNode();
0103     QColor m_penColor;
0104     double m_penWidth = 4;
0105 
0106     bool m_needUpdate;
0107     QList<DrawEvent> m_drawEventList;
0108     QCursor m_drawCursor;
0109     QPoint m_lastPoint;
0110     QTime m_drawEventCreationTime;
0111     int m_eventIndex;
0112     bool m_drawing;
0113     int m_lastNumberOfEvent;
0114     Tool m_tool = Tool::Drawing;
0115 };