Word wrapping to next line.

This commit is contained in:
Christopher T. Johnson
2024-04-14 16:52:33 -04:00
parent 8babbe7160
commit eda370ecb4

View File

@@ -73,27 +73,51 @@ class Fragment:
def repaintEvent(self, painter: QPainter) -> int: def repaintEvent(self, painter: QPainter) -> int:
painter.save() painter.save()
painter.setFont(self._font) painter.setFont(self._font)
painter.setPen(self._color) top = (
rect = QRect()
rect.setLeft(self._position.x())
rect.setTop(
self._position.y() self._position.y()
+ painter.fontMetrics().descent() + painter.fontMetrics().descent()
- painter.fontMetrics().height() - painter.fontMetrics().height()
) )
rect.setWidth(painter.viewport().width() - self._position.x()) left = self._position.x()
rect.setHeight(2000) width = painter.viewport().width() - left
height = 2000
rect = QRect(left, top, width, height)
indent = self._indent * 30
flags = (
Qt.AlignmentFlag.AlignLeft
| Qt.AlignmentFlag.AlignBaseline
)
boundingNoWrap = painter.fontMetrics().boundingRect(
rect, flags|Qt.TextFlag.TextSingleLine, self._text
)
flags = ( flags = (
Qt.AlignmentFlag.AlignLeft Qt.AlignmentFlag.AlignLeft
| Qt.AlignmentFlag.AlignBaseline | Qt.AlignmentFlag.AlignBaseline
| Qt.TextFlag.TextWordWrap | Qt.TextFlag.TextWordWrap
) )
bounding = painter.boundingRect(rect, flags, self._text) bounding = painter.fontMetrics().boundingRect(
rect, flags|Qt.TextFlag.TextWordWrap, self._text
)
text = self._text
remainingText = ''
if boundingNoWrap.height() < bounding.height():
# #
# We need to determine if the text caused a word wrap. # This is not optimal, but it is only a few iterations
# If it has wrapped. We need to locate that exact break point
# #
size = bounding.size() lastSpace = 0
char = 0
pos = rect.x()
while pos < rect.right():
if text[char] == ' ':
lastSpace = char
pos += painter.fontMetrics().horizontalAdvance(
text[char]
)
char += 1
remainingText = text[lastSpace:]
text = text[:lastSpace]
size = boundingNoWrap.size()
painter.setPen(QColor("#f00")) painter.setPen(QColor("#f00"))
if self._audio.isValid(): if self._audio.isValid():
@@ -104,7 +128,22 @@ class Fragment:
end = bounding.bottomRight() end = bounding.bottomRight()
painter.drawLine(start, end) painter.drawLine(start, end)
painter.setPen(self._color) painter.setPen(self._color)
painter.drawText(rect, flags, self._text) painter.drawText(rect, flags, text)
if remainingText != '':
top += size.height()
rect = QRect(
indent, top,
painter.viewport().width() - indent, height
)
painter.drawText(rect, flags|Qt.TextFlag.TextWordWrap, remainingText)
size = size.grownBy(
QMargins(
0,0,0,
painter.fontMetrics().boundingRect(
rect, flags | Qt.TextFlag.TextWordWrap, remainingText
).height()
)
)
painter.restore() painter.restore()
size = size.grownBy(self._margin) size = size.grownBy(self._margin)
size = size.grownBy(self._border) size = size.grownBy(self._border)