diff options
author | Arno <am@disconnect.de> | 2013-06-23 05:47:10 +0200 |
---|---|---|
committer | Arno <am@disconnect.de> | 2013-06-23 05:47:10 +0200 |
commit | 1e247c6fea51dab6815e3a15f22cd08e56039e89 (patch) | |
tree | 3bba38aa28dfdc4b4f6b0440accab7d83a16ad75 | |
parent | 5dbcc16c289d7067132d133b374a9b7dcd2c7fd2 (diff) | |
download | SheMov-1e247c6fea51dab6815e3a15f22cd08e56039e89.tar.gz SheMov-1e247c6fea51dab6815e3a15f22cd08e56039e89.tar.bz2 SheMov-1e247c6fea51dab6815e3a15f22cd08e56039e89.zip |
Make the archive cache useful
Read the cache if there is one, if not, read it in another thread and
update the view when it's done.
-rw-r--r-- | archivemodel.cpp | 80 | ||||
-rw-r--r-- | archivemodel.h | 18 | ||||
-rw-r--r-- | archiveview.cpp | 33 | ||||
-rw-r--r-- | archiveview.h | 18 | ||||
-rw-r--r-- | shemov.cpp | 6 |
5 files changed, 49 insertions, 106 deletions
diff --git a/archivemodel.cpp b/archivemodel.cpp index a5d2298..67b875b 100644 --- a/archivemodel.cpp +++ b/archivemodel.cpp @@ -10,6 +10,7 @@ #include <QFile> #include <QSettings> #include <QMutexLocker> +#include <QSignalMapper> #include "smtreeitem.h" #include "archivemodel.h" @@ -19,8 +20,19 @@ ArchiveModel::ArchiveModel(const QStringList &headers, QObject *parent) : SmTree mAvailableOrders.insert("Series Name", SeriesName); mAvailableOrders.insert("Actor", Actor); mAvailableOrders.insert("Genre", Genre); - mCollector = new ArchiveCollector(NumFields, this); - connect(mCollector, SIGNAL(finished()), this, SLOT(collectorFinished())); + QSignalMapper *collectorMapper = new QSignalMapper(this); + ArchiveCollector *c1 = new ArchiveCollector(NumFields, SeriesName, this); + connect(c1, SIGNAL(finished()), collectorMapper, SLOT(map())); + collectorMapper->setMapping(c1, c1); + ArchiveCollector *c2 = new ArchiveCollector(NumFields, Actor, this); + connect(c2, SIGNAL(finished()), collectorMapper, SLOT(map())); + collectorMapper->setMapping(c2, c2); + ArchiveCollector *c3 = new ArchiveCollector(NumFields, Genre, this); + connect(c3, SIGNAL(finished()), collectorMapper, SLOT(map())); + collectorMapper->setMapping(c3, c3); + connect(collectorMapper, SIGNAL(mapped(QObject*)), this, SLOT(collectorFinished(QObject*))); + mCollectors << c1 << c2 << c3; + refresh(); } const QStringList ArchiveModel::availableOrders() const { @@ -97,7 +109,7 @@ bool ArchiveModel::setData(const QModelIndex &idx, const QVariant &value, int ro emit needRefresh(); return true; } - writeCache(mOrder); + writeCache(mOrder, root()); return true; }else{ emitDatabaseError(updateQuery.lastError()); @@ -202,12 +214,6 @@ void ArchiveModel::setOrder(int order) { SmTreeItem *rootItem = readCache(mOrder); if(rootItem){ setRoot(rootItem); - }else{ - rootItem = new SmTreeItem(NumFields); - mCollector->populate(mOrder, rootItem); - if(!mCollector->isRunning()){ - mCollector->start(); - } } } @@ -217,13 +223,25 @@ void ArchiveModel::setOrder(const QString &order){ } void ArchiveModel::refresh(){ - setOrder(mOrder); + emit message(tr("Reading archive data...")); + foreach(ArchiveCollector *c, mCollectors){ + c->start(); + } } -void ArchiveModel::collectorFinished(){ - SmTreeItem *item = mCollector->rootItem(); - setRoot(item); - writeCache(mOrder); +void ArchiveModel::collectorFinished(QObject *thread){ + QMutexLocker l(&mDoneMx); + ArchiveCollector *t = qobject_cast<ArchiveCollector*>(thread); + Q_ASSERT(t); + SmTreeItem *item = t->rootItem(); + int sortOrder = t->sortOrder(); + if(sortOrder == mOrder){ + setRoot(item); + } + writeCache(sortOrder, item); + QString sortOrderName = mAvailableOrders.key(sortOrder); + QString msg = QString("Done reading %1").arg(sortOrderName); + emit message(msg); } bool ArchiveModel::checkParents(const SmTreeItem *item, const QRegExp ®ex, int column) const { @@ -244,15 +262,15 @@ void ArchiveModel::emitDatabaseError(const QSqlError &e){ emit databaseError(errormsg); } -void ArchiveModel::writeCache(int o){ +void ArchiveModel::writeCache(int o, SmTreeItem *rItem){ QFile cache(cacheFile(o)); cache.open(QIODevice::WriteOnly); QDataStream stream(&cache); // write root id, no need to write data // it's invalid anyway, we just need it as an anchor - stream << (qint64)root(); - for(int i = 0; i < root()->childCount(); ++i){ - writeRecursive(root()->child(i), stream); + stream << (qint64)rItem; + for(int i = 0; i < rItem->childCount(); ++i){ + writeRecursive(rItem->child(i), stream); } } @@ -332,25 +350,11 @@ const QString ArchiveModel::cacheFile(int o) const{ return cacheFile; } -ArchiveCollector::ArchiveCollector(int numFields, QObject *parent) : QThread(parent), mNumFields(numFields) { - mDb = QSqlDatabase::cloneDatabase(QSqlDatabase::database("treedb"), "archivedb"); +ArchiveCollector::ArchiveCollector(int numFields, int order, QObject *parent) : QThread(parent), mNumFields(numFields), mSortOrder(order) { + QString dbName = QString("%1").arg((qint64(this))); + mDb = QSqlDatabase::cloneDatabase(QSqlDatabase::database("treedb"), dbName); mDb.open(); -} - -SmTreeItem *ArchiveCollector::rootItem() { - QMutexLocker l(&mAccessMx); - return mRootItem; -} - -int ArchiveCollector::sortOrder() { - QMutexLocker l(&mAccessMx); - return mSortOrder; -} - -void ArchiveCollector::populate(int order, SmTreeItem *rootItem){ - QMutexLocker l(&mAccessMx); - mRootItem = rootItem; - mSortOrder = order; + mRootItem = new SmTreeItem(numFields); } void ArchiveCollector::run(){ @@ -372,8 +376,6 @@ void ArchiveCollector::run(){ 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)); } } @@ -402,8 +404,6 @@ void ArchiveCollector::populateByActor(){ void ArchiveCollector::fetchChildren(SmTreeItem *parent){ for(int i = 0; i < parent->childCount(); ++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); diff --git a/archivemodel.h b/archivemodel.h index 0e3e29c..c24c130 100644 --- a/archivemodel.h +++ b/archivemodel.h @@ -29,7 +29,6 @@ class ArchiveModel : public SmTreeModel { explicit ArchiveModel(const QStringList &headers, QObject *parent = 0); const QStringList availableOrders() const; const QHash<QString, int> availableOrdersHash() const { return mAvailableOrders; } - ArchiveCollector *collector() { return mCollector; } virtual QVariant data(const QModelIndex &index, int role) const; virtual bool setData(const QModelIndex &idx, const QVariant &value, int role); virtual bool matchRecursive(const QModelIndex &parent, const QRegExp ®ex, int column = 0) const; @@ -40,6 +39,7 @@ class ArchiveModel : public SmTreeModel { signals: void needRefresh(); void databaseError(const QString &error); + void message(const QString &msg); public slots: void setOrder(int order); @@ -47,12 +47,12 @@ class ArchiveModel : public SmTreeModel { void refresh(); private slots: - void collectorFinished(); + void collectorFinished(QObject *thread); private: bool checkParents(const SmTreeItem *item, const QRegExp ®ex, int column) const; void emitDatabaseError(const QSqlError &e); - void writeCache(int o); + void writeCache(int o, SmTreeItem *rItem); void writeRecursive(SmTreeItem *start, QDataStream &stream); void writeItem(SmTreeItem *item, QDataStream &stream); SmTreeItem *readCache(int o); @@ -60,19 +60,17 @@ class ArchiveModel : public SmTreeModel { const QString cacheFile(int o) const; QSqlDatabase mDb; QHash<QString, int> mAvailableOrders; - ArchiveCollector *mCollector; + QMutex mDoneMx; + QList<ArchiveCollector*> mCollectors; int mOrder; }; class ArchiveCollector : public QThread { Q_OBJECT public: - explicit ArchiveCollector(int numFields, QObject *parent = 0); - SmTreeItem *rootItem(); - int sortOrder(); - - public slots: - void populate(int order, SmTreeItem *rootItem); + explicit ArchiveCollector(int numFields, int order, QObject *parent = 0); + SmTreeItem *rootItem() { return mRootItem; } + int sortOrder() const { return mSortOrder; } signals: void message(const QString message); diff --git a/archiveview.cpp b/archiveview.cpp index 263bc41..166be89 100644 --- a/archiveview.cpp +++ b/archiveview.cpp @@ -23,13 +23,8 @@ ArchiveView::ArchiveView(QWidget *parent) : QWidget(parent), mConstructing(true) { QSettings s; mArchiveModel = static_cast<ArchiveModel*>(SmGlobals::instance()->model("ArchiveModel")); - connect(mArchiveModel->collector(), SIGNAL(started()), this, SLOT(collectorStarted())); - connect(mArchiveModel->collector(), SIGNAL(finished()), this, SLOT(collectorFinished())); connect(mArchiveModel, SIGNAL(needRefresh()), this, SLOT(refreshArchive())); connect(mArchiveModel, SIGNAL(databaseError(QString)), this, SLOT(showDatabaseError(QString))); - mProgress = new ArchiveProgressDialog(this); - mProgress->setHidden(true); - connect(mArchiveModel->collector(), SIGNAL(message(QString)), mProgress, SLOT(setMessage(QString))); mProxy = new ArchiveProxy; mProxy->setSourceModel(mArchiveModel); @@ -104,10 +99,6 @@ void ArchiveView::writeSettings() { s.setValue("archivemodel/expandeditems", expandedItems); } -QWidget *ArchiveView::progressDialog(){ - return qobject_cast<QWidget *>(mProgress); -} - void ArchiveView::refreshArchive(){ writeSettings(); mArchiveModel->refresh(); @@ -137,18 +128,6 @@ void ArchiveView::clearFilter(){ mTree->collapseAll(); } -void ArchiveView::collectorStarted(){ - if(mConstructing){ - return; - } - mProgress->show(); -} - -void ArchiveView::collectorFinished(){ - mProgress->hide(); - setExpanded(); -} - void ArchiveView::showDatabaseError(const QString &errorMsg){ QMessageBox::critical(this, tr("Database Error"), errorMsg); } @@ -201,18 +180,6 @@ void ArchiveTree::impossible(const QString msg){ QMessageBox::critical(this, tr("Error"), msg); } -ArchiveProgressDialog::ArchiveProgressDialog(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f){ - QHBoxLayout *mainLayout = new QHBoxLayout; - mMessage = new QLabel; - mainLayout->addWidget(mMessage); - setLayout(mainLayout); -} - -void ArchiveProgressDialog::setMessage(const QString &msg){ - QString message = QString(tr("<b>Gathering data... please wait!</b><br/><ul><li>%1</li></ul>")).arg(msg); - mMessage->setText(message); -} - ArchiveFiles::ArchiveFiles(QWidget *parent) : SmTreeView(parent){ } diff --git a/archiveview.h b/archiveview.h index 9e3e666..eac7f46 100644 --- a/archiveview.h +++ b/archiveview.h @@ -32,12 +32,8 @@ class ArchiveView : public QWidget { explicit ArchiveView(QWidget *parent = 0); int currentSortOrder() const; void writeSettings(); - // this is needed for displaying the progress dialog in the - // center of the main window... - void setConstructingDone() { mConstructing = false; } ArchiveModel *archiveModel() { return mArchiveModel; } ArchiveTree *archiveTree() { return mTree; } - QWidget *progressDialog(); public slots: void refreshArchive(); @@ -46,8 +42,6 @@ class ArchiveView : public QWidget { private slots: void setFilter(); void clearFilter(); - void collectorStarted(); - void collectorFinished(); void showDatabaseError(const QString &errorMsg); void expandItem(const QModelIndex &idx); void collapseItem(const QModelIndex &idx); @@ -80,18 +74,6 @@ class ArchiveTree : public SmTreeView { ArchiveModel *mModel; }; -class ArchiveProgressDialog : public QDialog { - Q_OBJECT - public: - explicit ArchiveProgressDialog(QWidget *parent = 0, Qt::WindowFlags f = Qt::WindowStaysOnTopHint); - - public slots: - void setMessage(const QString &msg); - - private: - QLabel *mMessage; -}; - class ArchiveFiles : public SmTreeView { public: explicit ArchiveFiles(QWidget *parent = 0); @@ -79,6 +79,7 @@ SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, fla qApp->processEvents(); mArchive = new ArchiveView; mTab->addTab(mArchive, "Experimental"); + connect(mArchive->archiveModel(), SIGNAL(message(QString)), this, SLOT(statusbarMessage(QString))); //pictures splash.showMessage(tr("Creating Picture Archive..."), Qt::AlignHCenter, Qt::yellow); @@ -140,11 +141,6 @@ SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, fla readSettings(); mFSWidget->fileView()->setFocus(Qt::ActiveWindowFocusReason); mPicWidget->readSettings(); - mArchive->setConstructingDone(); - Helper::centerWidget(mArchive->progressDialog()); - if(mArchive->archiveModel()->collector()->isRunning()){ - mArchive->progressDialog()->show(); - } Helper::centerWidget(picViewer); } |