#pragma once #include #include #include #include #include #include "data_type.h" #include "dag_layout.h" namespace dags { enum class GraphNodeType { ActivePresentNode, PenetrateNode, TransitionCurve, }; class IGraphNode { public: virtual GraphNodeType nodeType() const = 0; virtual void highlight(bool mark) = 0; virtual bool isHighlighted() const = 0; virtual QRectF boundingRect() const = 0; virtual QPointF pos() const = 0; virtual void setPos(qreal x, qreal y) = 0; }; class __GraphNodeBase : public QGraphicsItem, public IGraphNode { private: GraphNodeType _node_type; bool _highlight_mark = false; public: __GraphNodeBase(GraphNodeType t); // Inherited via IGraphNode GraphNodeType nodeType() const override; void highlight(bool mark) override; bool isHighlighted() const override; QPointF pos() const override; void setPos(qreal x, qreal y) override; }; enum class PrsnType { StartNode, NormalNode, }; class ActivePresentNode : public __GraphNodeBase { private: PrsnType node_type = PrsnType::NormalNode; QString node_name; QFontMetricsF measure_base; public: ActivePresentNode(const QString name, PrsnType type, QFont font); QString nodeName() const; // 通过 QGraphicsItem 继承 QRectF boundingRect() const override; void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) override; }; class PenetrateNode : public __GraphNodeBase { private: QSizeF outline; QString from_name, to_name; public: PenetrateNode(double width, const QString &from, const QString &to); void resizeOutline(double width, double height); QString nodeFrom() const; QString nodeTo() const; // 通过 QGraphicsItem 继承 QRectF boundingRect() const override; void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) override; }; class TransitionCurve : public __GraphNodeBase { private: IGraphNode* start_node, * end_node; double prev_layer_w = 0; QRectF outline; public: TransitionCurve(IGraphNode* start, IGraphNode* end, double prev_layer_width); void layoutRefresh(); QString nodeFrom() const; QString nodeTo() const; // 通过 QGraphicsItem 继承 QRectF boundingRect() const override; void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) override; }; class DAGActiveView : public QGraphicsView { Q_OBJECT private: double layer_span = 200; double node_span = 10; QGraphicsScene scene_bind; QList highlight_nodelist; QList total_graph_nodes; signals: void nodeClicked(const QPointF &pos, const QList &node_name); public: DAGActiveView(QWidget* parent = nullptr); void updateWithEdges(QList arrows); void highlightGraphLink(const QList color_path); // QGraphicsView virtual void mousePressEvent(QMouseEvent *ev) override; private: QList layer_nodes_construction(const QHash>& prev_layer, const QList>& total_datas, int layer_idx = 0, double prev_layer_end = 0); }; };