diff options
author | Arno <arno@disconnect.de> | 2025-04-29 11:27:51 +0200 |
---|---|---|
committer | Arno <arno@disconnect.de> | 2025-04-29 11:27:51 +0200 |
commit | a3b79646fe6984b0f2203ed9819ba03b0a4db978 (patch) | |
tree | 4776207df9d1ef77cbe6010a4d47bab8f1f6f60d | |
parent | 48cc96e4b51706796c119eb953706c61b9c60228 (diff) | |
download | SheMov-a3b79646fe6984b0f2203ed9819ba03b0a4db978.tar.gz SheMov-a3b79646fe6984b0f2203ed9819ba03b0a4db978.tar.bz2 SheMov-a3b79646fe6984b0f2203ed9819ba03b0a4db978.zip |
Display Genres in ArchiveBrowser
This takes quite a toll on the startup time, because it executes an
extra Query for each item in the archive, but I hope it's worth it. The
final goal being to filter the archive by genres, so uninteresting moves
can be moved easier.
-rw-r--r-- | archivebrowser.cpp | 1 | ||||
-rw-r--r-- | archivebrowsermodel.cpp | 18 | ||||
-rw-r--r-- | archivebrowsermodel.h | 4 | ||||
-rw-r--r-- | delegates.cpp | 6 | ||||
-rw-r--r-- | delegates.h | 7 | ||||
-rw-r--r-- | smglobals.cpp | 2 |
6 files changed, 32 insertions, 6 deletions
diff --git a/archivebrowser.cpp b/archivebrowser.cpp index d3d64a5..9bf7cb7 100644 --- a/archivebrowser.cpp +++ b/archivebrowser.cpp @@ -44,6 +44,7 @@ ArchiveBrowser::ArchiveBrowser(QWidget *parent) : QWidget(parent), mSelectedSize mTree->setColumnHidden(ArchiveBrowserModel::NodeType, true); mTree->setItemDelegateForColumn(ArchiveBrowserModel::TotalSize, new SizeDelegate(this)); mTree->setItemDelegateForColumn(ArchiveBrowserModel::FileType, new FileTypeDelegate(this)); + mTree->setItemDelegateForColumn(ArchiveBrowserModel::Genres, new GenreDelegate(this)); mTree->setSelectionMode(QAbstractItemView::ExtendedSelection); QToolBar *toolBar = new QToolBar; diff --git a/archivebrowsermodel.cpp b/archivebrowsermodel.cpp index c6e7d08..da8e316 100644 --- a/archivebrowsermodel.cpp +++ b/archivebrowsermodel.cpp @@ -13,7 +13,7 @@ #include "smglobals.h" #include "helper.h" -ArchiveBrowserModel::ArchiveBrowserModel(const QStringList &headers, QObject *parent) : SmTreeModel(headers, parent), mNumFields(9) { +ArchiveBrowserModel::ArchiveBrowserModel(const QStringList &headers, QObject *parent) : SmTreeModel(headers, parent), mNumFields(10) { mDb = QSqlDatabase::database("treedb"); readConfig(); populate(); @@ -52,6 +52,9 @@ QVariant ArchiveBrowserModel::data(const QModelIndex &index, int role) const { if(role == SelectedRole){ return item->data(Selected); } + if(role == GenreRole){ + return item->data(Genres); + } if(role == Qt::ForegroundRole){ if(col == TotalSize){ qint64 s = item->data(TotalSize).toLongLong(); @@ -162,6 +165,8 @@ void ArchiveBrowserModel::populate(){ mAvailableQualities.clear(); QSqlQuery localFilesQ(mDb); localFilesQ.prepare("SELECT tfilename, bisize, sifiletype, siquality, ifiles_id, cmd5sum FROM files WHERE iseriespart_id = :sid ORDER BY sifiletype"); + QSqlQuery localGenresQ(mDb); + localGenresQ.prepare("SELECT seriesparts_genremap.igenres_id, genres.tgenrename FROM seriesparts_genremap, genres WHERE iseriesparts_id = :sid AND seriesparts_genremap.igenres_id = genres.igenres_id ORDER BY genres.tgenrename ASC"); 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 AND seriesparts.bfavorite = false ORDER BY tseries_name ASC", mDb); while(localQ.next()){ QList<QVariant> serPartData; @@ -171,16 +176,17 @@ void ArchiveBrowserModel::populate(){ }else{ name = QString("%1 - %2").arg(localQ.value(1).toString(), localQ.value(3).toString()); } - serPartData << QChar(0x26A4) << name << localQ.value(4) << SeriesPartNode << QVariant() << QVariant() << QVariant() << QString() << false; + serPartData << QChar(0x26A4) << name << localQ.value(4) << SeriesPartNode << QVariant() << QVariant() << QVariant() << QString() << false << QVariant(); SmTreeItem *seriesItem = new SmTreeItem(serPartData, rootItem); rootItem->appendChild(seriesItem); localFilesQ.bindValue(":sid", localQ.value(4)); localFilesQ.exec(); qint64 totalSize = 0; int quality = -1; + QStringList genres; while(localFilesQ.next()){ QList<QVariant> fileData; - fileData << QVariant() << localFilesQ.value(0) << localFilesQ.value(4) << FileNode << localFilesQ.value(1) << localFilesQ.value(3) << localFilesQ.value(2) << Helper::createArchivePath(localFilesQ.value(0).toString(), localFilesQ.value(5).toString()) << false; + fileData << QVariant() << localFilesQ.value(0) << localFilesQ.value(4) << FileNode << localFilesQ.value(1) << localFilesQ.value(3) << localFilesQ.value(2) << Helper::createArchivePath(localFilesQ.value(0).toString(), localFilesQ.value(5).toString()) << false << QVariant(); totalSize += localFilesQ.value(1).toDouble(); if(localFilesQ.value(2) == FT_MOVIE){ int q = localFilesQ.value(3).toInt(); @@ -192,8 +198,14 @@ void ArchiveBrowserModel::populate(){ SmTreeItem *fileItem = new SmTreeItem(fileData, seriesItem); seriesItem->appendChild(fileItem); } + localGenresQ.bindValue(":sid", localQ.value(4)); + localGenresQ.exec(); + while(localGenresQ.next()){ + genres << localGenresQ.value(1).toString(); + } seriesItem->setData(Quality, quality); seriesItem->setData(TotalSize, totalSize); + seriesItem->setData(Genres, QVariant(genres)); } setRoot(rootItem); emit populated(); diff --git a/archivebrowsermodel.h b/archivebrowsermodel.h index c72fe9e..7d0d263 100644 --- a/archivebrowsermodel.h +++ b/archivebrowsermodel.h @@ -17,8 +17,8 @@ class ArchiveBrowserModel : public SmTreeModel { Q_OBJECT public: - enum CustomRoles { ExpansionRole = Qt::UserRole + 1, NameRole = Qt::UserRole + 2, GenericIdRole = Qt::UserRole + 3, NodeTypeRole = Qt::UserRole + 4, TotalSizeRole = Qt::UserRole + 5, QualityRole = 6, FileTypeRole = Qt::UserRole + 7, FullPathRole = Qt::UserRole + 8, SelectedRole = Qt::UserRole + 9 }; - enum Fields { Expansion = 0, Name = 1, GenericId = 2, NodeType = 3, TotalSize = 4, Quality = 5, FileType = 6, FullPath = 7, Selected = 8 }; + enum CustomRoles { ExpansionRole = Qt::UserRole + 1, NameRole = Qt::UserRole + 2, GenericIdRole = Qt::UserRole + 3, NodeTypeRole = Qt::UserRole + 4, TotalSizeRole = Qt::UserRole + 5, QualityRole = 6, FileTypeRole = Qt::UserRole + 7, FullPathRole = Qt::UserRole + 8, SelectedRole = Qt::UserRole + 9, GenreRole = Qt::UserRole + 10 }; + enum Fields { Expansion = 0, Name = 1, GenericId = 2, NodeType = 3, TotalSize = 4, Quality = 5, FileType = 6, FullPath = 7, Selected = 8, Genres = 9 }; enum NodeTypes { SeriesPartNode = 1, FileNode = 2 }; explicit ArchiveBrowserModel(const QStringList &headers, QObject *parent = nullptr); virtual QVariant data(const QModelIndex &index, int role) const; diff --git a/delegates.cpp b/delegates.cpp index 7a14bb4..4be7f4d 100644 --- a/delegates.cpp +++ b/delegates.cpp @@ -56,6 +56,12 @@ QWidget *FileTypeDelegate::createEditor(QWidget *parent, const QStyleOptionViewI return retval; } +/* Delegate for Genres */ +QString GenreDelegate::displayText(const QVariant &value, const QLocale &) const { + QStringList genres = value.toStringList(); + return genres.join(' '); +} + /* Delegate for Dvd no. */ QString DvdNoDelegate::displayText(const QVariant &value, const QLocale &locale) const{ diff --git a/delegates.h b/delegates.h index 72b3b13..0db3bf9 100644 --- a/delegates.h +++ b/delegates.h @@ -32,6 +32,13 @@ class FileTypeDelegate : public QStyledItemDelegate { QHash<int, QString> mFiletypeMap; }; +class GenreDelegate : public QStyledItemDelegate { + Q_OBJECT + public: + explicit GenreDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) {} + virtual QString displayText(const QVariant &value, const QLocale &locale) const; +}; + class DvdNoDelegate : public QStyledItemDelegate { Q_OBJECT public: diff --git a/smglobals.cpp b/smglobals.cpp index 0612b13..8b287e9 100644 --- a/smglobals.cpp +++ b/smglobals.cpp @@ -83,7 +83,7 @@ QAbstractItemModel *SmGlobals::model(const QString &which){ } }else if(which == "BrowserModel"){ if(!mModels.contains("BrowserModel")){ - QStringList headers = QStringList() << QChar(0x26A7) << tr("Name") << tr("Generic Id") << tr("Node Type") << tr("Size") << tr("Quality") << tr("File Type") << tr("Full Path") << tr("Selected"); + QStringList headers = QStringList() << QChar(0x26A7) << tr("Name") << tr("Generic Id") << tr("Node Type") << tr("Size") << tr("Quality") << tr("File Type") << tr("Full Path") << tr("Selected") << tr("Genres"); ArchiveBrowserModel *model = new ArchiveBrowserModel(headers); mModels.insert(which, model); } |