From dc30e3859f4df146a675c367162720eae8d91982 Mon Sep 17 00:00:00 2001 From: Santhosh Kumar Date: Tue, 30 May 2023 13:22:51 +0200 Subject: [PATCH] Fix mouse handling issue in modal popup The modal popup block input for the condition as specified in the patchset 3326439361d3ec4e60bcdb189e6bfb75189136ca. But this blocks input to the popup itself via ancestor validation. This patchset fix the issue by avoiding ancestor validation if its same item. Fixes: QTBUG-113853 Pick-to: 6.3 6.4 6.5 Change-Id: Icb3c04861396883c2969374fc5f7b8beb76ccdb9 Reviewed-by: Mitch Curtis --- src/quicktemplates/qquickpopup.cpp | 2 +- tests/auto/quickcontrols/controls/data/tst_popup.qml | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/quicktemplates/qquickpopup.cpp b/src/quicktemplates/qquickpopup.cpp index a47d92df21..3c08c950b1 100644 --- a/src/quicktemplates/qquickpopup.cpp +++ b/src/quicktemplates/qquickpopup.cpp @@ -371,7 +371,7 @@ bool QQuickPopupPrivate::blockInput(QQuickItem *item, const QPointF &point) cons // a) outside a non-modal popup, // b) to popup children/content, or // b) outside a modal popups's background dimming - return modal && !popupItem->isAncestorOf(item) && (!dimmer || dimmer->contains(dimmer->mapFromScene(point))); + return modal && ((popupItem != item) && !popupItem->isAncestorOf(item)) && (!dimmer || dimmer->contains(dimmer->mapFromScene(point))); } bool QQuickPopupPrivate::handlePress(QQuickItem *item, const QPointF &point, ulong timestamp) diff --git a/tests/auto/quickcontrols/controls/data/tst_popup.qml b/tests/auto/quickcontrols/controls/data/tst_popup.qml index 23879d817a..48484f588c 100644 --- a/tests/auto/quickcontrols/controls/data/tst_popup.qml +++ b/tests/auto/quickcontrols/controls/data/tst_popup.qml @@ -1449,6 +1449,18 @@ TestCase { mouseRelease(title, pressPoint.x, pressPoint.y) compare(title.pressedPosition, Qt.point(0, 0)) + + // Set modal as true and check for the same operation + popup.modal = true + oldPos = Qt.point(popup.x, popup.y) + mousePress(title, pressPoint.x, pressPoint.y) + fuzzyCompare(title.pressedPosition.x, pressPoint.x, 1) + fuzzyCompare(title.pressedPosition.y, pressPoint.y, 1) + mouseMove(title, pressPoint.x + 5, pressPoint.y + 5) + fuzzyCompare(popup.x, oldPos.x + 5, 1) + fuzzyCompare(popup.y, oldPos.y + 5, 1) + mouseRelease(title, pressPoint.x, pressPoint.y) + compare(title.pressedPosition, Qt.point(0, 0)) } Component {