From: Andrew den Exter Date: Fri, 3 Aug 2012 06:50:24 +0000 (+1000) Subject: Fix pasting with the middle button in TextInput and TextEdit. X-Git-Url: http://git.silmor.de/gitweb/?a=commitdiff_plain;h=35c8ad7957aed842e1aba60df96e50c5e2dcf133;p=konrad%2Fqtdeclarative.git Fix pasting with the middle button in TextInput and TextEdit. Neither item accepted the middle button which prevented the mouse events ever reaching them. Change-Id: Ia8f693099df4d6c248976453d554fef96d1d3b33 Reviewed-by: Martin Jones --- diff --git a/src/quick/items/qquicktextcontrol.cpp b/src/quick/items/qquicktextcontrol.cpp index af3f509..dc61b36 100644 --- a/src/quick/items/qquicktextcontrol.cpp +++ b/src/quick/items/qquicktextcontrol.cpp @@ -974,7 +974,7 @@ void QQuickTextControlPrivate::mousePressEvent(QMouseEvent *e, const QPointF &po { Q_Q(QQuickTextControl); - mousePressed = (interactionFlags & Qt::TextSelectableByMouse); + mousePressed = (interactionFlags & Qt::TextSelectableByMouse) && (e->button() & Qt::LeftButton); mousePressPos = pos.toPoint(); if (sendMouseEventToInputContext(e, pos)) @@ -989,7 +989,9 @@ void QQuickTextControlPrivate::mousePressEvent(QMouseEvent *e, const QPointF &po cursor.clearSelection(); } } - if (!(e->button() & Qt::LeftButton)) { + if (e->button() & Qt::MiddleButton) { + return; + } else if (!(e->button() & Qt::LeftButton)) { e->ignore(); return; } else if (!(interactionFlags & (Qt::TextSelectableByMouse | Qt::TextEditable))) { diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp index 4d1eb61..2855070 100644 --- a/src/quick/items/qquicktextedit.cpp +++ b/src/quick/items/qquicktextedit.cpp @@ -1748,7 +1748,13 @@ void QQuickTextEditPrivate::init() { Q_Q(QQuickTextEdit); - q->setAcceptedMouseButtons(Qt::LeftButton); +#ifndef QT_NO_CLIPBOARD + if (QGuiApplication::clipboard()->supportsSelection()) + q->setAcceptedMouseButtons(Qt::LeftButton | Qt::MiddleButton); + else +#endif + q->setAcceptedMouseButtons(Qt::LeftButton); + q->setFlag(QQuickItem::ItemAcceptsInputMethod); q->setFlag(QQuickItem::ItemHasContents); diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp index ced2e62..54cea8b 100644 --- a/src/quick/items/qquicktextinput.cpp +++ b/src/quick/items/qquicktextinput.cpp @@ -2466,7 +2466,13 @@ bool QQuickTextInput::isInputMethodComposing() const void QQuickTextInputPrivate::init() { Q_Q(QQuickTextInput); - q->setAcceptedMouseButtons(Qt::LeftButton); +#ifndef QT_NO_CLIPBOARD + if (QGuiApplication::clipboard()->supportsSelection()) + q->setAcceptedMouseButtons(Qt::LeftButton | Qt::MiddleButton); + else +#endif + q->setAcceptedMouseButtons(Qt::LeftButton); + q->setFlag(QQuickItem::ItemAcceptsInputMethod); q->setFlag(QQuickItem::ItemHasContents); #ifndef QT_NO_CLIPBOARD diff --git a/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp b/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp index 9f38105..4953874 100644 --- a/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp +++ b/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp @@ -153,6 +153,7 @@ private slots: void copyAndPaste(); void canPaste(); void canPasteEmpty(); + void middleClickPaste(); void textInput(); void inputMethodUpdate(); void openInputPanel(); @@ -2706,6 +2707,58 @@ void tst_qquicktextedit::canPasteEmpty() { } +void tst_qquicktextedit::middleClickPaste() +{ +#ifndef QT_NO_CLIPBOARD + +#ifdef Q_OS_MAC + { + PasteboardRef pasteboard; + OSStatus status = PasteboardCreate(0, &pasteboard); + if (status == noErr) + CFRelease(pasteboard); + else + QSKIP("This machine doesn't support the clipboard"); + } +#endif + + QQuickView window(testFileUrl("mouseselection_true.qml")); + + window.show(); + window.requestActivateWindow(); + QTest::qWaitForWindowActive(&window); + + QVERIFY(window.rootObject() != 0); + QQuickTextEdit *textEditObject = qobject_cast(window.rootObject()); + QVERIFY(textEditObject != 0); + + textEditObject->setFocus(true); + + QString originalText = textEditObject->text(); + QString selectedText = "234567"; + + // press-and-drag-and-release from x1 to x2 + const QPoint p1 = textEditObject->positionToRectangle(2).center().toPoint(); + const QPoint p2 = textEditObject->positionToRectangle(8).center().toPoint(); + const QPoint p3 = textEditObject->positionToRectangle(1).center().toPoint(); + QTest::mousePress(&window, Qt::LeftButton, Qt::NoModifier, p1); + QTest::mouseMove(&window, p2); + QTest::mouseRelease(&window, Qt::LeftButton, Qt::NoModifier, p2); + QTRY_COMPARE(textEditObject->selectedText(), selectedText); + + // Middle click pastes the selected text, assuming the platform supports it. + QTest::mouseClick(&window, Qt::MiddleButton, Qt::NoModifier, p3); + + // ### This is to prevent double click detection from carrying over to the next test. + QTest::qWait(QGuiApplication::styleHints()->mouseDoubleClickInterval() + 10); + + if (QGuiApplication::clipboard()->supportsSelection()) + QCOMPARE(textEditObject->text().mid(1, selectedText.length()), selectedText); + else + QCOMPARE(textEditObject->text(), originalText); +#endif +} + void tst_qquicktextedit::readOnly() { QQuickView window(testFileUrl("readOnly.qml")); diff --git a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp index 8beb871..7b98099 100644 --- a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp +++ b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp @@ -159,6 +159,7 @@ private slots: void copyAndPasteKeySequence(); void canPasteEmpty(); void canPaste(); + void middleClickPaste(); void readOnly(); void focusOnPress(); @@ -2639,6 +2640,58 @@ void tst_qquicktextinput::canPaste() { #endif } +void tst_qquicktextinput::middleClickPaste() +{ +#ifndef QT_NO_CLIPBOARD + +#ifdef Q_OS_MAC + { + PasteboardRef pasteboard; + OSStatus status = PasteboardCreate(0, &pasteboard); + if (status == noErr) + CFRelease(pasteboard); + else + QSKIP("This machine doesn't support the clipboard"); + } +#endif + + QQuickView window(testFileUrl("mouseselection_true.qml")); + + window.show(); + window.requestActivateWindow(); + QTest::qWaitForWindowActive(&window); + + QVERIFY(window.rootObject() != 0); + QQuickTextInput *textInputObject = qobject_cast(window.rootObject()); + QVERIFY(textInputObject != 0); + + textInputObject->setFocus(true); + + QString originalText = textInputObject->text(); + QString selectedText = "234567"; + + // press-and-drag-and-release from x1 to x2 + const QPoint p1 = textInputObject->positionToRectangle(2).center().toPoint(); + const QPoint p2 = textInputObject->positionToRectangle(8).center().toPoint(); + const QPoint p3 = textInputObject->positionToRectangle(1).center().toPoint(); + QTest::mousePress(&window, Qt::LeftButton, Qt::NoModifier, p1); + QTest::mouseMove(&window, p2); + QTest::mouseRelease(&window, Qt::LeftButton, Qt::NoModifier, p2); + QTRY_COMPARE(textInputObject->selectedText(), selectedText); + + // Middle click pastes the selected text, assuming the platform supports it. + QTest::mouseClick(&window, Qt::MiddleButton, Qt::NoModifier, p3); + + // ### This is to prevent double click detection from carrying over to the next test. + QTest::qWait(QGuiApplication::styleHints()->mouseDoubleClickInterval() + 10); + + if (QGuiApplication::clipboard()->supportsSelection()) + QCOMPARE(textInputObject->text().mid(1, selectedText.length()), selectedText); + else + QCOMPARE(textInputObject->text(), originalText); +#endif +} + void tst_qquicktextinput::passwordCharacter() { QString componentStr = "import QtQuick 2.0\nTextInput { text: \"Hello world!\"; font.family: \"Helvetica\"; echoMode: TextInput.Password }";