From f295cfb8672d97bb5c804499bdb311a9a0d8039b Mon Sep 17 00:00:00 2001 From: Arno Date: Sun, 29 Jun 2014 09:41:30 +0200 Subject: Major rework of MappingTreeResultView + Model Well, I hope this fixes the crashes for good. String comparison for looking up the parents really wasn't a prudent thing to do... Use the ParentIds instead. --- mappingtreemodel.cpp | 187 ++++++++++++++++++++++----------------------------- 1 file changed, 79 insertions(+), 108 deletions(-) (limited to 'mappingtreemodel.cpp') 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 MappingTreeModel::childList(const QVariant &value, int column) c return QList() << value; } -QStringList MappingTreeModel::path(QModelIndex &idx) const{ - if(!idx.isValid()){ - return QStringList(); +QModelIndex MappingTreeModel::indexFromParentPath(const QList &pPath, bool reverse) const{ + QList path = pPath; + if(reverse){ + std::reverse(path.begin(), path.end()); } - QStringList retval; - SmTreeItem *item = static_cast(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 MappingTreeModel::getChildListRecursive(SmTreeItem *item, int column) const{ QList 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 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 pPath = data.parents; + QList curPath; + std::reverse(pPath.begin(), pPath.end()); + MappingTreeModel *mapModel = qobject_cast(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(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 MappingTreeResultModel::columnValues(int column) const { @@ -524,8 +495,8 @@ QList 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); } -- cgit v1.2.3-70-g09d2