123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- #include "CMindView.h"
- #include "CRectItem.h"
- #include "CLineItem.h"
- #include "CTextItem.h"
- #include "CMind.h"
- #include "CNodeItem.h"
- #include <QMenu>
- #include <QContextMenuEvent>
- #include <QDebug>
- CMindView::CMindView(QWidget *parent) : QGraphicsView(new QGraphicsScene(), parent)
- {
- setRenderHints(QPainter::Antialiasing); // 抗锯齿
- m_mind = new CMind(this);
- m_group = new QGraphicsItemGroup();
- m_group->setFlags(QGraphicsItem::ItemIsMovable);
- m_group->setHandlesChildEvents(false);
- }
- CMind *CMindView::mind() const
- {
- return m_mind;
- }
- void CMindView::setNodeList(QList<CNodeData> list)
- {
- clear();
- m_mind->setNodeList(list);
- m_root = new CNodeItem(m_mind->root());
- refreshItems();
- }
- void CMindView::addNode(CNodeData n)
- {
- m_mind->addNode(n);
- CNodeItem *item = new CNodeItem(n);
- connect(item, &CNodeItem::sigAddSubItem, this, &CMindView::createSubNode);
- connect(item, &CNodeItem::sigRemoveItem, this, &CMindView::removeNode);
- if (m_root == nullptr) {
- m_root = item;
- } else {
- m_root->addSubNode(item);
- }
- refreshItems();
- }
- void CMindView::createSubNode(int pNumber)
- {
- if (pNumber < 0) {
- return;
- }
- CNodeData data = root()->data();
- CNodeData n = CNodeData(data.projectId, data.evalType, m_mind->maxNumber() + 1, pNumber);
- addNode(n);
- }
- void CMindView::removeNode(int number)
- {
- m_mind->removeNode(number);
- if (number == m_root->data().number) {
- clear();
- } else {
- m_root->removeNode(number);
- }
- refreshItems();
- }
- void CMindView::clear()
- {
- m_mind->nodeList().clear();
- delete m_root;
- m_root = nullptr;
- refreshItems();
- }
- void CMindView::refreshItems()
- {
- for (QGraphicsItem *item : m_items) {
- scene()->removeItem(item);
- }
- m_items.clear();
- scene()->addItem(m_group);
- refreshNodeGeometry(m_root);
- collectItems(m_root);
- for (QGraphicsItem *item : m_items) {
- m_group->addToGroup(item);
- }
- QRectF r = m_group->childrenBoundingRect();
- setSceneRect(QRectF(QPointF(), r.size()));
- }
- void CMindView::collectItems(CNodeItem *node)
- {
- if (node == nullptr) {
- return;
- }
- m_items.append(node->rectItem());
- for (QObject *o : node->children()) {
- CNodeItem *n = dynamic_cast<CNodeItem *>(o);
- collectItems(n);
- }
- }
- qreal CMindView::hNodeSpace() const
- {
- return m_hNodeSpace;
- }
- void CMindView::setHNodeSpace(qreal h)
- {
- m_hNodeSpace = h;
- }
- qreal CMindView::vNodeSpace() const
- {
- return m_vNodeSpace;
- }
- void CMindView::setVNodeSpace(qreal v)
- {
- m_vNodeSpace = v;
- }
- void CMindView::setALignment(CMindView::Alignment align)
- {
- m_align = align;
- }
- CNodeItem *CMindView::root() const
- {
- return m_root;
- }
- void CMindView::refreshNodeGeometry(CNodeItem *node, QPointF topLeft)
- { /// 边框
- QRect borderRect = QRect(topLeft.x(), topLeft.y() + (node->treeHeight() - node->borderHeight()) / 2,
- node->borderWidth(), node->borderHeight());
- node->rectItem()->setRect(borderRect);
- /// 文本
- QPointF textPos = QPointF(borderRect.left() + m_hNodeSpace,
- borderRect.top() + (node->borderHeight() - node->textHeight()) / 2);
- node->textItem()->setPos(textPos);
- node->rectItem()->setPos(QPoint(0, 0));
- /// 子节点
- int x = borderRect.right() + m_hNodeSpace;
- if (m_align) {
- x = borderRect.left() + m_root->maxBorderWidthOfLevel(node->depth()) + m_hNodeSpace;
- }
- int y = topLeft.y();
- if (node->borderHeight() > node->childrenHeight()) {
- y += (node->borderHeight() - node->childrenHeight()) / 2;
- }
- for (QObject *obj : node->children()) {
- CNodeItem *subNode = dynamic_cast<CNodeItem *>(obj);
- refreshNodeGeometry(subNode, QPointF(x, y));
- y += subNode->treeHeight() + m_vNodeSpace;
- subNode->lineItem()->setStartPos(node->rectItem()->centerRight());
- subNode->lineItem()->setEndPos(subNode->rectItem()->centerLeft());
- }
- }
|