90 lines
2.9 KiB
Python
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)
|
|
|