From 54fad1bb8d7b3e249926e088b424085c9336d784 Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Tue, 13 Dec 2011 15:42:49 +1000 Subject: [PATCH] Activate links in a read only TextEdit. Don't ignore mouse press events if the LinksAccessibleByMouse interaction flag is set. Task-number: QTBUG-23065 Change-Id: I25b3e3b0cf194b71fc863ed239196a567f42c19c Reviewed-by: Martin Jones --- src/quick/items/qquicktextcontrol.cpp | 9 +++-- .../qtquick2/qquicktextedit/data/linkActivated.qml | 6 +++ .../qtquick2/qquicktextedit/tst_qquicktextedit.cpp | 39 ++++++++++++++++++++ 3 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 tests/auto/qtquick2/qquicktextedit/data/linkActivated.qml diff --git a/src/quick/items/qquicktextcontrol.cpp b/src/quick/items/qquicktextcontrol.cpp index f50e70a..90483e5 100644 --- a/src/quick/items/qquicktextcontrol.cpp +++ b/src/quick/items/qquicktextcontrol.cpp @@ -1187,10 +1187,13 @@ void QQuickTextControlPrivate::mousePressEvent(QMouseEvent *e, const QPointF &po cursor.clearSelection(); } } - if (!(e->button() & Qt::LeftButton) || - !((interactionFlags & Qt::TextSelectableByMouse) || (interactionFlags & Qt::TextEditable))) { + if (!(e->button() & Qt::LeftButton)) { + e->ignore(); + return; + } else if (!(interactionFlags & (Qt::TextSelectableByMouse | Qt::TextEditable))) { + if (!(interactionFlags & Qt::LinksAccessibleByMouse)) e->ignore(); - return; + return; } cursorIsFocusIndicator = false; diff --git a/tests/auto/qtquick2/qquicktextedit/data/linkActivated.qml b/tests/auto/qtquick2/qquicktextedit/data/linkActivated.qml new file mode 100644 index 0000000..d3bba82 --- /dev/null +++ b/tests/auto/qtquick2/qquicktextedit/data/linkActivated.qml @@ -0,0 +1,6 @@ +import QtQuick 2.0 + +TextEdit { + textFormat: TextEdit.RichText + text: "Test link" +} diff --git a/tests/auto/qtquick2/qquicktextedit/tst_qquicktextedit.cpp b/tests/auto/qtquick2/qquicktextedit/tst_qquicktextedit.cpp index 4ad8bf0..9cc904e 100644 --- a/tests/auto/qtquick2/qquicktextedit/tst_qquicktextedit.cpp +++ b/tests/auto/qtquick2/qquicktextedit/tst_qquicktextedit.cpp @@ -132,6 +132,8 @@ private slots: void positionAt(); + void linkActivated(); + void cursorDelegate(); void cursorVisible(); void delegateLoading_data(); @@ -1642,6 +1644,43 @@ void tst_qquicktextedit::positionAt() QVERIFY(texteditObject->positionAt(x0 / 2, y1) > 0); } +void tst_qquicktextedit::linkActivated() +{ + QQuickView canvas(QUrl::fromLocalFile(TESTDATA("linkActivated.qml"))); + QVERIFY(canvas.rootObject() != 0); + canvas.show(); + canvas.requestActivateWindow(); + QTest::qWaitForWindowShown(&canvas); + + QQuickTextEdit *texteditObject = qobject_cast(canvas.rootObject()); + QVERIFY(texteditObject != 0); + + QSignalSpy spy(texteditObject, SIGNAL(linkActivated(QString))); + + const QString link("http://example.com/"); + + const QPointF linkPos = texteditObject->positionToRectangle(7).center(); + const QPointF textPos = texteditObject->positionToRectangle(2).center(); + + QTest::mouseClick(&canvas, Qt::LeftButton, 0, linkPos.toPoint()); + QTRY_COMPARE(spy.count(), 1); + QCOMPARE(spy.last()[0].toString(), link); + + QTest::mouseClick(&canvas, Qt::LeftButton, 0, textPos.toPoint()); + QTest::qWait(50); + QCOMPARE(spy.count(), 1); + + texteditObject->setReadOnly(true); + + QTest::mouseClick(&canvas, Qt::LeftButton, 0, linkPos.toPoint()); + QTRY_COMPARE(spy.count(), 2); + QCOMPARE(spy.last()[0].toString(), link); + + QTest::mouseClick(&canvas, Qt::LeftButton, 0, textPos.toPoint()); + QTest::qWait(50); + QCOMPARE(spy.count(), 2); +} + void tst_qquicktextedit::cursorDelegate() { QQuickView view(QUrl::fromLocalFile(TESTDATA("cursorTest.qml"))); -- 1.7.2.5