浏览代码

创建和编辑节点

chengxr 1 年之前
父节点
当前提交
2a03aab297
共有 2 个文件被更改,包括 75 次插入13 次删除
  1. 58 6
      QFD/CCanvas/CMind.cpp
  2. 17 7
      QFD/CCanvas/CMind.h

+ 58 - 6
QFD/CCanvas/CMind.cpp

@@ -1,10 +1,20 @@
 #include "CMind.h"
 
+CNodeData::CNodeData(int projId, int evalType, int number, int pNumber, int id)
+    : id(id), projectId(projId), evalType(evalType), number(number), pNumber(pNumber)
+{
+}
+
 bool CNodeData::isValid() const
 {
     return projectId >= 0 && evalType > 0 && number >= 0;
 }
 
+bool CNodeData::isNull() const
+{
+    return id == -1 && projectId == -1 && evalType == 0 && number == -1 && pNumber == -1;
+}
+
 bool CNodeData::isCached() const
 {
     return id >= 0;
@@ -25,7 +35,6 @@ QList<CNodeData> CMind::nodeList() const
 void CMind::setNodeList(QList<CNodeData> list)
 {
     m_nodeList.clear();
-    m_numberList.clear();
     for (CNodeData n : list) {
         addNode(n);
     }
@@ -39,7 +48,10 @@ bool CMind::isNodeValid(CNodeData n) const
 
 CNodeData CMind::node(int number) const
 {
-    int i = m_numberList.indexOf(number);
+    int i = numberList().indexOf(number);
+    if (i < 0 || i >= m_nodeList.count()) {
+        return CNodeData();
+    }
     return m_nodeList[i];
 }
 
@@ -48,27 +60,67 @@ bool CMind::containsNode(CNodeData n) const
     return isNodeValid(n) && node(n.number).isValid();
 }
 
+CNodeData CMind::createNode(CNodeData parent)
+{
+    CNodeData n;
+    if (containsNode(parent) || (parent.isNull() && m_nodeList.count() <= 0)) {
+        n = CNodeData(m_projectId, m_evalType, maxNumber() + 1, parent.number);
+    }
+    return n;
+}
+
 void CMind::addNode(CNodeData n)
 {
     if (isNodeValid(n) == false) {
         return;
     }
 
-    if (m_numberList.contains(n.number)) {
+    if (numberList().contains(n.number)) {
         return;
     }
 
     m_nodeList.append(n);
-    m_numberList.append(n.number);
 }
 
 void CMind::removeNode(int number, bool removeChildren)
 {
-    for (int i = 0; i < m_nodeList.count(); i++) {
+    for (int i = m_nodeList.count() - 1; i >= 0; i--) {
         CNodeData n = m_nodeList[i];
         if (n.number == number || (removeChildren && n.pNumber == number)) {
             m_nodeList.removeAt(i);
-            m_numberList.removeAt(i);
         }
     }
 }
+
+QList<int> CMind::numberList() const
+{
+    QList<int> l;
+    for (int i = 0; i < m_nodeList.count(); i++) {
+        l.append(m_nodeList[i].number);
+    }
+    return l;
+}
+
+int CMind::maxNumber() const
+{
+    int n = -1;
+    if (m_nodeList.count() > 0) {
+        n = m_nodeList.first().number;
+    }
+    for (int i = 0; i < m_nodeList.count(); i++) {
+        n = std::max(n, m_nodeList[i].number);
+    }
+    return n;
+}
+
+int CMind::minNumber() const
+{
+    int n = -1;
+    if (m_nodeList.count() > 0) {
+        n = m_nodeList.first().number;
+    }
+    for (int i = 0; i < m_nodeList.count(); i++) {
+        n = std::min(n, m_nodeList[i].number);
+    }
+    return n;
+}

+ 17 - 7
QFD/CCanvas/CMind.h

@@ -13,7 +13,10 @@ struct CNodeData
     QString name;        // 名称
     QString remark;      // 备注
 
+    CNodeData(int projId = -1, int evalType = 0, int number = -1, int pNumber = -1, int id = -1);
+
     bool isValid() const;
+    bool isNull() const;
     bool isCached() const;
     bool hasParent() const;
 };
@@ -29,18 +32,25 @@ public:
     QList<CNodeData> nodeList() const;
     void setNodeList(QList<CNodeData> list);
 
-    CNodeData nodeWithId(int id) const;
-    CNodeData nodeWithNumber(int number) const;
+    bool isNodeValid(CNodeData n) const;
+
+    CNodeData node(int number) const;
+
+    bool containsNode(CNodeData n) const;
 
-    bool containsNode(CNodeData node) const;
+    /// 以 parent 为父节点创建节点
+    void createNode(CNodeData parent = CNodeData());
 
-    void addNode(CNodeData node);
-    void removeNodeById(int id, bool removeChildren = true);
-    void removeNodeByNumber(int number, bool removeChildren = true);
+    void addNode(CNodeData n);
+    void removeNode(int number, bool removeChildren = true);
+
+private:
+    QList<int> numberList() const;  // 节点编号列表
+    int maxNumber() const;          // 最大的节点编号, 创建节点时, 编号递增
+    int minNumber() const;          // 最小的节点编号
 
 private:
     QList<CNodeData> m_nodeList;  // 节点列表
-    QList<int> m_numberList;      // 节点编号列表
 
     int m_projectId = -1;
     int m_evalType  = 0;