diff options
Diffstat (limited to 'src/qtquick1/graphicsitems/qdeclarativetext.cpp')
-rw-r--r-- | src/qtquick1/graphicsitems/qdeclarativetext.cpp | 1647 |
1 files changed, 0 insertions, 1647 deletions
diff --git a/src/qtquick1/graphicsitems/qdeclarativetext.cpp b/src/qtquick1/graphicsitems/qdeclarativetext.cpp deleted file mode 100644 index 490c10aac9..0000000000 --- a/src/qtquick1/graphicsitems/qdeclarativetext.cpp +++ /dev/null @@ -1,1647 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/ -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "QtQuick1/private/qdeclarativetext_p.h" -#include "QtQuick1/private/qdeclarativetext_p_p.h" -#include "QtQuick1/private/qdeclarativestyledtext_p.h" -#include <QtDeclarative/qdeclarativeinfo.h> -#include "QtQuick1/private/qdeclarativepixmapcache_p.h" - -#include <QSet> -#include <QTextLayout> -#include <QTextLine> -#include <QTextDocument> -#include <QGraphicsSceneMouseEvent> -#include <QPainter> -#include <QAbstractTextDocumentLayout> -#include <QtGui/QInputPanel> -#include <qmath.h> -#include <limits.h> - -QT_BEGIN_NAMESPACE - - - -extern Q_GUI_EXPORT bool qt_applefontsmoothing_enabled; - -class QTextDocumentWithImageResources_1 : public QTextDocument { - Q_OBJECT - -public: - QTextDocumentWithImageResources_1(QDeclarative1Text *parent); - virtual ~QTextDocumentWithImageResources_1(); - - void setText(const QString &); - int resourcesLoading() const { return outstanding; } - -protected: - QVariant loadResource(int type, const QUrl &name); - -private slots: - void requestFinished(); - -private: - QHash<QUrl, QDeclarative1Pixmap *> m_resources; - - int outstanding; - static QSet<QUrl> errors; -}; - - -QTextDocumentWithImageResources_1::QTextDocumentWithImageResources_1(QDeclarative1Text *parent) -: QTextDocument(parent), outstanding(0) -{ -} - -QTextDocumentWithImageResources_1::~QTextDocumentWithImageResources_1() -{ - if (!m_resources.isEmpty()) - qDeleteAll(m_resources); -} - -QVariant QTextDocumentWithImageResources_1::loadResource(int type, const QUrl &name) -{ - QDeclarativeContext *context = qmlContext(parent()); - QUrl url = context->resolvedUrl(name); - - if (type == QTextDocument::ImageResource) { - QHash<QUrl, QDeclarative1Pixmap *>::Iterator iter = m_resources.find(url); - - if (iter == m_resources.end()) { - QDeclarative1Pixmap *p = new QDeclarative1Pixmap(context->engine(), url); - iter = m_resources.insert(name, p); - - if (p->isLoading()) { - p->connectFinished(this, SLOT(requestFinished())); - outstanding++; - } - } - - QDeclarative1Pixmap *p = *iter; - if (p->isReady()) { - return p->pixmap(); - } else if (p->isError()) { - if (!errors.contains(url)) { - errors.insert(url); - qmlInfo(parent()) << p->error(); - } - } - } - - return QTextDocument::loadResource(type,url); // The *resolved* URL -} - -void QTextDocumentWithImageResources_1::requestFinished() -{ - outstanding--; - if (outstanding == 0) { - QDeclarative1Text *textItem = static_cast<QDeclarative1Text*>(parent()); - QString text = textItem->text(); -#ifndef QT_NO_TEXTHTMLPARSER - setHtml(text); -#else - setPlainText(text); -#endif - QDeclarative1TextPrivate *d = QDeclarative1TextPrivate::get(textItem); - d->updateLayout(); - } -} - -void QTextDocumentWithImageResources_1::setText(const QString &text) -{ - if (!m_resources.isEmpty()) { - qDeleteAll(m_resources); - m_resources.clear(); - outstanding = 0; - } - -#ifndef QT_NO_TEXTHTMLPARSER - setHtml(text); -#else - setPlainText(text); -#endif -} - -QSet<QUrl> QTextDocumentWithImageResources_1::errors; - -QDeclarative1TextPrivate::~QDeclarative1TextPrivate() -{ -} - -DEFINE_BOOL_CONFIG_OPTION(enableImageCache, QML_ENABLE_TEXT_IMAGE_CACHE); - -QString QDeclarative1TextPrivate::elideChar = QString(0x2026); - -QDeclarative1TextPrivate::QDeclarative1TextPrivate() -: color((QRgb)0), style(QDeclarative1Text::Normal), hAlign(QDeclarative1Text::AlignLeft), - vAlign(QDeclarative1Text::AlignTop), elideMode(QDeclarative1Text::ElideNone), - format(QDeclarative1Text::AutoText), wrapMode(QDeclarative1Text::NoWrap), lineHeight(1), - lineHeightMode(QDeclarative1Text::ProportionalHeight), lineCount(1), truncated(false), maximumLineCount(INT_MAX), - maximumLineCountValid(false), imageCacheDirty(true), updateOnComponentComplete(true), richText(false), singleline(false), - cacheAllTextAsImage(true), internalWidthUpdate(false), requireImplicitWidth(false), hAlignImplicit(true), - rightToLeftText(false), layoutTextElided(false), naturalWidth(0), doc(0) -{ - cacheAllTextAsImage = enableImageCache(); - QGraphicsItemPrivate::acceptedMouseButtons = Qt::LeftButton; - QGraphicsItemPrivate::flags = QGraphicsItemPrivate::flags & ~QGraphicsItem::ItemHasNoContents; -} - -qreal QDeclarative1TextPrivate::implicitWidth() const -{ - if (!requireImplicitWidth) { - // We don't calculate implicitWidth unless it is required. - // We need to force a size update now to ensure implicitWidth is calculated - QDeclarative1TextPrivate *me = const_cast<QDeclarative1TextPrivate*>(this); - me->requireImplicitWidth = true; - me->updateSize(); - } - return mImplicitWidth; -} - -void QDeclarative1TextPrivate::updateLayout() -{ - Q_Q(QDeclarative1Text); - if (!q->isComponentComplete()) { - updateOnComponentComplete = true; - return; - } - - layoutTextElided = false; - // Setup instance of QTextLayout for all cases other than richtext - if (!richText) { - layout.clearLayout(); - layout.setFont(font); - if (format != QDeclarative1Text::StyledText) { - QString tmp = text; - tmp.replace(QLatin1Char('\n'), QChar::LineSeparator); - singleline = !tmp.contains(QChar::LineSeparator); - if (singleline && !maximumLineCountValid && elideMode != QDeclarative1Text::ElideNone && q->widthValid()) { - QFontMetrics fm(font); - tmp = fm.elidedText(tmp,(Qt::TextElideMode)elideMode,q->width()); - if (tmp != text) { - layoutTextElided = true; - if (!truncated) { - truncated = true; - emit q->truncatedChanged(); - } - } - } - layout.setText(tmp); - } else { - singleline = false; - QDeclarative1StyledText::parse(text, layout); - } - } - - updateSize(); -} - -void QDeclarative1TextPrivate::updateSize() -{ - Q_Q(QDeclarative1Text); - - if (!q->isComponentComplete()) { - updateOnComponentComplete = true; - return; - } - - if (!requireImplicitWidth) { - emit q->implicitWidthChanged(); - // if the implicitWidth is used, then updateSize() has already been called (recursively) - if (requireImplicitWidth) - return; - } - - invalidateImageCache(); - - QFontMetrics fm(font); - if (text.isEmpty()) { - q->setImplicitWidth(0); - q->setImplicitHeight(fm.height()); - paintedSize = QSize(0, fm.height()); - emit q->paintedSizeChanged(); - q->update(); - return; - } - - int dy = q->height(); - QSize size(0, 0); - - //setup instance of QTextLayout for all cases other than richtext - if (!richText) { - QRect textRect = setupTextLayout(); - if (layedOutTextRect.size() != textRect.size()) - q->prepareGeometryChange(); - layedOutTextRect = textRect; - size = textRect.size(); - dy -= size.height(); - } else { - singleline = false; // richtext can't elide or be optimized for single-line case - ensureDoc(); - doc->setDefaultFont(font); - - QDeclarative1Text::HAlignment horizontalAlignment = q->effectiveHAlign(); - if (rightToLeftText) { - if (horizontalAlignment == QDeclarative1Text::AlignLeft) - horizontalAlignment = QDeclarative1Text::AlignRight; - else if (horizontalAlignment == QDeclarative1Text::AlignRight) - horizontalAlignment = QDeclarative1Text::AlignLeft; - } - QTextOption option; - option.setAlignment((Qt::Alignment)int(horizontalAlignment | vAlign)); - option.setWrapMode(QTextOption::WrapMode(wrapMode)); - doc->setDefaultTextOption(option); - if (requireImplicitWidth && q->widthValid()) { - doc->setTextWidth(-1); - naturalWidth = doc->idealWidth(); - } - if (wrapMode != QDeclarative1Text::NoWrap && q->widthValid()) - doc->setTextWidth(q->width()); - else - doc->setTextWidth(doc->idealWidth()); // ### Text does not align if width is not set (QTextDoc bug) - dy -= (int)doc->size().height(); - QSize dsize = doc->size().toSize(); - if (dsize != layedOutTextRect.size()) { - q->prepareGeometryChange(); - layedOutTextRect = QRect(QPoint(0,0), dsize); - } - size = QSize(int(doc->idealWidth()),dsize.height()); - } - int yoff = 0; - - if (q->heightValid()) { - if (vAlign == QDeclarative1Text::AlignBottom) - yoff = dy; - else if (vAlign == QDeclarative1Text::AlignVCenter) - yoff = dy/2; - } - q->setBaselineOffset(fm.ascent() + yoff); - - //### need to comfirm cost of always setting these for richText - internalWidthUpdate = true; - if (!q->widthValid()) - q->setImplicitWidth(size.width()); - else if (requireImplicitWidth) - q->setImplicitWidth(naturalWidth); - internalWidthUpdate = false; - q->setImplicitHeight(size.height()); - if (paintedSize != size) { - paintedSize = size; - emit q->paintedSizeChanged(); - } - q->update(); -} - -/*! - Lays out the QDeclarative1TextPrivate::layout QTextLayout in the constraints of the QDeclarative1Text. - - Returns the size of the final text. This can be used to position the text vertically (the text is - already absolutely positioned horizontally). -*/ -QRect QDeclarative1TextPrivate::setupTextLayout() -{ - // ### text layout handling should be profiled and optimized as needed - // what about QStackTextEngine engine(tmp, d->font.font()); QTextLayout textLayout(&engine); - Q_Q(QDeclarative1Text); - layout.setCacheEnabled(true); - - qreal lineWidth = 0; - int visibleCount = 0; - - //set manual width - if (q->widthValid()) - lineWidth = q->width(); - - QTextOption textOption = layout.textOption(); - textOption.setAlignment(Qt::Alignment(q->effectiveHAlign())); - textOption.setWrapMode(QTextOption::WrapMode(wrapMode)); - layout.setTextOption(textOption); - - bool elideText = false; - bool truncate = false; - - QFontMetrics fm(layout.font()); - elidePos = QPointF(); - - if (requireImplicitWidth && q->widthValid()) { - // requires an extra layout - QString elidedText; - if (layoutTextElided) { - // We have provided elided text to the layout, but we must calculate unelided width. - elidedText = layout.text(); - layout.setText(text); - } - layout.beginLayout(); - forever { - QTextLine line = layout.createLine(); - if (!line.isValid()) - break; - } - layout.endLayout(); - QRectF br; - for (int i = 0; i < layout.lineCount(); ++i) { - QTextLine line = layout.lineAt(i); - br = br.united(line.naturalTextRect()); - } - naturalWidth = br.width(); - if (layoutTextElided) - layout.setText(elidedText); - } - - if (maximumLineCountValid) { - layout.beginLayout(); - if (!lineWidth) - lineWidth = INT_MAX; - int linesLeft = maximumLineCount; - int visibleTextLength = 0; - while (linesLeft > 0) { - QTextLine line = layout.createLine(); - if (!line.isValid()) - break; - - visibleCount++; - if (lineWidth) - line.setLineWidth(lineWidth); - visibleTextLength += line.textLength(); - - if (--linesLeft == 0) { - if (visibleTextLength < text.length()) { - truncate = true; - if (elideMode==QDeclarative1Text::ElideRight && q->widthValid()) { - qreal elideWidth = fm.width(elideChar); - // Need to correct for alignment - line.setLineWidth(lineWidth-elideWidth); - if (layout.text().mid(line.textStart(), line.textLength()).isRightToLeft()) { - line.setPosition(QPointF(line.position().x() + elideWidth, line.position().y())); - elidePos.setX(line.naturalTextRect().left() - elideWidth); - } else { - elidePos.setX(line.naturalTextRect().right()); - } - elideText = true; - } - } - } - } - layout.endLayout(); - - //Update truncated - if (truncated != truncate) { - truncated = truncate; - emit q->truncatedChanged(); - } - } else { - layout.beginLayout(); - forever { - QTextLine line = layout.createLine(); - if (!line.isValid()) - break; - visibleCount++; - if (lineWidth) - line.setLineWidth(lineWidth); - } - layout.endLayout(); - } - - qreal height = 0; - QRectF br; - for (int i = 0; i < layout.lineCount(); ++i) { - QTextLine line = layout.lineAt(i); - // set line spacing - line.setPosition(QPointF(line.position().x(), height)); - if (elideText && i == layout.lineCount()-1) { - elidePos.setY(height + fm.ascent()); - br = br.united(QRectF(elidePos, QSizeF(fm.width(elideChar), fm.ascent()))); - } - br = br.united(line.naturalTextRect()); - height += (lineHeightMode == QDeclarative1Text::FixedHeight) ? lineHeight : line.height() * lineHeight; - } - br.setHeight(height); - - if (!q->widthValid()) - naturalWidth = br.width(); - - //Update the number of visible lines - if (lineCount != visibleCount) { - lineCount = visibleCount; - emit q->lineCountChanged(); - } - - return QRect(qRound(br.x()), qRound(br.y()), qCeil(br.width()), qCeil(br.height())); -} - -/*! - Returns a painted version of the QDeclarative1TextPrivate::layout QTextLayout. - If \a drawStyle is true, the style color overrides all colors in the document. -*/ -QPixmap QDeclarative1TextPrivate::textLayoutImage(bool drawStyle) -{ - //do layout - QSize size = layedOutTextRect.size(); - //paint text - QPixmap img(size); - if (!size.isEmpty()) { - img.fill(Qt::transparent); -#ifdef Q_WS_MAC - bool oldSmooth = qt_applefontsmoothing_enabled; - qt_applefontsmoothing_enabled = false; -#endif - QPainter p(&img); -#ifdef Q_WS_MAC - qt_applefontsmoothing_enabled = oldSmooth; -#endif - drawTextLayout(&p, QPointF(-layedOutTextRect.x(),0), drawStyle); - } - return img; -} - -/*! - Paints the QDeclarative1TextPrivate::layout QTextLayout into \a painter at \a pos. If - \a drawStyle is true, the style color overrides all colors in the document. -*/ -void QDeclarative1TextPrivate::drawTextLayout(QPainter *painter, const QPointF &pos, bool drawStyle) -{ - if (drawStyle) - painter->setPen(styleColor); - else - painter->setPen(color); - painter->setFont(font); - layout.draw(painter, pos); - if (!elidePos.isNull()) - painter->drawText(pos + elidePos, elideChar); -} - -/*! - Returns a painted version of the QDeclarative1TextPrivate::doc QTextDocument. - If \a drawStyle is true, the style color overrides all colors in the document. -*/ -QPixmap QDeclarative1TextPrivate::textDocumentImage(bool drawStyle) -{ - QSize size = doc->size().toSize(); - - //paint text - QPixmap img(size); - img.fill(Qt::transparent); -#ifdef Q_WS_MAC - bool oldSmooth = qt_applefontsmoothing_enabled; - qt_applefontsmoothing_enabled = false; -#endif - QPainter p(&img); -#ifdef Q_WS_MAC - qt_applefontsmoothing_enabled = oldSmooth; -#endif - - QAbstractTextDocumentLayout::PaintContext context; - - QTextOption oldOption(doc->defaultTextOption()); - if (drawStyle) { - context.palette.setColor(QPalette::Text, styleColor); - QTextOption colorOption(doc->defaultTextOption()); - colorOption.setFlags(QTextOption::SuppressColors); - doc->setDefaultTextOption(colorOption); - } else { - context.palette.setColor(QPalette::Text, color); - } - doc->documentLayout()->draw(&p, context); - if (drawStyle) - doc->setDefaultTextOption(oldOption); - return img; -} - -/*! - Mark the image cache as dirty. -*/ -void QDeclarative1TextPrivate::invalidateImageCache() -{ - Q_Q(QDeclarative1Text); - - if(cacheAllTextAsImage || style != QDeclarative1Text::Normal){//If actually using the image cache - if (imageCacheDirty) - return; - - imageCacheDirty = true; - imageCache = QPixmap(); - } - if (q->isComponentComplete()) - q->update(); -} - -/*! - Tests if the image cache is dirty, and repaints it if it is. -*/ -void QDeclarative1TextPrivate::checkImageCache() -{ - if (!imageCacheDirty) - return; - - if (text.isEmpty()) { - - imageCache = QPixmap(); - - } else { - - QPixmap textImage; - QPixmap styledImage; - - if (richText) { - textImage = textDocumentImage(false); - if (style != QDeclarative1Text::Normal) - styledImage = textDocumentImage(true); //### should use styleColor - } else { - textImage = textLayoutImage(false); - if (style != QDeclarative1Text::Normal) - styledImage = textLayoutImage(true); //### should use styleColor - } - - switch (style) { - case QDeclarative1Text::Outline: - imageCache = drawOutline(textImage, styledImage); - break; - case QDeclarative1Text::Sunken: - imageCache = drawOutline(textImage, styledImage, -1); - break; - case QDeclarative1Text::Raised: - imageCache = drawOutline(textImage, styledImage, 1); - break; - default: - imageCache = textImage; - break; - } - - } - - imageCacheDirty = false; -} - -/*! - Ensures the QDeclarative1TextPrivate::doc variable is set to a valid text document -*/ -void QDeclarative1TextPrivate::ensureDoc() -{ - if (!doc) { - Q_Q(QDeclarative1Text); - doc = new QTextDocumentWithImageResources_1(q); - doc->setDocumentMargin(0); - } -} - -/*! - Draw \a styleSource as an outline around \a source and return the new image. -*/ -QPixmap QDeclarative1TextPrivate::drawOutline(const QPixmap &source, const QPixmap &styleSource) -{ - QPixmap img = QPixmap(styleSource.width() + 2, styleSource.height() + 2); - img.fill(Qt::transparent); - - QPainter ppm(&img); - - QPoint pos(0, 0); - pos += QPoint(-1, 0); - ppm.drawPixmap(pos, styleSource); - pos += QPoint(2, 0); - ppm.drawPixmap(pos, styleSource); - pos += QPoint(-1, -1); - ppm.drawPixmap(pos, styleSource); - pos += QPoint(0, 2); - ppm.drawPixmap(pos, styleSource); - - pos += QPoint(0, -1); - ppm.drawPixmap(pos, source); - ppm.end(); - - return img; -} - -/*! - Draw \a styleSource below \a source at \a yOffset and return the new image. -*/ -QPixmap QDeclarative1TextPrivate::drawOutline(const QPixmap &source, const QPixmap &styleSource, int yOffset) -{ - QPixmap img = QPixmap(styleSource.width() + 2, styleSource.height() + 2); - img.fill(Qt::transparent); - - QPainter ppm(&img); - - ppm.drawPixmap(QPoint(0, yOffset), styleSource); - ppm.drawPixmap(0, 0, source); - - ppm.end(); - - return img; -} - -/*! - \qmlclass Text QDeclarative1Text - \inqmlmodule QtQuick 1 - \ingroup qml-basic-visual-elements - \since QtQuick 1.0 - \brief The Text item allows you to add formatted text to a scene. - \inherits Item - - Text items can display both plain and rich text. For example, red text with - a specific font and size can be defined like this: - - \qml - Text { - text: "Hello World!" - font.family: "Helvetica" - font.pointSize: 24 - color: "red" - } - \endqml - - Rich text is defined using HTML-style markup: - - \qml - Text { - text: "<b>Hello</b> <i>World!</i>" - } - \endqml - - \image declarative-text.png - - If height and width are not explicitly set, Text will attempt to determine how - much room is needed and set it accordingly. Unless \l wrapMode is set, it will always - prefer width to height (all text will be placed on a single line). - - The \l elide property can alternatively be used to fit a single line of - plain text to a set width. - - Note that the \l{Supported HTML Subset} is limited. Also, if the text contains - HTML img tags that load remote images, the text is reloaded. - - Text provides read-only text. For editable text, see \l TextEdit. - - \sa {declarative/text/fonts}{Fonts example} -*/ -QDeclarative1Text::QDeclarative1Text(QDeclarativeItem *parent) - : QDeclarative1ImplicitSizeItem(*(new QDeclarative1TextPrivate), parent) -{ -} - -QDeclarative1Text::~QDeclarative1Text() -{ -} - -/*! - \qmlproperty bool QtQuick1::Text::clip - This property holds whether the text is clipped. - - Note that if the text does not fit in the bounding rectangle it will be abruptly chopped. - - If you want to display potentially long text in a limited space, you probably want to use \c elide instead. -*/ - -/*! - \qmlproperty bool QtQuick1::Text::smooth - - This property holds whether the text is smoothly scaled or transformed. - - Smooth filtering gives better visual quality, but is slower. If - the item is displayed at its natural size, this property has no visual or - performance effect. - - \note Generally scaling artifacts are only visible if the item is stationary on - the screen. A common pattern when animating an item is to disable smooth - filtering at the beginning of the animation and reenable it at the conclusion. -*/ - -/*! - \qmlsignal QtQuick1::Text::onLinkActivated(string link) - - This handler is called when the user clicks on a link embedded in the text. - The link must be in rich text or HTML format and the - \a link string provides access to the particular link. - - \snippet doc/src/snippets/qtquick1/text/onLinkActivated.qml 0 - - The example code will display the text - "The main website is at \l{http://qt.nokia.com}{Nokia Qt DF}." - - Clicking on the highlighted link will output - \tt{http://qt.nokia.com link activated} to the console. -*/ - -/*! - \qmlproperty string QtQuick1::Text::font.family - - Sets the family name of the font. - - The family name is case insensitive and may optionally include a foundry name, e.g. "Helvetica [Cronyx]". - If the family is available from more than one foundry and the foundry isn't specified, an arbitrary foundry is chosen. - If the family isn't available a family will be set using the font matching algorithm. -*/ - -/*! - \qmlproperty bool QtQuick1::Text::font.bold - - Sets whether the font weight is bold. -*/ - -/*! - \qmlproperty enumeration QtQuick1::Text::font.weight - - Sets the font's weight. - - The weight can be one of: - \list - \o Font.Light - \o Font.Normal - the default - \o Font.DemiBold - \o Font.Bold - \o Font.Black - \endlist - - \qml - Text { text: "Hello"; font.weight: Font.DemiBold } - \endqml -*/ - -/*! - \qmlproperty bool QtQuick1::Text::font.italic - - Sets whether the font has an italic style. -*/ - -/*! - \qmlproperty bool QtQuick1::Text::font.underline - - Sets whether the text is underlined. -*/ - -/*! - \qmlproperty bool QtQuick1::Text::font.strikeout - - Sets whether the font has a strikeout style. -*/ - -/*! - \qmlproperty real QtQuick1::Text::font.pointSize - - Sets the font size in points. The point size must be greater than zero. -*/ - -/*! - \qmlproperty int QtQuick1::Text::font.pixelSize - - Sets the font size in pixels. - - Using this function makes the font device dependent. - Use \c pointSize to set the size of the font in a device independent manner. -*/ - -/*! - \qmlproperty real QtQuick1::Text::font.letterSpacing - - Sets the letter spacing for the font. - - Letter spacing changes the default spacing between individual letters in the font. - A positive value increases the letter spacing by the corresponding pixels; a negative value decreases the spacing. -*/ - -/*! - \qmlproperty real QtQuick1::Text::font.wordSpacing - - Sets the word spacing for the font. - - Word spacing changes the default spacing between individual words. - A positive value increases the word spacing by a corresponding amount of pixels, - while a negative value decreases the inter-word spacing accordingly. -*/ - -/*! - \qmlproperty enumeration QtQuick1::Text::font.capitalization - - Sets the capitalization for the text. - - \list - \o Font.MixedCase - This is the normal text rendering option where no capitalization change is applied. - \o Font.AllUppercase - This alters the text to be rendered in all uppercase type. - \o Font.AllLowercase - This alters the text to be rendered in all lowercase type. - \o Font.SmallCaps - This alters the text to be rendered in small-caps type. - \o Font.Capitalize - This alters the text to be rendered with the first character of each word as an uppercase character. - \endlist - - \qml - Text { text: "Hello"; font.capitalization: Font.AllLowercase } - \endqml -*/ -QFont QDeclarative1Text::font() const -{ - Q_D(const QDeclarative1Text); - return d->sourceFont; -} - -void QDeclarative1Text::setFont(const QFont &font) -{ - Q_D(QDeclarative1Text); - if (d->sourceFont == font) - return; - - d->sourceFont = font; - QFont oldFont = d->font; - d->font = font; - if (d->font.pointSizeF() != -1) { - // 0.5pt resolution - qreal size = qRound(d->font.pointSizeF()*2.0); - d->font.setPointSizeF(size/2.0); - } - - if (oldFont != d->font) - d->updateLayout(); - - emit fontChanged(d->sourceFont); -} - -/*! - \qmlproperty string QtQuick1::Text::text - - The text to display. Text supports both plain and rich text strings. - - The item will try to automatically determine whether the text should - be treated as rich text. This determination is made using Qt::mightBeRichText(). -*/ -QString QDeclarative1Text::text() const -{ - Q_D(const QDeclarative1Text); - return d->text; -} - -void QDeclarative1Text::setText(const QString &n) -{ - Q_D(QDeclarative1Text); - if (d->text == n) - return; - - d->richText = d->format == RichText || (d->format == AutoText && Qt::mightBeRichText(n)); - d->text = n; - if (isComponentComplete()) { - if (d->richText) { - d->ensureDoc(); - d->doc->setText(n); - d->rightToLeftText = d->doc->toPlainText().isRightToLeft(); - } else { - d->rightToLeftText = d->text.isRightToLeft(); - } - d->determineHorizontalAlignment(); - } - d->updateLayout(); - emit textChanged(d->text); -} - - -/*! - \qmlproperty color QtQuick1::Text::color - - The text color. - - An example of green text defined using hexadecimal notation: - \qml - Text { - color: "#00FF00" - text: "green text" - } - \endqml - - An example of steel blue text defined using an SVG color name: - \qml - Text { - color: "steelblue" - text: "blue text" - } - \endqml -*/ -QColor QDeclarative1Text::color() const -{ - Q_D(const QDeclarative1Text); - return d->color; -} - -void QDeclarative1Text::setColor(const QColor &color) -{ - Q_D(QDeclarative1Text); - if (d->color == color) - return; - - d->color = color; - d->invalidateImageCache(); - emit colorChanged(d->color); -} - -/*! - \qmlproperty enumeration QtQuick1::Text::style - - Set an additional text style. - - Supported text styles are: - \list - \o Text.Normal - the default - \o Text.Outline - \o Text.Raised - \o Text.Sunken - \endlist - - \qml - Row { - Text { font.pointSize: 24; text: "Normal" } - Text { font.pointSize: 24; text: "Raised"; style: Text.Raised; styleColor: "#AAAAAA" } - Text { font.pointSize: 24; text: "Outline";style: Text.Outline; styleColor: "red" } - Text { font.pointSize: 24; text: "Sunken"; style: Text.Sunken; styleColor: "#AAAAAA" } - } - \endqml - - \image declarative-textstyle.png -*/ -QDeclarative1Text::TextStyle QDeclarative1Text::style() const -{ - Q_D(const QDeclarative1Text); - return d->style; -} - -void QDeclarative1Text::setStyle(QDeclarative1Text::TextStyle style) -{ - Q_D(QDeclarative1Text); - if (d->style == style) - return; - - // changing to/from Normal requires the boundingRect() to change - if (isComponentComplete() && (d->style == Normal || style == Normal)) - prepareGeometryChange(); - d->style = style; - d->invalidateImageCache(); - emit styleChanged(d->style); -} - -/*! - \qmlproperty color QtQuick1::Text::styleColor - - Defines the secondary color used by text styles. - - \c styleColor is used as the outline color for outlined text, and as the - shadow color for raised or sunken text. If no style has been set, it is not - used at all. - - \qml - Text { font.pointSize: 18; text: "hello"; style: Text.Raised; styleColor: "gray" } - \endqml - - \sa style - */ -QColor QDeclarative1Text::styleColor() const -{ - Q_D(const QDeclarative1Text); - return d->styleColor; -} - -void QDeclarative1Text::setStyleColor(const QColor &color) -{ - Q_D(QDeclarative1Text); - if (d->styleColor == color) - return; - - d->styleColor = color; - d->invalidateImageCache(); - emit styleColorChanged(d->styleColor); -} - - -/*! - \qmlproperty enumeration QtQuick1::Text::horizontalAlignment - \qmlproperty enumeration QtQuick1::Text::verticalAlignment - \qmlproperty enumeration QtQuick1::Text::effectiveHorizontalAlignment - - Sets the horizontal and vertical alignment of the text within the Text items - width and height. By default, the text is vertically aligned to the top. Horizontal - alignment follows the natural alignment of the text, for example text that is read - from left to right will be aligned to the left. - - The valid values for \c horizontalAlignment are \c Text.AlignLeft, \c Text.AlignRight, \c Text.AlignHCenter and - \c Text.AlignJustify. The valid values for \c verticalAlignment are \c Text.AlignTop, \c Text.AlignBottom - and \c Text.AlignVCenter. - - Note that for a single line of text, the size of the text is the area of the text. In this common case, - all alignments are equivalent. If you want the text to be, say, centered in its parent, then you will - need to either modify the Item::anchors, or set horizontalAlignment to Text.AlignHCenter and bind the width to - that of the parent. - - When using the attached property LayoutMirroring::enabled to mirror application - layouts, the horizontal alignment of text will also be mirrored. However, the property - \c horizontalAlignment will remain unchanged. To query the effective horizontal alignment - of Text, use the read-only property \c effectiveHorizontalAlignment. -*/ -QDeclarative1Text::HAlignment QDeclarative1Text::hAlign() const -{ - Q_D(const QDeclarative1Text); - return d->hAlign; -} - -void QDeclarative1Text::setHAlign(HAlignment align) -{ - Q_D(QDeclarative1Text); - bool forceAlign = d->hAlignImplicit && d->effectiveLayoutMirror; - d->hAlignImplicit = false; - if (d->setHAlign(align, forceAlign) && isComponentComplete()) - d->updateLayout(); -} - -void QDeclarative1Text::resetHAlign() -{ - Q_D(QDeclarative1Text); - d->hAlignImplicit = true; - if (d->determineHorizontalAlignment() && isComponentComplete()) - d->updateLayout(); -} - -QDeclarative1Text::HAlignment QDeclarative1Text::effectiveHAlign() const -{ - Q_D(const QDeclarative1Text); - QDeclarative1Text::HAlignment effectiveAlignment = d->hAlign; - if (!d->hAlignImplicit && d->effectiveLayoutMirror) { - switch (d->hAlign) { - case QDeclarative1Text::AlignLeft: - effectiveAlignment = QDeclarative1Text::AlignRight; - break; - case QDeclarative1Text::AlignRight: - effectiveAlignment = QDeclarative1Text::AlignLeft; - break; - default: - break; - } - } - return effectiveAlignment; -} - -bool QDeclarative1TextPrivate::setHAlign(QDeclarative1Text::HAlignment alignment, bool forceAlign) -{ - Q_Q(QDeclarative1Text); - if (hAlign != alignment || forceAlign) { - QDeclarative1Text::HAlignment oldEffectiveHAlign = q->effectiveHAlign(); - hAlign = alignment; - - emit q->horizontalAlignmentChanged(hAlign); - if (oldEffectiveHAlign != q->effectiveHAlign()) - emit q->effectiveHorizontalAlignmentChanged(); - return true; - } - return false; -} - -bool QDeclarative1TextPrivate::determineHorizontalAlignment() -{ - Q_Q(QDeclarative1Text); - if (hAlignImplicit && q->isComponentComplete()) { - bool alignToRight = text.isEmpty() ? qApp->inputPanel()->inputDirection() == Qt::RightToLeft : rightToLeftText; - return setHAlign(alignToRight ? QDeclarative1Text::AlignRight : QDeclarative1Text::AlignLeft); - } - return false; -} - -void QDeclarative1TextPrivate::mirrorChange() -{ - Q_Q(QDeclarative1Text); - if (q->isComponentComplete()) { - if (!hAlignImplicit && (hAlign == QDeclarative1Text::AlignRight || hAlign == QDeclarative1Text::AlignLeft)) { - updateLayout(); - emit q->effectiveHorizontalAlignmentChanged(); - } - } -} - -QTextDocument *QDeclarative1TextPrivate::textDocument() -{ - return doc; -} - -QDeclarative1Text::VAlignment QDeclarative1Text::vAlign() const -{ - Q_D(const QDeclarative1Text); - return d->vAlign; -} - -void QDeclarative1Text::setVAlign(VAlignment align) -{ - Q_D(QDeclarative1Text); - if (d->vAlign == align) - return; - - if (isComponentComplete()) - prepareGeometryChange(); - d->vAlign = align; - emit verticalAlignmentChanged(align); -} - -/*! - \qmlproperty enumeration QtQuick1::Text::wrapMode - - Set this property to wrap the text to the Text item's width. The text will only - wrap if an explicit width has been set. wrapMode can be one of: - - \list - \o Text.NoWrap (default) - no wrapping will be performed. If the text contains insufficient newlines, then \l paintedWidth will exceed a set width. - \o Text.WordWrap - wrapping is done on word boundaries only. If a word is too long, \l paintedWidth will exceed a set width. - \o Text.WrapAnywhere - wrapping is done at any point on a line, even if it occurs in the middle of a word. - \o Text.Wrap - if possible, wrapping occurs at a word boundary; otherwise it will occur at the appropriate point on the line, even in the middle of a word. - \endlist -*/ -QDeclarative1Text::WrapMode QDeclarative1Text::wrapMode() const -{ - Q_D(const QDeclarative1Text); - return d->wrapMode; -} - -void QDeclarative1Text::setWrapMode(WrapMode mode) -{ - Q_D(QDeclarative1Text); - if (mode == d->wrapMode) - return; - - d->wrapMode = mode; - d->updateLayout(); - - emit wrapModeChanged(); -} - -/*! - \qmlproperty int QtQuick1::Text::lineCount - \since Quick 1.1 - - Returns the number of lines visible in the text item. - - This property is not supported for rich text. - - \sa maximumLineCount -*/ -int QDeclarative1Text::lineCount() const -{ - Q_D(const QDeclarative1Text); - return d->lineCount; -} - -/*! - \qmlproperty bool QtQuick1::Text::truncated - \since Quick 1.1 - - Returns true if the text has been truncated due to \l maximumLineCount - or \l elide. - - This property is not supported for rich text. - - \sa maximumLineCount, elide -*/ -bool QDeclarative1Text::truncated() const -{ - Q_D(const QDeclarative1Text); - return d->truncated; -} - -/*! - \qmlproperty int QtQuick1::Text::maximumLineCount - \since Quick 1.1 - - Set this property to limit the number of lines that the text item will show. - If elide is set to Text.ElideRight, the text will be elided appropriately. - By default, this is the value of the largest possible integer. - - This property is not supported for rich text. - - \sa lineCount, elide -*/ -int QDeclarative1Text::maximumLineCount() const -{ - Q_D(const QDeclarative1Text); - return d->maximumLineCount; -} - -void QDeclarative1Text::setMaximumLineCount(int lines) -{ - Q_D(QDeclarative1Text); - - d->maximumLineCountValid = lines==INT_MAX ? false : true; - if (d->maximumLineCount != lines) { - d->maximumLineCount = lines; - d->updateLayout(); - emit maximumLineCountChanged(); - } -} - -void QDeclarative1Text::resetMaximumLineCount() -{ - Q_D(QDeclarative1Text); - setMaximumLineCount(INT_MAX); - d->elidePos = QPointF(); - if (d->truncated != false) { - d->truncated = false; - emit truncatedChanged(); - } -} - -/*! - \qmlproperty enumeration QtQuick1::Text::textFormat - - The way the text property should be displayed. - - Supported text formats are: - - \list - \o Text.AutoText (default) - \o Text.PlainText - \o Text.RichText - \o Text.StyledText - \endlist - - If the text format is \c Text.AutoText the text element - will automatically determine whether the text should be treated as - rich text. This determination is made using Qt::mightBeRichText(). - - Text.StyledText is an optimized format supporting some basic text - styling markup, in the style of html 3.2: - - \code - <font size="4" color="#ff0000">font size and color</font> - <b>bold</b> - <i>italic</i> - <br> - > < & - \endcode - - \c Text.StyledText parser is strict, requiring tags to be correctly nested. - - \table - \row - \o - \qml -Column { - Text { - font.pointSize: 24 - text: "<b>Hello</b> <i>World!</i>" - } - Text { - font.pointSize: 24 - textFormat: Text.RichText - text: "<b>Hello</b> <i>World!</i>" - } - Text { - font.pointSize: 24 - textFormat: Text.PlainText - text: "<b>Hello</b> <i>World!</i>" - } -} - \endqml - \o \image declarative-textformat.png - \endtable -*/ -QDeclarative1Text::TextFormat QDeclarative1Text::textFormat() const -{ - Q_D(const QDeclarative1Text); - return d->format; -} - -void QDeclarative1Text::setTextFormat(TextFormat format) -{ - Q_D(QDeclarative1Text); - 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 && isComponentComplete()) { - d->ensureDoc(); - d->doc->setText(d->text); - } - - d->updateLayout(); - - emit textFormatChanged(d->format); -} - -/*! - \qmlproperty enumeration QtQuick1::Text::elide - - Set this property to elide parts of the text fit to the Text item's width. - The text will only elide if an explicit width has been set. - - This property cannot be used with rich text. - - Eliding can be: - \list - \o Text.ElideNone - the default - \o Text.ElideLeft - \o Text.ElideMiddle - \o Text.ElideRight - \endlist - - If this property is set to Text.ElideRight, it can be used with multiline - text. The text will only elide if maximumLineCount has been set. - - If the text is a multi-length string, and the mode is not \c Text.ElideNone, - the first string that fits will be used, otherwise the last will be elided. - - Multi-length strings are ordered from longest to shortest, separated by the - Unicode "String Terminator" character \c U009C (write this in QML with \c{"\u009C"} or \c{"\x9C"}). -*/ -QDeclarative1Text::TextElideMode QDeclarative1Text::elideMode() const -{ - Q_D(const QDeclarative1Text); - return d->elideMode; -} - -void QDeclarative1Text::setElideMode(QDeclarative1Text::TextElideMode mode) -{ - Q_D(QDeclarative1Text); - if (mode == d->elideMode) - return; - - d->elideMode = mode; - d->updateLayout(); - - emit elideModeChanged(d->elideMode); -} - -/*! \internal */ -QRectF QDeclarative1Text::boundingRect() const -{ - Q_D(const QDeclarative1Text); - - QRect rect = d->layedOutTextRect; - if (d->style != Normal) - rect.adjust(-1, 0, 1, 2); - - // Could include font max left/right bearings to either side of rectangle. - - int h = height(); - switch (d->vAlign) { - case AlignTop: - break; - case AlignBottom: - rect.moveTop(h - rect.height()); - break; - case AlignVCenter: - rect.moveTop((h - rect.height()) / 2); - break; - } - - return QRectF(rect); -} - -/*! \internal */ -void QDeclarative1Text::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) -{ - Q_D(QDeclarative1Text); - if ((!d->internalWidthUpdate && newGeometry.width() != oldGeometry.width()) - && (d->wrapMode != QDeclarative1Text::NoWrap - || d->elideMode != QDeclarative1Text::ElideNone - || d->hAlign != QDeclarative1Text::AlignLeft)) { - if ((d->singleline || d->maximumLineCountValid) && d->elideMode != QDeclarative1Text::ElideNone && widthValid()) { - // We need to re-elide - d->updateLayout(); - } else { - // We just need to re-layout - d->updateSize(); - } - } - - QDeclarativeItem::geometryChanged(newGeometry, oldGeometry); -} - -/*! - \qmlproperty real QtQuick1::Text::paintedWidth - - Returns the width of the text, including width past the width - which is covered due to insufficient wrapping if WrapMode is set. -*/ -qreal QDeclarative1Text::paintedWidth() const -{ - Q_D(const QDeclarative1Text); - return d->paintedSize.width(); -} - -/*! - \qmlproperty real QtQuick1::Text::paintedHeight - - Returns the height of the text, including height past the height - which is covered due to there being more text than fits in the set height. -*/ -qreal QDeclarative1Text::paintedHeight() const -{ - Q_D(const QDeclarative1Text); - return d->paintedSize.height(); -} - -/*! - \qmlproperty real QtQuick1::Text::lineHeight - \since Quick 1.1 - - Sets the line height for the text. - The value can be in pixels or a multiplier depending on lineHeightMode. - - The default value is a multiplier of 1.0. - The line height must be a positive value. -*/ -qreal QDeclarative1Text::lineHeight() const -{ - Q_D(const QDeclarative1Text); - return d->lineHeight; -} - -void QDeclarative1Text::setLineHeight(qreal lineHeight) -{ - Q_D(QDeclarative1Text); - - if ((d->lineHeight == lineHeight) || (lineHeight < 0.0)) - return; - - d->lineHeight = lineHeight; - d->updateLayout(); - emit lineHeightChanged(lineHeight); -} - -/*! - \qmlproperty enumeration QtQuick1::Text::lineHeightMode - - This property determines how the line height is specified. - The possible values are: - - \list - \o Text.ProportionalHeight (default) - this sets the spacing proportional to the - line (as a multiplier). For example, set to 2 for double spacing. - \o Text.FixedHeight - this sets the line height to a fixed line height (in pixels). - \endlist -*/ -QDeclarative1Text::LineHeightMode QDeclarative1Text::lineHeightMode() const -{ - Q_D(const QDeclarative1Text); - return d->lineHeightMode; -} - -void QDeclarative1Text::setLineHeightMode(LineHeightMode mode) -{ - Q_D(QDeclarative1Text); - if (mode == d->lineHeightMode) - return; - - d->lineHeightMode = mode; - d->updateLayout(); - - emit lineHeightModeChanged(mode); -} - -/*! - Returns the number of resources (images) that are being loaded asynchronously. -*/ -int QDeclarative1Text::resourcesLoading() const -{ - Q_D(const QDeclarative1Text); - return d->doc ? d->doc->resourcesLoading() : 0; -} - -/*! \internal */ -void QDeclarative1Text::paint(QPainter *p, const QStyleOptionGraphicsItem *, QWidget *) -{ - Q_D(QDeclarative1Text); - - if (d->cacheAllTextAsImage || d->style != Normal) { - d->checkImageCache(); - if (d->imageCache.isNull()) - return; - - bool oldAA = p->testRenderHint(QPainter::Antialiasing); - bool oldSmooth = p->testRenderHint(QPainter::SmoothPixmapTransform); - if (d->smooth) - p->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform, d->smooth); - - QRect br = boundingRect().toRect(); - - bool needClip = clip() && (d->imageCache.width() > width() || - d->imageCache.height() > height()); - - if (needClip) - p->drawPixmap(0, 0, width(), height(), d->imageCache, -br.x(), -br.y(), width(), height()); - else - p->drawPixmap(br.x(), br.y(), d->imageCache); - - if (d->smooth) { - p->setRenderHint(QPainter::Antialiasing, oldAA); - p->setRenderHint(QPainter::SmoothPixmapTransform, oldSmooth); - } - } else { - QRectF bounds = boundingRect(); - - bool needClip = clip() && (d->layedOutTextRect.width() > width() || - d->layedOutTextRect.height() > height()); - - if (needClip) { - p->save(); - p->setClipRect(0, 0, width(), height(), Qt::IntersectClip); - } - if (d->richText) { - QAbstractTextDocumentLayout::PaintContext context; - context.palette.setColor(QPalette::Text, d->color); - p->translate(bounds.x(), bounds.y()); - d->doc->documentLayout()->draw(p, context); - p->translate(-bounds.x(), -bounds.y()); - } else { - d->drawTextLayout(p, QPointF(0, bounds.y()), false); - } - - if (needClip) { - p->restore(); - } - } -} - -/*! \internal */ -void QDeclarative1Text::componentComplete() -{ - Q_D(QDeclarative1Text); - QDeclarativeItem::componentComplete(); - if (d->updateOnComponentComplete) { - d->updateOnComponentComplete = false; - if (d->richText) { - d->ensureDoc(); - d->doc->setText(d->text); - d->rightToLeftText = d->doc->toPlainText().isRightToLeft(); - } else { - d->rightToLeftText = d->text.isRightToLeft(); - } - d->determineHorizontalAlignment(); - d->updateLayout(); - } -} - -/*! \internal */ -void QDeclarative1Text::mousePressEvent(QGraphicsSceneMouseEvent *event) -{ - Q_D(QDeclarative1Text); - - if (!d->richText || !d->doc || d->doc->documentLayout()->anchorAt(event->pos()).isEmpty()) { - event->setAccepted(false); - d->activeLink.clear(); - } else { - d->activeLink = d->doc->documentLayout()->anchorAt(event->pos()); - } - - // ### may malfunction if two of the same links are clicked & dragged onto each other) - - if (!event->isAccepted()) - QDeclarativeItem::mousePressEvent(event); - -} - -/*! \internal */ -void QDeclarative1Text::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) -{ - Q_D(QDeclarative1Text); - - // ### confirm the link, and send a signal out - if (d->richText && d->doc && d->activeLink == d->doc->documentLayout()->anchorAt(event->pos())) - emit linkActivated(d->activeLink); - else - event->setAccepted(false); - - if (!event->isAccepted()) - QDeclarativeItem::mouseReleaseEvent(event); -} - - - -QT_END_NAMESPACE - -#include "qdeclarativetext.moc" |