diff --git a/lib/definition.py b/lib/definition.py index a642883..2ef474f 100644 --- a/lib/definition.py +++ b/lib/definition.py @@ -7,6 +7,7 @@ from PyQt6.QtWidgets import QWidget class Fragment: """A fragment of text to be displayed""" + _indentAmount = 35 def __init__( self, @@ -50,7 +51,7 @@ class Fragment: return self.__repr__() def size(self, width: int) -> QSize: - return self.repaintEvent(width) + return self.paintEvent(width) def height(self, width: int) -> int: return self.size(width).height() @@ -62,13 +63,13 @@ class Fragment: return f"({self._position.x()}, {self._position.y()}): {self._text}" @overload - def repaintEvent(self, widthSrc:int) -> QSize: + def paintEvent(self, widthSrc:int) -> QSize: ... @overload - def repaintEvent(self, widthSrc: QPainter) -> int: + def paintEvent(self, widthSrc: QPainter) -> int: ... - def repaintEvent(self, widthSrc) -> int|QSize: + def paintEvent(self, widthSrc) -> int|QSize: if isinstance(widthSrc, QPainter): viewportWidth = widthSrc.viewport().width() painter = widthSrc @@ -85,7 +86,7 @@ class Fragment: width = viewportWidth - left height = 2000 rect = QRect(left, top, width, height) - indent = self._indent * 30 + indent = self._indent * self._indentAmount flags = ( Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignBaseline @@ -93,11 +94,6 @@ class Fragment: boundingNoWrap = fm.boundingRect( rect, flags|Qt.TextFlag.TextSingleLine, self._text ) - flags = ( - Qt.AlignmentFlag.AlignLeft - | Qt.AlignmentFlag.AlignBaseline - | Qt.TextFlag.TextWordWrap - ) bounding = fm.boundingRect( rect, flags|Qt.TextFlag.TextWordWrap, self._text ) @@ -117,25 +113,34 @@ class Fragment: text[char] ) char += 1 - remainingText = text[lastSpace:] + if lastSpace > 0: + remainingText = text[lastSpace+1:] text = text[:lastSpace] size = boundingNoWrap.size() + boundingNoWrap = fm.boundingRect( + rect, flags|Qt.TextFlag.TextSingleLine, text + ) + rect.setSize(boundingNoWrap.size()) + + if remainingText != '': top += size.height() remainingRect = QRect( indent, top, viewportWidth - indent, height ) + boundingRemaingRect = fm.boundingRect( + remainingRect, flags | Qt.TextFlag.TextWordWrap, remainingText + ) + size = size.grownBy( QMargins( - 0,0,0, - fm.boundingRect( - remainingRect, flags | Qt.TextFlag.TextWordWrap, remainingText - ).height() + 0,0,0, boundingRemaingRect.height() ) ) + remainingRect.setSize(boundingRemaingRect.size()) size = size.grownBy(self._margin) size = size.grownBy(self._border) size = size.grownBy(self._padding) @@ -151,9 +156,18 @@ class Fragment: start = bounding.bottomLeft() end = bounding.bottomRight() painter.drawLine(start, end) + painter.setPen(self._color) + if self._background.isValid(): + brush = painter.brush() + brush.setColor(self._background) + brush.setStyle(Qt.BrushStyle.SolidPattern) + painter.setBrush(brush) + painter.fillRect(rect,brush) painter.drawText(rect, flags, text) if remainingText: + if self._background.isValid(): + painter.fillRect(remainingRect, brush) painter.drawText(remainingRect, flags|Qt.TextFlag.TextWordWrap, remainingText) painter.restore() return size.height() @@ -348,6 +362,9 @@ class Fragment: def indent(self) -> int: return self._indent + def pixelIndent(self) -> int: + return self._indent * self._indentAmount + class Line: parseText = None def __init__(self) -> None: @@ -364,17 +381,16 @@ class Line: ) @classmethod def setParseText(cls, call) -> None: - print(call) cls.parseText = call return - def repaintEvent(self, painter: QPainter) -> int: + def paintEvent(self, painter: QPainter) -> int: # # we do not have an event field because we are not a true widget # lineSpacing = 0 for frag in self._fragments: - ls = frag.repaintEvent(painter) + ls = frag.paintEvent(painter) if ls > lineSpacing: lineSpacing = ls return lineSpacing @@ -428,7 +444,7 @@ class Line: self._leading = leading x = 0 for frag in self._fragments: - left = frag.indent() * 30 + left = frag.pixelIndent() if x < left: x = left # @@ -483,7 +499,7 @@ class Definition(QWidget): def setWord(self, word: Any) -> None: self._word = word - lines = word.get_def() + lines:list[Line] = word.get_def() assert lines is not None self._lines = lines self._buttons: list[Fragment] = [] @@ -558,6 +574,6 @@ class Definition(QWidget): transform = QTransform() transform.translate(0, base) painter.setTransform(transform) - base += line.repaintEvent(painter) + base += line.paintEvent(painter) painter.restore() return