diff options
Diffstat (limited to 'archivemodel.cpp')
-rw-r--r-- | archivemodel.cpp | 125 |
1 files changed, 73 insertions, 52 deletions
diff --git a/archivemodel.cpp b/archivemodel.cpp index 90c6cd9..c317c32 100644 --- a/archivemodel.cpp +++ b/archivemodel.cpp @@ -15,7 +15,8 @@ ArchiveModel::ArchiveModel(const QStringList &headers, QObject *parent) : SmTree mAvailableOrders.insert("Series Name", SeriesName); mAvailableOrders.insert("Actor", Actor); mAvailableOrders.insert("Genre", Genre); - setOrder(mOrder); + mCollector = new ArchiveCollector(NumFields, this); + connect(mCollector, SIGNAL(finished()), this, SLOT(collectorFinished())); } const QStringList ArchiveModel::availableOrders() const { @@ -58,83 +59,103 @@ QVariant ArchiveModel::data(const QModelIndex &index, int role) const{ void ArchiveModel::setOrder(int order) { mOrder = order; - switch (order) { - case SeriesName: + SmTreeItem *rootItem = new SmTreeItem(NumFields); + mCollector->populate(mOrder, rootItem); + if(!mCollector->isRunning()){ + mCollector->start(); + } +} + +void ArchiveModel::setOrder(const QString &order){ + int orderNum = mAvailableOrders.value(order); + setOrder(orderNum); +} + +void ArchiveModel::collectorFinished(){ + SmTreeItem *item = mCollector->rootItem(); + setRoot(item); +} + +ArchiveCollector::ArchiveCollector(int numFields, QObject *parent) : QThread(parent), mNumFields(numFields) { + mDb = QSqlDatabase::cloneDatabase(QSqlDatabase::database("treedb"), "archivedb"); + mDb.open(); +} + +void ArchiveCollector::populate(int order, SmTreeItem *rootItem){ + mRootItem = rootItem; + mSortOrder = order; +} + +void ArchiveCollector::run(){ + switch (mSortOrder){ + case ArchiveModel::SeriesName: populateBySeriesName(); break; - case Actor: - populateByActor(); - break; - case Genre: + case ArchiveModel::Genre: populateByGenre(); break; + case ArchiveModel::Actor: + populateByActor(); + break; default: return; } } -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); - for(int i = 0; i < rootItem->childCount(); ++i){ - fetchParts(QVariant(), rootItem->child(i)); +void ArchiveCollector::populateBySeriesName() { + fetchSeries(QVariant(), mRootItem); + for(int i = 0; i < mRootItem->childCount(); ++i){ + QString msg = QString("Processing %1").arg(mRootItem->child(i)->data(ArchiveModel::Name).toString()); + emit message(msg); + fetchParts(QVariant(), mRootItem->child(i)); } - setRoot(rootItem); } -void ArchiveModel::populateByGenre(){ +void ArchiveCollector::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); + genreIdData << genreIdQuery.value(1) << genreIdQuery.value(0) << QVariant() << QVariant() << ArchiveModel::GenreNode << false << QVariant() << QVariant() << QVariant(); + SmTreeItem *genreIdItem = new SmTreeItem(genreIdData, mRootItem); + mRootItem->appendChild(genreIdItem); } - fetchChildren(rootItem); - setRoot(rootItem); + fetchChildren(mRootItem); } -void ArchiveModel::populateByActor(){ +void ArchiveCollector::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); + actorIdData << actorIdQuery.value(1) << actorIdQuery.value(0) << QVariant() << QVariant() << ArchiveModel::GenreNode << false << QVariant() << QVariant() << QVariant(); + SmTreeItem *actorIdItem = new SmTreeItem(actorIdData, mRootItem); + mRootItem->appendChild(actorIdItem); } - fetchChildren(rootItem); - setRoot(rootItem); + fetchChildren(mRootItem); } -void ArchiveModel::fetchChildren(SmTreeItem *parent){ +void ArchiveCollector::fetchChildren(SmTreeItem *parent){ for(int i = 0; i < parent->childCount(); ++i){ - fetchSeries(parent->child(i)->data(GenericId), parent->child(i)); + QString msg = QString("Processing %1").arg(parent->child(i)->data(ArchiveModel::Name).toString()); + emit message(msg); + fetchSeries(parent->child(i)->data(ArchiveModel::GenericId), parent->child(i)); for(int j = 0; j < parent->child(i)->childCount(); ++j){ SmTreeItem *seriesItem = parent->child(i)->child(j); - fetchParts(parent->child(i)->data(GenericId), seriesItem); + fetchParts(parent->child(i)->data(ArchiveModel::GenericId), seriesItem); } } } -void ArchiveModel::fetchSeries(const QVariant &id, SmTreeItem *parent){ +void ArchiveCollector::fetchSeries(const QVariant &id, SmTreeItem *parent){ QSqlQuery seriesIdQuery(mDb); - switch (mOrder) { - case SeriesName: + switch (mSortOrder) { + case ArchiveModel::SeriesName: seriesIdQuery.prepare("SELECT iseries_id, tseries_name FROM series ORDER BY tseries_name"); break; - case Genre: + case ArchiveModel::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: + case ArchiveModel::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; @@ -148,34 +169,34 @@ void ArchiveModel::fetchSeries(const QVariant &id, SmTreeItem *parent){ } while(seriesIdQuery.next()){ QList<QVariant> seriesData; - seriesData << seriesIdQuery.value(1) << seriesIdQuery.value(0) << QVariant() << QVariant() << SeriesNode << false << QVariant() << QVariant() << QVariant(); + seriesData << seriesIdQuery.value(1) << seriesIdQuery.value(0) << QVariant() << QVariant() << ArchiveModel::SeriesNode << false << QVariant() << QVariant() << QVariant(); SmTreeItem *seriesItem = new SmTreeItem(seriesData, parent); parent->appendChild(seriesItem); } - parent->setData(Count, parent->childCount()); + parent->setData(ArchiveModel::Count, parent->childCount()); } -void ArchiveModel::fetchParts(const QVariant &id, SmTreeItem *parent){ +void ArchiveCollector::fetchParts(const QVariant &id, SmTreeItem *parent){ QSqlQuery partsQuery(mDb); - if(mOrder == SeriesName){ + if(mSortOrder == ArchiveModel::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.bindValue(":id", parent->data(ArchiveModel::GenericId)); + }else if(mSortOrder == ArchiveModel::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(":id", parent->data(ArchiveModel::GenericId)); partsQuery.bindValue(":genreid", id); - }else if(mOrder == Actor){ + }else if(mSortOrder == ArchiveModel::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(":id", parent->data(ArchiveModel::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(); + partData << parent->data(ArchiveModel::Name) << parent->data(ArchiveModel::GenericId) << partsQuery.value(0) << partsQuery.value(1) << ArchiveModel::SeriesPartNode << partsQuery.value(2) << partsQuery.value(3) << QVariant(); SmTreeItem *partItem = new SmTreeItem(partData, parent); parent->appendChild(partItem); } - parent->setData(Count, parent->childCount()); + parent->setData(ArchiveModel::Count, parent->childCount()); } |