Files
MayoStainHelper/ui/widgets/thumbnail_list_widget.py

90 lines
2.9 KiB
Python

from PySide6.QtWidgets import (
QApplication, QWidget, QVBoxLayout, QListWidget, QListWidgetItem,
QLabel, QHBoxLayout
)
from PySide6.QtGui import QPixmap, QIcon
from PySide6.QtCore import Qt, QSize, Signal
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):
selectedThumbnail = Signal(int) # sygnał z ID wybranego elementu
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, id: int):
item = QListWidgetItem()
item.setData(Qt.ItemDataRole.UserRole, id)
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)
id = item.data(Qt.ItemDataRole.UserRole)
print(f"Kliknięto miniaturę w wierszu: {row}, obiekt ID: {id}")
self.selectedThumbnail.emit(id)