#pragma once #include "thumbnailcache.h" #include #include #include #include #include #include #include #include #include #include class ThumbnailWorker; class ImageModel : public QAbstractListModel { Q_OBJECT public: explicit ImageModel(QObject *parent = nullptr); ~ImageModel(); // path is the raw native OS byte string (handles non-UTF-8 filenames) void setDirectory(const QByteArray &path); void setDirectory(const QString &path); // convenience: converts via QFile::encodeName QByteArray filePath(const QModelIndex &index) const; bool isFolder(const QModelIndex &index) const; QByteArray currentDirectory() const; void requestThumbnails(int firstRow, int lastRow); // Discard the cached thumbnail for a row and re-decode it from disk. void refreshThumbnail(const QModelIndex &index); void setCacheMaxSize(int n); void setThumbnailSize(ThumbnailCache::Size size); int rowCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role) const override; void thumbnailReady(int row, const QImage &image); private: struct Item { QByteArray path; // raw native OS bytes — safe for non-UTF-8 filenames QString displayName; QPixmap thumbnail; bool loaded = false; bool isFolder = false; }; void queueRow(int row); using ThumbnailMap = QHash; QVector m_items; QThreadPool m_threadPool; QPixmap m_placeholder; QSet m_pendingRows; std::atomic_bool m_cancelFlag{false}; QIcon m_folderIcon; QByteArray m_currentDir; // Folder thumbnail cache (last N visited directories) QHash m_folderThumbnailCache; QList m_cacheOrder; int m_cacheMaxSize = 4; ThumbnailCache::Size m_thumbnailSize = ThumbnailCache::Size::Normal; };