From 89556f27fc28bb080f255e7d1b2b99ac06d821f8 Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <tomaz.canabrava@gmail.com>
Date: Thu, 6 Aug 2015 10:14:18 -0300
Subject: [PATCH 1/5] 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>
---
 CMakeLists.txt                      |  1 +
 qt-models/divepicturemodel.cpp      |  9 ++------
 qt-models/divepicturemodel.h        | 15 +++++++++----
 qt-models/divesitepicturesmodel.cpp | 45 +++++++++++++++++++++++++++++++++++++
 qt-models/divesitepicturesmodel.h   | 15 +++++++++++++
 qt-ui/locationinformation.h         |  2 +-
 6 files changed, 75 insertions(+), 12 deletions(-)
 create mode 100644 qt-models/divesitepicturesmodel.cpp
 create mode 100644 qt-models/divesitepicturesmodel.h

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7b7f783..9498cab 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -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})
 
diff --git a/qt-models/divepicturemodel.cpp b/qt-models/divepicturemodel.cpp
index 9e60404..06051dd 100644
--- a/qt-models/divepicturemodel.cpp
+++ b/qt-models/divepicturemodel.cpp
@@ -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;
-}
\ No newline at end of file
+}
diff --git a/qt-models/divepicturemodel.h b/qt-models/divepicturemodel.h
index edcddd7..2ca22a1 100644
--- a/qt-models/divepicturemodel.h
+++ b/qt-models/divepicturemodel.h
@@ -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
\ No newline at end of file
+#endif
diff --git a/qt-models/divesitepicturesmodel.cpp b/qt-models/divesitepicturesmodel.cpp
new file mode 100644
index 0000000..3777f1d
--- /dev/null
+++ b/qt-models/divesitepicturesmodel.cpp
@@ -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();
+}
diff --git a/qt-models/divesitepicturesmodel.h b/qt-models/divesitepicturesmodel.h
new file mode 100644
index 0000000..f19f57c
--- /dev/null
+++ b/qt-models/divesitepicturesmodel.h
@@ -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
diff --git a/qt-ui/locationinformation.h b/qt-ui/locationinformation.h
index 09814e9..0a2f662 100644
--- a/qt-ui/locationinformation.h
+++ b/qt-ui/locationinformation.h
@@ -51,6 +51,6 @@ signals:
 	void setLineEditText(const QString& text);
 private:
 	uint32_t last_uuid;
-
 };
+
 #endif
-- 
2.3.2 (Apple Git-55)

