#include "WindowAppBlockParallel.h"
#include "WindowAppItemInterface.h"
WindowAppBlockParallel::WindowAppBlockParallel(TOOL* pNewTool, POU* Pou, bool bShowOnly, QGraphicsObject* parent /*= nullptr*/)
: WindowAppBlockStandardBase(pNewTool, Pou, bShowOnly, parent)
, m_ParallelLineItem(nullptr)
{
//// 允许发送尺寸变更通知
//setFlag(QGraphicsItem::ItemSendsGeometryChanges);
// 响应鼠标悬停事件(重要,否则QGraphicsItem默认是不响应鼠标悬停事件的)
this->setAcceptHoverEvents(true);
// 更新矩形区域的尺寸
this->updateRect();
}
WindowAppBlockParallel::~WindowAppBlockParallel()
{
}
///
/// 添加接口(Parallel工具需要额外添加ToolInterface接口)
///
void WindowAppBlockParallel::addItemInterfaces()
{
// 添加标准接口
WindowAppBlockStandardBase::addItemInterfaces();
// 添加Tool接口
WindowAppBlockStandardBase::addItemToolInterfaces();
// 2022-8-23,首次添加时需要直接更新并行母线的位置,否则ToolEnd接口会按照默认形式显示
this->updateParallelLine();
}
///
/// 更新并行母线的位置
///
void WindowAppBlockParallel::updateParallelLine()
{
if (m_itemInterfaces.size() > 0)
{
m_itemInterfaces[PARALL_END_INF_INDX]->updatePostion();
}
}
///
/// 绘制并行控件
///
///
///
///
void WindowAppBlockParallel::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
// WindowAppBlockStandardBase::paint(painter, option, widget);
Q_UNUSED(option);
Q_UNUSED(widget);
painter->save();
painter->setRenderHint(QPainter::Antialiasing, true);
// 绘制边框
this->drawFrame(painter);
// 绘制功能块名字
WindowAppBlockStandardBase::DrawBlockTitle(painter, true);
// 绘制索引号
WindowAppBlockStandardBase::DrawIndex(painter);
painter->restore();
}
///
/// 功能块有变动时
///
///
///
///
QVariant WindowAppBlockParallel::itemChange(GraphicsItemChange change, const QVariant& value)
{
// 首先调用基类的函数
WindowAppBlockBase::itemChange(change, value);
// 移动完毕之后,更新并行母线的位置
if (change == QGraphicsItem::ItemPositionHasChanged && scene())
{
this->updateParallelLine();
}
return QGraphicsItem::itemChange(change, value);
}
///
/// 绘制边框
///
///
void WindowAppBlockParallel::drawFrame(QPainter* painter)
{
// 设置画笔
if (!this->isSelected())
{
painter->setPen(QPen(COLOR_FRAME_PARALLEL, PEN_WIDTH_FRAME));
}
else
{
painter->setPen(QPen(COLOR_FRAME_PARALLEL, PEN_WIDTH_FRAME_BOLD));
}
// 填充
painter->setBrush(COLOR_TBD_BG);
// 绘制边框
painter->drawRoundedRect(blockRect, 0, 0);
}
///
/// 更新矩形区域的尺寸
///
void WindowAppBlockParallel::updateRect()
{
// 计算高度
int blockHeight = PARA_BASIC_HEIGHT;
// 计算宽度
int blockWidth = PARA_BASIC_WIDTH;
// 主体矩形区域
blockRect.setRect(
-blockWidth / 2,
-blockHeight / 2,
blockWidth,
blockHeight
);
// 序号矩形区域
blockIndexRect.setRect(
blockRect.right() - TBD_INDEX_WIDTH,
blockRect.top() - TBD_INDEX_HEIGHT / 2,
TBD_INDEX_WIDTH,
TBD_INDEX_HEIGHT
);
// 总体矩形边界
blockBoundingRect.setRect(
blockRect.left(),
blockRect.top() - TBD_INDEX_HEIGHT / 2,
blockRect.width() + TBD_SHADOW_COUNT * PEN_LINE_WIDTH,
blockRect.height() + TBD_INDEX_HEIGHT / 2 + TBD_SHADOW_COUNT * PEN_LINE_WIDTH
);
}