diff options
author | J-P Nurmi <jpnurmi@digia.com> | 2013-04-22 18:14:55 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-06-07 21:47:57 +0200 |
commit | a2e8e835fc187a3a804c6d4c0b46e9039c137dc6 (patch) | |
tree | 264944c62c807541136d231c26db83c8182b8d3f | |
parent | c3bd7f90b4ac10485740bb8bec44cfbb24237fea (diff) |
Add QQuickTextEdit::hoveredLink
Change-Id: I9d75a97c86e047742514f942cdb91c70f1d7a9a2
Reviewed-by: Mitch Curtis <mitch.curtis@digia.com>
Reviewed-by: Alan Alpert <aalpert@blackberry.com>
-rw-r--r-- | src/quick/items/qquickitemsmodule.cpp | 2 | ||||
-rw-r--r-- | src/quick/items/qquicktextcontrol.cpp | 26 | ||||
-rw-r--r-- | src/quick/items/qquicktextcontrol_p.h | 2 | ||||
-rw-r--r-- | src/quick/items/qquicktextcontrol_p_p.h | 2 | ||||
-rw-r--r-- | src/quick/items/qquicktextedit.cpp | 65 | ||||
-rw-r--r-- | src/quick/items/qquicktextedit_p.h | 8 | ||||
-rw-r--r-- | src/quick/items/qquicktextedit_p_p.h | 1 | ||||
-rw-r--r-- | tests/auto/quick/qquicktextedit/data/linkInteraction.qml (renamed from tests/auto/quick/qquicktextedit/data/linkActivated.qml) | 0 | ||||
-rw-r--r-- | tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp | 25 |
9 files changed, 124 insertions, 7 deletions
diff --git a/src/quick/items/qquickitemsmodule.cpp b/src/quick/items/qquickitemsmodule.cpp index 7f80697f3c..9b3f6ee362 100644 --- a/src/quick/items/qquickitemsmodule.cpp +++ b/src/quick/items/qquickitemsmodule.cpp @@ -235,6 +235,8 @@ static void qt_quickitems_defineModule(const char *uri, int major, int minor) qmlRegisterType<QQuickListView, 1>(uri, 2, 1, "ListView"); qmlRegisterType<QQuickGridView, 1>(uri, 2, 1, "GridView"); qmlRegisterType<QQuickTextEdit, 1>(uri, 2, 1, "TextEdit"); + + qmlRegisterType<QQuickTextEdit, 2>(uri, 2, 2, "TextEdit"); } void QQuickItemsModule::defineModule() diff --git a/src/quick/items/qquicktextcontrol.cpp b/src/quick/items/qquicktextcontrol.cpp index e22c84879b..fce5e02b4d 100644 --- a/src/quick/items/qquicktextcontrol.cpp +++ b/src/quick/items/qquicktextcontrol.cpp @@ -720,6 +720,12 @@ void QQuickTextControl::processEvent(QEvent *e, const QMatrix &matrix) QMouseEvent *ev = static_cast<QMouseEvent *>(e); d->mouseDoubleClickEvent(ev, matrix.map(ev->localPos())); break; } + case QEvent::HoverEnter: + case QEvent::HoverMove: + case QEvent::HoverLeave: { + QHoverEvent *ev = static_cast<QHoverEvent *>(e); + d->hoverEvent(ev, matrix.map(ev->posF())); + break; } #ifndef QT_NO_IM case QEvent::InputMethod: d->inputMethodEvent(static_cast<QInputMethodEvent *>(e)); @@ -1403,6 +1409,20 @@ void QQuickTextControlPrivate::focusEvent(QFocusEvent *e) } } +void QQuickTextControlPrivate::hoverEvent(QHoverEvent *e, const QPointF &pos) +{ + Q_Q(QQuickTextControl); + + QString link; + if (e->type() != QEvent::HoverLeave) + link = q->anchorAt(pos); + + if (hoveredLink != link) { + hoveredLink = link; + emit q->linkHovered(link); + } +} + bool QQuickTextControl::hasImState() const { Q_D(const QQuickTextControl); @@ -1438,6 +1458,12 @@ QRectF QQuickTextControl::cursorRect() const return cursorRect(d->cursor); } +QString QQuickTextControl::hoveredLink() const +{ + Q_D(const QQuickTextControl); + return d->hoveredLink; +} + QString QQuickTextControl::anchorAt(const QPointF &pos) const { Q_D(const QQuickTextControl); diff --git a/src/quick/items/qquicktextcontrol_p.h b/src/quick/items/qquicktextcontrol_p.h index 7ec8a68b4c..bc5371b0c3 100644 --- a/src/quick/items/qquicktextcontrol_p.h +++ b/src/quick/items/qquicktextcontrol_p.h @@ -103,6 +103,7 @@ public: QRectF selectionRect(const QTextCursor &cursor) const; QRectF selectionRect() const; + QString hoveredLink() const; QString anchorAt(const QPointF &pos) const; void setCursorWidth(int width); @@ -151,6 +152,7 @@ Q_SIGNALS: void updateRequest(); void cursorRectangleChanged(); void linkActivated(const QString &link); + void linkHovered(const QString &link); public: virtual void processEvent(QEvent *e, const QMatrix &matrix); diff --git a/src/quick/items/qquicktextcontrol_p_p.h b/src/quick/items/qquicktextcontrol_p_p.h index da76de8ffe..e0bcbc2191 100644 --- a/src/quick/items/qquicktextcontrol_p_p.h +++ b/src/quick/items/qquicktextcontrol_p_p.h @@ -118,6 +118,7 @@ public: #ifndef QT_NO_IM void inputMethodEvent(QInputMethodEvent *); #endif + void hoverEvent(QHoverEvent *e, const QPointF &pos); void activateLinkUnderCursor(QString href = QString()); @@ -138,6 +139,7 @@ public: QTextCursor selectedBlockOnTripleClick; QString anchorOnMousePress; QString linkToCopy; + QString hoveredLink; QBasicTimer cursorBlinkTimer; QBasicTimer tripleClickTimer; diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp index 327b0867e6..6b851903fc 100644 --- a/src/quick/items/qquicktextedit.cpp +++ b/src/quick/items/qquicktextedit.cpp @@ -1953,6 +1953,8 @@ void QQuickTextEditPrivate::init() #endif q->setFlag(QQuickItem::ItemHasContents); + q->setAcceptHoverEvents(true); + document = new QQuickTextDocumentWithImageResources(q); control = new QQuickTextControl(document, q); @@ -1967,6 +1969,7 @@ void QQuickTextEditPrivate::init() qmlobject_connect(control, QQuickTextControl, SIGNAL(cursorPositionChanged()), q, QQuickTextEdit, SIGNAL(cursorPositionChanged())); qmlobject_connect(control, QQuickTextControl, SIGNAL(cursorRectangleChanged()), q, QQuickTextEdit, SLOT(moveCursorDelegate())); qmlobject_connect(control, QQuickTextControl, SIGNAL(linkActivated(QString)), q, QQuickTextEdit, SIGNAL(linkActivated(QString))); + qmlobject_connect(control, QQuickTextControl, SIGNAL(linkHovered(QString)), q, QQuickTextEdit, SIGNAL(linkHovered(QString))); qmlobject_connect(control, QQuickTextControl, SIGNAL(textChanged()), q, QQuickTextEdit, SLOT(q_textChanged())); #ifndef QT_NO_CLIPBOARD qmlobject_connect(QGuiApplication::clipboard(), QClipboard, SIGNAL(dataChanged()), q, QQuickTextEdit, SLOT(q_canPasteChanged())); @@ -2468,4 +2471,66 @@ QQuickTextDocument *QQuickTextEdit::textDocument() return d->quickDocument; } +bool QQuickTextEditPrivate::isLinkHoveredConnected() +{ + Q_Q(QQuickTextEdit); + IS_SIGNAL_CONNECTED(q, QQuickTextEdit, linkHovered, (const QString &)); +} + +/*! + \qmlsignal QtQuick2::TextEdit::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::TextEdit::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 link string provides access to the particular link. + + \sa onLinkHovered +*/ + +QString QQuickTextEdit::hoveredLink() const +{ + Q_D(const QQuickTextEdit); + if (const_cast<QQuickTextEditPrivate *>(d)->isLinkHoveredConnected()) { + return d->control->hoveredLink(); +#ifndef QT_NO_CURSOR + } else { + QPointF pos = QCursor::pos(window()->screen()) - window()->position() - mapToScene(position()); + return d->control->anchorAt(pos); +#endif // QT_NO_CURSOR + } +} + +void QQuickTextEdit::hoverEnterEvent(QHoverEvent *event) +{ + Q_D(QQuickTextEdit); + if (d->isLinkHoveredConnected()) + d->control->processEvent(event, QPointF(-d->xoff, -d->yoff)); +} + +void QQuickTextEdit::hoverMoveEvent(QHoverEvent *event) +{ + Q_D(QQuickTextEdit); + if (d->isLinkHoveredConnected()) + d->control->processEvent(event, QPointF(-d->xoff, -d->yoff)); +} + +void QQuickTextEdit::hoverLeaveEvent(QHoverEvent *event) +{ + Q_D(QQuickTextEdit); + if (d->isLinkHoveredConnected()) + d->control->processEvent(event, QPointF(-d->xoff, -d->yoff)); +} + QT_END_NAMESPACE diff --git a/src/quick/items/qquicktextedit_p.h b/src/quick/items/qquicktextedit_p.h index 4e09eafcac..1e038640ca 100644 --- a/src/quick/items/qquicktextedit_p.h +++ b/src/quick/items/qquicktextedit_p.h @@ -102,6 +102,7 @@ class Q_QUICK_PRIVATE_EXPORT QQuickTextEdit : public QQuickImplicitSizeItem Q_PROPERTY(QUrl baseUrl READ baseUrl WRITE setBaseUrl RESET resetBaseUrl NOTIFY baseUrlChanged) Q_PROPERTY(RenderType renderType READ renderType WRITE setRenderType NOTIFY renderTypeChanged) Q_PROPERTY(QQuickTextDocument *textDocument READ textDocument FINAL REVISION 1) + Q_PROPERTY(QString hoveredLink READ hoveredLink NOTIFY linkHovered REVISION 2) public: QQuickTextEdit(QQuickItem *parent=0); @@ -255,6 +256,8 @@ public: QQuickTextDocument *textDocument(); + QString hoveredLink() const; + Q_SIGNALS: void textChanged(); void contentSizeChanged(); @@ -282,6 +285,7 @@ Q_SIGNALS: void selectByMouseChanged(bool selectByMouse); void mouseSelectionModeChanged(SelectionMode mode); void linkActivated(const QString &link); + Q_REVISION(2) void linkHovered(const QString &link); void canPasteChanged(); void canUndoChanged(); void canRedoChanged(); @@ -338,6 +342,10 @@ protected: void focusInEvent(QFocusEvent *event); void focusOutEvent(QFocusEvent *event); + void hoverEnterEvent(QHoverEvent *event); + void hoverMoveEvent(QHoverEvent *event); + void hoverLeaveEvent(QHoverEvent *event); + // mouse filter? void mousePressEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); diff --git a/src/quick/items/qquicktextedit_p_p.h b/src/quick/items/qquicktextedit_p_p.h index 4f0ab939f6..ec3cf1cec5 100644 --- a/src/quick/items/qquicktextedit_p_p.h +++ b/src/quick/items/qquicktextedit_p_p.h @@ -124,6 +124,7 @@ public: void mirrorChange(); qreal getImplicitWidth() const; Qt::LayoutDirection textDirection(const QString &text) const; + bool isLinkHoveredConnected(); void setNativeCursorEnabled(bool enabled) { control->setCursorWidth(enabled ? 1 : 0); } void handleFocusEvent(QFocusEvent *event); diff --git a/tests/auto/quick/qquicktextedit/data/linkActivated.qml b/tests/auto/quick/qquicktextedit/data/linkInteraction.qml index d3bba82b59..d3bba82b59 100644 --- a/tests/auto/quick/qquicktextedit/data/linkActivated.qml +++ b/tests/auto/quick/qquicktextedit/data/linkInteraction.qml diff --git a/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp b/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp index bce1f9e4a2..80e8335091 100644 --- a/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp +++ b/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp @@ -143,7 +143,7 @@ private slots: void positionAt_data(); void positionAt(); - void linkActivated(); + void linkInteraction(); void cursorDelegate_data(); void cursorDelegate(); @@ -2341,9 +2341,9 @@ void tst_qquicktextedit::positionAt() QVERIFY(texteditObject->positionAt(x0 / 2, y1) > 0); } -void tst_qquicktextedit::linkActivated() +void tst_qquicktextedit::linkInteraction() { - QQuickView window(testFileUrl("linkActivated.qml")); + QQuickView window(testFileUrl("linkInteraction.qml")); QVERIFY(window.rootObject() != 0); window.show(); window.requestActivate(); @@ -2353,6 +2353,7 @@ void tst_qquicktextedit::linkActivated() QVERIFY(texteditObject != 0); QSignalSpy spy(texteditObject, SIGNAL(linkActivated(QString))); + QSignalSpy hover(texteditObject, SIGNAL(linkHovered(QString))); const QString link("http://example.com/"); @@ -2361,21 +2362,31 @@ void tst_qquicktextedit::linkActivated() QTest::mouseClick(&window, Qt::LeftButton, 0, linkPos.toPoint()); QTRY_COMPARE(spy.count(), 1); + QTRY_COMPARE(hover.count(), 1); QCOMPARE(spy.last()[0].toString(), link); + QCOMPARE(hover.last()[0].toString(), link); + QCOMPARE(texteditObject->hoveredLink(), link); QTest::mouseClick(&window, Qt::LeftButton, 0, textPos.toPoint()); - QTest::qWait(50); - QCOMPARE(spy.count(), 1); + QTRY_COMPARE(spy.count(), 1); + QTRY_COMPARE(hover.count(), 2); + QCOMPARE(hover.last()[0].toString(), QString()); + QCOMPARE(texteditObject->hoveredLink(), QString()); texteditObject->setReadOnly(true); QTest::mouseClick(&window, Qt::LeftButton, 0, linkPos.toPoint()); QTRY_COMPARE(spy.count(), 2); + QTRY_COMPARE(hover.count(), 3); QCOMPARE(spy.last()[0].toString(), link); + QCOMPARE(hover.last()[0].toString(), link); + QCOMPARE(texteditObject->hoveredLink(), link); QTest::mouseClick(&window, Qt::LeftButton, 0, textPos.toPoint()); - QTest::qWait(50); - QCOMPARE(spy.count(), 2); + QTRY_COMPARE(spy.count(), 2); + QTRY_COMPARE(hover.count(), 4); + QCOMPARE(hover.last()[0].toString(), QString()); + QCOMPARE(texteditObject->hoveredLink(), QString()); } void tst_qquicktextedit::cursorDelegate_data() |