git repos / SagoImageBrowser

blame: src/imagemodel.h

normal view · raw

032aa1e1 Poul Sander 2026-02-19 18:55 1
#pragma once
032aa1e1 Poul Sander 2026-02-19 18:55 2
ac476ca8 Poul Sander 2026-05-18 16:47 3
#include "thumbnailcache.h"
ac476ca8 Poul Sander 2026-05-18 16:47 4
032aa1e1 Poul Sander 2026-02-19 18:55 5
#include <QAbstractListModel>
80a9926d Poul Sander 2026-05-19 20:28 6
#include <QByteArray>
032aa1e1 Poul Sander 2026-02-19 18:55 7
#include <QPixmap>
032aa1e1 Poul Sander 2026-02-19 18:55 8
#include <QVector>
cec3b5da Poul Sander 2026-02-19 19:17 9
#include <QThreadPool>
6fcd6c90 Poul Sander 2026-02-19 21:12 10
#include <QSet>
459bad0f Poul Sander 2026-05-17 14:11 11
#include <QHash>
459bad0f Poul Sander 2026-05-17 14:11 12
#include <QList>
6fcd6c90 Poul Sander 2026-02-19 21:12 13
#include <atomic>
09130ab9 Poul Sander 2026-02-22 22:19 14
#include <QIcon>
cec3b5da Poul Sander 2026-02-19 19:17 15
cec3b5da Poul Sander 2026-02-19 19:17 16
class ThumbnailWorker;
032aa1e1 Poul Sander 2026-02-19 18:55 17
032aa1e1 Poul Sander 2026-02-19 18:55 18
class ImageModel : public QAbstractListModel
032aa1e1 Poul Sander 2026-02-19 18:55 19
{
032aa1e1 Poul Sander 2026-02-19 18:55 20
    Q_OBJECT
032aa1e1 Poul Sander 2026-02-19 18:55 21
032aa1e1 Poul Sander 2026-02-19 18:55 22
public:
032aa1e1 Poul Sander 2026-02-19 18:55 23
    explicit ImageModel(QObject *parent = nullptr);
cec3b5da Poul Sander 2026-02-19 19:17 24
    ~ImageModel();
032aa1e1 Poul Sander 2026-02-19 18:55 25
80a9926d Poul Sander 2026-05-19 20:28 26
    // path is the raw native OS byte string (handles non-UTF-8 filenames)
80a9926d Poul Sander 2026-05-19 20:28 27
    void setDirectory(const QByteArray &path);
80a9926d Poul Sander 2026-05-19 20:28 28
    void setDirectory(const QString &path);   // convenience: converts via QFile::encodeName
80a9926d Poul Sander 2026-05-19 20:28 29
    QByteArray filePath(const QModelIndex &index) const;
09130ab9 Poul Sander 2026-02-22 22:19 30
    bool isFolder(const QModelIndex &index) const;
80a9926d Poul Sander 2026-05-19 20:28 31
    QByteArray currentDirectory() const;
032aa1e1 Poul Sander 2026-02-19 18:55 32
6fcd6c90 Poul Sander 2026-02-19 21:12 33
    void requestThumbnails(int firstRow, int lastRow);
48534775 Poul Sander 2026-06-08 18:57 34
    // Discard the cached thumbnail for a row and re-decode it from disk.
48534775 Poul Sander 2026-06-08 18:57 35
    void refreshThumbnail(const QModelIndex &index);
459bad0f Poul Sander 2026-05-17 14:11 36
    void setCacheMaxSize(int n);
ac476ca8 Poul Sander 2026-05-18 16:47 37
    void setThumbnailSize(ThumbnailCache::Size size);
6fcd6c90 Poul Sander 2026-02-19 21:12 38
032aa1e1 Poul Sander 2026-02-19 18:55 39
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
032aa1e1 Poul Sander 2026-02-19 18:55 40
    QVariant data(const QModelIndex &index, int role) const override;
032aa1e1 Poul Sander 2026-02-19 18:55 41
6fcd6c90 Poul Sander 2026-02-19 21:12 42
    void thumbnailReady(int row, const QImage &image);
cec3b5da Poul Sander 2026-02-19 19:17 43
032aa1e1 Poul Sander 2026-02-19 18:55 44
private:
032aa1e1 Poul Sander 2026-02-19 18:55 45
    struct Item
032aa1e1 Poul Sander 2026-02-19 18:55 46
    {
80a9926d Poul Sander 2026-05-19 20:28 47
        QByteArray path;      // raw native OS bytes — safe for non-UTF-8 filenames
09130ab9 Poul Sander 2026-02-22 22:19 48
        QString displayName;
032aa1e1 Poul Sander 2026-02-19 18:55 49
        QPixmap thumbnail;
cec3b5da Poul Sander 2026-02-19 19:17 50
        bool loaded = false;
09130ab9 Poul Sander 2026-02-22 22:19 51
        bool isFolder = false;
032aa1e1 Poul Sander 2026-02-19 18:55 52
    };
032aa1e1 Poul Sander 2026-02-19 18:55 53
6fcd6c90 Poul Sander 2026-02-19 21:12 54
    void queueRow(int row);
6fcd6c90 Poul Sander 2026-02-19 21:12 55
80a9926d Poul Sander 2026-05-19 20:28 56
    using ThumbnailMap = QHash<QByteArray, QPixmap>;
459bad0f Poul Sander 2026-05-17 14:11 57
032aa1e1 Poul Sander 2026-02-19 18:55 58
    QVector<Item> m_items;
cec3b5da Poul Sander 2026-02-19 19:17 59
    QThreadPool m_threadPool;
cec3b5da Poul Sander 2026-02-19 19:17 60
    QPixmap m_placeholder;
6fcd6c90 Poul Sander 2026-02-19 21:12 61
6fcd6c90 Poul Sander 2026-02-19 21:12 62
    QSet<int> m_pendingRows;
6fcd6c90 Poul Sander 2026-02-19 21:12 63
    std::atomic_bool m_cancelFlag{false};
09130ab9 Poul Sander 2026-02-22 22:19 64
    QIcon m_folderIcon;
80a9926d Poul Sander 2026-05-19 20:28 65
    QByteArray m_currentDir;
459bad0f Poul Sander 2026-05-17 14:11 66
459bad0f Poul Sander 2026-05-17 14:11 67
    // Folder thumbnail cache (last N visited directories)
80a9926d Poul Sander 2026-05-19 20:28 68
    QHash<QByteArray, ThumbnailMap> m_folderThumbnailCache;
80a9926d Poul Sander 2026-05-19 20:28 69
    QList<QByteArray> m_cacheOrder;
459bad0f Poul Sander 2026-05-17 14:11 70
    int m_cacheMaxSize = 4;
ac476ca8 Poul Sander 2026-05-18 16:47 71
ac476ca8 Poul Sander 2026-05-18 16:47 72
    ThumbnailCache::Size m_thumbnailSize = ThumbnailCache::Size::Normal;
032aa1e1 Poul Sander 2026-02-19 18:55 73
};
1970-01-01 00:00 74