summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/metrics.cpp2
-rw-r--r--core/metrics.h2
-rw-r--r--qt-models/divetripmodel.cpp38
3 files changed, 31 insertions, 11 deletions
diff --git a/core/metrics.cpp b/core/metrics.cpp
index 9351bcb0d..7316487a1 100644
--- a/core/metrics.cpp
+++ b/core/metrics.cpp
@@ -43,7 +43,7 @@ static int defaultIconSize(int height)
return ret;
}
-const IconMetrics & defaultIconMetrics()
+const IconMetrics &defaultIconMetrics()
{
if (dfltIconMetrics.sz_small == -1) {
int small = defaultIconSize(defaultModelFontMetrics().height());
diff --git a/core/metrics.h b/core/metrics.h
index 4c636bcc4..e345213a7 100644
--- a/core/metrics.h
+++ b/core/metrics.h
@@ -31,7 +31,7 @@ struct IconMetrics {
IconMetrics();
};
-const IconMetrics & defaultIconMetrics();
+const IconMetrics &defaultIconMetrics();
void updateDevicePixelRatio(double dpr);
#endif // METRICS_H
diff --git a/qt-models/divetripmodel.cpp b/qt-models/divetripmodel.cpp
index 358d032a6..71430a7d3 100644
--- a/qt-models/divetripmodel.cpp
+++ b/qt-models/divetripmodel.cpp
@@ -188,6 +188,28 @@ static QString displayWeight(const struct dive *d, bool units)
return s + gettextFromC::tr("lbs");
}
+static QPixmap &getGlobeIcon()
+{
+ static std::unique_ptr<QPixmap> icon;
+ if (!icon) {
+ const IconMetrics &im = defaultIconMetrics();
+ icon = std::make_unique<QPixmap>(QIcon(":globe-icon").pixmap(im.sz_small, im.sz_small));
+ }
+ return *icon;
+}
+
+static QPixmap &getPhotoIcon(int idx)
+{
+ static std::unique_ptr<QPixmap[]> icons;
+ if (!icons) {
+ const IconMetrics &im = defaultIconMetrics();
+ icons = std::make_unique<QPixmap[]>(std::size(icon_names));
+ for (size_t i = 0; i < std::size(icon_names); ++i)
+ icons[i] = QIcon(icon_names[i]).pixmap(im.sz_small, im.sz_small);
+ }
+ return icons[idx];
+}
+
QVariant DiveTripModelBase::diveData(const struct dive *d, int column, int role) const
{
#ifdef SUBSURFACE_MOBILE
@@ -289,17 +311,15 @@ QVariant DiveTripModelBase::diveData(const struct dive *d, int column, int role)
case COUNTRY:
return QVariant();
case LOCATION:
- if (dive_has_gps_location(d)) {
- IconMetrics im = defaultIconMetrics();
- return QIcon(":globe-icon").pixmap(im.sz_small, im.sz_small);
- }
+ if (dive_has_gps_location(d))
+ return getGlobeIcon();
break;
case PHOTOS:
- if (d->pictures.nr > 0) {
- IconMetrics im = defaultIconMetrics();
- return QIcon(icon_names[countPhotos(d)]).pixmap(im.sz_small, im.sz_small);
- } // If there are photos, show one of the three photo icons: fish= photos during dive;
- break; // sun=photos before/after dive; sun+fish=photos during dive as well as before/after
+ // If there are photos, show one of the three photo icons: fish= photos during dive;
+ // sun=photos before/after dive; sun+fish=photos during dive as well as before/after
+ if (d->pictures.nr > 0)
+ return getPhotoIcon(countPhotos(d));
+ break;
}
break;
case Qt::ToolTipRole: