diff options
Diffstat (limited to 'picfilesmodel.cpp')
-rw-r--r-- | picfilesmodel.cpp | 219 |
1 files changed, 219 insertions, 0 deletions
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); +} |