DAWorkbench 0.0.1
DAWorkbench API
载入中...
搜索中...
未找到
DAAbstractNodeGraphicsItem.h
1#ifndef DAABSTRACTNODEGRAPHICSITEM_H
2#define DAABSTRACTNODEGRAPHICSITEM_H
3#include "DAWorkFlowAPI.h"
4#include <QAbstractGraphicsShapeItem>
5#include <QIcon>
6#include "DANodeMetaData.h"
7#include "DANodeLinkPoint.h"
8#include "DAGraphicsResizeableItem.h"
9#include "DAAbstractNode.h"
10class QDomDocument;
11class QDomElement;
12namespace DA
13{
14class DAAbstractNodeLinkGraphicsItem;
15class DANodeLinkPointDrawDelegate;
16class DAAbstractNodeWidget;
17class DANodePalette;
18
47{
48 Q_OBJECT
49 DA_DECLARE_PRIVATE(DAAbstractNodeGraphicsItem)
51 friend class DAAbstractNode;
52
53public:
54 enum
55 {
57 };
58 int type() const override
59 {
60 return (Type);
61 }
81
82public:
83 DAAbstractNodeGraphicsItem(DAAbstractNode* n, QGraphicsItem* p = nullptr);
85
86 DAAbstractNode* rawNode();
87 const DAAbstractNode* rawNode() const;
88 DAAbstractNode::SharedPointer node() const;
89 // 设置连接点的显示属性
90 void setLinkPointShowType(LinkPointShowType t);
91 LinkPointShowType getLinkPointShowType() const;
92 // 设置连接点的位置
93 void setLinkPointLocation(DANodeLinkPoint::Way way, LinkPointLocation l);
94 LinkPointLocation getLinkPointLocation(DANodeLinkPoint::Way way) const;
95 // 获取node的名字
96 QString getNodeName() const;
97 //
98
99 // 获取图标,图标是节点对应的图标
100 QIcon getIcon() const;
101 void setIcon(const QIcon& icon);
102
103 // 获取节点的元数据
104 const DANodeMetaData& metaData() const;
105 DANodeMetaData& metaData();
106
107 // 获取连接点
108 QList< DANodeLinkPoint > getLinkPoints() const;
109 QList< DANodeLinkPoint > getOutputLinkPoints() const;
110 QList< DANodeLinkPoint > getInputLinkPoints() const;
111
112 // 通过名字获取连接点
113 DANodeLinkPoint getLinkPoint(const QString& name) const;
114 DANodeLinkPoint getInputLinkPoint(const QString& name) const;
115 DANodeLinkPoint getOutputLinkPoint(const QString& name) const;
116 // 对linkpoint的属性设置,linkpoint 方向设置只会影响显示,不会影响工作流的链接
117 bool setLinkPointDirection(const QString& name, AspectDirection d);
118
119 // 判断是否存在连接点
120 bool isHaveLinkPoint(const DANodeLinkPoint& pl) const;
121 // 判断连接点是否已经链接
122 bool isLinkPointLinked(const DANodeLinkPoint& pl);
123 // 绘制连接点,在paintbody中调用此函数,用于绘制连接点
124 void paintLinkPoints(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget);
125
126 // 获取节点对应的窗口,一般保存节点的设置
127 virtual DAAbstractNodeWidget* getNodeWidget();
128
129 // palette设置
130 void setNodePalette(const DANodePalette& pl);
131 const DANodePalette& getNodePalette() const;
132
133 // 设置连接点绘制的代理,如果不设置会有一个默认代理
134 void setLinkPointDrawDelegate(DANodeLinkPointDrawDelegate* delegate);
135 DANodeLinkPointDrawDelegate* getLinkPointDrawDelegate() const;
136 // 通过位置获取linkpoint,如果没有返回一个invalid的DANodeLinkPoint
137 // 此函数作为虚函数,是scene判断是否点击到了链接点的关键函数,如果连接点是固定的
138 // 是不需要继承此函数的,但对于一些特殊的连接点(如不固定的)就需要通过此函数来获取
139 virtual DANodeLinkPoint getLinkPointByPos(const QPointF& p, DANodeLinkPoint::Way way = DANodeLinkPoint::Output) const;
140 // 更新连接点的位置,此函数一般在setbody之后更新点的位置
141 void updateLinkPointPos();
142 // 更新linkitem
143 void updateLinkItems();
144 // 显示连接点的文字
145 void showLinkPointText(bool on);
146 bool isShowLinkPointText() const;
147 // 获取当前链接上的LinkGraphicsItem
148 QList< DAAbstractNodeLinkGraphicsItem* > getLinkItems() const;
149 // 获取所有链接进来这个节点的连接线
150 QList< DAAbstractNodeLinkGraphicsItem* > getInputLinkItems() const;
151 // 获取这个节点链接出去的所有连接线
152 QList< DAAbstractNodeLinkGraphicsItem* > getOutputLinkItems() const;
153 // 获取所有链接到这个节点的节点
154 QList< DAAbstractNodeGraphicsItem* > getInputItems() const;
155 // 获取这个节点链接出去的所有节点
156 QList< DAAbstractNodeGraphicsItem* > getOutputItems() const;
157 // 获取输入的信息,把节点和连接点都获取到
158 QList< std::pair< DAAbstractNodeGraphicsItem*, DANodeLinkPoint > > getInputInfos() const;
159 // 获取输出的信息,把节点和连接点都获取到
160 QList< std::pair< DAAbstractNodeGraphicsItem*, DANodeLinkPoint > > getOutputInfos() const;
161 // 获取链接链路,上所有的item,这个链路如果有环,item不会重复出现,返回的链路不会包含自身
162 QList< DAAbstractNodeGraphicsItem* > getLinkChain() const;
163 // 获取输出链接链路,返回输出链路上所有的item,这个链路如果有环,item不会重复出现,返回的链路不会包含自身
164 QList< DAAbstractNodeGraphicsItem* > getOutPutLinkChain() const;
165 // 获取输出链接链路,返回输出链路上所有的item,这个链路如果有环,item不会重复出现,返回的链路不会包含自身
166 QList< DAAbstractNodeGraphicsItem* > getInPutLinkChain() const;
167 // 获取连接item
168 QList< DAAbstractNodeLinkGraphicsItem* > getLinkItem(const QString& name) const;
169 // 保存到xml中
170 virtual bool saveToXml(QDomDocument* doc, QDomElement* parentElement, const QVersionNumber& ver) const override;
171 virtual bool loadFromXml(const QDomElement* itemElement, const QVersionNumber& ver) override;
172 // 创建连接,继承此函数可以生成连接,如果返回nullptr,scene将不会进行连接
173 // 默认使用DAStandardNodeLinkGraphicsItem来进行连接的创建,如果需要自定义连接,可以继承此函数
174 // 返回的link无需attach,attach过程由scene负责
175 virtual DAAbstractNodeLinkGraphicsItem* createLinkItem(const DA::DANodeLinkPoint& lp);
176 // 从fromPoint链接到toItem的toPoint点,如果链接失败返回nullptr
177 virtual DAAbstractNodeLinkGraphicsItem* linkTo(const DA::DANodeLinkPoint& fromPoint,
179 const DA::DANodeLinkPoint& toPoint);
180 DAAbstractNodeLinkGraphicsItem* linkToByName(const QString& fromPointName,
182 const QString& toPointName);
183 virtual void setBodySize(const QSizeF& s) override;
184 // 重置连接点,此函数会自动调用generateLinkPoint,如果想自定义,重载此函数
185 // 如果重载了generateLinkPoint或changeLinkPointPos,在构造函数中调用此函数
186 void resetLinkPoint();
187
188 // 拖曳操作
189 // 是否接受DANodeMetaData拖曳在此节点上
190 virtual bool acceptDragOn(DANodeMetaData mime, const QPointF& scenePos);
191 // 释放DANodeMetaData操作
192 virtual bool drop(DANodeMetaData mime, const QPointF& scenePos);
193
194public:
195 // prepare系列函数,用于在改变前的回调
196 // 此函数是在准备调用getLinkPointByPos之前调用的函数,用来准备输入节点
197 // 准备链接回调,对于旧版的prepareLinkInput,prepareLinkOutput两个回调
198 virtual void tryLinkOnItemPos(const QPointF& p, DAAbstractNodeLinkGraphicsItem* linkItem, DANodeLinkPoint::Way way);
199 // 链接结束回调,对应旧版的prepareLinkInputFailed,prepareLinkInputSucceed,prepareLinkOutputFailed,prepareLinkOutputSucceed四个回调
200 virtual void finishLink(const DANodeLinkPoint& p,
203 bool isSuccess);
204 // 断开连接的回调,detach是针对已经连接上的断开
205 virtual void detachLink(const DANodeLinkPoint& p, DAAbstractNodeLinkGraphicsItem* linkItem, DANodeLinkPoint::Way way);
206 // 节点名字改变准备函数,通过此函数,让节点对名字进行重新绘制
207 virtual void prepareNodeNameChanged(const QString& name);
208 // 分组位置发生了变化
209 virtual void groupPositionChanged(const QPointF& pos) override;
210
211protected:
212 // 处理一些联动事件,如和FCAbstractNodeLinkGraphicsItem的联动
213 virtual QVariant itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant& value) override;
214
215 // 鼠标事件
216 virtual void mousePressEvent(QGraphicsSceneMouseEvent* event) override;
217 virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent* event) override;
218 virtual void hoverEnterEvent(QGraphicsSceneHoverEvent* event) override;
219 virtual void hoverMoveEvent(QGraphicsSceneHoverEvent* event) override;
220 virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent* event) override;
221 // 此函数在DAAbstractNodeLinkGraphicsItem的attachedTo/From过程中调用
222 bool recordLinkInfo(DAAbstractNodeLinkGraphicsItem* link, const DANodeLinkPoint& pl);
223
224 // 连接的link在销毁时调用,把item记录的link信息消除
225 bool removeLinkInfo(DAAbstractNodeLinkGraphicsItem* link, const DANodeLinkPoint& pl);
226
227 // 生成linkpoint,默认会把输入设置在左边,输出设置在右边,并生成一个举行的链接点
228 virtual QList< DANodeLinkPoint > generateLinkPoint() const;
229
230 // 有新的连接点加入
231 void addLinkPoint(const DANodeLinkPoint& lp);
232 // 更改连接点的信息,name是连接点名字,如果有重名,只修改第一个查找到的名字的连接点
233 void setLinkPoint(const QString& name, const DANodeLinkPoint& newLinkpoint);
234
235private:
236 void clearLinkData();
237 // 递归获取链接的原件
238 int getLinkChainRecursion(DAAbstractNodeGraphicsItem* item, QSet< DAAbstractNodeGraphicsItem* >& res) const;
239 // 递归获取链接的原件
240 void getOutLinkChainRecursion(DAAbstractNodeGraphicsItem* item, QSet< DAAbstractNodeGraphicsItem* >& res) const;
241 // 递归获取链接的原件
242 void getInLinkChainRecursion(DAAbstractNodeGraphicsItem* item, QSet< DAAbstractNodeGraphicsItem* >& res) const;
243};
244
245}
246#endif // FCNODEGRAPHICSITEM_H
这是节点的基类,workflow所有节点都继承此类 作为一个节点的QGraphicsItem,此item应该由DAAbstractNode创建
Definition DAAbstractNodeGraphicsItem.h:47
LinkPointShowType
连接点显示状态
Definition DAAbstractNodeGraphicsItem.h:66
@ LinkPointAlwayShow
一直显示
Definition DAAbstractNodeGraphicsItem.h:67
@ LinkPointShowOnHover
处于焦点或者选中才显示
Definition DAAbstractNodeGraphicsItem.h:68
LinkPointLocation
连接点的位置
Definition DAAbstractNodeGraphicsItem.h:75
@ LinkPointLocationOnRightSide
连接点位于右边(出口连接点默认右边)
Definition DAAbstractNodeGraphicsItem.h:78
@ LinkPointLocationOnTopSide
连接点位于上边
Definition DAAbstractNodeGraphicsItem.h:77
@ LinkPointLocationOnLeftSide
连接点位于左边(进口连接点默认左边)
Definition DAAbstractNodeGraphicsItem.h:76
绘制连接线的item
Definition DAAbstractNodeLinkGraphicsItem.h:20
FCNodeItem都可返回一个FCNodeWidget,用于设置node属性
Definition DAAbstractNodeWidget.h:16
节点对应的基类
Definition DAAbstractNode.h:50
用于调整大小的item
Definition DAGraphicsResizeableItem.h:48
linkpoint的绘制代理
Definition DANodeLinkPointDrawDelegate.h:18
用于表征连节点信息的数据
Definition DANodeLinkPoint.h:13
Way
节点的方法
Definition DANodeLinkPoint.h:19
保存节点元数据 节点元数据由工厂进行管理
Definition DANodeMetaData.h:16
节点相关的调色板,这里封装了节点相关的大部分颜色,
Definition DANodePalette.h:40
序列化类都是带异常的,使用中需要处理异常
Definition AppMainWindow.cpp:44
@ ItemType_GraphicsNodeItem
针对DANode的item
Definition DAWorkFlowAPI.h:25
AspectDirection
方向
Definition DAGraphicsViewGlobal.h:33