diff options
author | Arno <am@disconnect.de> | 2014-07-09 13:32:26 +0200 |
---|---|---|
committer | Arno <am@disconnect.de> | 2014-07-09 13:32:26 +0200 |
commit | 7a2c2c37d4324935ea55221b57d1c878fff4860e (patch) | |
tree | 9f1a15a156d2862e2b99c8f22917ef593aab8ca0 /picfilesmodel.cpp | |
parent | 6fb379069d1ec4fab504b56c9f0e80baee1d8d7d (diff) | |
download | SheMov-7a2c2c37d4324935ea55221b57d1c878fff4860e.tar.gz SheMov-7a2c2c37d4324935ea55221b57d1c878fff4860e.tar.bz2 SheMov-7a2c2c37d4324935ea55221b57d1c878fff4860e.zip |
Bring back the nice MappingItem!
Resurrect the indented MappingItem. There's some recursion involved, but
actually it ain't so hard if you have a template :)
This adventure uncovered a bug in NewPicsDialog: Right now we also
record the nodes (not just the leaves) for the Mappings. This bug was
introduced by commit dc7cc269a4fffe43bdac2ae2dc6548fbd1e3bb5e and will
be fixed in one of the next commits.
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); |