diff options
Diffstat (limited to 'picfilesmodel.cpp')
-rw-r--r-- | picfilesmodel.cpp | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/picfilesmodel.cpp b/picfilesmodel.cpp index edb7a23..f340a9d 100644 --- a/picfilesmodel.cpp +++ b/picfilesmodel.cpp @@ -160,6 +160,76 @@ bool PicFilesModel::changeMappings(const QList<int> &fileIds, const QList<QVaria return false; } +SmTreeItem *PicFilesModel::mappingTreeFromFile(int fileId) const{ + QList<int> fileIds = QList<int>() << fileId; + QList<int> parentIds = mappingPIdsFromFiles(fileIds); + if(parentIds.isEmpty()){ + return 0; + } + SmTreeItem *retval = new SmTreeItem(2); + QSqlQuery mpq(mDb); + mpq.prepare("SELECT imapping_parents_id, iparent_id, tdescription_name, mapping_parents.idescription_id FROM mapping_parents, mapping_description WHERE imapping_parents_id = :id AND mapping_parents.idescription_id = mapping_description.idescription_id"); + foreach(int pId, parentIds){ + QList<QVariantList> curData; + int curParent = -1; + mpq.bindValue(":id", pId); + mpq.exec(); + while(mpq.next()){ + QVariantList d; + d << mpq.value(2) << mpq.value(0); + curData << d; + curParent = mpq.value(1).toInt(); + } + while(curParent != -1){ + mpq.bindValue(":id", curParent); + mpq.exec(); + while(mpq.next()){ + QVariantList d; + d << mpq.value(2) << mpq.value(0); + curData << d; + curParent = mpq.value(1).toInt(); + } + } + std::reverse(curData.begin(), curData.end()); + SmTreeItem *parentItem = retval; + for(int i = 0; i < curData.size(); ++i){ + QVariantList data = curData.at(i); + SmTreeItem *searchItem = findRecursive(parentItem, data.at(0), data.at(1)); + if(searchItem){ + parentItem = searchItem; + }else{ + SmTreeItem *newChild = new SmTreeItem(data, parentItem); + parentItem->appendChild(newChild); + parentItem = newChild; + } + } + } + return retval; +} + +SmTreeItem *PicFilesModel::findRecursive(SmTreeItem *start, const QVariant &name, const QVariant id) const{ + if(!start){ + return 0; + } + if(start->data(0) == name && start->data(1) == id){ + return start; + } + for(int i = 0; i < start->childCount(); ++i){ + SmTreeItem *child = start->child(i); + if(child->data(0) == name && start->data(1) == id){ + return child; + } + if(child->childCount()){ + return findRecursive(child, name, id); + } + } + SmTreeItem *next = start->next(); + if(next){ + return findRecursive(next, name, id); + } + return 0; +} + QList<MappingData> PicFilesModel::mappingDataFromFile(int fileId) const{ QList<int> d = QList<int>() << fileId; return mappingDataFromFiles(d); |