#pragma once #include class QMimeData; namespace diag { class DiagramScene; // Canvas view: draws the rectangular grid, zooms with Ctrl+wheel (anchored // under the cursor), pans with the middle mouse button, rubber-band selects, // and accepts node-type drops from the palette. class GridView : public QGraphicsView { Q_OBJECT public: static constexpr const char* kNodeTypeMime = "application/x-diag-nodetype"; explicit GridView(DiagramScene* scene, QWidget* parent = nullptr); void zoomIn(); void zoomOut(); void zoomReset(); void zoomToFit(); double zoomFactor() const; // Decodes a node-type mime payload and drops it at the viewport position; // returns true when a node was created. Called from dropEvent. bool handleNodeTypeDrop(const QMimeData* mime, QPoint viewportPos); signals: void zoomChanged(double factor); void cursorMoved(QPointF scenePos); protected: void drawBackground(QPainter* painter, const QRectF& rect) override; void wheelEvent(QWheelEvent* event) override; void mousePressEvent(QMouseEvent* event) override; void mouseMoveEvent(QMouseEvent* event) override; void mouseReleaseEvent(QMouseEvent* event) override; void dragEnterEvent(QDragEnterEvent* event) override; void dragMoveEvent(QDragMoveEvent* event) override; void dropEvent(QDropEvent* event) override; private: void applyZoom(double factor); DiagramScene* m_scene; bool m_panning = false; QPoint m_panStart; }; } // namespace diag