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 #include +#include +#include #include #include #include @@ -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 #include #include +#include +#include #include #include #include @@ -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); }