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));
560#if QT_CONFIG(quicktemplates2_multitouch)
561bool QQuickPopupPrivate::acceptTouch(
const QTouchEvent::TouchPoint &point)
563 if (point.id() == touchId)
566 if (touchId == -1 && point.state() != QEventPoint::Released) {
567 touchId = point.id();
575bool QQuickPopupPrivate::blockInput(QQuickItem *item,
const QPointF &point)
const
578 if (popupItem->contains(popupItem->mapFromScene(point))
579 && item == QQuickOverlay::overlay(window, parentItem)) {
588 return modal && ((popupItem != item) && !popupItem->isAncestorOf(item)) && (!dimmer || dimmer->contains(dimmer->mapFromScene(point)));
591bool QQuickPopupPrivate::handlePress(QQuickItem *item,
const QPointF &point, ulong timestamp)
595 outsidePressed = !contains(point);
597 if (outsidePressed && parentItem) {
601 const QPointF globalPoint = item->mapToGlobal(point);
602 const QPointF localPoint = parentItem->mapFromGlobal(globalPoint);
603 outsideParentPressed = !parentItem->contains(localPoint);
606 tryClose(point, QQuickPopup::CloseOnPressOutside | QQuickPopup::CloseOnPressOutsideParent);
607 return blockInput(item, point);
610bool QQuickPopupPrivate::handleMove(QQuickItem *item,
const QPointF &point, ulong timestamp)
613 return blockInput(item, point);
616bool QQuickPopupPrivate::handleRelease(QQuickItem *item,
const QPointF &point, ulong timestamp)
619 if (item != popupItem && !contains(pressPoint))
620 tryClose(point, QQuickPopup::CloseOnReleaseOutside | QQuickPopup::CloseOnReleaseOutsideParent);
621 pressPoint = QPointF();
622 outsidePressed =
false;
623 outsideParentPressed =
false;
625 return blockInput(item, point);
628void QQuickPopupPrivate::handleUngrab()
631 QQuickOverlay *overlay = QQuickOverlay::overlay(window, parentItem);
633 QQuickOverlayPrivate *p = QQuickOverlayPrivate::get(overlay);
634 if (p->mouseGrabberPopup == q)
635 p->mouseGrabberPopup =
nullptr;
637 pressPoint = QPointF();
641bool QQuickPopupPrivate::handleMouseEvent(QQuickItem *item, QMouseEvent *event)
643 switch (event->type()) {
644 case QEvent::MouseButtonPress:
645 return handlePress(item, event->scenePosition(), event->timestamp());
646 case QEvent::MouseMove:
647 return handleMove(item, event->scenePosition(), event->timestamp());
648 case QEvent::MouseButtonRelease:
649 return handleRelease(item, event->scenePosition(), event->timestamp());
651 Q_UNREACHABLE_RETURN(
false);
655bool QQuickPopupPrivate::handleHoverEvent(QQuickItem *item, QHoverEvent *event)
657 switch (event->type()) {
658 case QEvent::HoverEnter:
659 case QEvent::HoverMove:
660 case QEvent::HoverLeave:
661 return blockInput(item, event->scenePosition());
663 Q_UNREACHABLE_RETURN(
false);
667QMarginsF QQuickPopupPrivate::windowInsets()
const
669 Q_Q(
const QQuickPopup);
680 const auto *popupItemPrivate = QQuickControlPrivate::get(popupItem);
681 if (!usePopupWindow() || (popupItemPrivate->background.isExecuting() && popupItemPrivate->background->clip())) {
689 q->leftInset() < 0 ? -q->leftInset() : 0,
690 q->rightInset() < 0 ? -q->rightInset() : 0,
691 q->topInset() < 0 ? -q->topInset() : 0,
692 q->bottomInset() < 0 ? -q->bottomInset() : 0
696QPointF QQuickPopupPrivate::windowInsetsTopLeft()
const
698 const QMarginsF windowMargins = windowInsets();
699 return {windowMargins.left(), windowMargins.top()};
702void QQuickPopupPrivate::setEffectivePosFromWindowPos(
const QPointF &windowPos)
719 const QPointF oldEffectivePos = effectivePos;
720 effectivePos = windowPos + windowInsetsTopLeft();
721 if (!qFuzzyCompare(oldEffectivePos.x(), effectivePos.x()))
723 if (!qFuzzyCompare(oldEffectivePos.y(), effectivePos.y()))
727#if QT_CONFIG(quicktemplates2_multitouch)
728bool QQuickPopupPrivate::handleTouchEvent(QQuickItem *item, QTouchEvent *event)
730 switch (event->type()) {
731 case QEvent::TouchBegin:
732 case QEvent::TouchUpdate:
733 case QEvent::TouchEnd:
734 for (
const QTouchEvent::TouchPoint &point : event->points()) {
735 if (event->type() != QEvent::TouchEnd && !acceptTouch(point))
736 return blockInput(item, point.position());
738 switch (point.state()) {
739 case QEventPoint::Pressed:
740 return handlePress(item, point.scenePosition(), event->timestamp());
741 case QEventPoint::Updated:
742 return handleMove(item, point.scenePosition(), event->timestamp());
743 case QEventPoint::Released:
744 return handleRelease(item, point.scenePosition(), event->timestamp());
751 case QEvent::TouchCancel:
763bool QQuickPopupPrivate::prepareEnterTransition()
767 qmlWarning(q) <<
"cannot find any window to open popup in.";
771 if (transitionState == EnterTransition && transitionManager.isRunning())
774 if (transitionState != EnterTransition) {
775 const QPointer<QQuickItem> lastActiveFocusItem = window->activeFocusItem();
777 adjustPopupItemParentAndWindow();
781 emit q->aboutToShow();
782 transitionState = EnterTransition;
783 getPositioner()->setParentItem(parentItem);
784 emit q->visibleChanged();
786 if (lastActiveFocusItem) {
787 this->lastActiveFocusItem = lastActiveFocusItem;
788 if (
auto *overlay = QQuickOverlay::overlay(window, parentItem)) {
789 auto *overlayPrivate = QQuickOverlayPrivate::get(overlay);
790 if (overlayPrivate->lastActiveFocusItem.isNull() && !popupItem->isAncestorOf(lastActiveFocusItem)) {
791 overlayPrivate->lastActiveFocusItem = lastActiveFocusItem;
792 overlayPrivate->lastActiveFocusItemPopup = q;
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);
824 popupItem->setFocus(
false, Qt::PopupFocusReason);
825 transitionState = ExitTransition;
827 emit q->aboutToHide();
828 emit q->openedChanged();
833void QQuickPopupPrivate::finalizeEnterTransition()
836 transitionState = NoTransition;
838 emit q->openedChanged();
842void QQuickPopupPrivate::finalizeExitTransition()
845 getPositioner()->setParentItem(
nullptr);
847 popupItem->setParentItem(
nullptr);
848 popupItem->setVisible(
false);
852 if (
auto *overlay = QQuickOverlay::overlay(window, parentItem)) {
853 auto *overlayPrivate = QQuickOverlayPrivate::get(overlay);
854 const auto stackingOrderPopups = overlayPrivate->stackingOrderPopups();
856 bool resetLastActiveFocusItem = (overlayPrivate->lastActiveFocusItemPopup == q);
857 if (resetLastActiveFocusItem) {
859
860
861
862
863
864
865
866 for (
auto popup : stackingOrderPopups) {
867 if (QQuickPopupPrivate::get(popup)->transitionState != ExitTransition) {
868 if (
auto savedFocusItem = QQuickPopupPrivate::get(popup)->lastActiveFocusItem) {
869 if (!qobject_cast<QQuickRootItem *>(savedFocusItem) && savedFocusItem != popupItem
870 && !popupItem->isAncestorOf(savedFocusItem)) {
871 overlayPrivate->lastActiveFocusItem = savedFocusItem;
873 overlayPrivate->lastActiveFocusItemPopup = popup;
874 resetLastActiveFocusItem =
false;
882 if (hadActiveFocusBeforeExitTransition) {
883 QQuickPopup *nextFocusPopup =
nullptr;
884 for (
auto popup : stackingOrderPopups) {
886 if (QQuickPopupPrivate::get(popup)->transitionState != ExitTransition
887 && popup->hasFocus() && !popup->hasActiveFocus()) {
888 nextFocusPopup = popup;
892 if (nextFocusPopup) {
893 nextFocusPopup->forceActiveFocus(Qt::PopupFocusReason);
895 auto *appWindow = qobject_cast<QQuickApplicationWindow*>(window);
896 auto *contentItem = appWindow ? appWindow->contentItem() : window->contentItem();
897 if (!contentItem->scopedFocusItem()
898 && !overlayPrivate->lastActiveFocusItem.isNull()) {
901 overlayPrivate->lastActiveFocusItem->forceActiveFocus(Qt::OtherFocusReason);
903 contentItem->setFocus(
true, Qt::PopupFocusReason);
909 if (resetLastActiveFocusItem || stackingOrderPopups.isEmpty()) {
910 overlayPrivate->lastActiveFocusItem =
nullptr;
911 overlayPrivate->lastActiveFocusItemPopup =
nullptr;
916 adjustPopupItemParentAndWindow();
917 transitionState = NoTransition;
918 hadActiveFocusBeforeExitTransition =
false;
919 lastActiveFocusItem =
nullptr;
920 emit q->visibleChanged();
922#if QT_CONFIG(accessibility)
923 const auto type = q->effectiveAccessibleRole() == QAccessible::PopupMenu
924 ? QAccessible::PopupMenuEnd
925 : QAccessible::DialogEnd;
926 QAccessibleEvent ev(q->popupItem(), type);
927 QAccessible::updateAccessibility(&ev);
930 popupItem->setScale(prevScale);
931 popupItem->setOpacity(prevOpacity);
935void QQuickPopupPrivate::opened()
939#if QT_CONFIG(accessibility)
940 const auto type = q->effectiveAccessibleRole() == QAccessible::PopupMenu
941 ? QAccessible::PopupMenuStart
942 : QAccessible::DialogStart;
943 QAccessibleEvent ev(q->popupItem(), type);
944 QAccessible::updateAccessibility(&ev);
948Qt::WindowFlags QQuickPopupPrivate::popupWindowFlags()
const
953void QQuickPopupPrivate::setPopupWindowFlags(Qt::WindowFlags flags)
958QMarginsF QQuickPopupPrivate::getMargins()
const
960 Q_Q(
const QQuickPopup);
961 return QMarginsF(q->leftMargin(), q->topMargin(), q->rightMargin(), q->bottomMargin());
964void QQuickPopupPrivate::setTopMargin(qreal value,
bool reset)
967 qreal oldMargin = q->topMargin();
969 hasTopMargin = !reset;
970 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
971 emit q->topMarginChanged();
972 q->marginsChange(QMarginsF(leftMargin, topMargin, rightMargin, bottomMargin),
973 QMarginsF(leftMargin, oldMargin, rightMargin, bottomMargin));
977void QQuickPopupPrivate::setLeftMargin(qreal value,
bool reset)
980 qreal oldMargin = q->leftMargin();
982 hasLeftMargin = !reset;
983 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
984 emit q->leftMarginChanged();
985 q->marginsChange(QMarginsF(leftMargin, topMargin, rightMargin, bottomMargin),
986 QMarginsF(oldMargin, topMargin, rightMargin, bottomMargin));
990void QQuickPopupPrivate::setRightMargin(qreal value,
bool reset)
993 qreal oldMargin = q->rightMargin();
995 hasRightMargin = !reset;
996 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
997 emit q->rightMarginChanged();
998 q->marginsChange(QMarginsF(leftMargin, topMargin, rightMargin, bottomMargin),
999 QMarginsF(leftMargin, topMargin, oldMargin, bottomMargin));
1003void QQuickPopupPrivate::setBottomMargin(qreal value,
bool reset)
1006 qreal oldMargin = q->bottomMargin();
1007 bottomMargin = value;
1008 hasBottomMargin = !reset;
1009 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
1010 emit q->bottomMarginChanged();
1011 q->marginsChange(QMarginsF(leftMargin, topMargin, rightMargin, bottomMargin),
1012 QMarginsF(leftMargin, topMargin, rightMargin, oldMargin));
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049QQuickPopupAnchors *QQuickPopupPrivate::getAnchors()
1053 anchors =
new QQuickPopupAnchors(q);
1057QQuickPopupPositioner *QQuickPopupPrivate::getPositioner()
1061 positioner =
new QQuickPopupPositioner(q);
1065void QQuickPopupPrivate::setWindow(QQuickWindow *newWindow)
1068 if (window == newWindow)
1072 QQuickOverlay *overlay = QQuickOverlay::overlay(window, parentItem);
1074 QQuickOverlayPrivate::get(overlay)->removePopup(q);
1079 if (!newWindow && popupItem)
1080 popupItem->setParentItem(
nullptr);
1086 QQuickOverlay *overlay = QQuickOverlay::overlay(newWindow, parentItem);
1088 QQuickOverlayPrivate::get(overlay)->addPopup(q);
1090 QQuickControlPrivate *p = QQuickControlPrivate::get(popupItem);
1092 if (QQuickApplicationWindow *appWindow = qobject_cast<QQuickApplicationWindow *>(newWindow))
1093 p->updateLocale(appWindow->locale(),
false);
1096 emit q->windowChanged(newWindow);
1098 if (complete && visible && window)
1099 transitionManager.transitionEnter();
1102void QQuickPopupPrivate::itemDestroyed(QQuickItem *item)
1105 if (item == parentItem)
1106 q->setParentItem(
nullptr);
1109void QQuickPopupPrivate::reposition()
1111 getPositioner()->reposition();
1114QPalette QQuickPopupPrivate::defaultPalette()
const
1116 return QQuickTheme::palette(QQuickTheme::System);
1119QQuickPopup::PopupType QQuickPopupPrivate::resolvedPopupType()
const
1129 if (popupType == QQuickPopup::PopupType::Window
1130 || popupType == QQuickPopup::PopupType::Native) {
1131 if (QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::Capability::MultipleWindows))
1132 return QQuickPopup::PopupType::Window;
1135 return QQuickPopup::PopupType::Item;
1138bool QQuickPopupPrivate::usePopupWindow()
const
1140 return resolvedPopupType() == QQuickPopup::PopupType::Window;
1143void QQuickPopupPrivate::adjustPopupItemParentAndWindow()
1146 QQuickOverlay *overlay = QQuickOverlay::overlay(window, parentItem);
1148 if (visible && popupWindowDirty) {
1149 popupItem->setParentItem(overlay);
1151 popupWindow->deleteLater();
1152 popupWindow =
nullptr;
1154 popupWindowDirty =
false;
1157 if (usePopupWindow()) {
1160 popupWindow =
new QQuickPopupWindow(q, window);
1163 const qreal initialWidth = popupItem->width() + windowInsets().left() + windowInsets().right();
1164 const qreal initialHeight = popupItem->height() + windowInsets().top() + windowInsets().bottom();
1165 popupItem->setParentItem(popupWindow->contentItem());
1166 popupWindow->resize(qCeil(initialWidth), qCeil(initialHeight));
1167 if (popupWndModality != Qt::NonModal)
1168 popupWindow->setModality(popupWndModality);
1170 popupWindow->setModality(modal ? Qt::ApplicationModal : Qt::NonModal);
1171 popupItem->resetTitle();
1172 popupWindow->setTitle(title);
1174 popupItem->setParentItem(popupWindow->contentItem());
1175 popupItem->forceActiveFocus(Qt::PopupFocusReason);
1177 if (popupWindow && popupWindow->transientParent()) {
1178 auto *transientParentPriv = QQuickWindowPrivate::get(qobject_cast<QQuickWindow *>(popupWindow->transientParent()));
1179 if (!transientParentPriv->inDestructor)
1180 popupWindow->setVisible(visible);
1184 popupItem->setParentItem(overlay);
1185 const auto popupStack = QQuickOverlayPrivate::get(overlay)->stackingOrderPopups();
1189 const QQuickPopup *topPopup = popupStack.isEmpty() ?
nullptr : popupStack.first();
1190 const QObject *ancestor = q;
1191 while (ancestor && topPopup) {
1192 if (ancestor == topPopup)
1194 ancestor = ancestor->parent();
1196 if (topPopup && topPopup != q && ancestor) {
1197 QQuickItem *topPopupItem = popupStack.first()->popupItem();
1198 popupItem->stackAfter(topPopupItem);
1202 popupItem->setZ(qMax(topPopupItem->z(), popupItem->z()));
1204 q->setModal((popupWndModality != Qt::NonModal) || modal);
1207 popupItem->setTitle(title);
1209 popupItem->setVisible(visible);
1212QQuickItem *QQuickPopupPrivate::createDimmer(QQmlComponent *component, QQuickPopup *popup, QQuickItem *parent)
const
1214 QQuickItem *item =
nullptr;
1216 QQmlContext *context = component->creationContext();
1218 context = qmlContext(popup);
1219 item = qobject_cast<QQuickItem*>(component->beginCreate(context));
1224 if (!item && popup->isModal())
1225 item =
new QQuickItem;
1228 item->setParentItem(parent);
1229 if (resolvedPopupType() != QQuickPopup::PopupType::Window)
1230 item->stackBefore(popup->popupItem());
1231 item->setZ(popup->z());
1233 qCDebug(lcDimmer) <<
"dimmer" << item <<
"registered with" << parent;
1234 parent->setProperty(
"_q_dimmerItem", QVariant::fromValue<QQuickItem*>(item));
1235 if (popup->isModal()) {
1236 item->setAcceptedMouseButtons(Qt::AllButtons);
1237#if QT_CONFIG(cursor)
1238 item->setCursor(Qt::ArrowCursor);
1240#if QT_CONFIG(quicktemplates2_hover)
1242 item->setAcceptHoverEvents(
true);
1248 component->completeCreate();
1250 qCDebug(lcDimmer) <<
"finished creating dimmer from component" << component
1251 <<
"for popup" << popup <<
"with parent" << parent <<
"- item is:" << item;
1255void QQuickPopupPrivate::createOverlay()
1258 QQuickOverlay *overlay = QQuickOverlay::overlay(window, parentItem);
1262 QQmlComponent *component =
nullptr;
1263 QQuickOverlayAttached *overlayAttached = qobject_cast<QQuickOverlayAttached *>(qmlAttachedPropertiesObject<QQuickOverlay>(q,
false));
1264 if (overlayAttached)
1265 component = modal ? overlayAttached->modal() : overlayAttached->modeless();
1268 component = modal ? overlay->modal() : overlay->modeless();
1271 dimmer = createDimmer(component, q, overlay);
1278 explicitDimmerOpacity = dimmer->opacity();
1280 dimmer->setOpacity(0);
1287void QQuickPopupPrivate::destroyDimmer()
1290 qCDebug(lcDimmer) <<
"destroying dimmer" << dimmer;
1291 if (QObject *dimmerParentItem = dimmer->parentItem()) {
1292 if (dimmerParentItem->property(
"_q_dimmerItem").value<QQuickItem*>() == dimmer)
1293 dimmerParentItem->setProperty(
"_q_dimmerItem", QVariant());
1295 dimmer->setParentItem(
nullptr);
1296 dimmer->deleteLater();
1301void QQuickPopupPrivate::toggleOverlay()
1308void QQuickPopupPrivate::updateContentPalettes(
const QPalette& parentPalette)
1311 if (providesPalette())
1312 inheritPalette(parentPalette);
1314 QQuickItemPrivate::get(popupItem)->updateChildrenPalettes(parentPalette);
1317void QQuickPopupPrivate::updateChildrenPalettes(
const QPalette& parentPalette)
1319 updateContentPalettes(parentPalette);
1322void QQuickPopupPrivate::showDimmer()
1326 QQmlProperty::write(dimmer, QStringLiteral(
"opacity"), explicitDimmerOpacity);
1329void QQuickPopupPrivate::hideDimmer()
1333 QQmlProperty::write(dimmer, QStringLiteral(
"opacity"), 0.0);
1336void QQuickPopupPrivate::resizeDimmer()
1341 const QQuickOverlay *overlay = QQuickOverlay::overlay(window, parentItem);
1343 qreal w = overlay ? overlay->width() : 0;
1344 qreal h = overlay ? overlay->height() : 0;
1345 dimmer->setSize(QSizeF(w, h));
1348QQuickPopupTransitionManager::QQuickPopupTransitionManager(QQuickPopupPrivate *popup)
1353void QQuickPopupTransitionManager::transitionEnter()
1355 if (popup->transitionState == QQuickPopupPrivate::ExitTransition)
1358 if (!popup->prepareEnterTransition())
1362 transition(popup->enterActions, popup->enter, popup->q_func());
1367void QQuickPopupTransitionManager::transitionExit()
1369 if (!popup->prepareExitTransition())
1373 transition(popup->exitActions, popup->exit, popup->q_func());
1378void QQuickPopupTransitionManager::finished()
1380 if (popup->transitionState == QQuickPopupPrivate::EnterTransition)
1381 popup->finalizeEnterTransition();
1382 else if (popup->transitionState == QQuickPopupPrivate::ExitTransition)
1383 popup->finalizeExitTransition();
1386QQuickPopup::QQuickPopup(QObject *parent)
1387 : QObject(*(
new QQuickPopupPrivate), parent)
1392 d->relaxEdgeConstraint =
true;
1395QQuickPopup::QQuickPopup(QQuickPopupPrivate &dd, QObject *parent)
1396 : QObject(dd, parent)
1402QQuickPopup::~QQuickPopup()
1405 d->inDestructor =
true;
1407 QQuickItem *currentContentItem = d->popupItem->d_func()->contentItem.data();
1408 if (currentContentItem) {
1409 disconnect(currentContentItem, &QQuickItem::childrenChanged,
1410 this, &QQuickPopup::contentChildrenChanged);
1413 setParentItem(
nullptr);
1418 if (d->transitionState == QQuickPopupPrivate::ExitTransition && d->transitionManager.isRunning())
1419 d->finalizeExitTransition();
1421 delete d->popupItem;
1422 d->popupItem =
nullptr;
1423 delete d->positioner;
1424 d->positioner =
nullptr;
1426 delete d->popupWindow;
1427 d->popupWindow =
nullptr;
1431
1432
1433
1434
1435
1436
1437void QQuickPopup::open()
1443
1444
1445
1446
1447
1448
1449void QQuickPopup::close()
1455
1456
1457
1458
1459
1460
1461qreal QQuickPopup::x()
const
1463 return d_func()->effectivePos.x();
1466void QQuickPopup::setX(qreal x)
1469 setPosition(QPointF(x, d->y));
1473
1474
1475
1476
1477
1478
1479qreal QQuickPopup::y()
const
1481 return d_func()->effectivePos.y();
1484void QQuickPopup::setY(qreal y)
1487 setPosition(QPointF(d->x, y));
1490QPointF QQuickPopup::position()
const
1492 return d_func()->effectivePos;
1495void QQuickPopup::setPosition(
const QPointF &pos)
1498 const bool xChange = !qFuzzyCompare(d->x, pos.x());
1499 const bool yChange = !qFuzzyCompare(d->y, pos.y());
1500 if (!xChange && !yChange)
1505 if (d->popupItem->isVisible()) {
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535qreal QQuickPopup::z()
const
1537 Q_D(
const QQuickPopup);
1538 return d->popupItem->z();
1541void QQuickPopup::setZ(qreal z)
1545 bool previousZ = d->popupWindow ? d->popupWindow->z() : d->popupItem->z();
1546 if (qFuzzyCompare(z, previousZ))
1549 d->popupWindow->setZ(z);
1551 d->popupItem->setZ(z);
1555void QQuickPopup::resetZ()
1563
1564
1565
1566
1567qreal QQuickPopup::width()
const
1569 Q_D(
const QQuickPopup);
1570 return d->popupItem->width();
1573void QQuickPopup::setWidth(qreal width)
1584 d->popupWindow->setWidth(width + d->windowInsets().left() + d->windowInsets().right());
1586 d->popupItem->setWidth(width);
1589void QQuickPopup::resetWidth()
1595 d->hasWidth =
false;
1596 d->popupItem->resetWidth();
1597 if (d->popupItem->isVisible())
1602
1603
1604
1605
1606qreal QQuickPopup::height()
const
1608 Q_D(
const QQuickPopup);
1609 return d->popupItem->height();
1612void QQuickPopup::setHeight(qreal height)
1615 d->hasHeight =
true;
1623 d->popupWindow->setHeight(height + d->windowInsets().top() + d->windowInsets().bottom());
1625 d->popupItem->setHeight(height);
1628void QQuickPopup::resetHeight()
1634 d->hasHeight =
false;
1635 d->popupItem->resetHeight();
1636 if (d->popupItem->isVisible())
1641
1642
1643
1644
1645qreal QQuickPopup::implicitWidth()
const
1647 Q_D(
const QQuickPopup);
1648 return d->popupItem->implicitWidth();
1651void QQuickPopup::setImplicitWidth(qreal width)
1654 d->popupItem->setImplicitWidth(width);
1658
1659
1660
1661
1662qreal QQuickPopup::implicitHeight()
const
1664 Q_D(
const QQuickPopup);
1665 return d->popupItem->implicitHeight();
1668void QQuickPopup::setImplicitHeight(qreal height)
1671 d->popupItem->setImplicitHeight(height);
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684qreal QQuickPopup::contentWidth()
const
1686 Q_D(
const QQuickPopup);
1687 return d->popupItem->contentWidth();
1690void QQuickPopup::setContentWidth(qreal width)
1693 d->popupItem->setContentWidth(width);
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706qreal QQuickPopup::contentHeight()
const
1708 Q_D(
const QQuickPopup);
1709 return d->popupItem->contentHeight();
1712void QQuickPopup::setContentHeight(qreal height)
1715 d->popupItem->setContentHeight(height);
1719
1720
1721
1722
1723
1724
1725
1726
1727qreal QQuickPopup::availableWidth()
const
1729 Q_D(
const QQuickPopup);
1730 return d->popupItem->availableWidth();
1734
1735
1736
1737
1738
1739
1740
1741
1742qreal QQuickPopup::availableHeight()
const
1744 Q_D(
const QQuickPopup);
1745 return d->popupItem->availableHeight();
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760qreal QQuickPopup::spacing()
const
1762 Q_D(
const QQuickPopup);
1763 return d->popupItem->spacing();
1766void QQuickPopup::setSpacing(qreal spacing)
1769 d->popupItem->setSpacing(spacing);
1772void QQuickPopup::resetSpacing()
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788qreal QQuickPopup::margins()
const
1790 Q_D(
const QQuickPopup);
1794void QQuickPopup::setMargins(qreal margins)
1797 if (qFuzzyCompare(d->margins, margins))
1799 QMarginsF oldMargins(leftMargin(), topMargin(), rightMargin(), bottomMargin());
1800 d->margins = margins;
1801 emit marginsChanged();
1802 QMarginsF newMargins(leftMargin(), topMargin(), rightMargin(), bottomMargin());
1803 if (!qFuzzyCompare(newMargins.top(), oldMargins.top()))
1804 emit topMarginChanged();
1805 if (!qFuzzyCompare(newMargins.left(), oldMargins.left()))
1806 emit leftMarginChanged();
1807 if (!qFuzzyCompare(newMargins.right(), oldMargins.right()))
1808 emit rightMarginChanged();
1809 if (!qFuzzyCompare(newMargins.bottom(), oldMargins.bottom()))
1810 emit bottomMarginChanged();
1811 marginsChange(newMargins, oldMargins);
1814void QQuickPopup::resetMargins()
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830qreal QQuickPopup::topMargin()
const
1832 Q_D(
const QQuickPopup);
1833 if (d->hasTopMargin)
1834 return d->topMargin;
1838void QQuickPopup::setTopMargin(qreal margin)
1841 d->setTopMargin(margin);
1844void QQuickPopup::resetTopMargin()
1847 d->setTopMargin(-1,
true);
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861qreal QQuickPopup::leftMargin()
const
1863 Q_D(
const QQuickPopup);
1864 if (d->hasLeftMargin)
1865 return d->leftMargin;
1869void QQuickPopup::setLeftMargin(qreal margin)
1872 d->setLeftMargin(margin);
1875void QQuickPopup::resetLeftMargin()
1878 d->setLeftMargin(-1,
true);
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892qreal QQuickPopup::rightMargin()
const
1894 Q_D(
const QQuickPopup);
1895 if (d->hasRightMargin)
1896 return d->rightMargin;
1900void QQuickPopup::setRightMargin(qreal margin)
1903 d->setRightMargin(margin);
1906void QQuickPopup::resetRightMargin()
1909 d->setRightMargin(-1,
true);
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923qreal QQuickPopup::bottomMargin()
const
1925 Q_D(
const QQuickPopup);
1926 if (d->hasBottomMargin)
1927 return d->bottomMargin;
1931void QQuickPopup::setBottomMargin(qreal margin)
1934 d->setBottomMargin(margin);
1937void QQuickPopup::resetBottomMargin()
1940 d->setBottomMargin(-1,
true);
1944
1945
1946
1947
1948
1949
1950
1951
1952qreal QQuickPopup::padding()
const
1954 Q_D(
const QQuickPopup);
1955 return d->popupItem->padding();
1958void QQuickPopup::setPadding(qreal padding)
1961 d->popupItem->setPadding(padding);
1964void QQuickPopup::resetPadding()
1967 d->popupItem->resetPadding();
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980qreal QQuickPopup::topPadding()
const
1982 Q_D(
const QQuickPopup);
1983 return d->popupItem->topPadding();
1986void QQuickPopup::setTopPadding(qreal padding)
1989 d->popupItem->setTopPadding(padding);
1992void QQuickPopup::resetTopPadding()
1995 d->popupItem->resetTopPadding();
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008qreal QQuickPopup::leftPadding()
const
2010 Q_D(
const QQuickPopup);
2011 return d->popupItem->leftPadding();
2014void QQuickPopup::setLeftPadding(qreal padding)
2017 d->popupItem->setLeftPadding(padding);
2020void QQuickPopup::resetLeftPadding()
2023 d->popupItem->resetLeftPadding();
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036qreal QQuickPopup::rightPadding()
const
2038 Q_D(
const QQuickPopup);
2039 return d->popupItem->rightPadding();
2042void QQuickPopup::setRightPadding(qreal padding)
2045 d->popupItem->setRightPadding(padding);
2048void QQuickPopup::resetRightPadding()
2051 d->popupItem->resetRightPadding();
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064qreal QQuickPopup::bottomPadding()
const
2066 Q_D(
const QQuickPopup);
2067 return d->popupItem->bottomPadding();
2070void QQuickPopup::setBottomPadding(qreal padding)
2073 d->popupItem->setBottomPadding(padding);
2076void QQuickPopup::resetBottomPadding()
2079 d->popupItem->resetBottomPadding();
2083
2084
2085
2086
2087
2088
2089QLocale QQuickPopup::locale()
const
2091 Q_D(
const QQuickPopup);
2092 return d->popupItem->locale();
2095void QQuickPopup::setLocale(
const QLocale &locale)
2098 d->popupItem->setLocale(locale);
2101void QQuickPopup::resetLocale()
2104 d->popupItem->resetLocale();
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120bool QQuickPopup::isMirrored()
const
2122 Q_D(
const QQuickPopup);
2123 return d->popupItem->isMirrored();
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153QFont QQuickPopup::font()
const
2155 Q_D(
const QQuickPopup);
2156 return d->popupItem->font();
2159void QQuickPopup::setFont(
const QFont &font)
2162 d->popupItem->setFont(font);
2165void QQuickPopup::resetFont()
2168 d->popupItem->resetFont();
2171QQuickWindow *QQuickPopup::window()
const
2173 Q_D(
const QQuickPopup);
2177QQuickItem *QQuickPopup::popupItem()
const
2179 Q_D(
const QQuickPopup);
2180 return d->popupItem;
2184
2185
2186
2187
2188QQuickItem *QQuickPopup::parentItem()
const
2190 Q_D(
const QQuickPopup);
2191 return d->parentItem;
2194void QQuickPopup::setParentItem(QQuickItem *parent)
2197 if (d->parentItem == parent)
2200 if (d->parentItem) {
2201 QObjectPrivate::disconnect(d->parentItem, &QQuickItem::windowChanged, d, &QQuickPopupPrivate::setWindow);
2202 QQuickItemPrivate::get(d->parentItem)->removeItemChangeListener(d, QQuickItemPrivate::Destroyed);
2204 d->parentItem = parent;
2205 QQuickPopupPositioner *positioner = d->getPositioner();
2206 if (positioner->parentItem())
2207 positioner->setParentItem(parent);
2209 QObjectPrivate::connect(parent, &QQuickItem::windowChanged, d, &QQuickPopupPrivate::setWindow);
2210 QQuickItemPrivate::get(d->parentItem)->addItemChangeListener(d, QQuickItemPrivate::Destroyed);
2211 }
else if (d->inDestructor) {
2215 if (!d->window && d->transitionManager.isRunning()) {
2216 if (d->transitionState == QQuickPopupPrivate::EnterTransition)
2217 d->finalizeEnterTransition();
2218 else if (d->transitionState == QQuickPopupPrivate::ExitTransition)
2219 d->finalizeExitTransition();
2225 d->setWindow(parent ? parent->window() :
nullptr);
2226 emit parentChanged();
2229void QQuickPopup::resetParentItem()
2231 if (QQuickWindow *window = qobject_cast<QQuickWindow *>(parent()))
2232 setParentItem(window->contentItem());
2234 setParentItem(findParentItem());
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254QQuickItem *QQuickPopup::background()
const
2256 Q_D(
const QQuickPopup);
2257 return d->popupItem->background();
2260void QQuickPopup::setBackground(QQuickItem *background)
2265 QQuickControlPrivate::warnIfCustomizationNotSupported(
this, background, QStringLiteral(
"background"));
2266 d->popupItem->setBackground(background);
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289QQuickItem *QQuickPopup::contentItem()
const
2291 Q_D(
const QQuickPopup);
2292 return d->popupItem->contentItem();
2295void QQuickPopup::setContentItem(QQuickItem *item)
2299 QQuickControlPrivate::warnIfCustomizationNotSupported(
this, item, QStringLiteral(
"contentItem"));
2300 QQuickItem *oldContentItem = d->complete ? d->popupItem->d_func()->contentItem.data()
2303 disconnect(oldContentItem, &QQuickItem::childrenChanged,
this, &QQuickPopup::contentChildrenChanged);
2304 d->popupItem->setContentItem(item);
2306 QQuickItem *newContentItem = d->popupItem->d_func()->contentItem.data();
2307 connect(newContentItem, &QQuickItem::childrenChanged,
this, &QQuickPopup::contentChildrenChanged);
2308 if (oldContentItem != newContentItem)
2309 emit contentChildrenChanged();
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327QQmlListProperty<QObject> QQuickPopupPrivate::contentData()
2329 QQuickControlPrivate *p = QQuickControlPrivate::get(popupItem);
2330 if (!p->contentItem)
2331 p->executeContentItem();
2332 return QQmlListProperty<QObject>(popupItem->contentItem(),
nullptr,
2333 QQuickItemPrivate::data_append,
2334 QQuickItemPrivate::data_count,
2335 QQuickItemPrivate::data_at,
2336 QQuickItemPrivate::data_clear);
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352QQmlListProperty<QQuickItem> QQuickPopupPrivate::contentChildren()
2354 return QQmlListProperty<QQuickItem>(popupItem->contentItem(),
nullptr,
2355 QQuickItemPrivate::children_append,
2356 QQuickItemPrivate::children_count,
2357 QQuickItemPrivate::children_at,
2358 QQuickItemPrivate::children_clear);
2362
2363
2364
2365
2366
2367bool QQuickPopup::clip()
const
2369 Q_D(
const QQuickPopup);
2370 return d->popupItem->clip() && !d->usePopupWindow();
2373void QQuickPopup::setClip(
bool clip)
2376 if (clip == d->popupItem->clip() || d->usePopupWindow())
2378 d->popupItem->setClip(clip);
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394bool QQuickPopup::hasFocus()
const
2396 Q_D(
const QQuickPopup);
2400void QQuickPopup::setFocus(
bool focus)
2403 if (d->focus == focus)
2406 emit focusChanged();
2410
2411
2412
2413
2414
2415
2416
2417bool QQuickPopup::hasActiveFocus()
const
2419 Q_D(
const QQuickPopup);
2420 return d->popupItem->hasActiveFocus();
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444bool QQuickPopup::isModal()
const
2446 Q_D(
const QQuickPopup);
2450void QQuickPopup::setModal(
bool modal)
2453 if (d->modal == modal)
2456 d->popupWindowDirty =
true;
2457 if (d->complete && d->visible)
2459 emit modalChanged();
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477bool QQuickPopup::dim()
const
2479 Q_D(
const QQuickPopup);
2483void QQuickPopup::setDim(
bool dim)
2492 if (d->complete && d->visible)
2497void QQuickPopup::resetDim()
2508
2509
2510
2511
2512
2513
2514bool QQuickPopup::isVisible()
const
2516 Q_D(
const QQuickPopup);
2517 return d->visible && d->popupItem->isVisible();
2520void QQuickPopup::setVisible(
bool visible)
2526 if (d->visible && visible && d->transitionState != QQuickPopupPrivate::ExitTransition)
2529 if (!d->visible && !visible)
2532 if (!d->complete || (visible && !d->window)) {
2533 d->visible = visible;
2537 if (visible && !parentItem()) {
2538 qmlWarning(
this) <<
"cannot show popup: parent is null";
2543 d->transitionManager.transitionEnter();
2545 d->transitionManager.transitionExit();
2549
2550
2551
2552
2553
2554
2555
2556bool QQuickPopup::isEnabled()
const
2558 Q_D(
const QQuickPopup);
2559 return d->popupItem->isEnabled();
2562void QQuickPopup::setEnabled(
bool enabled)
2565 d->popupItem->setEnabled(enabled);
2569
2570
2571
2572
2573
2574
2575
2576
2577bool QQuickPopup::isOpened()
const
2579 Q_D(
const QQuickPopup);
2580 return d->transitionState == QQuickPopupPrivate::NoTransition && isVisible();
2584
2585
2586
2587
2588
2589
2590
2591qreal QQuickPopup::opacity()
const
2593 Q_D(
const QQuickPopup);
2594 return d->popupItem->opacity();
2597void QQuickPopup::setOpacity(qreal opacity)
2600 d->popupItem->setOpacity(opacity);
2604
2605
2606
2607
2608
2609
2610
2611
2612qreal QQuickPopup::scale()
const
2614 Q_D(
const QQuickPopup);
2615 return d->popupItem->scale();
2618void QQuickPopup::setScale(qreal scale)
2621 if (qFuzzyCompare(scale, d->popupItem->scale()))
2623 d->popupItem->setScale(scale);
2624 emit scaleChanged();
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653QQuickPopup::ClosePolicy QQuickPopup::closePolicy()
const
2655 Q_D(
const QQuickPopup);
2656 return d->closePolicy;
2659void QQuickPopup::setClosePolicy(ClosePolicy policy)
2662 d->hasClosePolicy =
true;
2663 if (d->closePolicy == policy)
2665 d->closePolicy = policy;
2666 emit closePolicyChanged();
2669void QQuickPopup::resetClosePolicy()
2672 setClosePolicy(QQuickPopupPrivate::DefaultClosePolicy);
2673 d->hasClosePolicy =
false;
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689QQuickPopup::TransformOrigin QQuickPopup::transformOrigin()
const
2691 Q_D(
const QQuickPopup);
2692 return static_cast<TransformOrigin>(d->popupItem->transformOrigin());
2695void QQuickPopup::setTransformOrigin(TransformOrigin origin)
2698 d->popupItem->setTransformOrigin(
static_cast<QQuickItem::TransformOrigin>(origin));
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719QQuickTransition *QQuickPopup::enter()
const
2721 Q_D(
const QQuickPopup);
2725void QQuickPopup::setEnter(QQuickTransition *transition)
2728 if (d->enter == transition)
2730 d->enter = transition;
2731 emit enterChanged();
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752QQuickTransition *QQuickPopup::exit()
const
2754 Q_D(
const QQuickPopup);
2758void QQuickPopup::setExit(QQuickTransition *transition)
2761 if (d->exit == transition)
2763 d->exit = transition;
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778qreal QQuickPopup::horizontalPadding()
const
2780 Q_D(
const QQuickPopup);
2781 return d->popupItem->horizontalPadding();
2784void QQuickPopup::setHorizontalPadding(qreal padding)
2787 d->popupItem->setHorizontalPadding(padding);
2790void QQuickPopup::resetHorizontalPadding()
2793 d->popupItem->resetHorizontalPadding();
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807qreal QQuickPopup::verticalPadding()
const
2809 Q_D(
const QQuickPopup);
2810 return d->popupItem->verticalPadding();
2813void QQuickPopup::setVerticalPadding(qreal padding)
2816 d->popupItem->setVerticalPadding(padding);
2819void QQuickPopup::resetVerticalPadding()
2822 d->popupItem->resetVerticalPadding();
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836qreal QQuickPopup::implicitContentWidth()
const
2838 Q_D(
const QQuickPopup);
2839 return d->popupItem->implicitContentWidth();
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853qreal QQuickPopup::implicitContentHeight()
const
2855 Q_D(
const QQuickPopup);
2856 return d->popupItem->implicitContentHeight();
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870qreal QQuickPopup::implicitBackgroundWidth()
const
2872 Q_D(
const QQuickPopup);
2873 return d->popupItem->implicitBackgroundWidth();
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887qreal QQuickPopup::implicitBackgroundHeight()
const
2889 Q_D(
const QQuickPopup);
2890 return d->popupItem->implicitBackgroundHeight();
2894
2895
2896
2897
2898
2899
2900
2901qreal QQuickPopup::topInset()
const
2903 Q_D(
const QQuickPopup);
2904 return d->popupItem->topInset();
2907void QQuickPopup::setTopInset(qreal inset)
2910 d->popupItem->setTopInset(inset);
2913void QQuickPopup::resetTopInset()
2916 d->popupItem->resetTopInset();
2920
2921
2922
2923
2924
2925
2926
2927qreal QQuickPopup::leftInset()
const
2929 Q_D(
const QQuickPopup);
2930 return d->popupItem->leftInset();
2933void QQuickPopup::setLeftInset(qreal inset)
2936 d->popupItem->setLeftInset(inset);
2939void QQuickPopup::resetLeftInset()
2942 d->popupItem->resetLeftInset();
2946
2947
2948
2949
2950
2951
2952
2953qreal QQuickPopup::rightInset()
const
2955 Q_D(
const QQuickPopup);
2956 return d->popupItem->rightInset();
2959void QQuickPopup::setRightInset(qreal inset)
2962 d->popupItem->setRightInset(inset);
2965void QQuickPopup::resetRightInset()
2968 d->popupItem->resetRightInset();
2972
2973
2974
2975
2976
2977
2978
2979qreal QQuickPopup::bottomInset()
const
2981 Q_D(
const QQuickPopup);
2982 return d->popupItem->bottomInset();
2985void QQuickPopup::setBottomInset(qreal inset)
2988 d->popupItem->setBottomInset(inset);
2991void QQuickPopup::resetBottomInset()
2994 d->popupItem->resetBottomInset();
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041QQuickPopup::PopupType QQuickPopup::popupType()
const
3043 Q_D(
const QQuickPopup);
3044 return d->popupType;
3047void QQuickPopup::setPopupType(PopupType popupType)
3050 if (d->popupType == popupType)
3053 d->popupType = popupType;
3055 emit popupTypeChanged();
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3088bool QQuickPopup::filtersChildMouseEvents()
const
3090 Q_D(
const QQuickPopup);
3091 return d->popupItem->filtersChildMouseEvents();
3094void QQuickPopup::setFiltersChildMouseEvents(
bool filter)
3097 d->popupItem->setFiltersChildMouseEvents(filter);
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110void QQuickPopup::forceActiveFocus(Qt::FocusReason reason)
3113 d->popupItem->forceActiveFocus(reason);
3116void QQuickPopup::classBegin()
3119 d->complete =
false;
3120 QQmlContext *context = qmlContext(
this);
3122 QQmlEngine::setContextForObject(d->popupItem, context);
3123 d->popupItem->classBegin();
3126void QQuickPopup::componentComplete()
3129 qCDebug(lcQuickPopup) <<
"componentComplete" <<
this;
3133 if (d->visible && d->window)
3134 d->transitionManager.transitionEnter();
3137 d->popupItem->setObjectName(QQmlMetaType::prettyTypeName(
this));
3138 d->popupItem->componentComplete();
3140 if (
auto currentContentItem = d->popupItem->d_func()->contentItem.data()) {
3141 connect(currentContentItem, &QQuickItem::childrenChanged,
3142 this, &QQuickPopup::contentChildrenChanged);
3146bool QQuickPopup::isComponentComplete()
const
3148 Q_D(
const QQuickPopup);
3152bool QQuickPopup::childMouseEventFilter(QQuickItem *child, QEvent *event)
3159void QQuickPopup::focusInEvent(QFocusEvent *event)
3164void QQuickPopup::focusOutEvent(QFocusEvent *event)
3169void QQuickPopup::keyPressEvent(QKeyEvent *event)
3172 if (!hasActiveFocus())
3175#if QT_CONFIG(shortcut)
3176 if (d->closePolicy.testFlag(QQuickPopup::CloseOnEscape)
3177 && (event->matches(QKeySequence::Cancel)
3178#if defined(Q_OS_ANDROID)
3179 || event->key() == Qt::Key_Back
3189 if (hasActiveFocus() && (event->key() == Qt::Key_Tab || event->key() == Qt::Key_Backtab)) {
3191 QQuickItemPrivate::focusNextPrev(d->popupItem, event->key() == Qt::Key_Tab);
3195void QQuickPopup::keyReleaseEvent(QKeyEvent *event)
3200void QQuickPopup::mousePressEvent(QMouseEvent *event)
3203 event->setAccepted(d->handleMouseEvent(d->popupItem, event));
3206void QQuickPopup::mouseMoveEvent(QMouseEvent *event)
3209 event->setAccepted(d->handleMouseEvent(d->popupItem, event));
3212void QQuickPopup::mouseReleaseEvent(QMouseEvent *event)
3215 event->setAccepted(d->handleMouseEvent(d->popupItem, event));
3218void QQuickPopup::mouseDoubleClickEvent(QMouseEvent *event)
3223void QQuickPopup::mouseUngrabEvent()
3232 QQuickItem *sourceAncestor = source;
3233 while (sourceAncestor) {
3234 QQuickItem *parentItem = sourceAncestor->parentItem();
3235 if (parentItem == overlay)
3236 return sourceAncestor;
3237 sourceAncestor = parentItem;
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255bool QQuickPopup::overlayEvent(QQuickItem *item, QEvent *event)
3262 auto *overlay = QQuickOverlay::overlay(d->window, d->parentItem);
3264 const QList<QQuickItem *> paintOrderChildItems = QQuickOverlayPrivate::get(overlay)->paintOrderChildItems();
3265 const qsizetype targetItemPaintOrderIndex = paintOrderChildItems.indexOf(findRootOfOverlaySubtree(item, overlay));
3266 const qsizetype popupItemPaintOrderIndex = paintOrderChildItems.indexOf(d->popupItem);
3267 if (targetItemPaintOrderIndex > popupItemPaintOrderIndex)
3270 switch (event->type()) {
3271 case QEvent::KeyPress:
3272 case QEvent::KeyRelease:
3273 case QEvent::MouseMove:
3279#if QT_CONFIG(quicktemplates2_multitouch)
3280 case QEvent::TouchBegin:
3281 case QEvent::TouchUpdate:
3282 case QEvent::TouchEnd:
3283 return d->handleTouchEvent(item,
static_cast<QTouchEvent *>(event));
3285 case QEvent::HoverEnter:
3286 case QEvent::HoverMove:
3287 case QEvent::HoverLeave:
3288 return d->handleHoverEvent(item,
static_cast<QHoverEvent *>(event));
3290 case QEvent::MouseButtonPress:
3291 case QEvent::MouseButtonRelease:
3292 return d->handleMouseEvent(item,
static_cast<QMouseEvent *>(event));
3299#if QT_CONFIG(quicktemplates2_multitouch)
3300void QQuickPopup::touchEvent(QTouchEvent *event)
3303 event->setAccepted(d->handleTouchEvent(d->popupItem, event));
3306void QQuickPopup::touchUngrabEvent()
3313#if QT_CONFIG(wheelevent)
3314void QQuickPopup::wheelEvent(QWheelEvent *event)
3320void QQuickPopup::contentItemChange(QQuickItem *newItem, QQuickItem *oldItem)
3326void QQuickPopup::contentSizeChange(
const QSizeF &newSize,
const QSizeF &oldSize)
3328 qCDebug(lcQuickPopup) <<
"contentSizeChange called on" <<
this <<
"with newSize" << newSize <<
"oldSize" << oldSize;
3329 if (!qFuzzyCompare(newSize.width(), oldSize.width()))
3330 emit contentWidthChanged();
3331 if (!qFuzzyCompare(newSize.height(), oldSize.height()))
3332 emit contentHeightChanged();
3335void QQuickPopup::fontChange(
const QFont &newFont,
const QFont &oldFont)
3342void QQuickPopup::geometryChange(
const QRectF &newGeometry,
const QRectF &oldGeometry)
3345 qCDebug(lcQuickPopup) <<
"geometryChange called on" <<
this <<
"with newGeometry" << newGeometry <<
"oldGeometry" << oldGeometry;
3346 if (!d->usePopupWindow())
3348 if (!qFuzzyCompare(newGeometry.width(), oldGeometry.width())) {
3349 emit widthChanged();
3350 emit availableWidthChanged();
3352 if (!qFuzzyCompare(newGeometry.height(), oldGeometry.height())) {
3353 emit heightChanged();
3354 emit availableHeightChanged();
3358void QQuickPopup::itemChange(QQuickItem::ItemChange change,
const QQuickItem::ItemChangeData &)
3361 case QQuickItem::ItemActiveFocusHasChanged:
3362 emit activeFocusChanged();
3364 case QQuickItem::ItemOpacityHasChanged:
3365 emit opacityChanged();
3372void QQuickPopup::localeChange(
const QLocale &newLocale,
const QLocale &oldLocale)
3374 Q_UNUSED(newLocale);
3375 Q_UNUSED(oldLocale);
3376 emit localeChanged();
3379void QQuickPopup::marginsChange(
const QMarginsF &newMargins,
const QMarginsF &oldMargins)
3382 Q_UNUSED(newMargins);
3383 Q_UNUSED(oldMargins);
3387void QQuickPopup::paddingChange(
const QMarginsF &newPadding,
const QMarginsF &oldPadding)
3389 const bool tp = !qFuzzyCompare(newPadding.top(), oldPadding.top());
3390 const bool lp = !qFuzzyCompare(newPadding.left(), oldPadding.left());
3391 const bool rp = !qFuzzyCompare(newPadding.right(), oldPadding.right());
3392 const bool bp = !qFuzzyCompare(newPadding.bottom(), oldPadding.bottom());
3395 emit topPaddingChanged();
3397 emit leftPaddingChanged();
3399 emit rightPaddingChanged();
3401 emit bottomPaddingChanged();
3404 emit horizontalPaddingChanged();
3405 emit availableWidthChanged();
3408 emit verticalPaddingChanged();
3409 emit availableHeightChanged();
3413void QQuickPopup::spacingChange(qreal newSpacing, qreal oldSpacing)
3415 Q_UNUSED(newSpacing);
3416 Q_UNUSED(oldSpacing);
3417 emit spacingChanged();
3420void QQuickPopup::insetChange(
const QMarginsF &newInset,
const QMarginsF &oldInset)
3422 if (!qFuzzyCompare(newInset.top(), oldInset.top()))
3423 emit topInsetChanged();
3424 if (!qFuzzyCompare(newInset.left(), oldInset.left()))
3425 emit leftInsetChanged();
3426 if (!qFuzzyCompare(newInset.right(), oldInset.right()))
3427 emit rightInsetChanged();
3428 if (!qFuzzyCompare(newInset.bottom(), oldInset.bottom()))
3429 emit bottomInsetChanged();
3432QFont QQuickPopup::defaultFont()
const
3434 return QQuickTheme::font(QQuickTheme::System);
3437#if QT_CONFIG(accessibility)
3438QAccessible::Role QQuickPopup::effectiveAccessibleRole()
const
3440 auto *attached = qmlAttachedPropertiesObject<QQuickAccessibleAttached>(
this,
false);
3442 auto role = QAccessible::NoRole;
3443 if (
auto *accessibleAttached = qobject_cast<QQuickAccessibleAttached *>(attached))
3444 role = accessibleAttached->role();
3445 if (role == QAccessible::NoRole)
3446 role = accessibleRole();
3451QAccessible::Role QQuickPopup::accessibleRole()
const
3453 return QAccessible::Dialog;
3456void QQuickPopup::accessibilityActiveChanged(
bool active)
3462QString QQuickPopup::accessibleName()
const
3464 Q_D(
const QQuickPopup);
3465 return d->popupItem->accessibleName();
3468void QQuickPopup::maybeSetAccessibleName(
const QString &name)
3471 d->popupItem->maybeSetAccessibleName(name);
3474QVariant QQuickPopup::accessibleProperty(
const char *propertyName)
3476 Q_D(
const QQuickPopup);
3477 return d->popupItem->accessibleProperty(propertyName);
3480bool QQuickPopup::setAccessibleProperty(
const char *propertyName,
const QVariant &value)
3483 return d->popupItem->setAccessibleProperty(propertyName, value);
3486void QQuickPopup::setWindowModality(
const Qt::WindowModality modality)
3489 d->popupWndModality = modality;
3492QQuickItem *QQuickPopup::safeAreaAttachmentItem()
3497QQuickItem *QQuickPopup::attacheeItem()
const
3502QtPrivate::QQuickAttachedPropertyPropagator *QQuickPopup::attachedParent(
3503 const QMetaObject *ourAttachedType)
const
3505 auto *popupWindow = popupItem()->window();
3506 qCDebug(lcAttachedPropertyPropagator).noquote() <<
"- attachee is a popup; checking its window"
3508 auto *object = QtPrivate::QQuickAttachedPropertyPropagator::attachedObject(
3509 ourAttachedType, popupWindow);
3513 if (qobject_cast<QQuickPopupWindow *>(popupWindow)) {
3514 qCDebug(lcAttachedPropertyPropagator).noquote() <<
"- checking its window's transientParent"
3515 << popupWindow->transientParent();
3516 return QtPrivate::QQuickAttachedPropertyPropagator::attachedObject(ourAttachedType,
3517 popupWindow->transientParent());
3525#include "moc_qquickpopup_p.cpp"
Combined button and popup list for selecting options.