diff options
author | Arno <arno@disconnect.de> | 2025-05-01 20:12:24 +0200 |
---|---|---|
committer | Arno <arno@disconnect.de> | 2025-05-01 20:12:24 +0200 |
commit | a45737e852c207d02f1dd06227de7916baa290c1 (patch) | |
tree | c1b90eeaad70bf0f249ef9a3b842d182d237d63a | |
parent | a3b79646fe6984b0f2203ed9819ba03b0a4db978 (diff) | |
download | SheMov-a45737e852c207d02f1dd06227de7916baa290c1.tar.gz SheMov-a45737e852c207d02f1dd06227de7916baa290c1.tar.bz2 SheMov-a45737e852c207d02f1dd06227de7916baa290c1.zip |
Make the genre filter work
It works basically, but it could use a few improvements, like filtering
out genres which we don't want to archive, and maybe make the size
filter work in addition to it.
-rw-r--r-- | archivebrowser.cpp | 17 | ||||
-rw-r--r-- | archivebrowsermodel.cpp | 29 | ||||
-rw-r--r-- | archivebrowsermodel.h | 6 |
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 |