diff options
author | Tomaz Canabrava <tomaz.canabrava@intel.com> | 2014-05-31 00:42:54 -0300 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2014-06-01 15:54:29 -0700 |
commit | f1d67cfbacd1e879725e5ebeb2774439246764a4 (patch) | |
tree | 20a2862c95767c7646ee361dcef654330ec62640 /qt-ui/divepicturewidget.cpp | |
parent | e140703d34325344f503fc328c20643a8ea9249a (diff) | |
download | subsurface-f1d67cfbacd1e879725e5ebeb2774439246764a4.tar.gz |
Add threaded processing of image pixmaps
This code adds threaded processing of a batch of images. It uses the
QtConcurrent implementations to call a function repeteadly using
MAX_THREADS (Qt gets that for us) and returns a list of it.
This call is blocking, so while the pixmaps are being scaled in threads,
it will wait for all scalling to be done.
Signed-off-by: Tomaz Canabrava <tomaz.canabrava@intel.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'qt-ui/divepicturewidget.cpp')
-rw-r--r-- | qt-ui/divepicturewidget.cpp | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/qt-ui/divepicturewidget.cpp b/qt-ui/divepicturewidget.cpp index 11849af5f..eda4ff68c 100644 --- a/qt-ui/divepicturewidget.cpp +++ b/qt-ui/divepicturewidget.cpp @@ -1,5 +1,6 @@ #include "divepicturewidget.h" #include <dive.h> +#include <qtconcurrentmap.h> void DivePictureDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { @@ -11,29 +12,52 @@ DivePictureModel::DivePictureModel(QObject *parent): QAbstractTableModel(parent) } +typedef QPair<QString, QPixmap> SPixmap; +typedef QList<SPixmap> SPixmapList; + +SPixmap scaleImages(const QString& s){ + QPixmap p = QPixmap(s).scaled(128,128, Qt::KeepAspectRatio); + SPixmap ret; + ret.first = s; + ret.second = p; + return ret; +} + void DivePictureModel::updateDivePictures(int divenr) { + qDebug() << "Updating dive pictures."; beginRemoveRows(QModelIndex(), 0, numberOfPictures-1); numberOfPictures = 0; endRemoveRows(); + QStringList pictures; struct dive *d = get_dive(divenr); - if (!d) + if (!d){ + qDebug() << "Got no dive, exiting."; return; + } // All pictures are set in *all* divecomputers. ( waste of memory if > 100 pictures? ) // so just get from the first one. struct event *ev = d->dc.events; while(ev){ if(ev->type == 123){ // 123 means PICTURE. numberOfPictures++; + pictures.push_back(QString(ev->name)); } ev = ev->next; } - if (numberOfPictures == 0) + SPixmapList retList = QtConcurrent::blockingMapped<SPixmapList>( pictures, scaleImages); + Q_FOREACH(const SPixmap & pixmap, retList) + stringPixmapCache[pixmap.first] = pixmap.second; + + if (numberOfPictures == 0){ + qDebug() << "Got no pictures, exiting."; return; + } beginInsertRows(QModelIndex(), 0, numberOfPictures-1); endInsertRows(); + qDebug() << "Everything Ok."; } int DivePictureModel::columnCount(const QModelIndex &parent) const |