summaryrefslogtreecommitdiffstats
path: root/mappingtreemodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mappingtreemodel.cpp')
-rw-r--r--mappingtreemodel.cpp187
1 files changed, 79 insertions, 108 deletions
diff --git a/mappingtreemodel.cpp b/mappingtreemodel.cpp
index 62cec14..cb981d0 100644
--- a/mappingtreemodel.cpp
+++ b/mappingtreemodel.cpp
@@ -11,6 +11,7 @@
#include "mappingtreemodel.h"
#include "smtreeitem.h"
+#include "smglobals.h"
MappingTreeModel::MappingTreeModel(QStringList &headers, QObject *parent) : SmTreeModel(headers, parent), mForbidden("/"), mType(-1) {
//init database
@@ -72,34 +73,19 @@ QList<QVariant> MappingTreeModel::childList(const QVariant &value, int column) c
return QList<QVariant>() << value;
}
-QStringList MappingTreeModel::path(QModelIndex &idx) const{
- if(!idx.isValid()){
- return QStringList();
+QModelIndex MappingTreeModel::indexFromParentPath(const QList<int> &pPath, bool reverse) const{
+ QList<int> path = pPath;
+ if(reverse){
+ std::reverse(path.begin(), path.end());
}
- QStringList retval;
- SmTreeItem *item = static_cast<SmTreeItem*>(idx.internalPointer());
- do {
- QString d = item->data(MappingTreeModel::Name).toString();
- if(!d.isEmpty()){
- retval << d;
+ QModelIndex retval = QModelIndex();
+ while(!path.isEmpty()){
+ int curId = path.last();
+ path.removeLast();
+ retval = find(curId, MappingId, retval);
+ if(!retval.isValid()){
+ return QModelIndex();
}
- item = item->parent();
- }while(item);
- std::reverse(retval.begin(), retval.end());
- return retval;
-}
-
-QModelIndex MappingTreeModel::indexFromPath(const QString &path, int column) const{
- if(path == "/"){
- return rootIndex();
- }
- QStringList items = path.split("/");
- if(items.isEmpty() || column >= NumFields){
- return QModelIndex();
- }
- QModelIndex retval;
- for(int i = 0; i < items.count(); ++i){
- retval = find(items.at(i), column, retval);
}
return retval;
}
@@ -135,24 +121,6 @@ bool MappingTreeModel::setData(const QModelIndex &idx, const QVariant &value, in
return true;
}
-bool MappingTreeModel::move(const QModelIndex &source, const QModelIndex &dest){
- QVariant sourceId = source.data(MappingIdRole);
- QVariant destId = dest.data(MappingIdRole);
- QSqlQuery updateParentQ(mDb);
- updateParentQ.prepare("UPDATE mapping_parents SET iparent_id = :id where imapping_parents_id = :sid");
- updateParentQ.bindValue(":id", destId);
- updateParentQ.bindValue(":sid", sourceId);
- if(updateParentQ.exec()){
- // well, well, I tried to make this work with removeRows and insertRows,
- // but qt has a mind of its own there. So take the easy way out. Also,
- // it's way faster!
- populate();
- return true;
- }
- mLastError = updateParentQ.lastError();
- return false;
-}
-
bool MappingTreeModel::addMappingType(const QString &type){
QSqlQuery addMappingTypeQ(mDb);
addMappingTypeQ.prepare("INSERT INTO mappings_type (tmappings_type_name) VALUES(:value)");
@@ -242,16 +210,18 @@ MappingData MappingTreeModel::mappingDataFromIndex(QModelIndex &idx) const{
return retval;
}
retval.mappingId = idx.data(MappingTreeModel::MappingIdRole).toInt();
- retval.parentId = idx.data(MappingTreeModel::MappingParentIdRole).toInt();
retval.descId = idx.data(MappingTreeModel::DescIdRole).toInt();
retval.name = idx.data(MappingTreeModel::NameRole).toString();
- retval.path << path(idx);
- return retval;
-}
-
-QStringList MappingTreeModel::paths() const{
- QStringList retval = QStringList() << "/";
- retval << getPathsRecursive(root());
+ retval.parents << idx.data(MappingTreeModel::MappingIdRole).toInt();
+ retval.path << idx.data(MappingTreeModel::NameRole).toString();
+ QModelIndex pIdx = idx.parent();
+ while(pIdx.isValid()){
+ retval.parents << pIdx.data(MappingTreeModel::MappingIdRole).toInt();
+ retval.path << pIdx.data(MappingTreeModel::NameRole).toString();
+ pIdx = pIdx.parent();
+ }
+ std::reverse(retval.parents.begin(), retval.parents.end());
+ std::reverse(retval.path.begin(), retval.path.end());
return retval;
}
@@ -362,21 +332,6 @@ bool MappingTreeModel::updateChild(SmTreeItem *item, const QVariant &value){
return false;
}
-QStringList MappingTreeModel::getPathsRecursive(SmTreeItem *parent) const{
- QStringList retval;
- if(!basePath(parent).isEmpty()){
- retval << basePath(parent);
- }
- for(int i = 0; i < parent->childCount(); ++i){
- if(parent->child(i)->childCount()){
- retval << getPathsRecursive(parent->child(i));
- }else{
- retval << QString("%1/%2").arg(basePath(parent)).arg(parent->child(i)->data(Name).toString());
- }
- }
- return retval;
-}
-
QList<QVariant> MappingTreeModel::getChildListRecursive(SmTreeItem *item, int column) const{
QList<QVariant> retval;
if(!item){
@@ -423,6 +378,26 @@ Qt::ItemFlags MappingTreeResultModel::flags(const QModelIndex &index) const {
return (Qt::ItemIsEnabled | Qt::ItemIsSelectable);
}
+QVariant MappingTreeResultModel::data(const QModelIndex &index, int role) const{
+ if(!index.isValid()){
+ return QVariant();
+ }
+ SmTreeItem *item = itemAt(index);
+ if(role == NameRole){
+ return item->data(Name);
+ }
+ if(role == MappingIdRole){
+ return item->data(MappingId);
+ }
+ if(role == DescIdRole){
+ return item->data(DescId);
+ }
+ if(role == ParentIdRole){
+ return item->data(ParentId);
+ }
+ return SmTreeModel::data(index, role);
+}
+
bool MappingTreeResultModel::setData(const QModelIndex &index, const QVariant &value, int role){
SmTreeItem *item = itemAt(index);
if(role == NameRole){
@@ -445,50 +420,46 @@ bool MappingTreeResultModel::setData(const QModelIndex &index, const QVariant &v
}
void MappingTreeResultModel::addItem(const MappingData &data){
- SmTreeItem *curItem = root();
- QList<QStringList> paths = data.path;
- foreach(QStringList p, paths){
- for(int i = 0; i < p.count(); ++i){
- int childPos = hasChild(curItem, p.at(i));
- if(childPos != -1){
- //child already exists
- curItem = curItem->child(childPos);
- continue;
+ QList<int> pPath = data.parents;
+ QList<int> curPath;
+ std::reverse(pPath.begin(), pPath.end());
+ MappingTreeModel *mapModel = qobject_cast<MappingTreeModel*>(SmGlobals::instance()->model("MappingTree"));
+ QModelIndex curIdx = QModelIndex();
+ int curId = -1;
+ while(!pPath.isEmpty()){
+ curId = pPath.last();
+ curPath << curId;
+ pPath.removeLast();
+ QModelIndex lastIdx = curIdx;
+ curIdx = find(curId, MappingId, curIdx);
+ if(!curIdx.isValid()){
+ QModelIndex sourceIdx = mapModel->indexFromParentPath(curPath, true);
+ if(!sourceIdx.isValid()){
+ return; //should never happen!
+ }
+ SmTreeItem *pItem;
+ if(!lastIdx.isValid()){
+ pItem = root();
}else{
- //insert child
- int mappingId = -1;
- int parentId = -1;
- int descId = -1;
- if(i == p.count() - 1){
- mappingId = data.mappingId;
- parentId = data.parentId;
- descId = data.descId;
- }
- QModelIndex curIdx = insertChild(p.at(i), mappingId, parentId, descId, curItem);
- curItem = itemAt(curIdx);
+ pItem = static_cast<SmTreeItem*>(lastIdx.internalPointer());
}
- }
- }
-}
-
-QModelIndex MappingTreeResultModel::insertChild(const QVariant &data, int mappingId, int parentId, int descId, SmTreeItem *parent){
- QModelIndex parentIdx;
- int row = parent->childCount();
- if(parent != root()){
- for(int i = 0; i < parent->childCount(); ++i){
- if(parent->child(i)->data(0).toString() > data.toString()){
- row = i;
+ int row = pItem->childCount();
+ const QString curName = sourceIdx.data(MappingTreeModel::NameRole).toString();
+ for(int i = 0; i < pItem->childCount(); ++i){
+ if(pItem->child(i)->data(Name).toString() > curName){
+ row = i;
+ }
}
+ insertRows(row, 1, lastIdx);
+ QModelIndex newIdx = index(row, 0, lastIdx);
+ setData(newIdx, curName, NameRole);
+ setData(newIdx, sourceIdx.data(MappingTreeModel::MappingIdRole), MappingIdRole);
+ setData(newIdx, sourceIdx.data(MappingTreeModel::DescIdRole), DescIdRole);
+ setData(newIdx, sourceIdx.data(MappingTreeModel::MappingParentIdRole), ParentIdRole);
+ setData(newIdx, sourceIdx.data(MappingTreeModel::DescIdRole), DescIdRole);
+ curIdx = newIdx;
}
- parentIdx = createIndex(0, 0, parent);
}
- insertRows(row, 1, parentIdx);
- QModelIndex newIdx = index(row, 0, parentIdx);
- setData(newIdx, data, NameRole);
- setData(newIdx, mappingId, MappingIdRole);
- setData(newIdx, descId, DescIdRole);
- setData(newIdx, parentId, ParentIdRole);
- return newIdx;
}
QList<QVariant> MappingTreeResultModel::columnValues(int column) const {
@@ -524,8 +495,8 @@ QList<QVariant> MappingTreeResultModel::columnValuesRecursive(SmTreeItem *parent
return retval;
}
-MappingData::MappingData() : mappingId(-1), parentId(-1), descId(-1) {}
+MappingData::MappingData() : mappingId(-1), descId(-1) {}
bool MappingData::isValid(){
- return !(mappingId == -1 && parentId == -1 && descId == -1);
+ return !(mappingId == -1 && descId == -1);
}