Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qquickpopup.cpp
Go to the documentation of this file.
1// Copyright (C) 2017 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qquickpopup_p.h"
5#include "qquickpopup_p_p.h"
10#include "qquickoverlay_p_p.h"
11#include "qquickcontrol_p_p.h"
12#if QT_CONFIG(quicktemplates2_container)
13#include "qquickdialog_p.h"
14#endif
15
16#include <QtCore/qloggingcategory.h>
17#include <QtQml/qqmlinfo.h>
18#include <QtQuick/qquickitem.h>
19#include <QtQuick/private/qquickaccessibleattached_p.h>
20#include <QtQuick/private/qquicktransition_p.h>
21#include <QtQuick/private/qquickitem_p.h>
22
24
25Q_LOGGING_CATEGORY(lcDimmer, "qt.quick.controls.popup.dimmer")
26Q_LOGGING_CATEGORY(lcPopup, "qt.quick.controls.popup")
27
32
375const QQuickPopup::ClosePolicy QQuickPopupPrivate::DefaultClosePolicy = QQuickPopup::CloseOnEscape | QQuickPopup::CloseOnPressOutside;
376
378 : transitionManager(this)
379{
380}
381
383{
384 Q_Q(QQuickPopup);
386 popupItem->setVisible(false);
387 q->setParentItem(qobject_cast<QQuickItem *>(parent));
391 QObject::connect(popupItem, &QQuickControl::implicitContentWidthChanged, q, &QQuickPopup::implicitContentWidthChanged);
392 QObject::connect(popupItem, &QQuickControl::implicitContentHeightChanged, q, &QQuickPopup::implicitContentHeightChanged);
393 QObject::connect(popupItem, &QQuickControl::implicitBackgroundWidthChanged, q, &QQuickPopup::implicitBackgroundWidthChanged);
394 QObject::connect(popupItem, &QQuickControl::implicitBackgroundHeightChanged, q, &QQuickPopup::implicitBackgroundHeightChanged);
395}
396
398{
399 Q_Q(QQuickPopup);
400#if QT_CONFIG(quicktemplates2_container)
401 if (QQuickDialog *dialog = qobject_cast<QQuickDialog*>(q))
402 dialog->reject();
403 else
404#endif
405 q->close();
406 touchId = -1;
407}
408
409bool QQuickPopupPrivate::tryClose(const QPointF &pos, QQuickPopup::ClosePolicy flags)
410{
411 if (!interactive)
412 return false;
413
414 static const QQuickPopup::ClosePolicy outsideFlags = QQuickPopup::CloseOnPressOutside | QQuickPopup::CloseOnReleaseOutside;
415 static const QQuickPopup::ClosePolicy outsideParentFlags = QQuickPopup::CloseOnPressOutsideParent | QQuickPopup::CloseOnReleaseOutsideParent;
416
417 const bool onOutside = closePolicy & (flags & outsideFlags);
418 const bool onOutsideParent = closePolicy & (flags & outsideParentFlags);
419
420 if ((onOutside && outsidePressed) || (onOutsideParent && outsideParentPressed)) {
422 if (!onOutsideParent || !parentItem || !parentItem->contains(parentItem->mapFromScene(pos))) {
424 return true;
425 }
426 }
427 }
428 return false;
429}
430
431bool QQuickPopupPrivate::contains(const QPointF &scenePos) const
432{
433 return popupItem->contains(popupItem->mapFromScene(scenePos));
434}
435
436#if QT_CONFIG(quicktemplates2_multitouch)
437bool QQuickPopupPrivate::acceptTouch(const QTouchEvent::TouchPoint &point)
438{
439 if (point.id() == touchId)
440 return true;
441
442 if (touchId == -1 && point.state() != QEventPoint::Released) {
443 touchId = point.id();
444 return true;
445 }
446
447 return false;
448}
449#endif
450
452{
453 // don't propagate events within the popup beyond the overlay
456 return true;
457 }
458
459 // don't block presses and releases
460 // a) outside a non-modal popup,
461 // b) to popup children/content, or
462 // b) outside a modal popups's background dimming
463 return modal && ((popupItem != item) && !popupItem->isAncestorOf(item)) && (!dimmer || dimmer->contains(dimmer->mapFromScene(point)));
464}
465
467{
468 Q_UNUSED(timestamp);
469 pressPoint = point;
470 outsidePressed = !contains(point);
472 tryClose(point, QQuickPopup::CloseOnPressOutside | QQuickPopup::CloseOnPressOutsideParent);
473 return blockInput(item, point);
474}
475
477{
478 Q_UNUSED(timestamp);
479 return blockInput(item, point);
480}
481
483{
484 Q_UNUSED(timestamp);
485 if (item != popupItem && !contains(pressPoint))
486 tryClose(point, QQuickPopup::CloseOnReleaseOutside | QQuickPopup::CloseOnReleaseOutsideParent);
488 outsidePressed = false;
489 outsideParentPressed = false;
490 touchId = -1;
491 return blockInput(item, point);
492}
493
495{
496 Q_Q(QQuickPopup);
498 if (overlay) {
500 if (p->mouseGrabberPopup == q)
501 p->mouseGrabberPopup = nullptr;
502 }
504 touchId = -1;
505}
506
508{
509 switch (event->type()) {
511 return handlePress(item, event->scenePosition(), event->timestamp());
513 return handleMove(item, event->scenePosition(), event->timestamp());
515 return handleRelease(item, event->scenePosition(), event->timestamp());
516 default:
517 Q_UNREACHABLE_RETURN(false);
518 }
519}
520
522{
523 switch (event->type()) {
527 return blockInput(item, event->scenePosition());
528 default:
529 Q_UNREACHABLE_RETURN(false);
530 }
531}
532
533#if QT_CONFIG(quicktemplates2_multitouch)
534bool QQuickPopupPrivate::handleTouchEvent(QQuickItem *item, QTouchEvent *event)
535{
536 switch (event->type()) {
539 case QEvent::TouchEnd:
540 for (const QTouchEvent::TouchPoint &point : event->points()) {
541 if (event->type() != QEvent::TouchEnd && !acceptTouch(point))
542 return blockInput(item, point.position());
543
544 switch (point.state()) {
546 return handlePress(item, item->mapToScene(point.position()), event->timestamp());
548 return handleMove(item, item->mapToScene(point.position()), event->timestamp());
550 return handleRelease(item, item->mapToScene(point.position()), event->timestamp());
551 default:
552 break;
553 }
554 }
555 break;
556
558 handleUngrab();
559 break;
560
561 default:
562 break;
563 }
564
565 return false;
566}
567#endif
568
570{
571 Q_Q(QQuickPopup);
572 if (!window) {
573 qmlWarning(q) << "cannot find any window to open popup in.";
574 return false;
575 }
576
578 return false;
579
582 const auto popupStack = QQuickOverlayPrivate::get(overlay)->stackingOrderPopups();
583 popupItem->setParentItem(overlay);
584 // if there is a stack of popups, and the current top popup item belongs to an
585 // ancestor of this popup, then make sure that this popup's item is at the top
586 // of the stack.
587 const QQuickPopup *topPopup = popupStack.isEmpty() ? nullptr : popupStack.first();
588 const QObject *ancestor = q;
589 while (ancestor && topPopup) {
590 if (ancestor == topPopup)
591 break;
592 ancestor = ancestor->parent();
593 }
594 if (topPopup && topPopup != q && ancestor) {
595 QQuickItem *topPopupItem = popupStack.first()->popupItem();
596 popupItem->stackAfter(topPopupItem);
597 // If the popup doesn't have an explicit z value set, set it to be at least as
598 // high as the current top popup item so that later opened popups are on top.
599 if (!hasZ)
600 popupItem->setZ(qMax(topPopupItem->z(), popupItem->z()));
601 }
602 if (dim)
604 showDimmer();
605 emit q->aboutToShow();
606 visible = true;
608 popupItem->setVisible(true);
609 getPositioner()->setParentItem(parentItem);
610 emit q->visibleChanged();
611
612 auto *overlayPrivate = QQuickOverlayPrivate::get(overlay);
613 if (overlayPrivate->lastActiveFocusItem.isNull())
614 overlayPrivate->lastActiveFocusItem = window->activeFocusItem();
615
616 if (focus)
618 }
619 return true;
620}
621
623{
624 Q_Q(QQuickPopup);
626 return false;
627
629
630 // We need to cache the original scale and opacity values so we can reset it after
631 // the exit transition is done so they have the original values again
634
636 // The setFocus(false) call below removes any active focus before we're
637 // able to check it in finalizeExitTransition.
639 const auto *da = QQuickItemPrivate::get(popupItem)->deliveryAgentPrivate();
640 hadActiveFocusBeforeExitTransition = popupItem->hasActiveFocus() || (da && da->focusTargetItem() == popupItem);
641 }
642
643 if (focus)
646 hideDimmer();
647 emit q->aboutToHide();
648 emit q->openedChanged();
649 }
650 return true;
651}
652
654{
655 Q_Q(QQuickPopup);
657 getPositioner()->reposition();
658 emit q->openedChanged();
659 opened();
660}
661
663{
664 Q_Q(QQuickPopup);
665 getPositioner()->setParentItem(nullptr);
666 if (popupItem) {
667 popupItem->setParentItem(nullptr);
668 popupItem->setVisible(false);
669 }
671
673 // restore focus to the next popup in chain, or to the window content if there are no other popups open
674 QQuickPopup *nextFocusPopup = nullptr;
676 const auto stackingOrderPopups = QQuickOverlayPrivate::get(overlay)->stackingOrderPopups();
677 for (auto popup : stackingOrderPopups) {
678 if (QQuickPopupPrivate::get(popup)->transitionState != ExitTransition
679 && popup->hasFocus()) {
680 nextFocusPopup = popup;
681 break;
682 }
683 }
684 }
685 if (nextFocusPopup) {
686 nextFocusPopup->forceActiveFocus(Qt::PopupFocusReason);
687 } else {
688 auto *appWindow = qobject_cast<QQuickApplicationWindow*>(window);
689 auto *contentItem = appWindow ? appWindow->contentItem() : window->contentItem();
690 auto *overlay = QQuickOverlay::overlay(window);
691 auto *overlayPrivate = QQuickOverlayPrivate::get(overlay);
692 if (!contentItem->scopedFocusItem()
693 && !overlayPrivate->lastActiveFocusItem.isNull()) {
694 overlayPrivate->lastActiveFocusItem->setFocus(true, Qt::OtherFocusReason);
695 } else {
696 contentItem->setFocus(true, Qt::PopupFocusReason);
697 }
698 overlayPrivate->lastActiveFocusItem = nullptr;
699 }
700 }
701
702 visible = false;
705 emit q->visibleChanged();
706 emit q->closed();
707 if (popupItem) {
710 }
711}
712
714{
715 Q_Q(QQuickPopup);
716 emit q->opened();
717}
718
720{
721 Q_Q(const QQuickPopup);
722 return QMarginsF(q->leftMargin(), q->topMargin(), q->rightMargin(), q->bottomMargin());
723}
724
726{
727 Q_Q(QQuickPopup);
728 qreal oldMargin = q->topMargin();
731 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
732 emit q->topMarginChanged();
735 }
736}
737
739{
740 Q_Q(QQuickPopup);
741 qreal oldMargin = q->leftMargin();
744 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
745 emit q->leftMarginChanged();
748 }
749}
750
752{
753 Q_Q(QQuickPopup);
754 qreal oldMargin = q->rightMargin();
757 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
758 emit q->rightMarginChanged();
761 }
762}
763
765{
766 Q_Q(QQuickPopup);
767 qreal oldMargin = q->bottomMargin();
770 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
771 emit q->bottomMarginChanged();
774 }
775}
776
817
825
827{
828 Q_Q(QQuickPopup);
829 if (window == newWindow)
830 return;
831
832 if (window) {
834 if (overlay)
835 QQuickOverlayPrivate::get(overlay)->removePopup(q);
836 }
837
838 window = newWindow;
839
840 if (newWindow) {
841 QQuickOverlay *overlay = QQuickOverlay::overlay(newWindow);
842 if (overlay)
843 QQuickOverlayPrivate::get(overlay)->addPopup(q);
844
846 p->resolveFont();
847 if (QQuickApplicationWindow *appWindow = qobject_cast<QQuickApplicationWindow *>(newWindow))
848 p->updateLocale(appWindow->locale(), false); // explicit=false
849 }
850
851 emit q->windowChanged(newWindow);
852
853 if (complete && visible && window)
855}
856
858{
859 Q_Q(QQuickPopup);
860 if (item == parentItem)
861 q->setParentItem(nullptr);
862}
863
865{
866 getPositioner()->reposition();
867}
868
873
875{
876 QQuickItem *item = nullptr;
877 if (component) {
878 QQmlContext *context = component->creationContext();
879 if (!context)
880 context = qmlContext(popup);
882 }
883
884 // when there is no overlay component available (with plain QQuickWindow),
885 // use a plain QQuickItem as a fallback to block hover events
886 if (!item && popup->isModal())
887 item = new QQuickItem;
888
889 if (item) {
890 item->setParentItem(parent);
891 item->stackBefore(popup->popupItem());
892 item->setZ(popup->z());
893 // needed for the virtual keyboard to set a containment mask on the dimmer item
894 qCDebug(lcDimmer) << "dimmer" << item << "registered with" << parent;
895 parent->setProperty("_q_dimmerItem", QVariant::fromValue<QQuickItem*>(item));
896 if (popup->isModal()) {
898#if QT_CONFIG(cursor)
900#endif
901#if QT_CONFIG(quicktemplates2_hover)
902 // TODO: switch to QStyleHints::useHoverEffects in Qt 5.8
904 // item->setAcceptHoverEvents(QGuiApplication::styleHints()->useHoverEffects());
905 // connect(QGuiApplication::styleHints(), &QStyleHints::useHoverEffectsChanged, item, &QQuickItem::setAcceptHoverEvents);
906#endif
907 }
908 if (component)
909 component->completeCreate();
910 }
911 qCDebug(lcDimmer) << "finished creating dimmer from component" << component
912 << "for popup" << popup << "with parent" << parent << "- item is:" << item;
913 return item;
914}
915
917{
918 Q_Q(QQuickPopup);
920 if (!overlay)
921 return;
922
923 QQmlComponent *component = nullptr;
924 QQuickOverlayAttached *overlayAttached = qobject_cast<QQuickOverlayAttached *>(qmlAttachedPropertiesObject<QQuickOverlay>(q, false));
925 if (overlayAttached)
926 component = modal ? overlayAttached->modal() : overlayAttached->modeless();
927
928 if (!component)
929 component = modal ? overlay->modal() : overlay->modeless();
930
931 if (!dimmer) {
932 dimmer = createDimmer(component, q, overlay);
933 if (!dimmer)
934 return;
935 // We cannot update explicitDimmerOpacity when dimmer's opacity changes,
936 // as it is expected to do so when we fade the dimmer in and out in
937 // show/hideDimmer, and any binding of the dimmer's opacity will be
938 // implicitly broken anyway.
940 // initially fully transparent, showDimmer fades the dimmer in.
941 dimmer->setOpacity(0);
942 if (q->isVisible())
943 showDimmer();
944 }
945 resizeDimmer();
946}
947
949{
950 if (dimmer) {
951 qCDebug(lcDimmer) << "destroying dimmer" << dimmer;
952 if (QObject *dimmerParentItem = dimmer->parentItem()) {
953 if (dimmerParentItem->property("_q_dimmerItem").value<QQuickItem*>() == dimmer)
954 dimmerParentItem->setProperty("_q_dimmerItem", QVariant());
955 }
956 dimmer->setParentItem(nullptr);
958 dimmer = nullptr;
959 }
960}
961
963{
965 if (dim)
967}
968
970{
971 // Inherit parent palette to all child objects
973
974 // Inherit parent palette to items within popup (such as headers and footers)
975 QQuickItemPrivate::get(popupItem)->updateChildrenPalettes(parentPalette);
976}
977
979{
980 // use QQmlProperty instead of QQuickItem::setOpacity() to trigger QML Behaviors
981 if (dim && dimmer)
983}
984
986{
987 // use QQmlProperty instead of QQuickItem::setOpacity() to trigger QML Behaviors
988 if (dim && dimmer)
989 QQmlProperty::write(dimmer, QStringLiteral("opacity"), 0.0);
990}
991
993{
994 if (!dimmer)
995 return;
996
998
999 qreal w = overlay ? overlay->width() : 0;
1000 qreal h = overlay ? overlay->height() : 0;
1001 dimmer->setSize(QSizeF(w, h));
1002}
1003
1008
1010{
1012 cancel();
1013
1014 if (!popup->prepareEnterTransition())
1015 return;
1016
1017 if (popup->window)
1018 transition(popup->enterActions, popup->enter, popup->q_func());
1019 else
1020 finished();
1021}
1022
1024{
1025 if (!popup->prepareExitTransition())
1026 return;
1027
1028 if (popup->window)
1029 transition(popup->exitActions, popup->exit, popup->q_func());
1030 else
1031 finished();
1032}
1033
1041
1043 : QObject(*(new QQuickPopupPrivate), parent)
1044{
1045 Q_D(QQuickPopup);
1046 d->init();
1047 // By default, allow popup to move beyond window edges
1048 d->relaxEdgeConstraint = true;
1049}
1050
1052 : QObject(dd, parent)
1053{
1054 Q_D(QQuickPopup);
1055 d->init();
1056}
1057
1058QQuickPopup::~QQuickPopup()
1059{
1060 Q_D(QQuickPopup);
1061 d->inDestructor = true;
1062
1063 QQuickItem *currentContentItem = d->popupItem->d_func()->contentItem.data();
1064 if (currentContentItem) {
1065 disconnect(currentContentItem, &QQuickItem::childrenChanged,
1067 }
1068
1069 setParentItem(nullptr);
1070
1071 // If the popup is destroyed before the exit transition finishes,
1072 // the necessary cleanup (removing modal dimmers that block mouse events,
1073 // emitting closed signal, etc.) won't happen. That's why we do it manually here.
1074 if (d->transitionState == QQuickPopupPrivate::ExitTransition && d->transitionManager.isRunning())
1075 d->finalizeExitTransition();
1076
1077 delete d->popupItem;
1078 d->popupItem = nullptr;
1079 delete d->positioner;
1080 d->positioner = nullptr;
1081}
1082
1091{
1092 setVisible(true);
1093}
1094
1103{
1104 setVisible(false);
1105}
1106
1114qreal QQuickPopup::x() const
1115{
1116 Q_D(const QQuickPopup);
1117 return d->effectiveX;
1118}
1119
1120void QQuickPopup::setX(qreal x)
1121{
1122 Q_D(QQuickPopup);
1123 setPosition(QPointF(x, d->y));
1124}
1125
1133qreal QQuickPopup::y() const
1134{
1135 Q_D(const QQuickPopup);
1136 return d->effectiveY;
1137}
1138
1139void QQuickPopup::setY(qreal y)
1140{
1141 Q_D(QQuickPopup);
1142 setPosition(QPointF(d->x, y));
1143}
1144
1145QPointF QQuickPopup::position() const
1146{
1147 Q_D(const QQuickPopup);
1148 return QPointF(d->effectiveX, d->effectiveY);
1149}
1150
1151void QQuickPopup::setPosition(const QPointF &pos)
1152{
1153 Q_D(QQuickPopup);
1154 const bool xChange = !qFuzzyCompare(d->x, pos.x());
1155 const bool yChange = !qFuzzyCompare(d->y, pos.y());
1156 if (!xChange && !yChange)
1157 return;
1158
1159 d->x = pos.x();
1160 d->y = pos.y();
1161 if (d->popupItem->isVisible()) {
1162 d->reposition();
1163 } else {
1164 if (xChange)
1165 emit xChanged();
1166 if (yChange)
1167 emit yChanged();
1168 }
1169}
1170
1188qreal QQuickPopup::z() const
1189{
1190 Q_D(const QQuickPopup);
1191 return d->popupItem->z();
1192}
1193
1194void QQuickPopup::setZ(qreal z)
1195{
1196 Q_D(QQuickPopup);
1197 d->hasZ = true;
1198 if (qFuzzyCompare(z, d->popupItem->z()))
1199 return;
1200 d->popupItem->setZ(z);
1201 emit zChanged();
1202}
1203
1204void QQuickPopup::resetZ()
1205{
1206 Q_D(QQuickPopup);
1207 setZ(0);
1208 d->hasZ = false;
1209}
1210
1217{
1218 Q_D(const QQuickPopup);
1219 return d->popupItem->width();
1220}
1221
1222void QQuickPopup::setWidth(qreal width)
1223{
1224 Q_D(QQuickPopup);
1225 d->hasWidth = true;
1226 d->popupItem->setWidth(width);
1227}
1228
1229void QQuickPopup::resetWidth()
1230{
1231 Q_D(QQuickPopup);
1232 if (!d->hasWidth)
1233 return;
1234
1235 d->hasWidth = false;
1236 d->popupItem->resetWidth();
1237 if (d->popupItem->isVisible())
1238 d->reposition();
1239}
1240
1247{
1248 Q_D(const QQuickPopup);
1249 return d->popupItem->height();
1250}
1251
1252void QQuickPopup::setHeight(qreal height)
1253{
1254 Q_D(QQuickPopup);
1255 d->hasHeight = true;
1256 d->popupItem->setHeight(height);
1257}
1258
1259void QQuickPopup::resetHeight()
1260{
1261 Q_D(QQuickPopup);
1262 if (!d->hasHeight)
1263 return;
1264
1265 d->hasHeight = false;
1266 d->popupItem->resetHeight();
1267 if (d->popupItem->isVisible())
1268 d->reposition();
1269}
1270
1277{
1278 Q_D(const QQuickPopup);
1279 return d->popupItem->implicitWidth();
1280}
1281
1282void QQuickPopup::setImplicitWidth(qreal width)
1283{
1284 Q_D(QQuickPopup);
1285 d->popupItem->setImplicitWidth(width);
1286}
1287
1294{
1295 Q_D(const QQuickPopup);
1296 return d->popupItem->implicitHeight();
1297}
1298
1299void QQuickPopup::setImplicitHeight(qreal height)
1300{
1301 Q_D(QQuickPopup);
1302 d->popupItem->setImplicitHeight(height);
1303}
1304
1316{
1317 Q_D(const QQuickPopup);
1318 return d->popupItem->contentWidth();
1319}
1320
1321void QQuickPopup::setContentWidth(qreal width)
1322{
1323 Q_D(QQuickPopup);
1324 d->popupItem->setContentWidth(width);
1325}
1326
1338{
1339 Q_D(const QQuickPopup);
1340 return d->popupItem->contentHeight();
1341}
1342
1343void QQuickPopup::setContentHeight(qreal height)
1344{
1345 Q_D(QQuickPopup);
1346 d->popupItem->setContentHeight(height);
1347}
1348
1359{
1360 Q_D(const QQuickPopup);
1361 return d->popupItem->availableWidth();
1362}
1363
1374{
1375 Q_D(const QQuickPopup);
1376 return d->popupItem->availableHeight();
1377}
1378
1392{
1393 Q_D(const QQuickPopup);
1394 return d->popupItem->spacing();
1395}
1396
1397void QQuickPopup::setSpacing(qreal spacing)
1398{
1399 Q_D(QQuickPopup);
1400 d->popupItem->setSpacing(spacing);
1401}
1402
1403void QQuickPopup::resetSpacing()
1404{
1405 setSpacing(0);
1406}
1407
1420{
1421 Q_D(const QQuickPopup);
1422 return d->margins;
1423}
1424
1425void QQuickPopup::setMargins(qreal margins)
1426{
1427 Q_D(QQuickPopup);
1428 if (qFuzzyCompare(d->margins, margins))
1429 return;
1430 QMarginsF oldMargins(leftMargin(), topMargin(), rightMargin(), bottomMargin());
1431 d->margins = margins;
1433 QMarginsF newMargins(leftMargin(), topMargin(), rightMargin(), bottomMargin());
1434 if (!qFuzzyCompare(newMargins.top(), oldMargins.top()))
1436 if (!qFuzzyCompare(newMargins.left(), oldMargins.left()))
1438 if (!qFuzzyCompare(newMargins.right(), oldMargins.right()))
1440 if (!qFuzzyCompare(newMargins.bottom(), oldMargins.bottom()))
1442 marginsChange(newMargins, oldMargins);
1443}
1444
1445void QQuickPopup::resetMargins()
1446{
1447 setMargins(-1);
1448}
1449
1462{
1463 Q_D(const QQuickPopup);
1464 if (d->hasTopMargin)
1465 return d->topMargin;
1466 return d->margins;
1467}
1468
1469void QQuickPopup::setTopMargin(qreal margin)
1470{
1471 Q_D(QQuickPopup);
1472 d->setTopMargin(margin);
1473}
1474
1475void QQuickPopup::resetTopMargin()
1476{
1477 Q_D(QQuickPopup);
1478 d->setTopMargin(-1, true);
1479}
1480
1493{
1494 Q_D(const QQuickPopup);
1495 if (d->hasLeftMargin)
1496 return d->leftMargin;
1497 return d->margins;
1498}
1499
1500void QQuickPopup::setLeftMargin(qreal margin)
1501{
1502 Q_D(QQuickPopup);
1503 d->setLeftMargin(margin);
1504}
1505
1506void QQuickPopup::resetLeftMargin()
1507{
1508 Q_D(QQuickPopup);
1509 d->setLeftMargin(-1, true);
1510}
1511
1524{
1525 Q_D(const QQuickPopup);
1526 if (d->hasRightMargin)
1527 return d->rightMargin;
1528 return d->margins;
1529}
1530
1531void QQuickPopup::setRightMargin(qreal margin)
1532{
1533 Q_D(QQuickPopup);
1534 d->setRightMargin(margin);
1535}
1536
1537void QQuickPopup::resetRightMargin()
1538{
1539 Q_D(QQuickPopup);
1540 d->setRightMargin(-1, true);
1541}
1542
1555{
1556 Q_D(const QQuickPopup);
1557 if (d->hasBottomMargin)
1558 return d->bottomMargin;
1559 return d->margins;
1560}
1561
1562void QQuickPopup::setBottomMargin(qreal margin)
1563{
1564 Q_D(QQuickPopup);
1565 d->setBottomMargin(margin);
1566}
1567
1568void QQuickPopup::resetBottomMargin()
1569{
1570 Q_D(QQuickPopup);
1571 d->setBottomMargin(-1, true);
1572}
1573
1584{
1585 Q_D(const QQuickPopup);
1586 return d->popupItem->padding();
1587}
1588
1589void QQuickPopup::setPadding(qreal padding)
1590{
1591 Q_D(QQuickPopup);
1592 d->popupItem->setPadding(padding);
1593}
1594
1595void QQuickPopup::resetPadding()
1596{
1597 Q_D(QQuickPopup);
1598 d->popupItem->resetPadding();
1599}
1600
1612{
1613 Q_D(const QQuickPopup);
1614 return d->popupItem->topPadding();
1615}
1616
1617void QQuickPopup::setTopPadding(qreal padding)
1618{
1619 Q_D(QQuickPopup);
1620 d->popupItem->setTopPadding(padding);
1621}
1622
1623void QQuickPopup::resetTopPadding()
1624{
1625 Q_D(QQuickPopup);
1626 d->popupItem->resetTopPadding();
1627}
1628
1640{
1641 Q_D(const QQuickPopup);
1642 return d->popupItem->leftPadding();
1643}
1644
1645void QQuickPopup::setLeftPadding(qreal padding)
1646{
1647 Q_D(QQuickPopup);
1648 d->popupItem->setLeftPadding(padding);
1649}
1650
1651void QQuickPopup::resetLeftPadding()
1652{
1653 Q_D(QQuickPopup);
1654 d->popupItem->resetLeftPadding();
1655}
1656
1668{
1669 Q_D(const QQuickPopup);
1670 return d->popupItem->rightPadding();
1671}
1672
1673void QQuickPopup::setRightPadding(qreal padding)
1674{
1675 Q_D(QQuickPopup);
1676 d->popupItem->setRightPadding(padding);
1677}
1678
1679void QQuickPopup::resetRightPadding()
1680{
1681 Q_D(QQuickPopup);
1682 d->popupItem->resetRightPadding();
1683}
1684
1696{
1697 Q_D(const QQuickPopup);
1698 return d->popupItem->bottomPadding();
1699}
1700
1701void QQuickPopup::setBottomPadding(qreal padding)
1702{
1703 Q_D(QQuickPopup);
1704 d->popupItem->setBottomPadding(padding);
1705}
1706
1707void QQuickPopup::resetBottomPadding()
1708{
1709 Q_D(QQuickPopup);
1710 d->popupItem->resetBottomPadding();
1711}
1712
1721{
1722 Q_D(const QQuickPopup);
1723 return d->popupItem->locale();
1724}
1725
1726void QQuickPopup::setLocale(const QLocale &locale)
1727{
1728 Q_D(QQuickPopup);
1729 d->popupItem->setLocale(locale);
1730}
1731
1732void QQuickPopup::resetLocale()
1733{
1734 Q_D(QQuickPopup);
1735 d->popupItem->resetLocale();
1736}
1737
1751bool QQuickPopup::isMirrored() const
1752{
1753 Q_D(const QQuickPopup);
1754 return d->popupItem->isMirrored();
1755}
1756
1785{
1786 Q_D(const QQuickPopup);
1787 return d->popupItem->font();
1788}
1789
1790void QQuickPopup::setFont(const QFont &font)
1791{
1792 Q_D(QQuickPopup);
1793 d->popupItem->setFont(font);
1794}
1795
1796void QQuickPopup::resetFont()
1797{
1798 Q_D(QQuickPopup);
1799 d->popupItem->resetFont();
1800}
1801
1802QQuickWindow *QQuickPopup::window() const
1803{
1804 Q_D(const QQuickPopup);
1805 return d->window;
1806}
1807
1808QQuickItem *QQuickPopup::popupItem() const
1809{
1810 Q_D(const QQuickPopup);
1811 return d->popupItem;
1812}
1813
1819QQuickItem *QQuickPopup::parentItem() const
1820{
1821 Q_D(const QQuickPopup);
1822 return d->parentItem;
1823}
1824
1825void QQuickPopup::setParentItem(QQuickItem *parent)
1826{
1827 Q_D(QQuickPopup);
1828 if (d->parentItem == parent)
1829 return;
1830
1831 if (d->parentItem) {
1832 QObjectPrivate::disconnect(d->parentItem, &QQuickItem::windowChanged, d, &QQuickPopupPrivate::setWindow);
1833 QQuickItemPrivate::get(d->parentItem)->removeItemChangeListener(d, QQuickItemPrivate::Destroyed);
1834 }
1835 d->parentItem = parent;
1836 QQuickPopupPositioner *positioner = d->getPositioner();
1837 if (positioner->parentItem())
1838 positioner->setParentItem(parent);
1839 if (parent) {
1840 QObjectPrivate::connect(parent, &QQuickItem::windowChanged, d, &QQuickPopupPrivate::setWindow);
1841 QQuickItemPrivate::get(d->parentItem)->addItemChangeListener(d, QQuickItemPrivate::Destroyed);
1842 } else if (d->inDestructor) {
1843 d->destroyDimmer();
1844 } else {
1845 // Reset transition manager state when its parent window destroyed
1846 if (!d->window && d->transitionManager.isRunning()) {
1847 if (d->transitionState == QQuickPopupPrivate::EnterTransition)
1848 d->finalizeEnterTransition();
1849 else if (d->transitionState == QQuickPopupPrivate::ExitTransition)
1850 d->finalizeExitTransition();
1851 }
1852 // NOTE: if setParentItem is called from the dtor, this bypasses virtual dispatch and calls
1853 // QQuickPopup::close() directly
1854 close();
1855 }
1856 d->setWindow(parent ? parent->window() : nullptr);
1858}
1859
1860void QQuickPopup::resetParentItem()
1861{
1862 if (QQuickWindow *window = qobject_cast<QQuickWindow *>(parent()))
1863 setParentItem(window->contentItem());
1864 else
1865 setParentItem(qobject_cast<QQuickItem *>(parent()));
1866}
1867
1886{
1887 Q_D(const QQuickPopup);
1888 return d->popupItem->background();
1889}
1890
1891void QQuickPopup::setBackground(QQuickItem *background)
1892{
1893 Q_D(QQuickPopup);
1894 // The __notCustomizable property won't be on "this" when the popup item's setBackground function
1895 // is called, so it won't warn. That's why we do a check here.
1897 d->popupItem->setBackground(background);
1898}
1899
1921{
1922 Q_D(const QQuickPopup);
1923 return d->popupItem->contentItem();
1924}
1925
1926void QQuickPopup::setContentItem(QQuickItem *item)
1927{
1928 Q_D(QQuickPopup);
1929 // See comment in setBackground for why we do this.
1931 QQuickItem *oldContentItem = d->complete ? d->popupItem->d_func()->contentItem.data()
1932 : nullptr;
1933 if (oldContentItem)
1935 d->popupItem->setContentItem(item);
1936 if (d->complete) {
1937 QQuickItem *newContentItem = d->popupItem->d_func()->contentItem.data();
1939 if (oldContentItem != newContentItem)
1941 }
1942}
1943
1958QQmlListProperty<QObject> QQuickPopupPrivate::contentData()
1959{
1961 if (!p->contentItem)
1962 p->executeContentItem();
1963 return QQmlListProperty<QObject>(popupItem->contentItem(), nullptr,
1968}
1969
1983QQmlListProperty<QQuickItem> QQuickPopupPrivate::contentChildren()
1984{
1985 return QQmlListProperty<QQuickItem>(popupItem->contentItem(), nullptr,
1990}
1991
1997bool QQuickPopup::clip() const
1998{
1999 Q_D(const QQuickPopup);
2000 return d->popupItem->clip();
2001}
2002
2003void QQuickPopup::setClip(bool clip)
2004{
2005 Q_D(QQuickPopup);
2006 if (clip == d->popupItem->clip())
2007 return;
2008 d->popupItem->setClip(clip);
2009 emit clipChanged();
2010}
2011
2024bool QQuickPopup::hasFocus() const
2025{
2026 Q_D(const QQuickPopup);
2027 return d->focus;
2028}
2029
2030void QQuickPopup::setFocus(bool focus)
2031{
2032 Q_D(QQuickPopup);
2033 if (d->focus == focus)
2034 return;
2035 d->focus = focus;
2037}
2038
2047bool QQuickPopup::hasActiveFocus() const
2048{
2049 Q_D(const QQuickPopup);
2050 return d->popupItem->hasActiveFocus();
2051}
2052
2074bool QQuickPopup::isModal() const
2075{
2076 Q_D(const QQuickPopup);
2077 return d->modal;
2078}
2079
2080void QQuickPopup::setModal(bool modal)
2081{
2082 Q_D(QQuickPopup);
2083 if (d->modal == modal)
2084 return;
2085 d->modal = modal;
2086 if (d->complete && d->visible)
2087 d->toggleOverlay();
2089
2090 QQuickItemPrivate::get(d->popupItem)->isTabFence = modal;
2091
2092 if (!d->hasDim) {
2093 setDim(modal);
2094 d->hasDim = false;
2095 }
2096}
2097
2108bool QQuickPopup::dim() const
2109{
2110 Q_D(const QQuickPopup);
2111 return d->dim;
2112}
2113
2114void QQuickPopup::setDim(bool dim)
2115{
2116 Q_D(QQuickPopup);
2117 d->hasDim = true;
2118
2119 if (d->dim == dim)
2120 return;
2121
2122 d->dim = dim;
2123 if (d->complete && d->visible)
2124 d->toggleOverlay();
2125 emit dimChanged();
2126}
2127
2128void QQuickPopup::resetDim()
2129{
2130 Q_D(QQuickPopup);
2131 if (!d->hasDim)
2132 return;
2133
2134 setDim(d->modal);
2135 d->hasDim = false;
2136}
2137
2145bool QQuickPopup::isVisible() const
2146{
2147 Q_D(const QQuickPopup);
2148 return d->visible && d->popupItem->isVisible();
2149}
2150
2151void QQuickPopup::setVisible(bool visible)
2152{
2153 Q_D(QQuickPopup);
2154 if (d->visible == visible && d->transitionState != QQuickPopupPrivate::ExitTransition)
2155 return;
2156
2157 if (!d->complete || (visible && !d->window)) {
2158 d->visible = visible;
2159 return;
2160 }
2161
2162 if (visible)
2163 d->transitionManager.transitionEnter();
2164 else
2165 d->transitionManager.transitionExit();
2166}
2167
2176bool QQuickPopup::isEnabled() const
2177{
2178 Q_D(const QQuickPopup);
2179 return d->popupItem->isEnabled();
2180}
2181
2182void QQuickPopup::setEnabled(bool enabled)
2183{
2184 Q_D(QQuickPopup);
2185 d->popupItem->setEnabled(enabled);
2186}
2187
2197bool QQuickPopup::isOpened() const
2198{
2199 Q_D(const QQuickPopup);
2200 return d->transitionState == QQuickPopupPrivate::NoTransition && isVisible();
2201}
2202
2212{
2213 Q_D(const QQuickPopup);
2214 return d->popupItem->opacity();
2215}
2216
2217void QQuickPopup::setOpacity(qreal opacity)
2218{
2219 Q_D(QQuickPopup);
2220 d->popupItem->setOpacity(opacity);
2221}
2222
2233{
2234 Q_D(const QQuickPopup);
2235 return d->popupItem->scale();
2236}
2237
2238void QQuickPopup::setScale(qreal scale)
2239{
2240 Q_D(QQuickPopup);
2241 if (qFuzzyCompare(scale, d->popupItem->scale()))
2242 return;
2243 d->popupItem->setScale(scale);
2245}
2246
2273QQuickPopup::ClosePolicy QQuickPopup::closePolicy() const
2274{
2275 Q_D(const QQuickPopup);
2276 return d->closePolicy;
2277}
2278
2279void QQuickPopup::setClosePolicy(ClosePolicy policy)
2280{
2281 Q_D(QQuickPopup);
2282 d->hasClosePolicy = true;
2283 if (d->closePolicy == policy)
2284 return;
2285 d->closePolicy = policy;
2287}
2288
2289void QQuickPopup::resetClosePolicy()
2290{
2291 Q_D(QQuickPopup);
2293 d->hasClosePolicy = false;
2294}
2295
2308QQuickPopup::TransformOrigin QQuickPopup::transformOrigin() const
2309{
2310 Q_D(const QQuickPopup);
2311 return static_cast<TransformOrigin>(d->popupItem->transformOrigin());
2312}
2313
2314void QQuickPopup::setTransformOrigin(TransformOrigin origin)
2315{
2316 Q_D(QQuickPopup);
2317 d->popupItem->setTransformOrigin(static_cast<QQuickItem::TransformOrigin>(origin));
2318}
2319
2339{
2340 Q_D(const QQuickPopup);
2341 return d->enter;
2342}
2343
2344void QQuickPopup::setEnter(QQuickTransition *transition)
2345{
2346 Q_D(QQuickPopup);
2347 if (d->enter == transition)
2348 return;
2349 d->enter = transition;
2351}
2352
2372{
2373 Q_D(const QQuickPopup);
2374 return d->exit;
2375}
2376
2377void QQuickPopup::setExit(QQuickTransition *transition)
2378{
2379 Q_D(QQuickPopup);
2380 if (d->exit == transition)
2381 return;
2382 d->exit = transition;
2383 emit exitChanged();
2384}
2385
2397qreal QQuickPopup::horizontalPadding() const
2398{
2399 Q_D(const QQuickPopup);
2400 return d->popupItem->horizontalPadding();
2401}
2402
2403void QQuickPopup::setHorizontalPadding(qreal padding)
2404{
2405 Q_D(QQuickPopup);
2406 d->popupItem->setHorizontalPadding(padding);
2407}
2408
2409void QQuickPopup::resetHorizontalPadding()
2410{
2411 Q_D(QQuickPopup);
2412 d->popupItem->resetHorizontalPadding();
2413}
2414
2426qreal QQuickPopup::verticalPadding() const
2427{
2428 Q_D(const QQuickPopup);
2429 return d->popupItem->verticalPadding();
2430}
2431
2432void QQuickPopup::setVerticalPadding(qreal padding)
2433{
2434 Q_D(QQuickPopup);
2435 d->popupItem->setVerticalPadding(padding);
2436}
2437
2438void QQuickPopup::resetVerticalPadding()
2439{
2440 Q_D(QQuickPopup);
2441 d->popupItem->resetVerticalPadding();
2442}
2443
2455qreal QQuickPopup::implicitContentWidth() const
2456{
2457 Q_D(const QQuickPopup);
2458 return d->popupItem->implicitContentWidth();
2459}
2460
2472qreal QQuickPopup::implicitContentHeight() const
2473{
2474 Q_D(const QQuickPopup);
2475 return d->popupItem->implicitContentHeight();
2476}
2477
2489qreal QQuickPopup::implicitBackgroundWidth() const
2490{
2491 Q_D(const QQuickPopup);
2492 return d->popupItem->implicitBackgroundWidth();
2493}
2494
2506qreal QQuickPopup::implicitBackgroundHeight() const
2507{
2508 Q_D(const QQuickPopup);
2509 return d->popupItem->implicitBackgroundHeight();
2510}
2511
2520qreal QQuickPopup::topInset() const
2521{
2522 Q_D(const QQuickPopup);
2523 return d->popupItem->topInset();
2524}
2525
2526void QQuickPopup::setTopInset(qreal inset)
2527{
2528 Q_D(QQuickPopup);
2529 d->popupItem->setTopInset(inset);
2530}
2531
2532void QQuickPopup::resetTopInset()
2533{
2534 Q_D(QQuickPopup);
2535 d->popupItem->resetTopInset();
2536}
2537
2546qreal QQuickPopup::leftInset() const
2547{
2548 Q_D(const QQuickPopup);
2549 return d->popupItem->leftInset();
2550}
2551
2552void QQuickPopup::setLeftInset(qreal inset)
2553{
2554 Q_D(QQuickPopup);
2555 d->popupItem->setLeftInset(inset);
2556}
2557
2558void QQuickPopup::resetLeftInset()
2559{
2560 Q_D(QQuickPopup);
2561 d->popupItem->resetLeftInset();
2562}
2563
2572qreal QQuickPopup::rightInset() const
2573{
2574 Q_D(const QQuickPopup);
2575 return d->popupItem->rightInset();
2576}
2577
2578void QQuickPopup::setRightInset(qreal inset)
2579{
2580 Q_D(QQuickPopup);
2581 d->popupItem->setRightInset(inset);
2582}
2583
2584void QQuickPopup::resetRightInset()
2585{
2586 Q_D(QQuickPopup);
2587 d->popupItem->resetRightInset();
2588}
2589
2598qreal QQuickPopup::bottomInset() const
2599{
2600 Q_D(const QQuickPopup);
2601 return d->popupItem->bottomInset();
2602}
2603
2604void QQuickPopup::setBottomInset(qreal inset)
2605{
2606 Q_D(QQuickPopup);
2607 d->popupItem->setBottomInset(inset);
2608}
2609
2610void QQuickPopup::resetBottomInset()
2611{
2612 Q_D(QQuickPopup);
2613 d->popupItem->resetBottomInset();
2614}
2615
2645bool QQuickPopup::filtersChildMouseEvents() const
2646{
2647 Q_D(const QQuickPopup);
2648 return d->popupItem->filtersChildMouseEvents();
2649}
2650
2651void QQuickPopup::setFiltersChildMouseEvents(bool filter)
2652{
2653 Q_D(QQuickPopup);
2654 d->popupItem->setFiltersChildMouseEvents(filter);
2655}
2656
2667void QQuickPopup::forceActiveFocus(Qt::FocusReason reason)
2668{
2669 Q_D(QQuickPopup);
2670 d->popupItem->forceActiveFocus(reason);
2671}
2672
2674{
2675 Q_D(QQuickPopup);
2676 d->complete = false;
2678 if (context)
2680 d->popupItem->classBegin();
2681}
2682
2684{
2685 Q_D(QQuickPopup);
2686 qCDebug(lcPopup) << "componentComplete" << this;
2687 if (!parentItem())
2688 resetParentItem();
2689
2690 if (d->visible && d->window)
2691 d->transitionManager.transitionEnter();
2692
2693 d->complete = true;
2694 d->popupItem->componentComplete();
2695
2696 if (auto currentContentItem = d->popupItem->d_func()->contentItem.data()) {
2697 connect(currentContentItem, &QQuickItem::childrenChanged,
2699 }
2700}
2701
2703{
2704 Q_D(const QQuickPopup);
2705 return d->complete;
2706}
2707
2709{
2710 Q_UNUSED(child);
2711 Q_UNUSED(event);
2712 return false;
2713}
2714
2716{
2717 event->accept();
2718}
2719
2721{
2722 event->accept();
2723}
2724
2726{
2727 Q_D(QQuickPopup);
2728 if (!hasActiveFocus())
2729 return;
2730
2731#if QT_CONFIG(shortcut)
2732 if (d->closePolicy.testFlag(QQuickPopup::CloseOnEscape)
2733 && (event->matches(QKeySequence::Cancel)
2734#if defined(Q_OS_ANDROID)
2735 || event->key() == Qt::Key_Back
2736#endif
2737 )) {
2738 event->accept();
2739 if (d->interactive)
2740 d->closeOrReject();
2741 return;
2742 }
2743#endif
2744
2745 if (hasActiveFocus() && (event->key() == Qt::Key_Tab || event->key() == Qt::Key_Backtab)) {
2746 event->accept();
2747 QQuickItemPrivate::focusNextPrev(d->popupItem, event->key() == Qt::Key_Tab);
2748 }
2749}
2750
2752{
2753 event->accept();
2754}
2755
2757{
2758 Q_D(QQuickPopup);
2759 event->setAccepted(d->handleMouseEvent(d->popupItem, event));
2760}
2761
2763{
2764 Q_D(QQuickPopup);
2765 event->setAccepted(d->handleMouseEvent(d->popupItem, event));
2766}
2767
2769{
2770 Q_D(QQuickPopup);
2771 event->setAccepted(d->handleMouseEvent(d->popupItem, event));
2772}
2773
2775{
2776 event->accept();
2777}
2778
2780{
2781 Q_D(QQuickPopup);
2782 d->handleUngrab();
2783}
2784
2786{
2787 Q_D(QQuickPopup);
2788 switch (event->type()) {
2789 case QEvent::KeyPress:
2790 case QEvent::KeyRelease:
2791 case QEvent::MouseMove:
2792 case QEvent::Wheel:
2793 if (d->modal)
2794 event->accept();
2795 return d->modal;
2796
2797#if QT_CONFIG(quicktemplates2_multitouch)
2798 case QEvent::TouchBegin:
2800 case QEvent::TouchEnd:
2801 return d->handleTouchEvent(item, static_cast<QTouchEvent *>(event));
2802#endif
2803 case QEvent::HoverEnter:
2804 case QEvent::HoverMove:
2805 case QEvent::HoverLeave:
2806 return d->handleHoverEvent(item, static_cast<QHoverEvent *>(event));
2807
2810 return d->handleMouseEvent(item, static_cast<QMouseEvent *>(event));
2811
2812 default:
2813 return false;
2814 }
2815}
2816
2817#if QT_CONFIG(quicktemplates2_multitouch)
2818void QQuickPopup::touchEvent(QTouchEvent *event)
2819{
2820 Q_D(QQuickPopup);
2821 d->handleTouchEvent(d->popupItem, event);
2822}
2823
2824void QQuickPopup::touchUngrabEvent()
2825{
2826 Q_D(QQuickPopup);
2827 d->handleUngrab();
2828}
2829#endif
2830
2831#if QT_CONFIG(wheelevent)
2832void QQuickPopup::wheelEvent(QWheelEvent *event)
2833{
2834 event->accept();
2835}
2836#endif
2837
2839{
2840 Q_UNUSED(newItem);
2841 Q_UNUSED(oldItem);
2842}
2843
2844void QQuickPopup::contentSizeChange(const QSizeF &newSize, const QSizeF &oldSize)
2845{
2846 qCDebug(lcPopup) << "contentSizeChange called on" << this << "with newSize" << newSize << "oldSize" << oldSize;
2847 if (!qFuzzyCompare(newSize.width(), oldSize.width()))
2849 if (!qFuzzyCompare(newSize.height(), oldSize.height()))
2851}
2852
2853void QQuickPopup::fontChange(const QFont &newFont, const QFont &oldFont)
2854{
2855 Q_UNUSED(newFont);
2856 Q_UNUSED(oldFont);
2857 emit fontChanged();
2858}
2859
2860void QQuickPopup::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)
2861{
2862 Q_D(QQuickPopup);
2863 qCDebug(lcPopup) << "geometryChange called on" << this << "with newGeometry" << newGeometry << "oldGeometry" << oldGeometry;
2864 d->reposition();
2865 if (!qFuzzyCompare(newGeometry.width(), oldGeometry.width())) {
2868 }
2869 if (!qFuzzyCompare(newGeometry.height(), oldGeometry.height())) {
2872 }
2873}
2874
2876{
2877 switch (change) {
2880 break;
2883 break;
2884 default:
2885 break;
2886 }
2887}
2888
2889void QQuickPopup::localeChange(const QLocale &newLocale, const QLocale &oldLocale)
2890{
2891 Q_UNUSED(newLocale);
2892 Q_UNUSED(oldLocale);
2894}
2895
2896void QQuickPopup::marginsChange(const QMarginsF &newMargins, const QMarginsF &oldMargins)
2897{
2898 Q_D(QQuickPopup);
2899 Q_UNUSED(newMargins);
2900 Q_UNUSED(oldMargins);
2901 d->reposition();
2902}
2903
2904void QQuickPopup::paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding)
2905{
2906 const bool tp = !qFuzzyCompare(newPadding.top(), oldPadding.top());
2907 const bool lp = !qFuzzyCompare(newPadding.left(), oldPadding.left());
2908 const bool rp = !qFuzzyCompare(newPadding.right(), oldPadding.right());
2909 const bool bp = !qFuzzyCompare(newPadding.bottom(), oldPadding.bottom());
2910
2911 if (tp)
2913 if (lp)
2915 if (rp)
2917 if (bp)
2919
2920 if (lp || rp) {
2921 emit horizontalPaddingChanged();
2923 }
2924 if (tp || bp) {
2925 emit verticalPaddingChanged();
2927 }
2928}
2929
2930void QQuickPopup::spacingChange(qreal newSpacing, qreal oldSpacing)
2931{
2932 Q_UNUSED(newSpacing);
2933 Q_UNUSED(oldSpacing);
2935}
2936
2937void QQuickPopup::insetChange(const QMarginsF &newInset, const QMarginsF &oldInset)
2938{
2939 if (!qFuzzyCompare(newInset.top(), oldInset.top()))
2940 emit topInsetChanged();
2941 if (!qFuzzyCompare(newInset.left(), oldInset.left()))
2942 emit leftInsetChanged();
2943 if (!qFuzzyCompare(newInset.right(), oldInset.right()))
2944 emit rightInsetChanged();
2945 if (!qFuzzyCompare(newInset.bottom(), oldInset.bottom()))
2946 emit bottomInsetChanged();
2947}
2948
2953
2954#if QT_CONFIG(accessibility)
2955QAccessible::Role QQuickPopup::effectiveAccessibleRole() const
2956{
2957 auto *attached = qmlAttachedPropertiesObject<QQuickAccessibleAttached>(this, false);
2958
2959 auto role = QAccessible::NoRole;
2960 if (auto *accessibleAttached = qobject_cast<QQuickAccessibleAttached *>(attached))
2961 role = accessibleAttached->role();
2962 if (role == QAccessible::NoRole)
2963 role = accessibleRole();
2964
2965 return role;
2966}
2967
2968QAccessible::Role QQuickPopup::accessibleRole() const
2969{
2970 return QAccessible::Dialog;
2971}
2972
2973void QQuickPopup::accessibilityActiveChanged(bool active)
2974{
2975 Q_UNUSED(active);
2976}
2977#endif
2978
2980{
2981 Q_D(const QQuickPopup);
2982 return d->popupItem->accessibleName();
2983}
2984
2986{
2987 Q_D(QQuickPopup);
2988 d->popupItem->maybeSetAccessibleName(name);
2989}
2990
2992{
2993 Q_D(const QQuickPopup);
2994 return d->popupItem->accessibleProperty(propertyName);
2995}
2996
2997bool QQuickPopup::setAccessibleProperty(const char *propertyName, const QVariant &value)
2998{
2999 Q_D(QQuickPopup);
3000 return d->popupItem->setAccessibleProperty(propertyName, value);
3001}
3002
3004
3005#include "moc_qquickpopup_p.cpp"
virtual void reject()
Hides the modal dialog and sets the result code to Rejected.
Definition qdialog.cpp:639
The QEventPoint class provides information about a point in a QPointerEvent.
Definition qeventpoint.h:20
int id
the ID number of this event point.
Definition qeventpoint.h:24
State state
the current state of the event point.
Definition qeventpoint.h:26
QPointF position
the position of this point.
Definition qeventpoint.h:35
\inmodule QtCore
Definition qcoreevent.h:45
@ KeyRelease
Definition qcoreevent.h:65
@ MouseMove
Definition qcoreevent.h:63
@ KeyPress
Definition qcoreevent.h:64
@ TouchCancel
Definition qcoreevent.h:264
@ MouseButtonPress
Definition qcoreevent.h:60
@ TouchUpdate
Definition qcoreevent.h:242
@ TouchBegin
Definition qcoreevent.h:241
@ HoverLeave
Definition qcoreevent.h:176
@ HoverEnter
Definition qcoreevent.h:175
@ HoverMove
Definition qcoreevent.h:177
@ MouseButtonRelease
Definition qcoreevent.h:61
The QFocusEvent class contains event parameters for widget focus events.
Definition qevent.h:470
\reentrant
Definition qfont.h:22
void setAcceptHoverEvents(bool enabled)
void stackBefore(const QGraphicsItem *sibling)
void setParentItem(QGraphicsItem *parent)
Sets this item's parent item to newParent.
QPointF mapToScene(const QPointF &point) const
Maps the point point, which is in this item's coordinate system, to the scene's coordinate system,...
void setAcceptedMouseButtons(Qt::MouseButtons buttons)
Sets the mouse buttons that this item accepts mouse events for.
void setCursor(const QCursor &cursor)
Sets the current cursor shape for the item to cursor.
\inmodule QtGui
Definition qevent.h:246
The QKeyEvent class describes a key event.
Definition qevent.h:424
\inmodule QtCore
Definition qmargins.h:270
\inmodule QtGui
Definition qevent.h:196
QObject * parent
Definition qobject.h:73
static QMetaObject::Connection connect(const typename QtPrivate::FunctionPointer< Func1 >::Object *sender, Func1 signal, const typename QtPrivate::FunctionPointer< Func2 >::Object *receiverPrivate, Func2 slot, Qt::ConnectionType type=Qt::AutoConnection)
Definition qobject_p.h:299
static bool disconnect(const typename QtPrivate::FunctionPointer< Func1 >::Object *sender, Func1 signal, const typename QtPrivate::FunctionPointer< Func2 >::Object *receiverPrivate, Func2 slot)
Definition qobject_p.h:328
\inmodule QtCore
Definition qobject.h:103
QObject * parent() const
Returns a pointer to the parent object.
Definition qobject.h:346
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Definition qobject.cpp:2960
bool setProperty(const char *name, const QVariant &value)
Sets the value of the object's name property to value.
void deleteLater()
\threadsafe
Definition qobject.cpp:2435
The QPalette class contains color groups for each widget state.
Definition qpalette.h:19
\inmodule QtCore\reentrant
Definition qpoint.h:217
The QQmlComponent class encapsulates a QML component definition.
The QQmlContext class defines a context within a QML engine.
Definition qqmlcontext.h:25
static void setContextForObject(QObject *, QQmlContext *)
Sets the QQmlContext for the object to context.
bool write(const QVariant &) const
Sets the property value to value.
static void warnIfCustomizationNotSupported(QObject *control, QQuickItem *item, const QString &propertyName)
static QQuickControlPrivate * get(QQuickControl *control)
QQuickItem * contentItem
void contentItemChanged()
void paddingChanged()
void backgroundChanged()
static void data_clear(QQmlListProperty< QObject > *)
static qsizetype children_count(QQmlListProperty< QQuickItem > *)
static void children_clear(QQmlListProperty< QQuickItem > *)
static qsizetype data_count(QQmlListProperty< QObject > *)
\qmlproperty list<QtObject> QtQuick::Item::data \qmldefault
static QQuickItem * children_at(QQmlListProperty< QQuickItem > *, qsizetype)
static QObject * data_at(QQmlListProperty< QObject > *, qsizetype)
static void children_append(QQmlListProperty< QQuickItem > *, QQuickItem *)
static bool focusNextPrev(QQuickItem *item, bool forward)
QQuickItemPrivate::focusNextPrev focuses the next/prev item in the tab-focus-chain.
static void data_append(QQmlListProperty< QObject > *, QObject *)
static QQuickItemPrivate * get(QQuickItem *item)
The QQuickItem class provides the most basic of all visual items in \l {Qt Quick}.
Definition qquickitem.h:63
void setOpacity(qreal)
void setFocus(bool)
void setSize(const QSizeF &size)
TransformOrigin
\variable QQuickItem::ItemChangeData::realValue The numeric value that has changed: \l {QQuickItem::o...
Definition qquickitem.h:171
void setScale(qreal)
void setParentItem(QQuickItem *parent)
qreal z
\qmlproperty real QtQuick::Item::z
Definition qquickitem.h:74
QPointF mapFromScene(const QPointF &point) const
Maps the given point in the scene's coordinate system to the equivalent point within this item's coor...
bool hasActiveFocus() const
virtual Q_INVOKABLE bool contains(const QPointF &point) const
\qmlmethod bool QtQuick::Item::contains(point point)
QQuickWindow * window() const
Returns the window in which this item is rendered.
qreal width
This property holds the width of this item.
Definition qquickitem.h:75
QQuickItem * parentItem() const
void stackAfter(const QQuickItem *)
Moves the specified sibling item to the index after this item within the list of children.
void setVisible(bool)
void childrenChanged()
qreal height
This property holds the height of this item.
Definition qquickitem.h:76
void setZ(qreal)
qreal scale
\qmlproperty real QtQuick::Item::scale This property holds the scale factor for this item.
Definition qquickitem.h:107
ItemChange
Used in conjunction with QQuickItem::itemChange() to notify the item about certain types of changes.
Definition qquickitem.h:144
@ ItemActiveFocusHasChanged
Definition qquickitem.h:151
@ ItemOpacityHasChanged
Definition qquickitem.h:150
qreal opacity
\qmlproperty real QtQuick::Item::opacity
Definition qquickitem.h:78
bool isAncestorOf(const QQuickItem *child) const
Returns true if this item is an ancestor of child (i.e., if this item is child's parent,...
static QQuickOverlayPrivate * get(QQuickOverlay *overlay)
static QQuickOverlay * overlay(QQuickWindow *window)
QQmlComponent * modeless
QQmlComponent * modal
void setParentItem(QQuickItem *parent)
QQuickItem * parentItem() const
virtual bool handlePress(QQuickItem *item, const QPointF &point, ulong timestamp)
static const QQuickPopup::ClosePolicy DefaultClosePolicy
Base type of popup-like user interface controls.
bool handleMouseEvent(QQuickItem *item, QMouseEvent *event)
TransitionState transitionState
void setTopMargin(qreal value, bool reset=false)
virtual bool handleMove(QQuickItem *item, const QPointF &point, ulong timestamp)
QList< QQuickStateAction > enterActions
virtual bool blockInput(QQuickItem *item, const QPointF &point) const
virtual bool handleRelease(QQuickItem *item, const QPointF &point, ulong timestamp)
bool tryClose(const QPointF &pos, QQuickPopup::ClosePolicy flags)
virtual void finalizeExitTransition()
QQmlListProperty< QObject > contentData()
\qmlproperty list<QtObject> QtQuick.Controls::Popup::contentData \qmldefault
virtual void opened()
QQuickItem * parentItem
void itemDestroyed(QQuickItem *item) override
QQuickTransition * enter
QQuickPopupPositioner * positioner
QPointer< QQuickWindow > window
QQuickPopup::ClosePolicy closePolicy
bool handleHoverEvent(QQuickItem *item, QHoverEvent *event)
QQuickPopupAnchors * getAnchors()
virtual void showDimmer()
QList< QQuickStateAction > exitActions
virtual void handleUngrab()
QQmlListProperty< QQuickItem > contentChildren()
\qmlproperty list<Item> QtQuick.Controls::Popup::contentChildren
void setWindow(QQuickWindow *window)
bool hadActiveFocusBeforeExitTransition
void setBottomMargin(qreal value, bool reset=false)
bool contains(const QPointF &scenePos) const
QQuickPopupAnchors * anchors
void setRightMargin(qreal value, bool reset=false)
QQuickTransition * exit
QPalette defaultPalette() const override
QMarginsF getMargins() const
QQuickPopupItem * popupItem
QQuickPopupTransitionManager transitionManager
virtual void resizeDimmer()
virtual QQuickPopupPositioner * getPositioner()
virtual void hideDimmer()
virtual bool prepareExitTransition()
virtual bool prepareEnterTransition()
static QQuickPopupPrivate * get(QQuickPopup *popup)
void setLeftMargin(qreal value, bool reset=false)
virtual void finalizeEnterTransition()
void updateContentPalettes(const QPalette &parentPalette)
QQuickPopupTransitionManager(QQuickPopupPrivate *popup)
virtual void fontChange(const QFont &newFont, const QFont &oldFont)
void widthChanged()
virtual QFont defaultFont() const
virtual void keyPressEvent(QKeyEvent *event)
void dimChanged()
void scaleChanged()
QQuickTransition * enter
void backgroundChanged()
virtual void paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding)
void bottomMarginChanged()
virtual void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)
void xChanged()
void closePolicyChanged()
qreal availableHeight
void clipChanged()
QLocale locale
void availableHeightChanged()
void parentChanged()
qreal rightPadding
virtual void contentSizeChange(const QSizeF &newSize, const QSizeF &oldSize)
bool setAccessibleProperty(const char *propertyName, const QVariant &value)
QQuickPopup(QQuickPopupPrivate &dd, QObject *parent)
virtual bool childMouseEventFilter(QQuickItem *child, QEvent *event)
void exitChanged()
void contentItemChanged()
QQuickTransition * exit
void bottomPaddingChanged()
qreal contentHeight
virtual void mousePressEvent(QMouseEvent *event)
qreal bottomMargin
virtual void localeChange(const QLocale &newLocale, const QLocale &oldLocale)
void paddingChanged()
void contentChildrenChanged()
QQuickItem * parent
void modalChanged()
void fontChanged()
void componentComplete() override
Invoked after the root component that caused this instantiation has completed construction.
void close()
\qmlmethod void QtQuick.Controls::Popup::close()
virtual void itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &data)
virtual void spacingChange(qreal newSpacing, qreal oldSpacing)
TransformOrigin transformOrigin
virtual void insetChange(const QMarginsF &newInset, const QMarginsF &oldInset)
void topMarginChanged()
void yChanged()
virtual void focusInEvent(QFocusEvent *event)
void activeFocusChanged()
ClosePolicy closePolicy
qreal leftPadding
void leftPaddingChanged()
void localeChanged()
qreal rightMargin
void heightChanged()
void enterChanged()
virtual void mouseUngrabEvent()
void leftMarginChanged()
void rightPaddingChanged()
void zChanged()
virtual void marginsChange(const QMarginsF &newMargins, const QMarginsF &oldMargins)
virtual void mouseDoubleClickEvent(QMouseEvent *event)
void availableWidthChanged()
void classBegin() override
Invoked after class creation, but before any properties have been set.
void contentWidthChanged()
void open()
\qmlmethod void QtQuick.Controls::Popup::open()
virtual void focusOutEvent(QFocusEvent *event)
void contentHeightChanged()
virtual void mouseReleaseEvent(QMouseEvent *event)
qreal implicitWidth
QQuickItem * background
qreal contentWidth
qreal availableWidth
void focusChanged()
void maybeSetAccessibleName(const QString &name)
QString accessibleName() const
virtual bool overlayEvent(QQuickItem *item, QEvent *event)
virtual void setVisible(bool visible)
void topPaddingChanged()
void marginsChanged()
virtual void keyReleaseEvent(QKeyEvent *event)
void rightMarginChanged()
void opacityChanged()
qreal implicitHeight
virtual void mouseMoveEvent(QMouseEvent *event)
bool isComponentComplete() const
qreal bottomPadding
virtual void contentItemChange(QQuickItem *newItem, QQuickItem *oldItem)
QQuickItem * contentItem
QVariant accessibleProperty(const char *propertyName)
static QPalette palette(Scope scope)
static QFont font(Scope scope)
void transition(const QList< QQuickStateAction > &, QQuickTransition *transition, QObject *defaultTarget=nullptr)
\qmltype Window \instantiates QQuickWindow \inqmlmodule QtQuick
QQuickItem * contentItem
\qmlattachedproperty Item Window::contentItem
QQuickItem * activeFocusItem
The item which currently has active focus or null if there is no item with active focus.
\inmodule QtCore\reentrant
Definition qrect.h:484
constexpr qreal height() const noexcept
Returns the height of the rectangle.
Definition qrect.h:732
constexpr qreal width() const noexcept
Returns the width of the rectangle.
Definition qrect.h:729
\inmodule QtCore
Definition qsize.h:208
constexpr qreal width() const noexcept
Returns the width.
Definition qsize.h:332
constexpr qreal height() const noexcept
Returns the height.
Definition qsize.h:335
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
The QTouchEvent class contains parameters that describe a touch event.
Definition qevent.h:917
\inmodule QtCore
Definition qvariant.h:65
#define this
Definition dialogs.cpp:9
void spacingChanged()
qreal spacing
bool focus
[0]
Combined button and popup list for selecting options.
@ AllButtons
Definition qnamespace.h:90
@ ArrowCursor
@ Key_Tab
Definition qnamespace.h:664
@ Key_Backtab
Definition qnamespace.h:665
@ Key_Back
Definition qnamespace.h:846
FocusReason
@ PopupFocusReason
@ OtherFocusReason
static void * context
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
bool qFuzzyCompare(qfloat16 p1, qfloat16 p2) noexcept
Definition qfloat16.h:333
#define Q_LOGGING_CATEGORY(name,...)
#define qCDebug(category,...)
constexpr const T & qMax(const T &a, const T &b)
Definition qminmax.h:42
n void setPosition(void) \n\
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat z
GLint GLint GLint GLint GLint x
[0]
GLfloat GLfloat GLfloat w
[0]
GLint GLsizei GLsizei height
GLenum GLenum GLsizei const GLuint GLboolean enabled
GLint GLsizei width
GLbitfield flags
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
GLuint name
GLint y
GLfloat GLfloat GLfloat GLfloat h
struct _cl_event * event
GLfixed GLfixed GLint GLint GLfixed points
GLboolean reset
GLdouble GLdouble GLdouble GLdouble q
Definition qopenglext.h:259
GLfloat GLfloat p
[1]
GLenum GLenum GLenum GLenum GLenum scale
static qreal component(const QPointF &point, unsigned int i)
QQmlContext * qmlContext(const QObject *obj)
Definition qqml.cpp:75
Q_QML_EXPORT QQmlInfo qmlWarning(const QObject *me)
QQuickItem * qobject_cast< QQuickItem * >(QObject *o)
Definition qquickitem.h:492
static QQuickItem * createDimmer(QQmlComponent *component, QQuickPopup *popup, QQuickItem *parent)
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
#define QStringLiteral(str)
#define emit
#define Q_UNUSED(x)
unsigned long ulong
Definition qtypes.h:35
double qreal
Definition qtypes.h:187
QObject::connect nullptr
myObject disconnect()
[26]
QFileDialog dialog(this)
[1]
QGraphicsItem * item
QLayoutItem * child
[0]
QSizePolicy policy
\inmodule QtQuick
Definition qquickitem.h:159