summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2018-05-27 15:42:22 +0200
committerGravatar Lubomir I. Ivanov <neolit123@gmail.com>2018-05-27 23:08:12 +0300
commit308e079ad6414152fe72ba0784582734d6801b75 (patch)
tree2add927a9dd6d4e967c754f1ce4533444deddcf8
parent23d38a982deafb6ef12f597a355dc4eae24b832f (diff)
downloadsubsurface-308e079ad6414152fe72ba0784582734d6801b75.tar.gz
Dive pictures: automatically recalculate thumbnails
If a thumbnail and the original picture can be accessed and the modification date of the thumbnail is before the modification date of the picture, recalculate the thumbnail. This causes more disk access and might give strange effects for picture files with messed up file timestamps (i.e. lying in the future) or messed up computer clocks (i.e. running in the past). Therefore, add a preference option to disable the new behavior. Default is set to enabled. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
-rw-r--r--core/imagedownloader.cpp18
-rw-r--r--core/pref.h1
-rw-r--r--core/subsurface-qt/SettingsObjectWrapper.cpp18
-rw-r--r--core/subsurface-qt/SettingsObjectWrapper.h32
-rw-r--r--core/subsurfacestartup.c1
-rw-r--r--desktop-widgets/preferences/preferences_graph.cpp2
-rw-r--r--desktop-widgets/preferences/preferences_graph.ui7
7 files changed, 64 insertions, 15 deletions
diff --git a/core/imagedownloader.cpp b/core/imagedownloader.cpp
index 0c72f3381..da5c86b99 100644
--- a/core/imagedownloader.cpp
+++ b/core/imagedownloader.cpp
@@ -151,8 +151,24 @@ static QImage getThumbnailFromCache(const QString &picture_filename)
QString filename = thumbnailFileName(picture_filename);
if (filename.isEmpty())
return QImage();
-
QFile file(filename);
+
+ if (prefs.auto_recalculate_thumbnails) {
+ // Check if thumbnails is older than the (local) image file
+ QString filenameLocal = localFilePath(qPrintable(picture_filename));
+ QFileInfo pictureInfo(filenameLocal);
+ QFileInfo thumbnailInfo(file);
+ if (pictureInfo.exists() && thumbnailInfo.exists()) {
+ QDateTime pictureTime = pictureInfo.lastModified();
+ QDateTime thumbnailTime = thumbnailInfo.lastModified();
+ if (pictureTime.isValid() && thumbnailTime.isValid() && thumbnailTime < pictureTime) {
+ // Both files exist, have valid timestamps and thumbnail was calculated before picture.
+ // Return an empty thumbnail to signal recalculation of the thumbnail
+ return QImage();
+ }
+ }
+ }
+
if (!file.open(QIODevice::ReadOnly))
return QImage();
QDataStream stream(&file);
diff --git a/core/pref.h b/core/pref.h
index 2628c3677..8ca763ce8 100644
--- a/core/pref.h
+++ b/core/pref.h
@@ -154,6 +154,7 @@ struct preferences {
int distance_threshold;
bool git_local_only;
short cloud_timeout;
+ bool auto_recalculate_thumbnails;
locale_prefs_t locale; //: TODO: move the rest of locale based info here.
update_manager_prefs_t update_manager;
dive_computer_prefs_t dive_computer;
diff --git a/core/subsurface-qt/SettingsObjectWrapper.cpp b/core/subsurface-qt/SettingsObjectWrapper.cpp
index d88df5cba..60473ec1a 100644
--- a/core/subsurface-qt/SettingsObjectWrapper.cpp
+++ b/core/subsurface-qt/SettingsObjectWrapper.cpp
@@ -1802,6 +1802,11 @@ int GeneralSettingsObjectWrapper::pscrRatio() const
return prefs.pscr_ratio;
}
+bool GeneralSettingsObjectWrapper::autoRecalculateThumbnails() const
+{
+ return prefs.auto_recalculate_thumbnails;
+}
+
void GeneralSettingsObjectWrapper::setDefaultFilename(const QString& value)
{
if (value == prefs.default_filename)
@@ -1895,6 +1900,18 @@ void GeneralSettingsObjectWrapper::setPscrRatio(int value)
emit pscrRatioChanged(value);
}
+void GeneralSettingsObjectWrapper::setAutoRecalculateThumbnails(bool value)
+{
+ if (value == prefs.auto_recalculate_thumbnails)
+ return;
+
+ QSettings s;
+ s.beginGroup(group);
+ s.setValue("auto_recalculate_thumbnails", value);
+ prefs.auto_recalculate_thumbnails = value;
+ emit autoRecalculateThumbnailsChanged(value);
+}
+
DisplaySettingsObjectWrapper::DisplaySettingsObjectWrapper(QObject *parent) :
QObject(parent)
{
@@ -2266,6 +2283,7 @@ void SettingsObjectWrapper::load()
GET_INT("defaultsetpoint", defaultsetpoint);
GET_INT("o2consumption", o2consumption);
GET_INT("pscr_ratio", pscr_ratio);
+ GET_BOOL("auto_recalculate_thumbnails", auto_recalculate_thumbnails);
s.endGroup();
s.beginGroup("Display");
diff --git a/core/subsurface-qt/SettingsObjectWrapper.h b/core/subsurface-qt/SettingsObjectWrapper.h
index f2c6745d8..a56175ea7 100644
--- a/core/subsurface-qt/SettingsObjectWrapper.h
+++ b/core/subsurface-qt/SettingsObjectWrapper.h
@@ -552,13 +552,14 @@ private:
class GeneralSettingsObjectWrapper : public QObject {
Q_OBJECT
- Q_PROPERTY(QString default_filename READ defaultFilename WRITE setDefaultFilename NOTIFY defaultFilenameChanged)
- Q_PROPERTY(QString default_cylinder READ defaultCylinder WRITE setDefaultCylinder NOTIFY defaultCylinderChanged)
- Q_PROPERTY(short default_file_behavior READ defaultFileBehavior WRITE setDefaultFileBehavior NOTIFY defaultFileBehaviorChanged)
- Q_PROPERTY(bool use_default_file READ useDefaultFile WRITE setUseDefaultFile NOTIFY useDefaultFileChanged)
- Q_PROPERTY(int defaultsetpoint READ defaultSetPoint WRITE setDefaultSetPoint NOTIFY defaultSetPointChanged)
- Q_PROPERTY(int o2consumption READ o2Consumption WRITE setO2Consumption NOTIFY o2ConsumptionChanged)
- Q_PROPERTY(int pscr_ratio READ pscrRatio WRITE setPscrRatio NOTIFY pscrRatioChanged)
+ Q_PROPERTY(QString default_filename READ defaultFilename WRITE setDefaultFilename NOTIFY defaultFilenameChanged)
+ Q_PROPERTY(QString default_cylinder READ defaultCylinder WRITE setDefaultCylinder NOTIFY defaultCylinderChanged)
+ Q_PROPERTY(short default_file_behavior READ defaultFileBehavior WRITE setDefaultFileBehavior NOTIFY defaultFileBehaviorChanged)
+ Q_PROPERTY(bool use_default_file READ useDefaultFile WRITE setUseDefaultFile NOTIFY useDefaultFileChanged)
+ Q_PROPERTY(int defaultsetpoint READ defaultSetPoint WRITE setDefaultSetPoint NOTIFY defaultSetPointChanged)
+ Q_PROPERTY(int o2consumption READ o2Consumption WRITE setO2Consumption NOTIFY o2ConsumptionChanged)
+ Q_PROPERTY(int pscr_ratio READ pscrRatio WRITE setPscrRatio NOTIFY pscrRatioChanged)
+ Q_PROPERTY(bool auto_recalculate_thumbnails READ autoRecalculateThumbnails WRITE setAutoRecalculateThumbnails NOTIFY autoRecalculateThumbnailsChanged)
public:
GeneralSettingsObjectWrapper(QObject *parent);
@@ -569,15 +570,17 @@ public:
int defaultSetPoint() const;
int o2Consumption() const;
int pscrRatio() const;
+ bool autoRecalculateThumbnails() const;
public slots:
- void setDefaultFilename (const QString& value);
- void setDefaultCylinder (const QString& value);
- void setDefaultFileBehavior (short value);
- void setUseDefaultFile (bool value);
- void setDefaultSetPoint (int value);
- void setO2Consumption (int value);
- void setPscrRatio (int value);
+ void setDefaultFilename (const QString& value);
+ void setDefaultCylinder (const QString& value);
+ void setDefaultFileBehavior (short value);
+ void setUseDefaultFile (bool value);
+ void setDefaultSetPoint (int value);
+ void setO2Consumption (int value);
+ void setPscrRatio (int value);
+ void setAutoRecalculateThumbnails (bool value);
signals:
void defaultFilenameChanged(const QString& value);
@@ -587,6 +590,7 @@ signals:
void defaultSetPointChanged(int value);
void o2ConsumptionChanged(int value);
void pscrRatioChanged(int value);
+ void autoRecalculateThumbnailsChanged(int value);
private:
const QString group = QStringLiteral("GeneralSettings");
};
diff --git a/core/subsurfacestartup.c b/core/subsurfacestartup.c
index 18332742b..65b30e7d6 100644
--- a/core/subsurfacestartup.c
+++ b/core/subsurfacestartup.c
@@ -99,6 +99,7 @@ struct preferences default_prefs = {
#else
.cloud_timeout = 5,
#endif
+ .auto_recalculate_thumbnails = true,
};
int run_survey;
diff --git a/desktop-widgets/preferences/preferences_graph.cpp b/desktop-widgets/preferences/preferences_graph.cpp
index 91cd773d8..14025c82c 100644
--- a/desktop-widgets/preferences/preferences_graph.cpp
+++ b/desktop-widgets/preferences/preferences_graph.cpp
@@ -47,6 +47,7 @@ void PreferencesGraph::refreshSettings()
ui->display_unused_tanks->setChecked(prefs.display_unused_tanks);
ui->show_average_depth->setChecked(prefs.show_average_depth);
+ ui->auto_recalculate_thumbnails->setChecked(prefs.auto_recalculate_thumbnails);
ui->show_icd->setChecked(prefs.show_icd);
}
@@ -56,6 +57,7 @@ void PreferencesGraph::syncSettings()
general->setDefaultSetPoint(lrint(ui->defaultSetpoint->value() * 1000.0));
general->setO2Consumption(lrint(ui->psro2rate->value() *1000.0));
general->setPscrRatio(lrint(1000.0 / ui->pscrfactor->value()));
+ general->setAutoRecalculateThumbnails(ui->auto_recalculate_thumbnails->isChecked());
auto pp_gas = SettingsObjectWrapper::instance()->pp_gas;
pp_gas->setPheThreshold(ui->pheThreshold->value());
diff --git a/desktop-widgets/preferences/preferences_graph.ui b/desktop-widgets/preferences/preferences_graph.ui
index 020ae498f..a7553c990 100644
--- a/desktop-widgets/preferences/preferences_graph.ui
+++ b/desktop-widgets/preferences/preferences_graph.ui
@@ -368,6 +368,13 @@
</property>
</widget>
</item>
+ <item row="2" column="0" colspan="2">
+ <widget class="QCheckBox" name="auto_recalculate_thumbnails">
+ <property name="text">
+ <string>Recalculate thumbnails if older than image</string>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
</item>