From a2e8e835fc187a3a804c6d4c0b46e9039c137dc6 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Mon, 22 Apr 2013 18:14:55 +0200 Subject: Add QQuickTextEdit::hoveredLink Change-Id: I9d75a97c86e047742514f942cdb91c70f1d7a9a2 Reviewed-by: Mitch Curtis Reviewed-by: Alan Alpert --- src/quick/items/qquickitemsmodule.cpp | 2 + src/quick/items/qquicktextcontrol.cpp | 26 +++++++++++++ src/quick/items/qquicktextcontrol_p.h | 2 + src/quick/items/qquicktextcontrol_p_p.h | 2 + src/quick/items/qquicktextedit.cpp | 65 +++++++++++++++++++++++++++++++++ src/quick/items/qquicktextedit_p.h | 8 ++++ src/quick/items/qquicktextedit_p_p.h | 1 + 7 files changed, 106 insertions(+) (limited to 'src') 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(uri, 2, 1, "ListView"); qmlRegisterType(uri, 2, 1, "GridView"); qmlRegisterType(uri, 2, 1, "TextEdit"); + + qmlRegisterType(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(e); d->mouseDoubleClickEvent(ev, matrix.map(ev->localPos())); break; } + case QEvent::HoverEnter: + case QEvent::HoverMove: + case QEvent::HoverLeave: { + QHoverEvent *ev = static_cast(e); + d->hoverEvent(ev, matrix.map(ev->posF())); + break; } #ifndef QT_NO_IM case QEvent::InputMethod: d->inputMethodEvent(static_cast(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(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); -- cgit v1.2.3