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);
519 QObject::connect(popupItem, &QQuickControl::spacingChanged, q, &QQuickPopup::spacingChanged);
520 QObject::connect(popupItem, &QQuickControl::topInsetChanged, q, &QQuickPopup::topInsetChanged);
521 QObject::connect(popupItem, &QQuickControl::bottomInsetChanged, q, &QQuickPopup::bottomInsetChanged);
522 QObject::connect(popupItem, &QQuickControl::leftInsetChanged, q, &QQuickPopup::leftInsetChanged);
523 QObject::connect(popupItem, &QQuickControl::rightInsetChanged, q, &QQuickPopup::rightInsetChanged);
526void QQuickPopupPrivate::closeOrReject()
529#if QT_CONFIG(quicktemplates2_container)
530 if (QQuickDialog *dialog = qobject_cast<QQuickDialog*>(q))
538bool QQuickPopupPrivate::tryClose(
const QPointF &pos, QQuickPopup::ClosePolicy flags)
543 static const QQuickPopup::ClosePolicy outsideFlags = QQuickPopup::CloseOnPressOutside | QQuickPopup::CloseOnReleaseOutside;
544 static const QQuickPopup::ClosePolicy outsideParentFlags = QQuickPopup::CloseOnPressOutsideParent | QQuickPopup::CloseOnReleaseOutsideParent;
546 const bool onOutside = closePolicy & (flags & outsideFlags);
547 const bool onOutsideParent = closePolicy & (flags & outsideParentFlags);
549 if ((onOutside && outsidePressed) || (onOutsideParent && outsideParentPressed)) {
550 if (!contains(pos) && (!dimmer || dimmer->contains(dimmer->mapFromScene(pos)))) {
551 if (!onOutsideParent || !parentItem || !parentItem->contains(parentItem->mapFromScene(pos))) {
560bool QQuickPopupPrivate::contains(
const QPointF &scenePos)
const
562 return popupItem->contains(popupItem->mapFromScene(scenePos));
565#if QT_CONFIG(quicktemplates2_multitouch)
566bool QQuickPopupPrivate::acceptTouch(
const QTouchEvent::TouchPoint &point)
568 if (point.id() == touchId)
571 if (touchId == -1 && point.state() != QEventPoint::Released) {
572 touchId = point.id();
580bool QQuickPopupPrivate::blockInput(QQuickItem *item,
const QPointF &point)
const
583 if (popupItem->contains(popupItem->mapFromScene(point))
584 && item == QQuickOverlay::overlay(window, parentItem)) {
593 return modal && ((popupItem != item) && !popupItem->isAncestorOf(item)) && (!dimmer || dimmer->contains(dimmer->mapFromScene(point)));
596bool QQuickPopupPrivate::handlePress(QQuickItem *item,
const QPointF &point, ulong timestamp)
600 outsidePressed = !contains(point);
602 if (outsidePressed && parentItem) {
606 const QPointF globalPoint = item->mapToGlobal(point);
607 const QPointF localPoint = parentItem->mapFromGlobal(globalPoint);
608 outsideParentPressed = !parentItem->contains(localPoint);
611 tryClose(point, QQuickPopup::CloseOnPressOutside | QQuickPopup::CloseOnPressOutsideParent);
612 return blockInput(item, point);
615bool QQuickPopupPrivate::handleMove(QQuickItem *item,
const QPointF &point, ulong timestamp)
618 return blockInput(item, point);
621bool QQuickPopupPrivate::handleRelease(QQuickItem *item,
const QPointF &point, ulong timestamp)
624 if (item != popupItem && !contains(pressPoint))
625 tryClose(point, QQuickPopup::CloseOnReleaseOutside | QQuickPopup::CloseOnReleaseOutsideParent);
626 pressPoint = QPointF();
627 outsidePressed =
false;
628 outsideParentPressed =
false;
630 return blockInput(item, point);
633void QQuickPopupPrivate::handleUngrab()
636 QQuickOverlay *overlay = QQuickOverlay::overlay(window, parentItem);
638 QQuickOverlayPrivate *p = QQuickOverlayPrivate::get(overlay);
639 if (p->mouseGrabberPopup == q)
640 p->mouseGrabberPopup =
nullptr;
642 pressPoint = QPointF();
646bool QQuickPopupPrivate::handleMouseEvent(QQuickItem *item, QMouseEvent *event)
648 switch (event->type()) {
649 case QEvent::MouseButtonPress:
650 return handlePress(item, event->scenePosition(), event->timestamp());
651 case QEvent::MouseMove:
652 return handleMove(item, event->scenePosition(), event->timestamp());
653 case QEvent::MouseButtonRelease:
654 return handleRelease(item, event->scenePosition(), event->timestamp());
656 Q_UNREACHABLE_RETURN(
false);
660bool QQuickPopupPrivate::handleHoverEvent(QQuickItem *item, QHoverEvent *event)
662 switch (event->type()) {
663 case QEvent::HoverEnter:
664 case QEvent::HoverMove:
665 case QEvent::HoverLeave:
666 return blockInput(item, event->scenePosition());
668 Q_UNREACHABLE_RETURN(
false);
672QMarginsF QQuickPopupPrivate::windowInsets()
const
674 Q_Q(
const QQuickPopup);
685 const auto *popupItemPrivate = QQuickControlPrivate::get(popupItem);
686 if (!usePopupWindow() || (popupItemPrivate->background.isExecuting() && popupItemPrivate->background->clip())) {
694 q->leftInset() < 0 ? -q->leftInset() : 0,
695 q->rightInset() < 0 ? -q->rightInset() : 0,
696 q->topInset() < 0 ? -q->topInset() : 0,
697 q->bottomInset() < 0 ? -q->bottomInset() : 0
701QPointF QQuickPopupPrivate::windowInsetsTopLeft()
const
703 const QMarginsF windowMargins = windowInsets();
704 return {windowMargins.left(), windowMargins.top()};
707void QQuickPopupPrivate::setEffectivePosFromWindowPos(
const QPointF &windowPos)
724 const QPointF oldEffectivePos = effectivePos;
725 effectivePos = windowPos + windowInsetsTopLeft();
726 if (!qFuzzyCompare(oldEffectivePos.x(), effectivePos.x()))
728 if (!qFuzzyCompare(oldEffectivePos.y(), effectivePos.y()))
732#if QT_CONFIG(quicktemplates2_multitouch)
733bool QQuickPopupPrivate::handleTouchEvent(QQuickItem *item, QTouchEvent *event)
735 switch (event->type()) {
736 case QEvent::TouchBegin:
737 case QEvent::TouchUpdate:
738 case QEvent::TouchEnd:
739 for (
const QTouchEvent::TouchPoint &point : event->points()) {
740 if (event->type() != QEvent::TouchEnd && !acceptTouch(point))
741 return blockInput(item, point.position());
743 switch (point.state()) {
744 case QEventPoint::Pressed:
745 return handlePress(item, point.scenePosition(), event->timestamp());
746 case QEventPoint::Updated:
747 return handleMove(item, point.scenePosition(), event->timestamp());
748 case QEventPoint::Released:
749 return handleRelease(item, point.scenePosition(), event->timestamp());
756 case QEvent::TouchCancel:
768bool QQuickPopupPrivate::prepareEnterTransition()
772 qmlWarning(q) <<
"cannot find any window to open popup in.";
776 if (transitionState == EnterTransition && transitionManager.isRunning())
779 if (transitionState != EnterTransition) {
780 const QPointer<QQuickItem> lastActiveFocusItem = window->activeFocusItem();
782 adjustPopupItemParentAndWindow();
786 emit q->aboutToShow();
787 transitionState = EnterTransition;
788 getPositioner()->setParentItem(parentItem);
789 emit q->visibleChanged();
791 if (lastActiveFocusItem) {
792 if (
auto *overlay = QQuickOverlay::overlay(window, parentItem)) {
793 auto *overlayPrivate = QQuickOverlayPrivate::get(overlay);
794 if (overlayPrivate->lastActiveFocusItem.isNull() && !popupItem->isAncestorOf(lastActiveFocusItem)) {
795 overlayPrivate->lastActiveFocusItem = lastActiveFocusItem;
796 savedLastActiveFocusItem =
true;
802 popupItem->setFocus(
true, Qt::PopupFocusReason);
807bool QQuickPopupPrivate::prepareExitTransition()
810 if (transitionState == ExitTransition && transitionManager.isRunning())
817 prevScale = popupItem->scale();
818 prevOpacity = popupItem->opacity();
820 if (transitionState != ExitTransition) {
823 if (!hadActiveFocusBeforeExitTransition) {
824 const auto *da = QQuickItemPrivate::get(popupItem)->deliveryAgentPrivate();
825 hadActiveFocusBeforeExitTransition = popupItem->hasActiveFocus() || (da && da->focusTargetItem() == popupItem);
829 popupItem->setFocus(
false, Qt::PopupFocusReason);
830 transitionState = ExitTransition;
832 emit q->aboutToHide();
833 emit q->openedChanged();
838void QQuickPopupPrivate::finalizeEnterTransition()
841 transitionState = NoTransition;
843 emit q->openedChanged();
847void QQuickPopupPrivate::finalizeExitTransition()
850 getPositioner()->setParentItem(
nullptr);
852 popupItem->setParentItem(
nullptr);
853 popupItem->setVisible(
false);
857 if (
auto *overlay = QQuickOverlay::overlay(window, parentItem)) {
858 auto *overlayPrivate = QQuickOverlayPrivate::get(overlay);
861 if (hadActiveFocusBeforeExitTransition) {
862 QQuickPopup *nextFocusPopup =
nullptr;
863 const auto stackingOrderPopups = overlayPrivate->stackingOrderPopups();
864 for (
auto popup : stackingOrderPopups) {
866 if (QQuickPopupPrivate::get(popup)->transitionState != ExitTransition
867 && popup->hasFocus() && !popup->hasActiveFocus()) {
868 nextFocusPopup = popup;
872 if (nextFocusPopup) {
873 nextFocusPopup->forceActiveFocus(Qt::PopupFocusReason);
875 auto *appWindow = qobject_cast<QQuickApplicationWindow*>(window);
876 auto *contentItem = appWindow ? appWindow->contentItem() : window->contentItem();
877 if (!contentItem->scopedFocusItem()
878 && !overlayPrivate->lastActiveFocusItem.isNull()) {
881 overlayPrivate->lastActiveFocusItem->forceActiveFocus(Qt::OtherFocusReason);
883 contentItem->setFocus(
true, Qt::PopupFocusReason);
889 if (savedLastActiveFocusItem)
890 overlayPrivate->lastActiveFocusItem =
nullptr;
894 adjustPopupItemParentAndWindow();
895 transitionState = NoTransition;
896 hadActiveFocusBeforeExitTransition =
false;
897 savedLastActiveFocusItem =
false;
898 emit q->visibleChanged();
900#if QT_CONFIG(accessibility)
901 const auto type = q->effectiveAccessibleRole() == QAccessible::PopupMenu
902 ? QAccessible::PopupMenuEnd
903 : QAccessible::DialogEnd;
904 QAccessibleEvent ev(q->popupItem(), type);
905 QAccessible::updateAccessibility(&ev);
908 popupItem->setScale(prevScale);
909 popupItem->setOpacity(prevOpacity);
913void QQuickPopupPrivate::opened()
917#if QT_CONFIG(accessibility)
918 const auto type = q->effectiveAccessibleRole() == QAccessible::PopupMenu
919 ? QAccessible::PopupMenuStart
920 : QAccessible::DialogStart;
921 QAccessibleEvent ev(q->popupItem(), type);
922 QAccessible::updateAccessibility(&ev);
926Qt::WindowFlags QQuickPopupPrivate::popupWindowType()
const
928 return Qt::Popup | Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint;
931QMarginsF QQuickPopupPrivate::getMargins()
const
933 Q_Q(
const QQuickPopup);
934 return QMarginsF(q->leftMargin(), q->topMargin(), q->rightMargin(), q->bottomMargin());
937void QQuickPopupPrivate::setTopMargin(qreal value,
bool reset)
940 qreal oldMargin = q->topMargin();
942 hasTopMargin = !reset;
943 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
944 emit q->topMarginChanged();
945 q->marginsChange(QMarginsF(leftMargin, topMargin, rightMargin, bottomMargin),
946 QMarginsF(leftMargin, oldMargin, rightMargin, bottomMargin));
950void QQuickPopupPrivate::setLeftMargin(qreal value,
bool reset)
953 qreal oldMargin = q->leftMargin();
955 hasLeftMargin = !reset;
956 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
957 emit q->leftMarginChanged();
958 q->marginsChange(QMarginsF(leftMargin, topMargin, rightMargin, bottomMargin),
959 QMarginsF(oldMargin, topMargin, rightMargin, bottomMargin));
963void QQuickPopupPrivate::setRightMargin(qreal value,
bool reset)
966 qreal oldMargin = q->rightMargin();
968 hasRightMargin = !reset;
969 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
970 emit q->rightMarginChanged();
971 q->marginsChange(QMarginsF(leftMargin, topMargin, rightMargin, bottomMargin),
972 QMarginsF(leftMargin, topMargin, oldMargin, bottomMargin));
976void QQuickPopupPrivate::setBottomMargin(qreal value,
bool reset)
979 qreal oldMargin = q->bottomMargin();
980 bottomMargin = value;
981 hasBottomMargin = !reset;
982 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
983 emit q->bottomMarginChanged();
984 q->marginsChange(QMarginsF(leftMargin, topMargin, rightMargin, bottomMargin),
985 QMarginsF(leftMargin, topMargin, rightMargin, oldMargin));
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
1019
1020
1021
1022QQuickPopupAnchors *QQuickPopupPrivate::getAnchors()
1026 anchors =
new QQuickPopupAnchors(q);
1030QQuickPopupPositioner *QQuickPopupPrivate::getPositioner()
1034 positioner =
new QQuickPopupPositioner(q);
1038void QQuickPopupPrivate::setWindow(QQuickWindow *newWindow)
1041 if (window == newWindow)
1045 QQuickOverlay *overlay = QQuickOverlay::overlay(window, parentItem);
1047 QQuickOverlayPrivate::get(overlay)->removePopup(q);
1052 if (!newWindow && popupItem)
1053 popupItem->setParentItem(
nullptr);
1059 QQuickOverlay *overlay = QQuickOverlay::overlay(newWindow, parentItem);
1061 QQuickOverlayPrivate::get(overlay)->addPopup(q);
1063 QQuickControlPrivate *p = QQuickControlPrivate::get(popupItem);
1065 if (QQuickApplicationWindow *appWindow = qobject_cast<QQuickApplicationWindow *>(newWindow))
1066 p->updateLocale(appWindow->locale(),
false);
1069 emit q->windowChanged(newWindow);
1071 if (complete && visible && window)
1072 transitionManager.transitionEnter();
1075void QQuickPopupPrivate::itemDestroyed(QQuickItem *item)
1078 if (item == parentItem)
1079 q->setParentItem(
nullptr);
1082void QQuickPopupPrivate::reposition()
1084 getPositioner()->reposition();
1087QPalette QQuickPopupPrivate::defaultPalette()
const
1089 return QQuickTheme::palette(QQuickTheme::System);
1092QQuickPopup::PopupType QQuickPopupPrivate::resolvedPopupType()
const
1102 if (popupType == QQuickPopup::PopupType::Window
1103 || popupType == QQuickPopup::PopupType::Native) {
1104 if (QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::Capability::MultipleWindows))
1105 return QQuickPopup::PopupType::Window;
1108 return QQuickPopup::PopupType::Item;
1111bool QQuickPopupPrivate::usePopupWindow()
const
1113 return resolvedPopupType() == QQuickPopup::PopupType::Window;
1116void QQuickPopupPrivate::adjustPopupItemParentAndWindow()
1119 QQuickOverlay *overlay = QQuickOverlay::overlay(window, parentItem);
1121 if (visible && popupWindowDirty) {
1122 popupItem->setParentItem(overlay);
1124 popupWindow->deleteLater();
1125 popupWindow =
nullptr;
1127 popupWindowDirty =
false;
1130 if (usePopupWindow()) {
1133 popupWindow =
new QQuickPopupWindow(q, window);
1136 const qreal initialWidth = popupItem->width() + windowInsets().left() + windowInsets().right();
1137 const qreal initialHeight = popupItem->height() + windowInsets().top() + windowInsets().bottom();
1138 popupItem->setParentItem(popupWindow->contentItem());
1139 popupWindow->resize(qCeil(initialWidth), qCeil(initialHeight));
1140 if (popupWndModality != Qt::NonModal)
1141 popupWindow->setModality(popupWndModality);
1143 popupWindow->setModality(modal ? Qt::ApplicationModal : Qt::NonModal);
1144 popupItem->resetTitle();
1145 popupWindow->setTitle(title);
1147 popupItem->setParentItem(popupWindow->contentItem());
1148 popupItem->forceActiveFocus(Qt::PopupFocusReason);
1150 if (popupWindow && popupWindow->transientParent()) {
1151 auto *transientParentPriv = QQuickWindowPrivate::get(qobject_cast<QQuickWindow *>(popupWindow->transientParent()));
1152 if (!transientParentPriv->inDestructor)
1153 popupWindow->setVisible(visible);
1157 popupItem->setParentItem(overlay);
1158 const auto popupStack = QQuickOverlayPrivate::get(overlay)->stackingOrderPopups();
1162 const QQuickPopup *topPopup = popupStack.isEmpty() ?
nullptr : popupStack.first();
1163 const QObject *ancestor = q;
1164 while (ancestor && topPopup) {
1165 if (ancestor == topPopup)
1167 ancestor = ancestor->parent();
1169 if (topPopup && topPopup != q && ancestor) {
1170 QQuickItem *topPopupItem = popupStack.first()->popupItem();
1171 popupItem->stackAfter(topPopupItem);
1175 popupItem->setZ(qMax(topPopupItem->z(), popupItem->z()));
1177 q->setModal((popupWndModality != Qt::NonModal) || modal);
1180 popupItem->setTitle(title);
1182 popupItem->setVisible(visible);
1185QQuickItem *QQuickPopupPrivate::createDimmer(QQmlComponent *component, QQuickPopup *popup, QQuickItem *parent)
const
1187 QQuickItem *item =
nullptr;
1189 QQmlContext *context = component->creationContext();
1191 context = qmlContext(popup);
1192 item = qobject_cast<QQuickItem*>(component->beginCreate(context));
1197 if (!item && popup->isModal())
1198 item =
new QQuickItem;
1201 item->setParentItem(parent);
1202 if (resolvedPopupType() != QQuickPopup::PopupType::Window)
1203 item->stackBefore(popup->popupItem());
1204 item->setZ(popup->z());
1206 qCDebug(lcDimmer) <<
"dimmer" << item <<
"registered with" << parent;
1207 parent->setProperty(
"_q_dimmerItem", QVariant::fromValue<QQuickItem*>(item));
1208 if (popup->isModal()) {
1209 item->setAcceptedMouseButtons(Qt::AllButtons);
1210#if QT_CONFIG(cursor)
1211 item->setCursor(Qt::ArrowCursor);
1213#if QT_CONFIG(quicktemplates2_hover)
1215 item->setAcceptHoverEvents(
true);
1221 component->completeCreate();
1223 qCDebug(lcDimmer) <<
"finished creating dimmer from component" << component
1224 <<
"for popup" << popup <<
"with parent" << parent <<
"- item is:" << item;
1228void QQuickPopupPrivate::createOverlay()
1231 QQuickOverlay *overlay = QQuickOverlay::overlay(window, parentItem);
1235 QQmlComponent *component =
nullptr;
1236 QQuickOverlayAttached *overlayAttached = qobject_cast<QQuickOverlayAttached *>(qmlAttachedPropertiesObject<QQuickOverlay>(q,
false));
1237 if (overlayAttached)
1238 component = modal ? overlayAttached->modal() : overlayAttached->modeless();
1241 component = modal ? overlay->modal() : overlay->modeless();
1244 dimmer = createDimmer(component, q, overlay);
1251 explicitDimmerOpacity = dimmer->opacity();
1253 dimmer->setOpacity(0);
1260void QQuickPopupPrivate::destroyDimmer()
1263 qCDebug(lcDimmer) <<
"destroying dimmer" << dimmer;
1264 if (QObject *dimmerParentItem = dimmer->parentItem()) {
1265 if (dimmerParentItem->property(
"_q_dimmerItem").value<QQuickItem*>() == dimmer)
1266 dimmerParentItem->setProperty(
"_q_dimmerItem", QVariant());
1268 dimmer->setParentItem(
nullptr);
1269 dimmer->deleteLater();
1274void QQuickPopupPrivate::toggleOverlay()
1281void QQuickPopupPrivate::updateContentPalettes(
const QPalette& parentPalette)
1284 if (providesPalette())
1285 inheritPalette(parentPalette);
1287 QQuickItemPrivate::get(popupItem)->updateChildrenPalettes(parentPalette);
1290void QQuickPopupPrivate::updateChildrenPalettes(
const QPalette& parentPalette)
1292 updateContentPalettes(parentPalette);
1295void QQuickPopupPrivate::showDimmer()
1299 QQmlProperty::write(dimmer, QStringLiteral(
"opacity"), explicitDimmerOpacity);
1302void QQuickPopupPrivate::hideDimmer()
1306 QQmlProperty::write(dimmer, QStringLiteral(
"opacity"), 0.0);
1309void QQuickPopupPrivate::resizeDimmer()
1314 const QQuickOverlay *overlay = QQuickOverlay::overlay(window, parentItem);
1316 qreal w = overlay ? overlay->width() : 0;
1317 qreal h = overlay ? overlay->height() : 0;
1318 dimmer->setSize(QSizeF(w, h));
1321QQuickPopupTransitionManager::QQuickPopupTransitionManager(QQuickPopupPrivate *popup)
1326void QQuickPopupTransitionManager::transitionEnter()
1328 if (popup->transitionState == QQuickPopupPrivate::ExitTransition)
1331 if (!popup->prepareEnterTransition())
1335 transition(popup->enterActions, popup->enter, popup->q_func());
1340void QQuickPopupTransitionManager::transitionExit()
1342 if (!popup->prepareExitTransition())
1346 transition(popup->exitActions, popup->exit, popup->q_func());
1351void QQuickPopupTransitionManager::finished()
1353 if (popup->transitionState == QQuickPopupPrivate::EnterTransition)
1354 popup->finalizeEnterTransition();
1355 else if (popup->transitionState == QQuickPopupPrivate::ExitTransition)
1356 popup->finalizeExitTransition();
1359QQuickPopup::QQuickPopup(QObject *parent)
1360 : QObject(*(
new QQuickPopupPrivate), parent)
1365 d->relaxEdgeConstraint =
true;
1368QQuickPopup::QQuickPopup(QQuickPopupPrivate &dd, QObject *parent)
1369 : QObject(dd, parent)
1375QQuickPopup::~QQuickPopup()
1378 d->inDestructor =
true;
1380 QQuickItem *currentContentItem = d->popupItem->d_func()->contentItem.data();
1381 if (currentContentItem) {
1382 disconnect(currentContentItem, &QQuickItem::childrenChanged,
1383 this, &QQuickPopup::contentChildrenChanged);
1386 setParentItem(
nullptr);
1391 if (d->transitionState == QQuickPopupPrivate::ExitTransition && d->transitionManager.isRunning())
1392 d->finalizeExitTransition();
1394 delete d->popupItem;
1395 d->popupItem =
nullptr;
1396 delete d->positioner;
1397 d->positioner =
nullptr;
1399 delete d->popupWindow;
1400 d->popupWindow =
nullptr;
1404
1405
1406
1407
1408
1409
1410void QQuickPopup::open()
1416
1417
1418
1419
1420
1421
1422void QQuickPopup::close()
1428
1429
1430
1431
1432
1433
1434qreal QQuickPopup::x()
const
1436 return d_func()->effectivePos.x();
1439void QQuickPopup::setX(qreal x)
1442 setPosition(QPointF(x, d->y));
1446
1447
1448
1449
1450
1451
1452qreal QQuickPopup::y()
const
1454 return d_func()->effectivePos.y();
1457void QQuickPopup::setY(qreal y)
1460 setPosition(QPointF(d->x, y));
1463QPointF QQuickPopup::position()
const
1465 return d_func()->effectivePos;
1468void QQuickPopup::setPosition(
const QPointF &pos)
1471 const bool xChange = !qFuzzyCompare(d->x, pos.x());
1472 const bool yChange = !qFuzzyCompare(d->y, pos.y());
1473 if (!xChange && !yChange)
1478 if (d->popupItem->isVisible()) {
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508qreal QQuickPopup::z()
const
1510 Q_D(
const QQuickPopup);
1511 return d->popupItem->z();
1514void QQuickPopup::setZ(qreal z)
1518 bool previousZ = d->popupWindow ? d->popupWindow->z() : d->popupItem->z();
1519 if (qFuzzyCompare(z, previousZ))
1522 d->popupWindow->setZ(z);
1524 d->popupItem->setZ(z);
1528void QQuickPopup::resetZ()
1536
1537
1538
1539
1540qreal QQuickPopup::width()
const
1542 Q_D(
const QQuickPopup);
1543 return d->popupItem->width();
1546void QQuickPopup::setWidth(qreal width)
1557 d->popupWindow->setWidth(width + d->windowInsets().left() + d->windowInsets().right());
1559 d->popupItem->setWidth(width);
1562void QQuickPopup::resetWidth()
1568 d->hasWidth =
false;
1569 d->popupItem->resetWidth();
1570 if (d->popupItem->isVisible())
1575
1576
1577
1578
1579qreal QQuickPopup::height()
const
1581 Q_D(
const QQuickPopup);
1582 return d->popupItem->height();
1585void QQuickPopup::setHeight(qreal height)
1588 d->hasHeight =
true;
1596 d->popupWindow->setHeight(height + d->windowInsets().top() + d->windowInsets().bottom());
1598 d->popupItem->setHeight(height);
1601void QQuickPopup::resetHeight()
1607 d->hasHeight =
false;
1608 d->popupItem->resetHeight();
1609 if (d->popupItem->isVisible())
1614
1615
1616
1617
1618qreal QQuickPopup::implicitWidth()
const
1620 Q_D(
const QQuickPopup);
1621 return d->popupItem->implicitWidth();
1624void QQuickPopup::setImplicitWidth(qreal width)
1627 d->popupItem->setImplicitWidth(width);
1631
1632
1633
1634
1635qreal QQuickPopup::implicitHeight()
const
1637 Q_D(
const QQuickPopup);
1638 return d->popupItem->implicitHeight();
1641void QQuickPopup::setImplicitHeight(qreal height)
1644 d->popupItem->setImplicitHeight(height);
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657qreal QQuickPopup::contentWidth()
const
1659 Q_D(
const QQuickPopup);
1660 return d->popupItem->contentWidth();
1663void QQuickPopup::setContentWidth(qreal width)
1666 d->popupItem->setContentWidth(width);
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679qreal QQuickPopup::contentHeight()
const
1681 Q_D(
const QQuickPopup);
1682 return d->popupItem->contentHeight();
1685void QQuickPopup::setContentHeight(qreal height)
1688 d->popupItem->setContentHeight(height);
1692
1693
1694
1695
1696
1697
1698
1699
1700qreal QQuickPopup::availableWidth()
const
1702 Q_D(
const QQuickPopup);
1703 return d->popupItem->availableWidth();
1707
1708
1709
1710
1711
1712
1713
1714
1715qreal QQuickPopup::availableHeight()
const
1717 Q_D(
const QQuickPopup);
1718 return d->popupItem->availableHeight();
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733qreal QQuickPopup::spacing()
const
1735 Q_D(
const QQuickPopup);
1736 return d->popupItem->spacing();
1739void QQuickPopup::setSpacing(qreal spacing)
1742 d->popupItem->setSpacing(spacing);
1745void QQuickPopup::resetSpacing()
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761qreal QQuickPopup::margins()
const
1763 Q_D(
const QQuickPopup);
1767void QQuickPopup::setMargins(qreal margins)
1770 if (qFuzzyCompare(d->margins, margins))
1772 QMarginsF oldMargins(leftMargin(), topMargin(), rightMargin(), bottomMargin());
1773 d->margins = margins;
1774 emit marginsChanged();
1775 QMarginsF newMargins(leftMargin(), topMargin(), rightMargin(), bottomMargin());
1776 if (!qFuzzyCompare(newMargins.top(), oldMargins.top()))
1777 emit topMarginChanged();
1778 if (!qFuzzyCompare(newMargins.left(), oldMargins.left()))
1779 emit leftMarginChanged();
1780 if (!qFuzzyCompare(newMargins.right(), oldMargins.right()))
1781 emit rightMarginChanged();
1782 if (!qFuzzyCompare(newMargins.bottom(), oldMargins.bottom()))
1783 emit bottomMarginChanged();
1784 marginsChange(newMargins, oldMargins);
1787void QQuickPopup::resetMargins()
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803qreal QQuickPopup::topMargin()
const
1805 Q_D(
const QQuickPopup);
1806 if (d->hasTopMargin)
1807 return d->topMargin;
1811void QQuickPopup::setTopMargin(qreal margin)
1814 d->setTopMargin(margin);
1817void QQuickPopup::resetTopMargin()
1820 d->setTopMargin(-1,
true);
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834qreal QQuickPopup::leftMargin()
const
1836 Q_D(
const QQuickPopup);
1837 if (d->hasLeftMargin)
1838 return d->leftMargin;
1842void QQuickPopup::setLeftMargin(qreal margin)
1845 d->setLeftMargin(margin);
1848void QQuickPopup::resetLeftMargin()
1851 d->setLeftMargin(-1,
true);
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865qreal QQuickPopup::rightMargin()
const
1867 Q_D(
const QQuickPopup);
1868 if (d->hasRightMargin)
1869 return d->rightMargin;
1873void QQuickPopup::setRightMargin(qreal margin)
1876 d->setRightMargin(margin);
1879void QQuickPopup::resetRightMargin()
1882 d->setRightMargin(-1,
true);
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896qreal QQuickPopup::bottomMargin()
const
1898 Q_D(
const QQuickPopup);
1899 if (d->hasBottomMargin)
1900 return d->bottomMargin;
1904void QQuickPopup::setBottomMargin(qreal margin)
1907 d->setBottomMargin(margin);
1910void QQuickPopup::resetBottomMargin()
1913 d->setBottomMargin(-1,
true);
1917
1918
1919
1920
1921
1922
1923
1924
1925qreal QQuickPopup::padding()
const
1927 Q_D(
const QQuickPopup);
1928 return d->popupItem->padding();
1931void QQuickPopup::setPadding(qreal padding)
1934 d->popupItem->setPadding(padding);
1937void QQuickPopup::resetPadding()
1940 d->popupItem->resetPadding();
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953qreal QQuickPopup::topPadding()
const
1955 Q_D(
const QQuickPopup);
1956 return d->popupItem->topPadding();
1959void QQuickPopup::setTopPadding(qreal padding)
1962 d->popupItem->setTopPadding(padding);
1965void QQuickPopup::resetTopPadding()
1968 d->popupItem->resetTopPadding();
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981qreal QQuickPopup::leftPadding()
const
1983 Q_D(
const QQuickPopup);
1984 return d->popupItem->leftPadding();
1987void QQuickPopup::setLeftPadding(qreal padding)
1990 d->popupItem->setLeftPadding(padding);
1993void QQuickPopup::resetLeftPadding()
1996 d->popupItem->resetLeftPadding();
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009qreal QQuickPopup::rightPadding()
const
2011 Q_D(
const QQuickPopup);
2012 return d->popupItem->rightPadding();
2015void QQuickPopup::setRightPadding(qreal padding)
2018 d->popupItem->setRightPadding(padding);
2021void QQuickPopup::resetRightPadding()
2024 d->popupItem->resetRightPadding();
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037qreal QQuickPopup::bottomPadding()
const
2039 Q_D(
const QQuickPopup);
2040 return d->popupItem->bottomPadding();
2043void QQuickPopup::setBottomPadding(qreal padding)
2046 d->popupItem->setBottomPadding(padding);
2049void QQuickPopup::resetBottomPadding()
2052 d->popupItem->resetBottomPadding();
2056
2057
2058
2059
2060
2061
2062QLocale QQuickPopup::locale()
const
2064 Q_D(
const QQuickPopup);
2065 return d->popupItem->locale();
2068void QQuickPopup::setLocale(
const QLocale &locale)
2071 d->popupItem->setLocale(locale);
2074void QQuickPopup::resetLocale()
2077 d->popupItem->resetLocale();
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093bool QQuickPopup::isMirrored()
const
2095 Q_D(
const QQuickPopup);
2096 return d->popupItem->isMirrored();
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126QFont QQuickPopup::font()
const
2128 Q_D(
const QQuickPopup);
2129 return d->popupItem->font();
2132void QQuickPopup::setFont(
const QFont &font)
2135 d->popupItem->setFont(font);
2138void QQuickPopup::resetFont()
2141 d->popupItem->resetFont();
2144QQuickWindow *QQuickPopup::window()
const
2146 Q_D(
const QQuickPopup);
2150QQuickItem *QQuickPopup::popupItem()
const
2152 Q_D(
const QQuickPopup);
2153 return d->popupItem;
2157
2158
2159
2160
2161QQuickItem *QQuickPopup::parentItem()
const
2163 Q_D(
const QQuickPopup);
2164 return d->parentItem;
2167void QQuickPopup::setParentItem(QQuickItem *parent)
2170 if (d->parentItem == parent)
2173 if (d->parentItem) {
2174 QObjectPrivate::disconnect(d->parentItem, &QQuickItem::windowChanged, d, &QQuickPopupPrivate::setWindow);
2175 QQuickItemPrivate::get(d->parentItem)->removeItemChangeListener(d, QQuickItemPrivate::Destroyed);
2177 d->parentItem = parent;
2178 QQuickPopupPositioner *positioner = d->getPositioner();
2179 if (positioner->parentItem())
2180 positioner->setParentItem(parent);
2182 QObjectPrivate::connect(parent, &QQuickItem::windowChanged, d, &QQuickPopupPrivate::setWindow);
2183 QQuickItemPrivate::get(d->parentItem)->addItemChangeListener(d, QQuickItemPrivate::Destroyed);
2184 }
else if (d->inDestructor) {
2188 if (!d->window && d->transitionManager.isRunning()) {
2189 if (d->transitionState == QQuickPopupPrivate::EnterTransition)
2190 d->finalizeEnterTransition();
2191 else if (d->transitionState == QQuickPopupPrivate::ExitTransition)
2192 d->finalizeExitTransition();
2198 d->setWindow(parent ? parent->window() :
nullptr);
2199 emit parentChanged();
2202void QQuickPopup::resetParentItem()
2204 if (QQuickWindow *window = qobject_cast<QQuickWindow *>(parent()))
2205 setParentItem(window->contentItem());
2207 setParentItem(findParentItem());
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227QQuickItem *QQuickPopup::background()
const
2229 Q_D(
const QQuickPopup);
2230 return d->popupItem->background();
2233void QQuickPopup::setBackground(QQuickItem *background)
2238 QQuickControlPrivate::warnIfCustomizationNotSupported(
this, background, QStringLiteral(
"background"));
2239 d->popupItem->setBackground(background);
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262QQuickItem *QQuickPopup::contentItem()
const
2264 Q_D(
const QQuickPopup);
2265 return d->popupItem->contentItem();
2268void QQuickPopup::setContentItem(QQuickItem *item)
2272 QQuickControlPrivate::warnIfCustomizationNotSupported(
this, item, QStringLiteral(
"contentItem"));
2273 QQuickItem *oldContentItem = d->complete ? d->popupItem->d_func()->contentItem.data()
2276 disconnect(oldContentItem, &QQuickItem::childrenChanged,
this, &QQuickPopup::contentChildrenChanged);
2277 d->popupItem->setContentItem(item);
2279 QQuickItem *newContentItem = d->popupItem->d_func()->contentItem.data();
2280 connect(newContentItem, &QQuickItem::childrenChanged,
this, &QQuickPopup::contentChildrenChanged);
2281 if (oldContentItem != newContentItem)
2282 emit contentChildrenChanged();
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300QQmlListProperty<QObject> QQuickPopupPrivate::contentData()
2302 QQuickControlPrivate *p = QQuickControlPrivate::get(popupItem);
2303 if (!p->contentItem)
2304 p->executeContentItem();
2305 return QQmlListProperty<QObject>(popupItem->contentItem(),
nullptr,
2306 QQuickItemPrivate::data_append,
2307 QQuickItemPrivate::data_count,
2308 QQuickItemPrivate::data_at,
2309 QQuickItemPrivate::data_clear);
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325QQmlListProperty<QQuickItem> QQuickPopupPrivate::contentChildren()
2327 return QQmlListProperty<QQuickItem>(popupItem->contentItem(),
nullptr,
2328 QQuickItemPrivate::children_append,
2329 QQuickItemPrivate::children_count,
2330 QQuickItemPrivate::children_at,
2331 QQuickItemPrivate::children_clear);
2335
2336
2337
2338
2339
2340bool QQuickPopup::clip()
const
2342 Q_D(
const QQuickPopup);
2343 return d->popupItem->clip() && !d->usePopupWindow();
2346void QQuickPopup::setClip(
bool clip)
2349 if (clip == d->popupItem->clip() || d->usePopupWindow())
2351 d->popupItem->setClip(clip);
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367bool QQuickPopup::hasFocus()
const
2369 Q_D(
const QQuickPopup);
2373void QQuickPopup::setFocus(
bool focus)
2376 if (d->focus == focus)
2379 emit focusChanged();
2383
2384
2385
2386
2387
2388
2389
2390bool QQuickPopup::hasActiveFocus()
const
2392 Q_D(
const QQuickPopup);
2393 return d->popupItem->hasActiveFocus();
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417bool QQuickPopup::isModal()
const
2419 Q_D(
const QQuickPopup);
2423void QQuickPopup::setModal(
bool modal)
2426 if (d->modal == modal)
2429 d->popupWindowDirty =
true;
2430 if (d->complete && d->visible)
2432 emit modalChanged();
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450bool QQuickPopup::dim()
const
2452 Q_D(
const QQuickPopup);
2456void QQuickPopup::setDim(
bool dim)
2465 if (d->complete && d->visible)
2470void QQuickPopup::resetDim()
2481
2482
2483
2484
2485
2486
2487bool QQuickPopup::isVisible()
const
2489 Q_D(
const QQuickPopup);
2490 return d->visible && d->popupItem->isVisible();
2493void QQuickPopup::setVisible(
bool visible)
2499 if (d->visible && visible && d->transitionState != QQuickPopupPrivate::ExitTransition)
2502 if (!d->visible && !visible)
2505 if (!d->complete || (visible && !d->window)) {
2506 d->visible = visible;
2510 if (visible && !parentItem()) {
2511 qmlWarning(
this) <<
"cannot show popup: parent is null";
2516 d->transitionManager.transitionEnter();
2518 d->transitionManager.transitionExit();
2522
2523
2524
2525
2526
2527
2528
2529bool QQuickPopup::isEnabled()
const
2531 Q_D(
const QQuickPopup);
2532 return d->popupItem->isEnabled();
2535void QQuickPopup::setEnabled(
bool enabled)
2538 d->popupItem->setEnabled(enabled);
2542
2543
2544
2545
2546
2547
2548
2549
2550bool QQuickPopup::isOpened()
const
2552 Q_D(
const QQuickPopup);
2553 return d->transitionState == QQuickPopupPrivate::NoTransition && isVisible();
2557
2558
2559
2560
2561
2562
2563
2564qreal QQuickPopup::opacity()
const
2566 Q_D(
const QQuickPopup);
2567 return d->popupItem->opacity();
2570void QQuickPopup::setOpacity(qreal opacity)
2573 d->popupItem->setOpacity(opacity);
2577
2578
2579
2580
2581
2582
2583
2584
2585qreal QQuickPopup::scale()
const
2587 Q_D(
const QQuickPopup);
2588 return d->popupItem->scale();
2591void QQuickPopup::setScale(qreal scale)
2594 if (qFuzzyCompare(scale, d->popupItem->scale()))
2596 d->popupItem->setScale(scale);
2597 emit scaleChanged();
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626QQuickPopup::ClosePolicy QQuickPopup::closePolicy()
const
2628 Q_D(
const QQuickPopup);
2629 return d->closePolicy;
2632void QQuickPopup::setClosePolicy(ClosePolicy policy)
2635 d->hasClosePolicy =
true;
2636 if (d->closePolicy == policy)
2638 d->closePolicy = policy;
2639 emit closePolicyChanged();
2642void QQuickPopup::resetClosePolicy()
2645 setClosePolicy(QQuickPopupPrivate::DefaultClosePolicy);
2646 d->hasClosePolicy =
false;
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662QQuickPopup::TransformOrigin QQuickPopup::transformOrigin()
const
2664 Q_D(
const QQuickPopup);
2665 return static_cast<TransformOrigin>(d->popupItem->transformOrigin());
2668void QQuickPopup::setTransformOrigin(TransformOrigin origin)
2671 d->popupItem->setTransformOrigin(
static_cast<QQuickItem::TransformOrigin>(origin));
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692QQuickTransition *QQuickPopup::enter()
const
2694 Q_D(
const QQuickPopup);
2698void QQuickPopup::setEnter(QQuickTransition *transition)
2701 if (d->enter == transition)
2703 d->enter = transition;
2704 emit enterChanged();
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725QQuickTransition *QQuickPopup::exit()
const
2727 Q_D(
const QQuickPopup);
2731void QQuickPopup::setExit(QQuickTransition *transition)
2734 if (d->exit == transition)
2736 d->exit = transition;
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751qreal QQuickPopup::horizontalPadding()
const
2753 Q_D(
const QQuickPopup);
2754 return d->popupItem->horizontalPadding();
2757void QQuickPopup::setHorizontalPadding(qreal padding)
2760 d->popupItem->setHorizontalPadding(padding);
2763void QQuickPopup::resetHorizontalPadding()
2766 d->popupItem->resetHorizontalPadding();
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780qreal QQuickPopup::verticalPadding()
const
2782 Q_D(
const QQuickPopup);
2783 return d->popupItem->verticalPadding();
2786void QQuickPopup::setVerticalPadding(qreal padding)
2789 d->popupItem->setVerticalPadding(padding);
2792void QQuickPopup::resetVerticalPadding()
2795 d->popupItem->resetVerticalPadding();
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809qreal QQuickPopup::implicitContentWidth()
const
2811 Q_D(
const QQuickPopup);
2812 return d->popupItem->implicitContentWidth();
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826qreal QQuickPopup::implicitContentHeight()
const
2828 Q_D(
const QQuickPopup);
2829 return d->popupItem->implicitContentHeight();
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843qreal QQuickPopup::implicitBackgroundWidth()
const
2845 Q_D(
const QQuickPopup);
2846 return d->popupItem->implicitBackgroundWidth();
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860qreal QQuickPopup::implicitBackgroundHeight()
const
2862 Q_D(
const QQuickPopup);
2863 return d->popupItem->implicitBackgroundHeight();
2867
2868
2869
2870
2871
2872
2873
2874qreal QQuickPopup::topInset()
const
2876 Q_D(
const QQuickPopup);
2877 return d->popupItem->topInset();
2880void QQuickPopup::setTopInset(qreal inset)
2883 d->popupItem->setTopInset(inset);
2886void QQuickPopup::resetTopInset()
2889 d->popupItem->resetTopInset();
2893
2894
2895
2896
2897
2898
2899
2900qreal QQuickPopup::leftInset()
const
2902 Q_D(
const QQuickPopup);
2903 return d->popupItem->leftInset();
2906void QQuickPopup::setLeftInset(qreal inset)
2909 d->popupItem->setLeftInset(inset);
2912void QQuickPopup::resetLeftInset()
2915 d->popupItem->resetLeftInset();
2919
2920
2921
2922
2923
2924
2925
2926qreal QQuickPopup::rightInset()
const
2928 Q_D(
const QQuickPopup);
2929 return d->popupItem->rightInset();
2932void QQuickPopup::setRightInset(qreal inset)
2935 d->popupItem->setRightInset(inset);
2938void QQuickPopup::resetRightInset()
2941 d->popupItem->resetRightInset();
2945
2946
2947
2948
2949
2950
2951
2952qreal QQuickPopup::bottomInset()
const
2954 Q_D(
const QQuickPopup);
2955 return d->popupItem->bottomInset();
2958void QQuickPopup::setBottomInset(qreal inset)
2961 d->popupItem->setBottomInset(inset);
2964void QQuickPopup::resetBottomInset()
2967 d->popupItem->resetBottomInset();
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
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014QQuickPopup::PopupType QQuickPopup::popupType()
const
3016 Q_D(
const QQuickPopup);
3017 return d->popupType;
3020void QQuickPopup::setPopupType(PopupType popupType)
3023 if (d->popupType == popupType)
3026 d->popupType = popupType;
3028 emit popupTypeChanged();
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3061bool QQuickPopup::filtersChildMouseEvents()
const
3063 Q_D(
const QQuickPopup);
3064 return d->popupItem->filtersChildMouseEvents();
3067void QQuickPopup::setFiltersChildMouseEvents(
bool filter)
3070 d->popupItem->setFiltersChildMouseEvents(filter);
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083void QQuickPopup::forceActiveFocus(Qt::FocusReason reason)
3086 d->popupItem->forceActiveFocus(reason);
3089void QQuickPopup::classBegin()
3092 d->complete =
false;
3093 QQmlContext *context = qmlContext(
this);
3095 QQmlEngine::setContextForObject(d->popupItem, context);
3096 d->popupItem->classBegin();
3099void QQuickPopup::componentComplete()
3102 qCDebug(lcQuickPopup) <<
"componentComplete" <<
this;
3106 if (d->visible && d->window)
3107 d->transitionManager.transitionEnter();
3110 d->popupItem->setObjectName(QQmlMetaType::prettyTypeName(
this));
3111 d->popupItem->componentComplete();
3113 if (
auto currentContentItem = d->popupItem->d_func()->contentItem.data()) {
3114 connect(currentContentItem, &QQuickItem::childrenChanged,
3115 this, &QQuickPopup::contentChildrenChanged);
3119bool QQuickPopup::isComponentComplete()
const
3121 Q_D(
const QQuickPopup);
3125bool QQuickPopup::childMouseEventFilter(QQuickItem *child, QEvent *event)
3132void QQuickPopup::focusInEvent(QFocusEvent *event)
3137void QQuickPopup::focusOutEvent(QFocusEvent *event)
3142void QQuickPopup::keyPressEvent(QKeyEvent *event)
3145 if (!hasActiveFocus())
3148#if QT_CONFIG(shortcut)
3149 if (d->closePolicy.testFlag(QQuickPopup::CloseOnEscape)
3150 && (event->matches(QKeySequence::Cancel)
3151#if defined(Q_OS_ANDROID)
3152 || event->key() == Qt::Key_Back
3162 if (hasActiveFocus() && (event->key() == Qt::Key_Tab || event->key() == Qt::Key_Backtab)) {
3164 QQuickItemPrivate::focusNextPrev(d->popupItem, event->key() == Qt::Key_Tab);
3168void QQuickPopup::keyReleaseEvent(QKeyEvent *event)
3173void QQuickPopup::mousePressEvent(QMouseEvent *event)
3176 event->setAccepted(d->handleMouseEvent(d->popupItem, event));
3179void QQuickPopup::mouseMoveEvent(QMouseEvent *event)
3182 event->setAccepted(d->handleMouseEvent(d->popupItem, event));
3185void QQuickPopup::mouseReleaseEvent(QMouseEvent *event)
3188 event->setAccepted(d->handleMouseEvent(d->popupItem, event));
3191void QQuickPopup::mouseDoubleClickEvent(QMouseEvent *event)
3196void QQuickPopup::mouseUngrabEvent()
3205 QQuickItem *sourceAncestor = source;
3206 while (sourceAncestor) {
3207 QQuickItem *parentItem = sourceAncestor->parentItem();
3208 if (parentItem == overlay)
3209 return sourceAncestor;
3210 sourceAncestor = parentItem;
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228bool QQuickPopup::overlayEvent(QQuickItem *item, QEvent *event)
3235 auto *overlay = QQuickOverlay::overlay(d->window, d->parentItem);
3237 const QList<QQuickItem *> paintOrderChildItems = QQuickOverlayPrivate::get(overlay)->paintOrderChildItems();
3238 const qsizetype targetItemPaintOrderIndex = paintOrderChildItems.indexOf(findRootOfOverlaySubtree(item, overlay));
3239 const qsizetype popupItemPaintOrderIndex = paintOrderChildItems.indexOf(d->popupItem);
3240 if (targetItemPaintOrderIndex > popupItemPaintOrderIndex)
3243 switch (event->type()) {
3244 case QEvent::KeyPress:
3245 case QEvent::KeyRelease:
3246 case QEvent::MouseMove:
3252#if QT_CONFIG(quicktemplates2_multitouch)
3253 case QEvent::TouchBegin:
3254 case QEvent::TouchUpdate:
3255 case QEvent::TouchEnd:
3256 return d->handleTouchEvent(item,
static_cast<QTouchEvent *>(event));
3258 case QEvent::HoverEnter:
3259 case QEvent::HoverMove:
3260 case QEvent::HoverLeave:
3261 return d->handleHoverEvent(item,
static_cast<QHoverEvent *>(event));
3263 case QEvent::MouseButtonPress:
3264 case QEvent::MouseButtonRelease:
3265 return d->handleMouseEvent(item,
static_cast<QMouseEvent *>(event));
3272#if QT_CONFIG(quicktemplates2_multitouch)
3273void QQuickPopup::touchEvent(QTouchEvent *event)
3276 event->setAccepted(d->handleTouchEvent(d->popupItem, event));
3279void QQuickPopup::touchUngrabEvent()
3286#if QT_CONFIG(wheelevent)
3287void QQuickPopup::wheelEvent(QWheelEvent *event)
3293void QQuickPopup::contentItemChange(QQuickItem *newItem, QQuickItem *oldItem)
3299void QQuickPopup::contentSizeChange(
const QSizeF &newSize,
const QSizeF &oldSize)
3301 qCDebug(lcQuickPopup) <<
"contentSizeChange called on" <<
this <<
"with newSize" << newSize <<
"oldSize" << oldSize;
3302 if (!qFuzzyCompare(newSize.width(), oldSize.width()))
3303 emit contentWidthChanged();
3304 if (!qFuzzyCompare(newSize.height(), oldSize.height()))
3305 emit contentHeightChanged();
3308void QQuickPopup::fontChange(
const QFont &newFont,
const QFont &oldFont)
3315void QQuickPopup::geometryChange(
const QRectF &newGeometry,
const QRectF &oldGeometry)
3318 qCDebug(lcQuickPopup) <<
"geometryChange called on" <<
this <<
"with newGeometry" << newGeometry <<
"oldGeometry" << oldGeometry;
3319 if (!d->usePopupWindow())
3321 if (!qFuzzyCompare(newGeometry.width(), oldGeometry.width())) {
3322 emit widthChanged();
3323 emit availableWidthChanged();
3325 if (!qFuzzyCompare(newGeometry.height(), oldGeometry.height())) {
3326 emit heightChanged();
3327 emit availableHeightChanged();
3331void QQuickPopup::itemChange(QQuickItem::ItemChange change,
const QQuickItem::ItemChangeData &)
3334 case QQuickItem::ItemActiveFocusHasChanged:
3335 emit activeFocusChanged();
3337 case QQuickItem::ItemOpacityHasChanged:
3338 emit opacityChanged();
3345void QQuickPopup::localeChange(
const QLocale &newLocale,
const QLocale &oldLocale)
3347 Q_UNUSED(newLocale);
3348 Q_UNUSED(oldLocale);
3349 emit localeChanged();
3352void QQuickPopup::marginsChange(
const QMarginsF &newMargins,
const QMarginsF &oldMargins)
3355 Q_UNUSED(newMargins);
3356 Q_UNUSED(oldMargins);
3360void QQuickPopup::paddingChange(
const QMarginsF &newPadding,
const QMarginsF &oldPadding)
3362 const bool tp = !qFuzzyCompare(newPadding.top(), oldPadding.top());
3363 const bool lp = !qFuzzyCompare(newPadding.left(), oldPadding.left());
3364 const bool rp = !qFuzzyCompare(newPadding.right(), oldPadding.right());
3365 const bool bp = !qFuzzyCompare(newPadding.bottom(), oldPadding.bottom());
3368 emit topPaddingChanged();
3370 emit leftPaddingChanged();
3372 emit rightPaddingChanged();
3374 emit bottomPaddingChanged();
3377 emit horizontalPaddingChanged();
3378 emit availableWidthChanged();
3381 emit verticalPaddingChanged();
3382 emit availableHeightChanged();
3386void QQuickPopup::spacingChange(qreal newSpacing, qreal oldSpacing)
3388 Q_UNUSED(newSpacing);
3389 Q_UNUSED(oldSpacing);
3390 emit spacingChanged();
3393void QQuickPopup::insetChange(
const QMarginsF &newInset,
const QMarginsF &oldInset)
3395 if (!qFuzzyCompare(newInset.top(), oldInset.top()))
3396 emit topInsetChanged();
3397 if (!qFuzzyCompare(newInset.left(), oldInset.left()))
3398 emit leftInsetChanged();
3399 if (!qFuzzyCompare(newInset.right(), oldInset.right()))
3400 emit rightInsetChanged();
3401 if (!qFuzzyCompare(newInset.bottom(), oldInset.bottom()))
3402 emit bottomInsetChanged();
3405QFont QQuickPopup::defaultFont()
const
3407 return QQuickTheme::font(QQuickTheme::System);
3410#if QT_CONFIG(accessibility)
3411QAccessible::Role QQuickPopup::effectiveAccessibleRole()
const
3413 auto *attached = qmlAttachedPropertiesObject<QQuickAccessibleAttached>(
this,
false);
3415 auto role = QAccessible::NoRole;
3416 if (
auto *accessibleAttached = qobject_cast<QQuickAccessibleAttached *>(attached))
3417 role = accessibleAttached->role();
3418 if (role == QAccessible::NoRole)
3419 role = accessibleRole();
3424QAccessible::Role QQuickPopup::accessibleRole()
const
3426 return QAccessible::Dialog;
3429void QQuickPopup::accessibilityActiveChanged(
bool active)
3435QString QQuickPopup::accessibleName()
const
3437 Q_D(
const QQuickPopup);
3438 return d->popupItem->accessibleName();
3441void QQuickPopup::maybeSetAccessibleName(
const QString &name)
3444 d->popupItem->maybeSetAccessibleName(name);
3447QVariant QQuickPopup::accessibleProperty(
const char *propertyName)
3449 Q_D(
const QQuickPopup);
3450 return d->popupItem->accessibleProperty(propertyName);
3453bool QQuickPopup::setAccessibleProperty(
const char *propertyName,
const QVariant &value)
3456 return d->popupItem->setAccessibleProperty(propertyName, value);
3459void QQuickPopup::setWindowModality(
const Qt::WindowModality modality)
3462 d->popupWndModality = modality;
3465QQuickItem *QQuickPopup::safeAreaAttachmentItem()
3470QQuickItem *QQuickPopup::attacheeItem()
const
3475QtPrivate::QQuickAttachedPropertyPropagator *QQuickPopup::attachedParent(
3476 const QMetaObject *ourAttachedType)
const
3478 auto *popupWindow = popupItem()->window();
3479 qCDebug(lcAttachedPropertyPropagator).noquote() <<
"- attachee is a popup; checking its window"
3481 auto *object = QtPrivate::QQuickAttachedPropertyPropagator::attachedObject(
3482 ourAttachedType, popupWindow);
3486 if (qobject_cast<QQuickPopupWindow *>(popupWindow)) {
3487 qCDebug(lcAttachedPropertyPropagator).noquote() <<
"- checking its window's transientParent"
3488 << popupWindow->transientParent();
3489 return QtPrivate::QQuickAttachedPropertyPropagator::attachedObject(ourAttachedType,
3490 popupWindow->transientParent());
3498#include "moc_qquickpopup_p.cpp"
Combined button and popup list for selecting options.