summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--archivebrowser.cpp17
-rw-r--r--archivebrowsermodel.cpp29
-rw-r--r--archivebrowsermodel.h6
3 files changed, 49 insertions, 3 deletions
diff --git a/archivebrowser.cpp b/archivebrowser.cpp
index 9bf7cb7..281c2fa 100644
--- a/archivebrowser.cpp
+++ b/archivebrowser.cpp
@@ -56,7 +56,22 @@ ArchiveBrowser::ArchiveBrowser(QWidget *parent) : QWidget(parent), mSelectedSize
mQualityFilter = new QComboBox;
toolBar->addWidget(mQualityFilter);
setupQualityFilter();
- connect(mQualityFilter, &QComboBox::currentTextChanged, mProxy, &ArchiveBrowserModelProxy::setQualityFilter);
+ QStringList genres = mModel->availableGenres();
+ std::sort(genres.begin(), genres.end());
+ QActionGroup *gDataAG = new QActionGroup(this);
+ gDataAG->setExclusive(false);
+ for(const QString &g : std::as_const(genres)){
+ QAction *a = new QAction(g, this);
+ a->setCheckable(true);
+ gDataAG->addAction(a);
+ connect(a, &QAction::triggered, a, [=] { mProxy->toggleGenre(a); });
+ }
+ QIcon genreIcon = Helper::icon(Qt::transparent, qApp->palette().color(QPalette::Text), 'G', true, false);
+ QAction *genreA = new QAction(genreIcon, tr("Filter genres"), this);
+ QMenu *genreMenu = new QMenu;
+ genreMenu->addActions(gDataAG->actions());
+ genreA->setMenu(genreMenu);
+ toolBar->addAction(genreA);
toolBar->addSeparator();
mSizeFilter = new QCheckBox(tr("Filter by size"));
connect(mSizeFilter, &QCheckBox::checkStateChanged, mProxy, &ArchiveBrowserModelProxy::setSizeFilter);
diff --git a/archivebrowsermodel.cpp b/archivebrowsermodel.cpp
index da8e316..9181d3f 100644
--- a/archivebrowsermodel.cpp
+++ b/archivebrowsermodel.cpp
@@ -7,6 +7,7 @@
#include <QSqlDatabase>
#include <QSqlQuery>
+#include <QAction>
#include "archivebrowsermodel.h"
#include "smtreeitem.h"
@@ -201,7 +202,11 @@ void ArchiveBrowserModel::populate(){
localGenresQ.bindValue(":sid", localQ.value(4));
localGenresQ.exec();
while(localGenresQ.next()){
- genres << localGenresQ.value(1).toString();
+ QString genre = localGenresQ.value(1).toString();
+ genres << genre;
+ if(!mAvailableGenres.contains(genre)){
+ mAvailableGenres << genre;
+ }
}
seriesItem->setData(Quality, quality);
seriesItem->setData(TotalSize, totalSize);
@@ -228,6 +233,16 @@ void ArchiveBrowserModelProxy::setQualityFilter(QString quality){
invalidateFilter();
}
+void ArchiveBrowserModelProxy::toggleGenre(QAction *a){
+ QString text = a->text();
+ if(a->isChecked()){
+ mGenreFilters << text;
+ }else{
+ mGenreFilters.removeAll(text);
+ }
+ invalidateFilter();
+}
+
void ArchiveBrowserModelProxy::setSizeFilter(int activate){
mSizeFilter = activate;
invalidateFilter();
@@ -240,7 +255,7 @@ void ArchiveBrowserModelProxy::setBytesRemaining(qint64 bytes){
bool ArchiveBrowserModelProxy::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const {
- if(mQuality == -1 && !mSizeFilter){
+ if(mQuality == -1 && !mSizeFilter && mGenreFilters.isEmpty()){
return true;
}
QModelIndex selIdx = sourceModel()->index(sourceRow, ArchiveBrowserModel::Selected, sourceParent);
@@ -252,6 +267,16 @@ bool ArchiveBrowserModelProxy::filterAcceptsRow(int sourceRow, const QModelIndex
if(nodeType == ArchiveBrowserModel::FileNode){
return true;
}
+ if(!mGenreFilters.isEmpty()){
+ QModelIndex genreIdx = sourceModel()->index(sourceRow, ArchiveBrowserModel::Genres, sourceParent);
+ QStringList genres = genreIdx.data().toStringList();
+ for(const QString &fg : std::as_const(mGenreFilters)){
+ if(genres.contains(fg)){
+ return true;
+ }
+ }
+ return false;
+ }
QModelIndex qualIdx = sourceModel()->index(sourceRow, ArchiveBrowserModel::Quality, sourceParent);
int quality = qualIdx.data().toInt();
QModelIndex sizeIdx = sourceModel()->index(sourceRow, ArchiveBrowserModel::TotalSize, sourceParent);
diff --git a/archivebrowsermodel.h b/archivebrowsermodel.h
index 7d0d263..212ecea 100644
--- a/archivebrowsermodel.h
+++ b/archivebrowsermodel.h
@@ -12,6 +12,8 @@
#include <QSortFilterProxyModel>
#include <QList>
+class QAction;
+
#include "smtreemodel.h"
class ArchiveBrowserModel : public SmTreeModel {
@@ -27,6 +29,7 @@ class ArchiveBrowserModel : public SmTreeModel {
int nextDVDNo() const;
virtual Qt::ItemFlags flags(const QModelIndex &index) const;
QList<int> availableQualities() { return mAvailableQualities; }
+ QStringList availableGenres() { return mAvailableGenres; }
QModelIndexList children(const QModelIndex &idx);
public slots:
@@ -40,6 +43,7 @@ class ArchiveBrowserModel : public SmTreeModel {
void readConfig();
int mNumFields;
QList<int> mAvailableQualities;
+ QStringList mAvailableGenres;
QSqlDatabase mDb;
};
@@ -52,6 +56,7 @@ class ArchiveBrowserModelProxy : public QSortFilterProxyModel {
void setQualityFilter(QString quality);
void setSizeFilter(int activate);
void setBytesRemaining(qint64 bytes);
+ void toggleGenre(QAction *a);
protected:
virtual bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const;
@@ -60,6 +65,7 @@ class ArchiveBrowserModelProxy : public QSortFilterProxyModel {
int mQuality;
bool mSizeFilter;
qint64 mBytesRemaining;
+ QStringList mGenreFilters;
};
#endif // ARCHIVEBROWSERMODEL_H