diff options
-rw-r--r-- | picfilesmodel.cpp | 70 | ||||
-rw-r--r-- | picfilesmodel.h | 2 | ||||
-rw-r--r-- | pictureviewer2.cpp | 87 | ||||
-rw-r--r-- | 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<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); 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<QPair<int, QString> > &files); bool changeMappings(const QList<int> &fileIds, const QList<QVariant> &parentIds); QList<MappingData> mappingDataFromFile(int fileId) const; + SmTreeItem *mappingTreeFromFile(int fileId) const; + SmTreeItem *findRecursive(SmTreeItem *start, const QVariant &name, const QVariant id) const; QList<MappingData> mappingDataFromFiles(const QList<int> 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 <QSettings> #include <QTextDocument> #include <QTextCursor> -#include <QTextTableCell> -#include <QTextTableFormat> -#include <QTextTableCellFormat> #include <QFileInfo> #include <QDir> #include <QFileInfo> @@ -483,65 +480,12 @@ void PictureViewer2::constructInfoItem(const PicData &data, QSize picSize){ } void PictureViewer2::constructMappingItem(const PicData &file){ - QList<MappingData> mapData = mPicFilesModel->mappingDataFromFile(file.at(PicFilesModel::Id).toInt()); - QList<QStringList> 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<QString, QStringList> 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<QString, QStringList>::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(); |