diff options
-rw-r--r-- | archivemodel.cpp | 60 | ||||
-rw-r--r-- | archivemodel.h | 7 | ||||
-rw-r--r-- | archiveview.cpp | 11 |
3 files changed, 48 insertions, 30 deletions
diff --git a/archivemodel.cpp b/archivemodel.cpp index 3379d67..5c3cb49 100644 --- a/archivemodel.cpp +++ b/archivemodel.cpp @@ -12,14 +12,14 @@ 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"); + mAvailableOrders.insert("Series Name", SeriesName); + mAvailableOrders.insert("Actor", Actor); + mAvailableOrders.insert("Genre", Genre); setOrder(mOrder); } const QStringList ArchiveModel::availableOrders() const { - QStringList retval = mAvailableOrders.values(); + QStringList retval = mAvailableOrders.keys(); qSort(retval); return retval; } @@ -31,7 +31,7 @@ QVariant ArchiveModel::data(const QModelIndex &index, int role) const{ int part = item->data(SeriesPart).toInt(); int childCount = item->data(Count).toInt(); int nodeType = item->data(Type).toInt(); - if(nodeType == SeriesNode){ + if(nodeType == SeriesNode || nodeType == GenreNode || nodeType == ActorNode){ retval = QString("%1 (%2)").arg(item->data(Name).toString()).arg(QString::number(childCount)); }else if(nodeType == SeriesPartNode){ if(part > 0){ @@ -42,6 +42,8 @@ QVariant ArchiveModel::data(const QModelIndex &index, int role) const{ retval = QString("%1 - %2").arg(item->data(Name).toString()).arg(item->data(Subtitle).toString()); } } + }else{ + retval = item->data(Name).toString(); } return retval; } @@ -55,6 +57,7 @@ QVariant ArchiveModel::data(const QModelIndex &index, int role) const{ } void ArchiveModel::setOrder(int order) { + mOrder = order; switch (order) { case SeriesName: populateBySeriesName(); @@ -70,10 +73,18 @@ void ArchiveModel::setOrder(int order) { } } +void ArchiveModel::setOrder(const QString &order){ + int orderNum = mAvailableOrders.value(order); + setOrder(orderNum); +} + void ArchiveModel::populateBySeriesName() { SmTreeItem *rootItem = new SmTreeItem(NumFields); + fetchChildren(rootItem); fetchSeries(QVariant(), rootItem); - fetchParts(rootItem); + for(int i = 0; i < rootItem->childCount(); ++i){ + fetchParts(QVariant(), rootItem->child(i)); + } setRoot(rootItem); } @@ -105,10 +116,10 @@ void ArchiveModel::populateByActor(){ void ArchiveModel::fetchChildren(SmTreeItem *parent){ for(int i = 0; i < parent->childCount(); ++i){ - fetchSeries(parent->child(i)->data(SeriesId), parent->child(i)); + fetchSeries(parent->child(i)->data(GenericId), parent->child(i)); for(int j = 0; j < parent->child(i)->childCount(); ++j){ SmTreeItem *seriesItem = parent->child(i)->child(j); - fetchParts(seriesItem); + fetchParts(parent->child(i)->data(GenericId), seriesItem); } } } @@ -145,19 +156,26 @@ void ArchiveModel::fetchSeries(const QVariant &id, SmTreeItem *parent){ } -void ArchiveModel::fetchParts(SmTreeItem *parent){ +void ArchiveModel::fetchParts(const QVariant &id, 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->child(i)->data(Name) << parent->child(i)->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()); + if(mOrder == SeriesName){ + partsQuery.prepare("SELECT iseriesparts_id, iseriespart, bfavorite, tsubtitle FROM seriesparts WHERE iseries_id = :id ORDER BY iseriespart"); + partsQuery.bindValue(":id", parent->data(GenericId)); + }else if(mOrder == Genre){ + partsQuery.prepare("SELECT seriesparts.iseriesparts_id, iseriespart, bfavorite, tsubtitle FROM seriesparts, seriesparts_genremap WHERE iseries_id = :id AND seriesparts.iseriesparts_id = seriesparts_genremap.iseriesparts_id AND seriesparts_genremap.igenres_id = :genreid ORDER BY iseriespart"); + partsQuery.bindValue(":id", parent->data(GenericId)); + partsQuery.bindValue(":genreid", id); + }else if(mOrder == Actor){ + partsQuery.prepare("SELECT seriesparts.iseriesparts_id, iseriespart, bfavorite, tsubtitle FROM seriesparts, seriesparts_actormap WHERE iseries_id = :id AND seriesparts.iseriesparts_id = seriesparts_actormap.iseriesparts_id AND seriesparts_actormap.iactors_id = :actorid ORDER BY iseriespart"); + partsQuery.bindValue(":id", parent->data(GenericId)); + partsQuery.bindValue(":actorid", id); } + partsQuery.exec(); + while(partsQuery.next()){ + QList<QVariant> partData; + partData << parent->data(Name) << parent->data(GenericId) << partsQuery.value(0) << partsQuery.value(1) << SeriesPartNode << partsQuery.value(2) << partsQuery.value(3) << QVariant(); + SmTreeItem *partItem = new SmTreeItem(partData, parent); + parent->appendChild(partItem); + } + parent->setData(Count, parent->childCount()); } diff --git a/archivemodel.h b/archivemodel.h index f4af14e..b4fdcd5 100644 --- a/archivemodel.h +++ b/archivemodel.h @@ -17,7 +17,7 @@ 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 Fields { Name = 0, GenericId = 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 }; @@ -29,6 +29,7 @@ class ArchiveModel : public SmTreeModel { public slots: void setOrder(int order); + void setOrder(const QString &order); private: void populateBySeriesName(); @@ -36,9 +37,9 @@ class ArchiveModel : public SmTreeModel { void populateByActor(); void fetchChildren(SmTreeItem *parent); void fetchSeries(const QVariant &id, SmTreeItem *parent); - void fetchParts(SmTreeItem *parent); + void fetchParts(const QVariant &id, SmTreeItem *parent); QSqlDatabase mDb; - QHash<int, QString> mAvailableOrders; + QHash<QString, int> mAvailableOrders; int mOrder; }; diff --git a/archiveview.cpp b/archiveview.cpp index fd1a4ff..dc4b135 100644 --- a/archiveview.cpp +++ b/archiveview.cpp @@ -19,8 +19,11 @@ ArchiveView::ArchiveView(QWidget *parent) : QWidget(parent) { mArchiveModel = static_cast<ArchiveModel*>(SmGlobals::instance()->model("ArchiveModel")); + QSortFilterProxyModel *proxy = new QSortFilterProxyModel; + proxy->setSourceModel(mArchiveModel); mTree = new ArchiveTree; - mTree->setColumnHidden(ArchiveModel::SeriesId, true); + mTree->setModel(proxy); + mTree->setColumnHidden(ArchiveModel::GenericId, true); mTree->setColumnHidden(ArchiveModel::SeriesPartId, true); mTree->setColumnHidden(ArchiveModel::SeriesPart, true); mTree->setColumnHidden(ArchiveModel::Type, true); @@ -30,6 +33,7 @@ ArchiveView::ArchiveView(QWidget *parent) : QWidget(parent) { mTree->resizeColumnToContents(ArchiveModel::Name); mSortOrder = new QComboBox; mSortOrder->addItems(mArchiveModel->availableOrders()); + connect(mSortOrder, SIGNAL(currentIndexChanged(QString)), mArchiveModel, SLOT(setOrder(QString))); QLabel *l1 = new QLabel(tr("Filter")); mFilter = new QLineEdit; QPushButton *filter = new QPushButton(tr("Filter")); @@ -54,14 +58,9 @@ ArchiveView::ArchiveView(QWidget *parent) : QWidget(parent) { QHBoxLayout *mainLayout = new QHBoxLayout; mainLayout->addWidget(treeSplitter); setLayout(mainLayout); - } ArchiveTree::ArchiveTree(QWidget *parent) : SmTreeView(parent) { - mModel = static_cast<ArchiveModel*>(SmGlobals::instance()->model("ArchiveModel")); - mProxy = new QSortFilterProxyModel; - mProxy->setSourceModel(mModel); - setModel(mProxy); } ArchiveFiles::ArchiveFiles(QWidget *parent) : SmTreeView(parent){ |