283375 f4fe7bf754 impr: mininumSizeHint for elided label
- this prevents label growing and expanding the window width too much
2023-08-29 19:21:26 +08:00

56 lines
1.6 KiB
Python

from PySide6.QtCore import QSize, Qt
from PySide6.QtWidgets import QLabel
class ElidedLabel(QLabel):
"""
Adapted from https://wiki.qt.io/Elided_Label
"""
def __init__(self, parent=None):
super().__init__(parent)
self.__elideMode: Qt.TextElideMode = Qt.TextElideMode.ElideNone
self.__cachedElidedText = ""
self.__cachedText = ""
def elideMode(self):
return self.__elideMode
def setElideMode(self, mode):
self.__elideMode = mode
self.__cachedText = ""
self.update()
def resizeEvent(self, event):
super().resizeEvent(event)
self.__cachedText = ""
def minimumSizeHint(self) -> QSize:
size = super().sizeHint()
size.setWidth(100)
return size
def paintEvent(self, event) -> None:
if self.__elideMode == Qt.TextElideMode.ElideNone:
return super().paintEvent(event)
self.updateCachedTexts()
super().setText(self.__cachedElidedText)
super().paintEvent(event)
super().setText(self.__cachedText)
def updateCachedTexts(self):
text = self.text()
if self.__cachedText == text:
return
self.__cachedText = text
fontMetrics = self.fontMetrics()
self.__cachedElidedText = fontMetrics.elidedText(
self.text(), self.__elideMode, self.width(), Qt.TextFlag.TextShowMnemonic
)
# make sure to show at least the first character
if self.__cachedText:
firstChar = f"{self.__cachedText[0]}..."
self.setMinimumWidth(fontMetrics.horizontalAdvance(firstChar) + 1)