summaryrefslogtreecommitdiffstats
path: root/picfilesmodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'picfilesmodel.cpp')
-rw-r--r--picfilesmodel.cpp70
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);