aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2017-04-21 08:00:01 +0300
committerJ-P Nurmi <jpnurmi@qt.io>2017-04-21 08:00:01 +0300
commit284057d12fea9339744ddc646aa53cfe6c3c95a1 (patch)
tree61bb12637c56a282830d683e346057b00d332b7a
parent91b2721fdc2aba28d3c45111779fed70f7c4f87d (diff)
parentc8e9b5f25fb12c3b7983658d738165181b4d6672 (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
-rw-r--r--src/imports/controls/MenuSeparator.qml2
-rw-r--r--src/imports/controls/RoundButton.qml4
-rw-r--r--src/imports/controls/ToolSeparator.qml2
-rw-r--r--src/imports/controls/controls.pri104
-rw-r--r--src/imports/controls/controls.pro6
-rw-r--r--src/imports/controls/material/DialogButtonBox.qml5
-rw-r--r--src/imports/controls/material/ToolSeparator.qml2
-rw-r--r--src/imports/controls/material/material.pro7
-rw-r--r--src/imports/controls/material/qquickmaterialtheme.cpp18
-rw-r--r--src/imports/controls/material/qquickmaterialtheme_p.h3
-rw-r--r--src/imports/controls/universal/RadioDelegate.qml2
-rw-r--r--src/imports/controls/universal/ToolSeparator.qml2
-rw-r--r--src/imports/controls/universal/universal.pro7
-rw-r--r--src/imports/platform/qquickplatformsystemtrayicon.cpp2
-rw-r--r--src/quicktemplates2/qquickabstractbutton.cpp110
-rw-r--r--src/quicktemplates2/qquickabstractbutton_p.h5
-rw-r--r--src/quicktemplates2/qquickabstractbutton_p_p.h11
-rw-r--r--src/quicktemplates2/qquickcombobox.cpp64
-rw-r--r--src/quicktemplates2/qquickcombobox_p.h4
-rw-r--r--src/quicktemplates2/qquickcontrol.cpp117
-rw-r--r--src/quicktemplates2/qquickcontrol_p.h3
-rw-r--r--src/quicktemplates2/qquickcontrol_p_p.h7
-rw-r--r--src/quicktemplates2/qquickdial.cpp92
-rw-r--r--src/quicktemplates2/qquickdial_p.h3
-rw-r--r--src/quicktemplates2/qquickdialogbuttonbox.cpp7
-rw-r--r--src/quicktemplates2/qquickpopup.cpp10
-rw-r--r--src/quicktemplates2/qquickpopup_p.h2
-rw-r--r--src/quicktemplates2/qquickpopupitem.cpp12
-rw-r--r--src/quicktemplates2/qquickpopupitem_p_p.h2
-rw-r--r--src/quicktemplates2/qquickrangeslider.cpp95
-rw-r--r--src/quicktemplates2/qquickrangeslider_p.h3
-rw-r--r--src/quicktemplates2/qquickscrollbar.cpp78
-rw-r--r--src/quicktemplates2/qquickscrollbar_p.h5
-rw-r--r--src/quicktemplates2/qquickscrollbar_p_p.h9
-rw-r--r--src/quicktemplates2/qquickslider.cpp92
-rw-r--r--src/quicktemplates2/qquickslider_p.h3
-rw-r--r--src/quicktemplates2/qquickspinbox.cpp106
-rw-r--r--src/quicktemplates2/qquickspinbox_p.h6
-rw-r--r--tests/auto/accessibility/accessibility.pro2
-rw-r--r--tests/auto/applicationwindow/applicationwindow.pro2
-rw-r--r--tests/auto/auto.pro5
-rw-r--r--tests/auto/controls/data/tst_button.qml1
-rw-r--r--tests/auto/controls/data/tst_combobox.qml44
-rw-r--r--tests/auto/controls/data/tst_dial.qml1
-rw-r--r--tests/auto/controls/data/tst_rangeslider.qml1
-rw-r--r--tests/auto/controls/data/tst_scrollbar.qml1
-rw-r--r--tests/auto/controls/data/tst_slider.qml1
-rw-r--r--tests/auto/drawer/drawer.pro2
-rw-r--r--tests/auto/focus/focus.pro2
-rw-r--r--tests/auto/focus/tst_focus.cpp54
-rw-r--r--tests/auto/menu/menu.pro2
-rw-r--r--tests/auto/popup/popup.pro2
-rw-r--r--tests/auto/pressandhold/pressandhold.pro2
-rw-r--r--tests/auto/qquickstyle/qquickstyle.pro2
-rw-r--r--tests/auto/qquickstyleselector/qquickstyleselector.pro2
-rw-r--r--tests/auto/sanity/sanity.pro2
-rw-r--r--tests/auto/snippets/snippets.pro2
-rw-r--r--tests/benchmarks/creationtime/creationtime.pro2
-rw-r--r--tests/benchmarks/objectcount/objectcount.pro2
-rw-r--r--tests/manual/gifs/gifs.pro2
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 \