diff options
-rw-r--r-- | core/metrics.cpp | 2 | ||||
-rw-r--r-- | core/metrics.h | 2 | ||||
-rw-r--r-- | qt-models/divetripmodel.cpp | 38 |
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: |