|
@@ -13,8 +13,12 @@
|
|
|
|
|
|
CMindView::CMindView(QWidget *parent) : QGraphicsView(new QGraphicsScene(), parent)
|
|
|
{
|
|
|
- m_mind = new CMind(this);
|
|
|
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
|
|
@@ -51,17 +55,16 @@ void CMindView::createSubNode(int pNumber)
|
|
|
return;
|
|
|
}
|
|
|
CNodeData data = root()->data();
|
|
|
- CNodeData n = CNodeData(data.projectId, data.evalType, 0, data.number);
|
|
|
+ CNodeData n = CNodeData(data.projectId, data.evalType, m_mind->maxNumber() + 1, pNumber);
|
|
|
+
|
|
|
addNode(n);
|
|
|
}
|
|
|
|
|
|
void CMindView::removeNode(int number)
|
|
|
{
|
|
|
- qDebug() << __FUNCTION__ << __LINE__ << endl;
|
|
|
m_mind->removeNode(number);
|
|
|
if (number == m_root->data().number) {
|
|
|
clear();
|
|
|
- qDebug() << __FUNCTION__ << __LINE__ << endl;
|
|
|
} else {
|
|
|
m_root->removeNode(number);
|
|
|
}
|
|
@@ -83,18 +86,24 @@ void CMindView::refreshItems()
|
|
|
}
|
|
|
m_items.clear();
|
|
|
|
|
|
+ scene()->addItem(m_group);
|
|
|
+
|
|
|
+ refreshNodeGeometry(m_root);
|
|
|
collectItems(m_root);
|
|
|
for (QGraphicsItem *item : m_items) {
|
|
|
- scene()->addItem(item);
|
|
|
+ m_group->addToGroup(item);
|
|
|
}
|
|
|
+
|
|
|
+ QRectF r = m_group->childrenBoundingRect();
|
|
|
+ setSceneRect(QRectF(QPointF(), r.size()));
|
|
|
}
|
|
|
|
|
|
void CMindView::collectItems(CNodeItem *node)
|
|
|
{
|
|
|
- m_items.clear();
|
|
|
if (node == nullptr) {
|
|
|
return;
|
|
|
}
|
|
|
+
|
|
|
m_items.append(node->rectItem());
|
|
|
for (QObject *o : node->children()) {
|
|
|
CNodeItem *n = dynamic_cast<CNodeItem *>(o);
|
|
@@ -131,3 +140,37 @@ 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());
|
|
|
+ }
|
|
|
+}
|