Add DiveSitePicturesModel

This model should be used inside the Edit Dive Site mode.
It should display all photos from all dives that are part
of this dive site, ignoring trips.

Signed-off-by: Tomaz Canabrava <tomaz.canabrava@gmail.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Tomaz Canabrava 2015-08-06 10:14:18 -03:00 committed by Dirk Hohndel
parent 342479586d
commit ed30059183
6 changed files with 75 additions and 12 deletions

View file

@ -364,6 +364,7 @@ set(SUBSURFACE_MODELS_LIB_SRCS
qt-models/divepicturemodel.cpp
qt-models/diveplotdatamodel.cpp
qt-models/divelocationmodel.cpp
qt-models/divesitepicturesmodel.cpp
)
source_group("Subsurface Models" FILES ${SUBSURFACE_MODELS})

View file

@ -5,12 +5,7 @@
#include <QtConcurrent>
typedef QList<struct picture *> SPictureList;
typedef struct picture *picturepointer;
typedef QPair<picturepointer, QImage> SPixmap;
static SPixmap scaleImages(picturepointer picture)
SPixmap scaleImages(picturepointer picture)
{
static QHash <QString, QImage > cache;
SPixmap ret;
@ -126,4 +121,4 @@ void DivePictureModel::removePicture(const QString &fileUrl)
int DivePictureModel::rowCount(const QModelIndex &parent) const
{
return numberOfPictures;
}
}

View file

@ -12,12 +12,19 @@ public:
SHashedImage(struct picture *picture);
};
struct PhotoHelper {
QImage image;
int offsetSeconds;
};
typedef QList<struct picture *> SPictureList;
typedef struct picture *picturepointer;
typedef QPair<picturepointer, QImage> SPixmap;
// function that will scale the pixmap, used inside the QtConcurrent thread.
SPixmap scaleImages(picturepointer picture);
class DivePictureModel : public QAbstractTableModel {
Q_OBJECT
public:
@ -25,11 +32,11 @@ public:
virtual int columnCount(const QModelIndex &parent = QModelIndex()) const;
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
void updateDivePictures();
virtual void updateDivePictures();
void updateDivePicturesWhenDone(QList<QFuture<void> >);
void removePicture(const QString& fileUrl);
private:
protected:
DivePictureModel();
int numberOfPictures;
// Currently, load the images on the fly
@ -38,4 +45,4 @@ private:
QHash<QString, PhotoHelper> stringPixmapCache;
};
#endif
#endif

View file

@ -0,0 +1,45 @@
#include "divesitepicturesmodel.h"
#include "dive.h"
#include "stdint.h"
#include <QtConcurrent>
#include <QPixmap>
DiveSitePicturesModel* DiveSitePicturesModel::instance() {
static DiveSitePicturesModel *self = new DiveSitePicturesModel();
return self;
}
DiveSitePicturesModel::DiveSitePicturesModel() {
}
void DiveSitePicturesModel::updateDivePictures() {
beginResetModel();
numberOfPictures = 0;
endResetModel();
const uint32_t ds_uuid = displayed_dive_site.uuid;
struct dive *d;
int i;
stringPixmapCache.clear();
SPictureList pictures;
for_each_dive (i, d) {
if (d->dive_site_uuid == ds_uuid && dive_get_picture_count(d)) {
FOR_EACH_PICTURE(d) {
stringPixmapCache[QString(picture->filename)].offsetSeconds = picture->offset.seconds;
pictures.push_back(picture);
}
}
}
QList<SPixmap> list = QtConcurrent::blockingMapped(pictures, scaleImages);
Q_FOREACH (const SPixmap &pixmap, list)
stringPixmapCache[pixmap.first->filename].image = pixmap.second;
numberOfPictures = list.count();
beginInsertRows(QModelIndex(), 0, numberOfPictures - 1);
endInsertRows();
}

View file

@ -0,0 +1,15 @@
#ifndef DIVESITEPICTURESMODEL_H
#define DIVESITEPICTURESMODEL_H
#include "divepicturemodel.h"
class DiveSitePicturesModel : public DivePictureModel {
Q_OBJECT
public:
static DiveSitePicturesModel *instance();
void updateDivePictures();
private:
DiveSitePicturesModel();
};
#endif

View file

@ -51,6 +51,6 @@ signals:
void setLineEditText(const QString& text);
private:
uint32_t last_uuid;
};
#endif