CNodeItem.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #include "CNodeItem.h"
  2. #include "CRectItem.h"
  3. #include "CTextItem.h"
  4. #include "CLineItem.h"
  5. #include <QAction>
  6. #include <QTextDocument>
  7. #include <QDebug>
  8. CNodeItem::CNodeItem(const CNodeData data, CNodeItem *parent) : QObject(parent), m_data(data)
  9. {
  10. m_rectItem = new CRectItem();
  11. m_textItem = new CTextItem(data.name, m_rectItem);
  12. m_lineItem = new CLineItem(m_rectItem);
  13. updateItemsGeometry();
  14. connectSignalsAndSlots();
  15. }
  16. CNodeData CNodeItem::data() const
  17. {
  18. return m_data;
  19. }
  20. void CNodeItem::addSubNode(CNodeItem *n)
  21. {
  22. if (n == nullptr) {
  23. return;
  24. }
  25. if (n->data().pNumber == data().number) {
  26. n->setParent(this);
  27. } else {
  28. for (QObject *obj : children()) {
  29. CNodeItem *item = dynamic_cast<CNodeItem *>(obj);
  30. item->addSubNode(n);
  31. }
  32. }
  33. }
  34. void CNodeItem::removeNode(int number)
  35. {
  36. for (QObject *obj : children()) {
  37. CNodeItem *item = dynamic_cast<CNodeItem *>(obj);
  38. if (item->data().number == number) {
  39. item->setParent(nullptr);
  40. delete item;
  41. } else {
  42. item->removeNode(number);
  43. }
  44. }
  45. }
  46. CRectItem *CNodeItem::rectItem() const
  47. {
  48. return m_rectItem;
  49. }
  50. CTextItem *CNodeItem::textItem() const
  51. {
  52. return m_textItem;
  53. }
  54. QPointF CNodeItem::pos() const
  55. {
  56. return m_pos;
  57. }
  58. void CNodeItem::setPos(const QPointF pos)
  59. {
  60. m_pos = pos;
  61. updateItemsGeometry();
  62. }
  63. qreal CNodeItem::xMargin() const
  64. {
  65. return m_xMargin;
  66. }
  67. void CNodeItem::setXMargin(qreal x)
  68. {
  69. m_xMargin = x;
  70. updateItemsGeometry();
  71. }
  72. qreal CNodeItem::yMargin() const
  73. {
  74. return m_yMargin;
  75. }
  76. void CNodeItem::setYMargin(qreal y)
  77. {
  78. m_yMargin = y;
  79. updateItemsGeometry();
  80. }
  81. qreal CNodeItem::minWidth() const
  82. {
  83. return m_minWidth;
  84. }
  85. void CNodeItem::setMinWidth(qreal w)
  86. {
  87. m_minWidth = w;
  88. updateItemsGeometry();
  89. }
  90. qreal CNodeItem::minHeight() const
  91. {
  92. return m_minHeight;
  93. }
  94. void CNodeItem::setMinHeight(qreal h)
  95. {
  96. m_minHeight = h;
  97. updateItemsGeometry();
  98. }
  99. void CNodeItem::connectSignalsAndSlots()
  100. {
  101. connect(m_rectItem->selectAction(), &QAction::triggered, this, &CNodeItem::slotSelect);
  102. connect(m_rectItem->subNodeAction(), &QAction::triggered, this, &CNodeItem::slotSubNode);
  103. connect(m_rectItem->removeAction(), &QAction::triggered, this, &CNodeItem::slotRemove);
  104. }
  105. void CNodeItem::updateItemsGeometry()
  106. {
  107. QRectF tr = m_textItem->boundingRect();
  108. qreal w = std::max(tr.width() + m_xMargin * 2, m_minWidth);
  109. qreal h = std::max(tr.height() + m_yMargin * 2, m_minHeight);
  110. m_rectItem->setRect(QRectF(m_pos, QSizeF(w, h)));
  111. m_textItem->setPos(m_pos + QPointF(m_xMargin, (h - tr.height()) / 2));
  112. }
  113. void CNodeItem::slotSelect()
  114. {
  115. qDebug() << __FUNCTION__ << __LINE__ << endl;
  116. m_rectItem->setHighlighted(!m_rectItem->highlighted());
  117. }
  118. void CNodeItem::slotSubNode()
  119. {
  120. qDebug() << __FUNCTION__ << __LINE__ << endl;
  121. emit sigAddSubItem(data().number);
  122. }
  123. void CNodeItem::slotRemove()
  124. {
  125. qDebug() << __FUNCTION__ << __LINE__ << endl;
  126. emit sigRemoveItem(data().number);
  127. }