summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--picfilesmodel.cpp70
-rw-r--r--picfilesmodel.h2
-rw-r--r--pictureviewer2.cpp87
-rw-r--r--pictureviewer2.h1
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();