diff options
Diffstat (limited to 'src/quick/items')
-rw-r--r-- | src/quick/items/qquicktext.cpp | 37 | ||||
-rw-r--r-- | src/quick/items/qquicktext_p.h | 5 | ||||
-rw-r--r-- | src/quick/items/qquicktext_p_p.h | 1 | ||||
-rw-r--r-- | src/quick/items/qquicktextinput.cpp | 2 | ||||
-rw-r--r-- | src/quick/items/qquicktextnode.cpp | 35 | ||||
-rw-r--r-- | src/quick/items/qquicktextnode_p.h | 2 |
6 files changed, 68 insertions, 14 deletions
diff --git a/src/quick/items/qquicktext.cpp b/src/quick/items/qquicktext.cpp index 14016777c1..c671320fb9 100644 --- a/src/quick/items/qquicktext.cpp +++ b/src/quick/items/qquicktext.cpp @@ -71,7 +71,7 @@ QT_BEGIN_NAMESPACE const QChar QQuickTextPrivate::elideChar = QChar(0x2026); QQuickTextPrivate::QQuickTextPrivate() -: color((QRgb)0), style(QQuickText::Normal), hAlign(QQuickText::AlignLeft), +: color((QRgb)0), linkColor((QRgb)255), style(QQuickText::Normal), hAlign(QQuickText::AlignLeft), vAlign(QQuickText::AlignTop), elideMode(QQuickText::ElideNone), format(QQuickText::AutoText), wrapMode(QQuickText::NoWrap), lineHeight(1), lineHeightMode(QQuickText::ProportionalHeight), lineCount(1), maximumLineCount(INT_MAX), @@ -1279,6 +1279,34 @@ void QQuickText::setColor(const QColor &color) } emit colorChanged(d->color); } + +/*! + \qmlproperty color QtQuick2::Text::linkColor + + The color of links in the text. + + This property works with the StyledText \l textFormat, but not with RichText. + Link color in RichText can be specified by including CSS style tags in the + text. +*/ + +QColor QQuickText::linkColor() const +{ + Q_D(const QQuickText); + return d->linkColor; +} + +void QQuickText::setLinkColor(const QColor &color) +{ + Q_D(QQuickText); + if (d->linkColor == color) + return; + + d->linkColor = color; + update(); + emit linkColorChanged(); +} + /*! \qmlproperty enumeration QtQuick2::Text::style @@ -1894,12 +1922,11 @@ QSGNode *QQuickText::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data if (d->richText) { d->ensureDoc(); - node->addTextDocument(bounds.topLeft(), d->doc, d->color, d->style, d->styleColor); - + node->addTextDocument(bounds.topLeft(), d->doc, d->color, d->style, d->styleColor, d->linkColor); } else if (d->elideMode == QQuickText::ElideNone || bounds.width() > 0.) { - node->addTextLayout(QPoint(0, bounds.y()), &d->layout, d->color, d->style, d->styleColor); + node->addTextLayout(QPoint(0, bounds.y()), &d->layout, d->color, d->style, d->styleColor, d->linkColor); if (d->elideLayout) - node->addTextLayout(QPoint(0, bounds.y()), d->elideLayout, d->color, d->style, d->styleColor); + node->addTextLayout(QPoint(0, bounds.y()), d->elideLayout, d->color, d->style, d->styleColor, d->linkColor); } foreach (QDeclarativeStyledTextImgTag *img, d->visibleImgTags) { diff --git a/src/quick/items/qquicktext_p.h b/src/quick/items/qquicktext_p.h index ff1f45e605..8f173f97cb 100644 --- a/src/quick/items/qquicktext_p.h +++ b/src/quick/items/qquicktext_p.h @@ -68,6 +68,7 @@ class Q_QUICK_PRIVATE_EXPORT QQuickText : public QQuickImplicitSizeItem Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged) Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY fontChanged) Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged) + Q_PROPERTY(QColor linkColor READ linkColor WRITE setLinkColor NOTIFY linkColorChanged) Q_PROPERTY(TextStyle style READ style WRITE setStyle NOTIFY styleChanged) Q_PROPERTY(QColor styleColor READ styleColor WRITE setStyleColor NOTIFY styleColorChanged) Q_PROPERTY(HAlignment horizontalAlignment READ hAlign WRITE setHAlign RESET resetHAlign NOTIFY horizontalAlignmentChanged) @@ -136,6 +137,9 @@ public: QColor color() const; void setColor(const QColor &c); + QColor linkColor() const; + void setLinkColor(const QColor &color); + TextStyle style() const; void setStyle(TextStyle style); @@ -201,6 +205,7 @@ Q_SIGNALS: void linkActivated(const QString &link); void fontChanged(const QFont &font); void colorChanged(const QColor &color); + void linkColorChanged(); void styleChanged(TextStyle style); void styleColorChanged(const QColor &color); void horizontalAlignmentChanged(HAlignment alignment); diff --git a/src/quick/items/qquicktext_p_p.h b/src/quick/items/qquicktext_p_p.h index 6c9f22dffa..6fdde31a36 100644 --- a/src/quick/items/qquicktext_p_p.h +++ b/src/quick/items/qquicktext_p_p.h @@ -89,6 +89,7 @@ public: QFont font; QFont sourceFont; QColor color; + QColor linkColor; QQuickText::TextStyle style; QColor styleColor; QString activeLink; diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp index f8882286ef..d4f73f7514 100644 --- a/src/quick/items/qquicktextinput.cpp +++ b/src/quick/items/qquicktextinput.cpp @@ -1752,7 +1752,7 @@ QSGNode *QQuickTextInput::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData if (!d->m_textLayout.text().isEmpty() || !d->m_textLayout.preeditAreaText().isEmpty()) { node->addTextLayout(offset, &d->m_textLayout, d->color, - QQuickText::Normal, QColor(), + QQuickText::Normal, QColor(), QColor(), d->selectionColor, d->selectedTextColor, d->selectionStart(), d->selectionEnd() - 1); // selectionEnd() returns first char after diff --git a/src/quick/items/qquicktextnode.cpp b/src/quick/items/qquicktextnode.cpp index 82a3ada6c0..a3daead6cb 100644 --- a/src/quick/items/qquicktextnode.cpp +++ b/src/quick/items/qquicktextnode.cpp @@ -237,6 +237,7 @@ namespace { static void insert(QVarLengthArray<BinaryTreeNode> *binaryTree, const QGlyphRun &glyphRun, SelectionState selectionState, + QQuickTextNode::Decorations decorations, const QColor &textColor, const QColor &backgroundColor, const QPointF &position) @@ -247,7 +248,6 @@ namespace { if (qFuzzyIsNull(searchRect.width()) || qFuzzyIsNull(searchRect.height())) return; - QQuickTextNode::Decorations decorations = QQuickTextNode::NoDecoration; decorations |= (glyphRun.underline() ? QQuickTextNode::Underline : QQuickTextNode::NoDecoration); decorations |= (glyphRun.overline() ? QQuickTextNode::Overline : QQuickTextNode::NoDecoration); decorations |= (glyphRun.strikeOut() ? QQuickTextNode::StrikeOut : QQuickTextNode::NoDecoration); @@ -369,6 +369,11 @@ namespace { m_textColor = textColor; } + void setAnchorColor(const QColor &anchorColor) + { + m_anchorColor = anchorColor; + } + void setPosition(const QPointF &position) { m_position = position; @@ -400,6 +405,7 @@ namespace { QColor m_textColor; QColor m_backgroundColor; QColor m_selectedTextColor; + QColor m_anchorColor; QPointF m_position; QTextLine m_currentLine; @@ -745,14 +751,14 @@ namespace { void SelectionEngine::addUnselectedGlyphs(const QGlyphRun &glyphRun) { BinaryTreeNode::insert(&m_currentLineTree, glyphRun, BinaryTreeNode::Unselected, - m_textColor, m_backgroundColor, m_position); + QQuickTextNode::NoDecoration, m_textColor, m_backgroundColor, m_position); } void SelectionEngine::addSelectedGlyphs(const QGlyphRun &glyphRun) { int currentSize = m_currentLineTree.size(); BinaryTreeNode::insert(&m_currentLineTree, glyphRun, BinaryTreeNode::Selected, - m_textColor, m_backgroundColor, m_position); + QQuickTextNode::NoDecoration, m_textColor, m_backgroundColor, m_position); m_hasSelection = m_hasSelection || m_currentLineTree.size() > currentSize; } @@ -771,11 +777,12 @@ namespace { addGlyphsInRange(currentPosition, range.start - currentPosition, QColor(), QColor(), selectionStart, selectionEnd); } - int rangeEnd = qMin(range.start + range.length, currentPosition + remainingLength); - QColor rangeColor = range.format.hasProperty(QTextFormat::ForegroundBrush) - ? range.format.foreground().color() - : QColor(); + QColor rangeColor; + if (range.format.hasProperty(QTextFormat::ForegroundBrush)) + rangeColor = range.format.foreground().color(); + else if (range.format.isAnchor()) + rangeColor = m_anchorColor; QColor rangeBackgroundColor = range.format.hasProperty(QTextFormat::BackgroundBrush) ? range.format.background().color() : QColor(); @@ -1038,7 +1045,8 @@ void QQuickTextNode::mergeFormats(QTextLayout *textLayout, for (int i=0; i<additionalFormats.size(); ++i) { QTextLayout::FormatRange additionalFormat = additionalFormats.at(i); if (additionalFormat.format.hasProperty(QTextFormat::ForegroundBrush) - || additionalFormat.format.hasProperty(QTextFormat::BackgroundBrush)) { + || additionalFormat.format.hasProperty(QTextFormat::BackgroundBrush) + || additionalFormat.format.isAnchor()) { // Merge overlapping formats if (!mergedFormats->isEmpty()) { QTextLayout::FormatRange *lastFormat = mergedFormats->data() + mergedFormats->size() - 1; @@ -1107,6 +1115,7 @@ void QQuickTextNode::addImage(const QRectF &rect, const QImage &image) void QQuickTextNode::addTextDocument(const QPointF &position, QTextDocument *textDocument, const QColor &textColor, QQuickText::TextStyle style, const QColor &styleColor, + const QColor &anchorColor, const QColor &selectionColor, const QColor &selectedTextColor, int selectionStart, int selectionEnd) { @@ -1114,6 +1123,7 @@ void QQuickTextNode::addTextDocument(const QPointF &position, QTextDocument *tex engine.setTextColor(textColor); engine.setSelectedTextColor(selectedTextColor); engine.setSelectionColor(selectionColor); + engine.setAnchorColor(anchorColor); QList<QTextFrame *> frames; frames.append(textDocument->rootFrame()); @@ -1244,6 +1254,13 @@ void QQuickTextNode::addTextDocument(const QPointF &position, QTextDocument *tex } textPos += text.length(); } else { + if (charFormat.foreground().style() != Qt::NoBrush) + engine.setTextColor(charFormat.foreground().color()); + else if (charFormat.isAnchor()) + engine.setTextColor(anchorColor); + else + engine.setTextColor(textColor); + int fragmentEnd = textPos + fragment.length(); if (preeditPosition >= 0 && preeditPosition >= textPos @@ -1269,6 +1286,7 @@ void QQuickTextNode::addTextDocument(const QPointF &position, QTextDocument *tex void QQuickTextNode::addTextLayout(const QPointF &position, QTextLayout *textLayout, const QColor &color, QQuickText::TextStyle style, const QColor &styleColor, + const QColor &anchorColor, const QColor &selectionColor, const QColor &selectedTextColor, int selectionStart, int selectionEnd) { @@ -1276,6 +1294,7 @@ void QQuickTextNode::addTextLayout(const QPointF &position, QTextLayout *textLay engine.setTextColor(color); engine.setSelectedTextColor(selectedTextColor); engine.setSelectionColor(selectionColor); + engine.setAnchorColor(anchorColor); engine.setPosition(position); int preeditLength = textLayout->preeditAreaText().length(); diff --git a/src/quick/items/qquicktextnode_p.h b/src/quick/items/qquicktextnode_p.h index 47ed363ada..9c2217bfd0 100644 --- a/src/quick/items/qquicktextnode_p.h +++ b/src/quick/items/qquicktextnode_p.h @@ -82,10 +82,12 @@ public: void deleteContent(); void addTextLayout(const QPointF &position, QTextLayout *textLayout, const QColor &color = QColor(), QQuickText::TextStyle style = QQuickText::Normal, const QColor &styleColor = QColor(), + const QColor &anchorColor = QColor(), const QColor &selectionColor = QColor(), const QColor &selectedTextColor = QColor(), int selectionStart = -1, int selectionEnd = -1); void addTextDocument(const QPointF &position, QTextDocument *textDocument, const QColor &color = QColor(), QQuickText::TextStyle style = QQuickText::Normal, const QColor &styleColor = QColor(), + const QColor &anchorColor = QColor(), const QColor &selectionColor = QColor(), const QColor &selectedTextColor = QColor(), int selectionStart = -1, int selectionEnd = -1); |