diff options
Diffstat (limited to 'filestreemodel.cpp')
-rw-r--r-- | filestreemodel.cpp | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/filestreemodel.cpp b/filestreemodel.cpp new file mode 100644 index 0000000..27d93df --- /dev/null +++ b/filestreemodel.cpp @@ -0,0 +1,179 @@ +/* + 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 <QLocale> +#include <QIcon> + +#include "filestreemodel.h" +#include "smtreeitem.h" +#include "helper.h" + +FilesTreeModel::FilesTreeModel(QStringList &headers, QObject *parent) : SmTreeModel(headers, parent){ + mDb = QSqlDatabase::database("treedb"); + mFilesQuery = new QSqlQuery(mDb); + mFilesQuery->prepare("SELECT iseriespart_id, tfilename, cmd5sum, bisize, idvd, sifiletype, sifileno, siquality, ifiles_id FROM files where iseriesparts_id = :id ORDER BY tfilename, sifileno"); + mUpdateDvdQuery = new QSqlQuery(mDb); + mUpdateDvdQuery->prepare("UPDATE files SET idvd = :dvd WHERE ifiles_id = :id"); + mUpdateQualityQuery = new QSqlQuery(mDb); + mUpdateQualityQuery->prepare("UPDATE files SET iquality = :quality WHERE ifiles_id = :id"); +} + +FilesTreeModel::~FilesTreeModel(){ + delete mFilesQuery; + delete mUpdateDvdQuery; + mDb = QSqlDatabase(); +} + +void FilesTreeModel::setIds(const QList<int> &seriesPartIds){ + SmTreeItem *root = new SmTreeItem(11); + SmTreeItem *files = new SmTreeItem(11, root); + files->setData(FileName, tr("Files")); + root->appendChild(files); + SmTreeItem *covers = new SmTreeItem(11, root); + covers->setData(FileName, tr("Covers")); + root->appendChild(covers); + QLocale l; + foreach(int s, seriesPartIds){ + mFilesQuery->bindValue(":id", s); + if(mFilesQuery->exec()){ + while(mFilesQuery->next()){ + QList<QVariant> data; + data << mFilesQuery->value(1); //filename + data << mFilesQuery->value(6); //partno + data << l.toString(mFilesQuery->value(3).toLongLong()); //displaysize + data << mFilesQuery->value(7); //quality + data << mFilesQuery->value(4); //dvdno + data << Helper::createArchivePath(mFilesQuery->value(1).toString(), mFilesQuery->value(2).toString()); //fullpath + data << mFilesQuery->value(3); //size + data << mFilesQuery->value(5); //filetype + data << mFilesQuery->value(2); //md5sum + data << mFilesQuery->value(0); //seriesparts_id + data << mFilesQuery->value(8); //files_id + switch(mFilesQuery->value(5).toInt()){ + case Movie:{ + SmTreeItem *item = new SmTreeItem(data, files); + files->appendChild(item); + break; + } + case FrontCover: + case BackCover: + case GeneralCover:{ + SmTreeItem *item = new SmTreeItem(data, covers); + covers->appendChild(item); + break; + } + default: + ; + } + } + } + } + setRoot(root); +} + +QVariant FilesTreeModel::data(const QModelIndex &index, int role) const{ + if(!index.isValid()){ + return QVariant(); + } + + SmTreeItem *item = static_cast<SmTreeItem*>(index.internalPointer()); + + if(role == Qt::DisplayRole){ + if(index.column() == DvdNo){ + if(index.data().toInt() == -1){ + return QString(tr("(local)")); + }else{ + QString retval = QString(tr("DVD #%1")).arg(index.data().toInt()); + return retval; + } + } + return item->data(index.column()); + } + if(role == Qt::EditRole){ + return item->data(index.column()); + } + if(role == Qt::DecorationRole){ + if(index.column() == 0){ + return QIcon(":/dildo.png"); + } + } + if(role == FileNameRole){ + return item->data(FileName); + } + if(role == FullPathRole){ + return item->data(FullPath); + } + if(role == SizeRole){ + return item->data(Size); + } + if(role == DvdNoRole){ + return item->data(DvdNo); + } + if(role == SizeDisplay){ + return item->data(SizeDisplay); + } + if(role == FileTypeRole){ + return item->data(FileType); + } + if(role == Md5SumRole){ + return item->data(Md5Sum); + } + if(role == PartNoRole){ + return item->data(PartNo); + } + if(role == SeriesPartIdRole){ + return item->data(SeriesPartId); + } + if(role == QualityRole){ + return item->data(Quality); + } + if(role == FilesIdRole){ + return item->data(FilesId); + } + return QVariant(); +} + +bool FilesTreeModel::setData(const QModelIndex &index, const QVariant &value, int role){ + if(!index.isValid()){ + return false; + } + if(role == Qt::EditRole){ + SmTreeItem *item = static_cast<SmTreeItem*>(index.internalPointer()); + if(index.column() == DvdNo){ + mUpdateDvdQuery->bindValue(":id", index.data(FilesIdRole)); + mUpdateDvdQuery->bindValue(":dvd", value); + if(mUpdateDvdQuery->exec()){ + item->setData(DvdNo, value); + return true; + } + } + if(index.column() == Quality){ + if(value.toInt() > 10 || value.toInt() < 0){ + return false; + } + mUpdateQualityQuery->bindValue(":id", index.data(FilesIdRole)); + mUpdateQualityQuery->bindValue(":quality", value); + if(mUpdateQualityQuery->exec()){ + item->setData(Quality, value); + return true; + } + } + } + return false; +} + +Qt::ItemFlags FilesTreeModel::flags(const QModelIndex &index) const{ + if(!index.isValid() || index.data(FileTypeRole) == QVariant()){ + return 0; + } + Qt::ItemFlags retval = Qt::ItemIsEnabled | Qt::ItemIsSelectable; + if(index.column() == DvdNo || index.column() == Quality){ + return retval | Qt::ItemIsEditable; + } + return retval; +} |