1
0
Fork 0
mirror of synced 2024-06-02 18:54:41 +12:00

ProgressLabel: Use a centering procedure based on events

Previously the `setGeometry()` method was called explicitly. In this
procedure the self-centering widget installs an `eventFilter` on its
parent to react to `Resize` events of the parent.

This breaks centering on the list widgets a bit, pending an investigation
This commit is contained in:
loathingKernel 2023-04-04 13:34:33 +03:00
parent e9b9f91df8
commit 849c98bee5
No known key found for this signature in database
GPG key ID: CE0C72D0B53821FD

View file

@ -1,7 +1,7 @@
from typing import Optional, Tuple, List
from PyQt5.QtCore import Qt, QRect, QEvent
from PyQt5.QtGui import QPainter, QPixmap, QResizeEvent, QFontMetrics, QImage, QBrush, QColor
from PyQt5.QtCore import Qt, QEvent, QObject
from PyQt5.QtGui import QPainter, QPixmap, QFontMetrics, QImage, QBrush, QColor, QShowEvent
from PyQt5.QtWidgets import QLabel
from rare.widgets.image_widget import ImageWidget
@ -10,15 +10,35 @@ from rare.widgets.image_widget import ImageWidget
class ProgressLabel(QLabel):
def __init__(self, parent=None):
super(ProgressLabel, self).__init__(parent=parent)
if self.parent() is not None:
self.parent().installEventFilter(self)
self.setObjectName(type(self).__name__)
self.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
self.setFrameStyle(QLabel.StyledPanel)
def setGeometry(self, a0: QRect) -> None:
def __center_on_parent(self):
fm = QFontMetrics(self.font())
rect = fm.boundingRect(f" {self.text()} ")
rect.moveCenter(a0.center())
super(ProgressLabel, self).setGeometry(rect)
rect.moveCenter(self.parent().contentsRect().center())
self.setGeometry(rect)
def event(self, e: QEvent) -> bool:
if e.type() == QEvent.ParentAboutToChange:
if self.parent() is not None:
self.parent().removeEventFilter(self)
if e.type() == QEvent.ParentChange:
if self.parent() is not None:
self.parent().installEventFilter(self)
return super().event(e)
def showEvent(self, a0: QShowEvent) -> None:
self.__center_on_parent()
def eventFilter(self, a0: QObject, a1: QEvent) -> bool:
if a0 is self.parent() and a1.type() == QEvent.Resize:
self.__center_on_parent()
return a0.event(a1)
return False
@staticmethod
def calculateColors(image: QImage) -> Tuple[QColor, QColor]:
@ -57,16 +77,6 @@ class LibraryWidget(ImageWidget):
# lk: keep percentage to not over-generate the image
self._progress: int = -1
def event(self, e: QEvent) -> bool:
if e.type() == QEvent.LayoutRequest:
self.progress_label.setGeometry(self.rect())
return super(LibraryWidget, self).event(e)
def resizeEvent(self, a0: QResizeEvent) -> None:
if self.progress_label.isVisible():
self.progress_label.setGeometry(self.rect())
super(LibraryWidget, self).resizeEvent(a0)
def progressPixmap(self, color: QPixmap, gray: QPixmap, progress: int) -> QPixmap:
"""
Paints the color image over the gray images based on progress percentage
@ -103,7 +113,6 @@ class LibraryWidget(ImageWidget):
bg_color, fg_color = self.progress_label.calculateColors(color_pm.toImage())
self.progress_label.setStyleSheetColors(bg_color, fg_color, fg_color)
self.progress_label.setVisible(True)
self.progress_label.update()
self.updateProgress(0)
def updateProgress(self, progress: int):