diff options
author | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-02-25 14:39:59 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-02-29 14:05:29 +0000 |
commit | 9358b9f27a6f164009020923cef090c680d27c8a (patch) | |
tree | 2da0facc33ca8d8f9ec0e185b7aae0b942cf726b | |
parent | 229eb7624c650fb1b73799ebdca033efe6500fe8 (diff) |
Route overlay events to QQuickPopup::overlayEvent()
This cleans up QQuickOverlay a bit, and prepares QQuickPopup so that
it's possible for QQuickDrawer to override overlayEvent() to handle
the necessary events at the window edge, instead of overlaying the
whole window with a transparent item.
Change-Id: I6b7bf26fd99e81b61adac42ec04eb93423e36677
Task-number: QTBUG-51007
Reviewed-by: Mitch Curtis <mitch.curtis@theqtcompany.com>
-rw-r--r-- | src/templates/qquickoverlay.cpp | 68 | ||||
-rw-r--r-- | src/templates/qquickoverlay_p.h | 7 | ||||
-rw-r--r-- | src/templates/qquickpopup.cpp | 49 | ||||
-rw-r--r-- | src/templates/qquickpopup_p.h | 2 |
4 files changed, 47 insertions, 79 deletions
diff --git a/src/templates/qquickoverlay.cpp b/src/templates/qquickoverlay.cpp index b20088ba..acee3187 100644 --- a/src/templates/qquickoverlay.cpp +++ b/src/templates/qquickoverlay.cpp @@ -197,52 +197,26 @@ void QQuickOverlay::geometryChanged(const QRectF &newGeometry, const QRectF &old d->resizeBackground(); } -void QQuickOverlay::keyPressEvent(QKeyEvent *event) +bool QQuickOverlay::event(QEvent *event) { Q_D(QQuickOverlay); - event->setAccepted(d->modalPopups > 0); -} - -void QQuickOverlay::keyReleaseEvent(QKeyEvent *event) -{ - Q_D(QQuickOverlay); - event->setAccepted(d->modalPopups > 0); -} - -void QQuickOverlay::mousePressEvent(QMouseEvent *event) -{ - Q_D(QQuickOverlay); - event->setAccepted(d->modalPopups > 0); - emit pressed(); - - for (auto it = d->popups.rbegin(), end = d->popups.rend(); it != end; ++it) { - if (QQuickPopupPrivate::get(*it)->tryClose(this, event)) - break; + switch (event->type()) { + case QEvent::MouseButtonPress: + emit pressed(); + break; + case QEvent::MouseButtonRelease: + emit released(); + break; + default: + break; } -} - -void QQuickOverlay::mouseMoveEvent(QMouseEvent *event) -{ - Q_D(QQuickOverlay); - event->setAccepted(d->modalPopups > 0); -} - -void QQuickOverlay::mouseReleaseEvent(QMouseEvent *event) -{ - Q_D(QQuickOverlay); - event->setAccepted(d->modalPopups > 0); - emit released(); for (auto it = d->popups.rbegin(), end = d->popups.rend(); it != end; ++it) { - if (QQuickPopupPrivate::get(*it)->tryClose(this, event)) - break; + if ((*it)->overlayEvent(this, event)) + return true; } -} -void QQuickOverlay::wheelEvent(QWheelEvent *event) -{ - Q_D(QQuickOverlay); - event->setAccepted(d->modalPopups > 0); + return QQuickItem::event(event); } bool QQuickOverlay::childMouseEventFilter(QQuickItem *item, QEvent *event) @@ -256,26 +230,18 @@ bool QQuickOverlay::childMouseEventFilter(QQuickItem *item, QEvent *event) while (item->parentItem() != this) item = item->parentItem(); - bool modalBlocked = false; - const QQuickItemPrivate *priv = QQuickItemPrivate::get(this); - const QList<QQuickItem *> &sortedChildren = priv->paintOrderChildItems(); + const QList<QQuickItem *> sortedChildren = d->paintOrderChildItems(); for (auto it = sortedChildren.rbegin(), end = sortedChildren.rend(); it != end; ++it) { QQuickItem *popupItem = *it; if (popupItem == item) break; QQuickPopup *popup = qobject_cast<QQuickPopup *>(popupItem->parent()); - if (popup) { - QQuickPopup::ClosePolicy policy = popup->closePolicy(); - if (policy.testFlag(QQuickPopup::OnPressOutside) || policy.testFlag(QQuickPopup::OnPressOutsideParent)) - popup->close(); - - if (!modalBlocked && popup->isModal()) - modalBlocked = true; - } + if (popup && popup->overlayEvent(item, event)) + return true; } - return modalBlocked; + return false; } QT_END_NAMESPACE diff --git a/src/templates/qquickoverlay_p.h b/src/templates/qquickoverlay_p.h index f5ce54f6..33e008c5 100644 --- a/src/templates/qquickoverlay_p.h +++ b/src/templates/qquickoverlay_p.h @@ -75,12 +75,7 @@ protected: void itemChange(ItemChange change, const ItemChangeData &data) override; void geometryChanged(const QRectF &oldGeometry, const QRectF &newGeometry) 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 wheelEvent(QWheelEvent *event) override; + bool event(QEvent *event) override; bool childMouseEventFilter(QQuickItem *item, QEvent *event) override; private: diff --git a/src/templates/qquickpopup.cpp b/src/templates/qquickpopup.cpp index 8e751a39..81b4468a 100644 --- a/src/templates/qquickpopup.cpp +++ b/src/templates/qquickpopup.cpp @@ -1517,28 +1517,9 @@ bool QQuickPopup::isComponentComplete() const bool QQuickPopup::eventFilter(QObject *object, QEvent *event) { - Q_D(QQuickPopup); - Q_UNUSED(object); - switch (event->type()) { - case QEvent::MouseButtonPress: - case QEvent::MouseButtonRelease: - if (d->modal) - event->setAccepted(true); - if (QQuickWindow *window = qobject_cast<QQuickWindow *>(object)) { - if (d->tryClose(window->contentItem(), static_cast<QMouseEvent *>(event))) - return true; - } - return false; - case QEvent::KeyPress: - case QEvent::KeyRelease: - case QEvent::MouseMove: - case QEvent::Wheel: - if (d->modal) - event->setAccepted(true); - return false; - default: - return false; - } + if (QQuickWindow *window = qobject_cast<QQuickWindow *>(object)) + return overlayEvent(window->contentItem(), event); + return false; } void QQuickPopup::focusInEvent(QFocusEvent *event) @@ -1592,6 +1573,30 @@ void QQuickPopup::mouseUngrabEvent() { } +bool QQuickPopup::overlayEvent(QQuickItem *item, QEvent *event) +{ + Q_D(QQuickPopup); + switch (event->type()) { + case QEvent::KeyPress: + case QEvent::KeyRelease: + case QEvent::MouseMove: + case QEvent::Wheel: + if (d->modal) + event->accept(); + return d->modal; + + case QEvent::MouseButtonPress: + case QEvent::MouseButtonRelease: + if (d->modal) + event->accept(); + d->tryClose(item, static_cast<QMouseEvent *>(event)); + return d->modal; + + default: + return false; + } +} + void QQuickPopup::wheelEvent(QWheelEvent *event) { event->accept(); diff --git a/src/templates/qquickpopup_p.h b/src/templates/qquickpopup_p.h index 51b155f2..fe13c274 100644 --- a/src/templates/qquickpopup_p.h +++ b/src/templates/qquickpopup_p.h @@ -312,6 +312,7 @@ protected: virtual void mouseReleaseEvent(QMouseEvent *event); virtual void mouseDoubleClickEvent(QMouseEvent *event); virtual void mouseUngrabEvent(); + virtual bool overlayEvent(QQuickItem *item, QEvent *event); virtual void wheelEvent(QWheelEvent *event); virtual void contentItemChange(QQuickItem *newItem, QQuickItem *oldItem); @@ -327,6 +328,7 @@ private: Q_DISABLE_COPY(QQuickPopup) Q_DECLARE_PRIVATE(QQuickPopup) friend class QQuickPopupItem; + friend class QQuickOverlay; }; Q_DECLARE_OPERATORS_FOR_FLAGS(QQuickPopup::ClosePolicy) |