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);
459bad0f Poul Sander 2026-05-17 14:11 34
    void setCacheMaxSize(int n);
ac476ca8 Poul Sander 2026-05-18 16:47 35
    void setThumbnailSize(ThumbnailCache::Size size);
6fcd6c90 Poul Sander 2026-02-19 21:12 36
032aa1e1 Poul Sander 2026-02-19 18:55 37
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
032aa1e1 Poul Sander 2026-02-19 18:55 38
    QVariant data(const QModelIndex &index, int role) const override;
032aa1e1 Poul Sander 2026-02-19 18:55 39
6fcd6c90 Poul Sander 2026-02-19 21:12 40
    void thumbnailReady(int row, const QImage &image);
cec3b5da Poul Sander 2026-02-19 19:17 41
032aa1e1 Poul Sander 2026-02-19 18:55 42
private:
032aa1e1 Poul Sander 2026-02-19 18:55 43
    struct Item
032aa1e1 Poul Sander 2026-02-19 18:55 44
    {
80a9926d Poul Sander 2026-05-19 20:28 45
        QByteArray path;      // raw native OS bytes — safe for non-UTF-8 filenames
09130ab9 Poul Sander 2026-02-22 22:19 46
        QString displayName;
032aa1e1 Poul Sander 2026-02-19 18:55 47
        QPixmap thumbnail;
cec3b5da Poul Sander 2026-02-19 19:17 48
        bool loaded = false;
09130ab9 Poul Sander 2026-02-22 22:19 49
        bool isFolder = false;
032aa1e1 Poul Sander 2026-02-19 18:55 50
    };
032aa1e1 Poul Sander 2026-02-19 18:55 51
6fcd6c90 Poul Sander 2026-02-19 21:12 52
    void queueRow(int row);
6fcd6c90 Poul Sander 2026-02-19 21:12 53
80a9926d Poul Sander 2026-05-19 20:28 54
    using ThumbnailMap = QHash<QByteArray, QPixmap>;
459bad0f Poul Sander 2026-05-17 14:11 55
032aa1e1 Poul Sander 2026-02-19 18:55 56
    QVector<Item> m_items;
cec3b5da Poul Sander 2026-02-19 19:17 57
    QThreadPool m_threadPool;
cec3b5da Poul Sander 2026-02-19 19:17 58
    QPixmap m_placeholder;
6fcd6c90 Poul Sander 2026-02-19 21:12 59
6fcd6c90 Poul Sander 2026-02-19 21:12 60
    QSet<int> m_pendingRows;
6fcd6c90 Poul Sander 2026-02-19 21:12 61
    std::atomic_bool m_cancelFlag{false};
09130ab9 Poul Sander 2026-02-22 22:19 62
    QIcon m_folderIcon;
80a9926d Poul Sander 2026-05-19 20:28 63
    QByteArray m_currentDir;
459bad0f Poul Sander 2026-05-17 14:11 64
459bad0f Poul Sander 2026-05-17 14:11 65
    // Folder thumbnail cache (last N visited directories)
80a9926d Poul Sander 2026-05-19 20:28 66
    QHash<QByteArray, ThumbnailMap> m_folderThumbnailCache;
80a9926d Poul Sander 2026-05-19 20:28 67
    QList<QByteArray> m_cacheOrder;
459bad0f Poul Sander 2026-05-17 14:11 68
    int m_cacheMaxSize = 4;
ac476ca8 Poul Sander 2026-05-18 16:47 69
ac476ca8 Poul Sander 2026-05-18 16:47 70
    ThumbnailCache::Size m_thumbnailSize = ThumbnailCache::Size::Normal;
032aa1e1 Poul Sander 2026-02-19 18:55 71
};
1970-01-01 00:00 72