summaryrefslogtreecommitdiffstats
path: root/picfilesmodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'picfilesmodel.cpp')
-rw-r--r--picfilesmodel.cpp219
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);
+}