diff options
author | Arno <am@disconnect.de> | 2013-06-26 10:09:24 +0200 |
---|---|---|
committer | Arno <am@disconnect.de> | 2013-06-26 10:09:24 +0200 |
commit | 9e228a178d0e0b9382f5ce554083f905e65aac25 (patch) | |
tree | f1aa368086b0f90dc284d3964f95b3b0e260c3d1 /archivemodel.cpp | |
parent | eb697d7a3b7fc8b8af052b6f025610dd85eb176b (diff) | |
download | SheMov-9e228a178d0e0b9382f5ce554083f905e65aac25.tar.gz SheMov-9e228a178d0e0b9382f5ce554083f905e65aac25.tar.bz2 SheMov-9e228a178d0e0b9382f5ce554083f905e65aac25.zip |
Fix behavior of view when refreshing
Cancel the collectors if they're still running. Otherwise we may get
outdated results when refreshing the view after an update or delete.
Diffstat (limited to 'archivemodel.cpp')
-rw-r--r-- | archivemodel.cpp | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/archivemodel.cpp b/archivemodel.cpp index 86a478e..4351df8 100644 --- a/archivemodel.cpp +++ b/archivemodel.cpp @@ -32,6 +32,7 @@ ArchiveModel::ArchiveModel(const QStringList &headers, QObject *parent) : SmTree collectorMapper->setMapping(c3, c3); connect(collectorMapper, SIGNAL(mapped(QObject*)), this, SLOT(collectorFinished(QObject*))); mCollectors << c1 << c2 << c3; + connect(this, SIGNAL(needRefresh()), this, SLOT(refresh())); refresh(); } @@ -172,15 +173,18 @@ bool ArchiveModel::removeNode(const QModelIndex &idx){ } QVariant id = item->data(GenericId); removeQuery.bindValue(":id", id); + mDb.transaction(); if(removeQuery.exec()){ + mDb.commit(); if(nodeType == GenreNode || nodeType == ActorNode){ removeRows(idx.row(), 1, idx.parent()); - return true; }else if(nodeType == SeriesNode){ emit needRefresh(); - return true; } + writeCache(mOrder, root()); + return true; }else{ + mDb.rollback(); emitDatabaseError(removeQuery.lastError()); } return false; @@ -228,14 +232,14 @@ void ArchiveModel::setOrder(const QString &order){ void ArchiveModel::refresh(){ emit message(tr("Reading archive data...")); foreach(ArchiveCollector *c, mCollectors){ - if(!c->isRunning()){ - c->start(); + if(c->isRunning()){ + c->cancel(); } + c->start(); } } void ArchiveModel::collectorFinished(QObject *thread){ - QMutexLocker l(&mDoneMx); ArchiveCollector *t = qobject_cast<ArchiveCollector*>(thread); SmTreeItem *rootCopy = t->rootItem(); int sortOrder = t->sortOrder(); @@ -360,7 +364,6 @@ ArchiveCollector::ArchiveCollector(int numFields, int order, QObject *parent) : QString dbName = QString("%1").arg((qint64(this))); mDb = QSqlDatabase::cloneDatabase(QSqlDatabase::database("treedb"), dbName); mDb.open(); - //mRootItem = new SmTreeItem(numFields); } SmTreeItem *ArchiveCollector::rootItem(){ @@ -370,6 +373,11 @@ SmTreeItem *ArchiveCollector::rootItem(){ return retval; } +void ArchiveCollector::cancel(){ + QMutexLocker l(&mCancelledMx); + mCancelled = true; +} + void ArchiveCollector::run(){ mAccessMx.lock(); delete mRootItem; @@ -393,6 +401,7 @@ void ArchiveCollector::run(){ void ArchiveCollector::populateBySeriesName() { fetchSeries(QVariant(), mRootItem); for(int i = 0; i < mRootItem->childCount(); ++i){ + checkCancelled(); fetchParts(QVariant(), mRootItem->child(i)); } } @@ -400,6 +409,7 @@ void ArchiveCollector::populateBySeriesName() { void ArchiveCollector::populateByGenre(){ QSqlQuery genreIdQuery = QSqlQuery("SELECT igenres_id, tgenrename FROM genres ORDER BY tgenrename", mDb); while(genreIdQuery.next()){ + checkCancelled(); QList<QVariant> genreIdData; genreIdData << genreIdQuery.value(1) << genreIdQuery.value(0) << QVariant() << QVariant() << ArchiveModel::GenreNode << false << QVariant() << QVariant(); SmTreeItem *genreIdItem = new SmTreeItem(genreIdData, mRootItem); @@ -411,6 +421,7 @@ void ArchiveCollector::populateByGenre(){ void ArchiveCollector::populateByActor(){ QSqlQuery actorIdQuery = QSqlQuery("SELECT iactors_id, tactorname FROM actors ORDER BY tactorname", mDb); while(actorIdQuery.next()){ + checkCancelled(); QList<QVariant> actorIdData; actorIdData << actorIdQuery.value(1) << actorIdQuery.value(0) << QVariant() << QVariant() << ArchiveModel::ActorNode << false << QVariant() << QVariant(); SmTreeItem *actorIdItem = new SmTreeItem(actorIdData, mRootItem); @@ -421,8 +432,10 @@ void ArchiveCollector::populateByActor(){ void ArchiveCollector::fetchChildren(SmTreeItem *parent){ for(int i = 0; i < parent->childCount(); ++i){ + checkCancelled(); fetchSeries(parent->child(i)->data(ArchiveModel::GenericId), parent->child(i)); for(int j = 0; j < parent->child(i)->childCount(); ++j){ + checkCancelled(); SmTreeItem *seriesItem = parent->child(i)->child(j); fetchParts(parent->child(i)->data(ArchiveModel::GenericId), seriesItem); } @@ -452,6 +465,7 @@ void ArchiveCollector::fetchSeries(const QVariant &id, SmTreeItem *parent){ return; } while(seriesIdQuery.next()){ + checkCancelled(); QList<QVariant> seriesData; seriesData << seriesIdQuery.value(1) << seriesIdQuery.value(0) << QVariant() << QVariant() << ArchiveModel::SeriesNode << false << QVariant() << QVariant(); SmTreeItem *seriesItem = new SmTreeItem(seriesData, parent); @@ -477,6 +491,7 @@ void ArchiveCollector::fetchParts(const QVariant &id, SmTreeItem *parent){ } partsQuery.exec(); while(partsQuery.next()){ + checkCancelled(); QList<QVariant> partData; 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); @@ -484,3 +499,11 @@ void ArchiveCollector::fetchParts(const QVariant &id, SmTreeItem *parent){ } parent->setData(ArchiveModel::Count, parent->childCount()); } + +void ArchiveCollector::checkCancelled(){ + QMutexLocker l(&mCancelledMx); + if(mCancelled){ + mCancelled = false; + quit(); + } +} |