diff options
author | Martin Jones <martin.jones@nokia.com> | 2009-12-22 04:15:20 (GMT) |
---|---|---|
committer | Martin Jones <martin.jones@nokia.com> | 2009-12-22 04:15:20 (GMT) |
commit | bc69d1abc4f9419aa47dac871bb1080260f1b736 (patch) | |
tree | e0a994bdb2c9ef8e7690b2ffd99ce51047d4a36b /src/declarative/graphicsitems/qmlgraphicstext.cpp | |
parent | f16ea3dcd03f3ffe47483e2f852d104e5c68d475 (diff) | |
download | Qt-bc69d1abc4f9419aa47dac871bb1080260f1b736.zip Qt-bc69d1abc4f9419aa47dac871bb1080260f1b736.tar.gz Qt-bc69d1abc4f9419aa47dac871bb1080260f1b736.tar.bz2 |
Implement a fast "styled" text format.
Diffstat (limited to 'src/declarative/graphicsitems/qmlgraphicstext.cpp')
-rw-r--r-- | src/declarative/graphicsitems/qmlgraphicstext.cpp | 57 |
1 files changed, 38 insertions, 19 deletions
diff --git a/src/declarative/graphicsitems/qmlgraphicstext.cpp b/src/declarative/graphicsitems/qmlgraphicstext.cpp index 459541e..ce86b8f 100644 --- a/src/declarative/graphicsitems/qmlgraphicstext.cpp +++ b/src/declarative/graphicsitems/qmlgraphicstext.cpp @@ -41,6 +41,7 @@ #include "qmlgraphicstext_p.h" #include "qmlgraphicstext_p_p.h" +#include <qmlstyledtext_p.h> #include <qfxperf_p_p.h> @@ -143,7 +144,7 @@ void QmlGraphicsText::setFont(const QFont &font) Q_D(QmlGraphicsText); d->font = font; - d->updateSize(); + d->updateLayout(); d->markImgDirty(); } @@ -166,7 +167,7 @@ void QmlGraphicsText::setText(const QString &n) } d->text = n; - d->updateSize(); + d->updateLayout(); d->markImgDirty(); emit textChanged(d->text); } @@ -336,7 +337,7 @@ void QmlGraphicsText::setWrap(bool w) d->wrap = w; - d->updateSize(); + d->updateLayout(); d->markImgDirty(); } @@ -387,12 +388,13 @@ void QmlGraphicsText::setTextFormat(TextFormat format) Q_D(QmlGraphicsText); if (format == d->format) return; + d->format = format; bool wasRich = d->richText; d->richText = format == RichText || (format == AutoText && Qt::mightBeRichText(d->text)); if (wasRich && !d->richText) { //### delete control? (and vice-versa below) - d->updateSize(); + d->updateLayout(); d->markImgDirty(); } else if (!wasRich && d->richText) { if (!d->doc) { @@ -400,10 +402,9 @@ void QmlGraphicsText::setTextFormat(TextFormat format) d->doc->setDocumentMargin(0); } d->doc->setHtml(d->text); - d->updateSize(); + d->updateLayout(); d->markImgDirty(); } - d->format = format; } /*! @@ -436,7 +437,7 @@ void QmlGraphicsText::setElideMode(QmlGraphicsText::TextElideMode mode) d->elideMode = mode; - d->updateSize(); + d->updateLayout(); d->markImgDirty(); } @@ -453,6 +454,34 @@ void QmlGraphicsText::geometryChanged(const QRectF &newGeometry, QmlGraphicsItem::geometryChanged(newGeometry, oldGeometry); } +void QmlGraphicsTextPrivate::updateLayout() +{ + Q_Q(QmlGraphicsText); + if (q->isComponentComplete()) { + //setup instance of QTextLayout for all cases other than richtext + if (!richText) { + layout.clearLayout(); + layout.setFont(font); + if (format != QmlGraphicsText::StyledText) { + QString tmp = text; + tmp.replace(QLatin1Char('\n'), QChar::LineSeparator); + singleline = !tmp.contains(QChar::LineSeparator); + if (singleline && elideMode != QmlGraphicsText::ElideNone && q->widthValid()) { + QFontMetrics fm(font); + tmp = fm.elidedText(tmp,(Qt::TextElideMode)elideMode,q->width()); // XXX still worth layout...? + } + layout.setText(tmp); + } else { + singleline = false; + QmlStyledText::parse(text, layout); + } + } + updateSize(); + } else { + dirty = true; + } +} + void QmlGraphicsTextPrivate::updateSize() { Q_Q(QmlGraphicsText); @@ -464,20 +493,10 @@ void QmlGraphicsTextPrivate::updateSize() } int dy = q->height(); - QString tmp; QSize size(0, 0); //setup instance of QTextLayout for all cases other than richtext - if (!richText) - { - tmp = text; - tmp.replace(QLatin1Char('\n'), QChar::LineSeparator); - singleline = !tmp.contains(QChar::LineSeparator); - if (singleline && elideMode != QmlGraphicsText::ElideNone && q->widthValid()) - tmp = fm.elidedText(tmp,(Qt::TextElideMode)elideMode,q->width()); // XXX still worth layout...? - layout.clearLayout(); - layout.setFont(font); - layout.setText(tmp); + if (!richText) { size = setupTextLayout(&layout); cachedLayoutSize = size; dy -= size.height(); @@ -769,7 +788,7 @@ void QmlGraphicsText::componentComplete() #endif QmlGraphicsItem::componentComplete(); if (d->dirty) { - d->updateSize(); + d->updateLayout(); d->dirty = false; } } |