From d3277bdf02b701f78d21a5495a55fcaac08caf3d Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Wed, 25 Mar 2015 11:23:39 +0100 Subject: [PATCH] QComboBox: open popup on touch release if QStyleHints has setFocusOnTouchRelease() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If we give focus to the combobox on touch release, we need to await opening the popup until touch release as well. Otherwise we might end up showing a popup for an unfocused combobox. Especially on iOS, there is a strong coupling between focus object and popup menus, which means that we effectively require the combobox to gain focus before it can show the popup. Change-Id: Ifb7ba091bb39b77f325cdbf61e00ab3e8ff2e522 Reviewed-by: Tor Arne Vestbø --- src/widgets/widgets/qcombobox.cpp | 46 ++++++++++++++++++++----------- src/widgets/widgets/qcombobox_p.h | 2 ++ 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/src/widgets/widgets/qcombobox.cpp b/src/widgets/widgets/qcombobox.cpp index 4350572c453..390478f911e 100644 --- a/src/widgets/widgets/qcombobox.cpp +++ b/src/widgets/widgets/qcombobox.cpp @@ -53,6 +53,7 @@ #include #include #include +#include #include #include #include @@ -3017,39 +3018,51 @@ bool QComboBox::event(QEvent *event) void QComboBox::mousePressEvent(QMouseEvent *e) { Q_D(QComboBox); + if (!QGuiApplication::styleHints()->setFocusOnTouchRelease()) + d->showPopupFromMouseEvent(e); +} + +/*! + \reimp +*/ +void QComboBoxPrivate::showPopupFromMouseEvent(QMouseEvent *e) +{ + Q_Q(QComboBox); QStyleOptionComboBox opt; - initStyleOption(&opt); - QStyle::SubControl sc = style()->hitTestComplexControl(QStyle::CC_ComboBox, &opt, e->pos(), - this); - if (e->button() == Qt::LeftButton && (sc == QStyle::SC_ComboBoxArrow || !isEditable()) - && !d->viewContainer()->isVisible()) { + q->initStyleOption(&opt); + QStyle::SubControl sc = q->style()->hitTestComplexControl(QStyle::CC_ComboBox, &opt, e->pos(), q); + + if (e->button() == Qt::LeftButton + && sc != QStyle::SC_None + && (sc == QStyle::SC_ComboBoxArrow || !q->isEditable()) + && !viewContainer()->isVisible()) { if (sc == QStyle::SC_ComboBoxArrow) - d->updateArrow(QStyle::State_Sunken); + updateArrow(QStyle::State_Sunken); #ifdef QT_KEYPAD_NAVIGATION //if the container already exists, then d->viewContainer() is safe to call - if (d->container) { + if (container) { #endif // We've restricted the next couple of lines, because by not calling // viewContainer(), we avoid creating the QComboBoxPrivateContainer. - d->viewContainer()->blockMouseReleaseTimer.start(QApplication::doubleClickInterval()); - d->viewContainer()->initialClickPosition = mapToGlobal(e->pos()); + viewContainer()->blockMouseReleaseTimer.start(QApplication::doubleClickInterval()); + viewContainer()->initialClickPosition = q->mapToGlobal(e->pos()); #ifdef QT_KEYPAD_NAVIGATION } #endif - showPopup(); + q->showPopup(); // The code below ensures that regular mousepress and pick item still works // If it was not called the viewContainer would ignore event since it didn't have // a mousePressEvent first. - if (d->viewContainer()) - d->viewContainer()->maybeIgnoreMouseButtonRelease = false; + if (viewContainer()) + viewContainer()->maybeIgnoreMouseButtonRelease = false; } else { #ifdef QT_KEYPAD_NAVIGATION - if (QApplication::keypadNavigationEnabled() && sc == QStyle::SC_ComboBoxEditField && d->lineEdit) { - d->lineEdit->event(e); //so lineedit can move cursor, etc + if (QApplication::keypadNavigationEnabled() && sc == QStyle::SC_ComboBoxEditField && lineEdit) { + lineEdit->event(e); //so lineedit can move cursor, etc return; } #endif - QWidget::mousePressEvent(e); + e->ignore(); } } @@ -3059,8 +3072,9 @@ void QComboBox::mousePressEvent(QMouseEvent *e) void QComboBox::mouseReleaseEvent(QMouseEvent *e) { Q_D(QComboBox); - Q_UNUSED(e); d->updateArrow(QStyle::State_None); + if (QGuiApplication::styleHints()->setFocusOnTouchRelease() && hasFocus()) + d->showPopupFromMouseEvent(e); } /*! diff --git a/src/widgets/widgets/qcombobox_p.h b/src/widgets/widgets/qcombobox_p.h index 580054780f9..3fdfdcc22fc 100644 --- a/src/widgets/widgets/qcombobox_p.h +++ b/src/widgets/widgets/qcombobox_p.h @@ -253,6 +253,7 @@ private: QElapsedTimer popupTimer; friend class QComboBox; + friend class QComboBoxPrivate; }; class Q_AUTOTEST_EXPORT QComboMenuDelegate : public QAbstractItemDelegate @@ -372,6 +373,7 @@ public: void modelChanged(); void updateViewContainerPaletteAndOpacity(); void updateFocusPolicy(); + void showPopupFromMouseEvent(QMouseEvent *e); #ifdef Q_OS_MAC void cleanupNativePopup();