aboutsummaryrefslogtreecommitdiffstats
path: root/src/quicktemplates2/qquickpopup.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/quicktemplates2/qquickpopup.cpp')
-rw-r--r--src/quicktemplates2/qquickpopup.cpp37
1 files changed, 26 insertions, 11 deletions
diff --git a/src/quicktemplates2/qquickpopup.cpp b/src/quicktemplates2/qquickpopup.cpp
index f0cf1869..d108420e 100644
--- a/src/quicktemplates2/qquickpopup.cpp
+++ b/src/quicktemplates2/qquickpopup.cpp
@@ -54,7 +54,7 @@ QT_BEGIN_NAMESPACE
/*!
\qmltype Popup
\inherits QtObject
- \instantiates QQuickPopup
+//! \instantiates QQuickPopup
\inqmlmodule QtQuick.Controls
\since 5.7
\ingroup qtquickcontrols2-popups
@@ -471,6 +471,7 @@ void QQuickPopupPrivate::finalizeEnterTransition()
if (focus)
popupItem->setFocus(true);
transitionState = NoTransition;
+ getPositioner()->reposition();
emit q->openedChanged();
emit q->opened();
}
@@ -485,11 +486,18 @@ void QQuickPopupPrivate::finalizeExitTransition()
if (hadActiveFocusBeforeExitTransition && window) {
// restore focus to the next popup in chain, or to the window content if there are no other popups open
- QQuickPopup *popup = nullptr;
- if (QQuickOverlay *overlay = QQuickOverlay::overlay(window))
- popup = QQuickOverlayPrivate::get(overlay)->stackingOrderPopups().value(0);
- if (popup && popup->hasFocus()) {
- popup->forceActiveFocus();
+ QQuickPopup *nextFocusPopup = nullptr;
+ if (QQuickOverlay *overlay = QQuickOverlay::overlay(window)) {
+ const auto stackingOrderPopups = QQuickOverlayPrivate::get(overlay)->stackingOrderPopups();
+ for (auto popup : stackingOrderPopups) {
+ if (QQuickPopupPrivate::get(popup)->transitionState != ExitTransition) {
+ nextFocusPopup = popup;
+ break;
+ }
+ }
+ }
+ if (nextFocusPopup && nextFocusPopup->hasFocus()) {
+ nextFocusPopup->forceActiveFocus();
} else {
QQuickApplicationWindow *applicationWindow = qobject_cast<QQuickApplicationWindow*>(window);
if (applicationWindow)
@@ -573,7 +581,7 @@ void QQuickPopupPrivate::setBottomMargin(qreal value, bool reset)
relationship with other items.
A common use case is to center a popup within its parent. One way to do
- this is with the \l {Item::}{x} and \l {Item::}{y} properties. Anchors offer
+ this is with the \l[QtQuick]{Item::}{x} and \l[QtQuick]{Item::}{y} properties. Anchors offer
a more convenient approach:
\qml
@@ -595,7 +603,7 @@ void QQuickPopupPrivate::setBottomMargin(qreal value, bool reset)
\note Popups can only be centered within their immediate parent or
the window overlay; trying to center in other items will produce a warning.
- \sa {Popup Positioning}, {Item::anchors}
+ \sa {Popup Positioning}, {QtQuick::Item::anchors}{anchors}
*/
QQuickPopupAnchors *QQuickPopupPrivate::getAnchors()
{
@@ -2373,7 +2381,7 @@ void QQuickPopup::setFiltersChildMouseEvents(bool filter)
}
/*!
- \qmlmethod QtQuick.Controls::Popup::forceActiveFocus(reason = Qt.OtherFocusReason)
+ \qmlmethod QtQuick.Controls::Popup::forceActiveFocus(enumeration reason = Qt.OtherFocusReason)
Forces active focus on the popup with the given \a reason.
@@ -2409,6 +2417,13 @@ void QQuickPopup::componentComplete()
d->complete = true;
d->popupItem->componentComplete();
+
+ if (isVisible()) {
+ if (d->closePolicy & QQuickPopup::CloseOnEscape)
+ d->popupItem->grabShortcut();
+ else
+ d->popupItem->ungrabShortcut();
+ }
}
bool QQuickPopup::isComponentComplete() const
@@ -2683,10 +2698,10 @@ QString QQuickPopup::accessibleName() const
return d->popupItem->accessibleName();
}
-void QQuickPopup::setAccessibleName(const QString &name)
+void QQuickPopup::maybeSetAccessibleName(const QString &name)
{
Q_D(QQuickPopup);
- d->popupItem->setAccessibleName(name);
+ d->popupItem->maybeSetAccessibleName(name);
}
QVariant QQuickPopup::accessibleProperty(const char *propertyName)