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/qquickattachedpropertypropagator_p.h>
23#include <QtQuick/private/qquicktransition_p.h>
24#include <QtQuick/private/qquickitem_p.h>
25#include <qpa/qplatformintegration.h>
26#include <private/qguiapplication_p.h>
30Q_STATIC_LOGGING_CATEGORY(lcDimmer,
"qt.quick.controls.popup.dimmer")
31Q_STATIC_LOGGING_CATEGORY(lcQuickPopup,
"qt.quick.controls.popup")
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
451
452
453
454
457
458
459
460
461
462
465
466
467
468
469
470
473
474
475
476
477
478
481
482
483
484
485
486
488QQuickItem *QQuickPopup::findParentItem()
const
490 QObject *obj = parent();
492 QQuickItem *item = qobject_cast<QQuickItem *>(obj);
500const QQuickPopup::ClosePolicy QQuickPopupPrivate::DefaultClosePolicy = QQuickPopup::CloseOnEscape | QQuickPopup::CloseOnPressOutside;
502QQuickPopupPrivate::QQuickPopupPrivate()
503 : transitionManager(
this)
507void QQuickPopupPrivate::init()
510 popupItem =
new QQuickPopupItem(q);
511 popupItem->setVisible(
false);
512 QObject::connect(popupItem, &QQuickControl::paddingChanged, q, &QQuickPopup::paddingChanged);
513 QObject::connect(popupItem, &QQuickControl::backgroundChanged, q, &QQuickPopup::backgroundChanged);
514 QObject::connect(popupItem, &QQuickControl::contentItemChanged, q, &QQuickPopup::contentItemChanged);
515 QObject::connect(popupItem, &QQuickControl::implicitContentWidthChanged, q, &QQuickPopup::implicitContentWidthChanged);
516 QObject::connect(popupItem, &QQuickControl::implicitContentHeightChanged, q, &QQuickPopup::implicitContentHeightChanged);
517 QObject::connect(popupItem, &QQuickControl::implicitBackgroundWidthChanged, q, &QQuickPopup::implicitBackgroundWidthChanged);
518 QObject::connect(popupItem, &QQuickControl::implicitBackgroundHeightChanged, q, &QQuickPopup::implicitBackgroundHeightChanged);
521void QQuickPopupPrivate::closeOrReject()
524#if QT_CONFIG(quicktemplates2_container)
525 if (QQuickDialog *dialog = qobject_cast<QQuickDialog*>(q))
533bool QQuickPopupPrivate::tryClose(
const QPointF &pos, QQuickPopup::ClosePolicy flags)
538 static const QQuickPopup::ClosePolicy outsideFlags = QQuickPopup::CloseOnPressOutside | QQuickPopup::CloseOnReleaseOutside;
539 static const QQuickPopup::ClosePolicy outsideParentFlags = QQuickPopup::CloseOnPressOutsideParent | QQuickPopup::CloseOnReleaseOutsideParent;
541 const bool onOutside = closePolicy & (flags & outsideFlags);
542 const bool onOutsideParent = closePolicy & (flags & outsideParentFlags);
544 if ((onOutside && outsidePressed) || (onOutsideParent && outsideParentPressed)) {
545 if (!contains(pos) && (!dimmer || dimmer->contains(dimmer->mapFromScene(pos)))) {
546 if (!onOutsideParent || !parentItem || !parentItem->contains(parentItem->mapFromScene(pos))) {
555bool QQuickPopupPrivate::contains(
const QPointF &scenePos)
const
557 return popupItem->contains(popupItem->mapFromScene(scenePos));
562 QQuickItem *sourceAncestor = source;
563 while (sourceAncestor) {
564 QQuickItem *parentItem = sourceAncestor->parentItem();
565 if (parentItem == overlay)
566 return sourceAncestor;
567 sourceAncestor = parentItem;
573bool QQuickPopupPrivate::belongsToOverlayChildAbove(QQuickItem *item)
const
575 auto *overlay = QQuickOverlay::overlay(window, parentItem);
577 const auto paintOrderChildItems = QQuickOverlayPrivate::get(overlay)->paintOrderChildItems();
578 return paintOrderChildItems.indexOf(findRootOfOverlaySubtree(item, overlay))
579 > paintOrderChildItems.indexOf(popupItem);
582#if QT_CONFIG(quicktemplates2_multitouch)
583bool QQuickPopupPrivate::acceptTouch(
const QTouchEvent::TouchPoint &point)
585 if (point.id() == touchId)
588 if (touchId == -1 && point.state() != QEventPoint::Released) {
589 touchId = point.id();
597bool QQuickPopupPrivate::blockInput(QQuickItem *item,
const QPointF &point)
const
600 if (popupItem->contains(popupItem->mapFromScene(point))
601 && item == QQuickOverlay::overlay(window, parentItem)) {
610 return modal && ((popupItem != item) && !popupItem->isAncestorOf(item)) && (!dimmer || dimmer->contains(dimmer->mapFromScene(point)));
613bool QQuickPopupPrivate::handlePress(QQuickItem *item,
const QPointF &point, ulong timestamp)
617 outsidePressed = !contains(point);
619 if (outsidePressed && parentItem) {
623 const QPointF globalPoint = item->mapToGlobal(item->mapFromScene(point));
624 const QPointF localPoint = parentItem->mapFromGlobal(globalPoint);
625 outsideParentPressed = !parentItem->contains(localPoint);
628 tryClose(point, QQuickPopup::CloseOnPressOutside | QQuickPopup::CloseOnPressOutsideParent);
629 return blockInput(item, point);
632bool QQuickPopupPrivate::handleMove(QQuickItem *item,
const QPointF &point, ulong timestamp)
635 return blockInput(item, point);
638bool QQuickPopupPrivate::handleRelease(QQuickItem *item,
const QEventPoint &point)
640 const QPointF scenePosition = point.scenePosition();
641 if (item != popupItem && !contains(pressPoint))
642 tryClose(scenePosition, QQuickPopup::CloseOnReleaseOutside | QQuickPopup::CloseOnReleaseOutsideParent);
643 pressPoint = QPointF();
644 outsidePressed =
false;
645 outsideParentPressed =
false;
647 return blockInput(item, scenePosition);
650void QQuickPopupPrivate::handleUngrab()
653 QQuickOverlay *overlay = QQuickOverlay::overlay(window, parentItem);
655 QQuickOverlayPrivate *p = QQuickOverlayPrivate::get(overlay);
656 if (p->mouseGrabberPopup == q)
657 p->mouseGrabberPopup =
nullptr;
659 pressPoint = QPointF();
663bool QQuickPopupPrivate::handleMouseEvent(QQuickItem *item, QMouseEvent *event)
665 switch (event->type()) {
666 case QEvent::MouseButtonPress:
667 return handlePress(item, event->scenePosition(), event->timestamp());
668 case QEvent::MouseMove:
669 return handleMove(item, event->scenePosition(), event->timestamp());
670 case QEvent::MouseButtonRelease:
671 return handleRelease(item, event->point(0));
673 Q_UNREACHABLE_RETURN(
false);
677bool QQuickPopupPrivate::handleHoverEvent(QQuickItem *item, QHoverEvent *event)
679 switch (event->type()) {
680 case QEvent::HoverEnter:
681 case QEvent::HoverMove:
682 case QEvent::HoverLeave:
683 return blockInput(item, event->scenePosition());
685 Q_UNREACHABLE_RETURN(
false);
689QMarginsF QQuickPopupPrivate::windowInsets()
const
694#if QT_CONFIG(wayland)
695 if (QGuiApplication::platformName().startsWith(QLatin1String(
"wayland")))
698 Q_Q(
const QQuickPopup);
709 const auto *popupItemPrivate = QQuickControlPrivate::get(popupItem);
710 if (!usePopupWindow() || (popupItemPrivate->background.isExecuting() && popupItemPrivate->background->clip())) {
718 q->leftInset() < 0 ? -q->leftInset() : 0,
719 q->topInset() < 0 ? -q->topInset() : 0,
720 q->rightInset() < 0 ? -q->rightInset() : 0,
721 q->bottomInset() < 0 ? -q->bottomInset() : 0
725QPointF QQuickPopupPrivate::windowInsetsTopLeft()
const
727 const QMarginsF windowMargins = windowInsets();
728 return {windowMargins.left(), windowMargins.top()};
731void QQuickPopupPrivate::setEffectivePosFromWindowPos(
const QPointF &windowPos)
748 const QPointF oldEffectivePos = effectivePos;
749 effectivePos = windowPos + windowInsetsTopLeft();
750 if (!qFuzzyCompare(oldEffectivePos.x(), effectivePos.x()))
752 if (!qFuzzyCompare(oldEffectivePos.y(), effectivePos.y()))
756#if QT_CONFIG(quicktemplates2_multitouch)
757bool QQuickPopupPrivate::handleTouchEvent(QQuickItem *item, QTouchEvent *event)
759 switch (event->type()) {
760 case QEvent::TouchBegin:
761 case QEvent::TouchUpdate:
762 case QEvent::TouchEnd:
763 for (
const QTouchEvent::TouchPoint &point : event->points()) {
764 if (event->type() != QEvent::TouchEnd && !acceptTouch(point))
765 return blockInput(item, point.position());
767 switch (point.state()) {
768 case QEventPoint::Pressed:
769 return handlePress(item, point.scenePosition(), event->timestamp());
770 case QEventPoint::Updated:
771 return handleMove(item, point.scenePosition(), event->timestamp());
772 case QEventPoint::Released:
773 return handleRelease(item, point);
780 case QEvent::TouchCancel:
792bool QQuickPopupPrivate::prepareEnterTransition()
796 qmlWarning(q) <<
"cannot find any window to open popup in.";
800 if (transitionState == EnterTransition && transitionManager.isRunning())
803 if (transitionState != EnterTransition) {
804 const QPointer<QQuickItem> lastActiveFocusItem = window->activeFocusItem();
806 adjustPopupItemParentAndWindow();
810 emit q->aboutToShow();
811 transitionState = EnterTransition;
812 getPositioner()->setParentItem(parentItem);
813 emit q->visibleChanged();
815 if (lastActiveFocusItem) {
816 this->lastActiveFocusItem = lastActiveFocusItem;
817 if (
auto *overlay = QQuickOverlay::overlay(window, parentItem)) {
818 auto *overlayPrivate = QQuickOverlayPrivate::get(overlay);
819 if (overlayPrivate->lastActiveFocusItem.isNull() && !popupItem->isAncestorOf(lastActiveFocusItem)) {
820 overlayPrivate->lastActiveFocusItem = lastActiveFocusItem;
821 overlayPrivate->lastActiveFocusItemPopup = q;
827 popupItem->setFocus(
true, Qt::PopupFocusReason);
832bool QQuickPopupPrivate::prepareExitTransition()
835 if (transitionState == ExitTransition && transitionManager.isRunning())
842 prevScale = popupItem->scale();
843 prevOpacity = popupItem->opacity();
845 if (transitionState != ExitTransition) {
848 if (!hadActiveFocusBeforeExitTransition) {
849 const auto *da = QQuickItemPrivate::get(popupItem)->deliveryAgentPrivate();
850 hadActiveFocusBeforeExitTransition = popupItem->hasActiveFocus() || (da && da->focusTargetItem() == popupItem);
853 popupItem->setFocus(
false, Qt::PopupFocusReason);
854 transitionState = ExitTransition;
856 emit q->aboutToHide();
857 emit q->openedChanged();
862void QQuickPopupPrivate::finalizeEnterTransition()
865 transitionState = NoTransition;
867 emit q->openedChanged();
871void QQuickPopupPrivate::finalizeExitTransition()
874 getPositioner()->setParentItem(
nullptr);
876 popupItem->setParentItem(
nullptr);
877 popupItem->setVisible(
false);
881 if (
auto *overlay = QQuickOverlay::overlay(window, parentItem)) {
882 auto *overlayPrivate = QQuickOverlayPrivate::get(overlay);
883 const auto stackingOrderPopups = overlayPrivate->stackingOrderPopups();
885 bool resetLastActiveFocusItem = (overlayPrivate->lastActiveFocusItemPopup == q);
886 if (resetLastActiveFocusItem) {
888
889
890
891
892
893
894
895 for (
auto popup : stackingOrderPopups) {
896 if (QQuickPopupPrivate::get(popup)->transitionState != ExitTransition) {
897 if (
auto savedFocusItem = QQuickPopupPrivate::get(popup)->lastActiveFocusItem) {
898 if (!qobject_cast<QQuickRootItem *>(savedFocusItem) && savedFocusItem != popupItem
899 && !popupItem->isAncestorOf(savedFocusItem)) {
900 overlayPrivate->lastActiveFocusItem = savedFocusItem;
902 overlayPrivate->lastActiveFocusItemPopup = popup;
903 resetLastActiveFocusItem =
false;
911 if (hadActiveFocusBeforeExitTransition) {
912 QQuickPopup *nextFocusPopup =
nullptr;
913 for (
auto popup : stackingOrderPopups) {
915 if (QQuickPopupPrivate::get(popup)->transitionState != ExitTransition
916 && popup->hasFocus() && !popup->hasActiveFocus()) {
917 nextFocusPopup = popup;
921 if (nextFocusPopup) {
922 nextFocusPopup->forceActiveFocus(Qt::PopupFocusReason);
924 auto *appWindow = qobject_cast<QQuickApplicationWindow*>(window);
925 auto *contentItem = appWindow ? appWindow->contentItem() : window->contentItem();
926 if (!contentItem->scopedFocusItem()
927 && !overlayPrivate->lastActiveFocusItem.isNull()) {
930 overlayPrivate->lastActiveFocusItem->forceActiveFocus(Qt::OtherFocusReason);
932 contentItem->setFocus(
true, Qt::PopupFocusReason);
938 if (resetLastActiveFocusItem || stackingOrderPopups.isEmpty()) {
939 overlayPrivate->lastActiveFocusItem =
nullptr;
940 overlayPrivate->lastActiveFocusItemPopup =
nullptr;
945 adjustPopupItemParentAndWindow();
946 transitionState = NoTransition;
947 hadActiveFocusBeforeExitTransition =
false;
948 lastActiveFocusItem =
nullptr;
949 emit q->visibleChanged();
951#if QT_CONFIG(accessibility)
952 const auto type = q->effectiveAccessibleRole() == QAccessible::PopupMenu
953 ? QAccessible::PopupMenuEnd
954 : QAccessible::DialogEnd;
955 QAccessibleEvent ev(q->popupItem(), type);
956 QAccessible::updateAccessibility(&ev);
959 popupItem->setScale(prevScale);
960 popupItem->setOpacity(prevOpacity);
964void QQuickPopupPrivate::opened()
968#if QT_CONFIG(accessibility)
969 const auto type = q->effectiveAccessibleRole() == QAccessible::PopupMenu
970 ? QAccessible::PopupMenuStart
971 : QAccessible::DialogStart;
972 QAccessibleEvent ev(q->popupItem(), type);
973 QAccessible::updateAccessibility(&ev);
977Qt::WindowFlags QQuickPopupPrivate::popupWindowFlags()
const
982void QQuickPopupPrivate::setPopupWindowFlags(Qt::WindowFlags flags)
987QMarginsF QQuickPopupPrivate::getMargins()
const
989 Q_Q(
const QQuickPopup);
990 return QMarginsF(q->leftMargin(), q->topMargin(), q->rightMargin(), q->bottomMargin());
993void QQuickPopupPrivate::setTopMargin(qreal value,
bool reset)
996 qreal oldMargin = q->topMargin();
998 hasTopMargin = !reset;
999 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
1000 emit q->topMarginChanged();
1001 q->marginsChange(QMarginsF(leftMargin, topMargin, rightMargin, bottomMargin),
1002 QMarginsF(leftMargin, oldMargin, rightMargin, bottomMargin));
1006void QQuickPopupPrivate::setLeftMargin(qreal value,
bool reset)
1009 qreal oldMargin = q->leftMargin();
1011 hasLeftMargin = !reset;
1012 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
1013 emit q->leftMarginChanged();
1014 q->marginsChange(QMarginsF(leftMargin, topMargin, rightMargin, bottomMargin),
1015 QMarginsF(oldMargin, topMargin, rightMargin, bottomMargin));
1019void QQuickPopupPrivate::setRightMargin(qreal value,
bool reset)
1022 qreal oldMargin = q->rightMargin();
1023 rightMargin = value;
1024 hasRightMargin = !reset;
1025 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
1026 emit q->rightMarginChanged();
1027 q->marginsChange(QMarginsF(leftMargin, topMargin, rightMargin, bottomMargin),
1028 QMarginsF(leftMargin, topMargin, oldMargin, bottomMargin));
1032void QQuickPopupPrivate::setBottomMargin(qreal value,
bool reset)
1035 qreal oldMargin = q->bottomMargin();
1036 bottomMargin = value;
1037 hasBottomMargin = !reset;
1038 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
1039 emit q->bottomMarginChanged();
1040 q->marginsChange(QMarginsF(leftMargin, topMargin, rightMargin, bottomMargin),
1041 QMarginsF(leftMargin, topMargin, rightMargin, oldMargin));
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078QQuickPopupAnchors *QQuickPopupPrivate::getAnchors()
1082 anchors =
new QQuickPopupAnchors(q);
1086QQuickPopupPositioner *QQuickPopupPrivate::getPositioner()
1090 positioner =
new QQuickPopupPositioner(q);
1118 observer->disconnect();
1119 observer->deleteLater();
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1137#if defined(Q_OS_MACOS)
1138 d->transitionManager.transitionEnter();
1140 const auto callPrepareEnterTransition = [d]() {
1141 d->transitionManager.transitionEnter();
1142 std::ignore = s_windowExposedObserver.release();
1144 if (d->usePopupWindow() && d->window->isVisible() && !d->window->isExposed())
1147 callPrepareEnterTransition();
1151void QQuickPopupPrivate::setWindow(QQuickWindow *newWindow)
1154 if (window == newWindow)
1158 QQuickOverlay *overlay = QQuickOverlay::overlay(window, parentItem);
1160 QQuickOverlayPrivate::get(overlay)->removePopup(q);
1165 if (!newWindow && popupItem)
1166 popupItem->setParentItem(
nullptr);
1172 QQuickOverlay *overlay = QQuickOverlay::overlay(newWindow, parentItem);
1174 QQuickOverlayPrivate::get(overlay)->addPopup(q);
1176 QQuickControlPrivate *p = QQuickControlPrivate::get(popupItem);
1178 if (QQuickApplicationWindow *appWindow = qobject_cast<QQuickApplicationWindow *>(newWindow))
1179 p->updateLocale(appWindow->locale(),
false);
1182 emit q->windowChanged(newWindow);
1184 if (complete && visible && window)
1188void QQuickPopupPrivate::itemDestroyed(QQuickItem *item)
1191 if (item == parentItem)
1192 q->setParentItem(
nullptr);
1195void QQuickPopupPrivate::reposition()
1197 getPositioner()->reposition();
1200QPalette QQuickPopupPrivate::defaultPalette()
const
1202 return QQuickTheme::palette(QQuickTheme::System);
1205QQuickPopup::PopupType QQuickPopupPrivate::resolvedPopupType()
const
1215 if (popupType == QQuickPopup::PopupType::Window
1216 || popupType == QQuickPopup::PopupType::Native) {
1217 if (QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::Capability::MultipleWindows))
1218 return QQuickPopup::PopupType::Window;
1221 return QQuickPopup::PopupType::Item;
1224bool QQuickPopupPrivate::usePopupWindow()
const
1226 return resolvedPopupType() == QQuickPopup::PopupType::Window;
1229void QQuickPopupPrivate::adjustPopupItemParentAndWindow()
1232 QQuickOverlay *overlay = QQuickOverlay::overlay(window, parentItem);
1234 if (visible && popupWindowDirty) {
1235 popupItem->setParentItem(overlay);
1237 popupWindow->deleteLater();
1238 popupWindow =
nullptr;
1240 popupWindowDirty =
false;
1243 if (usePopupWindow()) {
1246 QWindow *ancestor = window;
1247 while (ancestor->parent())
1248 ancestor = ancestor->parent();
1249 popupWindow =
new QQuickPopupWindow(q, ancestor);
1252 const qreal initialWidth = popupItem->width() + windowInsets().left() + windowInsets().right();
1253 const qreal initialHeight = popupItem->height() + windowInsets().top() + windowInsets().bottom();
1254 popupItem->setParentItem(popupWindow->contentItem());
1255 popupWindow->resize(qCeil(initialWidth), qCeil(initialHeight));
1256 if (popupWndModality != Qt::NonModal)
1257 popupWindow->setModality(popupWndModality);
1259 popupWindow->setModality(modal ? Qt::ApplicationModal : Qt::NonModal);
1260 popupItem->resetTitle();
1261 popupWindow->setTitle(title);
1263 popupItem->setParentItem(popupWindow->contentItem());
1264 popupItem->forceActiveFocus(Qt::PopupFocusReason);
1266 if (popupWindow && popupWindow->transientParent()) {
1267 if (qobject_cast<QQuickWindow *>(popupWindow->transientParent())) {
1268 auto *transientParentPriv = QQuickWindowPrivate::get(qobject_cast<QQuickWindow *>(popupWindow->transientParent()));
1269 if (!transientParentPriv->inDestructor)
1270 popupWindow->setVisible(visible);
1272 popupWindow->setVisible(visible);
1277 popupItem->setParentItem(overlay);
1278 const auto popupStack = QQuickOverlayPrivate::get(overlay)->stackingOrderPopups();
1282 const QQuickPopup *topPopup = popupStack.isEmpty() ?
nullptr : popupStack.first();
1283 const QObject *ancestor = q;
1284 while (ancestor && topPopup) {
1285 if (ancestor == topPopup)
1287 ancestor = ancestor->parent();
1289 if (topPopup && topPopup != q && ancestor) {
1290 QQuickItem *topPopupItem = popupStack.first()->popupItem();
1291 popupItem->stackAfter(topPopupItem);
1295 popupItem->setZ(qMax(topPopupItem->z(), popupItem->z()));
1297 q->setModal((popupWndModality != Qt::NonModal) || modal);
1300 popupItem->setTitle(title);
1302 popupItem->setVisible(visible);
1305QQuickItem *QQuickPopupPrivate::createDimmer(QQmlComponent *component, QQuickPopup *popup, QQuickItem *parent)
const
1307 QQuickItem *item =
nullptr;
1309 QQmlContext *context = component->creationContext();
1311 context = qmlContext(popup);
1312 item = qobject_cast<QQuickItem*>(component->beginCreate(context));
1317 if (!item && popup->isModal())
1318 item =
new QQuickItem;
1321 item->setParentItem(parent);
1322 if (resolvedPopupType() != QQuickPopup::PopupType::Window)
1323 item->stackBefore(popup->popupItem());
1324 item->setZ(popup->z());
1326 qCDebug(lcDimmer) <<
"dimmer" << item <<
"registered with" << parent;
1327 parent->setProperty(
"_q_dimmerItem", QVariant::fromValue<QQuickItem*>(item));
1328 if (popup->isModal()) {
1329 item->setAcceptedMouseButtons(Qt::AllButtons);
1330#if QT_CONFIG(cursor)
1331 item->setCursor(Qt::ArrowCursor);
1333#if QT_CONFIG(quicktemplates2_hover)
1335 item->setAcceptHoverEvents(
true);
1341 component->completeCreate();
1343 qCDebug(lcDimmer) <<
"finished creating dimmer from component" << component
1344 <<
"for popup" << popup <<
"with parent" << parent <<
"- item is:" << item;
1348void QQuickPopupPrivate::createOverlay()
1351 QQuickOverlay *overlay = QQuickOverlay::overlay(window, parentItem);
1355 QQmlComponent *component =
nullptr;
1356 QQuickOverlayAttached *overlayAttached = qobject_cast<QQuickOverlayAttached *>(qmlAttachedPropertiesObject<QQuickOverlay>(q,
false));
1357 if (overlayAttached)
1358 component = modal ? overlayAttached->modal() : overlayAttached->modeless();
1361 component = modal ? overlay->modal() : overlay->modeless();
1364 dimmer = createDimmer(component, q, overlay);
1371 explicitDimmerOpacity = dimmer->opacity();
1373 dimmer->setOpacity(0);
1380void QQuickPopupPrivate::destroyDimmer()
1383 qCDebug(lcDimmer) <<
"destroying dimmer" << dimmer;
1384 if (QObject *dimmerParentItem = dimmer->parentItem()) {
1385 if (dimmerParentItem->property(
"_q_dimmerItem").value<QQuickItem*>() == dimmer)
1386 dimmerParentItem->setProperty(
"_q_dimmerItem", QVariant());
1388 dimmer->setParentItem(
nullptr);
1389 dimmer->deleteLater();
1394void QQuickPopupPrivate::toggleOverlay()
1401void QQuickPopupPrivate::updateContentPalettes(
const QPalette& parentPalette)
1404 if (providesPalette())
1405 inheritPalette(parentPalette);
1407 QQuickItemPrivate::get(popupItem)->updateChildrenPalettes(parentPalette);
1410void QQuickPopupPrivate::updateChildrenPalettes(
const QPalette& parentPalette)
1412 updateContentPalettes(parentPalette);
1415void QQuickPopupPrivate::showDimmer()
1419 QQmlProperty::write(dimmer, QStringLiteral(
"opacity"), explicitDimmerOpacity);
1422void QQuickPopupPrivate::hideDimmer()
1426 QQmlProperty::write(dimmer, QStringLiteral(
"opacity"), 0.0);
1429void QQuickPopupPrivate::resizeDimmer()
1434 const QQuickOverlay *overlay = QQuickOverlay::overlay(window, parentItem);
1436 qreal w = overlay ? overlay->width() : 0;
1437 qreal h = overlay ? overlay->height() : 0;
1438 dimmer->setSize(QSizeF(w, h));
1441QQuickPopupTransitionManager::QQuickPopupTransitionManager(QQuickPopupPrivate *popup)
1446void QQuickPopupTransitionManager::transitionEnter()
1448 if (popup->transitionState == QQuickPopupPrivate::ExitTransition)
1451 if (!popup->prepareEnterTransition())
1455 transition(popup->enterActions, popup->enter, popup->q_func());
1460void QQuickPopupTransitionManager::transitionExit()
1462 if (!popup->prepareExitTransition())
1466 transition(popup->exitActions, popup->exit, popup->q_func());
1471void QQuickPopupTransitionManager::finished()
1473 if (popup->transitionState == QQuickPopupPrivate::EnterTransition)
1474 popup->finalizeEnterTransition();
1475 else if (popup->transitionState == QQuickPopupPrivate::ExitTransition)
1476 popup->finalizeExitTransition();
1479QQuickPopup::QQuickPopup(QObject *parent)
1480 : QObject(*(
new QQuickPopupPrivate), parent)
1485 d->relaxEdgeConstraint =
true;
1488QQuickPopup::QQuickPopup(QQuickPopupPrivate &dd, QObject *parent)
1489 : QObject(dd, parent)
1495QQuickPopup::~QQuickPopup()
1498 d->inDestructor =
true;
1500 QQuickItem *currentContentItem = d->popupItem->d_func()->contentItem.data();
1501 if (currentContentItem) {
1502 disconnect(currentContentItem, &QQuickItem::childrenChanged,
1503 this, &QQuickPopup::contentChildrenChanged);
1506 setParentItem(
nullptr);
1511 if (d->transitionState == QQuickPopupPrivate::ExitTransition && d->transitionManager.isRunning())
1512 d->finalizeExitTransition();
1514 delete d->popupItem;
1515 d->popupItem =
nullptr;
1516 delete d->positioner;
1517 d->positioner =
nullptr;
1519 delete d->popupWindow;
1520 d->popupWindow =
nullptr;
1524
1525
1526
1527
1528
1529
1530void QQuickPopup::open()
1536
1537
1538
1539
1540
1541
1542void QQuickPopup::close()
1548
1549
1550
1551
1552
1553
1554qreal QQuickPopup::x()
const
1556 return d_func()->effectivePos.x();
1559void QQuickPopup::setX(qreal x)
1562 setPosition(QPointF(x, d->y));
1566
1567
1568
1569
1570
1571
1572qreal QQuickPopup::y()
const
1574 return d_func()->effectivePos.y();
1577void QQuickPopup::setY(qreal y)
1580 setPosition(QPointF(d->x, y));
1583QPointF QQuickPopup::position()
const
1585 return d_func()->effectivePos;
1588void QQuickPopup::setPosition(
const QPointF &pos)
1591 const bool xChange = !qFuzzyCompare(d->x, pos.x());
1592 const bool yChange = !qFuzzyCompare(d->y, pos.y());
1593 if (!xChange && !yChange)
1598 if (d->popupItem->isVisible()) {
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628qreal QQuickPopup::z()
const
1630 Q_D(
const QQuickPopup);
1631 return d->popupItem->z();
1634void QQuickPopup::setZ(qreal z)
1638 bool previousZ = d->popupWindow ? d->popupWindow->z() : d->popupItem->z();
1639 if (qFuzzyCompare(z, previousZ))
1642 d->popupWindow->setZ(z);
1644 d->popupItem->setZ(z);
1648void QQuickPopup::resetZ()
1656
1657
1658
1659
1660qreal QQuickPopup::width()
const
1662 Q_D(
const QQuickPopup);
1663 return d->popupItem->width();
1666void QQuickPopup::setWidth(qreal width)
1677 d->popupWindow->setWidth(width + d->windowInsets().left() + d->windowInsets().right());
1679 d->popupItem->setWidth(width);
1682void QQuickPopup::resetWidth()
1688 d->hasWidth =
false;
1689 d->popupItem->resetWidth();
1690 if (d->popupItem->isVisible())
1695
1696
1697
1698
1699qreal QQuickPopup::height()
const
1701 Q_D(
const QQuickPopup);
1702 return d->popupItem->height();
1705void QQuickPopup::setHeight(qreal height)
1708 d->hasHeight =
true;
1716 d->popupWindow->setHeight(height + d->windowInsets().top() + d->windowInsets().bottom());
1718 d->popupItem->setHeight(height);
1721void QQuickPopup::resetHeight()
1727 d->hasHeight =
false;
1728 d->popupItem->resetHeight();
1729 if (d->popupItem->isVisible())
1734
1735
1736
1737
1738qreal QQuickPopup::implicitWidth()
const
1740 Q_D(
const QQuickPopup);
1741 return d->popupItem->implicitWidth();
1744void QQuickPopup::setImplicitWidth(qreal width)
1747 d->popupItem->setImplicitWidth(width);
1751
1752
1753
1754
1755qreal QQuickPopup::implicitHeight()
const
1757 Q_D(
const QQuickPopup);
1758 return d->popupItem->implicitHeight();
1761void QQuickPopup::setImplicitHeight(qreal height)
1764 d->popupItem->setImplicitHeight(height);
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777qreal QQuickPopup::contentWidth()
const
1779 Q_D(
const QQuickPopup);
1780 return d->popupItem->contentWidth();
1783void QQuickPopup::setContentWidth(qreal width)
1786 d->popupItem->setContentWidth(width);
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799qreal QQuickPopup::contentHeight()
const
1801 Q_D(
const QQuickPopup);
1802 return d->popupItem->contentHeight();
1805void QQuickPopup::setContentHeight(qreal height)
1808 d->popupItem->setContentHeight(height);
1812
1813
1814
1815
1816
1817
1818
1819
1820qreal QQuickPopup::availableWidth()
const
1822 Q_D(
const QQuickPopup);
1823 return d->popupItem->availableWidth();
1827
1828
1829
1830
1831
1832
1833
1834
1835qreal QQuickPopup::availableHeight()
const
1837 Q_D(
const QQuickPopup);
1838 return d->popupItem->availableHeight();
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853qreal QQuickPopup::spacing()
const
1855 Q_D(
const QQuickPopup);
1856 return d->popupItem->spacing();
1859void QQuickPopup::setSpacing(qreal spacing)
1862 d->popupItem->setSpacing(spacing);
1865void QQuickPopup::resetSpacing()
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881qreal QQuickPopup::margins()
const
1883 Q_D(
const QQuickPopup);
1887void QQuickPopup::setMargins(qreal margins)
1890 if (qFuzzyCompare(d->margins, margins))
1892 QMarginsF oldMargins(leftMargin(), topMargin(), rightMargin(), bottomMargin());
1893 d->margins = margins;
1894 emit marginsChanged();
1895 QMarginsF newMargins(leftMargin(), topMargin(), rightMargin(), bottomMargin());
1896 if (!qFuzzyCompare(newMargins.top(), oldMargins.top()))
1897 emit topMarginChanged();
1898 if (!qFuzzyCompare(newMargins.left(), oldMargins.left()))
1899 emit leftMarginChanged();
1900 if (!qFuzzyCompare(newMargins.right(), oldMargins.right()))
1901 emit rightMarginChanged();
1902 if (!qFuzzyCompare(newMargins.bottom(), oldMargins.bottom()))
1903 emit bottomMarginChanged();
1904 marginsChange(newMargins, oldMargins);
1907void QQuickPopup::resetMargins()
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923qreal QQuickPopup::topMargin()
const
1925 Q_D(
const QQuickPopup);
1926 if (d->hasTopMargin)
1927 return d->topMargin;
1931void QQuickPopup::setTopMargin(qreal margin)
1934 d->setTopMargin(margin);
1937void QQuickPopup::resetTopMargin()
1940 d->setTopMargin(-1,
true);
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954qreal QQuickPopup::leftMargin()
const
1956 Q_D(
const QQuickPopup);
1957 if (d->hasLeftMargin)
1958 return d->leftMargin;
1962void QQuickPopup::setLeftMargin(qreal margin)
1965 d->setLeftMargin(margin);
1968void QQuickPopup::resetLeftMargin()
1971 d->setLeftMargin(-1,
true);
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985qreal QQuickPopup::rightMargin()
const
1987 Q_D(
const QQuickPopup);
1988 if (d->hasRightMargin)
1989 return d->rightMargin;
1993void QQuickPopup::setRightMargin(qreal margin)
1996 d->setRightMargin(margin);
1999void QQuickPopup::resetRightMargin()
2002 d->setRightMargin(-1,
true);
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016qreal QQuickPopup::bottomMargin()
const
2018 Q_D(
const QQuickPopup);
2019 if (d->hasBottomMargin)
2020 return d->bottomMargin;
2024void QQuickPopup::setBottomMargin(qreal margin)
2027 d->setBottomMargin(margin);
2030void QQuickPopup::resetBottomMargin()
2033 d->setBottomMargin(-1,
true);
2037
2038
2039
2040
2041
2042
2043
2044
2045qreal QQuickPopup::padding()
const
2047 Q_D(
const QQuickPopup);
2048 return d->popupItem->padding();
2051void QQuickPopup::setPadding(qreal padding)
2054 d->popupItem->setPadding(padding);
2057void QQuickPopup::resetPadding()
2060 d->popupItem->resetPadding();
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073qreal QQuickPopup::topPadding()
const
2075 Q_D(
const QQuickPopup);
2076 return d->popupItem->topPadding();
2079void QQuickPopup::setTopPadding(qreal padding)
2082 d->popupItem->setTopPadding(padding);
2085void QQuickPopup::resetTopPadding()
2088 d->popupItem->resetTopPadding();
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101qreal QQuickPopup::leftPadding()
const
2103 Q_D(
const QQuickPopup);
2104 return d->popupItem->leftPadding();
2107void QQuickPopup::setLeftPadding(qreal padding)
2110 d->popupItem->setLeftPadding(padding);
2113void QQuickPopup::resetLeftPadding()
2116 d->popupItem->resetLeftPadding();
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129qreal QQuickPopup::rightPadding()
const
2131 Q_D(
const QQuickPopup);
2132 return d->popupItem->rightPadding();
2135void QQuickPopup::setRightPadding(qreal padding)
2138 d->popupItem->setRightPadding(padding);
2141void QQuickPopup::resetRightPadding()
2144 d->popupItem->resetRightPadding();
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157qreal QQuickPopup::bottomPadding()
const
2159 Q_D(
const QQuickPopup);
2160 return d->popupItem->bottomPadding();
2163void QQuickPopup::setBottomPadding(qreal padding)
2166 d->popupItem->setBottomPadding(padding);
2169void QQuickPopup::resetBottomPadding()
2172 d->popupItem->resetBottomPadding();
2176
2177
2178
2179
2180
2181
2182QLocale QQuickPopup::locale()
const
2184 Q_D(
const QQuickPopup);
2185 return d->popupItem->locale();
2188void QQuickPopup::setLocale(
const QLocale &locale)
2191 d->popupItem->setLocale(locale);
2194void QQuickPopup::resetLocale()
2197 d->popupItem->resetLocale();
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213bool QQuickPopup::isMirrored()
const
2215 Q_D(
const QQuickPopup);
2216 return d->popupItem->isMirrored();
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246QFont QQuickPopup::font()
const
2248 Q_D(
const QQuickPopup);
2249 return d->popupItem->font();
2252void QQuickPopup::setFont(
const QFont &font)
2255 d->popupItem->setFont(font);
2258void QQuickPopup::resetFont()
2261 d->popupItem->resetFont();
2264QQuickWindow *QQuickPopup::window()
const
2266 Q_D(
const QQuickPopup);
2270QQuickItem *QQuickPopup::popupItem()
const
2272 Q_D(
const QQuickPopup);
2273 return d->popupItem;
2277
2278
2279
2280
2281QQuickItem *QQuickPopup::parentItem()
const
2283 Q_D(
const QQuickPopup);
2284 return d->parentItem;
2287void QQuickPopup::setParentItem(QQuickItem *parent)
2290 if (d->parentItem == parent)
2293 if (d->parentItem) {
2294 QObjectPrivate::disconnect(d->parentItem, &QQuickItem::windowChanged, d, &QQuickPopupPrivate::setWindow);
2295 QQuickItemPrivate::get(d->parentItem)->removeItemChangeListener(d, QQuickItemPrivate::Destroyed);
2297 d->parentItem = parent;
2298 QQuickPopupPositioner *positioner = d->getPositioner();
2299 if (positioner->parentItem())
2300 positioner->setParentItem(parent);
2302 QObjectPrivate::connect(parent, &QQuickItem::windowChanged, d, &QQuickPopupPrivate::setWindow);
2303 QQuickItemPrivate::get(d->parentItem)->addItemChangeListener(d, QQuickItemPrivate::Destroyed);
2304 }
else if (d->inDestructor) {
2308 if (!d->window && d->transitionManager.isRunning()) {
2309 if (d->transitionState == QQuickPopupPrivate::EnterTransition)
2310 d->finalizeEnterTransition();
2311 else if (d->transitionState == QQuickPopupPrivate::ExitTransition)
2312 d->finalizeExitTransition();
2318 d->setWindow(parent ? parent->window() :
nullptr);
2319 emit parentChanged();
2322void QQuickPopup::resetParentItem()
2324 if (QQuickWindow *window = qobject_cast<QQuickWindow *>(parent()))
2325 setParentItem(window->contentItem());
2327 setParentItem(findParentItem());
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347QQuickItem *QQuickPopup::background()
const
2349 Q_D(
const QQuickPopup);
2350 return d->popupItem->background();
2353void QQuickPopup::setBackground(QQuickItem *background)
2358 QQuickControlPrivate::warnIfCustomizationNotSupported(
this, background, QStringLiteral(
"background"));
2359 d->popupItem->setBackground(background);
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382QQuickItem *QQuickPopup::contentItem()
const
2384 Q_D(
const QQuickPopup);
2385 return d->popupItem->contentItem();
2388void QQuickPopup::setContentItem(QQuickItem *item)
2392 QQuickControlPrivate::warnIfCustomizationNotSupported(
this, item, QStringLiteral(
"contentItem"));
2393 QQuickItem *oldContentItem = d->complete ? d->popupItem->d_func()->contentItem.data()
2396 disconnect(oldContentItem, &QQuickItem::childrenChanged,
this, &QQuickPopup::contentChildrenChanged);
2397 d->popupItem->setContentItem(item);
2399 QQuickItem *newContentItem = d->popupItem->d_func()->contentItem.data();
2401 connect(newContentItem, &QQuickItem::childrenChanged,
this, &QQuickPopup::contentChildrenChanged);
2402 if (oldContentItem != newContentItem)
2403 emit contentChildrenChanged();
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421QQmlListProperty<QObject> QQuickPopupPrivate::contentData()
2423 QQuickControlPrivate *p = QQuickControlPrivate::get(popupItem);
2424 if (!p->contentItem)
2425 p->executeContentItem();
2426 return QQmlListProperty<QObject>(popupItem->contentItem(),
nullptr,
2427 QQuickItemPrivate::data_append,
2428 QQuickItemPrivate::data_count,
2429 QQuickItemPrivate::data_at,
2430 QQuickItemPrivate::data_clear);
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446QQmlListProperty<QQuickItem> QQuickPopupPrivate::contentChildren()
2448 return QQmlListProperty<QQuickItem>(popupItem->contentItem(),
nullptr,
2449 QQuickItemPrivate::children_append,
2450 QQuickItemPrivate::children_count,
2451 QQuickItemPrivate::children_at,
2452 QQuickItemPrivate::children_clear);
2456
2457
2458
2459
2460
2461bool QQuickPopup::clip()
const
2463 Q_D(
const QQuickPopup);
2464 return d->popupItem->clip() && !d->usePopupWindow();
2467void QQuickPopup::setClip(
bool clip)
2470 if (clip == d->popupItem->clip() || d->usePopupWindow())
2472 d->popupItem->setClip(clip);
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488bool QQuickPopup::hasFocus()
const
2490 Q_D(
const QQuickPopup);
2494void QQuickPopup::setFocus(
bool focus)
2497 if (d->focus == focus)
2500 emit focusChanged();
2504
2505
2506
2507
2508
2509
2510
2511bool QQuickPopup::hasActiveFocus()
const
2513 Q_D(
const QQuickPopup);
2514 return d->popupItem->hasActiveFocus();
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538bool QQuickPopup::isModal()
const
2540 Q_D(
const QQuickPopup);
2544void QQuickPopup::setModal(
bool modal)
2547 if (d->modal == modal)
2550 d->popupWindowDirty =
true;
2551 if (d->complete && d->visible)
2553 emit modalChanged();
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571bool QQuickPopup::dim()
const
2573 Q_D(
const QQuickPopup);
2577void QQuickPopup::setDim(
bool dim)
2586 if (d->complete && d->visible)
2591void QQuickPopup::resetDim()
2602
2603
2604
2605
2606
2607
2608bool QQuickPopup::isVisible()
const
2610 Q_D(
const QQuickPopup);
2611 return d->visible && d->popupItem->isVisible();
2614void QQuickPopup::setVisible(
bool visible)
2620 if (d->visible && visible && d->transitionState != QQuickPopupPrivate::ExitTransition)
2623 if (!d->visible && !visible)
2626 if (!d->complete || (visible && !d->window)) {
2627 d->visible = visible;
2631 if (visible && !parentItem()) {
2632 qmlWarning(
this) <<
"cannot show popup: parent is null";
2639 d->transitionManager.transitionExit();
2643
2644
2645
2646
2647
2648
2649
2650bool QQuickPopup::isEnabled()
const
2652 Q_D(
const QQuickPopup);
2653 return d->popupItem->isEnabled();
2656void QQuickPopup::setEnabled(
bool enabled)
2659 d->popupItem->setEnabled(enabled);
2663
2664
2665
2666
2667
2668
2669
2670
2671bool QQuickPopup::isOpened()
const
2673 Q_D(
const QQuickPopup);
2674 return d->transitionState == QQuickPopupPrivate::NoTransition && isVisible();
2678
2679
2680
2681
2682
2683
2684
2685qreal QQuickPopup::opacity()
const
2687 Q_D(
const QQuickPopup);
2688 return d->popupItem->opacity();
2691void QQuickPopup::setOpacity(qreal opacity)
2694 d->popupItem->setOpacity(opacity);
2698
2699
2700
2701
2702
2703
2704
2705
2706qreal QQuickPopup::scale()
const
2708 Q_D(
const QQuickPopup);
2709 return d->popupItem->scale();
2712void QQuickPopup::setScale(qreal scale)
2715 if (qFuzzyCompare(scale, d->popupItem->scale()))
2717 d->popupItem->setScale(scale);
2718 emit scaleChanged();
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748QQuickPopup::ClosePolicy QQuickPopup::closePolicy()
const
2750 Q_D(
const QQuickPopup);
2751 return d->closePolicy;
2754void QQuickPopup::setClosePolicy(ClosePolicy policy)
2757 d->hasClosePolicy =
true;
2758 if (d->closePolicy == policy)
2760 d->closePolicy = policy;
2761 emit closePolicyChanged();
2764void QQuickPopup::resetClosePolicy()
2767 setClosePolicy(QQuickPopupPrivate::DefaultClosePolicy);
2768 d->hasClosePolicy =
false;
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784QQuickPopup::TransformOrigin QQuickPopup::transformOrigin()
const
2786 Q_D(
const QQuickPopup);
2787 return static_cast<TransformOrigin>(d->popupItem->transformOrigin());
2790void QQuickPopup::setTransformOrigin(TransformOrigin origin)
2793 d->popupItem->setTransformOrigin(
static_cast<QQuickItem::TransformOrigin>(origin));
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814QQuickTransition *QQuickPopup::enter()
const
2816 Q_D(
const QQuickPopup);
2820void QQuickPopup::setEnter(QQuickTransition *transition)
2823 if (d->enter == transition)
2825 d->enter = transition;
2826 emit enterChanged();
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847QQuickTransition *QQuickPopup::exit()
const
2849 Q_D(
const QQuickPopup);
2853void QQuickPopup::setExit(QQuickTransition *transition)
2856 if (d->exit == transition)
2858 d->exit = transition;
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873qreal QQuickPopup::horizontalPadding()
const
2875 Q_D(
const QQuickPopup);
2876 return d->popupItem->horizontalPadding();
2879void QQuickPopup::setHorizontalPadding(qreal padding)
2882 d->popupItem->setHorizontalPadding(padding);
2885void QQuickPopup::resetHorizontalPadding()
2888 d->popupItem->resetHorizontalPadding();
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902qreal QQuickPopup::verticalPadding()
const
2904 Q_D(
const QQuickPopup);
2905 return d->popupItem->verticalPadding();
2908void QQuickPopup::setVerticalPadding(qreal padding)
2911 d->popupItem->setVerticalPadding(padding);
2914void QQuickPopup::resetVerticalPadding()
2917 d->popupItem->resetVerticalPadding();
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931qreal QQuickPopup::implicitContentWidth()
const
2933 Q_D(
const QQuickPopup);
2934 return d->popupItem->implicitContentWidth();
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948qreal QQuickPopup::implicitContentHeight()
const
2950 Q_D(
const QQuickPopup);
2951 return d->popupItem->implicitContentHeight();
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965qreal QQuickPopup::implicitBackgroundWidth()
const
2967 Q_D(
const QQuickPopup);
2968 return d->popupItem->implicitBackgroundWidth();
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982qreal QQuickPopup::implicitBackgroundHeight()
const
2984 Q_D(
const QQuickPopup);
2985 return d->popupItem->implicitBackgroundHeight();
2989
2990
2991
2992
2993
2994
2995
2996qreal QQuickPopup::topInset()
const
2998 Q_D(
const QQuickPopup);
2999 return d->popupItem->topInset();
3002void QQuickPopup::setTopInset(qreal inset)
3005 d->popupItem->setTopInset(inset);
3008void QQuickPopup::resetTopInset()
3011 d->popupItem->resetTopInset();
3015
3016
3017
3018
3019
3020
3021
3022qreal QQuickPopup::leftInset()
const
3024 Q_D(
const QQuickPopup);
3025 return d->popupItem->leftInset();
3028void QQuickPopup::setLeftInset(qreal inset)
3031 d->popupItem->setLeftInset(inset);
3034void QQuickPopup::resetLeftInset()
3037 d->popupItem->resetLeftInset();
3041
3042
3043
3044
3045
3046
3047
3048qreal QQuickPopup::rightInset()
const
3050 Q_D(
const QQuickPopup);
3051 return d->popupItem->rightInset();
3054void QQuickPopup::setRightInset(qreal inset)
3057 d->popupItem->setRightInset(inset);
3060void QQuickPopup::resetRightInset()
3063 d->popupItem->resetRightInset();
3067
3068
3069
3070
3071
3072
3073
3074qreal QQuickPopup::bottomInset()
const
3076 Q_D(
const QQuickPopup);
3077 return d->popupItem->bottomInset();
3080void QQuickPopup::setBottomInset(qreal inset)
3083 d->popupItem->setBottomInset(inset);
3086void QQuickPopup::resetBottomInset()
3089 d->popupItem->resetBottomInset();
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136QQuickPopup::PopupType QQuickPopup::popupType()
const
3138 Q_D(
const QQuickPopup);
3139 return d->popupType;
3142void QQuickPopup::setPopupType(PopupType popupType)
3145 if (d->popupType == popupType)
3148 d->popupType = popupType;
3150 emit popupTypeChanged();
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3183bool QQuickPopup::filtersChildMouseEvents()
const
3185 Q_D(
const QQuickPopup);
3186 return d->popupItem->filtersChildMouseEvents();
3189void QQuickPopup::setFiltersChildMouseEvents(
bool filter)
3192 d->popupItem->setFiltersChildMouseEvents(filter);
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205void QQuickPopup::forceActiveFocus(Qt::FocusReason reason)
3208 d->popupItem->forceActiveFocus(reason);
3211void QQuickPopup::classBegin()
3214 d->complete =
false;
3215 QQmlContext *context = qmlContext(
this);
3217 QQmlEngine::setContextForObject(d->popupItem, context);
3218 d->popupItem->classBegin();
3221void QQuickPopup::componentComplete()
3224 qCDebug(lcQuickPopup) <<
"componentComplete" <<
this;
3229 d->popupItem->setObjectName(QQmlMetaType::prettyTypeName(
this));
3230 d->popupItem->componentComplete();
3232 if (
auto currentContentItem = d->popupItem->d_func()->contentItem.data()) {
3233 connect(currentContentItem, &QQuickItem::childrenChanged,
3234 this, &QQuickPopup::contentChildrenChanged);
3237 if (d->visible && d->window)
3241bool QQuickPopup::isComponentComplete()
const
3243 Q_D(
const QQuickPopup);
3247bool QQuickPopup::childMouseEventFilter(QQuickItem *child, QEvent *event)
3254void QQuickPopup::focusInEvent(QFocusEvent *event)
3259void QQuickPopup::focusOutEvent(QFocusEvent *event)
3264void QQuickPopup::keyPressEvent(QKeyEvent *event)
3267 if (!hasActiveFocus())
3270#if QT_CONFIG(shortcut)
3271 if (d->closePolicy.testFlag(QQuickPopup::CloseOnEscape)
3272 && (event->matches(QKeySequence::Cancel)
3273#if defined(Q_OS_ANDROID)
3274 || event->key() == Qt::Key_Back
3284 if (hasActiveFocus() && (event->key() == Qt::Key_Tab || event->key() == Qt::Key_Backtab)) {
3286 QQuickItemPrivate::focusNextPrev(d->popupItem, event->key() == Qt::Key_Tab);
3290void QQuickPopup::keyReleaseEvent(QKeyEvent *event)
3295void QQuickPopup::mousePressEvent(QMouseEvent *event)
3298 event->setAccepted(d->handleMouseEvent(d->popupItem, event));
3301void QQuickPopup::mouseMoveEvent(QMouseEvent *event)
3304 event->setAccepted(d->handleMouseEvent(d->popupItem, event));
3307void QQuickPopup::mouseReleaseEvent(QMouseEvent *event)
3310 event->setAccepted(d->handleMouseEvent(d->popupItem, event));
3313void QQuickPopup::mouseDoubleClickEvent(QMouseEvent *event)
3318void QQuickPopup::mouseUngrabEvent()
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337bool QQuickPopup::overlayEvent(QQuickItem *item, QEvent *event)
3344 if (d->belongsToOverlayChildAbove(item))
3347 switch (event->type()) {
3348 case QEvent::KeyPress:
3349 case QEvent::KeyRelease:
3350 case QEvent::MouseMove:
3355 case QEvent::DragEnter:
3356 case QEvent::DragMove:
3357 case QEvent::DragLeave:
3364#if QT_CONFIG(tabletevent)
3365 case QEvent::TabletPress:
3366 case QEvent::TabletMove:
3367 case QEvent::TabletRelease:
3372#if QT_CONFIG(quicktemplates2_multitouch)
3373 case QEvent::TouchBegin:
3374 case QEvent::TouchUpdate:
3375 case QEvent::TouchEnd:
3376 return d->handleTouchEvent(item,
static_cast<QTouchEvent *>(event));
3378 case QEvent::HoverEnter:
3379 case QEvent::HoverMove:
3380 case QEvent::HoverLeave:
3381 return d->handleHoverEvent(item,
static_cast<QHoverEvent *>(event));
3383 case QEvent::MouseButtonPress:
3384 case QEvent::MouseButtonRelease:
3385 return d->handleMouseEvent(item,
static_cast<QMouseEvent *>(event));
3392#if QT_CONFIG(quicktemplates2_multitouch)
3393void QQuickPopup::touchEvent(QTouchEvent *event)
3396 event->setAccepted(d->handleTouchEvent(d->popupItem, event));
3399void QQuickPopup::touchUngrabEvent()
3406#if QT_CONFIG(wheelevent)
3407void QQuickPopup::wheelEvent(QWheelEvent *event)
3413#if QT_CONFIG(quick_draganddrop)
3414void QQuickPopup::dragMoveEvent(QDragMoveEvent *event)
3419void QQuickPopup::dragLeaveEvent(QDragLeaveEvent *event)
3424void QQuickPopup::dropEvent(QDropEvent *event)
3429void QQuickPopup::dragEnterEvent(QDragEnterEvent *event)
3435void QQuickPopup::contentItemChange(QQuickItem *newItem, QQuickItem *oldItem)
3441void QQuickPopup::contentSizeChange(
const QSizeF &newSize,
const QSizeF &oldSize)
3443 qCDebug(lcQuickPopup) <<
"contentSizeChange called on" <<
this <<
"with newSize" << newSize <<
"oldSize" << oldSize;
3444 if (!qFuzzyCompare(newSize.width(), oldSize.width()))
3445 emit contentWidthChanged();
3446 if (!qFuzzyCompare(newSize.height(), oldSize.height()))
3447 emit contentHeightChanged();
3450void QQuickPopup::fontChange(
const QFont &newFont,
const QFont &oldFont)
3457void QQuickPopup::geometryChange(
const QRectF &newGeometry,
const QRectF &oldGeometry)
3460 qCDebug(lcQuickPopup) <<
"geometryChange called on" <<
this <<
"with newGeometry" << newGeometry <<
"oldGeometry" << oldGeometry;
3461 if (!d->usePopupWindow())
3463 if (!qFuzzyCompare(newGeometry.width(), oldGeometry.width())) {
3464 emit widthChanged();
3465 emit availableWidthChanged();
3467 if (!qFuzzyCompare(newGeometry.height(), oldGeometry.height())) {
3468 emit heightChanged();
3469 emit availableHeightChanged();
3473void QQuickPopup::itemChange(QQuickItem::ItemChange change,
const QQuickItem::ItemChangeData &)
3476 case QQuickItem::ItemActiveFocusHasChanged:
3477 emit activeFocusChanged();
3479 case QQuickItem::ItemOpacityHasChanged:
3480 emit opacityChanged();
3487void QQuickPopup::localeChange(
const QLocale &newLocale,
const QLocale &oldLocale)
3489 Q_UNUSED(newLocale);
3490 Q_UNUSED(oldLocale);
3491 emit localeChanged();
3494void QQuickPopup::marginsChange(
const QMarginsF &newMargins,
const QMarginsF &oldMargins)
3497 Q_UNUSED(newMargins);
3498 Q_UNUSED(oldMargins);
3502void QQuickPopup::paddingChange(
const QMarginsF &newPadding,
const QMarginsF &oldPadding)
3504 const bool tp = !qFuzzyCompare(newPadding.top(), oldPadding.top());
3505 const bool lp = !qFuzzyCompare(newPadding.left(), oldPadding.left());
3506 const bool rp = !qFuzzyCompare(newPadding.right(), oldPadding.right());
3507 const bool bp = !qFuzzyCompare(newPadding.bottom(), oldPadding.bottom());
3510 emit topPaddingChanged();
3512 emit leftPaddingChanged();
3514 emit rightPaddingChanged();
3516 emit bottomPaddingChanged();
3519 emit horizontalPaddingChanged();
3520 emit availableWidthChanged();
3523 emit verticalPaddingChanged();
3524 emit availableHeightChanged();
3528void QQuickPopup::spacingChange(qreal newSpacing, qreal oldSpacing)
3530 Q_UNUSED(newSpacing);
3531 Q_UNUSED(oldSpacing);
3532 emit spacingChanged();
3535void QQuickPopup::insetChange(
const QMarginsF &newInset,
const QMarginsF &oldInset)
3537 if (!qFuzzyCompare(newInset.top(), oldInset.top()))
3538 emit topInsetChanged();
3539 if (!qFuzzyCompare(newInset.left(), oldInset.left()))
3540 emit leftInsetChanged();
3541 if (!qFuzzyCompare(newInset.right(), oldInset.right()))
3542 emit rightInsetChanged();
3543 if (!qFuzzyCompare(newInset.bottom(), oldInset.bottom()))
3544 emit bottomInsetChanged();
3547QFont QQuickPopup::defaultFont()
const
3549 return QQuickTheme::font(QQuickTheme::System);
3552#if QT_CONFIG(accessibility)
3553QAccessible::Role QQuickPopup::effectiveAccessibleRole()
const
3555 auto *attached = qmlAttachedPropertiesObject<QQuickAccessibleAttached>(
this,
false);
3557 auto role = QAccessible::NoRole;
3558 if (
auto *accessibleAttached = qobject_cast<QQuickAccessibleAttached *>(attached))
3559 role = accessibleAttached->role();
3560 if (role == QAccessible::NoRole)
3561 role = accessibleRole();
3566QAccessible::Role QQuickPopup::accessibleRole()
const
3568 return QAccessible::Dialog;
3571void QQuickPopup::accessibilityActiveChanged(
bool active)
3577QString QQuickPopup::accessibleName()
const
3579 Q_D(
const QQuickPopup);
3580 return d->popupItem->accessibleName();
3583void QQuickPopup::maybeSetAccessibleName(
const QString &name)
3586 d->popupItem->maybeSetAccessibleName(name);
3589QVariant QQuickPopup::accessibleProperty(
const char *propertyName)
3591 Q_D(
const QQuickPopup);
3592 return d->popupItem->accessibleProperty(propertyName);
3595bool QQuickPopup::setAccessibleProperty(
const char *propertyName,
const QVariant &value)
3598 return d->popupItem->setAccessibleProperty(propertyName, value);
3601void QQuickPopup::setWindowModality(
const Qt::WindowModality modality)
3604 d->popupWndModality = modality;
3607QQuickItem *QQuickPopup::safeAreaAttachmentItem()
3612QQuickItem *QQuickPopup::attacheeItem()
const
3617QtPrivate::QQuickAttachedPropertyPropagator *QQuickPopup::attachedParent(
3618 const QMetaObject *ourAttachedType)
const
3620 auto *popupWindow = popupItem()->window();
3621 qCDebug(lcAttachedPropertyPropagator).noquote() <<
"- attachee is a popup; checking its window"
3623 auto *object = QtPrivate::QQuickAttachedPropertyPropagator::attachedObject(
3624 ourAttachedType, popupWindow);
3628 if (qobject_cast<QQuickPopupWindow *>(popupWindow)) {
3629 qCDebug(lcAttachedPropertyPropagator).noquote() <<
"- checking its window's transientParent"
3630 << popupWindow->transientParent();
3631 return QtPrivate::QQuickAttachedPropertyPropagator::attachedObject(ourAttachedType,
3632 popupWindow->transientParent());
3640#include "qquickpopup.moc"
3641#include "moc_qquickpopup_p.cpp"
Combined button and popup list for selecting options.
void operator()(QWindowExposedObserver *observer)