From 85328b975027c6e26bcaf2dd660acd3118049fd2 Mon Sep 17 00:00:00 2001 From: Pekka Vuorela Date: Fri, 9 Dec 2011 15:15:21 +0200 Subject: [PATCH] TextEdits to include tentative commit in text property Similar to what qtbase 1dbfbf4c66187e7522888c19d78024cfceaea570 did for QTextEdit. Now available only in plain text, html support pending. Change-Id: I0b23a45fc484512d3354f66e1a6134e2d70eb8b5 Reviewed-by: Andrew den Exter Reviewed-by: Joona Petrell --- .../graphicsitems/qdeclarativetextedit.cpp | 4 ++-- src/quick/items/qquicktextcontrol.cpp | 19 +++++++++++++++++++ src/quick/items/qquicktextcontrol_p.h | 6 ++---- src/quick/items/qquicktextcontrol_p_p.h | 1 + src/quick/items/qquicktextedit.cpp | 4 ++-- .../qtquick2/qquicktextedit/tst_qquicktextedit.cpp | 14 +++++++++++++- 6 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/qtquick1/graphicsitems/qdeclarativetextedit.cpp b/src/qtquick1/graphicsitems/qdeclarativetextedit.cpp index b547dea..8013d40 100644 --- a/src/qtquick1/graphicsitems/qdeclarativetextedit.cpp +++ b/src/qtquick1/graphicsitems/qdeclarativetextedit.cpp @@ -130,10 +130,10 @@ QString QDeclarative1TextEdit::text() const #ifndef QT_NO_TEXTHTMLPARSER if (d->richText) - return d->document->toHtml(); + return d->control->toHtml(); else #endif - return d->document->toPlainText(); + return d->control->toPlainText(); } /*! diff --git a/src/quick/items/qquicktextcontrol.cpp b/src/quick/items/qquicktextcontrol.cpp index cd4d853..436b6b7 100644 --- a/src/quick/items/qquicktextcontrol.cpp +++ b/src/quick/items/qquicktextcontrol.cpp @@ -1869,7 +1869,10 @@ void QQuickTextControlPrivate::inputMethodEvent(QInputMethodEvent *e) } } layout->setAdditionalFormats(overrides); + tentativeCommit = e->tentativeCommitString(); + cursor.endEditBlock(); + QTextCursorPrivate *cursor_d = QTextCursorPrivate::getPrivate(&cursor); if (cursor_d) cursor_d->setX(); @@ -2696,6 +2699,22 @@ void QQuickTextControl::appendPlainText(const QString &text) d->append(text, Qt::PlainText); } +QString QQuickTextControl::toPlainText() const +{ + Q_D(const QQuickTextControl); + QString plainText = document()->toPlainText(); + if (!d->tentativeCommit.isEmpty()) + plainText.insert(textCursor().position(), d->tentativeCommit); + return plainText; +} + +#ifndef QT_NO_TEXTHTMLPARSER +QString QQuickTextControl::toHtml() const +{ + // note: currently not including tentative commit + return document()->toHtml(); +} +#endif void QQuickTextControl::ensureCursorVisible() { diff --git a/src/quick/items/qquicktextcontrol_p.h b/src/quick/items/qquicktextcontrol_p.h index e8bfe14..2e42625 100644 --- a/src/quick/items/qquicktextcontrol_p.h +++ b/src/quick/items/qquicktextcontrol_p.h @@ -115,11 +115,9 @@ public: bool find(const QString &exp, QTextDocument::FindFlags options = 0); - inline QString toPlainText() const - { return document()->toPlainText(); } + QString toPlainText() const; #ifndef QT_NO_TEXTHTMLPARSER - inline QString toHtml() const - { return document()->toHtml(); } + QString toHtml() const; #endif virtual void ensureCursorVisible(); diff --git a/src/quick/items/qquicktextcontrol_p_p.h b/src/quick/items/qquicktextcontrol_p_p.h index e75c537..8c06899 100644 --- a/src/quick/items/qquicktextcontrol_p_p.h +++ b/src/quick/items/qquicktextcontrol_p_p.h @@ -202,6 +202,7 @@ public: int preeditCursor; bool hideCursor; // used to hide the cursor in the preedit area + QString tentativeCommit; QVector extraSelections; diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp index 91b0b0d..f0679c4 100644 --- a/src/quick/items/qquicktextedit.cpp +++ b/src/quick/items/qquicktextedit.cpp @@ -129,10 +129,10 @@ QString QQuickTextEdit::text() const #ifndef QT_NO_TEXTHTMLPARSER if (d->richText) - return d->document->toHtml(); + return d->control->toHtml(); else #endif - return d->document->toPlainText(); + return d->control->toPlainText(); } /*! diff --git a/tests/auto/qtquick2/qquicktextedit/tst_qquicktextedit.cpp b/tests/auto/qtquick2/qquicktextedit/tst_qquicktextedit.cpp index c34d825..9e8af56 100644 --- a/tests/auto/qtquick2/qquicktextedit/tst_qquicktextedit.cpp +++ b/tests/auto/qtquick2/qquicktextedit/tst_qquicktextedit.cpp @@ -1984,16 +1984,28 @@ void tst_qquicktextedit::textInput() QVERIFY(edit); QVERIFY(edit->hasActiveFocus() == true); - // test that input method event is committed + // test that input method event is committed and change signal is emitted + QSignalSpy spy(edit, SIGNAL(textChanged(QString))); QInputMethodEvent event; event.setCommitString( "Hello world!", 0, 0); QGuiApplication::sendEvent(qGuiApp->inputPanel()->inputItem(), &event); QCOMPARE(edit->text(), QString("Hello world!")); + QCOMPARE(spy.count(), 1); // QTBUG-12339 // test that document and internal text attribute are in sync QQuickTextEditPrivate *editPrivate = static_cast(QQuickItemPrivate::get(edit)); QCOMPARE(editPrivate->text, QString("Hello world!")); + + // test that tentative commit is included in text property + edit->setText(""); + spy.clear(); + QList attributes; + QInputMethodEvent event2("preedit", attributes); + event2.setTentativeCommitString("string"); + QGuiApplication::sendEvent(qGuiApp->inputPanel()->inputItem(), &event2); + QCOMPARE(spy.count(), 1); + QCOMPARE(edit->text(), QString("string")); } class PlatformInputContext : public QPlatformInputContext -- 1.7.2.5