diff options
author | Tapio Oksa <tapio.oksa@qt.io> | 2021-03-15 13:37:20 +0200 |
---|---|---|
committer | Tapio Oksa <tapio.oksa@qt.io> | 2021-04-22 10:40:59 +0000 |
commit | a40a512dec0f34e84eb63812af556608f03713ff (patch) | |
tree | 8970921b6313d3c83e6d7a90547d4486b8bac7a3 | |
parent | 86bb14b2b9d68aebb2ea55ada3c673970ab09a53 (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>
-rw-r--r-- | src/plugins/platforms/android/qandroidinputcontext.cpp | 43 | ||||
-rw-r--r-- | src/plugins/platforms/android/qandroidinputcontext.h | 2 |
2 files changed, 37 insertions, 8 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(), diff --git a/src/plugins/platforms/android/qandroidinputcontext.h b/src/plugins/platforms/android/qandroidinputcontext.h index 02a66c367a..521061b02c 100644 --- a/src/plugins/platforms/android/qandroidinputcontext.h +++ b/src/plugins/platforms/android/qandroidinputcontext.h @@ -156,13 +156,13 @@ private: void focusObjectStartComposing(); bool focusObjectStopComposing(); QRect cursorRect(); + void updateCursorPositionInRange(const QSharedPointer<QInputMethodQueryEvent> &query); private: ExtractedText m_extractedText; QString m_composingText; int m_composingTextStart; int m_composingCursor; - QMetaObject::Connection m_updateCursorPosConnection; HandleModes m_handleMode; int m_batchEditNestingLevel; QObject *m_focusObject; |