From 41eebd477844df1b9a10e2ed92749e0c6f1de728 Mon Sep 17 00:00:00 2001 From: Bartlomiej Moskal Date: Mon, 14 Aug 2023 13:09:49 +0200 Subject: [PATCH] Android: Fix wrong position of EditPopupMenu When Edit Popup Menu was not shown, the size of EditContextView was wrongly returned. That is why the popup appeared in the wrong position and then "jumped" to the right one. To get correct values even when Popup is invisible, size should be calculated manually by getting height/width of all visible buttons (with getMeasuredHeight/getMeasuredWidth[0]) and paddings of EditContextView. [0]https://developer.android.com/reference/android/view/View#getMeasuredWidth() Fixes: QTBUG-115632 Change-Id: I5f6abffab1a1e836c59a922ffa727d893ca9820f Reviewed-by: Assam Boudjelthia (cherry picked from commit 51d331b13bc1b922797eb81b2a73f78e1c07bf22) Reviewed-by: Qt Cherry-pick Bot --- .../qtproject/qt/android/EditContextView.java | 18 ++++++++++++++++++ .../qtproject/qt/android/EditPopupMenu.java | 11 +++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/android/jar/src/org/qtproject/qt/android/EditContextView.java b/src/android/jar/src/org/qtproject/qt/android/EditContextView.java index 326ba19254e..93f98046c65 100644 --- a/src/android/jar/src/org/qtproject/qt/android/EditContextView.java +++ b/src/android/jar/src/org/qtproject/qt/android/EditContextView.java @@ -41,6 +41,7 @@ package org.qtproject.qt.android; import android.content.Context; +import android.graphics.Point; import android.text.TextUtils; import android.view.Gravity; import android.view.View; @@ -110,6 +111,23 @@ public class EditContextView extends LinearLayout implements View.OnClickListene m_buttons.get(R.string.selectAll).setVisibility((buttonsLayout & SALL_BUTTON) != 0 ? View.VISIBLE : View.GONE); } + public Point getCalculatedSize() + { + Point size = new Point(0, 0); + for (ContextButton b : m_buttons.values()) { + if (b.getVisibility() == View.VISIBLE) { + b.measure(0, 0); + size.x += b.getMeasuredWidth(); + size.y = Math.max(size.y, b.getMeasuredHeight()); + } + } + + size.x += getPaddingLeft() + getPaddingRight(); + size.y += getPaddingTop() + getPaddingBottom(); + + return size; + } + public EditContextView(Context context, OnClickListener onClickListener) { super(context); m_onClickListener = onClickListener; diff --git a/src/android/jar/src/org/qtproject/qt/android/EditPopupMenu.java b/src/android/jar/src/org/qtproject/qt/android/EditPopupMenu.java index d459e91a732..4b802a91d39 100644 --- a/src/android/jar/src/org/qtproject/qt/android/EditPopupMenu.java +++ b/src/android/jar/src/org/qtproject/qt/android/EditPopupMenu.java @@ -41,6 +41,7 @@ package org.qtproject.qt.android; import android.content.Context; +import android.graphics.Point; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; @@ -105,6 +106,8 @@ public class EditPopupMenu implements ViewTreeObserver.OnPreDrawListener, View.O initOverlay(); m_view.updateButtons(buttons); + Point viewSize = m_view.getCalculatedSize(); + final int[] layoutLocation = new int[2]; m_layout.getLocationOnScreen(layoutLocation); @@ -117,9 +120,9 @@ public class EditPopupMenu implements ViewTreeObserver.OnPreDrawListener, View.O int x2 = x + layoutLocation[0] - activityLocation[0]; int y2 = y + layoutLocation[1] + (activityLocationInWindow[1] - activityLocation[1]); - x2 -= m_view.getWidth() / 2 ; + x2 -= viewSize.x / 2 ; - y2 -= m_view.getHeight(); + y2 -= viewSize.y; if (y2 < 0) { if (cursorHandle != null) { y2 = cursorHandle.bottom(); @@ -130,8 +133,8 @@ public class EditPopupMenu implements ViewTreeObserver.OnPreDrawListener, View.O } } - if (m_layout.getWidth() < x + m_view.getWidth() / 2) - x2 = m_layout.getWidth() - m_view.getWidth(); + if (m_layout.getWidth() < x + viewSize.x / 2) + x2 = m_layout.getWidth() - viewSize.x; if (x2 < 0) x2 = 0;