summaryrefslogtreecommitdiffstats
path: root/archivemodel.cpp
diff options
context:
space:
mode:
authorArno <am@disconnect.de>2013-06-26 10:09:24 +0200
committerArno <am@disconnect.de>2013-06-26 10:09:24 +0200
commit9e228a178d0e0b9382f5ce554083f905e65aac25 (patch)
treef1aa368086b0f90dc284d3964f95b3b0e260c3d1 /archivemodel.cpp
parenteb697d7a3b7fc8b8af052b6f025610dd85eb176b (diff)
downloadSheMov-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.cpp35
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();
+ }
+}