CMindView.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. #include "CMindView.h"
  2. #include "CRectItem.h"
  3. #include "CLineItem.h"
  4. #include "CTextItem.h"
  5. #include "CMind.h"
  6. #include "CNodeItem.h"
  7. #include <QMenu>
  8. #include <QContextMenuEvent>
  9. #include <QDebug>
  10. CMindView::CMindView(QWidget *parent) : QGraphicsView(new QGraphicsScene(), parent)
  11. {
  12. setRenderHints(QPainter::Antialiasing); // 抗锯齿
  13. m_mind = new CMind(this);
  14. m_group = new QGraphicsItemGroup();
  15. m_group->setFlags(QGraphicsItem::ItemIsMovable);
  16. m_group->setHandlesChildEvents(false);
  17. }
  18. CMind *CMindView::mind() const
  19. {
  20. return m_mind;
  21. }
  22. void CMindView::setNodeList(QList<CNodeData> list)
  23. {
  24. clear();
  25. m_mind->setNodeList(list);
  26. m_root = new CNodeItem(m_mind->root());
  27. refreshItems();
  28. }
  29. void CMindView::addNode(CNodeData n)
  30. {
  31. m_mind->addNode(n);
  32. CNodeItem *item = new CNodeItem(n);
  33. connect(item, &CNodeItem::sigAddSubItem, this, &CMindView::createSubNode);
  34. connect(item, &CNodeItem::sigRemoveItem, this, &CMindView::removeNode);
  35. if (m_root == nullptr) {
  36. m_root = item;
  37. } else {
  38. m_root->addSubNode(item);
  39. }
  40. refreshItems();
  41. }
  42. void CMindView::createSubNode(int pNumber)
  43. {
  44. if (pNumber < 0) {
  45. return;
  46. }
  47. CNodeData data = root()->data();
  48. CNodeData n = CNodeData(data.projectId, data.evalType, m_mind->maxNumber() + 1, pNumber);
  49. addNode(n);
  50. }
  51. void CMindView::removeNode(int number)
  52. {
  53. m_mind->removeNode(number);
  54. if (number == m_root->data().number) {
  55. clear();
  56. } else {
  57. m_root->removeNode(number);
  58. }
  59. refreshItems();
  60. }
  61. void CMindView::clear()
  62. {
  63. m_mind->nodeList().clear();
  64. delete m_root;
  65. m_root = nullptr;
  66. refreshItems();
  67. }
  68. void CMindView::refreshItems()
  69. {
  70. for (QGraphicsItem *item : m_items) {
  71. scene()->removeItem(item);
  72. }
  73. m_items.clear();
  74. scene()->addItem(m_group);
  75. refreshNodeGeometry(m_root);
  76. collectItems(m_root);
  77. for (QGraphicsItem *item : m_items) {
  78. m_group->addToGroup(item);
  79. }
  80. QRectF r = m_group->childrenBoundingRect();
  81. setSceneRect(QRectF(QPointF(), r.size()));
  82. }
  83. void CMindView::collectItems(CNodeItem *node)
  84. {
  85. if (node == nullptr) {
  86. return;
  87. }
  88. m_items.append(node->rectItem());
  89. for (QObject *o : node->children()) {
  90. CNodeItem *n = dynamic_cast<CNodeItem *>(o);
  91. collectItems(n);
  92. }
  93. }
  94. qreal CMindView::hNodeSpace() const
  95. {
  96. return m_hNodeSpace;
  97. }
  98. void CMindView::setHNodeSpace(qreal h)
  99. {
  100. m_hNodeSpace = h;
  101. }
  102. qreal CMindView::vNodeSpace() const
  103. {
  104. return m_vNodeSpace;
  105. }
  106. void CMindView::setVNodeSpace(qreal v)
  107. {
  108. m_vNodeSpace = v;
  109. }
  110. void CMindView::setALignment(CMindView::Alignment align)
  111. {
  112. m_align = align;
  113. }
  114. CNodeItem *CMindView::root() const
  115. {
  116. return m_root;
  117. }
  118. void CMindView::refreshNodeGeometry(CNodeItem *node, QPointF topLeft)
  119. { /// 边框
  120. QRect borderRect = QRect(topLeft.x(), topLeft.y() + (node->treeHeight() - node->borderHeight()) / 2,
  121. node->borderWidth(), node->borderHeight());
  122. node->rectItem()->setRect(borderRect);
  123. /// 文本
  124. QPointF textPos = QPointF(borderRect.left() + m_hNodeSpace,
  125. borderRect.top() + (node->borderHeight() - node->textHeight()) / 2);
  126. node->textItem()->setPos(textPos);
  127. node->rectItem()->setPos(QPoint(0, 0));
  128. /// 子节点
  129. int x = borderRect.right() + m_hNodeSpace;
  130. if (m_align) {
  131. x = borderRect.left() + m_root->maxBorderWidthOfLevel(node->depth()) + m_hNodeSpace;
  132. }
  133. int y = topLeft.y();
  134. if (node->borderHeight() > node->childrenHeight()) {
  135. y += (node->borderHeight() - node->childrenHeight()) / 2;
  136. }
  137. for (QObject *obj : node->children()) {
  138. CNodeItem *subNode = dynamic_cast<CNodeItem *>(obj);
  139. refreshNodeGeometry(subNode, QPointF(x, y));
  140. y += subNode->treeHeight() + m_vNodeSpace;
  141. subNode->lineItem()->setStartPos(node->rectItem()->centerRight());
  142. subNode->lineItem()->setEndPos(subNode->rectItem()->centerLeft());
  143. }
  144. }