summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--archivemodel.cpp133
-rw-r--r--archivemodel.h44
-rw-r--r--seriestreemodel.h2
-rw-r--r--shemov.pro6
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 };
diff --git a/shemov.pro b/shemov.pro
index 3b81463..8f8288c 100644
--- a/shemov.pro
+++ b/shemov.pro
@@ -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