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