Misc cleanups

This commit is contained in:
Christopher T. Johnson
2024-04-16 10:48:46 -04:00
parent 3739231e65
commit 814206148a

View File

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