summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/android/qandroidinputcontext.cpp
diff options
context:
space:
mode:
authorTapio Oksa <tapio.oksa@qt.io>2021-03-15 13:37:20 +0200
committerTapio Oksa <tapio.oksa@qt.io>2021-04-22 10:40:59 +0000
commita40a512dec0f34e84eb63812af556608f03713ff (patch)
tree8970921b6313d3c83e6d7a90547d4486b8bac7a3 /src/plugins/platforms/android/qandroidinputcontext.cpp
parent86bb14b2b9d68aebb2ea55ada3c673970ab09a53 (diff)
[Android] Remove signal and slot mechanism to listen states in editor's
Task-number: QTBUG-58013 Change-Id: Ib589f1b69e2e82026d27fbc7519d10e18ae21f59 Reviewed-by: Rami Potinkara <rami.potinkara@qt.io> Reviewed-by: Ville Voutilainen <ville.voutilainen@qt.io>
Diffstat (limited to 'src/plugins/platforms/android/qandroidinputcontext.cpp')
-rw-r--r--src/plugins/platforms/android/qandroidinputcontext.cpp43
1 files changed, 36 insertions, 7 deletions
diff --git a/src/plugins/platforms/android/qandroidinputcontext.cpp b/src/plugins/platforms/android/qandroidinputcontext.cpp
index 01b8ae8dee..eddc71477e 100644
--- a/src/plugins/platforms/android/qandroidinputcontext.cpp
+++ b/src/plugins/platforms/android/qandroidinputcontext.cpp
@@ -853,9 +853,44 @@ void QAndroidInputContext::update(Qt::InputMethodQueries queries)
QSharedPointer<QInputMethodQueryEvent> query = focusObjectInputMethodQuery(queries);
if (query.isNull())
return;
-#warning TODO extract the needed data from query
+
+ if (query->value(Qt::ImCursorPosition).toInt() >= 0 &&
+ query->value(Qt::ImSurroundingText).toString()
+ .left(query->value(Qt::ImCursorPosition).toInt()).length() >= 0) {
+
+ // Cursor position should be always valid
+ // when object is composing
+ if (focusObjectIsComposing())
+ return;
+
+ // NOTE: This seems to be happening sometimes
+ // when qt quick application is booted up
+ if (m_focusObject == nullptr)
+ return;
+
+ if (m_focusObject->isWidgetType())
+ updateCursorPosition();
+ else
+ updateCursorPositionInRange(query);
+ }
+}
+
+void QAndroidInputContext::updateCursorPositionInRange(const QSharedPointer<QInputMethodQueryEvent> &query)
+{
+ QObject *input = qGuiApp->focusObject();
+ QList<QInputMethodEvent::Attribute> attributes;
+ attributes.append(QInputMethodEvent::Attribute(QInputMethodEvent::Cursor,
+ query->value(Qt::ImCursorPosition).toInt(), 1));
+
+ QInputMethodEvent event(QString(), attributes);
+ QCoreApplication::sendEvent(input, &event);
+
+ QtAndroidInput::updateSelection(query->value(Qt::ImCursorPosition).toInt(),
+ query->value(Qt::ImCursorPosition).toInt(), 0,
+ query->value(Qt::ImSurroundingText).toString().length());
}
+
void QAndroidInputContext::invokeAction(QInputMethod::Action action, int cursorPosition)
{
#warning TODO Handle at least QInputMethod::ContextMenu action
@@ -886,12 +921,6 @@ void QAndroidInputContext::showInputPanel()
if (query.isNull())
return;
- disconnect(m_updateCursorPosConnection);
- if (qGuiApp->focusObject()->metaObject()->indexOfSignal("cursorPositionChanged(int,int)") >= 0) // QLineEdit breaks the pattern
- m_updateCursorPosConnection = connect(qGuiApp->focusObject(), SIGNAL(cursorPositionChanged(int,int)), this, SLOT(updateCursorPosition()));
- else
- m_updateCursorPosConnection = connect(qGuiApp->focusObject(), SIGNAL(cursorPositionChanged()), this, SLOT(updateCursorPosition()));
-
QRect rect = cursorRect();
if (!isInputPanelVisible())
QtAndroidInput::showSoftwareKeyboard(rect.left(), rect.top(), rect.width(), rect.height(),