summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArno <am@disconnect.de>2013-06-01 11:17:42 +0200
committerArno <am@disconnect.de>2013-06-01 11:17:42 +0200
commit376d2fbb78114e746618f14afe7728cf9793630b (patch)
treee5edda96364a1f0b57dd5a5e8565c75a1c1ba1e2
parentd43981754db00a2091e95a55cd6583bf1fbc724d (diff)
downloadSheMov-376d2fbb78114e746618f14afe7728cf9793630b.tar.gz
SheMov-376d2fbb78114e746618f14afe7728cf9793630b.tar.bz2
SheMov-376d2fbb78114e746618f14afe7728cf9793630b.zip
Do something when SortOrder is changed in ArchiveView
Actually do something when the sort order is changed. That resulted in various fixes to both model and view, since both had completely untested codepaths. Most notable fix: Only select those seriesparts which are actually mapped to the selected genre or actor.
-rw-r--r--archivemodel.cpp60
-rw-r--r--archivemodel.h7
-rw-r--r--archiveview.cpp11
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){