14#if QT_CONFIG(quicktemplates2_container)
15#include "qquickdialog_p.h"
18#include <QtCore/qloggingcategory.h>
19#include <QtQml/qqmlinfo.h>
20#include <QtQuick/qquickitem.h>
21#include <QtQuick/private/qquickaccessibleattached_p.h>
22#include <QtQuick/private/qquicktransition_p.h>
23#include <QtQuick/private/qquickitem_p.h>
24#include <qpa/qplatformintegration.h>
25#include <private/qguiapplication_p.h>
29Q_STATIC_LOGGING_CATEGORY(lcDimmer,
"qt.quick.controls.popup.dimmer")
30Q_STATIC_LOGGING_CATEGORY(lcQuickPopup,
"qt.quick.controls.popup")
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
454
455
456
457
458
459
462
463
464
465
466
467
470
471
472
473
474
475
478
479
480
481
482
483
485QQuickItem *QQuickPopup::findParentItem()
const
487 QObject *obj = parent();
489 QQuickItem *item = qobject_cast<QQuickItem *>(obj);
497const QQuickPopup::ClosePolicy QQuickPopupPrivate::DefaultClosePolicy = QQuickPopup::CloseOnEscape | QQuickPopup::CloseOnPressOutside;
499QQuickPopupPrivate::QQuickPopupPrivate()
500 : transitionManager(
this)
504void QQuickPopupPrivate::init()
507 popupItem =
new QQuickPopupItem(q);
508 popupItem->setVisible(
false);
509 QObject::connect(popupItem, &QQuickControl::paddingChanged, q, &QQuickPopup::paddingChanged);
510 QObject::connect(popupItem, &QQuickControl::backgroundChanged, q, &QQuickPopup::backgroundChanged);
511 QObject::connect(popupItem, &QQuickControl::contentItemChanged, q, &QQuickPopup::contentItemChanged);
512 QObject::connect(popupItem, &QQuickControl::implicitContentWidthChanged, q, &QQuickPopup::implicitContentWidthChanged);
513 QObject::connect(popupItem, &QQuickControl::implicitContentHeightChanged, q, &QQuickPopup::implicitContentHeightChanged);
514 QObject::connect(popupItem, &QQuickControl::implicitBackgroundWidthChanged, q, &QQuickPopup::implicitBackgroundWidthChanged);
515 QObject::connect(popupItem, &QQuickControl::implicitBackgroundHeightChanged, q, &QQuickPopup::implicitBackgroundHeightChanged);
516 QObject::connect(popupItem, &QQuickControl::spacingChanged, q, &QQuickPopup::spacingChanged);
517 QObject::connect(popupItem, &QQuickControl::topInsetChanged, q, &QQuickPopup::topInsetChanged);
518 QObject::connect(popupItem, &QQuickControl::bottomInsetChanged, q, &QQuickPopup::bottomInsetChanged);
519 QObject::connect(popupItem, &QQuickControl::leftInsetChanged, q, &QQuickPopup::leftInsetChanged);
520 QObject::connect(popupItem, &QQuickControl::rightInsetChanged, q, &QQuickPopup::rightInsetChanged);
523void QQuickPopupPrivate::closeOrReject()
526#if QT_CONFIG(quicktemplates2_container)
527 if (QQuickDialog *dialog = qobject_cast<QQuickDialog*>(q))
535bool QQuickPopupPrivate::tryClose(
const QPointF &pos, QQuickPopup::ClosePolicy flags)
540 static const QQuickPopup::ClosePolicy outsideFlags = QQuickPopup::CloseOnPressOutside | QQuickPopup::CloseOnReleaseOutside;
541 static const QQuickPopup::ClosePolicy outsideParentFlags = QQuickPopup::CloseOnPressOutsideParent | QQuickPopup::CloseOnReleaseOutsideParent;
543 const bool onOutside = closePolicy & (flags & outsideFlags);
544 const bool onOutsideParent = closePolicy & (flags & outsideParentFlags);
546 if ((onOutside && outsidePressed) || (onOutsideParent && outsideParentPressed)) {
547 if (!contains(pos) && (!dimmer || dimmer->contains(dimmer->mapFromScene(pos)))) {
548 if (!onOutsideParent || !parentItem || !parentItem->contains(parentItem->mapFromScene(pos))) {
557bool QQuickPopupPrivate::contains(
const QPointF &scenePos)
const
559 return popupItem->contains(popupItem->mapFromScene(scenePos));
562#if QT_CONFIG(quicktemplates2_multitouch)
563bool QQuickPopupPrivate::acceptTouch(
const QTouchEvent::TouchPoint &point)
565 if (point.id() == touchId)
568 if (touchId == -1 && point.state() != QEventPoint::Released) {
569 touchId = point.id();
577bool QQuickPopupPrivate::blockInput(QQuickItem *item,
const QPointF &point)
const
580 if (popupItem->contains(popupItem->mapFromScene(point))
581 && item == QQuickOverlay::overlay(window)) {
590 return modal && ((popupItem != item) && !popupItem->isAncestorOf(item)) && (!dimmer || dimmer->contains(dimmer->mapFromScene(point)));
593bool QQuickPopupPrivate::handlePress(QQuickItem *item,
const QPointF &point, ulong timestamp)
597 outsidePressed = !contains(point);
599 if (outsidePressed && parentItem) {
603 const QPointF globalPoint = item->mapToGlobal(point);
604 const QPointF localPoint = parentItem->mapFromGlobal(globalPoint);
605 outsideParentPressed = !parentItem->contains(localPoint);
608 tryClose(point, QQuickPopup::CloseOnPressOutside | QQuickPopup::CloseOnPressOutsideParent);
609 return blockInput(item, point);
612bool QQuickPopupPrivate::handleMove(QQuickItem *item,
const QPointF &point, ulong timestamp)
615 return blockInput(item, point);
618bool QQuickPopupPrivate::handleRelease(QQuickItem *item,
const QPointF &point, ulong timestamp)
621 if (item != popupItem && !contains(pressPoint))
622 tryClose(point, QQuickPopup::CloseOnReleaseOutside | QQuickPopup::CloseOnReleaseOutsideParent);
623 pressPoint = QPointF();
624 outsidePressed =
false;
625 outsideParentPressed =
false;
627 return blockInput(item, point);
630void QQuickPopupPrivate::handleUngrab()
633 QQuickOverlay *overlay = QQuickOverlay::overlay(window);
635 QQuickOverlayPrivate *p = QQuickOverlayPrivate::get(overlay);
636 if (p->mouseGrabberPopup == q)
637 p->mouseGrabberPopup =
nullptr;
639 pressPoint = QPointF();
643bool QQuickPopupPrivate::handleMouseEvent(QQuickItem *item, QMouseEvent *event)
645 switch (event->type()) {
646 case QEvent::MouseButtonPress:
647 return handlePress(item, event->scenePosition(), event->timestamp());
648 case QEvent::MouseMove:
649 return handleMove(item, event->scenePosition(), event->timestamp());
650 case QEvent::MouseButtonRelease:
651 return handleRelease(item, event->scenePosition(), event->timestamp());
653 Q_UNREACHABLE_RETURN(
false);
657bool QQuickPopupPrivate::handleHoverEvent(QQuickItem *item, QHoverEvent *event)
659 switch (event->type()) {
660 case QEvent::HoverEnter:
661 case QEvent::HoverMove:
662 case QEvent::HoverLeave:
663 return blockInput(item, event->scenePosition());
665 Q_UNREACHABLE_RETURN(
false);
669QMarginsF QQuickPopupPrivate::windowInsets()
const
671 Q_Q(
const QQuickPopup);
682 const auto *popupItemPrivate = QQuickControlPrivate::get(popupItem);
683 if (!usePopupWindow() || (popupItemPrivate->background.isExecuting() && popupItemPrivate->background->clip())) {
691 q->leftInset() < 0 ? -q->leftInset() : 0,
692 q->rightInset() < 0 ? -q->rightInset() : 0,
693 q->topInset() < 0 ? -q->topInset() : 0,
694 q->bottomInset() < 0 ? -q->bottomInset() : 0
698QPointF QQuickPopupPrivate::windowInsetsTopLeft()
const
700 const QMarginsF windowMargins = windowInsets();
701 return {windowMargins.left(), windowMargins.top()};
704void QQuickPopupPrivate::setEffectivePosFromWindowPos(
const QPointF &windowPos)
721 const QPointF oldEffectivePos = effectivePos;
722 effectivePos = windowPos + windowInsetsTopLeft();
723 if (!qFuzzyCompare(oldEffectivePos.x(), effectivePos.x()))
725 if (!qFuzzyCompare(oldEffectivePos.y(), effectivePos.y()))
729#if QT_CONFIG(quicktemplates2_multitouch)
730bool QQuickPopupPrivate::handleTouchEvent(QQuickItem *item, QTouchEvent *event)
732 switch (event->type()) {
733 case QEvent::TouchBegin:
734 case QEvent::TouchUpdate:
735 case QEvent::TouchEnd:
736 for (
const QTouchEvent::TouchPoint &point : event->points()) {
737 if (event->type() != QEvent::TouchEnd && !acceptTouch(point))
738 return blockInput(item, point.position());
740 switch (point.state()) {
741 case QEventPoint::Pressed:
742 return handlePress(item, point.scenePosition(), event->timestamp());
743 case QEventPoint::Updated:
744 return handleMove(item, point.scenePosition(), event->timestamp());
745 case QEventPoint::Released:
746 return handleRelease(item, point.scenePosition(), event->timestamp());
753 case QEvent::TouchCancel:
765bool QQuickPopupPrivate::prepareEnterTransition()
769 qmlWarning(q) <<
"cannot find any window to open popup in.";
773 if (transitionState == EnterTransition && transitionManager.isRunning())
776 if (transitionState != EnterTransition) {
777 const QPointer<QQuickItem> lastActiveFocusItem = window->activeFocusItem();
779 adjustPopupItemParentAndWindow();
783 emit q->aboutToShow();
784 transitionState = EnterTransition;
785 getPositioner()->setParentItem(parentItem);
786 emit q->visibleChanged();
788 if (lastActiveFocusItem) {
789 if (
auto *overlay = QQuickOverlay::overlay(window)) {
790 auto *overlayPrivate = QQuickOverlayPrivate::get(overlay);
791 if (overlayPrivate->lastActiveFocusItem.isNull() && !popupItem->isAncestorOf(lastActiveFocusItem)) {
792 overlayPrivate->lastActiveFocusItem = lastActiveFocusItem;
793 savedLastActiveFocusItem =
true;
799 popupItem->setFocus(
true, Qt::PopupFocusReason);
804bool QQuickPopupPrivate::prepareExitTransition()
807 if (transitionState == ExitTransition && transitionManager.isRunning())
814 prevScale = popupItem->scale();
815 prevOpacity = popupItem->opacity();
817 if (transitionState != ExitTransition) {
820 if (!hadActiveFocusBeforeExitTransition) {
821 const auto *da = QQuickItemPrivate::get(popupItem)->deliveryAgentPrivate();
822 hadActiveFocusBeforeExitTransition = popupItem->hasActiveFocus() || (da && da->focusTargetItem() == popupItem);
826 popupItem->setFocus(
false, Qt::PopupFocusReason);
827 transitionState = ExitTransition;
829 emit q->aboutToHide();
830 emit q->openedChanged();
835void QQuickPopupPrivate::finalizeEnterTransition()
838 transitionState = NoTransition;
840 emit q->openedChanged();
844void QQuickPopupPrivate::finalizeExitTransition()
847 getPositioner()->setParentItem(
nullptr);
849 popupItem->setParentItem(
nullptr);
850 popupItem->setVisible(
false);
854 if (
auto *overlay = QQuickOverlay::overlay(window)) {
855 auto *overlayPrivate = QQuickOverlayPrivate::get(overlay);
858 if (hadActiveFocusBeforeExitTransition) {
859 QQuickPopup *nextFocusPopup =
nullptr;
860 const auto stackingOrderPopups = overlayPrivate->stackingOrderPopups();
861 for (
auto popup : stackingOrderPopups) {
863 if (QQuickPopupPrivate::get(popup)->transitionState != ExitTransition
864 && popup->hasFocus() && !popup->hasActiveFocus()) {
865 nextFocusPopup = popup;
869 if (nextFocusPopup) {
870 nextFocusPopup->forceActiveFocus(Qt::PopupFocusReason);
872 auto *appWindow = qobject_cast<QQuickApplicationWindow*>(window);
873 auto *contentItem = appWindow ? appWindow->contentItem() : window->contentItem();
874 if (!contentItem->scopedFocusItem()
875 && !overlayPrivate->lastActiveFocusItem.isNull()) {
878 overlayPrivate->lastActiveFocusItem->forceActiveFocus(Qt::OtherFocusReason);
880 contentItem->setFocus(
true, Qt::PopupFocusReason);
886 if (savedLastActiveFocusItem)
887 overlayPrivate->lastActiveFocusItem =
nullptr;
891 adjustPopupItemParentAndWindow();
892 transitionState = NoTransition;
893 hadActiveFocusBeforeExitTransition =
false;
894 savedLastActiveFocusItem =
false;
895 emit q->visibleChanged();
897#if QT_CONFIG(accessibility)
898 const auto type = q->effectiveAccessibleRole() == QAccessible::PopupMenu
899 ? QAccessible::PopupMenuEnd
900 : QAccessible::DialogEnd;
901 QAccessibleEvent ev(q->popupItem(), type);
902 QAccessible::updateAccessibility(&ev);
905 popupItem->setScale(prevScale);
906 popupItem->setOpacity(prevOpacity);
910void QQuickPopupPrivate::opened()
914#if QT_CONFIG(accessibility)
915 const auto type = q->effectiveAccessibleRole() == QAccessible::PopupMenu
916 ? QAccessible::PopupMenuStart
917 : QAccessible::DialogStart;
918 QAccessibleEvent ev(q->popupItem(), type);
919 QAccessible::updateAccessibility(&ev);
923Qt::WindowFlags QQuickPopupPrivate::popupWindowType()
const
925 return Qt::Popup | Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint;
928QMarginsF QQuickPopupPrivate::getMargins()
const
930 Q_Q(
const QQuickPopup);
931 return QMarginsF(q->leftMargin(), q->topMargin(), q->rightMargin(), q->bottomMargin());
934void QQuickPopupPrivate::setTopMargin(qreal value,
bool reset)
937 qreal oldMargin = q->topMargin();
939 hasTopMargin = !reset;
940 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
941 emit q->topMarginChanged();
942 q->marginsChange(QMarginsF(leftMargin, topMargin, rightMargin, bottomMargin),
943 QMarginsF(leftMargin, oldMargin, rightMargin, bottomMargin));
947void QQuickPopupPrivate::setLeftMargin(qreal value,
bool reset)
950 qreal oldMargin = q->leftMargin();
952 hasLeftMargin = !reset;
953 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
954 emit q->leftMarginChanged();
955 q->marginsChange(QMarginsF(leftMargin, topMargin, rightMargin, bottomMargin),
956 QMarginsF(oldMargin, topMargin, rightMargin, bottomMargin));
960void QQuickPopupPrivate::setRightMargin(qreal value,
bool reset)
963 qreal oldMargin = q->rightMargin();
965 hasRightMargin = !reset;
966 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
967 emit q->rightMarginChanged();
968 q->marginsChange(QMarginsF(leftMargin, topMargin, rightMargin, bottomMargin),
969 QMarginsF(leftMargin, topMargin, oldMargin, bottomMargin));
973void QQuickPopupPrivate::setBottomMargin(qreal value,
bool reset)
976 qreal oldMargin = q->bottomMargin();
977 bottomMargin = value;
978 hasBottomMargin = !reset;
979 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
980 emit q->bottomMarginChanged();
981 q->marginsChange(QMarginsF(leftMargin, topMargin, rightMargin, bottomMargin),
982 QMarginsF(leftMargin, topMargin, rightMargin, oldMargin));
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019QQuickPopupAnchors *QQuickPopupPrivate::getAnchors()
1023 anchors =
new QQuickPopupAnchors(q);
1027QQuickPopupPositioner *QQuickPopupPrivate::getPositioner()
1031 positioner =
new QQuickPopupPositioner(q);
1035void QQuickPopupPrivate::setWindow(QQuickWindow *newWindow)
1038 if (window == newWindow)
1042 QQuickOverlay *overlay = QQuickOverlay::overlay(window);
1044 QQuickOverlayPrivate::get(overlay)->removePopup(q);
1049 if (!newWindow && popupItem)
1050 popupItem->setParentItem(
nullptr);
1056 QQuickOverlay *overlay = QQuickOverlay::overlay(newWindow);
1058 QQuickOverlayPrivate::get(overlay)->addPopup(q);
1060 QQuickControlPrivate *p = QQuickControlPrivate::get(popupItem);
1062 if (QQuickApplicationWindow *appWindow = qobject_cast<QQuickApplicationWindow *>(newWindow))
1063 p->updateLocale(appWindow->locale(),
false);
1066 emit q->windowChanged(newWindow);
1068 if (complete && visible && window)
1069 transitionManager.transitionEnter();
1072void QQuickPopupPrivate::itemDestroyed(QQuickItem *item)
1075 if (item == parentItem)
1076 q->setParentItem(
nullptr);
1079void QQuickPopupPrivate::reposition()
1081 getPositioner()->reposition();
1084QPalette QQuickPopupPrivate::defaultPalette()
const
1086 return QQuickTheme::palette(QQuickTheme::System);
1089QQuickPopup::PopupType QQuickPopupPrivate::resolvedPopupType()
const
1099 if (popupType == QQuickPopup::PopupType::Window
1100 || popupType == QQuickPopup::PopupType::Native) {
1101 if (QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::Capability::MultipleWindows))
1102 return QQuickPopup::PopupType::Window;
1105 return QQuickPopup::PopupType::Item;
1108bool QQuickPopupPrivate::usePopupWindow()
const
1110 return resolvedPopupType() == QQuickPopup::PopupType::Window;
1113void QQuickPopupPrivate::adjustPopupItemParentAndWindow()
1116 QQuickOverlay *overlay = QQuickOverlay::overlay(window);
1118 if (visible && popupWindowDirty) {
1119 popupItem->setParentItem(overlay);
1121 popupWindow->deleteLater();
1122 popupWindow =
nullptr;
1124 popupWindowDirty =
false;
1127 if (usePopupWindow()) {
1130 popupWindow =
new QQuickPopupWindow(q, window);
1133 const qreal initialWidth = popupItem->width() + windowInsets().left() + windowInsets().right();
1134 const qreal initialHeight = popupItem->height() + windowInsets().top() + windowInsets().bottom();
1135 popupItem->setParentItem(popupWindow->contentItem());
1136 popupWindow->resize(qCeil(initialWidth), qCeil(initialHeight));
1137 if (popupWndModality != Qt::NonModal)
1138 popupWindow->setModality(popupWndModality);
1140 popupWindow->setModality(modal ? Qt::ApplicationModal : Qt::NonModal);
1141 popupItem->resetTitle();
1142 popupWindow->setTitle(title);
1144 popupItem->setParentItem(popupWindow->contentItem());
1145 popupItem->forceActiveFocus(Qt::PopupFocusReason);
1147 if (popupWindow && popupWindow->transientParent()) {
1148 auto *transientParentPriv = QQuickWindowPrivate::get(qobject_cast<QQuickWindow *>(popupWindow->transientParent()));
1149 if (!transientParentPriv->inDestructor)
1150 popupWindow->setVisible(visible);
1154 popupItem->setParentItem(overlay);
1155 const auto popupStack = QQuickOverlayPrivate::get(overlay)->stackingOrderPopups();
1159 const QQuickPopup *topPopup = popupStack.isEmpty() ?
nullptr : popupStack.first();
1160 const QObject *ancestor = q;
1161 while (ancestor && topPopup) {
1162 if (ancestor == topPopup)
1164 ancestor = ancestor->parent();
1166 if (topPopup && topPopup != q && ancestor) {
1167 QQuickItem *topPopupItem = popupStack.first()->popupItem();
1168 popupItem->stackAfter(topPopupItem);
1172 popupItem->setZ(qMax(topPopupItem->z(), popupItem->z()));
1174 q->setModal((popupWndModality != Qt::NonModal) || modal);
1177 popupItem->setTitle(title);
1179 popupItem->setVisible(visible);
1182QQuickItem *QQuickPopupPrivate::createDimmer(QQmlComponent *component, QQuickPopup *popup, QQuickItem *parent)
const
1184 QQuickItem *item =
nullptr;
1186 QQmlContext *context = component->creationContext();
1188 context = qmlContext(popup);
1189 item = qobject_cast<QQuickItem*>(component->beginCreate(context));
1194 if (!item && popup->isModal())
1195 item =
new QQuickItem;
1198 item->setParentItem(parent);
1199 if (resolvedPopupType() != QQuickPopup::PopupType::Window)
1200 item->stackBefore(popup->popupItem());
1201 item->setZ(popup->z());
1203 qCDebug(lcDimmer) <<
"dimmer" << item <<
"registered with" << parent;
1204 parent->setProperty(
"_q_dimmerItem", QVariant::fromValue<QQuickItem*>(item));
1205 if (popup->isModal()) {
1206 item->setAcceptedMouseButtons(Qt::AllButtons);
1207#if QT_CONFIG(cursor)
1208 item->setCursor(Qt::ArrowCursor);
1210#if QT_CONFIG(quicktemplates2_hover)
1212 item->setAcceptHoverEvents(
true);
1218 component->completeCreate();
1220 qCDebug(lcDimmer) <<
"finished creating dimmer from component" << component
1221 <<
"for popup" << popup <<
"with parent" << parent <<
"- item is:" << item;
1225void QQuickPopupPrivate::createOverlay()
1228 QQuickOverlay *overlay = QQuickOverlay::overlay(window);
1232 QQmlComponent *component =
nullptr;
1233 QQuickOverlayAttached *overlayAttached = qobject_cast<QQuickOverlayAttached *>(qmlAttachedPropertiesObject<QQuickOverlay>(q,
false));
1234 if (overlayAttached)
1235 component = modal ? overlayAttached->modal() : overlayAttached->modeless();
1238 component = modal ? overlay->modal() : overlay->modeless();
1241 dimmer = createDimmer(component, q, overlay);
1248 explicitDimmerOpacity = dimmer->opacity();
1250 dimmer->setOpacity(0);
1257void QQuickPopupPrivate::destroyDimmer()
1260 qCDebug(lcDimmer) <<
"destroying dimmer" << dimmer;
1261 if (QObject *dimmerParentItem = dimmer->parentItem()) {
1262 if (dimmerParentItem->property(
"_q_dimmerItem").value<QQuickItem*>() == dimmer)
1263 dimmerParentItem->setProperty(
"_q_dimmerItem", QVariant());
1265 dimmer->setParentItem(
nullptr);
1266 dimmer->deleteLater();
1271void QQuickPopupPrivate::toggleOverlay()
1278void QQuickPopupPrivate::updateContentPalettes(
const QPalette& parentPalette)
1281 if (providesPalette())
1282 inheritPalette(parentPalette);
1284 QQuickItemPrivate::get(popupItem)->updateChildrenPalettes(parentPalette);
1287void QQuickPopupPrivate::updateChildrenPalettes(
const QPalette& parentPalette)
1289 updateContentPalettes(parentPalette);
1292void QQuickPopupPrivate::showDimmer()
1296 QQmlProperty::write(dimmer, QStringLiteral(
"opacity"), explicitDimmerOpacity);
1299void QQuickPopupPrivate::hideDimmer()
1303 QQmlProperty::write(dimmer, QStringLiteral(
"opacity"), 0.0);
1306void QQuickPopupPrivate::resizeDimmer()
1311 const QQuickOverlay *overlay = QQuickOverlay::overlay(window);
1313 qreal w = overlay ? overlay->width() : 0;
1314 qreal h = overlay ? overlay->height() : 0;
1315 dimmer->setSize(QSizeF(w, h));
1318QQuickPopupTransitionManager::QQuickPopupTransitionManager(QQuickPopupPrivate *popup)
1323void QQuickPopupTransitionManager::transitionEnter()
1325 if (popup->transitionState == QQuickPopupPrivate::ExitTransition)
1328 if (!popup->prepareEnterTransition())
1332 transition(popup->enterActions, popup->enter, popup->q_func());
1337void QQuickPopupTransitionManager::transitionExit()
1339 if (!popup->prepareExitTransition())
1343 transition(popup->exitActions, popup->exit, popup->q_func());
1348void QQuickPopupTransitionManager::finished()
1350 if (popup->transitionState == QQuickPopupPrivate::EnterTransition)
1351 popup->finalizeEnterTransition();
1352 else if (popup->transitionState == QQuickPopupPrivate::ExitTransition)
1353 popup->finalizeExitTransition();
1356QQuickPopup::QQuickPopup(QObject *parent)
1357 : QObject(*(
new QQuickPopupPrivate), parent)
1362 d->relaxEdgeConstraint =
true;
1365QQuickPopup::QQuickPopup(QQuickPopupPrivate &dd, QObject *parent)
1366 : QObject(dd, parent)
1372QQuickPopup::~QQuickPopup()
1375 d->inDestructor =
true;
1377 QQuickItem *currentContentItem = d->popupItem->d_func()->contentItem.data();
1378 if (currentContentItem) {
1379 disconnect(currentContentItem, &QQuickItem::childrenChanged,
1380 this, &QQuickPopup::contentChildrenChanged);
1383 setParentItem(
nullptr);
1388 if (d->transitionState == QQuickPopupPrivate::ExitTransition && d->transitionManager.isRunning())
1389 d->finalizeExitTransition();
1391 delete d->popupItem;
1392 d->popupItem =
nullptr;
1393 delete d->positioner;
1394 d->positioner =
nullptr;
1396 delete d->popupWindow;
1397 d->popupWindow =
nullptr;
1401
1402
1403
1404
1405
1406
1407void QQuickPopup::open()
1413
1414
1415
1416
1417
1418
1419void QQuickPopup::close()
1425
1426
1427
1428
1429
1430
1431qreal QQuickPopup::x()
const
1433 return d_func()->effectivePos.x();
1436void QQuickPopup::setX(qreal x)
1439 setPosition(QPointF(x, d->y));
1443
1444
1445
1446
1447
1448
1449qreal QQuickPopup::y()
const
1451 return d_func()->effectivePos.y();
1454void QQuickPopup::setY(qreal y)
1457 setPosition(QPointF(d->x, y));
1460QPointF QQuickPopup::position()
const
1462 return d_func()->effectivePos;
1465void QQuickPopup::setPosition(
const QPointF &pos)
1468 const bool xChange = !qFuzzyCompare(d->x, pos.x());
1469 const bool yChange = !qFuzzyCompare(d->y, pos.y());
1470 if (!xChange && !yChange)
1475 if (d->popupItem->isVisible()) {
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505qreal QQuickPopup::z()
const
1507 Q_D(
const QQuickPopup);
1508 return d->popupItem->z();
1511void QQuickPopup::setZ(qreal z)
1515 bool previousZ = d->popupWindow ? d->popupWindow->z() : d->popupItem->z();
1516 if (qFuzzyCompare(z, previousZ))
1519 d->popupWindow->setZ(z);
1521 d->popupItem->setZ(z);
1525void QQuickPopup::resetZ()
1533
1534
1535
1536
1537qreal QQuickPopup::width()
const
1539 Q_D(
const QQuickPopup);
1540 return d->popupItem->width();
1543void QQuickPopup::setWidth(qreal width)
1554 d->popupWindow->setWidth(width + d->windowInsets().left() + d->windowInsets().right());
1556 d->popupItem->setWidth(width);
1559void QQuickPopup::resetWidth()
1565 d->hasWidth =
false;
1566 d->popupItem->resetWidth();
1567 if (d->popupItem->isVisible())
1572
1573
1574
1575
1576qreal QQuickPopup::height()
const
1578 Q_D(
const QQuickPopup);
1579 return d->popupItem->height();
1582void QQuickPopup::setHeight(qreal height)
1585 d->hasHeight =
true;
1593 d->popupWindow->setHeight(height + d->windowInsets().top() + d->windowInsets().bottom());
1595 d->popupItem->setHeight(height);
1598void QQuickPopup::resetHeight()
1604 d->hasHeight =
false;
1605 d->popupItem->resetHeight();
1606 if (d->popupItem->isVisible())
1611
1612
1613
1614
1615qreal QQuickPopup::implicitWidth()
const
1617 Q_D(
const QQuickPopup);
1618 return d->popupItem->implicitWidth();
1621void QQuickPopup::setImplicitWidth(qreal width)
1624 d->popupItem->setImplicitWidth(width);
1628
1629
1630
1631
1632qreal QQuickPopup::implicitHeight()
const
1634 Q_D(
const QQuickPopup);
1635 return d->popupItem->implicitHeight();
1638void QQuickPopup::setImplicitHeight(qreal height)
1641 d->popupItem->setImplicitHeight(height);
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654qreal QQuickPopup::contentWidth()
const
1656 Q_D(
const QQuickPopup);
1657 return d->popupItem->contentWidth();
1660void QQuickPopup::setContentWidth(qreal width)
1663 d->popupItem->setContentWidth(width);
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676qreal QQuickPopup::contentHeight()
const
1678 Q_D(
const QQuickPopup);
1679 return d->popupItem->contentHeight();
1682void QQuickPopup::setContentHeight(qreal height)
1685 d->popupItem->setContentHeight(height);
1689
1690
1691
1692
1693
1694
1695
1696
1697qreal QQuickPopup::availableWidth()
const
1699 Q_D(
const QQuickPopup);
1700 return d->popupItem->availableWidth();
1704
1705
1706
1707
1708
1709
1710
1711
1712qreal QQuickPopup::availableHeight()
const
1714 Q_D(
const QQuickPopup);
1715 return d->popupItem->availableHeight();
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730qreal QQuickPopup::spacing()
const
1732 Q_D(
const QQuickPopup);
1733 return d->popupItem->spacing();
1736void QQuickPopup::setSpacing(qreal spacing)
1739 d->popupItem->setSpacing(spacing);
1742void QQuickPopup::resetSpacing()
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758qreal QQuickPopup::margins()
const
1760 Q_D(
const QQuickPopup);
1764void QQuickPopup::setMargins(qreal margins)
1767 if (qFuzzyCompare(d->margins, margins))
1769 QMarginsF oldMargins(leftMargin(), topMargin(), rightMargin(), bottomMargin());
1770 d->margins = margins;
1771 emit marginsChanged();
1772 QMarginsF newMargins(leftMargin(), topMargin(), rightMargin(), bottomMargin());
1773 if (!qFuzzyCompare(newMargins.top(), oldMargins.top()))
1774 emit topMarginChanged();
1775 if (!qFuzzyCompare(newMargins.left(), oldMargins.left()))
1776 emit leftMarginChanged();
1777 if (!qFuzzyCompare(newMargins.right(), oldMargins.right()))
1778 emit rightMarginChanged();
1779 if (!qFuzzyCompare(newMargins.bottom(), oldMargins.bottom()))
1780 emit bottomMarginChanged();
1781 marginsChange(newMargins, oldMargins);
1784void QQuickPopup::resetMargins()
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800qreal QQuickPopup::topMargin()
const
1802 Q_D(
const QQuickPopup);
1803 if (d->hasTopMargin)
1804 return d->topMargin;
1808void QQuickPopup::setTopMargin(qreal margin)
1811 d->setTopMargin(margin);
1814void QQuickPopup::resetTopMargin()
1817 d->setTopMargin(-1,
true);
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831qreal QQuickPopup::leftMargin()
const
1833 Q_D(
const QQuickPopup);
1834 if (d->hasLeftMargin)
1835 return d->leftMargin;
1839void QQuickPopup::setLeftMargin(qreal margin)
1842 d->setLeftMargin(margin);
1845void QQuickPopup::resetLeftMargin()
1848 d->setLeftMargin(-1,
true);
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862qreal QQuickPopup::rightMargin()
const
1864 Q_D(
const QQuickPopup);
1865 if (d->hasRightMargin)
1866 return d->rightMargin;
1870void QQuickPopup::setRightMargin(qreal margin)
1873 d->setRightMargin(margin);
1876void QQuickPopup::resetRightMargin()
1879 d->setRightMargin(-1,
true);
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893qreal QQuickPopup::bottomMargin()
const
1895 Q_D(
const QQuickPopup);
1896 if (d->hasBottomMargin)
1897 return d->bottomMargin;
1901void QQuickPopup::setBottomMargin(qreal margin)
1904 d->setBottomMargin(margin);
1907void QQuickPopup::resetBottomMargin()
1910 d->setBottomMargin(-1,
true);
1914
1915
1916
1917
1918
1919
1920
1921
1922qreal QQuickPopup::padding()
const
1924 Q_D(
const QQuickPopup);
1925 return d->popupItem->padding();
1928void QQuickPopup::setPadding(qreal padding)
1931 d->popupItem->setPadding(padding);
1934void QQuickPopup::resetPadding()
1937 d->popupItem->resetPadding();
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950qreal QQuickPopup::topPadding()
const
1952 Q_D(
const QQuickPopup);
1953 return d->popupItem->topPadding();
1956void QQuickPopup::setTopPadding(qreal padding)
1959 d->popupItem->setTopPadding(padding);
1962void QQuickPopup::resetTopPadding()
1965 d->popupItem->resetTopPadding();
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978qreal QQuickPopup::leftPadding()
const
1980 Q_D(
const QQuickPopup);
1981 return d->popupItem->leftPadding();
1984void QQuickPopup::setLeftPadding(qreal padding)
1987 d->popupItem->setLeftPadding(padding);
1990void QQuickPopup::resetLeftPadding()
1993 d->popupItem->resetLeftPadding();
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006qreal QQuickPopup::rightPadding()
const
2008 Q_D(
const QQuickPopup);
2009 return d->popupItem->rightPadding();
2012void QQuickPopup::setRightPadding(qreal padding)
2015 d->popupItem->setRightPadding(padding);
2018void QQuickPopup::resetRightPadding()
2021 d->popupItem->resetRightPadding();
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034qreal QQuickPopup::bottomPadding()
const
2036 Q_D(
const QQuickPopup);
2037 return d->popupItem->bottomPadding();
2040void QQuickPopup::setBottomPadding(qreal padding)
2043 d->popupItem->setBottomPadding(padding);
2046void QQuickPopup::resetBottomPadding()
2049 d->popupItem->resetBottomPadding();
2053
2054
2055
2056
2057
2058
2059QLocale QQuickPopup::locale()
const
2061 Q_D(
const QQuickPopup);
2062 return d->popupItem->locale();
2065void QQuickPopup::setLocale(
const QLocale &locale)
2068 d->popupItem->setLocale(locale);
2071void QQuickPopup::resetLocale()
2074 d->popupItem->resetLocale();
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090bool QQuickPopup::isMirrored()
const
2092 Q_D(
const QQuickPopup);
2093 return d->popupItem->isMirrored();
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123QFont QQuickPopup::font()
const
2125 Q_D(
const QQuickPopup);
2126 return d->popupItem->font();
2129void QQuickPopup::setFont(
const QFont &font)
2132 d->popupItem->setFont(font);
2135void QQuickPopup::resetFont()
2138 d->popupItem->resetFont();
2141QQuickWindow *QQuickPopup::window()
const
2143 Q_D(
const QQuickPopup);
2147QQuickItem *QQuickPopup::popupItem()
const
2149 Q_D(
const QQuickPopup);
2150 return d->popupItem;
2154
2155
2156
2157
2158QQuickItem *QQuickPopup::parentItem()
const
2160 Q_D(
const QQuickPopup);
2161 return d->parentItem;
2164void QQuickPopup::setParentItem(QQuickItem *parent)
2167 if (d->parentItem == parent)
2170 if (d->parentItem) {
2171 QObjectPrivate::disconnect(d->parentItem, &QQuickItem::windowChanged, d, &QQuickPopupPrivate::setWindow);
2172 QQuickItemPrivate::get(d->parentItem)->removeItemChangeListener(d, QQuickItemPrivate::Destroyed);
2174 d->parentItem = parent;
2175 QQuickPopupPositioner *positioner = d->getPositioner();
2176 if (positioner->parentItem())
2177 positioner->setParentItem(parent);
2179 QObjectPrivate::connect(parent, &QQuickItem::windowChanged, d, &QQuickPopupPrivate::setWindow);
2180 QQuickItemPrivate::get(d->parentItem)->addItemChangeListener(d, QQuickItemPrivate::Destroyed);
2181 }
else if (d->inDestructor) {
2185 if (!d->window && d->transitionManager.isRunning()) {
2186 if (d->transitionState == QQuickPopupPrivate::EnterTransition)
2187 d->finalizeEnterTransition();
2188 else if (d->transitionState == QQuickPopupPrivate::ExitTransition)
2189 d->finalizeExitTransition();
2195 d->setWindow(parent ? parent->window() :
nullptr);
2196 emit parentChanged();
2199void QQuickPopup::resetParentItem()
2201 if (QQuickWindow *window = qobject_cast<QQuickWindow *>(parent()))
2202 setParentItem(window->contentItem());
2204 setParentItem(findParentItem());
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224QQuickItem *QQuickPopup::background()
const
2226 Q_D(
const QQuickPopup);
2227 return d->popupItem->background();
2230void QQuickPopup::setBackground(QQuickItem *background)
2235 QQuickControlPrivate::warnIfCustomizationNotSupported(
this, background, QStringLiteral(
"background"));
2236 d->popupItem->setBackground(background);
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259QQuickItem *QQuickPopup::contentItem()
const
2261 Q_D(
const QQuickPopup);
2262 return d->popupItem->contentItem();
2265void QQuickPopup::setContentItem(QQuickItem *item)
2269 QQuickControlPrivate::warnIfCustomizationNotSupported(
this, item, QStringLiteral(
"contentItem"));
2270 QQuickItem *oldContentItem = d->complete ? d->popupItem->d_func()->contentItem.data()
2273 disconnect(oldContentItem, &QQuickItem::childrenChanged,
this, &QQuickPopup::contentChildrenChanged);
2274 d->popupItem->setContentItem(item);
2276 QQuickItem *newContentItem = d->popupItem->d_func()->contentItem.data();
2277 connect(newContentItem, &QQuickItem::childrenChanged,
this, &QQuickPopup::contentChildrenChanged);
2278 if (oldContentItem != newContentItem)
2279 emit contentChildrenChanged();
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297QQmlListProperty<QObject> QQuickPopupPrivate::contentData()
2299 QQuickControlPrivate *p = QQuickControlPrivate::get(popupItem);
2300 if (!p->contentItem)
2301 p->executeContentItem();
2302 return QQmlListProperty<QObject>(popupItem->contentItem(),
nullptr,
2303 QQuickItemPrivate::data_append,
2304 QQuickItemPrivate::data_count,
2305 QQuickItemPrivate::data_at,
2306 QQuickItemPrivate::data_clear);
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322QQmlListProperty<QQuickItem> QQuickPopupPrivate::contentChildren()
2324 return QQmlListProperty<QQuickItem>(popupItem->contentItem(),
nullptr,
2325 QQuickItemPrivate::children_append,
2326 QQuickItemPrivate::children_count,
2327 QQuickItemPrivate::children_at,
2328 QQuickItemPrivate::children_clear);
2332
2333
2334
2335
2336
2337bool QQuickPopup::clip()
const
2339 Q_D(
const QQuickPopup);
2340 return d->popupItem->clip() && !d->usePopupWindow();
2343void QQuickPopup::setClip(
bool clip)
2346 if (clip == d->popupItem->clip() || d->usePopupWindow())
2348 d->popupItem->setClip(clip);
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364bool QQuickPopup::hasFocus()
const
2366 Q_D(
const QQuickPopup);
2370void QQuickPopup::setFocus(
bool focus)
2373 if (d->focus == focus)
2376 emit focusChanged();
2380
2381
2382
2383
2384
2385
2386
2387bool QQuickPopup::hasActiveFocus()
const
2389 Q_D(
const QQuickPopup);
2390 return d->popupItem->hasActiveFocus();
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414bool QQuickPopup::isModal()
const
2416 Q_D(
const QQuickPopup);
2420void QQuickPopup::setModal(
bool modal)
2423 if (d->modal == modal)
2426 d->popupWindowDirty =
true;
2427 if (d->complete && d->visible)
2429 emit modalChanged();
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447bool QQuickPopup::dim()
const
2449 Q_D(
const QQuickPopup);
2453void QQuickPopup::setDim(
bool dim)
2462 if (d->complete && d->visible)
2467void QQuickPopup::resetDim()
2478
2479
2480
2481
2482
2483
2484bool QQuickPopup::isVisible()
const
2486 Q_D(
const QQuickPopup);
2487 return d->visible && d->popupItem->isVisible();
2490void QQuickPopup::setVisible(
bool visible)
2496 if (d->visible && visible && d->transitionState != QQuickPopupPrivate::ExitTransition)
2498 if (!d->visible && !visible)
2501 if (!d->complete || (visible && !d->window)) {
2502 d->visible = visible;
2507 d->transitionManager.transitionEnter();
2509 d->transitionManager.transitionExit();
2513
2514
2515
2516
2517
2518
2519
2520bool QQuickPopup::isEnabled()
const
2522 Q_D(
const QQuickPopup);
2523 return d->popupItem->isEnabled();
2526void QQuickPopup::setEnabled(
bool enabled)
2529 d->popupItem->setEnabled(enabled);
2533
2534
2535
2536
2537
2538
2539
2540
2541bool QQuickPopup::isOpened()
const
2543 Q_D(
const QQuickPopup);
2544 return d->transitionState == QQuickPopupPrivate::NoTransition && isVisible();
2548
2549
2550
2551
2552
2553
2554
2555qreal QQuickPopup::opacity()
const
2557 Q_D(
const QQuickPopup);
2558 return d->popupItem->opacity();
2561void QQuickPopup::setOpacity(qreal opacity)
2564 d->popupItem->setOpacity(opacity);
2568
2569
2570
2571
2572
2573
2574
2575
2576qreal QQuickPopup::scale()
const
2578 Q_D(
const QQuickPopup);
2579 return d->popupItem->scale();
2582void QQuickPopup::setScale(qreal scale)
2585 if (qFuzzyCompare(scale, d->popupItem->scale()))
2587 d->popupItem->setScale(scale);
2588 emit scaleChanged();
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617QQuickPopup::ClosePolicy QQuickPopup::closePolicy()
const
2619 Q_D(
const QQuickPopup);
2620 return d->closePolicy;
2623void QQuickPopup::setClosePolicy(ClosePolicy policy)
2626 d->hasClosePolicy =
true;
2627 if (d->closePolicy == policy)
2629 d->closePolicy = policy;
2630 emit closePolicyChanged();
2633void QQuickPopup::resetClosePolicy()
2636 setClosePolicy(QQuickPopupPrivate::DefaultClosePolicy);
2637 d->hasClosePolicy =
false;
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652QQuickPopup::TransformOrigin QQuickPopup::transformOrigin()
const
2654 Q_D(
const QQuickPopup);
2655 return static_cast<TransformOrigin>(d->popupItem->transformOrigin());
2658void QQuickPopup::setTransformOrigin(TransformOrigin origin)
2661 d->popupItem->setTransformOrigin(
static_cast<QQuickItem::TransformOrigin>(origin));
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682QQuickTransition *QQuickPopup::enter()
const
2684 Q_D(
const QQuickPopup);
2688void QQuickPopup::setEnter(QQuickTransition *transition)
2691 if (d->enter == transition)
2693 d->enter = transition;
2694 emit enterChanged();
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715QQuickTransition *QQuickPopup::exit()
const
2717 Q_D(
const QQuickPopup);
2721void QQuickPopup::setExit(QQuickTransition *transition)
2724 if (d->exit == transition)
2726 d->exit = transition;
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741qreal QQuickPopup::horizontalPadding()
const
2743 Q_D(
const QQuickPopup);
2744 return d->popupItem->horizontalPadding();
2747void QQuickPopup::setHorizontalPadding(qreal padding)
2750 d->popupItem->setHorizontalPadding(padding);
2753void QQuickPopup::resetHorizontalPadding()
2756 d->popupItem->resetHorizontalPadding();
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770qreal QQuickPopup::verticalPadding()
const
2772 Q_D(
const QQuickPopup);
2773 return d->popupItem->verticalPadding();
2776void QQuickPopup::setVerticalPadding(qreal padding)
2779 d->popupItem->setVerticalPadding(padding);
2782void QQuickPopup::resetVerticalPadding()
2785 d->popupItem->resetVerticalPadding();
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799qreal QQuickPopup::implicitContentWidth()
const
2801 Q_D(
const QQuickPopup);
2802 return d->popupItem->implicitContentWidth();
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816qreal QQuickPopup::implicitContentHeight()
const
2818 Q_D(
const QQuickPopup);
2819 return d->popupItem->implicitContentHeight();
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833qreal QQuickPopup::implicitBackgroundWidth()
const
2835 Q_D(
const QQuickPopup);
2836 return d->popupItem->implicitBackgroundWidth();
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850qreal QQuickPopup::implicitBackgroundHeight()
const
2852 Q_D(
const QQuickPopup);
2853 return d->popupItem->implicitBackgroundHeight();
2857
2858
2859
2860
2861
2862
2863
2864qreal QQuickPopup::topInset()
const
2866 Q_D(
const QQuickPopup);
2867 return d->popupItem->topInset();
2870void QQuickPopup::setTopInset(qreal inset)
2873 d->popupItem->setTopInset(inset);
2876void QQuickPopup::resetTopInset()
2879 d->popupItem->resetTopInset();
2883
2884
2885
2886
2887
2888
2889
2890qreal QQuickPopup::leftInset()
const
2892 Q_D(
const QQuickPopup);
2893 return d->popupItem->leftInset();
2896void QQuickPopup::setLeftInset(qreal inset)
2899 d->popupItem->setLeftInset(inset);
2902void QQuickPopup::resetLeftInset()
2905 d->popupItem->resetLeftInset();
2909
2910
2911
2912
2913
2914
2915
2916qreal QQuickPopup::rightInset()
const
2918 Q_D(
const QQuickPopup);
2919 return d->popupItem->rightInset();
2922void QQuickPopup::setRightInset(qreal inset)
2925 d->popupItem->setRightInset(inset);
2928void QQuickPopup::resetRightInset()
2931 d->popupItem->resetRightInset();
2935
2936
2937
2938
2939
2940
2941
2942qreal QQuickPopup::bottomInset()
const
2944 Q_D(
const QQuickPopup);
2945 return d->popupItem->bottomInset();
2948void QQuickPopup::setBottomInset(qreal inset)
2951 d->popupItem->setBottomInset(inset);
2954void QQuickPopup::resetBottomInset()
2957 d->popupItem->resetBottomInset();
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004QQuickPopup::PopupType QQuickPopup::popupType()
const
3006 Q_D(
const QQuickPopup);
3007 return d->popupType;
3010void QQuickPopup::setPopupType(PopupType popupType)
3013 if (d->popupType == popupType)
3016 d->popupType = popupType;
3018 emit popupTypeChanged();
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3051bool QQuickPopup::filtersChildMouseEvents()
const
3053 Q_D(
const QQuickPopup);
3054 return d->popupItem->filtersChildMouseEvents();
3057void QQuickPopup::setFiltersChildMouseEvents(
bool filter)
3060 d->popupItem->setFiltersChildMouseEvents(filter);
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073void QQuickPopup::forceActiveFocus(Qt::FocusReason reason)
3076 d->popupItem->forceActiveFocus(reason);
3079void QQuickPopup::classBegin()
3082 d->complete =
false;
3083 QQmlContext *context = qmlContext(
this);
3085 QQmlEngine::setContextForObject(d->popupItem, context);
3086 d->popupItem->classBegin();
3089void QQuickPopup::componentComplete()
3092 qCDebug(lcQuickPopup) <<
"componentComplete" <<
this;
3096 if (d->visible && d->window)
3097 d->transitionManager.transitionEnter();
3100 d->popupItem->setObjectName(QQmlMetaType::prettyTypeName(
this));
3101 d->popupItem->componentComplete();
3103 if (
auto currentContentItem = d->popupItem->d_func()->contentItem.data()) {
3104 connect(currentContentItem, &QQuickItem::childrenChanged,
3105 this, &QQuickPopup::contentChildrenChanged);
3109bool QQuickPopup::isComponentComplete()
const
3111 Q_D(
const QQuickPopup);
3115bool QQuickPopup::childMouseEventFilter(QQuickItem *child, QEvent *event)
3122void QQuickPopup::focusInEvent(QFocusEvent *event)
3127void QQuickPopup::focusOutEvent(QFocusEvent *event)
3132void QQuickPopup::keyPressEvent(QKeyEvent *event)
3135 if (!hasActiveFocus())
3138#if QT_CONFIG(shortcut)
3139 if (d->closePolicy.testFlag(QQuickPopup::CloseOnEscape)
3140 && (event->matches(QKeySequence::Cancel)
3141#if defined(Q_OS_ANDROID)
3142 || event->key() == Qt::Key_Back
3152 if (hasActiveFocus() && (event->key() == Qt::Key_Tab || event->key() == Qt::Key_Backtab)) {
3154 QQuickItemPrivate::focusNextPrev(d->popupItem, event->key() == Qt::Key_Tab);
3158void QQuickPopup::keyReleaseEvent(QKeyEvent *event)
3163void QQuickPopup::mousePressEvent(QMouseEvent *event)
3166 event->setAccepted(d->handleMouseEvent(d->popupItem, event));
3169void QQuickPopup::mouseMoveEvent(QMouseEvent *event)
3172 event->setAccepted(d->handleMouseEvent(d->popupItem, event));
3175void QQuickPopup::mouseReleaseEvent(QMouseEvent *event)
3178 event->setAccepted(d->handleMouseEvent(d->popupItem, event));
3181void QQuickPopup::mouseDoubleClickEvent(QMouseEvent *event)
3186void QQuickPopup::mouseUngrabEvent()
3195 QQuickItem *sourceAncestor = source;
3196 while (sourceAncestor) {
3197 QQuickItem *parentItem = sourceAncestor->parentItem();
3198 if (parentItem == overlay)
3199 return sourceAncestor;
3200 sourceAncestor = parentItem;
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218bool QQuickPopup::overlayEvent(QQuickItem *item, QEvent *event)
3225 auto *overlay = QQuickOverlay::overlay(d->window);
3227 const QList<QQuickItem *> paintOrderChildItems = QQuickOverlayPrivate::get(overlay)->paintOrderChildItems();
3228 const qsizetype targetItemPaintOrderIndex = paintOrderChildItems.indexOf(findRootOfOverlaySubtree(item, overlay));
3229 const qsizetype popupItemPaintOrderIndex = paintOrderChildItems.indexOf(d->popupItem);
3230 if (targetItemPaintOrderIndex > popupItemPaintOrderIndex)
3233 switch (event->type()) {
3234 case QEvent::KeyPress:
3235 case QEvent::KeyRelease:
3236 case QEvent::MouseMove:
3242#if QT_CONFIG(quicktemplates2_multitouch)
3243 case QEvent::TouchBegin:
3244 case QEvent::TouchUpdate:
3245 case QEvent::TouchEnd:
3246 return d->handleTouchEvent(item,
static_cast<QTouchEvent *>(event));
3248 case QEvent::HoverEnter:
3249 case QEvent::HoverMove:
3250 case QEvent::HoverLeave:
3251 return d->handleHoverEvent(item,
static_cast<QHoverEvent *>(event));
3253 case QEvent::MouseButtonPress:
3254 case QEvent::MouseButtonRelease:
3255 return d->handleMouseEvent(item,
static_cast<QMouseEvent *>(event));
3262#if QT_CONFIG(quicktemplates2_multitouch)
3263void QQuickPopup::touchEvent(QTouchEvent *event)
3266 event->setAccepted(d->handleTouchEvent(d->popupItem, event));
3269void QQuickPopup::touchUngrabEvent()
3276#if QT_CONFIG(wheelevent)
3277void QQuickPopup::wheelEvent(QWheelEvent *event)
3283void QQuickPopup::contentItemChange(QQuickItem *newItem, QQuickItem *oldItem)
3289void QQuickPopup::contentSizeChange(
const QSizeF &newSize,
const QSizeF &oldSize)
3291 qCDebug(lcQuickPopup) <<
"contentSizeChange called on" <<
this <<
"with newSize" << newSize <<
"oldSize" << oldSize;
3292 if (!qFuzzyCompare(newSize.width(), oldSize.width()))
3293 emit contentWidthChanged();
3294 if (!qFuzzyCompare(newSize.height(), oldSize.height()))
3295 emit contentHeightChanged();
3298void QQuickPopup::fontChange(
const QFont &newFont,
const QFont &oldFont)
3305void QQuickPopup::geometryChange(
const QRectF &newGeometry,
const QRectF &oldGeometry)
3308 qCDebug(lcQuickPopup) <<
"geometryChange called on" <<
this <<
"with newGeometry" << newGeometry <<
"oldGeometry" << oldGeometry;
3309 if (!d->usePopupWindow())
3311 if (!qFuzzyCompare(newGeometry.width(), oldGeometry.width())) {
3312 emit widthChanged();
3313 emit availableWidthChanged();
3315 if (!qFuzzyCompare(newGeometry.height(), oldGeometry.height())) {
3316 emit heightChanged();
3317 emit availableHeightChanged();
3321void QQuickPopup::itemChange(QQuickItem::ItemChange change,
const QQuickItem::ItemChangeData &)
3324 case QQuickItem::ItemActiveFocusHasChanged:
3325 emit activeFocusChanged();
3327 case QQuickItem::ItemOpacityHasChanged:
3328 emit opacityChanged();
3335void QQuickPopup::localeChange(
const QLocale &newLocale,
const QLocale &oldLocale)
3337 Q_UNUSED(newLocale);
3338 Q_UNUSED(oldLocale);
3339 emit localeChanged();
3342void QQuickPopup::marginsChange(
const QMarginsF &newMargins,
const QMarginsF &oldMargins)
3345 Q_UNUSED(newMargins);
3346 Q_UNUSED(oldMargins);
3350void QQuickPopup::paddingChange(
const QMarginsF &newPadding,
const QMarginsF &oldPadding)
3352 const bool tp = !qFuzzyCompare(newPadding.top(), oldPadding.top());
3353 const bool lp = !qFuzzyCompare(newPadding.left(), oldPadding.left());
3354 const bool rp = !qFuzzyCompare(newPadding.right(), oldPadding.right());
3355 const bool bp = !qFuzzyCompare(newPadding.bottom(), oldPadding.bottom());
3358 emit topPaddingChanged();
3360 emit leftPaddingChanged();
3362 emit rightPaddingChanged();
3364 emit bottomPaddingChanged();
3367 emit horizontalPaddingChanged();
3368 emit availableWidthChanged();
3371 emit verticalPaddingChanged();
3372 emit availableHeightChanged();
3376void QQuickPopup::spacingChange(qreal newSpacing, qreal oldSpacing)
3378 Q_UNUSED(newSpacing);
3379 Q_UNUSED(oldSpacing);
3380 emit spacingChanged();
3383void QQuickPopup::insetChange(
const QMarginsF &newInset,
const QMarginsF &oldInset)
3385 if (!qFuzzyCompare(newInset.top(), oldInset.top()))
3386 emit topInsetChanged();
3387 if (!qFuzzyCompare(newInset.left(), oldInset.left()))
3388 emit leftInsetChanged();
3389 if (!qFuzzyCompare(newInset.right(), oldInset.right()))
3390 emit rightInsetChanged();
3391 if (!qFuzzyCompare(newInset.bottom(), oldInset.bottom()))
3392 emit bottomInsetChanged();
3395QFont QQuickPopup::defaultFont()
const
3397 return QQuickTheme::font(QQuickTheme::System);
3400#if QT_CONFIG(accessibility)
3401QAccessible::Role QQuickPopup::effectiveAccessibleRole()
const
3403 auto *attached = qmlAttachedPropertiesObject<QQuickAccessibleAttached>(
this,
false);
3405 auto role = QAccessible::NoRole;
3406 if (
auto *accessibleAttached = qobject_cast<QQuickAccessibleAttached *>(attached))
3407 role = accessibleAttached->role();
3408 if (role == QAccessible::NoRole)
3409 role = accessibleRole();
3414QAccessible::Role QQuickPopup::accessibleRole()
const
3416 return QAccessible::Dialog;
3419void QQuickPopup::accessibilityActiveChanged(
bool active)
3425QString QQuickPopup::accessibleName()
const
3427 Q_D(
const QQuickPopup);
3428 return d->popupItem->accessibleName();
3431void QQuickPopup::maybeSetAccessibleName(
const QString &name)
3434 d->popupItem->maybeSetAccessibleName(name);
3437QVariant QQuickPopup::accessibleProperty(
const char *propertyName)
3439 Q_D(
const QQuickPopup);
3440 return d->popupItem->accessibleProperty(propertyName);
3443bool QQuickPopup::setAccessibleProperty(
const char *propertyName,
const QVariant &value)
3446 return d->popupItem->setAccessibleProperty(propertyName, value);
3449void QQuickPopup::setWindowModality(
const Qt::WindowModality modality)
3452 d->popupWndModality = modality;
3455QQuickItem *QQuickPopup::safeAreaAttachmentItem()
3462#include "moc_qquickpopup_p.cpp"
Combined button and popup list for selecting options.