From 7a2c2c37d4324935ea55221b57d1c878fff4860e Mon Sep 17 00:00:00 2001 From: Arno Date: Wed, 9 Jul 2014 13:32:26 +0200 Subject: 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. --- picfilesmodel.cpp | 70 +++++++++++++++++++++++++++++++++++++++++++ picfilesmodel.h | 2 ++ pictureviewer2.cpp | 87 ++++++++++++++++++------------------------------------ pictureviewer2.h | 1 + 4 files changed, 101 insertions(+), 59 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 &fileIds, const QList fileIds = QList() << fileId; + QList 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 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 PicFilesModel::mappingDataFromFile(int fileId) const{ QList d = QList() << fileId; return mappingDataFromFiles(d); diff --git a/picfilesmodel.h b/picfilesmodel.h index a5a9859..ad28e1a 100644 --- a/picfilesmodel.h +++ b/picfilesmodel.h @@ -30,6 +30,8 @@ class PicFilesModel : public SmTreeModel { void removeFiles(const QList > &files); bool changeMappings(const QList &fileIds, const QList &parentIds); QList mappingDataFromFile(int fileId) const; + SmTreeItem *mappingTreeFromFile(int fileId) const; + SmTreeItem *findRecursive(SmTreeItem *start, const QVariant &name, const QVariant id) const; QList mappingDataFromFiles(const QList fileIds) const; public slots: diff --git a/pictureviewer2.cpp b/pictureviewer2.cpp index 4532030..dbb1763 100644 --- a/pictureviewer2.cpp +++ b/pictureviewer2.cpp @@ -20,9 +20,6 @@ #include #include #include -#include -#include -#include #include #include #include @@ -483,65 +480,12 @@ void PictureViewer2::constructInfoItem(const PicData &data, QSize picSize){ } void PictureViewer2::constructMappingItem(const PicData &file){ - QList mapData = mPicFilesModel->mappingDataFromFile(file.at(PicFilesModel::Id).toInt()); - QList mappings; + SmTreeItem *mapData = mPicFilesModel->mappingTreeFromFile(file.at(PicFilesModel::Id).toInt()); QTextDocument *doc = new QTextDocument; doc->setIndentWidth(2); doc->setDocumentMargin(8); - QTextCursor *cursor = new QTextCursor(doc); - if(mapData.isEmpty()){ - QString itemString = QString("%1 (none)").arg(QChar(0x2640)); - cursor->insertText(itemString); - }else{ - QMap sortedPaths; - int maxRows = 0; - foreach(MappingData d, mapData){ - QStringList pItems = d.path; - if(pItems.size() > maxRows){ - maxRows = pItems.size(); - } - QString mapKey = pItems.join("/"); - sortedPaths.insert(mapKey, pItems); - } - QTextTable *table = cursor->insertTable(sortedPaths.size(), 1); - QTextTableFormat fmt; - fmt.setBorder(0); - table->setFormat(fmt); - QMap::const_iterator it = sortedPaths.constBegin(); - int row = 0; - while(it != sortedPaths.constEnd()){ - QChar bullet(0x2640); - if(row % 2){ - bullet = QChar(0x2642); - } - QStringList pItems = it.value(); - int column = 0; - QTextTableCell curCell = table->cellAt(row, column); - curCell.firstCursorPosition().insertText(bullet); - for(int i = 0; i < pItems.size(); ++i){ - if(table->columns() - 1 < column + 1){ - table->appendColumns(1); - } - ++column; - curCell = table->cellAt(row, column); - curCell.firstCursorPosition().insertText(pItems.at(i)); - if(i + 1 < pItems.size()){ - if(table->columns() - 1 < column + 1){ - table->appendColumns(1); - } - ++column; - curCell = table->cellAt(row, column); - QTextTableCellFormat cfmt; - cfmt.setRightPadding(5); - curCell.setFormat(cfmt); - curCell.firstCursorPosition().insertText(QChar(0x2192)); - } - } - ++it; - ++row; - } - } - + QTextCursor *cur = new QTextCursor(doc); + docFromTree(mapData, cur, 0); if(mMappingItem){ mMappingPos = mMappingItem->scenePos(); mScene->removeItem(mMappingItem); @@ -550,6 +494,31 @@ void PictureViewer2::constructMappingItem(const PicData &file){ mMappingItem = new PictureViewer2Item(doc); mMappingItem->setPos(getPos(mMappingItem, mConfigMapPos, mMappingPos)); mScene->addItem(mMappingItem); + delete mapData; +} + +void PictureViewer2::docFromTree(SmTreeItem *start, QTextCursor *cur, int indent){ + if(!start){ + return; + } + QChar bullet(0x2640); + if(indent % 2){ + bullet = QChar(0x2642); + } + for(int i = 0; i < start->childCount(); ++i){ + SmTreeItem *child = start->child(i); + if(!cur->atStart()){ + cur->insertBlock(); + } + QTextBlockFormat fmt; + fmt.setIndent(4 * indent); + cur->setBlockFormat(fmt); + QString text = QString("%1 %2").arg(bullet).arg(child->data(0).toString()); + cur->insertText(text); + if(child->childCount()){ + docFromTree(child, cur, indent + 1); + } + } } void PictureViewer2::setGradient(const QPixmap &pic){ diff --git a/pictureviewer2.h b/pictureviewer2.h index 6a1c92a..99405e0 100644 --- a/pictureviewer2.h +++ b/pictureviewer2.h @@ -77,6 +77,7 @@ class PictureViewer2 : public QGraphicsView { void showFile(const PicData &data); void constructInfoItem(const PicData &file, QSize picSize); void constructMappingItem(const PicData &file); + void docFromTree(SmTreeItem *start, QTextCursor *cur, int indent); private: void setupDialog(); -- cgit v1.2.3-70-g09d2