14#if QT_CONFIG(quicktemplates2_container)
15#include "qquickdialog_p.h"
18#include <QtCore/qloggingcategory.h>
19#include <QtQml/qqmlinfo.h>
20#include <QtQuick/qquickitem.h>
21#include <QtQuick/private/qquickaccessibleattached_p.h>
22#include <QtQuick/private/qquicktransition_p.h>
23#include <QtQuick/private/qquickitem_p.h>
24#include <qpa/qplatformintegration.h>
25#include <private/qguiapplication_p.h>
29Q_STATIC_LOGGING_CATEGORY(lcDimmer,
"qt.quick.controls.popup.dimmer")
30Q_STATIC_LOGGING_CATEGORY(lcQuickPopup,
"qt.quick.controls.popup")
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
453
454
455
456
457
458
461
462
463
464
465
466
469
470
471
472
473
474
477
478
479
480
481
482
484QQuickItem *QQuickPopup::findParentItem()
const
486 QObject *obj = parent();
488 QQuickItem *item = qobject_cast<QQuickItem *>(obj);
496const QQuickPopup::ClosePolicy QQuickPopupPrivate::DefaultClosePolicy = QQuickPopup::CloseOnEscape | QQuickPopup::CloseOnPressOutside;
498QQuickPopupPrivate::QQuickPopupPrivate()
499 : transitionManager(
this)
503void QQuickPopupPrivate::init()
506 popupItem =
new QQuickPopupItem(q);
507 popupItem->setVisible(
false);
508 QObject::connect(popupItem, &QQuickControl::paddingChanged, q, &QQuickPopup::paddingChanged);
509 QObject::connect(popupItem, &QQuickControl::backgroundChanged, q, &QQuickPopup::backgroundChanged);
510 QObject::connect(popupItem, &QQuickControl::contentItemChanged, q, &QQuickPopup::contentItemChanged);
511 QObject::connect(popupItem, &QQuickControl::implicitContentWidthChanged, q, &QQuickPopup::implicitContentWidthChanged);
512 QObject::connect(popupItem, &QQuickControl::implicitContentHeightChanged, q, &QQuickPopup::implicitContentHeightChanged);
513 QObject::connect(popupItem, &QQuickControl::implicitBackgroundWidthChanged, q, &QQuickPopup::implicitBackgroundWidthChanged);
514 QObject::connect(popupItem, &QQuickControl::implicitBackgroundHeightChanged, q, &QQuickPopup::implicitBackgroundHeightChanged);
515 QObject::connect(popupItem, &QQuickControl::spacingChanged, q, &QQuickPopup::spacingChanged);
516 QObject::connect(popupItem, &QQuickControl::topInsetChanged, q, &QQuickPopup::topInsetChanged);
517 QObject::connect(popupItem, &QQuickControl::bottomInsetChanged, q, &QQuickPopup::bottomInsetChanged);
518 QObject::connect(popupItem, &QQuickControl::leftInsetChanged, q, &QQuickPopup::leftInsetChanged);
519 QObject::connect(popupItem, &QQuickControl::rightInsetChanged, q, &QQuickPopup::rightInsetChanged);
522void QQuickPopupPrivate::closeOrReject()
525#if QT_CONFIG(quicktemplates2_container)
526 if (QQuickDialog *dialog = qobject_cast<QQuickDialog*>(q))
534bool QQuickPopupPrivate::tryClose(
const QPointF &pos, QQuickPopup::ClosePolicy flags)
539 static const QQuickPopup::ClosePolicy outsideFlags = QQuickPopup::CloseOnPressOutside | QQuickPopup::CloseOnReleaseOutside;
540 static const QQuickPopup::ClosePolicy outsideParentFlags = QQuickPopup::CloseOnPressOutsideParent | QQuickPopup::CloseOnReleaseOutsideParent;
542 const bool onOutside = closePolicy & (flags & outsideFlags);
543 const bool onOutsideParent = closePolicy & (flags & outsideParentFlags);
545 if ((onOutside && outsidePressed) || (onOutsideParent && outsideParentPressed)) {
546 if (!contains(pos) && (!dimmer || dimmer->contains(dimmer->mapFromScene(pos)))) {
547 if (!onOutsideParent || !parentItem || !parentItem->contains(parentItem->mapFromScene(pos))) {
556bool QQuickPopupPrivate::contains(
const QPointF &scenePos)
const
558 return popupItem->contains(popupItem->mapFromScene(scenePos));
561#if QT_CONFIG(quicktemplates2_multitouch)
562bool QQuickPopupPrivate::acceptTouch(
const QTouchEvent::TouchPoint &point)
564 if (point.id() == touchId)
567 if (touchId == -1 && point.state() != QEventPoint::Released) {
568 touchId = point.id();
576bool QQuickPopupPrivate::blockInput(QQuickItem *item,
const QPointF &point)
const
579 if (popupItem->contains(popupItem->mapFromScene(point))
580 && item == QQuickOverlay::overlay(window)) {
589 return modal && ((popupItem != item) && !popupItem->isAncestorOf(item)) && (!dimmer || dimmer->contains(dimmer->mapFromScene(point)));
592bool QQuickPopupPrivate::handlePress(QQuickItem *item,
const QPointF &point, ulong timestamp)
596 outsidePressed = !contains(point);
598 if (outsidePressed && parentItem) {
602 const QPointF globalPoint = item->mapToGlobal(point);
603 const QPointF localPoint = parentItem->mapFromGlobal(globalPoint);
604 outsideParentPressed = !parentItem->contains(localPoint);
607 tryClose(point, QQuickPopup::CloseOnPressOutside | QQuickPopup::CloseOnPressOutsideParent);
608 return blockInput(item, point);
611bool QQuickPopupPrivate::handleMove(QQuickItem *item,
const QPointF &point, ulong timestamp)
614 return blockInput(item, point);
617bool QQuickPopupPrivate::handleRelease(QQuickItem *item,
const QPointF &point, ulong timestamp)
620 if (item != popupItem && !contains(pressPoint))
621 tryClose(point, QQuickPopup::CloseOnReleaseOutside | QQuickPopup::CloseOnReleaseOutsideParent);
622 pressPoint = QPointF();
623 outsidePressed =
false;
624 outsideParentPressed =
false;
626 return blockInput(item, point);
629void QQuickPopupPrivate::handleUngrab()
632 QQuickOverlay *overlay = QQuickOverlay::overlay(window);
634 QQuickOverlayPrivate *p = QQuickOverlayPrivate::get(overlay);
635 if (p->mouseGrabberPopup == q)
636 p->mouseGrabberPopup =
nullptr;
638 pressPoint = QPointF();
642bool QQuickPopupPrivate::handleMouseEvent(QQuickItem *item, QMouseEvent *event)
644 switch (event->type()) {
645 case QEvent::MouseButtonPress:
646 return handlePress(item, event->scenePosition(), event->timestamp());
647 case QEvent::MouseMove:
648 return handleMove(item, event->scenePosition(), event->timestamp());
649 case QEvent::MouseButtonRelease:
650 return handleRelease(item, event->scenePosition(), event->timestamp());
652 Q_UNREACHABLE_RETURN(
false);
656bool QQuickPopupPrivate::handleHoverEvent(QQuickItem *item, QHoverEvent *event)
658 switch (event->type()) {
659 case QEvent::HoverEnter:
660 case QEvent::HoverMove:
661 case QEvent::HoverLeave:
662 return blockInput(item, event->scenePosition());
664 Q_UNREACHABLE_RETURN(
false);
668QMarginsF QQuickPopupPrivate::windowInsets()
const
670 Q_Q(
const QQuickPopup);
681 const auto *popupItemPrivate = QQuickControlPrivate::get(popupItem);
682 if (!usePopupWindow() || (popupItemPrivate->background.isExecuting() && popupItemPrivate->background->clip())) {
690 q->leftInset() < 0 ? -q->leftInset() : 0,
691 q->rightInset() < 0 ? -q->rightInset() : 0,
692 q->topInset() < 0 ? -q->topInset() : 0,
693 q->bottomInset() < 0 ? -q->bottomInset() : 0
697QPointF QQuickPopupPrivate::windowInsetsTopLeft()
const
699 const QMarginsF windowMargins = windowInsets();
700 return {windowMargins.left(), windowMargins.top()};
703void QQuickPopupPrivate::setEffectivePosFromWindowPos(
const QPointF &windowPos)
720 const QPointF oldEffectivePos = effectivePos;
721 effectivePos = windowPos + windowInsetsTopLeft();
722 if (!qFuzzyCompare(oldEffectivePos.x(), effectivePos.x()))
724 if (!qFuzzyCompare(oldEffectivePos.y(), effectivePos.y()))
728#if QT_CONFIG(quicktemplates2_multitouch)
729bool QQuickPopupPrivate::handleTouchEvent(QQuickItem *item, QTouchEvent *event)
731 switch (event->type()) {
732 case QEvent::TouchBegin:
733 case QEvent::TouchUpdate:
734 case QEvent::TouchEnd:
735 for (
const QTouchEvent::TouchPoint &point : event->points()) {
736 if (event->type() != QEvent::TouchEnd && !acceptTouch(point))
737 return blockInput(item, point.position());
739 switch (point.state()) {
740 case QEventPoint::Pressed:
741 return handlePress(item, item->mapToScene(point.position()), event->timestamp());
742 case QEventPoint::Updated:
743 return handleMove(item, item->mapToScene(point.position()), event->timestamp());
744 case QEventPoint::Released:
745 return handleRelease(item, item->mapToScene(point.position()), event->timestamp());
752 case QEvent::TouchCancel:
764bool QQuickPopupPrivate::prepareEnterTransition()
768 qmlWarning(q) <<
"cannot find any window to open popup in.";
772 if (transitionState == EnterTransition && transitionManager.isRunning())
775 if (transitionState != EnterTransition) {
776 const QPointer<QQuickItem> lastActiveFocusItem = window->activeFocusItem();
778 adjustPopupItemParentAndWindow();
782 emit q->aboutToShow();
783 transitionState = EnterTransition;
784 getPositioner()->setParentItem(parentItem);
785 emit q->visibleChanged();
787 if (lastActiveFocusItem) {
788 if (
auto *overlay = QQuickOverlay::overlay(window)) {
789 auto *overlayPrivate = QQuickOverlayPrivate::get(overlay);
790 if (overlayPrivate->lastActiveFocusItem.isNull() && !popupItem->isAncestorOf(lastActiveFocusItem)) {
791 overlayPrivate->lastActiveFocusItem = lastActiveFocusItem;
792 savedLastActiveFocusItem =
true;
798 popupItem->setFocus(
true, Qt::PopupFocusReason);
803bool QQuickPopupPrivate::prepareExitTransition()
806 if (transitionState == ExitTransition && transitionManager.isRunning())
813 prevScale = popupItem->scale();
814 prevOpacity = popupItem->opacity();
816 if (transitionState != ExitTransition) {
819 if (!hadActiveFocusBeforeExitTransition) {
820 const auto *da = QQuickItemPrivate::get(popupItem)->deliveryAgentPrivate();
821 hadActiveFocusBeforeExitTransition = popupItem->hasActiveFocus() || (da && da->focusTargetItem() == popupItem);
825 popupItem->setFocus(
false, Qt::PopupFocusReason);
826 transitionState = ExitTransition;
828 emit q->aboutToHide();
829 emit q->openedChanged();
834void QQuickPopupPrivate::finalizeEnterTransition()
837 transitionState = NoTransition;
839 emit q->openedChanged();
843void QQuickPopupPrivate::finalizeExitTransition()
846 getPositioner()->setParentItem(
nullptr);
848 popupItem->setParentItem(
nullptr);
849 popupItem->setVisible(
false);
853 if (
auto *overlay = QQuickOverlay::overlay(window)) {
854 auto *overlayPrivate = QQuickOverlayPrivate::get(overlay);
857 if (hadActiveFocusBeforeExitTransition) {
858 QQuickPopup *nextFocusPopup =
nullptr;
859 const auto stackingOrderPopups = overlayPrivate->stackingOrderPopups();
860 for (
auto popup : stackingOrderPopups) {
862 if (QQuickPopupPrivate::get(popup)->transitionState != ExitTransition
863 && popup->hasFocus() && !popup->hasActiveFocus()) {
864 nextFocusPopup = popup;
868 if (nextFocusPopup) {
869 nextFocusPopup->forceActiveFocus(Qt::PopupFocusReason);
871 auto *appWindow = qobject_cast<QQuickApplicationWindow*>(window);
872 auto *contentItem = appWindow ? appWindow->contentItem() : window->contentItem();
873 if (!contentItem->scopedFocusItem()
874 && !overlayPrivate->lastActiveFocusItem.isNull()) {
877 overlayPrivate->lastActiveFocusItem->forceActiveFocus(Qt::OtherFocusReason);
879 contentItem->setFocus(
true, Qt::PopupFocusReason);
885 if (savedLastActiveFocusItem)
886 overlayPrivate->lastActiveFocusItem =
nullptr;
890 adjustPopupItemParentAndWindow();
891 transitionState = NoTransition;
892 hadActiveFocusBeforeExitTransition =
false;
893 savedLastActiveFocusItem =
false;
894 emit q->visibleChanged();
896#if QT_CONFIG(accessibility)
897 const auto type = q->effectiveAccessibleRole() == QAccessible::PopupMenu
898 ? QAccessible::PopupMenuEnd
899 : QAccessible::DialogEnd;
900 QAccessibleEvent ev(q->popupItem(), type);
901 QAccessible::updateAccessibility(&ev);
904 popupItem->setScale(prevScale);
905 popupItem->setOpacity(prevOpacity);
909void QQuickPopupPrivate::opened()
913#if QT_CONFIG(accessibility)
914 const auto type = q->effectiveAccessibleRole() == QAccessible::PopupMenu
915 ? QAccessible::PopupMenuStart
916 : QAccessible::DialogStart;
917 QAccessibleEvent ev(q->popupItem(), type);
918 QAccessible::updateAccessibility(&ev);
922Qt::WindowFlags QQuickPopupPrivate::popupWindowType()
const
924 return Qt::Popup | Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint;
927QMarginsF QQuickPopupPrivate::getMargins()
const
929 Q_Q(
const QQuickPopup);
930 return QMarginsF(q->leftMargin(), q->topMargin(), q->rightMargin(), q->bottomMargin());
933void QQuickPopupPrivate::setTopMargin(qreal value,
bool reset)
936 qreal oldMargin = q->topMargin();
938 hasTopMargin = !reset;
939 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
940 emit q->topMarginChanged();
941 q->marginsChange(QMarginsF(leftMargin, topMargin, rightMargin, bottomMargin),
942 QMarginsF(leftMargin, oldMargin, rightMargin, bottomMargin));
946void QQuickPopupPrivate::setLeftMargin(qreal value,
bool reset)
949 qreal oldMargin = q->leftMargin();
951 hasLeftMargin = !reset;
952 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
953 emit q->leftMarginChanged();
954 q->marginsChange(QMarginsF(leftMargin, topMargin, rightMargin, bottomMargin),
955 QMarginsF(oldMargin, topMargin, rightMargin, bottomMargin));
959void QQuickPopupPrivate::setRightMargin(qreal value,
bool reset)
962 qreal oldMargin = q->rightMargin();
964 hasRightMargin = !reset;
965 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
966 emit q->rightMarginChanged();
967 q->marginsChange(QMarginsF(leftMargin, topMargin, rightMargin, bottomMargin),
968 QMarginsF(leftMargin, topMargin, oldMargin, bottomMargin));
972void QQuickPopupPrivate::setBottomMargin(qreal value,
bool reset)
975 qreal oldMargin = q->bottomMargin();
976 bottomMargin = value;
977 hasBottomMargin = !reset;
978 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
979 emit q->bottomMarginChanged();
980 q->marginsChange(QMarginsF(leftMargin, topMargin, rightMargin, bottomMargin),
981 QMarginsF(leftMargin, topMargin, rightMargin, oldMargin));
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018QQuickPopupAnchors *QQuickPopupPrivate::getAnchors()
1022 anchors =
new QQuickPopupAnchors(q);
1026QQuickPopupPositioner *QQuickPopupPrivate::getPositioner()
1030 positioner =
new QQuickPopupPositioner(q);
1034void QQuickPopupPrivate::setWindow(QQuickWindow *newWindow)
1037 if (window == newWindow)
1041 QQuickOverlay *overlay = QQuickOverlay::overlay(window);
1043 QQuickOverlayPrivate::get(overlay)->removePopup(q);
1048 if (!newWindow && popupItem)
1049 popupItem->setParentItem(
nullptr);
1055 QQuickOverlay *overlay = QQuickOverlay::overlay(newWindow);
1057 QQuickOverlayPrivate::get(overlay)->addPopup(q);
1059 QQuickControlPrivate *p = QQuickControlPrivate::get(popupItem);
1061 if (QQuickApplicationWindow *appWindow = qobject_cast<QQuickApplicationWindow *>(newWindow))
1062 p->updateLocale(appWindow->locale(),
false);
1065 emit q->windowChanged(newWindow);
1067 if (complete && visible && window)
1068 transitionManager.transitionEnter();
1071void QQuickPopupPrivate::itemDestroyed(QQuickItem *item)
1074 if (item == parentItem)
1075 q->setParentItem(
nullptr);
1078void QQuickPopupPrivate::reposition()
1080 getPositioner()->reposition();
1083QPalette QQuickPopupPrivate::defaultPalette()
const
1085 return QQuickTheme::palette(QQuickTheme::System);
1088QQuickPopup::PopupType QQuickPopupPrivate::resolvedPopupType()
const
1098 if (popupType == QQuickPopup::PopupType::Window
1099 || popupType == QQuickPopup::PopupType::Native) {
1100 if (QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::Capability::MultipleWindows))
1101 return QQuickPopup::PopupType::Window;
1104 return QQuickPopup::PopupType::Item;
1107bool QQuickPopupPrivate::usePopupWindow()
const
1109 return resolvedPopupType() == QQuickPopup::PopupType::Window;
1112void QQuickPopupPrivate::adjustPopupItemParentAndWindow()
1115 QQuickOverlay *overlay = QQuickOverlay::overlay(window);
1117 if (visible && popupWindowDirty) {
1118 popupItem->setParentItem(overlay);
1120 popupWindow->deleteLater();
1121 popupWindow =
nullptr;
1123 popupWindowDirty =
false;
1126 if (usePopupWindow()) {
1129 popupWindow =
new QQuickPopupWindow(q, window);
1132 const qreal initialWidth = popupItem->width() + windowInsets().left() + windowInsets().right();
1133 const qreal initialHeight = popupItem->height() + windowInsets().top() + windowInsets().bottom();
1134 popupItem->setParentItem(popupWindow->contentItem());
1135 popupWindow->resize(qCeil(initialWidth), qCeil(initialHeight));
1136 if (popupWndModality != Qt::NonModal)
1137 popupWindow->setModality(popupWndModality);
1139 popupWindow->setModality(modal ? Qt::ApplicationModal : Qt::NonModal);
1140 popupItem->resetTitle();
1141 popupWindow->setTitle(title);
1143 popupItem->setParentItem(popupWindow->contentItem());
1144 popupItem->forceActiveFocus(Qt::PopupFocusReason);
1146 if (popupWindow && popupWindow->transientParent()) {
1147 auto *transientParentPriv = QQuickWindowPrivate::get(qobject_cast<QQuickWindow *>(popupWindow->transientParent()));
1148 if (!transientParentPriv->inDestructor)
1149 popupWindow->setVisible(visible);
1153 popupItem->setParentItem(overlay);
1154 const auto popupStack = QQuickOverlayPrivate::get(overlay)->stackingOrderPopups();
1158 const QQuickPopup *topPopup = popupStack.isEmpty() ?
nullptr : popupStack.first();
1159 const QObject *ancestor = q;
1160 while (ancestor && topPopup) {
1161 if (ancestor == topPopup)
1163 ancestor = ancestor->parent();
1165 if (topPopup && topPopup != q && ancestor) {
1166 QQuickItem *topPopupItem = popupStack.first()->popupItem();
1167 popupItem->stackAfter(topPopupItem);
1171 popupItem->setZ(qMax(topPopupItem->z(), popupItem->z()));
1173 q->setModal((popupWndModality != Qt::NonModal) || modal);
1176 popupItem->setTitle(title);
1178 popupItem->setVisible(visible);
1181QQuickItem *QQuickPopupPrivate::createDimmer(QQmlComponent *component, QQuickPopup *popup, QQuickItem *parent)
const
1183 QQuickItem *item =
nullptr;
1185 QQmlContext *context = component->creationContext();
1187 context = qmlContext(popup);
1188 item = qobject_cast<QQuickItem*>(component->beginCreate(context));
1193 if (!item && popup->isModal())
1194 item =
new QQuickItem;
1197 item->setParentItem(parent);
1198 if (resolvedPopupType() != QQuickPopup::PopupType::Window)
1199 item->stackBefore(popup->popupItem());
1200 item->setZ(popup->z());
1202 qCDebug(lcDimmer) <<
"dimmer" << item <<
"registered with" << parent;
1203 parent->setProperty(
"_q_dimmerItem", QVariant::fromValue<QQuickItem*>(item));
1204 if (popup->isModal()) {
1205 item->setAcceptedMouseButtons(Qt::AllButtons);
1206#if QT_CONFIG(cursor)
1207 item->setCursor(Qt::ArrowCursor);
1209#if QT_CONFIG(quicktemplates2_hover)
1211 item->setAcceptHoverEvents(
true);
1217 component->completeCreate();
1219 qCDebug(lcDimmer) <<
"finished creating dimmer from component" << component
1220 <<
"for popup" << popup <<
"with parent" << parent <<
"- item is:" << item;
1224void QQuickPopupPrivate::createOverlay()
1227 QQuickOverlay *overlay = QQuickOverlay::overlay(window);
1231 QQmlComponent *component =
nullptr;
1232 QQuickOverlayAttached *overlayAttached = qobject_cast<QQuickOverlayAttached *>(qmlAttachedPropertiesObject<QQuickOverlay>(q,
false));
1233 if (overlayAttached)
1234 component = modal ? overlayAttached->modal() : overlayAttached->modeless();
1237 component = modal ? overlay->modal() : overlay->modeless();
1240 dimmer = createDimmer(component, q, overlay);
1247 explicitDimmerOpacity = dimmer->opacity();
1249 dimmer->setOpacity(0);
1256void QQuickPopupPrivate::destroyDimmer()
1259 qCDebug(lcDimmer) <<
"destroying dimmer" << dimmer;
1260 if (QObject *dimmerParentItem = dimmer->parentItem()) {
1261 if (dimmerParentItem->property(
"_q_dimmerItem").value<QQuickItem*>() == dimmer)
1262 dimmerParentItem->setProperty(
"_q_dimmerItem", QVariant());
1264 dimmer->setParentItem(
nullptr);
1265 dimmer->deleteLater();
1270void QQuickPopupPrivate::toggleOverlay()
1277void QQuickPopupPrivate::updateContentPalettes(
const QPalette& parentPalette)
1280 if (providesPalette())
1281 inheritPalette(parentPalette);
1283 QQuickItemPrivate::get(popupItem)->updateChildrenPalettes(parentPalette);
1286void QQuickPopupPrivate::updateChildrenPalettes(
const QPalette& parentPalette)
1288 updateContentPalettes(parentPalette);
1291void QQuickPopupPrivate::showDimmer()
1295 QQmlProperty::write(dimmer, QStringLiteral(
"opacity"), explicitDimmerOpacity);
1298void QQuickPopupPrivate::hideDimmer()
1302 QQmlProperty::write(dimmer, QStringLiteral(
"opacity"), 0.0);
1305void QQuickPopupPrivate::resizeDimmer()
1310 const QQuickOverlay *overlay = QQuickOverlay::overlay(window);
1312 qreal w = overlay ? overlay->width() : 0;
1313 qreal h = overlay ? overlay->height() : 0;
1314 dimmer->setSize(QSizeF(w, h));
1317QQuickPopupTransitionManager::QQuickPopupTransitionManager(QQuickPopupPrivate *popup)
1322void QQuickPopupTransitionManager::transitionEnter()
1324 if (popup->transitionState == QQuickPopupPrivate::ExitTransition)
1327 if (!popup->prepareEnterTransition())
1331 transition(popup->enterActions, popup->enter, popup->q_func());
1336void QQuickPopupTransitionManager::transitionExit()
1338 if (!popup->prepareExitTransition())
1342 transition(popup->exitActions, popup->exit, popup->q_func());
1347void QQuickPopupTransitionManager::finished()
1349 if (popup->transitionState == QQuickPopupPrivate::EnterTransition)
1350 popup->finalizeEnterTransition();
1351 else if (popup->transitionState == QQuickPopupPrivate::ExitTransition)
1352 popup->finalizeExitTransition();
1355QQuickPopup::QQuickPopup(QObject *parent)
1356 : QObject(*(
new QQuickPopupPrivate), parent)
1361 d->relaxEdgeConstraint =
true;
1364QQuickPopup::QQuickPopup(QQuickPopupPrivate &dd, QObject *parent)
1365 : QObject(dd, parent)
1371QQuickPopup::~QQuickPopup()
1374 d->inDestructor =
true;
1376 QQuickItem *currentContentItem = d->popupItem->d_func()->contentItem.data();
1377 if (currentContentItem) {
1378 disconnect(currentContentItem, &QQuickItem::childrenChanged,
1379 this, &QQuickPopup::contentChildrenChanged);
1382 setParentItem(
nullptr);
1387 if (d->transitionState == QQuickPopupPrivate::ExitTransition && d->transitionManager.isRunning())
1388 d->finalizeExitTransition();
1390 delete d->popupItem;
1391 d->popupItem =
nullptr;
1392 delete d->positioner;
1393 d->positioner =
nullptr;
1395 delete d->popupWindow;
1396 d->popupWindow =
nullptr;
1400
1401
1402
1403
1404
1405
1406void QQuickPopup::open()
1412
1413
1414
1415
1416
1417
1418void QQuickPopup::close()
1424
1425
1426
1427
1428
1429
1430qreal QQuickPopup::x()
const
1432 return d_func()->effectivePos.x();
1435void QQuickPopup::setX(qreal x)
1438 setPosition(QPointF(x, d->y));
1442
1443
1444
1445
1446
1447
1448qreal QQuickPopup::y()
const
1450 return d_func()->effectivePos.y();
1453void QQuickPopup::setY(qreal y)
1456 setPosition(QPointF(d->x, y));
1459QPointF QQuickPopup::position()
const
1461 return d_func()->effectivePos;
1464void QQuickPopup::setPosition(
const QPointF &pos)
1467 const bool xChange = !qFuzzyCompare(d->x, pos.x());
1468 const bool yChange = !qFuzzyCompare(d->y, pos.y());
1469 if (!xChange && !yChange)
1474 if (d->popupItem->isVisible()) {
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504qreal QQuickPopup::z()
const
1506 Q_D(
const QQuickPopup);
1507 return d->popupItem->z();
1510void QQuickPopup::setZ(qreal z)
1514 bool previousZ = d->popupWindow ? d->popupWindow->z() : d->popupItem->z();
1515 if (qFuzzyCompare(z, previousZ))
1518 d->popupWindow->setZ(z);
1520 d->popupItem->setZ(z);
1524void QQuickPopup::resetZ()
1532
1533
1534
1535
1536qreal QQuickPopup::width()
const
1538 Q_D(
const QQuickPopup);
1539 return d->popupItem->width();
1542void QQuickPopup::setWidth(qreal width)
1553 d->popupWindow->setWidth(width + d->windowInsets().left() + d->windowInsets().right());
1555 d->popupItem->setWidth(width);
1558void QQuickPopup::resetWidth()
1564 d->hasWidth =
false;
1565 d->popupItem->resetWidth();
1566 if (d->popupItem->isVisible())
1571
1572
1573
1574
1575qreal QQuickPopup::height()
const
1577 Q_D(
const QQuickPopup);
1578 return d->popupItem->height();
1581void QQuickPopup::setHeight(qreal height)
1584 d->hasHeight =
true;
1592 d->popupWindow->setHeight(height + d->windowInsets().top() + d->windowInsets().bottom());
1594 d->popupItem->setHeight(height);
1597void QQuickPopup::resetHeight()
1603 d->hasHeight =
false;
1604 d->popupItem->resetHeight();
1605 if (d->popupItem->isVisible())
1610
1611
1612
1613
1614qreal QQuickPopup::implicitWidth()
const
1616 Q_D(
const QQuickPopup);
1617 return d->popupItem->implicitWidth();
1620void QQuickPopup::setImplicitWidth(qreal width)
1623 d->popupItem->setImplicitWidth(width);
1627
1628
1629
1630
1631qreal QQuickPopup::implicitHeight()
const
1633 Q_D(
const QQuickPopup);
1634 return d->popupItem->implicitHeight();
1637void QQuickPopup::setImplicitHeight(qreal height)
1640 d->popupItem->setImplicitHeight(height);
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653qreal QQuickPopup::contentWidth()
const
1655 Q_D(
const QQuickPopup);
1656 return d->popupItem->contentWidth();
1659void QQuickPopup::setContentWidth(qreal width)
1662 d->popupItem->setContentWidth(width);
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675qreal QQuickPopup::contentHeight()
const
1677 Q_D(
const QQuickPopup);
1678 return d->popupItem->contentHeight();
1681void QQuickPopup::setContentHeight(qreal height)
1684 d->popupItem->setContentHeight(height);
1688
1689
1690
1691
1692
1693
1694
1695
1696qreal QQuickPopup::availableWidth()
const
1698 Q_D(
const QQuickPopup);
1699 return d->popupItem->availableWidth();
1703
1704
1705
1706
1707
1708
1709
1710
1711qreal QQuickPopup::availableHeight()
const
1713 Q_D(
const QQuickPopup);
1714 return d->popupItem->availableHeight();
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729qreal QQuickPopup::spacing()
const
1731 Q_D(
const QQuickPopup);
1732 return d->popupItem->spacing();
1735void QQuickPopup::setSpacing(qreal spacing)
1738 d->popupItem->setSpacing(spacing);
1741void QQuickPopup::resetSpacing()
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757qreal QQuickPopup::margins()
const
1759 Q_D(
const QQuickPopup);
1763void QQuickPopup::setMargins(qreal margins)
1766 if (qFuzzyCompare(d->margins, margins))
1768 QMarginsF oldMargins(leftMargin(), topMargin(), rightMargin(), bottomMargin());
1769 d->margins = margins;
1770 emit marginsChanged();
1771 QMarginsF newMargins(leftMargin(), topMargin(), rightMargin(), bottomMargin());
1772 if (!qFuzzyCompare(newMargins.top(), oldMargins.top()))
1773 emit topMarginChanged();
1774 if (!qFuzzyCompare(newMargins.left(), oldMargins.left()))
1775 emit leftMarginChanged();
1776 if (!qFuzzyCompare(newMargins.right(), oldMargins.right()))
1777 emit rightMarginChanged();
1778 if (!qFuzzyCompare(newMargins.bottom(), oldMargins.bottom()))
1779 emit bottomMarginChanged();
1780 marginsChange(newMargins, oldMargins);
1783void QQuickPopup::resetMargins()
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799qreal QQuickPopup::topMargin()
const
1801 Q_D(
const QQuickPopup);
1802 if (d->hasTopMargin)
1803 return d->topMargin;
1807void QQuickPopup::setTopMargin(qreal margin)
1810 d->setTopMargin(margin);
1813void QQuickPopup::resetTopMargin()
1816 d->setTopMargin(-1,
true);
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830qreal QQuickPopup::leftMargin()
const
1832 Q_D(
const QQuickPopup);
1833 if (d->hasLeftMargin)
1834 return d->leftMargin;
1838void QQuickPopup::setLeftMargin(qreal margin)
1841 d->setLeftMargin(margin);
1844void QQuickPopup::resetLeftMargin()
1847 d->setLeftMargin(-1,
true);
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861qreal QQuickPopup::rightMargin()
const
1863 Q_D(
const QQuickPopup);
1864 if (d->hasRightMargin)
1865 return d->rightMargin;
1869void QQuickPopup::setRightMargin(qreal margin)
1872 d->setRightMargin(margin);
1875void QQuickPopup::resetRightMargin()
1878 d->setRightMargin(-1,
true);
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892qreal QQuickPopup::bottomMargin()
const
1894 Q_D(
const QQuickPopup);
1895 if (d->hasBottomMargin)
1896 return d->bottomMargin;
1900void QQuickPopup::setBottomMargin(qreal margin)
1903 d->setBottomMargin(margin);
1906void QQuickPopup::resetBottomMargin()
1909 d->setBottomMargin(-1,
true);
1913
1914
1915
1916
1917
1918
1919
1920
1921qreal QQuickPopup::padding()
const
1923 Q_D(
const QQuickPopup);
1924 return d->popupItem->padding();
1927void QQuickPopup::setPadding(qreal padding)
1930 d->popupItem->setPadding(padding);
1933void QQuickPopup::resetPadding()
1936 d->popupItem->resetPadding();
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949qreal QQuickPopup::topPadding()
const
1951 Q_D(
const QQuickPopup);
1952 return d->popupItem->topPadding();
1955void QQuickPopup::setTopPadding(qreal padding)
1958 d->popupItem->setTopPadding(padding);
1961void QQuickPopup::resetTopPadding()
1964 d->popupItem->resetTopPadding();
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977qreal QQuickPopup::leftPadding()
const
1979 Q_D(
const QQuickPopup);
1980 return d->popupItem->leftPadding();
1983void QQuickPopup::setLeftPadding(qreal padding)
1986 d->popupItem->setLeftPadding(padding);
1989void QQuickPopup::resetLeftPadding()
1992 d->popupItem->resetLeftPadding();
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005qreal QQuickPopup::rightPadding()
const
2007 Q_D(
const QQuickPopup);
2008 return d->popupItem->rightPadding();
2011void QQuickPopup::setRightPadding(qreal padding)
2014 d->popupItem->setRightPadding(padding);
2017void QQuickPopup::resetRightPadding()
2020 d->popupItem->resetRightPadding();
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033qreal QQuickPopup::bottomPadding()
const
2035 Q_D(
const QQuickPopup);
2036 return d->popupItem->bottomPadding();
2039void QQuickPopup::setBottomPadding(qreal padding)
2042 d->popupItem->setBottomPadding(padding);
2045void QQuickPopup::resetBottomPadding()
2048 d->popupItem->resetBottomPadding();
2052
2053
2054
2055
2056
2057
2058QLocale QQuickPopup::locale()
const
2060 Q_D(
const QQuickPopup);
2061 return d->popupItem->locale();
2064void QQuickPopup::setLocale(
const QLocale &locale)
2067 d->popupItem->setLocale(locale);
2070void QQuickPopup::resetLocale()
2073 d->popupItem->resetLocale();
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089bool QQuickPopup::isMirrored()
const
2091 Q_D(
const QQuickPopup);
2092 return d->popupItem->isMirrored();
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122QFont QQuickPopup::font()
const
2124 Q_D(
const QQuickPopup);
2125 return d->popupItem->font();
2128void QQuickPopup::setFont(
const QFont &font)
2131 d->popupItem->setFont(font);
2134void QQuickPopup::resetFont()
2137 d->popupItem->resetFont();
2140QQuickWindow *QQuickPopup::window()
const
2142 Q_D(
const QQuickPopup);
2146QQuickItem *QQuickPopup::popupItem()
const
2148 Q_D(
const QQuickPopup);
2149 return d->popupItem;
2153
2154
2155
2156
2157QQuickItem *QQuickPopup::parentItem()
const
2159 Q_D(
const QQuickPopup);
2160 return d->parentItem;
2163void QQuickPopup::setParentItem(QQuickItem *parent)
2166 if (d->parentItem == parent)
2169 if (d->parentItem) {
2170 QObjectPrivate::disconnect(d->parentItem, &QQuickItem::windowChanged, d, &QQuickPopupPrivate::setWindow);
2171 QQuickItemPrivate::get(d->parentItem)->removeItemChangeListener(d, QQuickItemPrivate::Destroyed);
2173 d->parentItem = parent;
2174 QQuickPopupPositioner *positioner = d->getPositioner();
2175 if (positioner->parentItem())
2176 positioner->setParentItem(parent);
2178 QObjectPrivate::connect(parent, &QQuickItem::windowChanged, d, &QQuickPopupPrivate::setWindow);
2179 QQuickItemPrivate::get(d->parentItem)->addItemChangeListener(d, QQuickItemPrivate::Destroyed);
2180 }
else if (d->inDestructor) {
2184 if (!d->window && d->transitionManager.isRunning()) {
2185 if (d->transitionState == QQuickPopupPrivate::EnterTransition)
2186 d->finalizeEnterTransition();
2187 else if (d->transitionState == QQuickPopupPrivate::ExitTransition)
2188 d->finalizeExitTransition();
2194 d->setWindow(parent ? parent->window() :
nullptr);
2195 emit parentChanged();
2198void QQuickPopup::resetParentItem()
2200 if (QQuickWindow *window = qobject_cast<QQuickWindow *>(parent()))
2201 setParentItem(window->contentItem());
2203 setParentItem(findParentItem());
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223QQuickItem *QQuickPopup::background()
const
2225 Q_D(
const QQuickPopup);
2226 return d->popupItem->background();
2229void QQuickPopup::setBackground(QQuickItem *background)
2234 QQuickControlPrivate::warnIfCustomizationNotSupported(
this, background, QStringLiteral(
"background"));
2235 d->popupItem->setBackground(background);
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258QQuickItem *QQuickPopup::contentItem()
const
2260 Q_D(
const QQuickPopup);
2261 return d->popupItem->contentItem();
2264void QQuickPopup::setContentItem(QQuickItem *item)
2268 QQuickControlPrivate::warnIfCustomizationNotSupported(
this, item, QStringLiteral(
"contentItem"));
2269 QQuickItem *oldContentItem = d->complete ? d->popupItem->d_func()->contentItem.data()
2272 disconnect(oldContentItem, &QQuickItem::childrenChanged,
this, &QQuickPopup::contentChildrenChanged);
2273 d->popupItem->setContentItem(item);
2275 QQuickItem *newContentItem = d->popupItem->d_func()->contentItem.data();
2276 connect(newContentItem, &QQuickItem::childrenChanged,
this, &QQuickPopup::contentChildrenChanged);
2277 if (oldContentItem != newContentItem)
2278 emit contentChildrenChanged();
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296QQmlListProperty<QObject> QQuickPopupPrivate::contentData()
2298 QQuickControlPrivate *p = QQuickControlPrivate::get(popupItem);
2299 if (!p->contentItem)
2300 p->executeContentItem();
2301 return QQmlListProperty<QObject>(popupItem->contentItem(),
nullptr,
2302 QQuickItemPrivate::data_append,
2303 QQuickItemPrivate::data_count,
2304 QQuickItemPrivate::data_at,
2305 QQuickItemPrivate::data_clear);
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321QQmlListProperty<QQuickItem> QQuickPopupPrivate::contentChildren()
2323 return QQmlListProperty<QQuickItem>(popupItem->contentItem(),
nullptr,
2324 QQuickItemPrivate::children_append,
2325 QQuickItemPrivate::children_count,
2326 QQuickItemPrivate::children_at,
2327 QQuickItemPrivate::children_clear);
2331
2332
2333
2334
2335
2336bool QQuickPopup::clip()
const
2338 Q_D(
const QQuickPopup);
2339 return d->popupItem->clip() && !d->usePopupWindow();
2342void QQuickPopup::setClip(
bool clip)
2345 if (clip == d->popupItem->clip() || d->usePopupWindow())
2347 d->popupItem->setClip(clip);
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363bool QQuickPopup::hasFocus()
const
2365 Q_D(
const QQuickPopup);
2369void QQuickPopup::setFocus(
bool focus)
2372 if (d->focus == focus)
2375 emit focusChanged();
2379
2380
2381
2382
2383
2384
2385
2386bool QQuickPopup::hasActiveFocus()
const
2388 Q_D(
const QQuickPopup);
2389 return d->popupItem->hasActiveFocus();
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413bool QQuickPopup::isModal()
const
2415 Q_D(
const QQuickPopup);
2419void QQuickPopup::setModal(
bool modal)
2422 if (d->modal == modal)
2425 d->popupWindowDirty =
true;
2426 if (d->complete && d->visible)
2428 emit modalChanged();
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446bool QQuickPopup::dim()
const
2448 Q_D(
const QQuickPopup);
2452void QQuickPopup::setDim(
bool dim)
2461 if (d->complete && d->visible)
2466void QQuickPopup::resetDim()
2477
2478
2479
2480
2481
2482
2483bool QQuickPopup::isVisible()
const
2485 Q_D(
const QQuickPopup);
2486 return d->visible && d->popupItem->isVisible();
2489void QQuickPopup::setVisible(
bool visible)
2495 if (d->visible && visible && d->transitionState != QQuickPopupPrivate::ExitTransition)
2497 if (!d->visible && !visible)
2500 if (!d->complete || (visible && !d->window)) {
2501 d->visible = visible;
2506 d->transitionManager.transitionEnter();
2508 d->transitionManager.transitionExit();
2512
2513
2514
2515
2516
2517
2518
2519bool QQuickPopup::isEnabled()
const
2521 Q_D(
const QQuickPopup);
2522 return d->popupItem->isEnabled();
2525void QQuickPopup::setEnabled(
bool enabled)
2528 d->popupItem->setEnabled(enabled);
2532
2533
2534
2535
2536
2537
2538
2539
2540bool QQuickPopup::isOpened()
const
2542 Q_D(
const QQuickPopup);
2543 return d->transitionState == QQuickPopupPrivate::NoTransition && isVisible();
2547
2548
2549
2550
2551
2552
2553
2554qreal QQuickPopup::opacity()
const
2556 Q_D(
const QQuickPopup);
2557 return d->popupItem->opacity();
2560void QQuickPopup::setOpacity(qreal opacity)
2563 d->popupItem->setOpacity(opacity);
2567
2568
2569
2570
2571
2572
2573
2574
2575qreal QQuickPopup::scale()
const
2577 Q_D(
const QQuickPopup);
2578 return d->popupItem->scale();
2581void QQuickPopup::setScale(qreal scale)
2584 if (qFuzzyCompare(scale, d->popupItem->scale()))
2586 d->popupItem->setScale(scale);
2587 emit scaleChanged();
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616QQuickPopup::ClosePolicy QQuickPopup::closePolicy()
const
2618 Q_D(
const QQuickPopup);
2619 return d->closePolicy;
2622void QQuickPopup::setClosePolicy(ClosePolicy policy)
2625 d->hasClosePolicy =
true;
2626 if (d->closePolicy == policy)
2628 d->closePolicy = policy;
2629 emit closePolicyChanged();
2632void QQuickPopup::resetClosePolicy()
2635 setClosePolicy(QQuickPopupPrivate::DefaultClosePolicy);
2636 d->hasClosePolicy =
false;
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651QQuickPopup::TransformOrigin QQuickPopup::transformOrigin()
const
2653 Q_D(
const QQuickPopup);
2654 return static_cast<TransformOrigin>(d->popupItem->transformOrigin());
2657void QQuickPopup::setTransformOrigin(TransformOrigin origin)
2660 d->popupItem->setTransformOrigin(
static_cast<QQuickItem::TransformOrigin>(origin));
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681QQuickTransition *QQuickPopup::enter()
const
2683 Q_D(
const QQuickPopup);
2687void QQuickPopup::setEnter(QQuickTransition *transition)
2690 if (d->enter == transition)
2692 d->enter = transition;
2693 emit enterChanged();
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714QQuickTransition *QQuickPopup::exit()
const
2716 Q_D(
const QQuickPopup);
2720void QQuickPopup::setExit(QQuickTransition *transition)
2723 if (d->exit == transition)
2725 d->exit = transition;
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740qreal QQuickPopup::horizontalPadding()
const
2742 Q_D(
const QQuickPopup);
2743 return d->popupItem->horizontalPadding();
2746void QQuickPopup::setHorizontalPadding(qreal padding)
2749 d->popupItem->setHorizontalPadding(padding);
2752void QQuickPopup::resetHorizontalPadding()
2755 d->popupItem->resetHorizontalPadding();
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769qreal QQuickPopup::verticalPadding()
const
2771 Q_D(
const QQuickPopup);
2772 return d->popupItem->verticalPadding();
2775void QQuickPopup::setVerticalPadding(qreal padding)
2778 d->popupItem->setVerticalPadding(padding);
2781void QQuickPopup::resetVerticalPadding()
2784 d->popupItem->resetVerticalPadding();
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798qreal QQuickPopup::implicitContentWidth()
const
2800 Q_D(
const QQuickPopup);
2801 return d->popupItem->implicitContentWidth();
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815qreal QQuickPopup::implicitContentHeight()
const
2817 Q_D(
const QQuickPopup);
2818 return d->popupItem->implicitContentHeight();
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832qreal QQuickPopup::implicitBackgroundWidth()
const
2834 Q_D(
const QQuickPopup);
2835 return d->popupItem->implicitBackgroundWidth();
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849qreal QQuickPopup::implicitBackgroundHeight()
const
2851 Q_D(
const QQuickPopup);
2852 return d->popupItem->implicitBackgroundHeight();
2856
2857
2858
2859
2860
2861
2862
2863qreal QQuickPopup::topInset()
const
2865 Q_D(
const QQuickPopup);
2866 return d->popupItem->topInset();
2869void QQuickPopup::setTopInset(qreal inset)
2872 d->popupItem->setTopInset(inset);
2875void QQuickPopup::resetTopInset()
2878 d->popupItem->resetTopInset();
2882
2883
2884
2885
2886
2887
2888
2889qreal QQuickPopup::leftInset()
const
2891 Q_D(
const QQuickPopup);
2892 return d->popupItem->leftInset();
2895void QQuickPopup::setLeftInset(qreal inset)
2898 d->popupItem->setLeftInset(inset);
2901void QQuickPopup::resetLeftInset()
2904 d->popupItem->resetLeftInset();
2908
2909
2910
2911
2912
2913
2914
2915qreal QQuickPopup::rightInset()
const
2917 Q_D(
const QQuickPopup);
2918 return d->popupItem->rightInset();
2921void QQuickPopup::setRightInset(qreal inset)
2924 d->popupItem->setRightInset(inset);
2927void QQuickPopup::resetRightInset()
2930 d->popupItem->resetRightInset();
2934
2935
2936
2937
2938
2939
2940
2941qreal QQuickPopup::bottomInset()
const
2943 Q_D(
const QQuickPopup);
2944 return d->popupItem->bottomInset();
2947void QQuickPopup::setBottomInset(qreal inset)
2950 d->popupItem->setBottomInset(inset);
2953void QQuickPopup::resetBottomInset()
2956 d->popupItem->resetBottomInset();
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003QQuickPopup::PopupType QQuickPopup::popupType()
const
3005 Q_D(
const QQuickPopup);
3006 return d->popupType;
3009void QQuickPopup::setPopupType(PopupType popupType)
3012 if (d->popupType == popupType)
3015 d->popupType = popupType;
3017 emit popupTypeChanged();
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3050bool QQuickPopup::filtersChildMouseEvents()
const
3052 Q_D(
const QQuickPopup);
3053 return d->popupItem->filtersChildMouseEvents();
3056void QQuickPopup::setFiltersChildMouseEvents(
bool filter)
3059 d->popupItem->setFiltersChildMouseEvents(filter);
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072void QQuickPopup::forceActiveFocus(Qt::FocusReason reason)
3075 d->popupItem->forceActiveFocus(reason);
3078void QQuickPopup::classBegin()
3081 d->complete =
false;
3082 QQmlContext *context = qmlContext(
this);
3084 QQmlEngine::setContextForObject(d->popupItem, context);
3085 d->popupItem->classBegin();
3088void QQuickPopup::componentComplete()
3091 qCDebug(lcQuickPopup) <<
"componentComplete" <<
this;
3095 if (d->visible && d->window)
3096 d->transitionManager.transitionEnter();
3099 d->popupItem->setObjectName(QQmlMetaType::prettyTypeName(
this));
3100 d->popupItem->componentComplete();
3102 if (
auto currentContentItem = d->popupItem->d_func()->contentItem.data()) {
3103 connect(currentContentItem, &QQuickItem::childrenChanged,
3104 this, &QQuickPopup::contentChildrenChanged);
3108bool QQuickPopup::isComponentComplete()
const
3110 Q_D(
const QQuickPopup);
3114bool QQuickPopup::childMouseEventFilter(QQuickItem *child, QEvent *event)
3121void QQuickPopup::focusInEvent(QFocusEvent *event)
3126void QQuickPopup::focusOutEvent(QFocusEvent *event)
3131void QQuickPopup::keyPressEvent(QKeyEvent *event)
3134 if (!hasActiveFocus())
3137#if QT_CONFIG(shortcut)
3138 if (d->closePolicy.testFlag(QQuickPopup::CloseOnEscape)
3139 && (event->matches(QKeySequence::Cancel)
3140#if defined(Q_OS_ANDROID)
3141 || event->key() == Qt::Key_Back
3151 if (hasActiveFocus() && (event->key() == Qt::Key_Tab || event->key() == Qt::Key_Backtab)) {
3153 QQuickItemPrivate::focusNextPrev(d->popupItem, event->key() == Qt::Key_Tab);
3157void QQuickPopup::keyReleaseEvent(QKeyEvent *event)
3162void QQuickPopup::mousePressEvent(QMouseEvent *event)
3165 event->setAccepted(d->handleMouseEvent(d->popupItem, event));
3168void QQuickPopup::mouseMoveEvent(QMouseEvent *event)
3171 event->setAccepted(d->handleMouseEvent(d->popupItem, event));
3174void QQuickPopup::mouseReleaseEvent(QMouseEvent *event)
3177 event->setAccepted(d->handleMouseEvent(d->popupItem, event));
3180void QQuickPopup::mouseDoubleClickEvent(QMouseEvent *event)
3185void QQuickPopup::mouseUngrabEvent()
3194 QQuickItem *sourceAncestor = source;
3195 while (sourceAncestor) {
3196 QQuickItem *parentItem = sourceAncestor->parentItem();
3197 if (parentItem == overlay)
3198 return sourceAncestor;
3199 sourceAncestor = parentItem;
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217bool QQuickPopup::overlayEvent(QQuickItem *item, QEvent *event)
3224 auto *overlay = QQuickOverlay::overlay(d->window);
3226 const QList<QQuickItem *> paintOrderChildItems = QQuickOverlayPrivate::get(overlay)->paintOrderChildItems();
3227 const qsizetype targetItemPaintOrderIndex = paintOrderChildItems.indexOf(findRootOfOverlaySubtree(item, overlay));
3228 const qsizetype popupItemPaintOrderIndex = paintOrderChildItems.indexOf(d->popupItem);
3229 if (targetItemPaintOrderIndex > popupItemPaintOrderIndex)
3232 switch (event->type()) {
3233 case QEvent::KeyPress:
3234 case QEvent::KeyRelease:
3235 case QEvent::MouseMove:
3241#if QT_CONFIG(quicktemplates2_multitouch)
3242 case QEvent::TouchBegin:
3243 case QEvent::TouchUpdate:
3244 case QEvent::TouchEnd:
3245 return d->handleTouchEvent(item,
static_cast<QTouchEvent *>(event));
3247 case QEvent::HoverEnter:
3248 case QEvent::HoverMove:
3249 case QEvent::HoverLeave:
3250 return d->handleHoverEvent(item,
static_cast<QHoverEvent *>(event));
3252 case QEvent::MouseButtonPress:
3253 case QEvent::MouseButtonRelease:
3254 return d->handleMouseEvent(item,
static_cast<QMouseEvent *>(event));
3261#if QT_CONFIG(quicktemplates2_multitouch)
3262void QQuickPopup::touchEvent(QTouchEvent *event)
3265 event->setAccepted(d->handleTouchEvent(d->popupItem, event));
3268void QQuickPopup::touchUngrabEvent()
3275#if QT_CONFIG(wheelevent)
3276void QQuickPopup::wheelEvent(QWheelEvent *event)
3282void QQuickPopup::contentItemChange(QQuickItem *newItem, QQuickItem *oldItem)
3288void QQuickPopup::contentSizeChange(
const QSizeF &newSize,
const QSizeF &oldSize)
3290 qCDebug(lcQuickPopup) <<
"contentSizeChange called on" <<
this <<
"with newSize" << newSize <<
"oldSize" << oldSize;
3291 if (!qFuzzyCompare(newSize.width(), oldSize.width()))
3292 emit contentWidthChanged();
3293 if (!qFuzzyCompare(newSize.height(), oldSize.height()))
3294 emit contentHeightChanged();
3297void QQuickPopup::fontChange(
const QFont &newFont,
const QFont &oldFont)
3304void QQuickPopup::geometryChange(
const QRectF &newGeometry,
const QRectF &oldGeometry)
3307 qCDebug(lcQuickPopup) <<
"geometryChange called on" <<
this <<
"with newGeometry" << newGeometry <<
"oldGeometry" << oldGeometry;
3308 if (!d->usePopupWindow())
3310 if (!qFuzzyCompare(newGeometry.width(), oldGeometry.width())) {
3311 emit widthChanged();
3312 emit availableWidthChanged();
3314 if (!qFuzzyCompare(newGeometry.height(), oldGeometry.height())) {
3315 emit heightChanged();
3316 emit availableHeightChanged();
3320void QQuickPopup::itemChange(QQuickItem::ItemChange change,
const QQuickItem::ItemChangeData &)
3323 case QQuickItem::ItemActiveFocusHasChanged:
3324 emit activeFocusChanged();
3326 case QQuickItem::ItemOpacityHasChanged:
3327 emit opacityChanged();
3334void QQuickPopup::localeChange(
const QLocale &newLocale,
const QLocale &oldLocale)
3336 Q_UNUSED(newLocale);
3337 Q_UNUSED(oldLocale);
3338 emit localeChanged();
3341void QQuickPopup::marginsChange(
const QMarginsF &newMargins,
const QMarginsF &oldMargins)
3344 Q_UNUSED(newMargins);
3345 Q_UNUSED(oldMargins);
3349void QQuickPopup::paddingChange(
const QMarginsF &newPadding,
const QMarginsF &oldPadding)
3351 const bool tp = !qFuzzyCompare(newPadding.top(), oldPadding.top());
3352 const bool lp = !qFuzzyCompare(newPadding.left(), oldPadding.left());
3353 const bool rp = !qFuzzyCompare(newPadding.right(), oldPadding.right());
3354 const bool bp = !qFuzzyCompare(newPadding.bottom(), oldPadding.bottom());
3357 emit topPaddingChanged();
3359 emit leftPaddingChanged();
3361 emit rightPaddingChanged();
3363 emit bottomPaddingChanged();
3366 emit horizontalPaddingChanged();
3367 emit availableWidthChanged();
3370 emit verticalPaddingChanged();
3371 emit availableHeightChanged();
3375void QQuickPopup::spacingChange(qreal newSpacing, qreal oldSpacing)
3377 Q_UNUSED(newSpacing);
3378 Q_UNUSED(oldSpacing);
3379 emit spacingChanged();
3382void QQuickPopup::insetChange(
const QMarginsF &newInset,
const QMarginsF &oldInset)
3384 if (!qFuzzyCompare(newInset.top(), oldInset.top()))
3385 emit topInsetChanged();
3386 if (!qFuzzyCompare(newInset.left(), oldInset.left()))
3387 emit leftInsetChanged();
3388 if (!qFuzzyCompare(newInset.right(), oldInset.right()))
3389 emit rightInsetChanged();
3390 if (!qFuzzyCompare(newInset.bottom(), oldInset.bottom()))
3391 emit bottomInsetChanged();
3394QFont QQuickPopup::defaultFont()
const
3396 return QQuickTheme::font(QQuickTheme::System);
3399#if QT_CONFIG(accessibility)
3400QAccessible::Role QQuickPopup::effectiveAccessibleRole()
const
3402 auto *attached = qmlAttachedPropertiesObject<QQuickAccessibleAttached>(
this,
false);
3404 auto role = QAccessible::NoRole;
3405 if (
auto *accessibleAttached = qobject_cast<QQuickAccessibleAttached *>(attached))
3406 role = accessibleAttached->role();
3407 if (role == QAccessible::NoRole)
3408 role = accessibleRole();
3413QAccessible::Role QQuickPopup::accessibleRole()
const
3415 return QAccessible::Dialog;
3418void QQuickPopup::accessibilityActiveChanged(
bool active)
3424QString QQuickPopup::accessibleName()
const
3426 Q_D(
const QQuickPopup);
3427 return d->popupItem->accessibleName();
3430void QQuickPopup::maybeSetAccessibleName(
const QString &name)
3433 d->popupItem->maybeSetAccessibleName(name);
3436QVariant QQuickPopup::accessibleProperty(
const char *propertyName)
3438 Q_D(
const QQuickPopup);
3439 return d->popupItem->accessibleProperty(propertyName);
3442bool QQuickPopup::setAccessibleProperty(
const char *propertyName,
const QVariant &value)
3445 return d->popupItem->setAccessibleProperty(propertyName, value);
3448void QQuickPopup::setWindowModality(
const Qt::WindowModality modality)
3451 d->popupWndModality = modality;
3454QQuickItem *QQuickPopup::safeAreaAttachmentItem()
3461#include "moc_qquickpopup_p.cpp"