From 289a8147784f830f214859e00367486587d9a027 Mon Sep 17 00:00:00 2001 From: Konstantin Ritt Date: Tue, 9 Oct 2012 16:18:49 +0300 Subject: [PATCH] QCommonStyle: Reduce code duplication by re-using viewItemTextLayout() helper function. Also use QTextLayout(QString, QFont) c-tor which is a bit faster than using setText() + setFont() setters. Change-Id: I0d09ba43bad2296e932f49fcb9cfd28f42c1f95d Reviewed-by: Marc Mutz Reviewed-by: Jens Bache-Wiig --- src/widgets/styles/qcommonstyle.cpp | 62 ++++++++++++++----------------------- 1 file changed, 23 insertions(+), 39 deletions(-) diff --git a/src/widgets/styles/qcommonstyle.cpp b/src/widgets/styles/qcommonstyle.cpp index 85d46bb..5c34cae 100644 --- a/src/widgets/styles/qcommonstyle.cpp +++ b/src/widgets/styles/qcommonstyle.cpp @@ -712,6 +712,24 @@ static void drawArrow(const QStyle *style, const QStyleOptionToolButton *toolbut #ifndef QT_NO_ITEMVIEWS +static QSizeF viewItemTextLayout(QTextLayout &textLayout, int lineWidth) +{ + qreal height = 0; + qreal widthUsed = 0; + textLayout.beginLayout(); + while (true) { + QTextLine line = textLayout.createLine(); + if (!line.isValid()) + break; + line.setLineWidth(lineWidth); + line.setPosition(QPointF(0, height)); + height += line.height(); + widthUsed = qMax(widthUsed, line.naturalTextWidth()); + } + textLayout.endLayout(); + return QSizeF(widthUsed, height); +} + QSize QCommonStylePrivate::viewItemSize(const QStyleOptionViewItem *option, int role) const { const QWidget *widget = option->widget; @@ -725,10 +743,8 @@ QSize QCommonStylePrivate::viewItemSize(const QStyleOptionViewItem *option, int if (option->features & QStyleOptionViewItem::HasDisplay) { QTextOption textOption; textOption.setWrapMode(QTextOption::WordWrap); - QTextLayout textLayout; + QTextLayout textLayout(option->text, option->font); textLayout.setTextOption(textOption); - textLayout.setFont(option->font); - textLayout.setText(option->text); const bool wrapText = option->features & QStyleOptionViewItem::WrapText; const int textMargin = proxyStyle->pixelMetric(QStyle::PM_FocusFrameHMargin, option, widget) + 1; QRect bounds = option->rect; @@ -745,20 +761,9 @@ QSize QCommonStylePrivate::viewItemSize(const QStyleOptionViewItem *option, int break; } - qreal height = 0, widthUsed = 0; - textLayout.beginLayout(); - while (true) { - QTextLine line = textLayout.createLine(); - if (!line.isValid()) - break; - line.setLineWidth(bounds.width()); - line.setPosition(QPointF(0, height)); - height += line.height(); - widthUsed = qMax(widthUsed, line.naturalTextWidth()); - } - textLayout.endLayout(); - const QSize size(qCeil(widthUsed), qCeil(height)); - return QSize(size.width() + 2 * textMargin, size.height()); + const int lineWidth = bounds.width(); + const QSizeF size = viewItemTextLayout(textLayout, lineWidth); + return QSize(qCeil(size.width()) + 2 * textMargin, qCeil(size.height())); } break; case Qt::DecorationRole: @@ -773,25 +778,6 @@ QSize QCommonStylePrivate::viewItemSize(const QStyleOptionViewItem *option, int return QSize(0, 0); } -static QSizeF viewItemTextLayout(QTextLayout &textLayout, int lineWidth) -{ - qreal height = 0; - qreal widthUsed = 0; - textLayout.beginLayout(); - while (true) { - QTextLine line = textLayout.createLine(); - if (!line.isValid()) - break; - line.setLineWidth(lineWidth); - line.setPosition(QPointF(0, height)); - height += line.height(); - widthUsed = qMax(widthUsed, line.naturalTextWidth()); - } - textLayout.endLayout(); - return QSizeF(widthUsed, height); -} - - void QCommonStylePrivate::viewItemDrawText(QPainter *p, const QStyleOptionViewItem *option, const QRect &rect) const { const QWidget *widget = option->widget; @@ -803,10 +789,8 @@ void QCommonStylePrivate::viewItemDrawText(QPainter *p, const QStyleOptionViewIt textOption.setWrapMode(wrapText ? QTextOption::WordWrap : QTextOption::ManualWrap); textOption.setTextDirection(option->direction); textOption.setAlignment(QStyle::visualAlignment(option->direction, option->displayAlignment)); - QTextLayout textLayout; + QTextLayout textLayout(option->text, option->font); textLayout.setTextOption(textOption); - textLayout.setFont(option->font); - textLayout.setText(option->text); viewItemTextLayout(textLayout, textRect.width()); -- 2.7.4