#include "WindowAppRefLineManager.h"
#include "WindowAppUiScene.h"
WindowAppRefLineManager::WindowAppRefLineManager() :
m_pScene(nullptr)
{
}
///
/// 根据两个Widget控件的关系,处理对应的参考线效果
///
///
///
void WindowAppRefLineManager::check(QWidget* srcWidget, QWidget* dstWidget)
{
//qDebug() << "WindowAppRefLineManager::check - srcRect[" << srcWidget->geometry() << "], dsrRect[" << dstWidget->geometry() << "]";
// 遍历控件的所有边(4个)进行匹配, (两个控件之间可能会有最多2条参考线)
for (int i = 0; i < (int)SIDE_DIRECTION::SIDE_COUNT; i++)
{
// 起点线
QLine srcLine = Utility::getSideLineByID(srcWidget, i);
for (int j = 0; j < (int)SIDE_DIRECTION::SIDE_COUNT; j++)
{
// 终点线
QLine dstLine = Utility::getSideLineByID(dstWidget, j);
// 构造参考线信息
UI_REFLINE_INFO lineInfo(srcWidget, dstWidget, SIDE_DIRECTION(i), SIDE_DIRECTION(j));
// 如果两条线是对齐的(延长线)
if (Utility::isAligned(srcLine, dstLine))
{
// qDebug() << "WindowAppRefLineManager::check aligned - srcLine[" << srcLine << "], dstLine[" << dstLine << "].";
// 此处应有线(如果有就更新,没有就新建一条)
this->updateRefLine(lineInfo);
// 由于两个控件之间可能会有多条线,所以需要继续循环
}
// 如果这两条线已经不对齐了,则需要搜索一下对应的参考线是否存在,如果存在则删除
else
{
// qDebug() << "WindowAppRefLineManager::check not aligned - srcLine[" << srcLine << "], dstLine[" << dstLine << "].";
this->removeRefLine(lineInfo);
}
}
}
}
///
/// 无条件清空所有的参考线
///
void WindowAppRefLineManager::clear()
{
QVector::iterator itr = m_RefLines.begin();
for (; itr != m_RefLines.end();)
{
// 清空当前参考线
m_pScene->removeItem(*itr);
itr = m_RefLines.erase(itr);
}
this->m_RefLines.clear();
}
///
/// 更新参考线(是否新建、位置、长度等)
///
///
///
///
///
void WindowAppRefLineManager::updateRefLine(const UI_REFLINE_INFO& info)
{
// 首先查找是否有这条线存在,则更新
if (isRefLineExist(info))
{
// 则更新这条线(似乎不需要额外处理,系统会自动刷新位置和长度)
// qDebug() << "WindowAppRefLineManager::updateRefLine";
}
// 如果这条线目前不存在,则新建
else
{
// qDebug() << "WindowAppRefLineManager::updateRefLine - newLine - " << (int)info.srcSide <<"," << (int)info.dstSide;
// 根据对齐参数新建参考线
WindowAppItemRefLine* newLine = new WindowAppItemRefLine(info);
// 添加到Scene
m_pScene->addItem(newLine);
// 加入到参考线组
m_RefLines.push_back(newLine);
}
}
///
/// 查找对应的参考线是否存在
///
///
///
bool WindowAppRefLineManager::isRefLineExist(const UI_REFLINE_INFO& info)
{
QVector::iterator itr = m_RefLines.begin();
for (; itr != m_RefLines.end();)
{
if ((*itr)->m_refLineInfo == info)
{
return true;
}
else
{
itr++;
}
}
return false;
}
///
/// 移除一条对应的参考线
///
///
void WindowAppRefLineManager::removeRefLine(const UI_REFLINE_INFO& info)
{
QVector::iterator itr = m_RefLines.begin();
for (; itr != m_RefLines.end();)
{
if ((*itr)->m_refLineInfo == info)
{
// qDebug() << "WindowAppRefLineManager::check not aligned ";
// Scene中移除这个Line
m_pScene->removeItem(*itr);
itr = m_RefLines.erase(itr);
break;
}
else
{
itr++;
}
}
}
//===========================================================================================
//
// 辅助函数
//
//===========================================================================================