from PySide6.QtWidgets import QGraphicsRectItem, QGraphicsSimpleTextItem from PySide6.QtGui import QFont, QFontMetricsF, QColor, QBrush BACKGROUND_COLOR = QColor("white") TEXT_SCALE_FACTOR = 0.4 # 40% of the width or height Z_INDEX = 10 class CurrentWordBox(QGraphicsRectItem): def __init__(self): super().__init__() self.word = "" self.text = QGraphicsSimpleTextItem("", self) self.text.setFlag(QGraphicsSimpleTextItem.ItemIgnoresTransformations, True) self.setBrush(QBrush(BACKGROUND_COLOR)) self.setZValue(Z_INDEX) self.width = 0 self.height = 0 def set_geometry(self, x: float, y: float, width: float, height: float): self.width = width self.height = height self.setRect(0, 0, width, height) self.setPos(x, y) self.update_label_font() def update_word(self, next_char: str): self.word += next_char self.text.setText(self.word) self.update_label_font() def clear(self): self.word = "" self.text.setText("") self.update_label_font() def update_label_font(self): min_dimension = min(self.width, self.height) font_size = min_dimension * TEXT_SCALE_FACTOR font = QFont() font.setPointSizeF(font_size) self.text.setFont(font) metrics = QFontMetricsF(font) text_rect = metrics.boundingRect(self.word) text_x = (self.width - text_rect.width()) / 2 text_y = (self.height - text_rect.height()) / 2 self.text.setPos(text_x, text_y)