#pragma once
#include "Common.h"
#include "CommonDraw.h"
///
/// 功能块图形的基类
///
class WindowAppItemInterface;
class POU;
class WindowAppBlockBase : public QGraphicsObject
{
Q_OBJECT
// 添加这一行,否则会出现警告:Warning: qobject_cast to QGraphicsItem will not work!
Q_INTERFACES(QGraphicsItem)
public:
WindowAppBlockBase(
TOOL* pTool,
POU* Pou,
bool bShowOnly,
QGraphicsObject* parent
);
// 本Block对应的Interface(绘图用)
QVector m_itemInterfaces;
// 添加接口(纯虚函数)
virtual void addItemInterfaces() = 0;
// 2022-6-22 查找某个InferfaceItem是否在本Block内
bool isInBlock(WindowAppItemInterface* infItem);
QRectF boundingRect() const override;
// 是否可以被删除(引用计数=0,且没有被Task使用)
bool couldBeDeleted();
protected:
void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) override;
// 显示右键菜单
void contextMenuEvent(QGraphicsSceneContextMenuEvent* event) override;
// 功能块有变动时
QVariant itemChange(GraphicsItemChange change, const QVariant& value) override;
// 鼠标左键按下
void mousePressEvent(QGraphicsSceneMouseEvent* event);
// 鼠标左键抬起
void mouseReleaseEvent(QGraphicsSceneMouseEvent* event);
signals:
// 功能块位置改变
void blockMoveSignal(QGraphicsItem* item);
protected:
// 绘制功能块
void DrawBlock(QPainter* painter);
// 绘制功能块阴影
void DrawBlockShadow(QPainter* painter);
// 更新ItemInterface的位置
void updateInterfacesPostion();
//// 更新单个Interface的位置
//void updateInterfacePostion(WindowAppItemInterface* pInfItem);
// 重绘所有的Interface
void redrawAllInterface();
// 初始化功能块的右键菜单
void createContextMenu();
// 返回本功能块的引用计数(所有接口引用计数之和)
int getRefCount();
// 2021-8-17 检查功能块位置(碰撞检测,限制移动范围)
QVariant checkPosition(const QVariant& value);
// 2021-8-17 处理碰撞判断
bool checkCollision();
// 2021-8-17 限制功能块在场景内
bool restrictBlockPos(QPointF curPos);
// 2022-10-4,删除当前功能块(统一功能块的删除入口)
void onDeleteItem();
public:
// 对应的工具数据信息
TOOL* m_toolInfo;
protected:
// 主体矩形区域
QRectF blockRect;
// 功能块的序号矩形区域
QRectF blockIndexRect;
// 边界矩形区域(未计算接口长度)
QRectF blockBoundingRect;
//// 总矩形区域(算上接口长度)
//QRectF blockTotalRect;
// 本工具所属的Pou
POU* m_pPou;
// 是否仅供展示使用(不提供右键菜单以及其他互动功能)
bool m_bShowOnly;
// 经过调整之后的功能块的位置(经过碰撞检测、边界检测后)
QPointF m_fixPos;
// 2022-10-2增加,功能块移动前的位置(用于执行Undo)
QPointF m_oldPos;
protected:
// 功能块的右键菜单
QMenu* contextMenu;
// 右键菜单对应的action
QAction* executeAction;
QAction* executeSubAction;
QAction* executeAllAction;
QAction* executeBreakPoint;
QAction* moveUpAction;
QAction* moveDownAction;
QAction* moveFirstAction;
QAction* moveLastAction;
QAction* deleteAction;
QAction* propertyAction;
QAction* copyBlockAction;
QAction* copyDataAction;
QAction* pasteAction;
};