diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2015-03-10 10:22:34 -0700 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2015-03-10 10:22:34 -0700 |
commit | 1e3700c11fc58801f78ac8fd94a672a7af2238b5 (patch) | |
tree | d1e62e6a2fd687ff0c6b203a57680e1031c44747 /qt-ui | |
parent | 44b55bd1a220531c5d62e8bce01d27392de2dbee (diff) | |
download | subsurface-1e3700c11fc58801f78ac8fd94a672a7af2238b5.tar.gz |
Don't call UI functions from helper code
This may seem much more complicated but actually is much cleaner. Add each
thread we start to the list of future results and add a new UI function
that updates the UI once all of the threads have finished.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'qt-ui')
-rw-r--r-- | qt-ui/divepicturewidget.cpp | 9 | ||||
-rw-r--r-- | qt-ui/divepicturewidget.h | 2 | ||||
-rw-r--r-- | qt-ui/mainwindow.cpp | 5 |
3 files changed, 14 insertions, 2 deletions
diff --git a/qt-ui/divepicturewidget.cpp b/qt-ui/divepicturewidget.cpp index a0d209b6d..1baceeb7e 100644 --- a/qt-ui/divepicturewidget.cpp +++ b/qt-ui/divepicturewidget.cpp @@ -4,6 +4,7 @@ #include "divelist.h" #include <QtConcurrentMap> #include <QtConcurrentRun> +#include <QFuture> #include <QDir> #include <QCryptographicHash> #include <mainwindow.h> @@ -53,6 +54,14 @@ SPixmap scaleImages(picturepointer picture) return ret; } +void DivePictureModel::updateDivePicturesWhenDone(QList<QFuture<void> > futures) +{ + Q_FOREACH (QFuture<void> f, futures) { + f.waitForFinished(); + } + updateDivePictures(); +} + void DivePictureModel::updateDivePictures() { if (numberOfPictures != 0) { diff --git a/qt-ui/divepicturewidget.h b/qt-ui/divepicturewidget.h index e8104a1db..506f85bf8 100644 --- a/qt-ui/divepicturewidget.h +++ b/qt-ui/divepicturewidget.h @@ -4,6 +4,7 @@ #include <QAbstractTableModel> #include <QListView> #include <QThread> +#include <QFuture> typedef QPair<QString, QByteArray> SHashedFilename; @@ -25,6 +26,7 @@ public: virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; virtual int rowCount(const QModelIndex &parent = QModelIndex()) const; void updateDivePictures(); + void updateDivePicturesWhenDone(QList<QFuture<void> >); void removePicture(const QString& fileUrl); private: diff --git a/qt-ui/mainwindow.cpp b/qt-ui/mainwindow.cpp index e7235f9f8..f8335affb 100644 --- a/qt-ui/mainwindow.cpp +++ b/qt-ui/mainwindow.cpp @@ -327,14 +327,15 @@ void MainWindow::on_actionHash_images_triggered() dialog.setLabelText(QFileDialog::Accept, tr("Scan")); dialog.setLabelText(QFileDialog::Reject, tr("Cancel")); QStringList dirnames; + QList<QFuture<void> > futures; if (dialog.exec()) dirnames = dialog.selectedFiles(); if (dirnames.isEmpty()) return; foreach (QString dir, dirnames) { - QtConcurrent::run(learnImages, QDir(dir), 10, false); + futures << QtConcurrent::run(learnImages, QDir(dir), 10, false); } - + DivePictureModel::instance()->updateDivePicturesWhenDone(futures); } ProfileWidget2 *MainWindow::graphics() const |