From 93fd268d531fd61c9c619adc4e08ea9cb0cb2fcd Mon Sep 17 00:00:00 2001 From: Paul Olav Tvete Date: Thu, 16 Jan 2014 10:42:47 +0100 Subject: Implement the new inputmethod query API for Qt Quick Part fixing Android input methods. This change corresponds to 68a9229a97d358639 in the qtbase repository. Task-number: QTBUG-37511 Change-Id: I483abf6a9d5dec86dbd1ae2dff2a85bc19d126f1 Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/quick/items/qquicktextcontrol.cpp | 46 +++++++++++++++++++++++++++++++++++ src/quick/items/qquicktextcontrol_p.h | 1 + 2 files changed, 47 insertions(+) diff --git a/src/quick/items/qquicktextcontrol.cpp b/src/quick/items/qquicktextcontrol.cpp index 0a9677bd4e..53d736fb36 100644 --- a/src/quick/items/qquicktextcontrol.cpp +++ b/src/quick/items/qquicktextcontrol.cpp @@ -1364,6 +1364,11 @@ void QQuickTextControlPrivate::inputMethodEvent(QInputMethodEvent *e) } QVariant QQuickTextControl::inputMethodQuery(Qt::InputMethodQuery property) const +{ + return inputMethodQuery(property, QVariant()); +} + +QVariant QQuickTextControl::inputMethodQuery(Qt::InputMethodQuery property, QVariant argument) const { Q_D(const QQuickTextControl); QTextBlock block = d->cursor.block(); @@ -1382,6 +1387,47 @@ QVariant QQuickTextControl::inputMethodQuery(Qt::InputMethodQuery property) cons return QVariant(); // No limit. case Qt::ImAnchorPosition: return QVariant(d->cursor.anchor() - block.position()); + case Qt::ImAbsolutePosition: + return QVariant(d->cursor.anchor()); + case Qt::ImTextAfterCursor: + { + int maxLength = argument.isValid() ? argument.toInt() : 1024; + QTextCursor tmpCursor = d->cursor; + int localPos = d->cursor.position() - block.position(); + QString result = block.text().mid(localPos); + while (result.length() < maxLength) { + int currentBlock = tmpCursor.blockNumber(); + tmpCursor.movePosition(QTextCursor::NextBlock); + if (tmpCursor.blockNumber() == currentBlock) + break; + result += QLatin1Char('\n') + tmpCursor.block().text(); + } + return QVariant(result); + } + case Qt::ImTextBeforeCursor: + { + int maxLength = argument.isValid() ? argument.toInt() : 1024; + QTextCursor tmpCursor = d->cursor; + int localPos = d->cursor.position() - block.position(); + int numBlocks = 0; + int resultLen = localPos; + while (resultLen < maxLength) { + int currentBlock = tmpCursor.blockNumber(); + tmpCursor.movePosition(QTextCursor::PreviousBlock); + if (tmpCursor.blockNumber() == currentBlock) + break; + numBlocks++; + resultLen += tmpCursor.block().length(); + } + QString result; + while (numBlocks) { + result += tmpCursor.block().text() + QLatin1Char('\n'); + tmpCursor.movePosition(QTextCursor::NextBlock); + --numBlocks; + } + result += block.text().mid(0,localPos); + return QVariant(result); + } default: return QVariant(); } diff --git a/src/quick/items/qquicktextcontrol_p.h b/src/quick/items/qquicktextcontrol_p.h index bc5371b0c3..39221ced11 100644 --- a/src/quick/items/qquicktextcontrol_p.h +++ b/src/quick/items/qquicktextcontrol_p.h @@ -160,6 +160,7 @@ public: #ifndef QT_NO_IM virtual QVariant inputMethodQuery(Qt::InputMethodQuery property) const; + Q_INVOKABLE QVariant inputMethodQuery(Qt::InputMethodQuery query, QVariant argument) const; #endif virtual QMimeData *createMimeDataFromSelection() const; -- cgit v1.2.3