diff options
author | Arno <am@disconnect.de> | 2012-10-04 06:59:44 +0200 |
---|---|---|
committer | Arno <am@disconnect.de> | 2012-10-04 07:01:29 +0200 |
commit | 184448e767ccdeae66fe4d795757cace98033b0e (patch) | |
tree | 26cafbb4fbafe94406413439c0cbd36f5cd66cc3 | |
parent | deeec5306a37e2280626f3486a07629570aafe92 (diff) | |
download | SheMov-184448e767ccdeae66fe4d795757cace98033b0e.tar.gz SheMov-184448e767ccdeae66fe4d795757cace98033b0e.tar.bz2 SheMov-184448e767ccdeae66fe4d795757cace98033b0e.zip |
Fix Mappings in PictureViewer2
Another fix for the new MappingTreeModel database layout: Make the
mappings display correctly when showing an archived picture.
For performance reasons I had to make PicFilesModel global and put it
into a separate file.
Also clean up MappingTreeModel: remove comments and unused functions.
-rw-r--r-- | mappingtreemodel.cpp | 105 | ||||
-rw-r--r-- | mappingtreemodel.h | 9 | ||||
-rw-r--r-- | mappingtreewidget.cpp | 2 | ||||
-rw-r--r-- | picfilesmodel.cpp | 219 | ||||
-rw-r--r-- | picfilesmodel.h | 49 | ||||
-rw-r--r-- | pictureswidget.cpp | 198 | ||||
-rw-r--r-- | pictureswidget.h | 34 | ||||
-rw-r--r-- | pictureviewer2.cpp | 51 | ||||
-rw-r--r-- | pictureviewer2.h | 3 | ||||
-rw-r--r-- | shemov.pro | 6 | ||||
-rw-r--r-- | smglobals.cpp | 7 |
11 files changed, 344 insertions, 339 deletions
diff --git a/mappingtreemodel.cpp b/mappingtreemodel.cpp index f2af964..c32574a 100644 --- a/mappingtreemodel.cpp +++ b/mappingtreemodel.cpp @@ -115,11 +115,12 @@ SmTreeItem *MappingTreeModel::treeFromPaths(const QStringList &paths){ }else{ //create a new item, save old root SmTreeItem *oldRoot = pItem; - pItem = new SmTreeItem(QList<QVariant>() << parts.at(j), oldRoot); + pItem = new SmTreeItem(QList<QVariant>() << parts.at(j), partsHash.value(parts.at(j))); oldRoot->appendChild(pItem); partsHash.insert(parts.at(j), pItem); } } + pItem = root; } return root; } @@ -141,11 +142,6 @@ QVariant MappingTreeModel::data(const QModelIndex &index, int role) const{ if(role == MapParentIdRole){ return item->data(MapParentId); } - if(role == Qt::ForegroundRole){ - if(mSelectedMappings.contains(item)){ - return QColor(Qt::blue); - } - } return SmTreeModel::data(index, role); } @@ -292,13 +288,6 @@ bool MappingTreeModel::deleteMappingType(int typeId){ return false; } -/* - * FIXME! - * this is total crap. The model has to be redesigned. - * Like this children can never have the same name as parents. - * Too drunk to think about it now. - */ - bool MappingTreeModel::addChild(const QVariant &name, const QModelIndex &parent){ if(!parent.isValid()){ return false; @@ -324,34 +313,8 @@ bool MappingTreeModel::addChild(const QVariant &name, const QModelIndex &parent) QModelIndex newIdx = index(where, 0, parent); setData(newIdx, name, NameRole); setData(newIdx, id, IdRole); - //setData(newIdx, AddedRole); return true; } - - /*mAddChildQ->bindValue(":name", name); - mAddChildQ->bindValue(":type", mType); - if(mAddChildQ->exec()){ - mSelectChildQ->bindValue(":name", name); - mSelectChildQ->bindValue(":type", mType); - mSelectChildQ->exec(); - while(mSelectChildQ->next()){ - int where = lowerBound(pItem, mSelectChildQ->value(1), Name); - if(insertRows(where, 1, parent)){ - QModelIndex newIdx = index(where, 0, parent); - setData(newIdx, mSelectChildQ->value(1), NameRole); - setData(newIdx, mSelectChildQ->value(0), IdRole); - setData(newIdx, mSelectChildQ->value(2), AddedRole); - } - if(pItem->parent() != root()){ - mAddParentQ->bindValue(":id", mSelectChildQ->value(0)); //Id - mAddParentQ->bindValue(":parentid", pItem->data(Id)); - mAddParentQ->exec(); - } - //mValidMappings.clear(); - //mValidMappings = mappingData(root()); - return true; - } - }*/ return false; } @@ -366,8 +329,6 @@ bool MappingTreeModel::deleteChild(const QModelIndex &idx){ mDeleteChildQ->bindValue(":id", item->data(Id)); if(mDeleteChildQ->exec()){ removeRows(idx.row(), 1, idx.parent()); - mValidMappings.clear(); - mValidMappings = mappingData(root()); return true; } return false; @@ -382,36 +343,13 @@ int MappingTreeModel::childCount(const QModelIndex &idx) const{ } MappingData MappingTreeModel::mappingDataFromIndex(QModelIndex &idx) const{ - MappingData retval = { -1, QString(), QStringList() }; + MappingData retval = { -1, QString(), QList<QStringList>() }; if(!idx.isValid()){ return retval; } retval.id = idx.data(MappingTreeModel::MapParentIdRole).toInt(); retval.name = idx.data(MappingTreeModel::NameRole).toString(); - retval.path = path(idx); - return retval; -} - -//continue here! -MappingData MappingTreeModel::mappingDataFromId(int mappingId) const{ - MappingData retval = { -1, QString(), QStringList() }; - QModelIndex mapIdx = findRecursive(mappingId, MappingTreeModel::Id, rootIndex()); - //REMOVE ME - Q_ASSERT(mapIdx.isValid()); - retval.id = mappingId; - retval.name = mapIdx.data(MappingTreeModel::NameRole).toString(); - qDebug() << "mapping" << retval.id << retval.name; - SmTreeItem *mapItem = static_cast<SmTreeItem*>(mapIdx.internalPointer()); - //REMOVE ME - Q_ASSERT(mapItem); - //retval.path = path(mapItem); - - /*foreach(MappingData d, mValidMappings){ - if(d.id == mappingId){ - retval = d; - break; - } - }*/ + retval.path << path(idx); return retval; } @@ -438,8 +376,6 @@ void MappingTreeModel::populate(){ getChildrenRecursive(childItem); } setRoot(rootItem); - //mValidMappings.clear(); - //mValidMappings = mappingData(root()); emit needExpansion(); } } @@ -571,7 +507,7 @@ QList<MappingData> MappingTreeModel::mappingData(SmTreeItem *item){ retval << mappingData(item->child(i)); } } - MappingData mapItem = { item->data(Id).toInt(), item->data(Name).toString(), QStringList() }; + MappingData mapItem = { item->data(Id).toInt(), item->data(Name).toString(), QList<QStringList>() }; QStringList path; SmTreeItem *p = item; while(p->parent()){ @@ -579,7 +515,7 @@ QList<MappingData> MappingTreeModel::mappingData(SmTreeItem *item){ p = p->parent(); } std::reverse(path.begin(), path.end()); - mapItem.path = path; + mapItem.path << path; retval << mapItem; return retval; } @@ -606,20 +542,23 @@ bool MappingTreeResultModel::setData(const QModelIndex &index, const QVariant &v void MappingTreeResultModel::addItem(const MappingData &data){ SmTreeItem *curItem = root(); - for(int i = 0; i < data.path.count(); ++i){ - int childPos = hasChild(curItem, data.path.at(i)); - if(childPos != -1){ - //child already exists - curItem = curItem->child(childPos); - continue; - }else{ - //insert child - int id = -1; - if(i == data.path.count() - 1){ - id = data.id; + QList<QStringList> paths = data.path; + foreach(QStringList p, paths){ + for(int i = 0; i < p.count(); ++i){ + int childPos = hasChild(curItem, p.at(i)); + if(childPos != -1){ + //child already exists + curItem = curItem->child(childPos); + continue; + }else{ + //insert child + int id = -1; + if(i == p.count() - 1){ + id = data.id; + } + QModelIndex curIdx = insertChild(p.at(i), id, curItem); + curItem = itemAt(curIdx); } - QModelIndex curIdx = insertChild(data.path.at(i), id, curItem); - curItem = itemAt(curIdx); } } } diff --git a/mappingtreemodel.h b/mappingtreemodel.h index f2771c9..72a7b7f 100644 --- a/mappingtreemodel.h +++ b/mappingtreemodel.h @@ -50,13 +50,12 @@ class MappingTreeModel : public SmTreeModel { bool deleteChild(const QModelIndex &idx); int childCount(const QModelIndex &idx) const; MappingData mappingDataFromIndex(QModelIndex &idx) const; - MappingData mappingDataFromId(int mappingId) const; QStringList paths() const; const QString &forbidden() const { return mForbidden; } public slots: void populate(); - void setType(int type); // { mType = type; } + void setType(int type); signals: void mappingTypesChanged(); @@ -92,8 +91,6 @@ class MappingTreeModel : public SmTreeModel { QSqlQuery *mMappingsForFileIdQ; QSqlQuery *mMappingsQ; QList<mappingType> mMappingTypes; - QList<MappingData> mValidMappings; - QList<SmTreeItem*> mSelectedMappings; QMap<QString, int> mMappings; const QString mForbidden; int mType; @@ -125,7 +122,9 @@ class MappingTreeResultModel : public SmTreeModel { struct MappingData { int id; QString name; - QStringList path; + QList<QStringList> path; }; +Q_DECLARE_METATYPE(QList<QStringList>) + #endif // MAPPINGTREEMODEL_H diff --git a/mappingtreewidget.cpp b/mappingtreewidget.cpp index 82a1490..92366e0 100644 --- a/mappingtreewidget.cpp +++ b/mappingtreewidget.cpp @@ -92,7 +92,7 @@ MappingTreeWidget::MappingTreeWidget(QWidget *parent) : QWidget(parent){ } MappingData MappingTreeWidget::selectedItem() const { - MappingData retval = { -1, QString(), QStringList() }; + MappingData retval = { -1, QString(), QList<QStringList>() }; QModelIndex sel = selected(); if(!sel.isValid()){ return retval; diff --git a/picfilesmodel.cpp b/picfilesmodel.cpp new file mode 100644 index 0000000..651ce32 --- /dev/null +++ b/picfilesmodel.cpp @@ -0,0 +1,219 @@ +/* + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ + +#include <QSqlQuery> +#include <QFont> +#include <QFile> +#include <QLocale> + +#include "picfilesmodel.h" +#include "smglobals.h" +#include "smtreeitem.h" +#include "helper.h" + +PicFilesModel::PicFilesModel(const QStringList &headers, QObject *parent) : SmTreeModel(headers, parent) { + //conjure up model + mMappingTreeModel = static_cast<MappingTreeModel*>(SmGlobals::instance()->model("MappingTree")); + + //setup database + mDb = QSqlDatabase::database("treedb"); + mPopulateQS = QString("SELECT DISTINCT(pics.ipicsid), pics.tfilename, pics.isize, pics.tformat, pics.dtadded, pics.cmd5sum FROM pics, pics_mappings2 WHERE pics_mappings2.imappings_parents_id IN (%1) AND pics_mappings2.ipics_id = pics.ipicsid ORDER BY pics.tfilename"); + mMappingsQS = QString("SELECT DISTINCT(pics_mappings2.imappings_parents_id) FROM pics_mappings2, pics WHERE pics_mappings2.ipics_id IN (%1)"); + mDeleteFileQ = new QSqlQuery(mDb); + mDeleteFileQ->prepare("DELETE FROM pics WHERE ipicsid = :id"); + mDeleteMappingsQ = new QSqlQuery(mDb); + mDeleteMappingsQ->prepare("DELETE FROM pics_mappings2 WHERE ipics_id = :id"); + mAddMappingsQ = new QSqlQuery(mDb); + mAddMappingsQ->prepare("INSERT INTO pics_mappings2(ipics_id, imappings_parents_id) VALUES(:pid, :id)"); + +} + +PicFilesModel::~PicFilesModel(){ + delete mDeleteFileQ; + delete mDeleteMappingsQ; + delete mAddMappingsQ; + mDb = QSqlDatabase::database(); +} + +void PicFilesModel::setMapping(int pMapId){ + QList<QVariant> ids = mMappingTreeModel->childList(pMapId, MappingTreeModel::MapParentId); + mMappingIds.clear(); + foreach(QVariant i, ids){ + mMappingIds << i.toInt(); + } +} + +QVariant PicFilesModel::data(const QModelIndex &index, int role) const { + if(role == Qt::FontRole){ + if(index.column() == Md5Sum){ + return QFont("courier"); + } + } + if(role == Qt::ForegroundRole){ + if(index.column() == SizeDisplay){ + int fileSize = index.data(SizeRole).toInt(); + if(fileSize > 1024 * 1024 * 1024){ + return QColor(Qt::red); + }else{ + return QColor(Qt::green); + } + } + } + SmTreeItem *item = itemAt(index); + if(role == FileNameRole){ + return item->data(FileName); + } + if(role == SizeRole){ + return item->data(Size); + } + if(role == MimeTypeRole){ + return item->data(MimeType); + } + if(role == FullPathRole){ + return item->data(FullPath); + } + if(role == IdRole){ + return item->data(Id); + } + if(role == AddedRole){ + return item->data(Added); + } + if(role == Md5SumRole){ + return item->data(Md5Sum); + } + if(role == SizeDisplayRole){ + return item->data(SizeDisplay); + } + return SmTreeModel::data(index, role); +} + +QList<QVariant> PicFilesModel::dataList(const QModelIndex &idx) const{ + QList<QVariant> retval; + if(!idx.isValid()){ + return retval; + } + SmTreeItem *item = itemAt(idx); + for(int i = 0; i < NumFields; ++i){ + retval << item->data(i); + } + QList<MappingData> mapData = mappingDataFromFile(idx.data(PicFilesModel::IdRole).toInt()); + QList<QStringList> mappings; + foreach(MappingData d, mapData){ + mappings << d.path; + } + + retval.append(QVariant::fromValue(mappings)); + return retval; +} + +QList<QList<QVariant> > PicFilesModel::allFiles() const { + QList<QList<QVariant> > retval; + //assume depth of exactly 1 + SmTreeItem *rootItem = root(); + for(int i = 0; i < rootItem->childCount(); ++i){ + SmTreeItem *cur = rootItem->child(i); + QList<QVariant> data; + for(int j = 0; j < cur->columnCount(); ++j){ + data << cur->data(j); + } + retval << data; + } + return retval; +} + +void PicFilesModel::removeFiles(const QList<QPersistentModelIndex> &files){ + foreach(QPersistentModelIndex pi, files){ + mDeleteFileQ->bindValue(":id", pi.data(IdRole)); + if(mDeleteFileQ->exec()){ + QFile::remove(pi.data(FullPathRole).toString()); + removeRows(pi.row(), 1, QModelIndex()); + } + } +} + +bool PicFilesModel::changeMappings(const QList<int> &fileIds, const QList<int> &mappingIds){ + mDb.transaction(); + foreach(int fid, fileIds){ + mDeleteMappingsQ->bindValue(":id", fid); + if(!mDeleteMappingsQ->exec()){ + goto error; + } + foreach(int mid, mappingIds){ + mAddMappingsQ->bindValue(":pid", fid); + mAddMappingsQ->bindValue(":id", mid); + if(!mAddMappingsQ->exec()){ + goto error; + } + } + } + mDb.commit(); + return true; + + error: + mDb.rollback(); + return false; +} + +QList<MappingData> PicFilesModel::mappingDataFromFile(int fileId) const{ + QList<int> d = QList<int>() << fileId; + return mappingDataFromFiles(d); +} + +QList<MappingData> PicFilesModel::mappingDataFromFiles(const QList<int> fileIds) const{ + QList<int> parentIds = mappingPIdsFromFiles(fileIds); + if(parentIds.isEmpty()){ + return QList<MappingData>(); + } + QList<MappingData> retval; + foreach(int pId, parentIds){ + QModelIndex curIdx = mMappingTreeModel->findRecursive(pId, MappingTreeModel::MapParentId, mMappingTreeModel->rootIndex()); + MappingData curData; + curData.id = curIdx.data(MappingTreeModel::MapParentIdRole).toInt(); + curData.name = curIdx.data(MappingTreeModel::NameRole).toString(); + curData.path << mMappingTreeModel->path(curIdx); //.join("/"); + retval << curData; + } + return retval; +} + +QList<int> PicFilesModel::mappingPIdsFromFiles(QList<int> fileIds) const{ + if(fileIds.isEmpty()){ + return QList<int>(); + } + QStringList idList; + foreach(int id, fileIds){ + idList << QString::number(id); + } + QString query = mMappingsQS.arg(idList.join(",")); + QSqlQuery q(query, mDb); + QList<int> retval; + while(q.next()){ + retval << q.value(0).toInt(); + } + return retval; +} + +void PicFilesModel::populate(){ + SmTreeItem *root = new SmTreeItem(NumFields); + QStringList idList; + foreach(int id, mMappingIds){ + idList << QString::number(id); + } + QString query = mPopulateQS.arg(idList.join(",")); + QSqlQuery q(query, mDb); + while(q.next()){ + QList<QVariant> data; + data << q.value(1) << q.value(2) << q.value(3); // Filename, size and Mime type + data << Helper::createArchivePath(q.value(1).toString(), q.value(5).toString()); // full path; + data << q.value(0) << q.value(4) << q.value(5); //Id, added and md5 + QLocale l; + data << l.toString(q.value(2).toInt()); //sizedisplay + SmTreeItem *child = new SmTreeItem(data, root); + root->appendChild(child); + } + setRoot(root); +} diff --git a/picfilesmodel.h b/picfilesmodel.h new file mode 100644 index 0000000..146fbfc --- /dev/null +++ b/picfilesmodel.h @@ -0,0 +1,49 @@ +/* + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ + +#ifndef PICFILESMODEL_H +#define PICFILESMODEL_H + +#include "smtreemodel.h" +#include "mappingtreemodel.h" + +class PicFilesModel : public SmTreeModel { + Q_OBJECT + public: + enum Roles { FileNameRole = Qt::UserRole + 1, SizeRole = Qt::UserRole + 2, MimeTypeRole = Qt::UserRole + 3, FullPathRole = Qt::UserRole + 4, IdRole = Qt::UserRole + 5, AddedRole = Qt::UserRole + 6, Md5SumRole = Qt::UserRole + 7, SizeDisplayRole = Qt::UserRole + 8 }; + enum Fields { FileName = 0, Size = 1, MimeType = 2, FullPath = 3, Id = 4, Added = 5, Md5Sum = 6, SizeDisplay = 7 }; + enum { NumFields = 8 }; + explicit PicFilesModel(const QStringList &headers, QObject *parent = 0); + ~PicFilesModel(); + void setMapping(int pMapId); + + //some data + Qt::ItemFlags flags(const QModelIndex &) const { return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } + QVariant data(const QModelIndex &index, int role) const; + QList<QVariant> dataList(const QModelIndex &idx) const; + QList<QList<QVariant> > allFiles() const; + void removeFiles(const QList<QPersistentModelIndex> &files); + bool changeMappings(const QList<int> &fileIds, const QList<int> &mappingIds); + QList<MappingData> mappingDataFromFile(int fileId) const; + QList<MappingData> mappingDataFromFiles(const QList<int> fileIds) const; + + public slots: + void populate(); + + private: + QList<int> mappingPIdsFromFiles(QList<int> fileIds) const; + QSqlDatabase mDb; + MappingTreeModel *mMappingTreeModel; + QString mPopulateQS; + QString mMappingsQS; + QSqlQuery *mDeleteFileQ; + QSqlQuery *mDeleteMappingsQ; + QSqlQuery *mAddMappingsQ; + QList<int> mMappingIds; +}; + +#endif // PICFILESMODEL_H diff --git a/pictureswidget.cpp b/pictureswidget.cpp index 745a133..661aba6 100644 --- a/pictureswidget.cpp +++ b/pictureswidget.cpp @@ -21,6 +21,7 @@ #include <QSettings> #include "pictureswidget.h" +#include "picfilesmodel.h" #include "mappingtreewidget.h" #include "smtreeitem.h" #include "helper.h" @@ -62,7 +63,7 @@ void PicturesWidget::showPicViewer(bool toggled){ void PicturesWidget::writeSettings(){ QSettings s; MappingData selected = mMappingTree->selectedItem(); - s.setValue("ui/selectedmapping", selected.path); + s.setValue("ui/selectedmapping", selected.path.first()); } void PicturesWidget::readSettings(){ @@ -99,7 +100,7 @@ void PicturesWidget::constructWindowTitle(){ QString windowTitle = mWindowTitleBase; MappingData selected = mMappingTree->selectedItem(); if(selected.id != -1){ - windowTitle = QString("%1 - [%2]").arg(mWindowTitleBase).arg(selected.path.join("/")); + windowTitle = QString("%1 - [%2]").arg(mWindowTitleBase).arg(selected.path.first().join("/")); mPictureView->setHoverWinVisible(false); } emit needWindowTitleChange(windowTitle); @@ -120,7 +121,7 @@ void PicturesWidget::showInPicViewer(const QModelIndex &idx){ PictureView::PictureView(QWidget *parent) : QTreeView(parent) { //setup models - mModel = new PicFilesModel(QStringList() << tr("Filename") << tr("SizeNum") << tr("Format") << tr("Full Path") << tr("Id") << tr("Added") << tr("Md5Sum") << tr("Size"), this); + mModel = static_cast<PicFilesModel*>(SmGlobals::instance()->model("PicFiles")); mProxy = new QSortFilterProxyModel(this); mProxy->setSourceModel(mModel); setModel(mProxy); @@ -269,194 +270,3 @@ void PictureView::selectedFilesChanged(){ emit numSelected(sel.size()); emit selectedSize(selSize); } - -PicFilesModel::PicFilesModel(const QStringList &headers, QObject *parent) : SmTreeModel(headers, parent) { - //conjure up model - mMappingTreeModel = static_cast<MappingTreeModel*>(SmGlobals::instance()->model("MappingTree")); - - //setup database - mDb = QSqlDatabase::database("treedb"); - mPopulateQS = QString("SELECT DISTINCT(pics.ipicsid), pics.tfilename, pics.isize, pics.tformat, pics.dtadded, pics.cmd5sum FROM pics, pics_mappings2 WHERE pics_mappings2.imappings_parents_id IN (%1) AND pics_mappings2.ipics_id = pics.ipicsid ORDER BY pics.tfilename"); - mMappingsQS = QString("SELECT DISTINCT(pics_mappings2.imappings_parents_id) FROM pics_mappings2, pics WHERE pics_mappings2.ipics_id IN (%1)"); - mDeleteFileQ = new QSqlQuery(mDb); - mDeleteFileQ->prepare("DELETE FROM pics WHERE ipicsid = :id"); - mDeleteMappingsQ = new QSqlQuery(mDb); - mDeleteMappingsQ->prepare("DELETE FROM pics_mappings2 WHERE ipics_id = :id"); - mAddMappingsQ = new QSqlQuery(mDb); - mAddMappingsQ->prepare("INSERT INTO pics_mappings2(ipics_id, imappings_parents_id) VALUES(:pid, :id)"); - -} - -PicFilesModel::~PicFilesModel(){ - delete mDeleteFileQ; - delete mDeleteMappingsQ; - delete mAddMappingsQ; - mDb = QSqlDatabase::database(); -} - -void PicFilesModel::setMapping(int pMapId){ - QList<QVariant> ids = mMappingTreeModel->childList(pMapId, MappingTreeModel::MapParentId); - mMappingIds.clear(); - foreach(QVariant i, ids){ - mMappingIds << i.toInt(); - } -} - -QVariant PicFilesModel::data(const QModelIndex &index, int role) const { - if(role == Qt::FontRole){ - if(index.column() == Md5Sum){ - return QFont("courier"); - } - } - if(role == Qt::ForegroundRole){ - if(index.column() == SizeDisplay){ - int fileSize = index.data(SizeRole).toInt(); - if(fileSize > 1024 * 1024 * 1024){ - return QColor(Qt::red); - }else{ - return QColor(Qt::green); - } - } - } - SmTreeItem *item = itemAt(index); - if(role == FileNameRole){ - return item->data(FileName); - } - if(role == SizeRole){ - return item->data(Size); - } - if(role == MimeTypeRole){ - return item->data(MimeType); - } - if(role == FullPathRole){ - return item->data(FullPath); - } - if(role == IdRole){ - return item->data(Id); - } - if(role == AddedRole){ - return item->data(Added); - } - if(role == Md5SumRole){ - return item->data(Md5Sum); - } - if(role == SizeDisplayRole){ - return item->data(SizeDisplay); - } - return SmTreeModel::data(index, role); -} - -QList<QVariant> PicFilesModel::dataList(const QModelIndex &idx) const{ - QList<QVariant> retval; - if(!idx.isValid()){ - return retval; - } - SmTreeItem *item = itemAt(idx); - for(int i = 0; i < NumFields; ++i){ - retval << item->data(i); - } - return retval; -} - -QList<QList<QVariant> > PicFilesModel::allFiles() const { - QList<QList<QVariant> > retval; - //assume depth of exactly 1 - SmTreeItem *rootItem = root(); - for(int i = 0; i < rootItem->childCount(); ++i){ - SmTreeItem *cur = rootItem->child(i); - QList<QVariant> data; - for(int j = 0; j < cur->columnCount(); ++j){ - data << cur->data(j); - } - retval << data; - } - return retval; -} - -void PicFilesModel::removeFiles(const QList<QPersistentModelIndex> &files){ - foreach(QPersistentModelIndex pi, files){ - mDeleteFileQ->bindValue(":id", pi.data(IdRole)); - if(mDeleteFileQ->exec()){ - QFile::remove(pi.data(FullPathRole).toString()); - removeRows(pi.row(), 1, QModelIndex()); - } - } -} - -bool PicFilesModel::changeMappings(const QList<int> &fileIds, const QList<int> &mappingIds){ - mDb.transaction(); - foreach(int fid, fileIds){ - mDeleteMappingsQ->bindValue(":id", fid); - if(!mDeleteMappingsQ->exec()){ - goto error; - } - foreach(int mid, mappingIds){ - mAddMappingsQ->bindValue(":pid", fid); - mAddMappingsQ->bindValue(":id", mid); - if(!mAddMappingsQ->exec()){ - goto error; - } - } - } - mDb.commit(); - return true; - - error: - mDb.rollback(); - return false; -} - -QList<MappingData> PicFilesModel::mappingDataFromFiles(const QList<int> fileIds) const{ - QList<int> parentIds = mappingPIdsFromFiles(fileIds); - if(parentIds.isEmpty()){ - return QList<MappingData>(); - } - QList<MappingData> retval; - foreach(int pId, parentIds){ - QModelIndex curIdx = mMappingTreeModel->findRecursive(pId, MappingTreeModel::MapParentId, mMappingTreeModel->rootIndex()); - MappingData curData; - curData.id = curIdx.data(MappingTreeModel::MapParentIdRole).toInt(); - curData.name = curIdx.data(MappingTreeModel::NameRole).toString(); - curData.path = mMappingTreeModel->path(curIdx); - retval << curData; - } - return retval; -} - -QList<int> PicFilesModel::mappingPIdsFromFiles(QList<int> fileIds) const{ - if(fileIds.isEmpty()){ - return QList<int>(); - } - QStringList idList; - foreach(int id, fileIds){ - idList << QString::number(id); - } - QString query = mMappingsQS.arg(idList.join(",")); - QSqlQuery q(query, mDb); - QList<int> retval; - while(q.next()){ - retval << q.value(0).toInt(); - } - return retval; -} - -void PicFilesModel::populate(){ - SmTreeItem *root = new SmTreeItem(NumFields); - QStringList idList; - foreach(int id, mMappingIds){ - idList << QString::number(id); - } - QString query = mPopulateQS.arg(idList.join(",")); - QSqlQuery q(query, mDb); - while(q.next()){ - QList<QVariant> data; - data << q.value(1) << q.value(2) << q.value(3); // Filename, size and Mime type - data << Helper::createArchivePath(q.value(1).toString(), q.value(5).toString()); // full path; - data << q.value(0) << q.value(4) << q.value(5); //Id, added and md5 - QLocale l; - data << l.toString(q.value(2).toInt()); //sizedisplay - SmTreeItem *child = new SmTreeItem(data, root); - root->appendChild(child); - } - setRoot(root); -} diff --git a/pictureswidget.h b/pictureswidget.h index b2da8ea..9618e6e 100644 --- a/pictureswidget.h +++ b/pictureswidget.h @@ -103,38 +103,4 @@ class PictureView : public QTreeView { MappingTreeModel *mMappingTreeModel; }; -class PicFilesModel : public SmTreeModel { - Q_OBJECT - public: - enum Roles { FileNameRole = Qt::UserRole + 1, SizeRole = Qt::UserRole + 2, MimeTypeRole = Qt::UserRole + 3, FullPathRole = Qt::UserRole + 4, IdRole = Qt::UserRole + 5, AddedRole = Qt::UserRole + 6, Md5SumRole = Qt::UserRole + 7, SizeDisplayRole = Qt::UserRole + 8 }; - enum Fields { FileName = 0, Size = 1, MimeType = 2, FullPath = 3, Id = 4, Added = 5, Md5Sum = 6, SizeDisplay = 7 }; - enum { NumFields = 8 }; - explicit PicFilesModel(const QStringList &headers, QObject *parent = 0); - ~PicFilesModel(); - void setMapping(int pMapId); - - //some data - Qt::ItemFlags flags(const QModelIndex &) const { return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } - QVariant data(const QModelIndex &index, int role) const; - QList<QVariant> dataList(const QModelIndex &idx) const; - QList<QList<QVariant> > allFiles() const; - void removeFiles(const QList<QPersistentModelIndex> &files); - bool changeMappings(const QList<int> &fileIds, const QList<int> &mappingIds); - QList<MappingData> mappingDataFromFiles(const QList<int> fileIds) const; - - public slots: - void populate(); - - private: - QList<int> mappingPIdsFromFiles(QList<int> fileIds) const; - QSqlDatabase mDb; - MappingTreeModel *mMappingTreeModel; - QString mPopulateQS; - QString mMappingsQS; - QSqlQuery *mDeleteFileQ; - QSqlQuery *mDeleteMappingsQ; - QSqlQuery *mAddMappingsQ; - QList<int> mMappingIds; -}; - #endif // PICTURESWIDGET_H diff --git a/pictureviewer2.cpp b/pictureviewer2.cpp index 36701ff..ae18a0c 100644 --- a/pictureviewer2.cpp +++ b/pictureviewer2.cpp @@ -14,9 +14,9 @@ #include <QContextMenuEvent> #include <QMenu> #include <QTimer> +#include <QDateTime> #include <QPainter> #include <QStyleOptionGraphicsItem> -#include <QDate> #include <QSettings> #include <QTextDocument> #include <QTextCursor> @@ -29,6 +29,7 @@ #include <QMessageBox> #include "pictureviewer2.h" +#include "picfilesmodel.h" #include "pictureswidget.h" #include "smglobals.h" #include "mappingtreemodel.h" @@ -52,6 +53,10 @@ PictureViewer2::PictureViewer2(QWidget *parent) : QGraphicsView(parent), mCur(0) mSlideTimer = new QTimer(this); connect(mSlideTimer, SIGNAL(timeout()), this, SLOT(next())); + //models + mMappingTreeModel = static_cast<MappingTreeModel*>(SmGlobals::instance()->model("MappingTree")); + mPicFilesModel = static_cast<PicFilesModel*>(SmGlobals::instance()->model("PicFiles")); + //setup gui mScene = new QGraphicsScene(this); setScene(mScene); @@ -306,15 +311,18 @@ void PictureViewer2::constructInfoItem(const PicData &data, QSize picSize){ mScene->addItem(mFnItem); } -//FIXME! void PictureViewer2::constructMappingItem(const PicData &file){ - MappingTreeModel *mappingModel = static_cast<MappingTreeModel*>(SmGlobals::instance()->model("MappingTree")); - QList<QVariant> mappings = mappingModel->mappingsForFile(file.at(PicFilesModel::Id)); + QList<MappingData> mapData = mPicFilesModel->mappingDataFromFile(file.at(PicFilesModel::Id).toInt()); + QList<QStringList> mappings; + foreach(MappingData d, mapData){ + mappings << d.path; + } QStringList mappingPaths; - foreach(QVariant mId, mappings){ - mappingPaths << mappingModel->mappingDataFromId(mId.toInt()).path.join("/"); + foreach(QStringList l, mappings){ + mappingPaths << l.join("/"); } - SmTreeItem *mappingTree = mappingModel->treeFromPaths(mappingPaths); + + SmTreeItem *mappingTree = mMappingTreeModel->treeFromPaths(mappingPaths); if(mappingTree){ if(mMappingItem){ mMappingPos = mMappingItem->scenePos(); @@ -352,26 +360,29 @@ QTextDocument *PictureViewer2::treeToString(const SmTreeItem *root) const{ retval->setIndentWidth(2); retval->setDocumentMargin(8); QTextCursor *cursor = new QTextCursor(retval); - treeToStringRecursive(root, cursor, 0); + for(int i = 0; i < root->childCount(); ++i){ + treeToStringRecursive(root->child(i), cursor, 0); + QTextBlockFormat fmt; + fmt.setIndent(0); + cursor->insertBlock(fmt); + } return retval; } void PictureViewer2::treeToStringRecursive(const SmTreeItem *parent, QTextCursor *cursor, int indent) const{ + QChar bullet(0x2640); + if(indent % 2){ + bullet = QChar(0x2642); + } + cursor->insertText(QString("%1 %2").arg(bullet).arg(parent->data(0).toString())); + if(parent->childCount()){ + indent++; + } for(int i = 0; i < parent->childCount(); ++i){ QTextBlockFormat fmt; fmt.setIndent(indent * 5); - //to prevent a stupid empty line with a <br />... - if(indent > 0){ - cursor->insertBlock(fmt); - } - QChar bullet(0x2640); - if(indent % 2){ - bullet = QChar(0x2642); - } - cursor->insertText(QString("%1 %2").arg(bullet).arg(parent->child(i)->data(0).toString())); - if(parent->child(i)->childCount()){ - treeToStringRecursive(parent->child(i), cursor, indent + 1); - } + cursor->insertBlock(fmt); + treeToStringRecursive(parent->child(i), cursor, indent); } } diff --git a/pictureviewer2.h b/pictureviewer2.h index d9fec03..e245224 100644 --- a/pictureviewer2.h +++ b/pictureviewer2.h @@ -25,6 +25,7 @@ class PictureViewer2Item; class QGraphicsItem; class SmTreeItem; class MappingTreeModel; +class PicFilesModel; typedef QList<QVariant> PicData; typedef QList<QList<QVariant> > PicDataList; @@ -88,6 +89,8 @@ class PictureViewer2 : public QGraphicsView { QPointF mMappingPos; QAction *mSlideA; QAction *mHideA; + MappingTreeModel *mMappingTreeModel; + PicFilesModel *mPicFilesModel; }; class PictureViewer2Item : public QGraphicsItem { @@ -39,7 +39,8 @@ SOURCES = main.cpp \ mappingtreewidget.cpp \ newpicsdialog.cpp \ pictureswidget.cpp \ - pictureviewer2.cpp + pictureviewer2.cpp \ + picfilesmodel.cpp HEADERS = \ filesystemdirproxy.h \ filesystemwidget.h \ @@ -74,6 +75,7 @@ HEADERS = \ mappingtreewidget.h \ newpicsdialog.h \ pictureswidget.h \ - pictureviewer2.h + pictureviewer2.h \ + picfilesmodel.h LIBS += -lmagic -lXfixes -lX11 RESOURCES = shemov.qrc diff --git a/smglobals.cpp b/smglobals.cpp index 93ec72e..c435a2c 100644 --- a/smglobals.cpp +++ b/smglobals.cpp @@ -28,6 +28,7 @@ #include "seriesmetadatamodel.h" #include "mappingtreemodel.h" #include "pictureviewer2.h" +#include "picfilesmodel.h" #include "configurationdialog.h" SmGlobals *SmGlobals::mInstance = 0; @@ -98,6 +99,12 @@ QAbstractItemModel *SmGlobals::model(const QString &which){ MappingTreeModel *model = new MappingTreeModel(headers); mModels.insert(which, model); } + }else if(which == "PicFiles"){ + if(!mModels.contains("PicFiles")){ + QStringList headers = QStringList() << tr("Filename") << tr("SizeNum") << tr("Format") << tr("Full Path") << tr("Id") << tr("Added") << tr("Md5Sum") << tr("Size"); + PicFilesModel *model = new PicFilesModel(headers); + mModels.insert(which, model); + } } return mModels.contains(which) ? mModels.value(which) : 0; } |