#include "WindowAppItemRefLine.h"
#include "../Common/Utility.h"
///
/// 按照对应的参考线信息生成LineItem
///
///
WindowAppItemRefLine::WindowAppItemRefLine(const UI_REFLINE_INFO& lineInfo):
m_refLineInfo(lineInfo)
{
}
///
/// 绘制线条
///
///
///
///
void WindowAppItemRefLine::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget /*= nullptr*/)
{
Q_UNUSED(option);
Q_UNUSED(widget);
// 计算最新的起点和终点
QPoint startPt, endPt;
this->calcLineVertex(m_refLineInfo.srcWidget, m_refLineInfo.dstWidget, startPt, endPt);
// 设置连接线条
this->setLine(QLine(startPt, endPt));
// qDebug() << "WindowAppUiRefLine::paint - DrawRefLine - " << QLine(startPt, endPt);
painter->setRenderHint(QPainter::Antialiasing, true);
painter->save();
// 虚线
painter->setPen(QPen(COLOR_REFLINE, PEN_LINE_WIDTH, Qt::DashLine));
// 绘制线条
painter->drawLine(line());
painter->restore();
}
///
/// 根据最新的控件位置信息,计算当前参考线中的起点和终点信息(方向为从上到下,从左到右)
///
///
///
void WindowAppItemRefLine::calcLineVertex(
QWidget* srcWidget,
QWidget* dstWidget,
_Out_ QPoint& startPoint,
_Out_ QPoint& endPoint
)
{
// 竖线
if (m_refLineInfo.srcSide == SIDE_DIRECTION::SIDE_LEFT
|| m_refLineInfo.srcSide == SIDE_DIRECTION::SIDE_RIGHT)
{
QLine srcLine = Utility::getSideLineByID(srcWidget, (short)m_refLineInfo.srcSide);
QLine dstLine = Utility::getSideLineByID(dstWidget, (short)m_refLineInfo.dstSide);
// 取Y值最小的点作为起点(从上到下)
// 起点边位于终点边下侧或者重合
if (srcLine.p2().y() >= dstLine.p1().y())
{
startPoint = dstLine.p1();
endPoint = srcLine.p2();
}
// 起点边位于终点边上侧
else
{
startPoint = srcLine.p1();
endPoint = dstLine.p2();
}
// 上下都需要额外加上延长线
startPoint.setY(startPoint.y() - REFLINE_EXTENSION_LEN);
endPoint.setY(endPoint.y() + REFLINE_EXTENSION_LEN);
}
// 横线
else
{
QLine srcLine = Utility::getSideLineByID(srcWidget, (short)m_refLineInfo.srcSide);
QLine dstLine = Utility::getSideLineByID(dstWidget, (short)m_refLineInfo.dstSide);
// 取X值最小的点作为起点(从左到右)
// 起点边位于终点边右侧或者重合
if (srcLine.p2().x() >= dstLine.p1().x())
{
startPoint = dstLine.p1();
endPoint = srcLine.p2();
}
// 起点边位于终点边左侧
else
{
startPoint = srcLine.p1();
endPoint = dstLine.p2();
}
// 上下都需要额外加上延长线
startPoint.setX(startPoint.x() - REFLINE_EXTENSION_LEN);
endPoint.setX(endPoint.x() + REFLINE_EXTENSION_LEN);
}
}