|
@@ -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;
|