chengxr 1 year ago
parent
commit
193be93ee4
3 changed files with 44 additions and 14 deletions
  1. 32 8
      QFD/CCanvas/CMind.cpp
  2. 10 6
      QFD/CCanvas/CMind.h
  3. 2 0
      QFD/view/MainWindow.cpp

+ 32 - 8
QFD/CCanvas/CMind.cpp

@@ -19,7 +19,6 @@ bool CNodeData::isCached() const
 {
     return id >= 0;
 }
-
 bool CNodeData::hasParent() const
 {
     return pNumber >= 0;
@@ -55,16 +54,16 @@ CNodeData CMind::node(int number) const
     return m_nodeList[i];
 }
 
-bool CMind::containsNode(CNodeData n) const
+bool CMind::containsNode(int n) const
 {
-    return isNodeValid(n) && node(n.number).isValid();
+    return numberList().contains(n);
 }
 
-CNodeData CMind::createNode(CNodeData parent)
+CNodeData CMind::createNode(int pNumber)
 {
     CNodeData n;
-    if (containsNode(parent) || (parent.isNull() && m_nodeList.count() <= 0)) {
-        n = CNodeData(m_projectId, m_evalType, maxNumber() + 1, parent.number);
+    if (containsNode(pNumber) || (pNumber < 0 && m_nodeList.count() <= 0)) {
+        n = CNodeData(m_projectId, m_evalType, maxNumber() + 1, pNumber);
     }
     return n;
 }
@@ -82,16 +81,41 @@ void CMind::addNode(CNodeData n)
     m_nodeList.append(n);
 }
 
-void CMind::removeNode(int number, bool removeChildren)
+void CMind::removeNode(int number)
 {
+    // 若是根节点, 则整体删除
+    if (number == minNumber()) {
+        m_nodeList.clear();
+        return;
+    }
+
+    // 删除节点
+    int i = numberList().indexOf(number);
+    if (i >= 0 && i < m_nodeList.count()) {
+        m_nodeList.removeAt(i);
+    }
+
+    // 删除子节点
     for (int i = m_nodeList.count() - 1; i >= 0; i--) {
         CNodeData n = m_nodeList[i];
-        if (n.number == number || (removeChildren && n.pNumber == number)) {
+        if (hasAncestor(n.number, number)) {
             m_nodeList.removeAt(i);
         }
     }
 }
 
+bool CMind::hasAncestor(int childId, int ancestorNumber) const
+{
+    CNodeData c = node(childId);
+    if (c.isValid()) {
+        if (c.hasParent() && c.pNumber == ancestorNumber) {
+            return true;
+        }
+        return hasAncestor(c.pNumber, ancestorNumber);
+    }
+    return false;
+}
+
 QList<int> CMind::numberList() const
 {
     QList<int> l;

+ 10 - 6
QFD/CCanvas/CMind.h

@@ -36,18 +36,22 @@ public:
 
     CNodeData node(int number) const;
 
-    bool containsNode(CNodeData n) const;
+    bool containsNode(int n) const;
 
-    /// 以 parent 为父节点创建节点
-    void createNode(CNodeData parent = CNodeData());
+    /// 指定父节点, 创建节点
+    CNodeData createNode(int pNumber = -1);
 
     void addNode(CNodeData n);
-    void removeNode(int number, bool removeChildren = true);
+    void removeNode(int number);
+
+    bool hasAncestor(int childId, int ancestorNumber) const;
 
 private:
     QList<int> numberList() const;  // 节点编号列表
-    int maxNumber() const;          // 最大的节点编号, 创建节点时, 编号递增
-    int minNumber() const;          // 最小的节点编号
+    // 最大的节点编号, 创建节点时, 编号递增
+    int maxNumber() const;
+    // 最小的节点编号, 由于创建节点时编号递增, 所以此为根节点
+    int minNumber() const;
 
 private:
     QList<CNodeData> m_nodeList;  // 节点列表

+ 2 - 0
QFD/view/MainWindow.cpp

@@ -10,6 +10,8 @@
 #include "SettingView.h"
 #include "UserView.h"
 
+#include "CMind.h"
+
 #include "dbService/ClassSet.h"
 
 #include "QFDConfig.h"