Render markdown task lists (checkboxes instead of bullets) in QTextEdit

Checkboxes are right-aligned with any bullets that are in the same
QTextList so that there is enough space to make them larger than bullets.
But hopefully mixing bullets and checkboxes will be a rarely-used feature.

Change-Id: I28e274d1f7883aa093df29eb4988e99641e87a71
Reviewed-by: Gatis Paeglis <gatis.paeglis@qt.io>
Shawn Rutledge 2019-02-06 17:10:42 +01:00
parent deae75ae09
commit 75256d62d2
2 changed files with 32 additions and 6 deletions

View File

@ -50,6 +50,12 @@ The list will automatically be renumbered if you add or remove items. *Try
adding new sections to the above list or removing existing item to see the
numbers change.*
Task lists can be used to track progress on projects:
- [ ] This is not yet done
- This is just a bullet point
- [x] This is done
## Images
Inline images are treated like ordinary ranges of characters in the text

View File

@ -1436,6 +1436,21 @@ void QTextDocumentLayoutPrivate::drawListItem(const QPointF &offset, QPainter *p
QBrush brush = context.palette.brush(QPalette::Text);
bool marker = bl.blockFormat().marker() != QTextBlockFormat::NoMarker;
if (marker) {
int adj = fontMetrics.lineSpacing() / 6;
r.adjust(-adj, 0, -adj, 0);
if (bl.blockFormat().marker() == QTextBlockFormat::Checked) {
// ### Qt6: render with QStyle / PE_IndicatorCheckBox. We don't currently
// have access to that here, because it would be a widget dependency.
painter->setPen(QPen(painter->pen().color(), 2));
painter->drawLine(r.topLeft(), r.bottomRight());
painter->drawLine(r.topRight(), r.bottomLeft());
painter->setPen(QPen(painter->pen().color(), 0));
}
painter->drawRect(r.adjusted(-adj, -adj, adj, adj));
}
switch (style) {
case QTextListFormat::ListDecimal:
case QTextListFormat::ListLowerAlpha:
@ -1456,16 +1471,21 @@ void QTextDocumentLayoutPrivate::drawListItem(const QPointF &offset, QPainter *p
break;
}
case QTextListFormat::ListSquare:
painter->fillRect(r, brush);
if (!marker)
painter->fillRect(r, brush);
break;
case QTextListFormat::ListCircle:
painter->setPen(QPen(brush, 0));
painter->drawEllipse(r.translated(0.5, 0.5)); // pixel align for sharper rendering
if (!marker) {
painter->setPen(QPen(brush, 0));
painter->drawEllipse(r.translated(0.5, 0.5)); // pixel align for sharper rendering
}
break;
case QTextListFormat::ListDisc:
painter->setBrush(brush);
painter->setPen(Qt::NoPen);
painter->drawEllipse(r);
if (!marker) {
painter->setBrush(brush);
painter->setPen(Qt::NoPen);
painter->drawEllipse(r);
}
break;
case QTextListFormat::ListStyleUndefined:
break;