summaryrefslogtreecommitdiffstats
path: root/archivemodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'archivemodel.cpp')
-rw-r--r--archivemodel.cpp125
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());
}