from PyQt6.QtCore import QRectF
from PyQt6.QtGui import QPainter
from PyQt6.QtWidgets import QLabel


class ProportionalImageLabel(QLabel):
    def __init__(self):
        super().__init__()

    def setPixmap(self, pixmap):
        self._pixmap = pixmap
        super().setPixmap(self._pixmap)

    def paintEvent(self, event):
        if self._pixmap.isNull():
            super().paintEvent(event)
            return

        painter = QPainter(self)
        targetRect = event.rect()

        # Calculate the aspect ratio of the pixmap
        aspectRatio = self._pixmap.width() / self._pixmap.height()

        # Calculate the size of the pixmap within the target rectangle while maintaining the aspect ratio
        if aspectRatio > targetRect.width() / targetRect.height():
            scaledWidth = targetRect.width()
            scaledHeight = targetRect.width() / aspectRatio
        else:
            scaledHeight = targetRect.height()
            scaledWidth = targetRect.height() * aspectRatio

        # Calculate the position to center the pixmap within the target rectangle
        x = targetRect.x() + (targetRect.width() - scaledWidth) / 2
        y = targetRect.y() + (targetRect.height() - scaledHeight) / 2

        sourceRect = QRectF(0.0, 0.0, self._pixmap.width(), self._pixmap.height())
        targetRect = QRectF(x, y, scaledWidth, scaledHeight)

        painter.drawPixmap(targetRect, self._pixmap, sourceRect)