summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2018-05-27 14:03:29 +0200
committerGravatar Lubomir I. Ivanov <neolit123@gmail.com>2018-05-27 23:08:12 +0300
commit23d38a982deafb6ef12f597a355dc4eae24b832f (patch)
tree33865a026165644973d736b6cc7b3ec602d3b056 /core
parentf265504dabf4a7cafa0282e034919007d663f4f0 (diff)
downloadsubsurface-23d38a982deafb6ef12f597a355dc4eae24b832f.tar.gz
Dive pictures: give user option to recalculate thumbnails
Even though hashes of image contents are calculated, the hashes are not compared to actual file contents in routine-operation. Therefore give the user the option to recalculate thumbnails, should they have edited the picture. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Diffstat (limited to 'core')
-rw-r--r--core/imagedownloader.cpp28
-rw-r--r--core/imagedownloader.h4
2 files changed, 32 insertions, 0 deletions
diff --git a/core/imagedownloader.cpp b/core/imagedownloader.cpp
index 1d82c50c5..0c72f3381 100644
--- a/core/imagedownloader.cpp
+++ b/core/imagedownloader.cpp
@@ -184,6 +184,23 @@ static void addThumbnailToCache(const QImage &thumbnail, const QString &picture_
file.commit();
}
+void Thumbnailer::recalculate(QString filename)
+{
+ auto res = getHashedImage(filename, true);
+
+ // If we couldn't load the image from disk -> leave old thumbnail.
+ // The case "load from web" is a bit inconsistent: it will call into processItem() later
+ // and therefore a "broken" image symbol may be shown.
+ if (res.second || res.first.isNull())
+ return;
+ QImage thumbnail = res.first;
+ addThumbnailToCache(thumbnail, filename);
+
+ QMutexLocker l(&lock);
+ emit thumbnailChanged(filename, thumbnail);
+ workingOn.remove(filename);
+}
+
void Thumbnailer::processItem(QString filename, bool tryDownload)
{
QImage thumbnail = getThumbnailFromCache(filename);
@@ -236,6 +253,17 @@ QImage Thumbnailer::fetchThumbnail(PictureEntry &entry)
return dummyImage;
}
+void Thumbnailer::calculateThumbnails(const QVector<QString> &filenames)
+{
+ QMutexLocker l(&lock);
+ for (const QString &filename: filenames) {
+ if (!workingOn.contains(filename)) {
+ workingOn.insert(filename,
+ QtConcurrent::run(&pool, [this, filename]() { recalculate(filename); }));
+ }
+ }
+}
+
void Thumbnailer::clearWorkQueue()
{
QMutexLocker l(&lock);
diff --git a/core/imagedownloader.h b/core/imagedownloader.h
index 22ef8f5eb..d91dbcaad 100644
--- a/core/imagedownloader.h
+++ b/core/imagedownloader.h
@@ -34,6 +34,9 @@ public:
// via a signal later.
QImage fetchThumbnail(PictureEntry &entry);
+ // Schedule multiple thumbnails for forced recalculation
+ void calculateThumbnails(const QVector<QString> &filenames);
+
// If we change dive, clear all unfinished thumbnail creations
void clearWorkQueue();
static int maxThumbnailSize();
@@ -46,6 +49,7 @@ signals:
void thumbnailChanged(QString filename, QImage thumbnail);
private:
Thumbnailer();
+ void recalculate(QString filename);
void processItem(QString filename, bool tryDownload);
mutable QMutex lock;