Browse Source

解耦, 修改节点创建方式

chengxr 1 year ago
parent
commit
293e7aef22

+ 26 - 12
QFD/CCanvas/CMind.cpp

@@ -24,7 +24,12 @@ bool CNodeData::hasParent() const
     return pNumber >= 0;
 }
 
-CMind::CMind(int projId, int evalType, QObject *parent) : QObject(parent), m_projectId(projId), m_evalType(evalType) { }
+bool CNodeData::isSameMind(CNodeData n) const
+{
+    return projectId == n.projectId && evalType == n.evalType;
+}
+
+CMind::CMind(QObject *parent) : QObject(parent) { }
 
 QList<CNodeData> CMind::nodeList() const
 {
@@ -41,8 +46,13 @@ void CMind::setNodeList(QList<CNodeData> list)
 
 bool CMind::isNodeValid(CNodeData n) const
 {
-    bool v = n.isValid() && n.projectId == m_projectId && n.evalType == m_evalType;
-    return v;
+    CNodeData root = node(minNumber());
+    if (root.isValid()) {
+        bool v = n.isValid() && n.isSameMind(root);
+        return v;
+    }
+
+    return n.isValid();
 }
 
 CNodeData CMind::node(int number) const
@@ -59,21 +69,19 @@ bool CMind::containsNode(int number) const
     return numberList().contains(number);
 }
 
-CNodeData CMind::createNode(int pNumber) const
-{
-    CNodeData n;
-    if (containsNode(pNumber) || (pNumber < 0 && m_nodeList.count() <= 0)) {
-        n = CNodeData(m_projectId, m_evalType, maxNumber() + 1, pNumber);
-    }
-    return n;
-}
-
 void CMind::addNode(CNodeData n)
 {
+    // 节点无效, 不添加
     if (isNodeValid(n) == false) {
         return;
     }
 
+    // 指明了父节点, 但父节点无效, 不添加
+    if (n.hasParent() && containsNode(n.pNumber) == false) {
+        return;
+    }
+
+    // 节点编号重复, 不添加
     if (numberList().contains(n.number)) {
         return;
     }
@@ -104,6 +112,12 @@ void CMind::removeNode(int number)
     }
 }
 
+CNodeData CMind::root() const
+{
+    return node(minNumber());
+    ;
+}
+
 bool CMind::hasAncestor(int childNumber, int ancestorNumber) const
 {
     CNodeData c = node(childNumber);

+ 6 - 9
QFD/CCanvas/CMind.h

@@ -10,7 +10,7 @@ class CMind : public QObject
     Q_OBJECT
 
 public:
-    explicit CMind(int projId = -1, int evalType = 0, QObject *parent = nullptr);
+    explicit CMind(QObject *parent = nullptr);
 
     // 节点数据
     QList<CNodeData> nodeList() const;
@@ -22,26 +22,23 @@ public:
 
     bool containsNode(int number) const;
 
-    /// 指定父节点, 创建节点
-    CNodeData createNode(int pNumber = -1) const;
-
     void addNode(CNodeData n);
     void removeNode(int number);
 
+    CNodeData root() const;
+
     bool hasAncestor(int childNumber, int ancestorNumber) const;
 
-private:
-    QList<int> numberList() const;  // 节点编号列表
     // 最大的节点编号, 创建节点时, 编号递增
     int maxNumber() const;
     // 最小的节点编号, 由于创建节点时编号递增, 所以此为根节点
     int minNumber() const;
 
 private:
-    QList<CNodeData> m_nodeList;  // 节点列表
+    QList<int> numberList() const;  // 节点编号列表
 
-    int m_projectId = -1;
-    int m_evalType  = 0;
+private:
+    QList<CNodeData> m_nodeList;  // 节点列表
 };
 
 #endif  // CMIND_H

+ 6 - 0
QFD/CCanvas/CMindView.cpp

@@ -14,6 +14,7 @@
 CMindView::CMindView(QWidget *parent) : QGraphicsView(new QGraphicsScene(), parent)
 {
     setRenderHints(QPainter::Antialiasing);  // 抗锯齿
+    m_mind = new CMind(this);
 }
 
 void CMindView::connectSignalsAndSlots() { }
@@ -63,11 +64,16 @@ void CMindView::addNode(CNodeData n)
 void CMindView::removeNode(int number)
 {
     qDebug() << __FUNCTION__ << __LINE__ << number << endl;
+    m_mind->removeNode(number);
+    refresh();
 }
 
 void CMindView::addSubNode(int pNumber)
 {
     qDebug() << __FUNCTION__ << __LINE__ << pNumber << endl;
+    CNodeData root = m_mind->root();
+    CNodeData n    = CNodeData(root.projectId, root.evalType, m_mind->maxNumber() + 1, pNumber);
+    addNode(n);
 }
 
 void CMindView::testItems()

+ 1 - 0
QFD/CCanvas/CNode.h

@@ -19,6 +19,7 @@ struct CNodeData
     bool isNull() const;
     bool isCached() const;
     bool hasParent() const;
+    bool isSameMind(CNodeData n) const;
 };
 
 class CNode : public QObject

+ 26 - 2
QFD/CCanvas/CNodeItem.cpp

@@ -34,6 +34,7 @@ QString CNodeItem::text() const
 void CNodeItem::setText(const QString text)
 {
     m_textItem->document()->setPlainText(text);
+    updateItemsGeometry();
 }
 
 CRectItem *CNodeItem::rectItem() const
@@ -57,6 +58,28 @@ void CNodeItem::setPos(const QPointF pos)
     updateItemsGeometry();
 }
 
+qreal CNodeItem::xMargin() const
+{
+    return m_xMargin;
+}
+
+void CNodeItem::setXMargin(qreal x)
+{
+    m_xMargin = x;
+    updateItemsGeometry();
+}
+
+qreal CNodeItem::yMargin() const
+{
+    return m_yMargin;
+}
+
+void CNodeItem::setYMargin(qreal y)
+{
+    m_yMargin = y;
+    updateItemsGeometry();
+}
+
 void CNodeItem::connectSignalsAndSlots()
 {
     connect(m_rectItem->selectAction(), &QAction::triggered, this, &CNodeItem::slotSelect);
@@ -66,8 +89,9 @@ void CNodeItem::connectSignalsAndSlots()
 
 void CNodeItem::updateItemsGeometry()
 {
-    m_rectItem->setRect(QRectF(m_pos.x(), m_pos.y(), 100, 30));
-    m_textItem->setPos(m_pos + QPointF(10, 5));
+    QSizeF s = m_textItem->boundingRect().size() + QSizeF(m_xMargin * 2, m_yMargin * 2);
+    m_rectItem->setRect(QRectF(m_pos, s));
+    m_textItem->setPos(m_pos + QPointF(m_xMargin, m_yMargin));
 }
 
 void CNodeItem::slotSelect()

+ 9 - 0
QFD/CCanvas/CNodeItem.h

@@ -25,6 +25,12 @@ public:
     QPointF pos() const;
     void setPos(const QPointF pos);
 
+    qreal xMargin() const;
+    void setXMargin(qreal x);
+
+    qreal yMargin() const;
+    void setYMargin(qreal y);
+
     void connectSignalsAndSlots();
 
 private:
@@ -45,6 +51,9 @@ private:
     CTextItem *m_textItem;
 
     QPointF m_pos;
+
+    qreal m_xMargin = 10;
+    qreal m_yMargin = 5;
 };
 
 #endif  // CNODEITEM_H

+ 1 - 3
QFD/widgets/IndexSystemWidget.cpp

@@ -20,9 +20,7 @@ IndexSystemWidget::IndexSystemWidget(ProjectInfo *proj, int type, QWidget *paren
 
 void IndexSystemWidget::initWidgets()
 {
-    m_mindView  = new CMindView(this);
-    CMind *mind = new CMind(m_proj->id, m_type, m_mindView);
-    m_mindView->setMind(mind);
+    m_mindView = new CMindView(this);
 }
 
 void IndexSystemWidget::initLayout()