123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- #include "WindowAppRefLineManager.h"
- #include "WindowAppUiScene.h"
- WindowAppRefLineManager::WindowAppRefLineManager() :
- m_pScene(nullptr)
- {
- }
- /// <summary>
- /// 根据两个Widget控件的关系,处理对应的参考线效果
- /// </summary>
- /// <param name="srcWidget"></param>
- /// <param name="dstWidget"></param>
- 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);
- }
- }
- }
- }
- /// <summary>
- /// 无条件清空所有的参考线
- /// </summary>
- void WindowAppRefLineManager::clear()
- {
- QVector<WindowAppItemRefLine*>::iterator itr = m_RefLines.begin();
- for (; itr != m_RefLines.end();)
- {
- // 清空当前参考线
- m_pScene->removeItem(*itr);
- itr = m_RefLines.erase(itr);
- }
- this->m_RefLines.clear();
- }
- /// <summary>
- /// 更新参考线(是否新建、位置、长度等)
- /// </summary>
- /// <param name="srcWidget"></param>
- /// <param name="dstWidget"></param>
- /// <param name="srcSide"></param>
- /// <param name="dstSide"></param>
- 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);
- }
- }
- /// <summary>
- /// 查找对应的参考线是否存在
- /// </summary>
- /// <param name="info"></param>
- /// <returns></returns>
- bool WindowAppRefLineManager::isRefLineExist(const UI_REFLINE_INFO& info)
- {
- QVector<WindowAppItemRefLine*>::iterator itr = m_RefLines.begin();
- for (; itr != m_RefLines.end();)
- {
- if ((*itr)->m_refLineInfo == info)
- {
- return true;
- }
- else
- {
- itr++;
- }
- }
- return false;
- }
- /// <summary>
- /// 移除一条对应的参考线
- /// </summary>
- /// <param name="info"></param>
- void WindowAppRefLineManager::removeRefLine(const UI_REFLINE_INFO& info)
- {
- QVector<WindowAppItemRefLine*>::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++;
- }
- }
- }
- //===========================================================================================
- //
- // 辅助函数
- //
- //===========================================================================================
|