From e811c7306d210af17a6571e61f23496ce91fa4bc Mon Sep 17 00:00:00 2001 From: Berthold Stoeger Date: Sun, 29 Apr 2018 23:10:32 +0200 Subject: [PATCH] Dive pictures: Convert thumbnailHash to individual files On startup, convert an old-style thumbnailHash to individual thumbnail files. Show a modal progress bar while doing so. Signed-off-by: Berthold Stoeger --- core/qthelper.cpp | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/core/qthelper.cpp b/core/qthelper.cpp index 55015d226..93c4c20f5 100644 --- a/core/qthelper.cpp +++ b/core/qthelper.cpp @@ -9,6 +9,7 @@ #include "divecomputer.h" #include "time.h" #include "gettextfromc.h" +#include "metadata.h" #include #include "prefs-macros.h" #include @@ -28,6 +29,7 @@ #include #include #include +#include // TODO: remove with convertThumbnails() #include #include @@ -1094,18 +1096,60 @@ extern "C" char *hashfile_name_string() return copy_qstring(hashfile_name()); } +// During a transition period, convert old thumbnail-hashes to individual files +// TODO: remove this code in due course +static void convertThumbnails(const QHash &thumbnails) +{ + if (thumbnails.empty()) + return; + // This is a singular occurrence, therefore translating the strings seems not worth it + QProgressDialog progress("Convert thumbnails...", "Abort", 0, thumbnails.size()); + progress.setWindowModality(Qt::WindowModal); + + int count = 0; + for (const QString &name: thumbnails.keys()) { + const QImage thumbnail = thumbnails[name]; + + if (thumbnail.isNull()) + continue; + + // This is duplicate code (see qt-models/divepicturemodel.cpp) + // Not a problem, since this routine will be removed in due course. + QString filename = thumbnailFileName(name); + if (filename.isEmpty()) + continue; + + QSaveFile file(filename); + if (!file.open(QIODevice::WriteOnly)) + return; + QDataStream stream(&file); + + quint32 type = MEDIATYPE_PICTURE; + stream << type; + stream << thumbnail; + file.commit(); + + progress.setValue(++count); + if (progress.wasCanceled()) + break; + } +} + void read_hashes() { QFile hashfile(hashfile_name()); - QMutexLocker locker(&hashOfMutex); if (hashfile.open(QIODevice::ReadOnly)) { QDataStream stream(&hashfile); stream >> localFilenameOf; + QMutexLocker locker(&hashOfMutex); stream >> hashOf; + locker.unlock(); QHash thumbnailCache; stream >> thumbnailCache; // For backwards compatibility hashfile.close(); + convertThumbnails(thumbnailCache); } + QMutexLocker locker(&hashOfMutex); localFilenameOf.remove(""); QMutableHashIterator iter(hashOf); while (iter.hasNext()) {