summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/android/qandroidinputcontext.cpp
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2018-02-14 11:27:58 +0100
committerLiang Qi <liang.qi@qt.io>2018-02-14 12:51:24 +0100
commit305dd1b61f657474d751cc3b24f58249ec21b61b (patch)
tree5a90972ecf0f3e499625482d194903b474d9ece6 /src/plugins/platforms/android/qandroidinputcontext.cpp
parent76010f4af8c9a59a20c489d70c7f99b802f9721f (diff)
parentdfffb5299bf83b87607f28f55afaf3c404910f9f (diff)
Merge remote-tracking branch 'origin/5.9' into 5.11
Conflicts: .qmake.conf src/corelib/animation/qvariantanimation.cpp src/corelib/global/qglobal.cpp src/corelib/global/qlogging.cpp src/corelib/io/qprocess_win.cpp src/corelib/json/qjsonarray.cpp src/corelib/tools/qsimd_p.h src/corelib/tools/qtimezoneprivate_p.h src/corelib/xml/qxmlstream_p.h src/gui/kernel/qsimpledrag.cpp src/gui/kernel/qsimpledrag_p.h src/plugins/generic/generic.pro src/plugins/platforms/cocoa/qcocoamenu.mm src/widgets/styles/qmacstyle_mac.mm tests/auto/concurrent/qtconcurrentmap/BLACKLIST tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp tests/auto/gui/kernel/qwindow/BLACKLIST tests/auto/widgets/dialogs/qmessagebox/BLACKLIST Change-Id: I508d686cf20f7f8cc6a7119b9bc7c3bbb505c58e
Diffstat (limited to 'src/plugins/platforms/android/qandroidinputcontext.cpp')
-rw-r--r--src/plugins/platforms/android/qandroidinputcontext.cpp58
1 files changed, 52 insertions, 6 deletions
diff --git a/src/plugins/platforms/android/qandroidinputcontext.cpp b/src/plugins/platforms/android/qandroidinputcontext.cpp
index fe4c5be4cb..f548a1fa96 100644
--- a/src/plugins/platforms/android/qandroidinputcontext.cpp
+++ b/src/plugins/platforms/android/qandroidinputcontext.cpp
@@ -438,6 +438,16 @@ QAndroidInputContext::QAndroidInputContext()
QObject::connect(QGuiApplication::inputMethod(), &QInputMethod::cursorRectangleChanged,
this, &QAndroidInputContext::updateSelectionHandles);
+ QObject::connect(QGuiApplication::inputMethod(), &QInputMethod::anchorRectangleChanged,
+ this, &QAndroidInputContext::updateSelectionHandles);
+ QObject::connect(QGuiApplication::inputMethod(), &QInputMethod::inputItemClipRectangleChanged, this, [this]{
+ auto im = qGuiApp->inputMethod();
+ if (!im->inputItemClipRectangle().contains(im->anchorRectangle()) ||
+ !im->inputItemClipRectangle().contains(im->cursorRectangle())) {
+ m_cursorHandleShown = CursorHandleNotShown;
+ updateSelectionHandles();
+ }
+ });
}
QAndroidInputContext::~QAndroidInputContext()
@@ -595,27 +605,63 @@ void QAndroidInputContext::handleLocationChanged(int handleId, int x, int y)
double pixelDensity = window
? QHighDpiScaling::factor(window)
: QHighDpiScaling::factor(QtAndroid::androidPlatformIntegration()->screen());
- QPoint point(x / pixelDensity, y / pixelDensity);
- y -= leftRect.width() / 2;
+ QPointF point(x / pixelDensity, y / pixelDensity);
+ point.setY(point.y() - leftRect.width() / 2);
if (handleId == 1) {
setSelectionOnFocusObject(point, point);
return;
}
- QInputMethodQueryEvent query(Qt::ImCursorPosition | Qt::ImAnchorPosition);
+ QInputMethodQueryEvent query(Qt::ImCursorPosition | Qt::ImAnchorPosition | Qt::ImCurrentSelection);
QCoreApplication::sendEvent(m_focusObject, &query);
int cpos = query.value(Qt::ImCursorPosition).toInt();
int anchor = query.value(Qt::ImAnchorPosition).toInt();
-
+ bool rtl = query.value(Qt::ImCurrentSelection).toString().isRightToLeft();
auto rightRect = im->anchorRectangle();
if (cpos > anchor)
std::swap(leftRect, rightRect);
+ auto checkLeftHandle = [&rightRect](QPointF &handlePos) {
+ if (handlePos.y() > rightRect.center().y())
+ handlePos.setY(rightRect.center().y()); // adjust Y handle pos
+ if (handlePos.y() >= rightRect.y() && handlePos.y() <= rightRect.bottom() && handlePos.x() >= rightRect.x())
+ return false; // same line and wrong X pos ?
+ return true;
+ };
+
+ auto checkRtlRightHandle = [&rightRect](QPointF &handlePos) {
+ if (handlePos.y() > rightRect.center().y())
+ handlePos.setY(rightRect.center().y()); // adjust Y handle pos
+ if (handlePos.y() >= rightRect.y() && handlePos.y() <= rightRect.bottom() && rightRect.x() >= handlePos.x())
+ return false; // same line and wrong X pos ?
+ return true;
+ };
+
+ auto checkRightHandle = [&leftRect](QPointF &handlePos) {
+ if (handlePos.y() < leftRect.center().y())
+ handlePos.setY(leftRect.center().y()); // adjust Y handle pos
+ if (handlePos.y() >= leftRect.y() && handlePos.y() <= leftRect.bottom() && leftRect.x() >= handlePos.x())
+ return false; // same line and wrong X pos ?
+ return true;
+ };
+
+ auto checkRtlLeftHandle = [&leftRect](QPointF &handlePos) {
+ if (handlePos.y() < leftRect.center().y())
+ handlePos.setY(leftRect.center().y()); // adjust Y handle pos
+ if (handlePos.y() >= leftRect.y() && handlePos.y() <= leftRect.bottom() && handlePos.x() >= leftRect.x())
+ return false; // same line and wrong X pos ?
+ return true;
+ };
+
if (handleId == 2) {
- QPoint rightPoint(rightRect.center().toPoint());
+ QPointF rightPoint(rightRect.center());
+ if ((!rtl && !checkLeftHandle(point)) || (rtl && !checkRtlRightHandle(point)))
+ return;
setSelectionOnFocusObject(point, rightPoint);
} else if (handleId == 3) {
- QPoint leftPoint(leftRect.center().toPoint());
+ QPointF leftPoint(leftRect.center());
+ if ((!rtl && !checkRightHandle(point)) || (rtl && !checkRtlLeftHandle(point)))
+ return;
setSelectionOnFocusObject(leftPoint, point);
}
}