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 ¤tDrawEvent(); 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 };