summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--filestreemodel.cpp179
-rw-r--r--filestreemodel.h40
-rw-r--r--shemov.pro6
3 files changed, 223 insertions, 2 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;
+}
diff --git a/filestreemodel.h b/filestreemodel.h
new file mode 100644
index 0000000..0db1f39
--- /dev/null
+++ b/filestreemodel.h
@@ -0,0 +1,40 @@
+/*
+ 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 FILESTREEMODEL_H
+#define FILESTREEMODEL_H
+
+#include <QSqlDatabase>
+#include <QList>
+
+#include "smtreemodel.h"
+
+class QSqlQuery;
+
+class FilesTreeModel : public SmTreeModel {
+ Q_OBJECT
+ public:
+ enum CustomRoles { FileNameRole = Qt::UserRole + 1, FullPathRole = Qt::UserRole + 2, SizeRole = Qt::UserRole + 3, DvdNoRole = Qt::UserRole + 4, SizeDisplayRole = Qt::UserRole + 5, FileTypeRole = Qt::UserRole + 6, Md5SumRole = Qt::UserRole + 7, PartNoRole = Qt::UserRole + 8, SeriesPartIdRole = Qt::UserRole + 9, QualityRole = Qt::UserRole + 10, FilesIdRole = Qt::UserRole + 11 };
+ enum FileTypes { Movie = 1, FrontCover = 2, BackCover = 3, GeneralCover = 4 };
+ enum Fields { FileName = 0, PartNo = 1, SizeDisplay = 2, Quality = 3, DvdNo = 4, FullPath = 5, Size = 6, FileType = 7, Md5Sum = 8, SeriesPartId = 9, FilesId = 10 };
+ explicit FilesTreeModel(QStringList &headers, QObject *parent = 0);
+ ~FilesTreeModel();
+
+ //data + flags
+ void setIds(const QList<int> &seriesPartIds);
+ QVariant data(const QModelIndex &index, int role) const;
+ bool setData(const QModelIndex &index, const QVariant &value, int role);
+ Qt::ItemFlags flags(const QModelIndex &index) const;
+
+ private:
+ QSqlDatabase mDb;
+ QSqlQuery *mFilesQuery;
+ QSqlQuery *mUpdateDvdQuery;
+ QSqlQuery *mUpdateQualityQuery;
+};
+
+#endif // FILESTREEMODEL_H
diff --git a/shemov.pro b/shemov.pro
index 46cbbb9..dab8541 100644
--- a/shemov.pro
+++ b/shemov.pro
@@ -52,7 +52,8 @@ SOURCES = main.cpp \
smubermodelsingleton.cpp \
archivetreeview.cpp \
seriestreewidget.cpp \
- seriestreemodel.cpp
+ seriestreemodel.cpp \
+ filestreemodel.cpp
HEADERS = listitem.h \
listmodel.h \
movieitem.h \
@@ -100,6 +101,7 @@ HEADERS = listitem.h \
smubermodelsingleton.h \
archivetreeview.h \
seriestreewidget.h \
- seriestreemodel.h
+ seriestreemodel.h \
+ filestreemodel.h
LIBS += -lmagic
RESOURCES = shemov.qrc