aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@theqtcompany.com>2016-02-25 14:39:59 +0100
committerJ-P Nurmi <jpnurmi@theqtcompany.com>2016-02-29 14:05:29 +0000
commit9358b9f27a6f164009020923cef090c680d27c8a (patch)
tree2da0facc33ca8d8f9ec0e185b7aae0b942cf726b
parent229eb7624c650fb1b73799ebdca033efe6500fe8 (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.cpp68
-rw-r--r--src/templates/qquickoverlay_p.h7
-rw-r--r--src/templates/qquickpopup.cpp49
-rw-r--r--src/templates/qquickpopup_p.h2
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)