src/ui/canvas.h

changeset 191
d355d4c52d51
parent 188
64ea7282611e
child 197
0e729e681a2c
equal deleted inserted replaced
190:3dbdc243f053 191:d355d4c52d51
5 #include "gl/partrenderer.h" 5 #include "gl/partrenderer.h"
6 #include "gl/gridprogram.h" 6 #include "gl/gridprogram.h"
7 #include "gl/axesprogram.h" 7 #include "gl/axesprogram.h"
8 #include "gl/vertexprogram.h" 8 #include "gl/vertexprogram.h"
9 9
10 enum EditingMode
11 {
12 SelectMode,
13 DrawMode
14 };
15
16 struct DrawState
17 {
18 std::vector<glm::vec3> polygon;
19 std::vector<glm::vec3> previewPolygon;
20 glm::vec3 previewPoint;
21 bool isconcave = false;
22 };
23
10 class Canvas : public PartRenderer 24 class Canvas : public PartRenderer
11 { 25 {
12 Q_OBJECT 26 Q_OBJECT
13 public: 27 public:
14 using OverpaintCallback = std::function<void(Canvas*, QPainter*)>; 28 using OverpaintCallback = std::function<void(Canvas*, QPainter*)>;
15 Canvas( 29 Canvas(
16 Model* model, 30 Model* model,
31 Document* document,
17 DocumentManager* documents, 32 DocumentManager* documents,
18 const ldraw::ColorTable& colorTable, 33 const ldraw::ColorTable& colorTable,
19 QWidget* parent = nullptr); 34 QWidget* parent = nullptr);
20 void clearSelection(); 35 void clearSelection();
21 void addToSelection(ldraw::id_t id); 36 void addToSelection(ldraw::id_t id);
22 void setOverpaintCallback(OverpaintCallback fn); 37 void setOverpaintCallback(OverpaintCallback fn);
23 void drawWorldPoint(QPainter* painter, const glm::vec3& worldPoint) const; 38 void drawWorldPoint(QPainter* painter, const glm::vec3& worldPoint) const;
24 void drawWorldPolyline(QPainter* painter, const std::vector<glm::vec3>& points); 39 void drawWorldPolyline(QPainter* painter, const std::vector<glm::vec3>& points);
25 void drawWorldPolygon(QPainter* painter, const std::vector<glm::vec3>& points); 40 void drawWorldPolygon(QPainter* painter, const std::vector<glm::vec3>& points);
26 Winding worldPolygonWinding(const std::vector<glm::vec3>& points) const; 41 Winding worldPolygonWinding(const std::vector<glm::vec3>& points) const;
27 const std::optional<glm::vec3>& getWorldPosition() const; 42 const std::optional<glm::vec3>& getWorldPosition() const;
28 void adjustGridToView();
29 const QSet<ldraw::id_t> selectedObjects() const; 43 const QSet<ldraw::id_t> selectedObjects() const;
30 const glm::mat4& getGridMatrix() const; 44 const glm::mat4& getGridMatrix() const;
45 void closeShape();
46 glm::vec3 cameraVector() const;
47 DrawState drawState;
48 EditingMode mode = SelectMode;
31 public Q_SLOTS: 49 public Q_SLOTS:
32 void handleSelectionChange(const QSet<ldraw::id_t>& selectedIds, const QSet<ldraw::id_t>& deselectedIds); 50 void handleSelectionChange(const QSet<ldraw::id_t>& selectedIds, const QSet<ldraw::id_t>& deselectedIds);
33 void rebuildVertices(Document *document); 51 void rebuildVertices(Document *document);
34 void setGridMatrix(const glm::mat4 &newMatrix); 52 void setGridMatrix(const glm::mat4 &newMatrix);
35 protected: 53 protected:
36 void mouseMoveEvent(QMouseEvent* event) override; 54 void mouseMoveEvent(QMouseEvent* event) override;
37 void mousePressEvent(QMouseEvent* event) override; 55 void mousePressEvent(QMouseEvent* event) override;
38 void mouseReleaseEvent(QMouseEvent* event) override; 56 void mouseReleaseEvent(QMouseEvent* event) override;
39 void initializeGL() override; 57 void initializeGL() override;
42 void newStatusText(const QString& newStatusText); 60 void newStatusText(const QString& newStatusText);
43 void selectionChanged(const QSet<ldraw::id_t>& newSelection); 61 void selectionChanged(const QSet<ldraw::id_t>& newSelection);
44 void mouseClick(Canvas* canvas, QMouseEvent* event); 62 void mouseClick(Canvas* canvas, QMouseEvent* event);
45 void mouseMove(Canvas* canvas, QMouseEvent* event); 63 void mouseMove(Canvas* canvas, QMouseEvent* event);
46 private: 64 private:
47 glm::vec3 cameraVector() const;
48 bool isGridPerpendicularToScreen(float threshold) const; 65 bool isGridPerpendicularToScreen(float threshold) const;
49 QVector<QPointF> convertWorldPointsToScreenPoints(const std::vector<glm::vec3>& worldPoints) const; 66 QVector<QPointF> convertWorldPointsToScreenPoints(const std::vector<glm::vec3>& worldPoints) const;
50 Q_SLOT void updateCanvasRenderPreferences(); 67 Q_SLOT void updateCanvasRenderPreferences();
51 void renderAxesLabels(QPainter& painter); 68 void renderAxesLabels(QPainter& painter);
52 std::optional<GridProgram> gridProgram; 69 std::optional<GridProgram> gridProgram;
57 geom::Plane gridPlane; 74 geom::Plane gridPlane;
58 int totalMouseMove = 0; 75 int totalMouseMove = 0;
59 bool isDark = true; 76 bool isDark = true;
60 QSet<ldraw::id_t> selection; 77 QSet<ldraw::id_t> selection;
61 OverpaintCallback overpaintCallback = nullptr; 78 OverpaintCallback overpaintCallback = nullptr;
79 Document* document;
62 }; 80 };
81
82 void adjustGridToView(Canvas* canvas);

mercurial