summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--archivemodel.cpp80
-rw-r--r--archivemodel.h18
-rw-r--r--archiveview.cpp33
-rw-r--r--archiveview.h18
-rw-r--r--shemov.cpp6
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 &regex, 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 &regex, 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 &regex, 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);
diff --git a/shemov.cpp b/shemov.cpp
index 8912295..eeeddbf 100644
--- a/shemov.cpp
+++ b/shemov.cpp
@@ -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);
}