WindowAppRefLineManager.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. #include "WindowAppRefLineManager.h"
  2. #include "WindowAppUiScene.h"
  3. WindowAppRefLineManager::WindowAppRefLineManager() :
  4. m_pScene(nullptr)
  5. {
  6. }
  7. /// <summary>
  8. /// 根据两个Widget控件的关系,处理对应的参考线效果
  9. /// </summary>
  10. /// <param name="srcWidget"></param>
  11. /// <param name="dstWidget"></param>
  12. void WindowAppRefLineManager::check(QWidget* srcWidget, QWidget* dstWidget)
  13. {
  14. //qDebug() << "WindowAppRefLineManager::check - srcRect[" << srcWidget->geometry() << "], dsrRect[" << dstWidget->geometry() << "]";
  15. // 遍历控件的所有边(4个)进行匹配, (两个控件之间可能会有最多2条参考线)
  16. for (int i = 0; i < (int)SIDE_DIRECTION::SIDE_COUNT; i++)
  17. {
  18. // 起点线
  19. QLine srcLine = Utility::getSideLineByID(srcWidget, i);
  20. for (int j = 0; j < (int)SIDE_DIRECTION::SIDE_COUNT; j++)
  21. {
  22. // 终点线
  23. QLine dstLine = Utility::getSideLineByID(dstWidget, j);
  24. // 构造参考线信息
  25. UI_REFLINE_INFO lineInfo(srcWidget, dstWidget, SIDE_DIRECTION(i), SIDE_DIRECTION(j));
  26. // 如果两条线是对齐的(延长线)
  27. if (Utility::isAligned(srcLine, dstLine))
  28. {
  29. // qDebug() << "WindowAppRefLineManager::check aligned - srcLine[" << srcLine << "], dstLine[" << dstLine << "].";
  30. // 此处应有线(如果有就更新,没有就新建一条)
  31. this->updateRefLine(lineInfo);
  32. // 由于两个控件之间可能会有多条线,所以需要继续循环
  33. }
  34. // 如果这两条线已经不对齐了,则需要搜索一下对应的参考线是否存在,如果存在则删除
  35. else
  36. {
  37. // qDebug() << "WindowAppRefLineManager::check not aligned - srcLine[" << srcLine << "], dstLine[" << dstLine << "].";
  38. this->removeRefLine(lineInfo);
  39. }
  40. }
  41. }
  42. }
  43. /// <summary>
  44. /// 无条件清空所有的参考线
  45. /// </summary>
  46. void WindowAppRefLineManager::clear()
  47. {
  48. QVector<WindowAppItemRefLine*>::iterator itr = m_RefLines.begin();
  49. for (; itr != m_RefLines.end();)
  50. {
  51. // 清空当前参考线
  52. m_pScene->removeItem(*itr);
  53. itr = m_RefLines.erase(itr);
  54. }
  55. this->m_RefLines.clear();
  56. }
  57. /// <summary>
  58. /// 更新参考线(是否新建、位置、长度等)
  59. /// </summary>
  60. /// <param name="srcWidget"></param>
  61. /// <param name="dstWidget"></param>
  62. /// <param name="srcSide"></param>
  63. /// <param name="dstSide"></param>
  64. void WindowAppRefLineManager::updateRefLine(const UI_REFLINE_INFO& info)
  65. {
  66. // 首先查找是否有这条线存在,则更新
  67. if (isRefLineExist(info))
  68. {
  69. // 则更新这条线(似乎不需要额外处理,系统会自动刷新位置和长度)
  70. // qDebug() << "WindowAppRefLineManager::updateRefLine";
  71. }
  72. // 如果这条线目前不存在,则新建
  73. else
  74. {
  75. // qDebug() << "WindowAppRefLineManager::updateRefLine - newLine - " << (int)info.srcSide <<"," << (int)info.dstSide;
  76. // 根据对齐参数新建参考线
  77. WindowAppItemRefLine* newLine = new WindowAppItemRefLine(info);
  78. // 添加到Scene
  79. m_pScene->addItem(newLine);
  80. // 加入到参考线组
  81. m_RefLines.push_back(newLine);
  82. }
  83. }
  84. /// <summary>
  85. /// 查找对应的参考线是否存在
  86. /// </summary>
  87. /// <param name="info"></param>
  88. /// <returns></returns>
  89. bool WindowAppRefLineManager::isRefLineExist(const UI_REFLINE_INFO& info)
  90. {
  91. QVector<WindowAppItemRefLine*>::iterator itr = m_RefLines.begin();
  92. for (; itr != m_RefLines.end();)
  93. {
  94. if ((*itr)->m_refLineInfo == info)
  95. {
  96. return true;
  97. }
  98. else
  99. {
  100. itr++;
  101. }
  102. }
  103. return false;
  104. }
  105. /// <summary>
  106. /// 移除一条对应的参考线
  107. /// </summary>
  108. /// <param name="info"></param>
  109. void WindowAppRefLineManager::removeRefLine(const UI_REFLINE_INFO& info)
  110. {
  111. QVector<WindowAppItemRefLine*>::iterator itr = m_RefLines.begin();
  112. for (; itr != m_RefLines.end();)
  113. {
  114. if ((*itr)->m_refLineInfo == info)
  115. {
  116. // qDebug() << "WindowAppRefLineManager::check not aligned ";
  117. // Scene中移除这个Line
  118. m_pScene->removeItem(*itr);
  119. itr = m_RefLines.erase(itr);
  120. break;
  121. }
  122. else
  123. {
  124. itr++;
  125. }
  126. }
  127. }
  128. //===========================================================================================
  129. //
  130. // 辅助函数
  131. //
  132. //===========================================================================================