浏览代码

脑图数据操作

chengxr 1 年之前
父节点
当前提交
b16027895c
共有 2 个文件被更改,包括 51 次插入38 次删除
  1. 37 33
      QFD/CCanvas/CMind.cpp
  2. 14 5
      QFD/CCanvas/CMind.h

+ 37 - 33
QFD/CCanvas/CMind.cpp

@@ -1,70 +1,74 @@
 #include "CMind.h"
 
-CMind::CMind(QObject *parent) : QObject(parent) { }
+bool CNodeData::isValid() const
+{
+    return projectId >= 0 && evalType > 0 && number >= 0;
+}
 
-QList<CNodeData> CMind::nodeList() const
+bool CNodeData::isCached() const
 {
-    return m_nodeList;
+    return id >= 0;
 }
 
-void CMind::setNodeList(QList<CNodeData> list)
+bool CNodeData::hasParent() const
 {
-    m_nodeList = list;
+    return pNumber >= 0;
 }
 
-bool CMind::containsNode(CNodeData node) const
+CMind::CMind(int projId, int evalType, QObject *parent) : QObject(parent), m_projectId(projId), m_evalType(evalType) { }
+
+QList<CNodeData> CMind::nodeList() const
 {
-    if (node.id >= 0) {
-        return containsNodeWithId(node.id);
-    }
-    return containsNodeWithNumber(node.number);
+    return m_nodeList;
 }
 
-bool CMind::containsNodeWithId(int id) const
+void CMind::setNodeList(QList<CNodeData> list)
 {
-    for (auto n : m_nodeList) {
-        if (n.id == id) {
-            return true;
-        }
+    m_nodeList.clear();
+    m_numberList.clear();
+    for (CNodeData n : list) {
+        addNode(n);
     }
-    return false;
 }
 
-bool CMind::containsNodeWithNumber(int num) const
+bool CMind::isNodeValid(CNodeData n) const
 {
-    for (auto n : m_nodeList) {
-        if (n.number == num) {
-            return true;
-        }
-    }
-    return false;
+    bool v = n.isValid() && n.projectId == m_projectId && n.evalType == m_evalType;
+    return v;
 }
 
-void CMind::addNode(CNodeData node)
+CNodeData CMind::node(int number) const
 {
-    m_nodeList.append(node);
+    int i = m_numberList.indexOf(number);
+    return m_nodeList[i];
 }
 
-void CMind::removeNode(CNodeData node, bool removeChildren)
+bool CMind::containsNode(CNodeData n) const
 {
-    removeNodeByNumber(node.number, removeChildren);
+    return isNodeValid(n) && node(n.number).isValid();
 }
 
-void CMind::removeNodeById(int id, bool removeChildren)
+void CMind::addNode(CNodeData n)
 {
-    for (auto n : m_nodeList) {
-        if (n.id == id) {
-            removeNodeByNumber(n.number, removeChildren);
-        }
+    if (isNodeValid(n) == false) {
+        return;
+    }
+
+    if (m_numberList.contains(n.number)) {
+        return;
     }
+
+    m_nodeList.append(n);
+    m_numberList.append(n.number);
 }
 
-void CMind::removeNodeByNumber(int number, bool removeChildren)
+void CMind::removeNode(int number, bool removeChildren)
 {
     for (int i = 0; i < m_nodeList.count(); i++) {
         CNodeData n = m_nodeList[i];
         if (n.number == number || (removeChildren && n.pNumber == number)) {
             m_nodeList.removeAt(i);
+            m_numberList.removeAt(i);
         }
     }
 }

+ 14 - 5
QFD/CCanvas/CMind.h

@@ -12,6 +12,10 @@ struct CNodeData
     int pNumber   = -1;  // 父节点编号
     QString name;        // 名称
     QString remark;      // 备注
+
+    bool isValid() const;
+    bool isCached() const;
+    bool hasParent() const;
 };
 
 class CMind : public QObject
@@ -19,22 +23,27 @@ class CMind : public QObject
     Q_OBJECT
 
 public:
-    explicit CMind(QObject *parent = nullptr);
+    explicit CMind(int projId = -1, int evalType = 0, QObject *parent = nullptr);
 
     // 节点数据
     QList<CNodeData> nodeList() const;
     void setNodeList(QList<CNodeData> list);
 
+    CNodeData nodeWithId(int id) const;
+    CNodeData nodeWithNumber(int number) const;
+
     bool containsNode(CNodeData node) const;
-    bool containsNodeWithId(int id) const;
-    bool containsNodeWithNumber(int num) const;
+
     void addNode(CNodeData node);
-    void removeNode(CNodeData node, bool removeChildren = true);
     void removeNodeById(int id, bool removeChildren = true);
     void removeNodeByNumber(int number, bool removeChildren = true);
 
 private:
-    QList<CNodeData> m_nodeList;
+    QList<CNodeData> m_nodeList;  // 节点列表
+    QList<int> m_numberList;      // 节点编号列表
+
+    int m_projectId = -1;
+    int m_evalType  = 0;
 };
 
 #endif  // CMIND_H