import string
import random
import os
import sys

try:
    from PySide6.QtCore import QAbstractListModel, QLibraryInfo, QModelIndex, QTimer, qVersion, Qt, SIGNAL
    from PySide6.QtWidgets import QApplication,QWidget, QStyledItemDelegate, QListView
except ImportError:
    from PySide2.QtCore import QAbstractListModel, QLibraryInfo, QModelIndex, QTimer, qVersion, Qt, SIGNAL
    from PySide2.QtWidgets import QApplication,QWidget, QStyledItemDelegate, QListView


opt_workaround = False


def print_mem():
    os.system(f'pmap {os.getpid()} | tail -n 1')


class Model(QAbstractListModel):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        chars = string.ascii_uppercase + string.ascii_lowercase + string.digits
        self.dataset = [
            ''.join(random.choices(chars, k=50))
            for _ in range(1000)
        ]

    def rowCount(self, parent=QModelIndex()):
        if not parent.isValid():
            return len(self.dataset)
        return 0

    def data(self, index, role=Qt.DisplayRole):
        if not index.isValid() or index.column() != 0:
            return None

        if role == Qt.DisplayRole:
            return self.dataset[index.row()]


class Delegate(QStyledItemDelegate):

    def paint(self, painter, options, index):
        text = (index.model().data(index, role=Qt.DisplayRole)
                if opt_workaround else index.data(role=Qt.DisplayRole))
        painter.drawText(options.rect.bottomLeft(), text)


class View(QListView):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setResizeMode(QListView.Adjust)
        self.setWrapping(True)
        self.setViewMode(QListView.IconMode)
        self.setUniformItemSizes(False)


if __name__ == '__main__':
    opt_workaround = '-w' in sys.argv

    print('Python {}.{}'.format(sys.version_info[0], sys.version_info[1]))
    print(QLibraryInfo.build(), f"\nworkaround={opt_workaround}")

    app = QApplication([])

    timer = None
    if '-t' in sys.argv:
        timer = QTimer()
        timer.timeout.connect(print_mem)
        timer.start(1000)

    view = View()
    view.setWindowTitle(qVersion())
    delegate = Delegate(parent=view)
    view.setItemDelegate(delegate)

    model = Model(parent=view)
    view.setModel(model)

    app.connect(SIGNAL("aboutToQuit()"), view.destroy)
    view.show()
    app.exec_()
