Tue, 01 Mar 2022 17:00:19 +0200
work on edit history
#pragma once #include <QPainter> #include <QBrush> #include <QPen> #include "gl/partrenderer.h" #include "gl/gridprogram.h" #include "gl/axesprogram.h" #include "gl/vertexprogram.h" class Canvas : public PartRenderer { Q_OBJECT public: using OverpaintCallback = std::function<void(Canvas*, QPainter*)>; Canvas( Model* model, DocumentManager* documents, const ldraw::ColorTable& colorTable, QWidget* parent = nullptr); void clearSelection(); void addToSelection(ldraw::id_t id); void setOverpaintCallback(OverpaintCallback fn); void drawWorldPoint(QPainter* painter, const glm::vec3& worldPoint) const; void drawWorldPolygon(QPainter* painter, const std::vector<glm::vec3>& points); const std::optional<glm::vec3>& getWorldPosition() const; void adjustGridToView(); public Q_SLOTS: void handleSelectionChange(const QSet<ldraw::id_t>& selectedIds, const QSet<ldraw::id_t>& deselectedIds); void rebuildVertices(Document *document); protected: void mouseMoveEvent(QMouseEvent* event) override; void mousePressEvent(QMouseEvent* event) override; void mouseReleaseEvent(QMouseEvent* event) override; void initializeGL() override; void paintGL() override; Q_SIGNALS: void newStatusText(const QString& newStatusText); void selectionChanged(const QSet<ldraw::id_t>& newSelection); void mouseClick(Canvas* canvas, QMouseEvent* event); void mouseMove(Canvas* canvas, QMouseEvent* event); private: void setGridMatrix(const glm::mat4 &newMatrix); glm::vec3 cameraVector() const; bool isGridPerpendicularToScreen(float threshold) const; std::optional<GridProgram> gridProgram; std::optional<AxesProgram> axesProgram; std::optional<VertexProgram> vertexProgram; std::optional<glm::vec3> worldPosition; glm::mat4 gridMatrix; geom::Plane gridPlane; int totalMouseMove = 0; QSet<ldraw::id_t> selection; OverpaintCallback overpaintCallback = nullptr; };