git repos / SagoImageBrowser

commit cdae9502

Poul Sander · 2026-06-09 20:04
cdae950217c0c1268006b47fa8e63429febe51c8 patch · browse files
parent 091a4f7d18eac75463bfccfaaf9694851e5e0440

Make the link to openstreetmaps clickable

Changed files

M src/imageviewwidget.cpp before
M src/imageviewwidget.h before
M src/mainwindow.cpp before
diff --git a/src/imageviewwidget.cpp b/src/imageviewwidget.cpp index ed2cd7c..c8a5d42 100644 --- a/src/imageviewwidget.cpp +++ b/src/imageviewwidget.cpp
@@ -3,6 +3,8 @@
#include <QPainter>
#include <QMouseEvent>
+#include <QDesktopServices>
+#include <QUrl>
#include <QFile>
#include <QImageReader>
#include <QPalette>
@@ -65,6 +67,7 @@ ImageViewWidget::ImageViewWidget(QWidget *parent)
setFocusPolicy(Qt::StrongFocus);
setAutoFillBackground(true);
setBackgroundColor("black");
+ setMouseTracking(true);
}
QPixmap ImageViewWidget::loadImageFromDisk(const QByteArray &path)
@@ -244,8 +247,18 @@ void ImageViewWidget::paintEvent(QPaintEvent *)
painter.drawRoundedRect(boxX, boxY, boxW, boxH, 8, 8);
painter.setPen(Qt::white);
+ m_osmLinkRect = QRect();
for (int i = 0; i < fields.size(); ++i) {
const QString line = fields[i].first + QLatin1String(": ") + fields[i].second;
+ if (fields[i].first == "OpenStreetMap") {
+ painter.setPen(Qt::cyan);
+ m_osmLinkRect = QRect(boxX + padding,
+ boxY + padding + i * lineH,
+ fm.horizontalAdvance(line),
+ lineH);
+ } else {
+ painter.setPen(Qt::white);
+ }
painter.drawText(boxX + padding,
boxY + padding + fm.ascent() + i * lineH,
line);
@@ -541,6 +554,11 @@ void ImageViewWidget::zoomFitToScreen()
void ImageViewWidget::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
+ if (m_showExifOverlay && m_osmLinkRect.contains(event->pos())) {
+ QDesktopServices::openUrl(QUrl(m_exifData.osmLink));
+ event->accept();
+ return;
+ }
m_dragging = true;
m_dragStart = event->pos();
m_offsetAtDragStart = m_offset;
@@ -555,6 +573,12 @@ void ImageViewWidget::mouseMoveEvent(QMouseEvent *event)
m_offset = m_offsetAtDragStart + (event->pos() - m_dragStart);
update();
event->accept();
+ } else {
+ if (m_showExifOverlay && m_osmLinkRect.contains(event->pos())) {
+ setCursor(Qt::PointingHandCursor);
+ } else {
+ setCursor(Qt::ArrowCursor);
+ }
}
}
diff --git a/src/imageviewwidget.h b/src/imageviewwidget.h index 78f13a1..ab50bc4 100644 --- a/src/imageviewwidget.h +++ b/src/imageviewwidget.h
@@ -94,4 +94,7 @@ private:
// Help overlay
bool m_showHelpOverlay = false;
+
+ // Clickable link areas
+ QRect m_osmLinkRect;
};
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 1b45e1d..1d3f3cf 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp
@@ -27,6 +27,8 @@
#include <QAction>
#include <QSettings>
#include <QTableWidget>
+#include <QDesktopServices>
+#include <QUrl>
#include <QDialog>
#include <QHBoxLayout>
#include <QPlainTextEdit>
@@ -449,6 +451,18 @@ void MainWindow::setupConnections()
// Filter them here so PrevFolder/NextFolder shortcuts work while a view has focus.
m_listView->installEventFilter(this);
m_treeView->installEventFilter(this);
+
+ connect(m_exifTable, &QTableWidget::cellClicked, this, [this](int row, int column) {
+ if (column == 1) {
+ QTableWidgetItem *fieldItem = m_exifTable->item(row, 0);
+ if (fieldItem && fieldItem->text() == "OpenStreetMap") {
+ QTableWidgetItem *valueItem = m_exifTable->item(row, 1);
+ if (valueItem && !valueItem->text().isEmpty()) {
+ QDesktopServices::openUrl(QUrl(valueItem->text()));
+ }
+ }
+ }
+ });
}
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
@@ -542,7 +556,15 @@ void MainWindow::updateExifInfo(const QByteArray &path)
m_exifTable->setRowCount(fields.size());
for (int i = 0; i < fields.size(); ++i) {
m_exifTable->setItem(i, 0, new QTableWidgetItem(fields[i].first));
- m_exifTable->setItem(i, 1, new QTableWidgetItem(fields[i].second));
+ auto *item = new QTableWidgetItem(fields[i].second);
+ if (fields[i].first == "OpenStreetMap") {
+ item->setForeground(Qt::blue);
+ QFont font = item->font();
+ font.setUnderline(true);
+ item->setFont(font);
+ item->setToolTip(tr("Click to open in browser"));
+ }
+ m_exifTable->setItem(i, 1, item);
}
m_exifTable->resizeColumnToContents(0);
}