git repos / SagoImageBrowser

blame: src/imageviewwidget.h

normal view · raw

61136b77 Poul Sander 2026-02-20 22:45 1
#pragma once
61136b77 Poul Sander 2026-02-20 22:45 2
61136b77 Poul Sander 2026-02-20 22:45 3
#include <QWidget>
61136b77 Poul Sander 2026-02-20 22:45 4
#include <QImage>
61136b77 Poul Sander 2026-02-20 22:45 5
#include <QPixmap>
80a9926d Poul Sander 2026-05-19 20:28 6
#include <QByteArray>
80a9926d Poul Sander 2026-05-19 20:28 7
#include <QList>
58103277 Poul Sander 2026-03-01 22:53 8
#include <QMap>
80a9926d Poul Sander 2026-05-19 20:28 9
#include <QSet>
58103277 Poul Sander 2026-03-01 22:53 10
#include <QThread>
53fdab93 Poul Sander 2026-05-18 18:45 11
#include "exifreader.h"
58103277 Poul Sander 2026-03-01 22:53 12
58103277 Poul Sander 2026-03-01 22:53 13
class ImageLoadWorker : public QThread
58103277 Poul Sander 2026-03-01 22:53 14
{
58103277 Poul Sander 2026-03-01 22:53 15
    Q_OBJECT
58103277 Poul Sander 2026-03-01 22:53 16
public:
80a9926d Poul Sander 2026-05-19 20:28 17
    explicit ImageLoadWorker(const QByteArray &path, QObject *parent = nullptr);
58103277 Poul Sander 2026-03-01 22:53 18
    void run() override;
58103277 Poul Sander 2026-03-01 22:53 19
signals:
80a9926d Poul Sander 2026-05-19 20:28 20
    void imageLoaded(const QByteArray &path, const QPixmap &pixmap);
58103277 Poul Sander 2026-03-01 22:53 21
private:
80a9926d Poul Sander 2026-05-19 20:28 22
    QByteArray m_path;
58103277 Poul Sander 2026-03-01 22:53 23
};
61136b77 Poul Sander 2026-02-20 22:45 24
61136b77 Poul Sander 2026-02-20 22:45 25
class ImageViewWidget : public QWidget
61136b77 Poul Sander 2026-02-20 22:45 26
{
61136b77 Poul Sander 2026-02-20 22:45 27
    Q_OBJECT
61136b77 Poul Sander 2026-02-20 22:45 28
61136b77 Poul Sander 2026-02-20 22:45 29
public:
58103277 Poul Sander 2026-03-01 22:53 30
    // Number of images to read ahead and keep behind the current image
58103277 Poul Sander 2026-03-01 22:53 31
    static constexpr int CacheReadAhead = 2;
58103277 Poul Sander 2026-03-01 22:53 32
    static constexpr int CacheKeepBehind = 2;
58103277 Poul Sander 2026-03-01 22:53 33
c58dbdb7 Poul Sander 2026-02-22 17:49 34
    enum ZoomMode { FitToScreen, OriginalSize, CustomZoom };
c58dbdb7 Poul Sander 2026-02-22 17:49 35
61136b77 Poul Sander 2026-02-20 22:45 36
    explicit ImageViewWidget(QWidget *parent = nullptr);
61136b77 Poul Sander 2026-02-20 22:45 37
80a9926d Poul Sander 2026-05-19 20:28 38
    void setImage(const QByteArray &path);
f61bf886 Poul Sander 2026-02-23 19:27 39
    void setBackgroundColor(const QString &color);
c58dbdb7 Poul Sander 2026-02-22 17:49 40
    void zoomIn();
c58dbdb7 Poul Sander 2026-02-22 17:49 41
    void zoomOut();
c58dbdb7 Poul Sander 2026-02-22 17:49 42
    void zoomOriginal();
c58dbdb7 Poul Sander 2026-02-22 17:49 43
    void zoomFitToScreen();
61136b77 Poul Sander 2026-02-20 22:45 44
80a9926d Poul Sander 2026-05-19 20:28 45
    void prefetchImage(const QByteArray &path);
80a9926d Poul Sander 2026-05-19 20:28 46
    void setNeighborPaths(const QList<QByteArray> &paths);
58103277 Poul Sander 2026-03-01 22:53 47
    void clearCache();
48534775 Poul Sander 2026-06-08 18:57 48
    // Drop any cached pixmap for path so it is re-decoded from disk next time.
48534775 Poul Sander 2026-06-08 18:57 49
    void invalidateCache(const QByteArray &path);
58103277 Poul Sander 2026-03-01 22:53 50
53fdab93 Poul Sander 2026-05-18 18:45 51
    void setExifData(const ExifData &data);
53fdab93 Poul Sander 2026-05-18 18:45 52
    void toggleExifOverlay();
beb4a823 Poul Sander 2026-05-19 21:53 53
    QByteArray currentPath() const;
53fdab93 Poul Sander 2026-05-18 18:45 54
61136b77 Poul Sander 2026-02-20 22:45 55
signals:
61136b77 Poul Sander 2026-02-20 22:45 56
    void closeRequested();
1ffc1962 Poul Sander 2026-02-20 23:41 57
    void nextRequested();
1ffc1962 Poul Sander 2026-02-20 23:41 58
    void previousRequested();
beb4a823 Poul Sander 2026-05-19 21:53 59
    void editCaptionRequested();
61136b77 Poul Sander 2026-02-20 22:45 60
61136b77 Poul Sander 2026-02-20 22:45 61
protected:
61136b77 Poul Sander 2026-02-20 22:45 62
    void paintEvent(QPaintEvent *event) override;
61136b77 Poul Sander 2026-02-20 22:45 63
    void keyPressEvent(QKeyEvent *event) override;
c8ae2669 Poul Sander 2026-02-22 17:52 64
    void mousePressEvent(QMouseEvent *event) override;
c8ae2669 Poul Sander 2026-02-22 17:52 65
    void mouseMoveEvent(QMouseEvent *event) override;
c8ae2669 Poul Sander 2026-02-22 17:52 66
    void mouseReleaseEvent(QMouseEvent *event) override;
1035a476 Poul Sander 2026-02-23 19:30 67
    void mouseDoubleClickEvent(QMouseEvent *event) override;
61136b77 Poul Sander 2026-02-20 22:45 68
61136b77 Poul Sander 2026-02-20 22:45 69
private:
c8ae2669 Poul Sander 2026-02-22 17:52 70
    void clampOffset(int imgW, int imgH);
80a9926d Poul Sander 2026-05-19 20:28 71
    QPixmap loadImageFromDisk(const QByteArray &path);
80a9926d Poul Sander 2026-05-19 20:28 72
    void onImageLoaded(const QByteArray &path, const QPixmap &pixmap);
c8ae2669 Poul Sander 2026-02-22 17:52 73
61136b77 Poul Sander 2026-02-20 22:45 74
    QPixmap m_pixmap;
c58dbdb7 Poul Sander 2026-02-22 17:49 75
    ZoomMode m_zoomMode = FitToScreen;
c58dbdb7 Poul Sander 2026-02-22 17:49 76
    double m_zoomFactor = 1.0;
f61bf886 Poul Sander 2026-02-23 19:27 77
    QString m_backgroundColor = "black";
80a9926d Poul Sander 2026-05-19 20:28 78
    QByteArray m_currentPath;
58103277 Poul Sander 2026-03-01 22:53 79
58103277 Poul Sander 2026-03-01 22:53 80
    // Image cache: path -> pixmap
80a9926d Poul Sander 2026-05-19 20:28 81
    QMap<QByteArray, QPixmap> m_cache;
80a9926d Poul Sander 2026-05-19 20:28 82
    QList<QByteArray> m_neighborPaths;    // ordered list of paths around current image
80a9926d Poul Sander 2026-05-19 20:28 83
    QSet<QByteArray> m_pendingLoads;      // paths currently being loaded in background
c8ae2669 Poul Sander 2026-02-22 17:52 84
c8ae2669 Poul Sander 2026-02-22 17:52 85
    // Panning state
c8ae2669 Poul Sander 2026-02-22 17:52 86
    QPoint m_offset;        // current pan offset (pixels)
c8ae2669 Poul Sander 2026-02-22 17:52 87
    bool   m_dragging = false;
c8ae2669 Poul Sander 2026-02-22 17:52 88
    QPoint m_dragStart;
c8ae2669 Poul Sander 2026-02-22 17:52 89
    QPoint m_offsetAtDragStart;
53fdab93 Poul Sander 2026-05-18 18:45 90
53fdab93 Poul Sander 2026-05-18 18:45 91
    // EXIF overlay
53fdab93 Poul Sander 2026-05-18 18:45 92
    ExifData m_exifData;
53fdab93 Poul Sander 2026-05-18 18:45 93
    bool m_showExifOverlay = false;
4db3041a Poul Sander 2026-05-26 22:01 94
4db3041a Poul Sander 2026-05-26 22:01 95
    // Help overlay
4db3041a Poul Sander 2026-05-26 22:01 96
    bool m_showHelpOverlay = false;
61136b77 Poul Sander 2026-02-20 22:45 97
};
1970-01-01 00:00 98