diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2017-04-21 08:00:01 +0300 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2017-04-21 08:00:01 +0300 |
commit | 284057d12fea9339744ddc646aa53cfe6c3c95a1 (patch) | |
tree | 61bb12637c56a282830d683e346057b00d332b7a | |
parent | 91b2721fdc2aba28d3c45111779fed70f7c4f87d (diff) | |
parent | c8e9b5f25fb12c3b7983658d738165181b4d6672 (diff) |
Merge remote-tracking branch 'origin/5.9' into dev
Conflicts:
src/imports/controls/RoundButton.qml
src/imports/controls/universal/RadioDelegate.qml
Change-Id: I4cb14c19bd5f6e19b70b03fb394c76712e6dda08
60 files changed, 517 insertions, 631 deletions
diff --git a/src/imports/controls/MenuSeparator.qml b/src/imports/controls/MenuSeparator.qml index e68d9bea..f3916673 100644 --- a/src/imports/controls/MenuSeparator.qml +++ b/src/imports/controls/MenuSeparator.qml @@ -49,11 +49,9 @@ T.MenuSeparator { topPadding: padding + 4 bottomPadding: padding + 4 - //! [contentItem] contentItem: Rectangle { implicitWidth: 188 implicitHeight: 1 color: Default.separatorColor } - //! [contentItem] } diff --git a/src/imports/controls/RoundButton.qml b/src/imports/controls/RoundButton.qml index f6304961..747988d8 100644 --- a/src/imports/controls/RoundButton.qml +++ b/src/imports/controls/RoundButton.qml @@ -55,7 +55,6 @@ T.RoundButton { icon.height: 24 icon.color: enabled ? undefined : Default.textDisabledLightColor - //! [contentItem] contentItem: IconLabel { spacing: control.spacing mirrored: control.mirrored @@ -69,9 +68,7 @@ T.RoundButton { : control.down ? Default.textDarkColor : Default.textColor, enabled || control.highlighted || control.checked ? 1 : 0.3) } - //! [contentItem] - //! [background] background: Rectangle { implicitWidth: 40 implicitHeight: 40 @@ -84,5 +81,4 @@ T.RoundButton { border.color: Default.focusColor border.width: control.visualFocus ? 2 : 0 } - //! [background] } diff --git a/src/imports/controls/ToolSeparator.qml b/src/imports/controls/ToolSeparator.qml index 9b34363d..b1d5dd7b 100644 --- a/src/imports/controls/ToolSeparator.qml +++ b/src/imports/controls/ToolSeparator.qml @@ -49,11 +49,9 @@ T.ToolSeparator { topPadding: vertical ? 2 : 6 bottomPadding: vertical ? 2 : 6 - //! [contentItem] contentItem: Rectangle { implicitWidth: vertical ? 1 : 30 implicitHeight: vertical ? 30 : 1 color: Default.separatorColor } - //! [contentItem] } diff --git a/src/imports/controls/controls.pri b/src/imports/controls/controls.pri index 5aa56418..41347aa7 100644 --- a/src/imports/controls/controls.pri +++ b/src/imports/controls/controls.pri @@ -11,57 +11,57 @@ SOURCES += \ $$PWD/qquickdefaultstyle.cpp QML_CONTROLS = \ - AbstractButton.qml \ - ApplicationWindow.qml \ - BusyIndicator.qml \ - Button.qml \ - CheckBox.qml \ - CheckDelegate.qml \ - CheckIndicator.qml \ - ComboBox.qml \ - Container.qml \ - Control.qml \ - DelayButton.qml \ - Dial.qml \ - Dialog.qml \ - DialogButtonBox.qml \ - Drawer.qml \ - Frame.qml \ - GroupBox.qml \ - ItemDelegate.qml \ - Label.qml \ - Menu.qml \ - MenuItem.qml \ - MenuSeparator.qml \ - Page.qml \ - PageIndicator.qml \ - Pane.qml \ - Popup.qml \ - ProgressBar.qml \ - RadioButton.qml \ - RadioDelegate.qml \ - RadioIndicator.qml \ - RangeSlider.qml \ - RoundButton.qml \ - ScrollBar.qml \ - ScrollIndicator.qml \ - ScrollView.qml \ - Slider.qml \ - SpinBox.qml \ - StackView.qml \ - SwipeDelegate.qml \ - Switch.qml \ - SwitchIndicator.qml \ - SwitchDelegate.qml \ - SwipeView.qml \ - TabBar.qml \ - TabButton.qml \ - TextArea.qml \ - TextField.qml \ - ToolBar.qml \ - ToolButton.qml \ - ToolSeparator.qml \ - ToolTip.qml \ - Tumbler.qml + $$PWD/AbstractButton.qml \ + $$PWD/ApplicationWindow.qml \ + $$PWD/BusyIndicator.qml \ + $$PWD/Button.qml \ + $$PWD/CheckBox.qml \ + $$PWD/CheckDelegate.qml \ + $$PWD/CheckIndicator.qml \ + $$PWD/ComboBox.qml \ + $$PWD/Container.qml \ + $$PWD/Control.qml \ + $$PWD/DelayButton.qml \ + $$PWD/Dial.qml \ + $$PWD/Dialog.qml \ + $$PWD/DialogButtonBox.qml \ + $$PWD/Drawer.qml \ + $$PWD/Frame.qml \ + $$PWD/GroupBox.qml \ + $$PWD/ItemDelegate.qml \ + $$PWD/Label.qml \ + $$PWD/Menu.qml \ + $$PWD/MenuItem.qml \ + $$PWD/MenuSeparator.qml \ + $$PWD/Page.qml \ + $$PWD/PageIndicator.qml \ + $$PWD/Pane.qml \ + $$PWD/Popup.qml \ + $$PWD/ProgressBar.qml \ + $$PWD/RadioButton.qml \ + $$PWD/RadioDelegate.qml \ + $$PWD/RadioIndicator.qml \ + $$PWD/RangeSlider.qml \ + $$PWD/RoundButton.qml \ + $$PWD/ScrollBar.qml \ + $$PWD/ScrollIndicator.qml \ + $$PWD/ScrollView.qml \ + $$PWD/Slider.qml \ + $$PWD/SpinBox.qml \ + $$PWD/StackView.qml \ + $$PWD/SwipeDelegate.qml \ + $$PWD/Switch.qml \ + $$PWD/SwitchIndicator.qml \ + $$PWD/SwitchDelegate.qml \ + $$PWD/SwipeView.qml \ + $$PWD/TabBar.qml \ + $$PWD/TabButton.qml \ + $$PWD/TextArea.qml \ + $$PWD/TextField.qml \ + $$PWD/ToolBar.qml \ + $$PWD/ToolButton.qml \ + $$PWD/ToolSeparator.qml \ + $$PWD/ToolTip.qml \ + $$PWD/Tumbler.qml !qtquickcompiler: QML_FILES += $$QML_CONTROLS diff --git a/src/imports/controls/controls.pro b/src/imports/controls/controls.pro index 309f103c..145b468c 100644 --- a/src/imports/controls/controls.pro +++ b/src/imports/controls/controls.pro @@ -7,8 +7,11 @@ QT_PRIVATE += core-private gui-private qml-private quick-private quicktemplates2 DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII +include(controls.pri) + OTHER_FILES += \ - qmldir + qmldir \ + $$QML_CONTROLS SOURCES += \ $$PWD/qtquickcontrols2plugin.cpp @@ -16,7 +19,6 @@ SOURCES += \ RESOURCES += \ $$PWD/qtquickcontrols2plugin.qrc -include(controls.pri) !static: qtConfig(quick-designer): include(designer/designer.pri) include(doc/doc.pri) diff --git a/src/imports/controls/material/DialogButtonBox.qml b/src/imports/controls/material/DialogButtonBox.qml index 7f4c3606..f66ecda3 100644 --- a/src/imports/controls/material/DialogButtonBox.qml +++ b/src/imports/controls/material/DialogButtonBox.qml @@ -50,8 +50,8 @@ T.DialogButtonBox { spacing: 8 padding: 8 - topPadding: padding - 4 - bottomPadding: padding - 4 + topPadding: 2 + bottomPadding: 2 alignment: Qt.AlignRight Material.foreground: Material.accent @@ -73,6 +73,7 @@ T.DialogButtonBox { implicitHeight: 52 radius: 2 color: control.Material.dialogColor + // Rounded corners should be only at the top or at the bottom topPadding: control.position === T.DialogButtonBox.Footer ? -2 : 0 bottomPadding: control.position === T.DialogButtonBox.Header ? -2 : 0 clip: true diff --git a/src/imports/controls/material/ToolSeparator.qml b/src/imports/controls/material/ToolSeparator.qml index bdb2bc55..f8a5d9bb 100644 --- a/src/imports/controls/material/ToolSeparator.qml +++ b/src/imports/controls/material/ToolSeparator.qml @@ -49,11 +49,9 @@ T.ToolSeparator { topPadding: vertical ? 5 : 12 bottomPadding: vertical ? 5 : 12 - //! [contentItem] contentItem: Rectangle { implicitWidth: vertical ? 1 : 38 implicitHeight: vertical ? 38 : 1 color: control.Material.hintTextColor } - //! [contentItem] } diff --git a/src/imports/controls/material/material.pro b/src/imports/controls/material/material.pro index eb41cfb0..08d5e3ab 100644 --- a/src/imports/controls/material/material.pro +++ b/src/imports/controls/material/material.pro @@ -7,8 +7,11 @@ QT_PRIVATE += core-private gui-private qml-private quick-private quicktemplates2 DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII +include(material.pri) + OTHER_FILES += \ - qmldir + qmldir \ + $$QML_FILES SOURCES += \ $$PWD/qtquickcontrols2materialstyleplugin.cpp @@ -16,8 +19,6 @@ SOURCES += \ RESOURCES += \ $$PWD/qtquickcontrols2materialstyleplugin.qrc -include(material.pri) - CONFIG += no_cxx_module load(qml_plugin) diff --git a/src/imports/controls/material/qquickmaterialtheme.cpp b/src/imports/controls/material/qquickmaterialtheme.cpp index 63def7a5..3ea41779 100644 --- a/src/imports/controls/material/qquickmaterialtheme.cpp +++ b/src/imports/controls/material/qquickmaterialtheme.cpp @@ -36,6 +36,7 @@ #include "qquickmaterialtheme_p.h" +#include <QtGui/qpa/qplatformdialoghelper.h> #include <QtGui/qfont.h> #include <QtGui/qfontinfo.h> @@ -105,4 +106,21 @@ const QFont *QQuickMaterialTheme::font(QPlatformTheme::Font type) const } } +QVariant QQuickMaterialTheme::themeHint(ThemeHint hint) const +{ + switch (hint) { + case QPlatformTheme::DialogButtonBoxLayout: + // https://material.io/guidelines/components/dialogs.html#dialogs-specs + // As per spec, affirmative actions are placed to the right, dismissive + // actions are placed directly to the left of affirmative actions. + // In the Android sources, there are additional type of actions - + // neutral, which are placed to the left. + // Rules for macOS seems to be the most suitable here and are also used + // in the Android QPA plugin. + return QVariant(QPlatformDialogHelper::MacLayout); + default: + return QQuickProxyTheme::themeHint(hint); + } +} + QT_END_NAMESPACE diff --git a/src/imports/controls/material/qquickmaterialtheme_p.h b/src/imports/controls/material/qquickmaterialtheme_p.h index 828ca83a..d505d4ff 100644 --- a/src/imports/controls/material/qquickmaterialtheme_p.h +++ b/src/imports/controls/material/qquickmaterialtheme_p.h @@ -48,6 +48,7 @@ // We mean it. // +#include <QtCore/qvariant.h> #include <QtGui/qfont.h> #include <QtQuickControls2/private/qquickproxytheme_p.h> @@ -60,6 +61,8 @@ public: const QFont *font(Font type = SystemFont) const override; + QVariant themeHint(ThemeHint hint) const override; + private: QFont systemFont; QFont buttonFont; diff --git a/src/imports/controls/universal/RadioDelegate.qml b/src/imports/controls/universal/RadioDelegate.qml index 17373e08..bc15f990 100644 --- a/src/imports/controls/universal/RadioDelegate.qml +++ b/src/imports/controls/universal/RadioDelegate.qml @@ -60,8 +60,6 @@ T.RadioDelegate { icon.height: 20 icon.color: enabled ? undefined : Color.transparent(Universal.foreground, 0.2) - property Item control - indicator: RadioIndicator { x: text ? (control.mirrored ? control.leftPadding : control.width - width - control.rightPadding) : control.leftPadding + (control.availableWidth - width) / 2 y: control.topPadding + (control.availableHeight - height) / 2 diff --git a/src/imports/controls/universal/ToolSeparator.qml b/src/imports/controls/universal/ToolSeparator.qml index bf82133a..965b9690 100644 --- a/src/imports/controls/universal/ToolSeparator.qml +++ b/src/imports/controls/universal/ToolSeparator.qml @@ -49,11 +49,9 @@ T.ToolSeparator { topPadding: vertical ? 12 : 16 bottomPadding: vertical ? 12 : 15 - //! [contentItem] contentItem: Rectangle { implicitWidth: vertical ? 1 : 20 implicitHeight: vertical ? 20 : 1 color: control.Universal.baseMediumLowColor } - //! [contentItem] } diff --git a/src/imports/controls/universal/universal.pro b/src/imports/controls/universal/universal.pro index cfbfdbfd..d9bae111 100644 --- a/src/imports/controls/universal/universal.pro +++ b/src/imports/controls/universal/universal.pro @@ -7,8 +7,11 @@ QT_PRIVATE += core-private gui-private qml-private quick-private quicktemplates2 DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII +include(universal.pri) + OTHER_FILES += \ - qmldir + qmldir \ + $$QML_FILES SOURCES += \ $$PWD/qtquickcontrols2universalstyleplugin.cpp @@ -16,8 +19,6 @@ SOURCES += \ RESOURCES += \ $$PWD/qtquickcontrols2universalstyleplugin.qrc -include(universal.pri) - CONFIG += no_cxx_module load(qml_plugin) diff --git a/src/imports/platform/qquickplatformsystemtrayicon.cpp b/src/imports/platform/qquickplatformsystemtrayicon.cpp index 5e257016..8b5d5f7b 100644 --- a/src/imports/platform/qquickplatformsystemtrayicon.cpp +++ b/src/imports/platform/qquickplatformsystemtrayicon.cpp @@ -93,7 +93,7 @@ QT_BEGIN_NAMESPACE menu: Menu { MenuItem { text: qsTr("Quit") - onActivated: Qt.quit() + onTriggered: Qt.quit() } } } diff --git a/src/quicktemplates2/qquickabstractbutton.cpp b/src/quicktemplates2/qquickabstractbutton.cpp index 7551ead0..a308834c 100644 --- a/src/quicktemplates2/qquickabstractbutton.cpp +++ b/src/quicktemplates2/qquickabstractbutton.cpp @@ -155,11 +155,10 @@ QQuickAbstractButtonPrivate::QQuickAbstractButtonPrivate() autoExclusive(false), autoRepeat(false), wasHeld(false), - touchId(-1), holdTimer(0), delayTimer(0), repeatTimer(0), - repeatButton(Qt::NoButton), + pressButtons(Qt::NoButton), indicator(nullptr), group(nullptr), icon(nullptr), @@ -168,27 +167,27 @@ QQuickAbstractButtonPrivate::QQuickAbstractButtonPrivate() { } -void QQuickAbstractButtonPrivate::handlePress(const QPointF &point, Qt::MouseButton button, Qt::MouseButtons buttons) +void QQuickAbstractButtonPrivate::handlePress(const QPointF &point) { Q_Q(QQuickAbstractButton); + QQuickControlPrivate::handlePress(point); pressPoint = point; q->setPressed(true); emit q->pressed(); - if (autoRepeat) { + if (autoRepeat) startRepeatDelay(); - repeatButton = button; - } else if (Qt::LeftButton == (buttons & Qt::LeftButton)) { + else if (touchId != -1 || Qt::LeftButton == (pressButtons & Qt::LeftButton)) startPressAndHold(); - } else { + else stopPressAndHold(); - } } void QQuickAbstractButtonPrivate::handleMove(const QPointF &point) { Q_Q(QQuickAbstractButton); + QQuickControlPrivate::handleMove(point); q->setPressed(keepPressed || q->contains(point)); if (!pressed && autoRepeat) @@ -200,9 +199,10 @@ void QQuickAbstractButtonPrivate::handleMove(const QPointF &point) void QQuickAbstractButtonPrivate::handleRelease(const QPointF &point) { Q_Q(QQuickAbstractButton); + QQuickControlPrivate::handleRelease(point); bool wasPressed = pressed; q->setPressed(false); - touchId = -1; + pressButtons = Qt::NoButton; if (!wasHeld && (keepPressed || q->contains(point))) q->nextCheckState(); @@ -221,14 +221,15 @@ void QQuickAbstractButtonPrivate::handleRelease(const QPointF &point) stopPressAndHold(); } -void QQuickAbstractButtonPrivate::handleCancel() +void QQuickAbstractButtonPrivate::handleUngrab() { Q_Q(QQuickAbstractButton); + QQuickControlPrivate::handleUngrab(); + pressButtons = Qt::NoButton; if (!pressed) return; q->setPressed(false); - touchId = -1; stopPressRepeat(); stopPressAndHold(); emit q->canceled(); @@ -779,7 +780,8 @@ void QQuickAbstractButton::focusOutEvent(QFocusEvent *event) { Q_D(QQuickAbstractButton); QQuickControl::focusOutEvent(event); - d->handleCancel(); + if (d->touchId == -1) // don't ungrab on multi-touch if another control gets focused + d->handleUngrab(); } void QQuickAbstractButton::keyPressEvent(QKeyEvent *event) @@ -790,10 +792,8 @@ void QQuickAbstractButton::keyPressEvent(QKeyEvent *event) d->pressPoint = QPoint(qRound(width() / 2), qRound(height() / 2)); setPressed(true); - if (d->autoRepeat) { + if (d->autoRepeat) d->startRepeatDelay(); - d->repeatButton = Qt::NoButton; - } emit pressed(); event->accept(); @@ -820,22 +820,8 @@ void QQuickAbstractButton::keyReleaseEvent(QKeyEvent *event) void QQuickAbstractButton::mousePressEvent(QMouseEvent *event) { Q_D(QQuickAbstractButton); + d->pressButtons = event->buttons(); QQuickControl::mousePressEvent(event); - d->handlePress(event->localPos(), event->button(), event->buttons()); -} - -void QQuickAbstractButton::mouseMoveEvent(QMouseEvent *event) -{ - Q_D(QQuickAbstractButton); - QQuickControl::mouseMoveEvent(event); - d->handleMove(event->localPos()); -} - -void QQuickAbstractButton::mouseReleaseEvent(QMouseEvent *event) -{ - Q_D(QQuickAbstractButton); - QQuickControl::mouseReleaseEvent(event); - d->handleRelease(event->localPos()); } void QQuickAbstractButton::mouseDoubleClickEvent(QMouseEvent *event) @@ -844,13 +830,6 @@ void QQuickAbstractButton::mouseDoubleClickEvent(QMouseEvent *event) emit doubleClicked(); } -void QQuickAbstractButton::mouseUngrabEvent() -{ - Q_D(QQuickAbstractButton); - QQuickControl::mouseUngrabEvent(); - d->handleCancel(); -} - void QQuickAbstractButton::timerEvent(QTimerEvent *event) { Q_D(QQuickAbstractButton); @@ -868,63 +847,6 @@ void QQuickAbstractButton::timerEvent(QTimerEvent *event) } } -void QQuickAbstractButton::touchEvent(QTouchEvent *event) -{ - Q_D(QQuickAbstractButton); - switch (event->type()) { - case QEvent::TouchBegin: - if (d->touchId == -1) { - const QTouchEvent::TouchPoint point = event->touchPoints().first(); - d->touchId = point.id(); - d->handlePress(point.pos()); - } - break; - - case QEvent::TouchUpdate: - for (const QTouchEvent::TouchPoint &point : event->touchPoints()) { - if (point.id() != d->touchId) - continue; - - switch (point.state()) { - case Qt::TouchPointPressed: - d->handlePress(point.pos()); - break; - case Qt::TouchPointMoved: - d->handleMove(point.pos()); - break; - case Qt::TouchPointReleased: - d->handleRelease(point.pos()); - break; - default: - break; - } - } - break; - - case QEvent::TouchEnd: - for (const QTouchEvent::TouchPoint &point : event->touchPoints()) { - if (point.id() == d->touchId) - d->handleRelease(point.pos()); - } - break; - - case QEvent::TouchCancel: - d->handleCancel(); - break; - - default: - QQuickControl::touchEvent(event); - break; - } -} - -void QQuickAbstractButton::touchUngrabEvent() -{ - Q_D(QQuickAbstractButton); - QQuickControl::touchUngrabEvent(); - d->handleCancel(); -} - void QQuickAbstractButton::buttonChange(ButtonChange change) { Q_D(QQuickAbstractButton); diff --git a/src/quicktemplates2/qquickabstractbutton_p.h b/src/quicktemplates2/qquickabstractbutton_p.h index daa34735..c6a50665 100644 --- a/src/quicktemplates2/qquickabstractbutton_p.h +++ b/src/quicktemplates2/qquickabstractbutton_p.h @@ -143,13 +143,8 @@ protected: void keyPressEvent(QKeyEvent *event) override; void keyReleaseEvent(QKeyEvent *event) override; void mousePressEvent(QMouseEvent *event) override; - void mouseMoveEvent(QMouseEvent *event) override; - void mouseReleaseEvent(QMouseEvent *event) override; void mouseDoubleClickEvent(QMouseEvent *event) override; - void mouseUngrabEvent() override; void timerEvent(QTimerEvent *event) override; - void touchEvent(QTouchEvent *event) override; - void touchUngrabEvent() override; enum ButtonChange { ButtonAutoRepeatChange, diff --git a/src/quicktemplates2/qquickabstractbutton_p_p.h b/src/quicktemplates2/qquickabstractbutton_p_p.h index 41eb72c1..61a546d1 100644 --- a/src/quicktemplates2/qquickabstractbutton_p_p.h +++ b/src/quicktemplates2/qquickabstractbutton_p_p.h @@ -69,10 +69,10 @@ public: return button->d_func(); } - virtual void handlePress(const QPointF &point, Qt::MouseButton button = Qt::LeftButton, Qt::MouseButtons buttons = Qt::LeftButton); - virtual void handleMove(const QPointF &point); - virtual void handleRelease(const QPointF &point); - virtual void handleCancel(); + void handlePress(const QPointF &point) override; + void handleMove(const QPointF &point) override; + void handleRelease(const QPointF &point) override; + void handleUngrab() override; bool isPressAndHoldConnected(); void startPressAndHold(); @@ -99,12 +99,11 @@ public: bool autoExclusive; bool autoRepeat; bool wasHeld; - int touchId; int holdTimer; int delayTimer; int repeatTimer; QPointF pressPoint; - Qt::MouseButton repeatButton; + Qt::MouseButtons pressButtons; QQuickItem *indicator; QQuickButtonGroup *group; QQuickIcon *icon; diff --git a/src/quicktemplates2/qquickcombobox.cpp b/src/quicktemplates2/qquickcombobox.cpp index 85c577b4..c2fc3aff 100644 --- a/src/quicktemplates2/qquickcombobox.cpp +++ b/src/quicktemplates2/qquickcombobox.cpp @@ -243,6 +243,11 @@ public: void createDelegateModel(); + void handlePress(const QPointF &point) override; + void handleMove(const QPointF &point) override; + void handleRelease(const QPointF &point) override; + void handleUngrab() override; + bool flat; bool down; bool hasDown; @@ -622,6 +627,37 @@ void QQuickComboBoxPrivate::createDelegateModel() delete oldModel; } +void QQuickComboBoxPrivate::handlePress(const QPointF &point) +{ + Q_Q(QQuickComboBox); + QQuickControlPrivate::handlePress(point); + q->setPressed(true); +} + +void QQuickComboBoxPrivate::handleMove(const QPointF &point) +{ + Q_Q(QQuickComboBox); + QQuickControlPrivate::handleMove(point); + q->setPressed(q->contains(point)); +} + +void QQuickComboBoxPrivate::handleRelease(const QPointF &point) +{ + Q_Q(QQuickComboBox); + QQuickControlPrivate::handleRelease(point); + if (pressed) { + q->setPressed(false); + togglePopup(false); + } +} + +void QQuickComboBoxPrivate::handleUngrab() +{ + Q_Q(QQuickComboBox); + QQuickControlPrivate::handleUngrab(); + q->setPressed(false); +} + QQuickComboBox::QQuickComboBox(QQuickItem *parent) : QQuickControl(*(new QQuickComboBoxPrivate), parent) { @@ -1471,34 +1507,6 @@ void QQuickComboBox::keyReleaseEvent(QKeyEvent *event) } } -void QQuickComboBox::mousePressEvent(QMouseEvent *event) -{ - QQuickControl::mousePressEvent(event); - setPressed(true); -} - -void QQuickComboBox::mouseMoveEvent(QMouseEvent* event) -{ - QQuickControl::mouseMoveEvent(event); - setPressed(contains(event->pos())); -} - -void QQuickComboBox::mouseReleaseEvent(QMouseEvent *event) -{ - Q_D(QQuickComboBox); - QQuickControl::mouseReleaseEvent(event); - if (d->pressed) { - setPressed(false); - d->togglePopup(false); - } -} - -void QQuickComboBox::mouseUngrabEvent() -{ - QQuickControl::mouseUngrabEvent(); - setPressed(false); -} - #if QT_CONFIG(wheelevent) void QQuickComboBox::wheelEvent(QWheelEvent *event) { diff --git a/src/quicktemplates2/qquickcombobox_p.h b/src/quicktemplates2/qquickcombobox_p.h index 76dce2d5..851392aa 100644 --- a/src/quicktemplates2/qquickcombobox_p.h +++ b/src/quicktemplates2/qquickcombobox_p.h @@ -183,10 +183,6 @@ protected: #endif void keyPressEvent(QKeyEvent *event) override; void keyReleaseEvent(QKeyEvent *event) override; - void mousePressEvent(QMouseEvent *event) override; - void mouseMoveEvent(QMouseEvent *event) override; - void mouseReleaseEvent(QMouseEvent *event) override; - void mouseUngrabEvent() override; #if QT_CONFIG(wheelevent) void wheelEvent(QWheelEvent *event) override; #endif diff --git a/src/quicktemplates2/qquickcontrol.cpp b/src/quicktemplates2/qquickcontrol.cpp index 95686360..d57c3260 100644 --- a/src/quicktemplates2/qquickcontrol.cpp +++ b/src/quicktemplates2/qquickcontrol.cpp @@ -120,6 +120,7 @@ QQuickControlPrivate::QQuickControlPrivate() hovered(false), explicitHoverEnabled(false), #endif + touchId(-1), padding(0), topPadding(0), leftPadding(0), @@ -144,6 +145,49 @@ QQuickControlPrivate::~QQuickControlPrivate() #endif } +bool QQuickControlPrivate::acceptTouch(const QTouchEvent::TouchPoint &point) +{ + if (point.id() == touchId) + return true; + + if (touchId == -1 && point.state() == Qt::TouchPointPressed) { + touchId = point.id(); + return true; + } + + return false; +} + +void QQuickControlPrivate::handlePress(const QPointF &) +{ + Q_Q(QQuickControl); + if ((focusPolicy & Qt::ClickFocus) == Qt::ClickFocus && !QGuiApplication::styleHints()->setFocusOnTouchRelease()) + q->forceActiveFocus(Qt::MouseFocusReason); +} + +void QQuickControlPrivate::handleMove(const QPointF &point) +{ +#if QT_CONFIG(quicktemplates2_hover) + Q_Q(QQuickControl); + q->setHovered(hoverEnabled && q->contains(point)); +#else + Q_UNUSED(point); +#endif +} + +void QQuickControlPrivate::handleRelease(const QPointF &) +{ + Q_Q(QQuickControl); + if ((focusPolicy & Qt::ClickFocus) == Qt::ClickFocus && QGuiApplication::styleHints()->setFocusOnTouchRelease()) + q->forceActiveFocus(Qt::MouseFocusReason); + touchId = -1; +} + +void QQuickControlPrivate::handleUngrab() +{ + touchId = -1; +} + void QQuickControlPrivate::mirrorChange() { Q_Q(QQuickControl); @@ -1220,30 +1264,85 @@ void QQuickControl::hoverLeaveEvent(QHoverEvent *event) void QQuickControl::mousePressEvent(QMouseEvent *event) { Q_D(QQuickControl); - if ((d->focusPolicy & Qt::ClickFocus) == Qt::ClickFocus && !QGuiApplication::styleHints()->setFocusOnTouchRelease()) - forceActiveFocus(Qt::MouseFocusReason); - + d->handlePress(event->localPos()); event->accept(); } void QQuickControl::mouseMoveEvent(QMouseEvent *event) { -#if QT_CONFIG(quicktemplates2_hover) Q_D(QQuickControl); - setHovered(d->hoverEnabled && contains(event->pos())); -#endif + d->handleMove(event->localPos()); event->accept(); } void QQuickControl::mouseReleaseEvent(QMouseEvent *event) { Q_D(QQuickControl); - if ((d->focusPolicy & Qt::ClickFocus) == Qt::ClickFocus && QGuiApplication::styleHints()->setFocusOnTouchRelease()) - forceActiveFocus(Qt::MouseFocusReason); - + d->handleRelease(event->localPos()); event->accept(); } +void QQuickControl::mouseUngrabEvent() +{ + Q_D(QQuickControl); + d->handleUngrab(); +} + +void QQuickControl::touchEvent(QTouchEvent *event) +{ + Q_D(QQuickControl); + switch (event->type()) { + case QEvent::TouchBegin: + for (const QTouchEvent::TouchPoint &point : event->touchPoints()) { + if (d->acceptTouch(point)) + d->handlePress(point.pos()); + } + break; + + case QEvent::TouchUpdate: + for (const QTouchEvent::TouchPoint &point : event->touchPoints()) { + if (!d->acceptTouch(point)) + continue; + + switch (point.state()) { + case Qt::TouchPointPressed: + d->handlePress(point.pos()); + break; + case Qt::TouchPointMoved: + d->handleMove(point.pos()); + break; + case Qt::TouchPointReleased: + d->handleRelease(point.pos()); + break; + default: + break; + } + } + break; + + case QEvent::TouchEnd: + for (const QTouchEvent::TouchPoint &point : event->touchPoints()) { + if (d->acceptTouch(point)) + d->handleRelease(point.pos()); + } + break; + + case QEvent::TouchCancel: + d->handleUngrab(); + break; + + default: + QQuickItem::touchEvent(event); + break; + } +} + +void QQuickControl::touchUngrabEvent() +{ + Q_D(QQuickControl); + d->handleUngrab(); +} + #if QT_CONFIG(wheelevent) void QQuickControl::wheelEvent(QWheelEvent *event) { diff --git a/src/quicktemplates2/qquickcontrol_p.h b/src/quicktemplates2/qquickcontrol_p.h index ab92d6ab..feb6646e 100644 --- a/src/quicktemplates2/qquickcontrol_p.h +++ b/src/quicktemplates2/qquickcontrol_p.h @@ -184,6 +184,9 @@ protected: void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; + void mouseUngrabEvent() override; + void touchEvent(QTouchEvent *event) override; + void touchUngrabEvent() override; #if QT_CONFIG(wheelevent) void wheelEvent(QWheelEvent *event) override; #endif diff --git a/src/quicktemplates2/qquickcontrol_p_p.h b/src/quicktemplates2/qquickcontrol_p_p.h index 113110de..a6825640 100644 --- a/src/quicktemplates2/qquickcontrol_p_p.h +++ b/src/quicktemplates2/qquickcontrol_p_p.h @@ -78,6 +78,12 @@ public: return control->d_func(); } + virtual bool acceptTouch(const QTouchEvent::TouchPoint &point); + virtual void handlePress(const QPointF &point); + virtual void handleMove(const QPointF &point); + virtual void handleRelease(const QPointF &point); + virtual void handleUngrab(); + void mirrorChange() override; void setTopPadding(qreal value, bool reset = false); @@ -136,6 +142,7 @@ public: bool hovered; bool explicitHoverEnabled; #endif + int touchId; qreal padding; qreal topPadding; qreal leftPadding; diff --git a/src/quicktemplates2/qquickdial.cpp b/src/quicktemplates2/qquickdial.cpp index 5b98992b..98ca8186 100644 --- a/src/quicktemplates2/qquickdial.cpp +++ b/src/quicktemplates2/qquickdial.cpp @@ -96,8 +96,7 @@ class QQuickDialPrivate : public QQuickControlPrivate public: QQuickDialPrivate() - : touchId(-1), - from(0), + : from(0), to(1), value(0), position(0), @@ -118,12 +117,11 @@ public: void updatePosition(); bool isLargeChange(const QPointF &eventPos, qreal proposedPosition) const; - void handlePress(const QPointF &point); - void handleMove(const QPointF &point); - void handleRelease(const QPointF &point); - void handleUngrab(); + void handlePress(const QPointF &point) override; + void handleMove(const QPointF &point) override; + void handleRelease(const QPointF &point) override; + void handleUngrab() override; - int touchId; qreal from; qreal to; qreal value; @@ -200,6 +198,7 @@ bool QQuickDialPrivate::isLargeChange(const QPointF &eventPos, qreal proposedPos void QQuickDialPrivate::handlePress(const QPointF &point) { Q_Q(QQuickDial); + QQuickControlPrivate::handlePress(point); pressPoint = point; q->setPressed(true); } @@ -207,6 +206,7 @@ void QQuickDialPrivate::handlePress(const QPointF &point) void QQuickDialPrivate::handleMove(const QPointF &point) { Q_Q(QQuickDial); + QQuickControlPrivate::handleMove(point); const qreal oldPos = position; qreal pos = positionAt(point); if (snapMode == QQuickDial::SnapAlways) @@ -225,6 +225,7 @@ void QQuickDialPrivate::handleMove(const QPointF &point) void QQuickDialPrivate::handleRelease(const QPointF &point) { Q_Q(QQuickDial); + QQuickControlPrivate::handleRelease(point); if (q->keepMouseGrab() || q->keepTouchGrab()) { const qreal oldPos = position; qreal pos = positionAt(point); @@ -242,14 +243,13 @@ void QQuickDialPrivate::handleRelease(const QPointF &point) q->setPressed(false); pressPoint = QPointF(); - touchId = -1; } void QQuickDialPrivate::handleUngrab() { Q_Q(QQuickDial); + QQuickControlPrivate::handleUngrab(); pressPoint = QPointF(); - touchId = -1; q->setPressed(false); } @@ -648,14 +648,12 @@ void QQuickDial::mousePressEvent(QMouseEvent *event) { Q_D(QQuickDial); QQuickControl::mousePressEvent(event); - d->handlePress(event->localPos()); d->handleMove(event->localPos()); } void QQuickDial::mouseMoveEvent(QMouseEvent *event) { Q_D(QQuickDial); - QQuickControl::mouseMoveEvent(event); if (!keepMouseGrab()) { bool overXDragThreshold = QQuickWindowPrivate::dragOverThreshold(event->localPos().x() - d->pressPoint.x(), Qt::XAxis, event); setKeepMouseGrab(overXDragThreshold); @@ -665,82 +663,46 @@ void QQuickDial::mouseMoveEvent(QMouseEvent *event) setKeepMouseGrab(overYDragThreshold); } } - d->handleMove(event->localPos()); -} - -void QQuickDial::mouseReleaseEvent(QMouseEvent *event) -{ - Q_D(QQuickDial); - QQuickControl::mouseReleaseEvent(event); - d->handleRelease(event->localPos()); -} - -void QQuickDial::mouseUngrabEvent() -{ - Q_D(QQuickDial); - QQuickControl::mouseUngrabEvent(); - d->handleUngrab(); + QQuickControl::mouseMoveEvent(event); } void QQuickDial::touchEvent(QTouchEvent *event) { Q_D(QQuickDial); switch (event->type()) { - case QEvent::TouchBegin: - if (d->touchId == -1) { - const QTouchEvent::TouchPoint point = event->touchPoints().first(); - d->touchId = point.id(); - d->handlePress(point.pos()); - } else { - event->ignore(); - } - break; - case QEvent::TouchUpdate: for (const QTouchEvent::TouchPoint &point : event->touchPoints()) { - if (point.id() != d->touchId) + if (!d->acceptTouch(point)) continue; - if (!keepTouchGrab()) { - bool overXDragThreshold = QQuickWindowPrivate::dragOverThreshold(point.pos().x() - d->pressPoint.x(), Qt::XAxis, &point); - setKeepTouchGrab(overXDragThreshold); + switch (point.state()) { + case Qt::TouchPointMoved: + if (!keepTouchGrab()) { + bool overXDragThreshold = QQuickWindowPrivate::dragOverThreshold(point.pos().x() - d->pressPoint.x(), Qt::XAxis, &point); + setKeepTouchGrab(overXDragThreshold); - if (!overXDragThreshold) { - bool overYDragThreshold = QQuickWindowPrivate::dragOverThreshold(point.pos().y() - d->pressPoint.y(), Qt::YAxis, &point); - setKeepTouchGrab(overYDragThreshold); + if (!overXDragThreshold) { + bool overYDragThreshold = QQuickWindowPrivate::dragOverThreshold(point.pos().y() - d->pressPoint.y(), Qt::YAxis, &point); + setKeepTouchGrab(overYDragThreshold); + } } - } - if (keepTouchGrab()) - d->handleMove(point.pos()); - } - break; + if (keepTouchGrab()) + d->handleMove(point.pos()); + break; - case QEvent::TouchEnd: - for (const QTouchEvent::TouchPoint &point : event->touchPoints()) { - if (point.id() != d->touchId) - continue; - - d->handleRelease(point.pos()); + default: + QQuickControl::touchEvent(event); + break; + } } break; - case QEvent::TouchCancel: - d->handleUngrab(); - break; - default: QQuickControl::touchEvent(event); break; } } -void QQuickDial::touchUngrabEvent() -{ - Q_D(QQuickDial); - QQuickControl::touchUngrabEvent(); - d->handleUngrab(); -} - #if QT_CONFIG(wheelevent) void QQuickDial::wheelEvent(QWheelEvent *event) { diff --git a/src/quicktemplates2/qquickdial_p.h b/src/quicktemplates2/qquickdial_p.h index e402922d..1a6d70fd 100644 --- a/src/quicktemplates2/qquickdial_p.h +++ b/src/quicktemplates2/qquickdial_p.h @@ -136,10 +136,7 @@ protected: void keyReleaseEvent(QKeyEvent *event) override; void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; - void mouseReleaseEvent(QMouseEvent *event) override; - void mouseUngrabEvent() override; void touchEvent(QTouchEvent *event) override; - void touchUngrabEvent() override; #if QT_CONFIG(wheelevent) void wheelEvent(QWheelEvent *event) override; #endif diff --git a/src/quicktemplates2/qquickdialogbuttonbox.cpp b/src/quicktemplates2/qquickdialogbuttonbox.cpp index 386577da..3c422268 100644 --- a/src/quicktemplates2/qquickdialogbuttonbox.cpp +++ b/src/quicktemplates2/qquickdialogbuttonbox.cpp @@ -258,7 +258,12 @@ void QQuickDialogButtonBoxPrivate::updateLayout() return firstRole != QPlatformDialogHelper::InvalidRole; } - const int *m_layout = QPlatformDialogHelper::buttonLayout(); + static const int *themeButtonLayout() + { + const int hint = QGuiApplicationPrivate::platformTheme()->themeHint(QPlatformTheme::DialogButtonBoxLayout).toInt(); + return QPlatformDialogHelper::buttonLayout(Qt::Horizontal, static_cast<QPlatformDialogHelper::ButtonLayout>(hint)); + } + const int *m_layout = themeButtonLayout(); }; std::sort(buttons.begin(), buttons.end(), ButtonLayout()); diff --git a/src/quicktemplates2/qquickpopup.cpp b/src/quicktemplates2/qquickpopup.cpp index 8c37ea84..e0c5c653 100644 --- a/src/quicktemplates2/qquickpopup.cpp +++ b/src/quicktemplates2/qquickpopup.cpp @@ -1853,6 +1853,16 @@ bool QQuickPopup::overlayEvent(QQuickItem *item, QEvent *event) } } +void QQuickPopup::touchEvent(QTouchEvent *event) +{ + // TODO: QQuickPopup and QQuickDrawer still rely on synthesized mouse events + event->ignore(); +} + +void QQuickPopup::touchUngrabEvent() +{ +} + #if QT_CONFIG(wheelevent) void QQuickPopup::wheelEvent(QWheelEvent *event) { diff --git a/src/quicktemplates2/qquickpopup_p.h b/src/quicktemplates2/qquickpopup_p.h index d1b0dfac..8d311e4a 100644 --- a/src/quicktemplates2/qquickpopup_p.h +++ b/src/quicktemplates2/qquickpopup_p.h @@ -351,6 +351,8 @@ protected: virtual void mouseDoubleClickEvent(QMouseEvent *event); virtual void mouseUngrabEvent(); virtual bool overlayEvent(QQuickItem *item, QEvent *event); + virtual void touchEvent(QTouchEvent *event); + virtual void touchUngrabEvent(); #if QT_CONFIG(wheelevent) virtual void wheelEvent(QWheelEvent *event); #endif diff --git a/src/quicktemplates2/qquickpopupitem.cpp b/src/quicktemplates2/qquickpopupitem.cpp index 94bd7dec..abcb86aa 100644 --- a/src/quicktemplates2/qquickpopupitem.cpp +++ b/src/quicktemplates2/qquickpopupitem.cpp @@ -229,6 +229,18 @@ void QQuickPopupItem::mouseUngrabEvent() d->popup->mouseUngrabEvent(); } +void QQuickPopupItem::touchEvent(QTouchEvent *event) +{ + Q_D(QQuickPopupItem); + d->popup->touchEvent(event); +} + +void QQuickPopupItem::touchUngrabEvent() +{ + Q_D(QQuickPopupItem); + d->popup->touchUngrabEvent(); +} + #if QT_CONFIG(wheelevent) void QQuickPopupItem::wheelEvent(QWheelEvent *event) { diff --git a/src/quicktemplates2/qquickpopupitem_p_p.h b/src/quicktemplates2/qquickpopupitem_p_p.h index 9ceb8389..9b3c76df 100644 --- a/src/quicktemplates2/qquickpopupitem_p_p.h +++ b/src/quicktemplates2/qquickpopupitem_p_p.h @@ -79,6 +79,8 @@ protected: void mouseReleaseEvent(QMouseEvent *event) override; void mouseDoubleClickEvent(QMouseEvent *event) override; void mouseUngrabEvent() override; + void touchEvent(QTouchEvent *event) override; + void touchUngrabEvent() override; #if QT_CONFIG(wheelevent) void wheelEvent(QWheelEvent *event) override; #endif diff --git a/src/quicktemplates2/qquickrangeslider.cpp b/src/quicktemplates2/qquickrangeslider.cpp index 9996d041..1468d358 100644 --- a/src/quicktemplates2/qquickrangeslider.cpp +++ b/src/quicktemplates2/qquickrangeslider.cpp @@ -327,10 +327,12 @@ public: } QQuickRangeSliderNode *pressedNode(int touchId = -1) const; - void handlePress(const QPointF &point, int touchId = -1); - void handleMove(const QPointF &point, int touchId = -1); - void handleRelease(const QPointF &point, int touchId = -1); - void handleUngrab(); + + bool acceptTouch(const QTouchEvent::TouchPoint &point) override; + void handlePress(const QPointF &point) override; + void handleMove(const QPointF &point) override; + void handleRelease(const QPointF &point) override; + void handleUngrab() override; void updateHover(const QPointF &pos); @@ -395,9 +397,23 @@ QQuickRangeSliderNode *QQuickRangeSliderPrivate::pressedNode(int touchId) const return nullptr; } -void QQuickRangeSliderPrivate::handlePress(const QPointF &point, int touchId) +bool QQuickRangeSliderPrivate::acceptTouch(const QTouchEvent::TouchPoint &point) +{ + int firstId = QQuickRangeSliderNodePrivate::get(first)->touchId; + int secondId = QQuickRangeSliderNodePrivate::get(second)->touchId; + + if (((firstId == -1 || secondId == -1) && point.state() == Qt::TouchPointPressed) || point.id() == firstId || point.id() == secondId) { + touchId = point.id(); + return true; + } + + return false; +} + +void QQuickRangeSliderPrivate::handlePress(const QPointF &point) { Q_Q(QQuickRangeSlider); + QQuickControlPrivate::handlePress(point); pressPoint = point; QQuickItem *firstHandle = first->handle(); @@ -453,9 +469,10 @@ void QQuickRangeSliderPrivate::handlePress(const QPointF &point, int touchId) otherNode->handle()->setZ(0); } -void QQuickRangeSliderPrivate::handleMove(const QPointF &point, int touchId) +void QQuickRangeSliderPrivate::handleMove(const QPointF &point) { Q_Q(QQuickRangeSlider); + QQuickControlPrivate::handleMove(point); QQuickRangeSliderNode *pressedNode = QQuickRangeSliderPrivate::pressedNode(touchId); if (pressedNode) { qreal pos = positionAt(q, pressedNode->handle(), point); @@ -468,9 +485,10 @@ void QQuickRangeSliderPrivate::handleMove(const QPointF &point, int touchId) } } -void QQuickRangeSliderPrivate::handleRelease(const QPointF &point, int touchId) +void QQuickRangeSliderPrivate::handleRelease(const QPointF &point) { Q_Q(QQuickRangeSlider); + QQuickControlPrivate::handleRelease(point); pressPoint = QPointF(); QQuickRangeSliderNode *pressedNode = QQuickRangeSliderPrivate::pressedNode(touchId); @@ -496,6 +514,7 @@ void QQuickRangeSliderPrivate::handleRelease(const QPointF &point, int touchId) void QQuickRangeSliderPrivate::handleUngrab() { + QQuickControlPrivate::handleUngrab(); pressPoint = QPointF(); first->setPressed(false); second->setPressed(false); @@ -982,57 +1001,33 @@ void QQuickRangeSlider::mousePressEvent(QMouseEvent *event) { Q_D(QQuickRangeSlider); QQuickControl::mousePressEvent(event); - d->handlePress(event->localPos()); d->handleMove(event->localPos()); } void QQuickRangeSlider::mouseMoveEvent(QMouseEvent *event) { Q_D(QQuickRangeSlider); - QQuickControl::mouseMoveEvent(event); if (!keepMouseGrab()) { if (d->orientation == Qt::Horizontal) setKeepMouseGrab(QQuickWindowPrivate::dragOverThreshold(event->localPos().x() - d->pressPoint.x(), Qt::XAxis, event)); else setKeepMouseGrab(QQuickWindowPrivate::dragOverThreshold(event->localPos().y() - d->pressPoint.y(), Qt::YAxis, event)); } - if (keepMouseGrab()) - d->handleMove(event->localPos()); -} - -void QQuickRangeSlider::mouseReleaseEvent(QMouseEvent *event) -{ - Q_D(QQuickRangeSlider); - QQuickControl::mouseReleaseEvent(event); - d->handleRelease(event->localPos()); -} - -void QQuickRangeSlider::mouseUngrabEvent() -{ - Q_D(QQuickRangeSlider); - QQuickControl::mouseUngrabEvent(); - d->handleUngrab(); + QQuickControl::mouseMoveEvent(event); } void QQuickRangeSlider::touchEvent(QTouchEvent *event) { Q_D(QQuickRangeSlider); switch (event->type()) { - case QEvent::TouchBegin: - if (!d->first->isPressed() || !d->second->isPressed()) { - const QTouchEvent::TouchPoint point = event->touchPoints().first(); - d->handlePress(point.pos(), point.id()); - } else { - event->ignore(); - } - break; - case QEvent::TouchUpdate: for (const QTouchEvent::TouchPoint &point : event->touchPoints()) { + if (!d->acceptTouch(point)) + continue; + switch (point.state()) { case Qt::TouchPointPressed: - if (!d->first->isPressed() || !d->second->isPressed()) - d->handlePress(point.pos(), point.id()); + d->handlePress(point.pos()); break; case Qt::TouchPointMoved: if (!keepTouchGrab()) { @@ -1041,14 +1036,11 @@ void QQuickRangeSlider::touchEvent(QTouchEvent *event) else setKeepTouchGrab(QQuickWindowPrivate::dragOverThreshold(point.pos().y() - point.startPos().y(), Qt::YAxis, &point)); } - if (point.id() == QQuickRangeSliderNodePrivate::get(d->first)->touchId - || point.id() == QQuickRangeSliderNodePrivate::get(d->second)->touchId) - d->handleMove(point.pos(), point.id()); + if (keepTouchGrab()) + d->handleMove(point.pos()); break; case Qt::TouchPointReleased: - if (point.id() == QQuickRangeSliderNodePrivate::get(d->first)->touchId - || point.id() == QQuickRangeSliderNodePrivate::get(d->second)->touchId) - d->handleRelease(point.pos(), point.id()); + d->handleRelease(point.pos()); break; default: break; @@ -1056,31 +1048,12 @@ void QQuickRangeSlider::touchEvent(QTouchEvent *event) } break; - case QEvent::TouchEnd: - for (const QTouchEvent::TouchPoint &point : event->touchPoints()) { - if (point.id() == QQuickRangeSliderNodePrivate::get(d->first)->touchId - || point.id() == QQuickRangeSliderNodePrivate::get(d->second)->touchId) - d->handleRelease(point.pos(), point.id()); - } - break; - - case QEvent::TouchCancel: - d->handleUngrab(); - break; - default: QQuickControl::touchEvent(event); break; } } -void QQuickRangeSlider::touchUngrabEvent() -{ - Q_D(QQuickRangeSlider); - QQuickControl::touchUngrabEvent(); - d->handleUngrab(); -} - void QQuickRangeSlider::mirrorChange() { Q_D(QQuickRangeSlider); diff --git a/src/quicktemplates2/qquickrangeslider_p.h b/src/quicktemplates2/qquickrangeslider_p.h index affb734a..b4553501 100644 --- a/src/quicktemplates2/qquickrangeslider_p.h +++ b/src/quicktemplates2/qquickrangeslider_p.h @@ -122,10 +122,7 @@ protected: void keyReleaseEvent(QKeyEvent *event) override; void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; - void mouseReleaseEvent(QMouseEvent *event) override; - void mouseUngrabEvent() override; void touchEvent(QTouchEvent *event) override; - void touchUngrabEvent() override; void mirrorChange() override; void componentComplete() override; diff --git a/src/quicktemplates2/qquickscrollbar.cpp b/src/quicktemplates2/qquickscrollbar.cpp index 240f6601..128bca6f 100644 --- a/src/quicktemplates2/qquickscrollbar.cpp +++ b/src/quicktemplates2/qquickscrollbar.cpp @@ -165,7 +165,6 @@ QQuickScrollBarPrivate::QQuickScrollBarPrivate() moving(false), interactive(true), explicitInteractive(false), - touchId(-1), orientation(Qt::Vertical), snapMode(QQuickScrollBar::NoSnap), policy(QQuickScrollBar::AsNeeded) @@ -246,6 +245,7 @@ void QQuickScrollBarPrivate::resizeContent() void QQuickScrollBarPrivate::handlePress(const QPointF &point) { Q_Q(QQuickScrollBar); + QQuickControlPrivate::handlePress(point); offset = positionAt(point) - position; if (offset < 0 || offset > size) offset = size / 2; @@ -255,6 +255,7 @@ void QQuickScrollBarPrivate::handlePress(const QPointF &point) void QQuickScrollBarPrivate::handleMove(const QPointF &point) { Q_Q(QQuickScrollBar); + QQuickControlPrivate::handleMove(point); qreal pos = qBound<qreal>(0.0, positionAt(point) - offset, 1.0 - size); if (snapMode == QQuickScrollBar::SnapAlways) pos = snapPosition(pos); @@ -264,20 +265,20 @@ void QQuickScrollBarPrivate::handleMove(const QPointF &point) void QQuickScrollBarPrivate::handleRelease(const QPointF &point) { Q_Q(QQuickScrollBar); + QQuickControlPrivate::handleRelease(point); qreal pos = qBound<qreal>(0.0, positionAt(point) - offset, 1.0 - size); if (snapMode != QQuickScrollBar::NoSnap) pos = snapPosition(pos); q->setPosition(pos); offset = 0.0; - touchId = -1; q->setPressed(false); } void QQuickScrollBarPrivate::handleUngrab() { Q_Q(QQuickScrollBar); + QQuickControlPrivate::handleUngrab(); offset = 0.0; - touchId = -1; q->setPressed(false); } @@ -627,80 +628,9 @@ void QQuickScrollBar::mousePressEvent(QMouseEvent *event) { Q_D(QQuickScrollBar); QQuickControl::mousePressEvent(event); - d->handlePress(event->localPos()); d->handleMove(event->localPos()); } -void QQuickScrollBar::mouseMoveEvent(QMouseEvent *event) -{ - Q_D(QQuickScrollBar); - QQuickControl::mouseMoveEvent(event); - d->handleMove(event->localPos()); -} - -void QQuickScrollBar::mouseReleaseEvent(QMouseEvent *event) -{ - Q_D(QQuickScrollBar); - QQuickControl::mouseReleaseEvent(event); - d->handleRelease(event->localPos()); -} - -void QQuickScrollBar::mouseUngrabEvent() -{ - Q_D(QQuickScrollBar); - QQuickControl::mouseUngrabEvent(); - d->handleUngrab(); -} - -void QQuickScrollBar::touchEvent(QTouchEvent *event) -{ - Q_D(QQuickScrollBar); - switch (event->type()) { - case QEvent::TouchBegin: - if (d->touchId == -1) { - const QTouchEvent::TouchPoint point = event->touchPoints().first(); - d->touchId = point.id(); - d->handlePress(point.pos()); - } else { - event->ignore(); - } - break; - - case QEvent::TouchUpdate: - for (const QTouchEvent::TouchPoint &point : event->touchPoints()) { - if (point.id() != d->touchId) - continue; - - d->handleMove(point.pos()); - } - break; - - case QEvent::TouchEnd: - for (const QTouchEvent::TouchPoint &point : event->touchPoints()) { - if (point.id() != d->touchId) - continue; - - d->handleRelease(point.pos()); - } - break; - - case QEvent::TouchCancel: - d->handleUngrab(); - break; - - default: - QQuickControl::touchEvent(event); - break; - } -} - -void QQuickScrollBar::touchUngrabEvent() -{ - Q_D(QQuickScrollBar); - QQuickControl::touchUngrabEvent(); - d->handleUngrab(); -} - #if QT_CONFIG(quicktemplates2_hover) void QQuickScrollBar::hoverChange() { diff --git a/src/quicktemplates2/qquickscrollbar_p.h b/src/quicktemplates2/qquickscrollbar_p.h index d7457876..9b417a2b 100644 --- a/src/quicktemplates2/qquickscrollbar_p.h +++ b/src/quicktemplates2/qquickscrollbar_p.h @@ -136,11 +136,6 @@ Q_SIGNALS: protected: void mousePressEvent(QMouseEvent *event) override; - void mouseMoveEvent(QMouseEvent *event) override; - void mouseReleaseEvent(QMouseEvent *event) override; - void mouseUngrabEvent() override; - void touchEvent(QTouchEvent *event) override; - void touchUngrabEvent() override; #if QT_CONFIG(quicktemplates2_hover) void hoverChange() override; diff --git a/src/quicktemplates2/qquickscrollbar_p_p.h b/src/quicktemplates2/qquickscrollbar_p_p.h index 409b952b..431bb383 100644 --- a/src/quicktemplates2/qquickscrollbar_p_p.h +++ b/src/quicktemplates2/qquickscrollbar_p_p.h @@ -74,10 +74,10 @@ public: void updateActive(); void resizeContent() override; - void handlePress(const QPointF &point); - void handleMove(const QPointF &point); - void handleRelease(const QPointF &point); - void handleUngrab(); + void handlePress(const QPointF &point) override; + void handleMove(const QPointF &point) override; + void handleRelease(const QPointF &point) override; + void handleUngrab() override; qreal size; qreal position; @@ -88,7 +88,6 @@ public: bool moving; bool interactive; bool explicitInteractive; - int touchId; Qt::Orientation orientation; QQuickScrollBar::SnapMode snapMode; QQuickScrollBar::Policy policy; diff --git a/src/quicktemplates2/qquickslider.cpp b/src/quicktemplates2/qquickslider.cpp index 7c64957b..2e337c3a 100644 --- a/src/quicktemplates2/qquickslider.cpp +++ b/src/quicktemplates2/qquickslider.cpp @@ -96,7 +96,6 @@ public: stepSize(0), live(true), pressed(false), - touchId(-1), orientation(Qt::Horizontal), snapMode(QQuickSlider::NoSnap), handle(nullptr) @@ -108,10 +107,10 @@ public: void setPosition(qreal position); void updatePosition(); - void handlePress(const QPointF &point); - void handleMove(const QPointF &point); - void handleRelease(const QPointF &point); - void handleUngrab(); + void handlePress(const QPointF &point) override; + void handleMove(const QPointF &point) override; + void handleRelease(const QPointF &point) override; + void handleUngrab() override; qreal from; qreal to; @@ -120,7 +119,6 @@ public: qreal stepSize; bool live; bool pressed; - int touchId; QPointF pressPoint; Qt::Orientation orientation; QQuickSlider::SnapMode snapMode; @@ -187,6 +185,7 @@ void QQuickSliderPrivate::updatePosition() void QQuickSliderPrivate::handlePress(const QPointF &point) { Q_Q(QQuickSlider); + QQuickControlPrivate::handlePress(point); pressPoint = point; q->setPressed(true); } @@ -194,6 +193,7 @@ void QQuickSliderPrivate::handlePress(const QPointF &point) void QQuickSliderPrivate::handleMove(const QPointF &point) { Q_Q(QQuickSlider); + QQuickControlPrivate::handleMove(point); const qreal oldPos = position; qreal pos = positionAt(point); if (snapMode == QQuickSlider::SnapAlways) @@ -209,7 +209,7 @@ void QQuickSliderPrivate::handleMove(const QPointF &point) void QQuickSliderPrivate::handleRelease(const QPointF &point) { Q_Q(QQuickSlider); - touchId = -1; + QQuickControlPrivate::handleRelease(point); pressPoint = QPointF(); const qreal oldPos = position; qreal pos = positionAt(point); @@ -230,7 +230,7 @@ void QQuickSliderPrivate::handleRelease(const QPointF &point) void QQuickSliderPrivate::handleUngrab() { Q_Q(QQuickSlider); - touchId = -1; + QQuickControlPrivate::handleUngrab(); pressPoint = QPointF(); q->setPressed(false); } @@ -650,93 +650,59 @@ void QQuickSlider::mousePressEvent(QMouseEvent *event) { Q_D(QQuickSlider); QQuickControl::mousePressEvent(event); - d->handlePress(event->localPos()); d->handleMove(event->localPos()); } void QQuickSlider::mouseMoveEvent(QMouseEvent *event) { Q_D(QQuickSlider); - QQuickControl::mouseMoveEvent(event); if (!keepMouseGrab()) { if (d->orientation == Qt::Horizontal) setKeepMouseGrab(QQuickWindowPrivate::dragOverThreshold(event->localPos().x() - d->pressPoint.x(), Qt::XAxis, event)); else setKeepMouseGrab(QQuickWindowPrivate::dragOverThreshold(event->localPos().y() - d->pressPoint.y(), Qt::YAxis, event)); } - d->handleMove(event->localPos()); -} - -void QQuickSlider::mouseReleaseEvent(QMouseEvent *event) -{ - Q_D(QQuickSlider); - QQuickControl::mouseReleaseEvent(event); - d->handleRelease(event->localPos()); -} - -void QQuickSlider::mouseUngrabEvent() -{ - Q_D(QQuickSlider); - QQuickControl::mouseUngrabEvent(); - d->handleUngrab(); + QQuickControl::mouseMoveEvent(event); } void QQuickSlider::touchEvent(QTouchEvent *event) { Q_D(QQuickSlider); switch (event->type()) { - case QEvent::TouchBegin: - if (d->touchId == -1) { - const QTouchEvent::TouchPoint point = event->touchPoints().first(); - d->touchId = point.id(); - d->handlePress(point.pos()); - } else { - event->ignore(); - } - break; - case QEvent::TouchUpdate: for (const QTouchEvent::TouchPoint &point : event->touchPoints()) { - if (point.id() != d->touchId) + if (!d->acceptTouch(point)) continue; - if (!keepTouchGrab()) { - if (d->orientation == Qt::Horizontal) - setKeepTouchGrab(QQuickWindowPrivate::dragOverThreshold(point.pos().x() - d->pressPoint.x(), Qt::XAxis, &point)); - else - setKeepTouchGrab(QQuickWindowPrivate::dragOverThreshold(point.pos().y() - d->pressPoint.y(), Qt::YAxis, &point)); + switch (point.state()) { + case Qt::TouchPointPressed: + d->handlePress(point.pos()); + break; + case Qt::TouchPointMoved: + if (!keepTouchGrab()) { + if (d->orientation == Qt::Horizontal) + setKeepTouchGrab(QQuickWindowPrivate::dragOverThreshold(point.pos().x() - d->pressPoint.x(), Qt::XAxis, &point)); + else + setKeepTouchGrab(QQuickWindowPrivate::dragOverThreshold(point.pos().y() - d->pressPoint.y(), Qt::YAxis, &point)); + } + if (keepTouchGrab()) + d->handleMove(point.pos()); + break; + case Qt::TouchPointReleased: + d->handleRelease(point.pos()); + break; + default: + break; } - if (keepTouchGrab()) - d->handleMove(point.pos()); - } - break; - - case QEvent::TouchEnd: - for (const QTouchEvent::TouchPoint &point : event->touchPoints()) { - if (point.id() != d->touchId) - continue; - - d->handleRelease(point.pos()); } break; - case QEvent::TouchCancel: - d->handleUngrab(); - break; - default: QQuickControl::touchEvent(event); break; } } -void QQuickSlider::touchUngrabEvent() -{ - Q_D(QQuickSlider); - QQuickControl::touchUngrabEvent(); - d->handleUngrab(); -} - #if QT_CONFIG(wheelevent) void QQuickSlider::wheelEvent(QWheelEvent *event) { diff --git a/src/quicktemplates2/qquickslider_p.h b/src/quicktemplates2/qquickslider_p.h index f2a13217..cb441ddd 100644 --- a/src/quicktemplates2/qquickslider_p.h +++ b/src/quicktemplates2/qquickslider_p.h @@ -139,10 +139,7 @@ protected: void keyReleaseEvent(QKeyEvent *event) override; void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; - void mouseReleaseEvent(QMouseEvent *event) override; - void mouseUngrabEvent() override; void touchEvent(QTouchEvent *event) override; - void touchUngrabEvent() override; #if QT_CONFIG(wheelevent) void wheelEvent(QWheelEvent *event) override; #endif diff --git a/src/quicktemplates2/qquickspinbox.cpp b/src/quicktemplates2/qquickspinbox.cpp index b70366ea..b6e99609 100644 --- a/src/quicktemplates2/qquickspinbox.cpp +++ b/src/quicktemplates2/qquickspinbox.cpp @@ -114,7 +114,6 @@ public: stepSize(1), delayTimer(0), repeatTimer(0), - touchId(-1), up(nullptr), down(nullptr), validator(nullptr), @@ -138,10 +137,10 @@ public: void startPressRepeat(); void stopPressRepeat(); - bool handlePress(const QPointF &point); - bool handleMove(const QPointF &point); - bool handleRelease(const QPointF &point); - bool handleUngrab(); + void handlePress(const QPointF &point) override; + void handleMove(const QPointF &point) override; + void handleRelease(const QPointF &point) override; + void handleUngrab() override; bool editable; int from; @@ -150,7 +149,6 @@ public: int stepSize; int delayTimer; int repeatTimer; - int touchId; QQuickSpinButton *up; QQuickSpinButton *down; QValidator *validator; @@ -273,9 +271,10 @@ void QQuickSpinBoxPrivate::stopPressRepeat() } } -bool QQuickSpinBoxPrivate::handlePress(const QPointF &point) +void QQuickSpinBoxPrivate::handlePress(const QPointF &point) { Q_Q(QQuickSpinBox); + QQuickControlPrivate::handlePress(point); QQuickItem *ui = up->indicator(); QQuickItem *di = down->indicator(); up->setPressed(ui && ui->isEnabled() && ui->contains(ui->mapFromItem(q, point))); @@ -285,12 +284,12 @@ bool QQuickSpinBoxPrivate::handlePress(const QPointF &point) q->setAccessibleProperty("pressed", pressed); if (pressed) startRepeatDelay(); - return pressed; } -bool QQuickSpinBoxPrivate::handleMove(const QPointF &point) +void QQuickSpinBoxPrivate::handleMove(const QPointF &point) { Q_Q(QQuickSpinBox); + QQuickControlPrivate::handleMove(point); QQuickItem *ui = up->indicator(); QQuickItem *di = down->indicator(); up->setPressed(ui && ui->isEnabled() && ui->contains(ui->mapFromItem(q, point))); @@ -300,17 +299,16 @@ bool QQuickSpinBoxPrivate::handleMove(const QPointF &point) q->setAccessibleProperty("pressed", pressed); if (!pressed) stopPressRepeat(); - return pressed; } -bool QQuickSpinBoxPrivate::handleRelease(const QPointF &point) +void QQuickSpinBoxPrivate::handleRelease(const QPointF &point) { Q_Q(QQuickSpinBox); + QQuickControlPrivate::handleRelease(point); QQuickItem *ui = up->indicator(); QQuickItem *di = down->indicator(); int oldValue = value; - bool wasPressed = up->isPressed() || down->isPressed(); if (up->isPressed()) { up->setPressed(false); if (repeatTimer <= 0 && ui && ui->contains(ui->mapFromItem(q, point))) @@ -323,22 +321,19 @@ bool QQuickSpinBoxPrivate::handleRelease(const QPointF &point) if (value != oldValue) emit q->valueModified(); - touchId = -1; q->setAccessibleProperty("pressed", false); stopPressRepeat(); - return wasPressed; } -bool QQuickSpinBoxPrivate::handleUngrab() +void QQuickSpinBoxPrivate::handleUngrab() { Q_Q(QQuickSpinBox); + QQuickControlPrivate::handleUngrab(); up->setPressed(false); down->setPressed(false); - touchId = -1; q->setAccessibleProperty("pressed", false); stopPressRepeat(); - return false; } QQuickSpinBox::QQuickSpinBox(QQuickItem *parent) @@ -791,34 +786,6 @@ void QQuickSpinBox::keyReleaseEvent(QKeyEvent *event) setAccessibleProperty("pressed", false); } -void QQuickSpinBox::mousePressEvent(QMouseEvent *event) -{ - Q_D(QQuickSpinBox); - QQuickControl::mousePressEvent(event); - d->handlePress(event->localPos()); -} - -void QQuickSpinBox::mouseMoveEvent(QMouseEvent *event) -{ - Q_D(QQuickSpinBox); - QQuickControl::mouseMoveEvent(event); - d->handleMove(event->localPos()); -} - -void QQuickSpinBox::mouseReleaseEvent(QMouseEvent *event) -{ - Q_D(QQuickSpinBox); - QQuickControl::mouseReleaseEvent(event); - d->handleRelease(event->localPos()); -} - -void QQuickSpinBox::mouseUngrabEvent() -{ - Q_D(QQuickSpinBox); - QQuickControl::mouseUngrabEvent(); - d->handleUngrab(); -} - void QQuickSpinBox::timerEvent(QTimerEvent *event) { Q_D(QQuickSpinBox); @@ -833,55 +800,6 @@ void QQuickSpinBox::timerEvent(QTimerEvent *event) } } -void QQuickSpinBox::touchEvent(QTouchEvent *event) -{ - Q_D(QQuickSpinBox); - switch (event->type()) { - case QEvent::TouchBegin: - if (d->touchId == -1) { - const QTouchEvent::TouchPoint point = event->touchPoints().first(); - d->touchId = point.id(); - d->handlePress(point.pos()); - } else { - event->ignore(); - } - break; - - case QEvent::TouchUpdate: - for (const QTouchEvent::TouchPoint &point : event->touchPoints()) { - if (point.id() != d->touchId) - continue; - - d->handleMove(point.pos()); - } - break; - - case QEvent::TouchEnd: - for (const QTouchEvent::TouchPoint &point : event->touchPoints()) { - if (point.id() != d->touchId) - continue; - - d->handleRelease(point.pos()); - } - break; - - case QEvent::TouchCancel: - d->handleUngrab(); - break; - - default: - QQuickControl::touchEvent(event); - break; - } -} - -void QQuickSpinBox::touchUngrabEvent() -{ - Q_D(QQuickSpinBox); - QQuickControl::touchUngrabEvent(); - d->handleUngrab(); -} - #if QT_CONFIG(wheelevent) void QQuickSpinBox::wheelEvent(QWheelEvent *event) { diff --git a/src/quicktemplates2/qquickspinbox_p.h b/src/quicktemplates2/qquickspinbox_p.h index 3d554870..d51a2ccb 100644 --- a/src/quicktemplates2/qquickspinbox_p.h +++ b/src/quicktemplates2/qquickspinbox_p.h @@ -132,13 +132,7 @@ protected: void hoverLeaveEvent(QHoverEvent *event) override; void keyPressEvent(QKeyEvent *event) override; void keyReleaseEvent(QKeyEvent *event) override; - void mousePressEvent(QMouseEvent *event) override; - void mouseMoveEvent(QMouseEvent *event) override; - void mouseReleaseEvent(QMouseEvent *event) override; - void mouseUngrabEvent() override; void timerEvent(QTimerEvent *event) override; - void touchEvent(QTouchEvent *event) override; - void touchUngrabEvent() override; #if QT_CONFIG(wheelevent) void wheelEvent(QWheelEvent *event) override; #endif diff --git a/tests/auto/accessibility/accessibility.pro b/tests/auto/accessibility/accessibility.pro index e6b38828..dd8e60a7 100644 --- a/tests/auto/accessibility/accessibility.pro +++ b/tests/auto/accessibility/accessibility.pro @@ -2,7 +2,7 @@ CONFIG += testcase TARGET = tst_accessibility SOURCES += tst_accessibility.cpp -osx:CONFIG -= app_bundle +macos:CONFIG -= app_bundle QT += core-private gui-private qml-private quick-private quicktemplates2-private testlib diff --git a/tests/auto/applicationwindow/applicationwindow.pro b/tests/auto/applicationwindow/applicationwindow.pro index 3371a78e..f94641c7 100644 --- a/tests/auto/applicationwindow/applicationwindow.pro +++ b/tests/auto/applicationwindow/applicationwindow.pro @@ -2,7 +2,7 @@ CONFIG += testcase TARGET = tst_applicationwindow SOURCES += tst_applicationwindow.cpp -osx:CONFIG -= app_bundle +macos:CONFIG -= app_bundle QT += core-private gui-private qml-private quick-private quicktemplates2-private quickcontrols2-private testlib diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro index a9904ed3..7c6f7a16 100644 --- a/tests/auto/auto.pro +++ b/tests/auto/auto.pro @@ -6,6 +6,7 @@ SUBDIRS += \ controls \ cursor \ drawer \ + focus \ menu \ platform \ popup \ @@ -22,7 +23,3 @@ SUBDIRS += \ revisions \ sanity \ snippets - -# QTBUG-50295 -!linux: SUBDIRS += \ - focus diff --git a/tests/auto/controls/data/tst_button.qml b/tests/auto/controls/data/tst_button.qml index 67268187..dd6742ec 100644 --- a/tests/auto/controls/data/tst_button.qml +++ b/tests/auto/controls/data/tst_button.qml @@ -226,7 +226,6 @@ TestCase { var control2 = createTemporaryObject(button, testCase, {y: control1.height}) verify(control2) - waitForRendering(control2) var pressedCount2 = 0 diff --git a/tests/auto/controls/data/tst_combobox.qml b/tests/auto/controls/data/tst_combobox.qml index 05eb2de1..7789f861 100644 --- a/tests/auto/controls/data/tst_combobox.qml +++ b/tests/auto/controls/data/tst_combobox.qml @@ -695,6 +695,50 @@ TestCase { tryCompare(control.popup, "visible", false) } + function test_touch() { + var control = createTemporaryObject(comboBox, testCase, {model: 3}) + verify(control) + + var touch = touchEvent(control) + + var activatedSpy = signalSpy.createObject(control, {target: control, signalName: "activated"}) + verify(activatedSpy.valid) + + var highlightedSpy = signalSpy.createObject(control, {target: control, signalName: "highlighted"}) + verify(highlightedSpy.valid) + + touch.press(0, control).commit() + touch.release(0, control).commit() + compare(control.popup.visible, true) + + var content = control.popup.contentItem + waitForRendering(content) + + // press - move - release outside - not activated - not closed + touch.press(0, control).commit() + compare(activatedSpy.count, 0) + compare(highlightedSpy.count, 0) + touch.move(0, control, control.width * 2, control.height / 2).commit() + compare(activatedSpy.count, 0) + compare(highlightedSpy.count, 0) + touch.release(0, control, control.width * 2, control.height / 2).commit() + compare(activatedSpy.count, 0) + compare(highlightedSpy.count, 0) + compare(control.popup.visible, true) + + // press - move - release inside - activated - closed + touch.press(0, content).commit() + compare(activatedSpy.count, 0) + compare(highlightedSpy.count, 0) + touch.move(0, content, content.width / 2 + 1, content.height / 2 + 1).commit() + compare(activatedSpy.count, 0) + compare(highlightedSpy.count, 0) + touch.release(0, content).commit() + compare(activatedSpy.count, 1) + compare(highlightedSpy.count, 1) + tryCompare(control.popup, "visible", false) + } + function test_down() { var control = createTemporaryObject(comboBox, testCase, {model: 3}) verify(control) diff --git a/tests/auto/controls/data/tst_dial.qml b/tests/auto/controls/data/tst_dial.qml index 3b20e91d..3955e60d 100644 --- a/tests/auto/controls/data/tst_dial.qml +++ b/tests/auto/controls/data/tst_dial.qml @@ -350,7 +350,6 @@ TestCase { var dial2 = createTemporaryObject(dialComponent, testCase, {y: dial1.height}); verify(dial2); - waitForRendering(dial2); // press the second dial touch.stationary(0).press(2, dial2, 0, 0).commit(); diff --git a/tests/auto/controls/data/tst_rangeslider.qml b/tests/auto/controls/data/tst_rangeslider.qml index bc3ce515..3d197f83 100644 --- a/tests/auto/controls/data/tst_rangeslider.qml +++ b/tests/auto/controls/data/tst_rangeslider.qml @@ -852,7 +852,6 @@ TestCase { var control = createTemporaryObject(sliderComponent, testCase) verify(control) - waitForRendering(control) compare(control.activeFocus, false) // focus is forwarded to the first handle diff --git a/tests/auto/controls/data/tst_scrollbar.qml b/tests/auto/controls/data/tst_scrollbar.qml index 6f50fd7a..ec0be3f8 100644 --- a/tests/auto/controls/data/tst_scrollbar.qml +++ b/tests/auto/controls/data/tst_scrollbar.qml @@ -331,7 +331,6 @@ TestCase { var control2 = createTemporaryObject(scrollBar, testCase, {y: control1.height}) verify(control2) - waitForRendering(control2) var pressedCount2 = 0 var movedCount2 = 0 diff --git a/tests/auto/controls/data/tst_slider.qml b/tests/auto/controls/data/tst_slider.qml index 240f734f..826a17d2 100644 --- a/tests/auto/controls/data/tst_slider.qml +++ b/tests/auto/controls/data/tst_slider.qml @@ -426,7 +426,6 @@ TestCase { var control2 = createTemporaryObject(slider, testCase, {y: control1.height, live: false}) verify(control2) - waitForRendering(control2) var pressedCount2 = 0 var movedCount2 = 0 diff --git a/tests/auto/drawer/drawer.pro b/tests/auto/drawer/drawer.pro index e1ba0ce5..7dfc3638 100644 --- a/tests/auto/drawer/drawer.pro +++ b/tests/auto/drawer/drawer.pro @@ -2,7 +2,7 @@ CONFIG += testcase TARGET = tst_drawer SOURCES += tst_drawer.cpp -osx:CONFIG -= app_bundle +macos:CONFIG -= app_bundle QT += core-private gui-private qml-private quick-private testlib quicktemplates2-private diff --git a/tests/auto/focus/focus.pro b/tests/auto/focus/focus.pro index 790445e3..ad5a1423 100644 --- a/tests/auto/focus/focus.pro +++ b/tests/auto/focus/focus.pro @@ -1,6 +1,6 @@ CONFIG += testcase TARGET = tst_focus -osx:CONFIG -= app_bundle +macos:CONFIG -= app_bundle SOURCES += tst_focus.cpp diff --git a/tests/auto/focus/tst_focus.cpp b/tests/auto/focus/tst_focus.cpp index e423835c..3d4a8875 100644 --- a/tests/auto/focus/tst_focus.cpp +++ b/tests/auto/focus/tst_focus.cpp @@ -44,6 +44,7 @@ #include <QtQuickTemplates2/private/qquickcontrol_p.h> #include <QtGui/private/qguiapplication_p.h> #include <QtGui/qstylehints.h> +#include <QtGui/qtouchdevice.h> #include "../shared/util.h" #include "../shared/visualtestutil.h" @@ -59,6 +60,7 @@ private slots: void navigation_data(); void navigation(); + void policy_data(); void policy(); void reason_data(); @@ -122,11 +124,24 @@ void tst_focus::navigation() QGuiApplication::styleHints()->setTabFocusBehavior(Qt::TabFocusBehavior(-1)); } +void tst_focus::policy_data() +{ + QTest::addColumn<QString>("name"); + + QTest::newRow("Control") << "Control"; + QTest::newRow("ComboBox") << "ComboBox"; + QTest::newRow("Button") << "Button"; + QTest::newRow("Slider") << "Slider"; + QTest::newRow("ScrollBar") << "ScrollBar"; +} + void tst_focus::policy() { + QFETCH(QString, name); + QQmlEngine engine; QQmlComponent component(&engine); - component.setData("import QtQuick.Controls 2.1; ApplicationWindow { width: 100; height: 100; Control { anchors.fill: parent } }", QUrl()); + component.setData(QString("import QtQuick.Controls 2.1; ApplicationWindow { width: 100; height: 100; %1 { anchors.fill: parent } }").arg(name).toUtf8(), QUrl()); QScopedPointer<QQuickApplicationWindow> window(qobject_cast<QQuickApplicationWindow *>(component.create())); QVERIFY(window); @@ -141,6 +156,22 @@ void tst_focus::policy() window->requestActivate(); QVERIFY(QTest::qWaitForWindowActive(window.data())); + struct TouchDeviceDeleter + { + static inline void cleanup(QTouchDevice *device) + { + QWindowSystemInterface::unregisterTouchDevice(device); + delete device; + } + }; + + QScopedPointer<QTouchDevice, TouchDeviceDeleter> device(new QTouchDevice); + device->setType(QTouchDevice::TouchScreen); + QWindowSystemInterface::registerTouchDevice(device.data()); + + control->setFocusPolicy(Qt::NoFocus); + QCOMPARE(control->focusPolicy(), Qt::NoFocus); + // Qt::TabFocus vs. QQuickItem::activeFocusOnTab control->setActiveFocusOnTab(true); QCOMPARE(control->focusPolicy(), Qt::TabFocus); @@ -162,7 +193,8 @@ void tst_focus::policy() control->setFocus(false); QVERIFY(!control->hasActiveFocus()); - // Qt::ClickFocus + // Qt::ClickFocus (mouse) + control->setFocusPolicy(Qt::NoFocus); control->setAcceptedMouseButtons(Qt::LeftButton); QTest::mouseClick(window.data(), Qt::LeftButton, Qt::NoModifier, QPoint(control->width() / 2, control->height() / 2)); QVERIFY(!control->hasActiveFocus()); @@ -178,6 +210,24 @@ void tst_focus::policy() control->setFocus(false); QVERIFY(!control->hasActiveFocus()); + // Qt::ClickFocus (touch) + control->setFocusPolicy(Qt::NoFocus); + QTest::touchEvent(window.data(), device.data()).press(0, QPoint(control->width() / 2, control->height() / 2)); + QTest::touchEvent(window.data(), device.data()).release(0, QPoint(control->width() / 2, control->height() / 2)); + QVERIFY(!control->hasActiveFocus()); + QVERIFY(!control->hasVisualFocus()); + + control->setFocusPolicy(Qt::ClickFocus); + QCOMPARE(control->focusPolicy(), Qt::ClickFocus); + QTest::touchEvent(window.data(), device.data()).press(0, QPoint(control->width() / 2, control->height() / 2)); + QTest::touchEvent(window.data(), device.data()).release(0, QPoint(control->width() / 2, control->height() / 2)); + QVERIFY(control->hasActiveFocus()); + QVERIFY(!control->hasVisualFocus()); + + // reset + control->setFocus(false); + QVERIFY(!control->hasActiveFocus()); + // Qt::WheelFocus QWheelEvent wheelEvent(QPoint(control->width() / 2, control->height() / 2), 10, Qt::NoButton, Qt::NoModifier); QGuiApplication::sendEvent(control, &wheelEvent); diff --git a/tests/auto/menu/menu.pro b/tests/auto/menu/menu.pro index 44cbd5ed..9c9d9b48 100644 --- a/tests/auto/menu/menu.pro +++ b/tests/auto/menu/menu.pro @@ -2,7 +2,7 @@ CONFIG += testcase TARGET = tst_menu SOURCES += tst_menu.cpp -osx:CONFIG -= app_bundle +macos:CONFIG -= app_bundle QT += core-private gui-private qml-private quick-private testlib quicktemplates2-private diff --git a/tests/auto/popup/popup.pro b/tests/auto/popup/popup.pro index 9b3ee75a..c863ba07 100644 --- a/tests/auto/popup/popup.pro +++ b/tests/auto/popup/popup.pro @@ -2,7 +2,7 @@ CONFIG += testcase TARGET = tst_popup SOURCES += tst_popup.cpp -osx:CONFIG -= app_bundle +macos:CONFIG -= app_bundle QT += core-private gui-private qml-private quick-private testlib quicktemplates2-private diff --git a/tests/auto/pressandhold/pressandhold.pro b/tests/auto/pressandhold/pressandhold.pro index ca76b74a..db0d6288 100644 --- a/tests/auto/pressandhold/pressandhold.pro +++ b/tests/auto/pressandhold/pressandhold.pro @@ -3,7 +3,7 @@ TARGET = tst_pressandhold QT += quick testlib CONFIG += testcase -osx:CONFIG -= app_bundle +macos:CONFIG -= app_bundle SOURCES += \ $$PWD/tst_pressandhold.cpp diff --git a/tests/auto/qquickstyle/qquickstyle.pro b/tests/auto/qquickstyle/qquickstyle.pro index 5514685a..10ca8500 100644 --- a/tests/auto/qquickstyle/qquickstyle.pro +++ b/tests/auto/qquickstyle/qquickstyle.pro @@ -2,7 +2,7 @@ CONFIG += testcase TARGET = tst_qquickstyle SOURCES += tst_qquickstyle.cpp -osx:CONFIG -= app_bundle +macos:CONFIG -= app_bundle QT += quickcontrols2 testlib QT_PRIVATE += core-private gui-private quickcontrols2-private diff --git a/tests/auto/qquickstyleselector/qquickstyleselector.pro b/tests/auto/qquickstyleselector/qquickstyleselector.pro index 3ad4d516..6569b46d 100644 --- a/tests/auto/qquickstyleselector/qquickstyleselector.pro +++ b/tests/auto/qquickstyleselector/qquickstyleselector.pro @@ -2,7 +2,7 @@ CONFIG += testcase TARGET = tst_qquickstyleselector SOURCES += tst_qquickstyleselector.cpp -osx:CONFIG -= app_bundle +macos:CONFIG -= app_bundle QT += core-private gui-private qml-private quick-private quickcontrols2-private testlib diff --git a/tests/auto/sanity/sanity.pro b/tests/auto/sanity/sanity.pro index 3beb8fff..50030e80 100644 --- a/tests/auto/sanity/sanity.pro +++ b/tests/auto/sanity/sanity.pro @@ -3,7 +3,7 @@ TARGET = tst_sanity QT += qml testlib core-private qml-private CONFIG += testcase -osx:CONFIG -= app_bundle +macos:CONFIG -= app_bundle DEFINES += QQC2_IMPORT_PATH=\\\"$$QQC2_SOURCE_TREE/src/imports\\\" diff --git a/tests/auto/snippets/snippets.pro b/tests/auto/snippets/snippets.pro index b14ac8ea..82191220 100644 --- a/tests/auto/snippets/snippets.pro +++ b/tests/auto/snippets/snippets.pro @@ -3,7 +3,7 @@ TARGET = tst_snippets QT += quick testlib CONFIG += testcase -osx:CONFIG -= app_bundle +macos:CONFIG -= app_bundle DEFINES += QQC2_SNIPPETS_PATH=\\\"$$QQC2_SOURCE_TREE/src/imports/controls/doc/snippets\\\" diff --git a/tests/benchmarks/creationtime/creationtime.pro b/tests/benchmarks/creationtime/creationtime.pro index 17f428ad..4c11c2e6 100644 --- a/tests/benchmarks/creationtime/creationtime.pro +++ b/tests/benchmarks/creationtime/creationtime.pro @@ -3,7 +3,7 @@ TARGET = tst_creationtime QT += qml testlib CONFIG += testcase -osx:CONFIG -= app_bundle +macos:CONFIG -= app_bundle DEFINES += QQC2_IMPORT_PATH=\\\"$$QQC2_SOURCE_TREE/src/imports\\\" diff --git a/tests/benchmarks/objectcount/objectcount.pro b/tests/benchmarks/objectcount/objectcount.pro index 2cda43d5..3d7d411b 100644 --- a/tests/benchmarks/objectcount/objectcount.pro +++ b/tests/benchmarks/objectcount/objectcount.pro @@ -3,7 +3,7 @@ TARGET = tst_objectcount QT += quick testlib core-private CONFIG += testcase -osx:CONFIG -= app_bundle +macos:CONFIG -= app_bundle DEFINES += QQC2_IMPORT_PATH=\\\"$$QQC2_SOURCE_TREE/src/imports\\\" diff --git a/tests/manual/gifs/gifs.pro b/tests/manual/gifs/gifs.pro index 197b83d5..a5bb72c7 100644 --- a/tests/manual/gifs/gifs.pro +++ b/tests/manual/gifs/gifs.pro @@ -3,7 +3,7 @@ TARGET = tst_gifs QT += quick testlib CONFIG += testcase -osx:CONFIG -= app_bundle +macos:CONFIG -= app_bundle HEADERS += \ $$PWD/gifrecorder.h \ |