/* 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 #include #include #include "filestreemodel.h" #include "smtreeitem.h" #include "helper.h" FilesTreeModel::FilesTreeModel(QStringList &headers, QObject *parent) : SmTreeModel(headers, parent){ mDb = QSqlDatabase::database("treedb"); 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 mUpdateDvdQuery; mDb = QSqlDatabase(); } void FilesTreeModel::setIds(const QList &seriesPartIds){ SmTreeItem *root = new SmTreeItem(11); SmTreeItem *files = new SmTreeItem(11, root); files->setData(FileName, tr("Movies")); root->appendChild(files); SmTreeItem *covers = new SmTreeItem(11, root); covers->setData(FileName, tr("Covers")); root->appendChild(covers); QLocale l; QStringList ids; foreach(int s, seriesPartIds){ ids << QString::number(s); } QString query = QString("SELECT iseriespart_id, tfilename, cmd5sum, bisize, idvd, sifiletype, sifileno, siquality, ifiles_id, series.tseries_name, seriesparts.iseriespart FROM files, seriesparts, series WHERE iseriespart_id IN (%1) AND files.iseriespart_id = seriesparts.iseriesparts_id AND seriesparts.iseries_id = series.iseries_id ORDER BY tfilename, sifileno ASC").arg(ids.join(",")); QSqlQuery filesQuery(query, mDb); while(filesQuery.next()){ QList data; data << filesQuery.value(1); //filename data << filesQuery.value(6); //partno data << l.toString(filesQuery.value(3).toLongLong()); //displaysize data << filesQuery.value(7); //quality data << filesQuery.value(4); //dvdno data << Helper::createArchivePath(filesQuery.value(1).toString(), filesQuery.value(2).toString()); //fullpath data << filesQuery.value(3); //size data << filesQuery.value(5); //filetype data << filesQuery.value(2); //md5sum data << filesQuery.value(0); //seriesparts_id data << filesQuery.value(8); //files_id data << filesQuery.value(10); //seriespart QString displayName = QString("%1 %2").arg(filesQuery.value(9).toString()).arg(filesQuery.value(10).toString()); data << displayName; switch(filesQuery.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(index.internalPointer()); if(role == Qt::DisplayRole){ if(index.column()) if(index.column() == DvdNo){ if(index.data(FileTypeRole) == QVariant()){ return QVariant(); } if(item->data(DvdNo).toInt() == -1){ return QString(tr("(local)")); }else{ QString retval = QString(tr("DVD #%1")).arg(item->data(DvdNo).toInt()); return retval; } } if(index.column() == PartNo){ if(item->data(PartNo).toInt() == -1){ return QVariant(); } } 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 == Qt::TextAlignmentRole){ if(index.column() > 0 && index.column() < 4){ return Qt::AlignRight; } } 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(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()){ return 0; } if(index.data(FileTypeRole) == QVariant()){ return Qt::ItemIsEnabled; } Qt::ItemFlags retval = Qt::ItemIsEnabled | Qt::ItemIsSelectable; if(index.column() == DvdNo || index.column() == Quality){ return retval | Qt::ItemIsEditable; } return retval; }