From 9c85c8e441b5bc6bd9e6441a828599c137ea36be Mon Sep 17 00:00:00 2001 From: Arno Date: Fri, 7 Feb 2014 06:39:49 +0100 Subject: Implement ArchiveBrowser filtering Filter ArchiveBrowser by Quality and/or size: * Quality: only show series with a quality less or equal * Size: only show series still fitting onto the DVD * Both: only show series with a quality less or equal _and_ still fitting on the DVD Use QItemSelection instead of going through the selected items in the tree. Seems to work somehow... --- archivebrowsermodel.cpp | 88 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 84 insertions(+), 4 deletions(-) (limited to 'archivebrowsermodel.cpp') diff --git a/archivebrowsermodel.cpp b/archivebrowsermodel.cpp index 26dc438..222a243 100644 --- a/archivebrowsermodel.cpp +++ b/archivebrowsermodel.cpp @@ -7,12 +7,13 @@ #include #include +#include #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 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; +} -- cgit v1.2.3-70-g09d2