diff options
-rw-r--r-- | archivemodel.cpp | 133 | ||||
-rw-r--r-- | archivemodel.h | 44 | ||||
-rw-r--r-- | seriestreemodel.h | 2 | ||||
-rw-r--r-- | shemov.pro | 6 |
4 files changed, 182 insertions, 3 deletions
diff --git a/archivemodel.cpp b/archivemodel.cpp new file mode 100644 index 0000000..874b252 --- /dev/null +++ b/archivemodel.cpp @@ -0,0 +1,133 @@ +/* + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ + +#include <QSqlQuery> + +#include "smtreeitem.h" +#include "archivemodel.h" + +ArchiveModel::ArchiveModel(const QStringList &headers, QObject *parent) : SmTreeModel(headers, parent), mOrder(SeriesName){ + mDb = QSqlDatabase::database("treedb"); + mAvailableOrders.insert(SeriesName, "Series Name"); + mAvailableOrders.insert(Actor, "Actor"); + mAvailableOrders.insert(Genre, "Genre"); + setOrder(mOrder); +} + +const QStringList ArchiveModel::availableOrders() const { + QStringList retval = mAvailableOrders.values(); + qSort(retval); + return retval; +} + +void ArchiveModel::setOrder(int order) { + switch (order) { + case SeriesName: + populateBySeriesName(); + break; + case Actor: + populateByActor(); + break; + case Genre: + populateByGenre(); + break; + default: + return; + } +} + +void ArchiveModel::populateBySeriesName() { + SmTreeItem *rootItem = new SmTreeItem(NumFields); + fetchSeries(QVariant(), rootItem); + fetchParts(rootItem); + setRoot(rootItem); +} + +void ArchiveModel::populateByGenre(){ + QSqlQuery genreIdQuery = QSqlQuery("SELECT igenres_id, tgenrename FROM genres ORDER BY tgenrename", mDb); + SmTreeItem *rootItem = new SmTreeItem(NumFields); + while(genreIdQuery.next()){ + QList<QVariant> genreIdData; + genreIdData << genreIdQuery.value(1) << genreIdQuery.value(0) << QVariant() << QVariant() << GenreNode << false << QVariant() << QVariant() << QVariant(); + SmTreeItem *genreIdItem = new SmTreeItem(genreIdData, rootItem); + rootItem->appendChild(genreIdItem); + } + fetchChildren(rootItem); + setRoot(rootItem); +} + +void ArchiveModel::populateByActor(){ + QSqlQuery actorIdQuery = QSqlQuery("SELECT iactors_id, tactorname FROM actors ORDER BY tactorname", mDb); + SmTreeItem *rootItem = new SmTreeItem(NumFields); + while(actorIdQuery.next()){ + QList<QVariant> actorIdData; + actorIdData << actorIdQuery.value(1) << actorIdQuery.value(0) << QVariant() << QVariant() << GenreNode << false << QVariant() << QVariant() << QVariant(); + SmTreeItem *actorIdItem = new SmTreeItem(actorIdData, rootItem); + rootItem->appendChild(actorIdItem); + } + fetchChildren(rootItem); + setRoot(rootItem); +} + +void ArchiveModel::fetchChildren(SmTreeItem *parent){ + for(int i = 0; i < parent->childCount(); ++i){ + fetchSeries(parent->child(i)->data(SeriesId), parent->child(i)); + for(int j = 0; j < parent->child(i)->childCount(); ++j){ + SmTreeItem *seriesItem = parent->child(i)->child(j); + fetchParts(seriesItem); + } + } +} + +void ArchiveModel::fetchSeries(const QVariant &id, SmTreeItem *parent){ + QSqlQuery seriesIdQuery(mDb); + switch (mOrder) { + case SeriesName: + seriesIdQuery.prepare("SELECT iseries_id, tseries_name FROM series ORDER BY tseries_name"); + break; + case Genre: + seriesIdQuery.prepare("SELECT distinct(series.iseries_id), tseries_name FROM series, seriesparts, seriesparts_genremap WHERE seriesparts_genremap.igenres_id = :genreid AND seriesparts_genremap.iseriesparts_id = seriesparts.iseriesparts_id AND seriesparts.iseries_id = series.iseries_id ORDER BY tseries_name"); + seriesIdQuery.bindValue(":genreid", id); + break; + case Actor: + seriesIdQuery.prepare("SELECT distinct(series.iseries_id), tseries_name FROM series, seriesparts, seriesparts_actormap WHERE seriesparts_actormap.iactors_id = :actorid AND seriesparts_actormap.iseriesparts_id = seriesparts.iseriesparts_id AND seriesparts.iseries_id = series.iseries_id ORDER BY tseries_name"); + seriesIdQuery.bindValue(":actorid", id); + break; + default: + qFatal("ArchiveTreeModel::fetchSeries: invalid order!"); + return; + } + if(!seriesIdQuery.exec()){ + qWarning("ArchiveTreeModel::fetchSeries: failed to exectue query!"); + return; + } + while(seriesIdQuery.next()){ + QList<QVariant> seriesData; + seriesData << seriesIdQuery.value(1) << seriesIdQuery.value(0) << QVariant() << QVariant() << SeriesNode << false << QVariant() << QVariant() << QVariant(); + SmTreeItem *seriesItem = new SmTreeItem(seriesData, parent); + parent->appendChild(seriesItem); + } + parent->setData(Count, parent->childCount()); +} + + +void ArchiveModel::fetchParts(SmTreeItem *parent){ + QSqlQuery partsQuery(mDb); + partsQuery.prepare("SELECT iseriesparts_id, iseriespart, bfavorite, tsubtitle FROM seriesparts WHERE iseries_id = :id ORDER BY iseriespart"); + for(int i = 0; i < parent->childCount(); ++i){ + QVariant id = parent->child(i)->data(SeriesId); + partsQuery.bindValue(":id", id); + partsQuery.exec(); + while(partsQuery.next()){ + QList<QVariant> partData; + partData << parent->data(Name) << parent->data(SeriesId) << partsQuery.value(0) << partsQuery.value(1) << SeriesPartNode << partsQuery.value(2) << partsQuery.value(3) << QVariant(); + SmTreeItem *partItem = new SmTreeItem(partData, parent->child(i)); + parent->child(i)->appendChild(partItem); + } + parent->child(i)->setData(Count, parent->child(i)->childCount()); + } +} diff --git a/archivemodel.h b/archivemodel.h new file mode 100644 index 0000000..8e71a46 --- /dev/null +++ b/archivemodel.h @@ -0,0 +1,44 @@ +/* + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ + +#ifndef ARCHIVEMODEL_H +#define ARCHIVEMODEL_H + +#include <QSqlDatabase> +#include <QHash> + +#include "smtreemodel.h" + +class ArchiveModel : public SmTreeModel { + Q_OBJECT + public: + enum CustomRoles { NameRole = Qt::UserRole + 1, SeriesIdRole = Qt::UserRole + 2, SeriesPartIdRole = Qt::UserRole + 3, SeriesPartRole = Qt::UserRole + 4, TypeRole = Qt::UserRole + 5, FavoriteRole = Qt::UserRole + 6, SubtitleRole = Qt::UserRole + 7, CountRole = Qt::UserRole + 8 }; + enum Fields { Name = 0, SeriesId = 1, SeriesPartId = 2, SeriesPart = 3, Type = 4, Favorite = 5, Subtitle = 6, Count = 7 }; + enum Order { SeriesName, Actor, Genre }; + enum { NumFields = 8 }; + enum NodeType { SeriesNode, SeriesPartNode, GenreNode, ActorNode }; + explicit ArchiveModel(const QStringList &headers, QObject *parent = 0); + const QStringList availableOrders() const; + + signals: + + public slots: + void setOrder(int order); + + private: + void populateBySeriesName(); + void populateByGenre(); + void populateByActor(); + void fetchChildren(SmTreeItem *parent); + void fetchSeries(const QVariant &id, SmTreeItem *parent); + void fetchParts(SmTreeItem *parent); + QSqlDatabase mDb; + QHash<int, QString> mAvailableOrders; + int mOrder; +}; + +#endif // ARCHIVEMODEL_H diff --git a/seriestreemodel.h b/seriestreemodel.h index 005e2c7..55add52 100644 --- a/seriestreemodel.h +++ b/seriestreemodel.h @@ -20,7 +20,7 @@ class QSqlQuery; class SeriesTreeModel : public SmTreeModel { Q_OBJECT public: - enum CustomRoles { NameRole = Qt::UserRole + 1, SeriesIdRole = Qt::UserRole + 2, SeriesPartIdRole = Qt::UserRole + 3, SeriesPartRole = Qt::UserRole + 4, TypeRole = Qt::UserRole + 5, FavoriteRole = Qt::UserRole + 6, SubtitleRole = Qt::UserRole + 7, IsLocalRole = Qt::UserRole + 8 }; + enum CustomRoles { NameRole = Qt::UserRole + 1, SeriesIdRole = Qt::UserRole + 2, SeriesPartIdRole = Qt::UserRole + 3, SeriesPartRole = Qt::UserRole + 4, TypeRole = Qt::UserRole + 5, FavoriteRole = Qt::UserRole + 6, SubtitleRole = Qt::UserRole + 7, IsLocalRole = Qt::UserRole + 8 }; enum Fields { Name = 0, SeriesId = 1, SeriesPartId = 2, SeriesPart = 3, Type = 4, Favorite = 5, Subtitle = 6, IsLocal = 7 }; enum Types { Series, Part, NewSeries }; enum QueryType { NumericQuery, TextQuery }; @@ -43,7 +43,8 @@ SOURCES = main.cpp \ smdirwatcher.cpp \ smdirmodel.cpp \ framecache.cpp \ - smtreeview.cpp + smtreeview.cpp \ + archivemodel.cpp HEADERS = \ filesystemdirproxy.h \ filesystemwidget.h \ @@ -82,6 +83,7 @@ HEADERS = \ smdirwatcher.h \ smdirmodel.h \ framecache.h \ - smtreeview.h + smtreeview.h \ + archivemodel.h LIBS += -lmagic -lXfixes -lX11 RESOURCES = shemov.qrc |