import os
import sys

from PyQt6.QtCore import qVersion, Qt, QThreadPool, QSize, QRunnable
from PyQt6.QtGui import QStandardItemModel, QImage, QStandardItem
from PyQt6.QtWidgets import QApplication, QListView


PATH_TO_LARGE_FILE = 'C:/large_image.png'  # Pick something >1MB to really show the slowness


class GridView(QListView):
    def __init__(self):
        super().__init__()
        self.setViewMode(QListView.ViewMode.IconMode)
        self.setModel(GridModel(self))


class GridModel(QStandardItemModel):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.threadPool = QThreadPool()

    def data(self, index, role=Qt.ItemDataRole.UserRole):
        # Load image
        if role == Qt.ItemDataRole.DecorationRole:
            item = self.itemFromIndex(index)
            worker = ImageLoader(item)
            self.threadPool.start(worker)
            return None

        # Set size of icons
        elif role == Qt.ItemDataRole.SizeHintRole:
            return QSize(64, 89)
        return super(GridModel, self).data(index, role)


class ImageLoader(QRunnable):
    def __init__(self, item):
        self.item = item
        super().__init__()

    def run(self):
        QImage(self.item.path)


if __name__ == '__main__':
    print('Python {}.{}.{}'.format(sys.version_info[0], sys.version_info[1],
                                   sys.version_info[2]))
    print("PyQt" ,  qVersion())
    app = QApplication(sys.argv)
    path = sys.argv[1] if len(sys.argv) > 1 else PATH_TO_LARGE_FILE
    if not os.path.exists(path):
        print(path, 'non existent')
        sys.exit(1)

    widget = GridView()
    for i in range(1000):
        item = QStandardItem('test {}'.format(i))
        item.path = path
        widget.model().appendRow(item)
    widget.show()
    widget.setWindowTitle(qVersion())
    app.exec()
