summaryrefslogtreecommitdiffstats
path: root/archivebrowsermodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'archivebrowsermodel.cpp')
-rw-r--r--archivebrowsermodel.cpp88
1 files changed, 84 insertions, 4 deletions
diff --git a/archivebrowsermodel.cpp b/archivebrowsermodel.cpp
index 26dc438..222a243 100644
--- a/archivebrowsermodel.cpp
+++ b/archivebrowsermodel.cpp
@@ -7,12 +7,13 @@
#include <QSqlDatabase>
#include <QSqlQuery>
+#include <QItemSelectionModel>
#include "archivebrowsermodel.h"
#include "smtreeitem.h"
#include "helper.h"
-ArchiveBrowserModel::ArchiveBrowserModel(const QStringList &headers, QObject *parent) : SmTreeModel(headers, parent), mNumFields(7) {
+ArchiveBrowserModel::ArchiveBrowserModel(const QStringList &headers, QObject *parent) : SmTreeModel(headers, parent), mNumFields(8) {
mDb = QSqlDatabase::database("treedb");
populate();
}
@@ -44,6 +45,9 @@ QVariant ArchiveBrowserModel::data(const QModelIndex &index, int role) const {
if(role == FullPathRole){
return item->data(FullPath);
}
+ if(role == SelectedRole){
+ return item->data(Selected);
+ }
if(role == Qt::ForegroundRole){
if(col == TotalSize){
qint64 s = item->data(TotalSize).toDouble();
@@ -74,6 +78,16 @@ QVariant ArchiveBrowserModel::data(const QModelIndex &index, int role) const {
return SmTreeModel::data(index, role);
}
+bool ArchiveBrowserModel::setData(const QModelIndex &index, const QVariant &value, int role){
+ if(role == SelectedRole){
+ SmTreeItem *item = itemAt(index);
+ item->setData(Selected, value);
+ emit dataChanged(index, index);
+ return true;
+ }
+ return SmTreeModel::setData(index, value, role);
+}
+
Qt::ItemFlags ArchiveBrowserModel::flags(const QModelIndex &index) const{
SmTreeItem *item = itemAt(index);
int nt = item->data(NodeType).toInt();
@@ -85,6 +99,7 @@ Qt::ItemFlags ArchiveBrowserModel::flags(const QModelIndex &index) const{
void ArchiveBrowserModel::populate(){
SmTreeItem *rootItem = new SmTreeItem(mNumFields);
+ mAvailableQualities.clear();
QSqlQuery localFilesQ(mDb);
localFilesQ.prepare("SELECT tfilename, bisize, sifiletype, siquality, cmd5sum FROM files WHERE iseriespart_id = :sid ORDER BY sifiletype");
QSqlQuery localQ = QSqlQuery("SELECT DISTINCT(series.iseries_id), tseries_name, seriesparts.iseriespart, seriesparts.tsubtitle, seriesparts.iseriesparts_id FROM series LEFT JOIN seriesparts ON series.iseries_id = seriesparts.iseries_id LEFT JOIN files ON seriesparts.iseriesparts_id = files.iseriespart_id WHERE files.sifiletype = 1 AND files.idvd < 1 ORDER BY tseries_name ASC", mDb);
@@ -96,7 +111,7 @@ void ArchiveBrowserModel::populate(){
}else{
name = QString("%1 - %2").arg(localQ.value(1).toString()).arg(localQ.value(3).toString());
}
- serPartData << name << localQ.value(4) << SeriesPartNode << QVariant() << QVariant() << QVariant() << QString();
+ serPartData << name << localQ.value(4) << SeriesPartNode << QVariant() << QVariant() << QVariant() << QString() << false;
SmTreeItem *seriesItem = new SmTreeItem(serPartData, rootItem);
rootItem->appendChild(seriesItem);
localFilesQ.bindValue(":sid", localQ.value(4));
@@ -105,10 +120,14 @@ void ArchiveBrowserModel::populate(){
int quality = -1;
while(localFilesQ.next()){
QList<QVariant> fileData;
- fileData << localFilesQ.value(0) << QVariant() << FileNode << localFilesQ.value(1) << localFilesQ.value(3) << localFilesQ.value(2) << Helper::createArchivePath(localFilesQ.value(0).toString(), localFilesQ.value(4).toString());
+ fileData << localFilesQ.value(0) << QVariant() << FileNode << localFilesQ.value(1) << localFilesQ.value(3) << localFilesQ.value(2) << Helper::createArchivePath(localFilesQ.value(0).toString(), localFilesQ.value(4).toString()) << false;
totalSize += localFilesQ.value(1).toDouble();
if(localFilesQ.value(2) == 1){ //this is a movie file, no need for another enum
- quality = localFilesQ.value(3).toInt();
+ int q = localFilesQ.value(3).toInt();
+ quality = q;
+ if(!mAvailableQualities.contains(q)){
+ mAvailableQualities << q;
+ }
}
SmTreeItem *fileItem = new SmTreeItem(fileData, seriesItem);
seriesItem->appendChild(fileItem);
@@ -118,3 +137,64 @@ void ArchiveBrowserModel::populate(){
}
setRoot(rootItem);
}
+
+//ArchiveBrowserModelProxy
+
+ArchiveBrowserModelProxy::ArchiveBrowserModelProxy(QObject *parent) : QSortFilterProxyModel(parent), mQuality(-1), mSizeFilter(false) {}
+
+void ArchiveBrowserModelProxy::setQualityFilter(QString quality){
+ if(quality == tr("(none)")){
+ mQuality = -1;
+ }else{
+ mQuality = quality.toInt();
+ }
+ invalidateFilter();
+}
+
+void ArchiveBrowserModelProxy::setSizeFilter(int activate){
+ mSizeFilter = activate;
+ invalidateFilter();
+}
+
+void ArchiveBrowserModelProxy::setBytesRemaining(qint64 bytes){
+ mBytesRemaining = bytes > 0 ? bytes : 0;
+ invalidateFilter();
+}
+
+bool ArchiveBrowserModelProxy::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const {
+ if(mQuality == -1 && !mSizeFilter){
+ return true;
+ }
+ QModelIndex selIdx = sourceModel()->index(sourceRow, ArchiveBrowserModel::Selected, sourceParent);
+ if(selIdx.data().toBool()){
+ return true;
+ }
+ QModelIndex nodeIdx = sourceModel()->index(sourceRow, ArchiveBrowserModel::NodeType, sourceParent);
+ int nodeType = nodeIdx.data().toInt();
+ if(nodeType == ArchiveBrowserModel::FileNode){
+ return true;
+ }
+ QModelIndex qualIdx = sourceModel()->index(sourceRow, ArchiveBrowserModel::Quality, sourceParent);
+ int quality = qualIdx.data().toInt();
+ QModelIndex sizeIdx = sourceModel()->index(sourceRow, ArchiveBrowserModel::TotalSize, sourceParent);
+ qint64 size = sizeIdx.data().toDouble();
+ if(mQuality > -1 && mSizeFilter){
+ if(quality <= mQuality && size <= mBytesRemaining){
+ return true;
+ }
+ return false;
+ }
+ if(mQuality > -1){
+ if(quality <= mQuality){
+ return true;
+ }
+ return false;
+ }
+ if(mSizeFilter){
+ if(size <= mBytesRemaining){
+ return true;
+ }
+ return false;
+ }
+ return false;
+}