From 0dd83979cf08aca7d309e555af6e577f5b420bdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20T=C5=AFma?= Date: Sat, 24 Nov 2018 17:44:24 +0100 Subject: [PATCH] Improved text bounding rect estimation --- src/textpointitem.cpp | 15 +++++++++------ src/textpointitem.h | 3 ++- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/textpointitem.cpp b/src/textpointitem.cpp index c0856be..9ef79ed 100644 --- a/src/textpointitem.cpp +++ b/src/textpointitem.cpp @@ -6,10 +6,10 @@ #define FLAGS (Qt::AlignCenter | Qt::TextWordWrap | Qt::TextDontClip) static QRectF exactBoundingRect(const QString &str, const QFont &font, - int maxTextWidth) + const Text::Properties &prop) { QFontMetrics fm(font); - int limit = font.pixelSize() * maxTextWidth; + int limit = font.pixelSize() * prop.maxWidth; // Italic fonts overflow the computed bounding rect, so reduce it // a little bit. if (font.italic()) @@ -25,10 +25,13 @@ static QRectF exactBoundingRect(const QString &str, const QFont &font, } static QRectF fuzzyBoundingRect(const QString &str, const QFont &font, - int maxTextWidth) + const Text::Properties &prop) { - int limit = font.pixelSize() * maxTextWidth; - qreal cw = font.pixelSize() * 0.6; + int limit = font.pixelSize() * prop.maxWidth; + qreal acw = (prop.transform == Text::Uppercase) ? 0.66 : 0.55; + qreal cw = font.pixelSize() * acw; + if (font.bold()) + acw *= 1.1; qreal lh = font.pixelSize() * 1.25; int width = 0, lines = 0; @@ -69,7 +72,7 @@ static QRectF fuzzyBoundingRect(const QString &str, const QFont &font, QRectF TextPointItem::computeTextRect(BoundingRectFunction brf) const { QRectF iconRect = _icon.isNull() ? QRectF() : _icon.rect(); - QRectF textRect = brf(text(), _font, _properties.maxWidth); + QRectF textRect = brf(text(), _font, _properties); switch (_properties.anchor) { case Text::Center: diff --git a/src/textpointitem.h b/src/textpointitem.h index a0f33f6..37205c2 100644 --- a/src/textpointitem.h +++ b/src/textpointitem.h @@ -20,7 +20,8 @@ public: void setPen(const QPen &pen) {_pen = pen;} private: - typedef QRectF (*BoundingRectFunction)(const QString &, const QFont &, int); + typedef QRectF (*BoundingRectFunction)(const QString &, const QFont &, + const Text::Properties &); QRectF computeTextRect(BoundingRectFunction brf) const; QPointF _pos;