summaryrefslogtreecommitdiffstats
path: root/qt-ui/divepicturewidget.cpp
diff options
context:
space:
mode:
authorGravatar Tomaz Canabrava <tomaz.canabrava@intel.com>2014-05-31 00:42:54 -0300
committerGravatar Dirk Hohndel <dirk@hohndel.org>2014-06-01 15:54:29 -0700
commitf1d67cfbacd1e879725e5ebeb2774439246764a4 (patch)
tree20a2862c95767c7646ee361dcef654330ec62640 /qt-ui/divepicturewidget.cpp
parente140703d34325344f503fc328c20643a8ea9249a (diff)
downloadsubsurface-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.cpp28
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