diff options
Diffstat (limited to 'src/widgets/kernel/qapplication.cpp')
-rw-r--r-- | src/widgets/kernel/qapplication.cpp | 73 |
1 files changed, 48 insertions, 25 deletions
diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp index b918bdb9e9..af3d134a5a 100644 --- a/src/widgets/kernel/qapplication.cpp +++ b/src/widgets/kernel/qapplication.cpp @@ -1852,8 +1852,11 @@ bool QApplication::event(QEvent *e) if (showToolTip) { QHelpEvent e(QEvent::ToolTip, d->toolTipPos, d->toolTipGlobalPos); QApplication::sendEvent(d->toolTipWidget, &e); - if (e.isAccepted()) - d->toolTipFallAsleep.start(2000, this); + if (e.isAccepted()) { + QStyle *s = d->toolTipWidget->style(); + int sleepDelay = s->styleHint(QStyle::SH_ToolTip_FallAsleepDelay, 0, d->toolTipWidget, 0); + d->toolTipFallAsleep.start(sleepDelay, this); + } } } } else if (te->timerId() == d->toolTipFallAsleep.timerId()) { @@ -2949,12 +2952,8 @@ bool QApplication::notify(QObject *receiver, QEvent *e) QPoint relpos = mouse->pos(); if (e->spontaneous()) { - - if (e->type() == QEvent::MouseButtonPress) { - QApplicationPrivate::giveFocusAccordingToFocusPolicy(w, - Qt::ClickFocus, - Qt::MouseFocusReason); - } + if (e->type() != QEvent::MouseMove) + QApplicationPrivate::giveFocusAccordingToFocusPolicy(w, e, relpos); // ### Qt 5 These dynamic tool tips should be an OPT-IN feature. Some platforms // like Mac OS X (probably others too), can optimize their views by not @@ -2967,7 +2966,9 @@ bool QApplication::notify(QObject *receiver, QEvent *e) d->toolTipWidget = w; d->toolTipPos = relpos; d->toolTipGlobalPos = mouse->globalPos(); - d->toolTipWakeUp.start(d->toolTipFallAsleep.isActive()?20:700, this); + QStyle *s = d->toolTipWidget->style(); + int wakeDelay = s->styleHint(QStyle::SH_ToolTip_WakeUpDelay, 0, d->toolTipWidget, 0); + d->toolTipWakeUp.start(d->toolTipFallAsleep.isActive() ? 20 : wakeDelay, this); } } @@ -3042,11 +3043,8 @@ bool QApplication::notify(QObject *receiver, QEvent *e) QPoint relpos = wheel->pos(); bool eventAccepted = wheel->isAccepted(); - if (e->spontaneous()) { - QApplicationPrivate::giveFocusAccordingToFocusPolicy(w, - Qt::WheelFocus, - Qt::MouseFocusReason); - } + if (e->spontaneous()) + QApplicationPrivate::giveFocusAccordingToFocusPolicy(w, e, relpos); while (w) { QWheelEvent we(relpos, wheel->globalPos(), wheel->pixelDelta(), wheel->angleDelta(), wheel->delta(), wheel->orientation(), wheel->buttons(), @@ -3234,6 +3232,11 @@ bool QApplication::notify(QObject *receiver, QEvent *e) QTouchEvent *touchEvent = static_cast<QTouchEvent *>(e); const bool acceptTouchEvents = widget->testAttribute(Qt::WA_AcceptTouchEvents); + if (e->type() != QEvent::TouchUpdate && acceptTouchEvents && e->spontaneous()) { + const QPoint localPos = touchEvent->touchPoints()[0].pos().toPoint(); + QApplicationPrivate::giveFocusAccordingToFocusPolicy(widget, e, localPos); + } + touchEvent->setTarget(widget); touchEvent->setAccepted(acceptTouchEvents); @@ -3251,16 +3254,16 @@ bool QApplication::notify(QObject *receiver, QEvent *e) QWidget *widget = static_cast<QWidget *>(receiver); QTouchEvent *touchEvent = static_cast<QTouchEvent *>(e); bool eventAccepted = touchEvent->isAccepted(); - if (widget->testAttribute(Qt::WA_AcceptTouchEvents) && e->spontaneous()) { - // give the widget focus if the focus policy allows it - QApplicationPrivate::giveFocusAccordingToFocusPolicy(widget, - Qt::ClickFocus, - Qt::MouseFocusReason); + bool acceptTouchEvents = widget->testAttribute(Qt::WA_AcceptTouchEvents); + + if (acceptTouchEvents && e->spontaneous()) { + const QPoint localPos = touchEvent->touchPoints()[0].pos().toPoint(); + QApplicationPrivate::giveFocusAccordingToFocusPolicy(widget, e, localPos); } while (widget) { // first, try to deliver the touch event - bool acceptTouchEvents = widget->testAttribute(Qt::WA_AcceptTouchEvents); + acceptTouchEvents = widget->testAttribute(Qt::WA_AcceptTouchEvents); touchEvent->setTarget(widget); touchEvent->setAccepted(acceptTouchEvents); QPointer<QWidget> p = widget; @@ -3725,20 +3728,40 @@ bool qt_sendSpontaneousEvent(QObject *receiver, QEvent *event) return QGuiApplication::sendSpontaneousEvent(receiver, event); } - -void QApplicationPrivate::giveFocusAccordingToFocusPolicy(QWidget *widget, - Qt::FocusPolicy focusPolicy, - Qt::FocusReason focusReason) +void QApplicationPrivate::giveFocusAccordingToFocusPolicy(QWidget *widget, QEvent *event, QPoint localPos) { + const bool setFocusOnRelease = QGuiApplication::styleHints()->setFocusOnTouchRelease(); + Qt::FocusPolicy focusPolicy = Qt::ClickFocus; + + switch (event->type()) { + case QEvent::MouseButtonPress: + case QEvent::TouchBegin: + if (setFocusOnRelease) + return; + break; + case QEvent::MouseButtonRelease: + case QEvent::TouchEnd: + if (!setFocusOnRelease) + return; + break; + case QEvent::Wheel: + focusPolicy = Qt::WheelFocus; + break; + default: + return; + } + QWidget *focusWidget = widget; while (focusWidget) { if (focusWidget->isEnabled() + && focusWidget->rect().contains(localPos) && QApplicationPrivate::shouldSetFocus(focusWidget, focusPolicy)) { - focusWidget->setFocus(focusReason); + focusWidget->setFocus(Qt::MouseFocusReason); break; } if (focusWidget->isWindow()) break; + localPos += focusWidget->pos(); focusWidget = focusWidget->parentWidget(); } } |