from PySide6.QtWidgets import ( QApplication, QWidget, QVBoxLayout, QListWidget, QListWidgetItem, QLabel, QHBoxLayout ) from PySide6.QtGui import QPixmap, QIcon from PySide6.QtCore import Qt, QSize import sys def make_thumbnail(image_path: str, size: QSize) -> QPixmap: pixmap = QPixmap(image_path) if pixmap.isNull(): pixmap = QPixmap("media/empty_guitar_h.jpg") # pusta miniatura, gdy nie uda się wczytać # dopasuj tak, aby całkowicie wypełnić prostokąt (cover) scaled = pixmap.scaled( size, Qt.AspectRatioMode.KeepAspectRatioByExpanding, Qt.TransformationMode.SmoothTransformation ) # wytnij nadmiar, żeby miało dokładnie żądany rozmiar x = (scaled.width() - size.width()) // 2 y = (scaled.height() - size.height()) // 2 cropped = scaled.copy(x, y, size.width(), size.height()) return cropped class ThumbnailItemWidget(QWidget): def __init__(self, image_path: str, text: str = "", parent=None): super().__init__(parent) layout = QHBoxLayout(self) layout.setContentsMargins(6, 6, 6, 6) layout.setAlignment(Qt.AlignmentFlag.AlignCenter) # miniatura pixmap = make_thumbnail(image_path, QSize(180, 160)) self.icon_label = QLabel() self.icon_label.setPixmap(pixmap) # podpis self.text_label = QLabel(text) self.text_label.setStyleSheet("font-size: 12pt;") self.text_label.setAlignment(Qt.AlignmentFlag.AlignCenter) # ustawiamy pionowy layout dla ikony i tekstu vbox = QVBoxLayout() vbox.setContentsMargins(0, 0, 0, 0) vbox.setAlignment(Qt.AlignmentFlag.AlignCenter) vbox.addWidget(self.icon_label) vbox.addWidget(self.text_label) layout.addLayout(vbox) class ThumbnailListWidget(QWidget): def __init__(self): super().__init__() layout = QVBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) self.list_widget = QListWidget() # self.list_widget.setIconSize(QSize(100, 100)) self.list_widget.setSpacing(2) layout.addWidget(self.list_widget) self.list_widget.itemPressed.connect(self.on_item_pressed) def add_thumbnail(self, image_path: str, text: str): item = QListWidgetItem() item.setSizeHint(QSize(192, 192)) # rozmiar „wiersza” print(f"Adding thumbnail: {image_path} with text: {text}") widget = ThumbnailItemWidget(image_path, text) self.list_widget.addItem(item) self.list_widget.setItemWidget(item, widget) def on_item_pressed(self, item: QListWidgetItem): row = self.list_widget.row(item) print(f"Kliknięto miniaturę w wierszu: {row}")