diff options
author | J-P Nurmi <jpnurmi@digia.com> | 2013-04-23 15:29:56 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-06-18 07:50:11 +0200 |
commit | 1037a7f7123dcf9f7b48a6a74118f746ddcbf3d5 (patch) | |
tree | e7e15c21b3f2d6d00ad548c831799cd092921bf5 /src | |
parent | ef5e8d5b6e67d129687034eb4a582dc0462b2971 (diff) |
Add QQuickText::hoveredLink
Task-number: QTBUG-30804
Change-Id: I6c6993b152285f4bdf34d6e1aa04f25fa7ca41e0
Reviewed-by: Alan Alpert <aalpert@blackberry.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/quick/items/qquickitemsmodule.cpp | 1 | ||||
-rw-r--r-- | src/quick/items/qquicktext.cpp | 80 | ||||
-rw-r--r-- | src/quick/items/qquicktext_p.h | 8 | ||||
-rw-r--r-- | src/quick/items/qquicktext_p_p.h | 4 |
4 files changed, 93 insertions, 0 deletions
diff --git a/src/quick/items/qquickitemsmodule.cpp b/src/quick/items/qquickitemsmodule.cpp index 9b3f6ee362..6f1edc718a 100644 --- a/src/quick/items/qquickitemsmodule.cpp +++ b/src/quick/items/qquickitemsmodule.cpp @@ -236,6 +236,7 @@ static void qt_quickitems_defineModule(const char *uri, int major, int minor) qmlRegisterType<QQuickGridView, 1>(uri, 2, 1, "GridView"); qmlRegisterType<QQuickTextEdit, 1>(uri, 2, 1, "TextEdit"); + qmlRegisterType<QQuickText, 2>(uri, 2, 2, "Text"); qmlRegisterType<QQuickTextEdit, 2>(uri, 2, 2, "TextEdit"); } diff --git a/src/quick/items/qquicktext.cpp b/src/quick/items/qquicktext.cpp index b46f2e5ab9..cc2cbb3cb3 100644 --- a/src/quick/items/qquicktext.cpp +++ b/src/quick/items/qquicktext.cpp @@ -107,6 +107,7 @@ void QQuickTextPrivate::init() Q_Q(QQuickText); q->setAcceptedMouseButtons(Qt::LeftButton); q->setFlag(QQuickItem::ItemHasContents); + q->setAcceptHoverEvents(true); } QQuickTextDocumentWithImageResources::QQuickTextDocumentWithImageResources(QQuickItem *parent) @@ -2581,4 +2582,83 @@ void QQuickText::mouseReleaseEvent(QMouseEvent *event) QQuickItem::mouseReleaseEvent(event); } +bool QQuickTextPrivate::isLinkHoveredConnected() +{ + Q_Q(QQuickText); + IS_SIGNAL_CONNECTED(q, QQuickText, linkHovered, (const QString &)); +} + +/*! + \qmlsignal QtQuick2::Text::onLinkHovered(string link) + \since QtQuick 2.2 + + This handler is called when the user hovers 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. + + \sa hoveredLink +*/ + +/*! + \qmlproperty string QtQuick2::Text::hoveredLink + \since QtQuick 2.2 + + This property contains the link string when user hovers a link + embedded in the text. The link must be in rich text or HTML format + and the \a hoveredLink string provides access to the particular link. + + \sa onLinkHovered +*/ + +QString QQuickText::hoveredLink() const +{ + Q_D(const QQuickText); + if (const_cast<QQuickTextPrivate *>(d)->isLinkHoveredConnected()) { + if (d->extra.isAllocated()) + return d->extra->hoveredLink; + } else { +#ifndef QT_NO_CURSOR + if (QQuickWindow *wnd = window()) { + QPointF pos = QCursor::pos(wnd->screen()) - wnd->position() - mapToScene(QPointF(0, 0)); + return d->anchorAt(pos); + } +#endif // QT_NO_CURSOR + } + return QString(); +} + +void QQuickTextPrivate::processHoverEvent(QHoverEvent *event) +{ + Q_Q(QQuickText); + QString link; + if (event->type() != QEvent::HoverLeave) + link = anchorAt(event->posF()); + + if ((!extra.isAllocated() && !link.isEmpty()) || (extra.isAllocated() && extra->hoveredLink != link)) { + extra.value().hoveredLink = link; + emit q->linkHovered(extra->hoveredLink); + } +} + +void QQuickText::hoverEnterEvent(QHoverEvent *event) +{ + Q_D(QQuickText); + if (d->isLinkHoveredConnected()) + d->processHoverEvent(event); +} + +void QQuickText::hoverMoveEvent(QHoverEvent *event) +{ + Q_D(QQuickText); + if (d->isLinkHoveredConnected()) + d->processHoverEvent(event); +} + +void QQuickText::hoverLeaveEvent(QHoverEvent *event) +{ + Q_D(QQuickText); + if (d->isLinkHoveredConnected()) + d->processHoverEvent(event); +} + QT_END_NAMESPACE diff --git a/src/quick/items/qquicktext_p.h b/src/quick/items/qquicktext_p.h index 03b436b3fb..f34cf17e5d 100644 --- a/src/quick/items/qquicktext_p.h +++ b/src/quick/items/qquicktext_p.h @@ -90,6 +90,7 @@ class Q_QUICK_PRIVATE_EXPORT QQuickText : public QQuickImplicitSizeItem Q_PROPERTY(int minimumPointSize READ minimumPointSize WRITE setMinimumPointSize NOTIFY minimumPointSizeChanged) Q_PROPERTY(FontSizeMode fontSizeMode READ fontSizeMode WRITE setFontSizeMode NOTIFY fontSizeModeChanged) Q_PROPERTY(RenderType renderType READ renderType WRITE setRenderType NOTIFY renderTypeChanged) + Q_PROPERTY(QString hoveredLink READ hoveredLink NOTIFY linkHovered REVISION 2) public: QQuickText(QQuickItem *parent=0); @@ -207,9 +208,12 @@ public: RenderType renderType() const; void setRenderType(RenderType renderType); + QString hoveredLink() const; + Q_SIGNALS: void textChanged(const QString &text); void linkActivated(const QString &link); + Q_REVISION(2) void linkHovered(const QString &link); void fontChanged(const QFont &font); void colorChanged(); void linkColorChanged(); @@ -243,6 +247,10 @@ protected: void updatePolish(); + void hoverEnterEvent(QHoverEvent *event); + void hoverMoveEvent(QHoverEvent *event); + void hoverLeaveEvent(QHoverEvent *event); + private Q_SLOTS: void q_imagesLoaded(); void triggerPreprocess(); diff --git a/src/quick/items/qquicktext_p_p.h b/src/quick/items/qquicktext_p_p.h index ff6b0f20be..7a31e77ae4 100644 --- a/src/quick/items/qquicktext_p_p.h +++ b/src/quick/items/qquicktext_p_p.h @@ -87,6 +87,8 @@ public: QString elidedText(qreal lineWidth, const QTextLine &line, QTextLine *nextLine = 0) const; void elideFormats(int start, int length, int offset, QList<QTextLayout::FormatRange> *elidedFormats); + void processHoverEvent(QHoverEvent *event); + QRectF layedOutTextRect; struct ExtraData { @@ -95,6 +97,7 @@ public: qreal lineHeight; QQuickTextDocumentWithImageResources *doc; QString activeLink; + QString hoveredLink; int minimumPixelSize; int minimumPointSize; int nbActiveDownloads; @@ -167,6 +170,7 @@ public: QRectF setupTextLayout(qreal * const baseline); void setupCustomLineGeometry(QTextLine &line, qreal &height, int lineOffset = 0); bool isLinkActivatedConnected(); + bool isLinkHoveredConnected(); static QString anchorAt(const QTextLayout *layout, const QPointF &mousePos); QString anchorAt(const QPointF &pos) const; |