14#if QT_CONFIG(quicktemplates2_container)
15#include "qquickdialog_p.h"
18#include <QtCore/qloggingcategory.h>
19#include <QtQml/qqmlinfo.h>
20#include <QtQuick/qquickitem.h>
21#include <QtQuick/private/qquickaccessibleattached_p.h>
22#include <QtQuick/private/qquickattachedpropertypropagator_p.h>
23#include <QtQuick/private/qquicktransition_p.h>
24#include <QtQuick/private/qquickitem_p.h>
25#include <qpa/qplatformintegration.h>
26#include <private/qguiapplication_p.h>
30Q_STATIC_LOGGING_CATEGORY(lcDimmer,
"qt.quick.controls.popup.dimmer")
31Q_STATIC_LOGGING_CATEGORY(lcQuickPopup,
"qt.quick.controls.popup")
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
457
458
459
460
461
462
465
466
467
468
469
470
473
474
475
476
477
478
481
482
483
484
485
486
488QQuickItem *QQuickPopup::findParentItem()
const
490 QObject *obj = parent();
492 QQuickItem *item = qobject_cast<QQuickItem *>(obj);
500const QQuickPopup::ClosePolicy QQuickPopupPrivate::DefaultClosePolicy = QQuickPopup::CloseOnEscape | QQuickPopup::CloseOnPressOutside;
502QQuickPopupPrivate::QQuickPopupPrivate()
503 : transitionManager(
this)
507void QQuickPopupPrivate::init()
510 popupItem =
new QQuickPopupItem(q);
511 popupItem->setVisible(
false);
512 QObject::connect(popupItem, &QQuickControl::paddingChanged, q, &QQuickPopup::paddingChanged);
513 QObject::connect(popupItem, &QQuickControl::backgroundChanged, q, &QQuickPopup::backgroundChanged);
514 QObject::connect(popupItem, &QQuickControl::contentItemChanged, q, &QQuickPopup::contentItemChanged);
515 QObject::connect(popupItem, &QQuickControl::implicitContentWidthChanged, q, &QQuickPopup::implicitContentWidthChanged);
516 QObject::connect(popupItem, &QQuickControl::implicitContentHeightChanged, q, &QQuickPopup::implicitContentHeightChanged);
517 QObject::connect(popupItem, &QQuickControl::implicitBackgroundWidthChanged, q, &QQuickPopup::implicitBackgroundWidthChanged);
518 QObject::connect(popupItem, &QQuickControl::implicitBackgroundHeightChanged, q, &QQuickPopup::implicitBackgroundHeightChanged);
521void QQuickPopupPrivate::closeOrReject()
524#if QT_CONFIG(quicktemplates2_container)
525 if (QQuickDialog *dialog = qobject_cast<QQuickDialog*>(q))
533bool QQuickPopupPrivate::tryClose(
const QPointF &pos, QQuickPopup::ClosePolicy flags)
538 static const QQuickPopup::ClosePolicy outsideFlags = QQuickPopup::CloseOnPressOutside | QQuickPopup::CloseOnReleaseOutside;
539 static const QQuickPopup::ClosePolicy outsideParentFlags = QQuickPopup::CloseOnPressOutsideParent | QQuickPopup::CloseOnReleaseOutsideParent;
541 const bool onOutside = closePolicy & (flags & outsideFlags);
542 const bool onOutsideParent = closePolicy & (flags & outsideParentFlags);
544 if ((onOutside && outsidePressed) || (onOutsideParent && outsideParentPressed)) {
545 if (!contains(pos) && (!dimmer || dimmer->contains(dimmer->mapFromScene(pos)))) {
546 if (!onOutsideParent || !parentItem || !parentItem->contains(parentItem->mapFromScene(pos))) {
555bool QQuickPopupPrivate::contains(
const QPointF &scenePos)
const
557 return popupItem->contains(popupItem->mapFromScene(scenePos));
560#if QT_CONFIG(quicktemplates2_multitouch)
561bool QQuickPopupPrivate::acceptTouch(
const QTouchEvent::TouchPoint &point)
563 if (point.id() == touchId)
566 if (touchId == -1 && point.state() != QEventPoint::Released) {
567 touchId = point.id();
575bool QQuickPopupPrivate::blockInput(QQuickItem *item,
const QPointF &point)
const
578 if (popupItem->contains(popupItem->mapFromScene(point))
579 && item == QQuickOverlay::overlay(window, parentItem)) {
588 return modal && ((popupItem != item) && !popupItem->isAncestorOf(item)) && (!dimmer || dimmer->contains(dimmer->mapFromScene(point)));
591bool QQuickPopupPrivate::handlePress(QQuickItem *item,
const QPointF &point, ulong timestamp)
595 outsidePressed = !contains(point);
597 if (outsidePressed && parentItem) {
601 const QPointF globalPoint = item->mapToGlobal(point);
602 const QPointF localPoint = parentItem->mapFromGlobal(globalPoint);
603 outsideParentPressed = !parentItem->contains(localPoint);
606 tryClose(point, QQuickPopup::CloseOnPressOutside | QQuickPopup::CloseOnPressOutsideParent);
607 return blockInput(item, point);
610bool QQuickPopupPrivate::handleMove(QQuickItem *item,
const QPointF &point, ulong timestamp)
613 return blockInput(item, point);
616bool QQuickPopupPrivate::handleRelease(QQuickItem *item,
const QPointF &point, ulong timestamp)
619 if (item != popupItem && !contains(pressPoint))
620 tryClose(point, QQuickPopup::CloseOnReleaseOutside | QQuickPopup::CloseOnReleaseOutsideParent);
621 pressPoint = QPointF();
622 outsidePressed =
false;
623 outsideParentPressed =
false;
625 return blockInput(item, point);
628void QQuickPopupPrivate::handleUngrab()
631 QQuickOverlay *overlay = QQuickOverlay::overlay(window, parentItem);
633 QQuickOverlayPrivate *p = QQuickOverlayPrivate::get(overlay);
634 if (p->mouseGrabberPopup == q)
635 p->mouseGrabberPopup =
nullptr;
637 pressPoint = QPointF();
641bool QQuickPopupPrivate::handleMouseEvent(QQuickItem *item, QMouseEvent *event)
643 switch (event->type()) {
644 case QEvent::MouseButtonPress:
645 return handlePress(item, event->scenePosition(), event->timestamp());
646 case QEvent::MouseMove:
647 return handleMove(item, event->scenePosition(), event->timestamp());
648 case QEvent::MouseButtonRelease:
649 return handleRelease(item, event->scenePosition(), event->timestamp());
651 Q_UNREACHABLE_RETURN(
false);
655bool QQuickPopupPrivate::handleHoverEvent(QQuickItem *item, QHoverEvent *event)
657 switch (event->type()) {
658 case QEvent::HoverEnter:
659 case QEvent::HoverMove:
660 case QEvent::HoverLeave:
661 return blockInput(item, event->scenePosition());
663 Q_UNREACHABLE_RETURN(
false);
667QMarginsF QQuickPopupPrivate::windowInsets()
const
672#if QT_CONFIG(wayland)
673 if (QGuiApplication::platformName().startsWith(QLatin1String(
"wayland")))
676 Q_Q(
const QQuickPopup);
687 const auto *popupItemPrivate = QQuickControlPrivate::get(popupItem);
688 if (!usePopupWindow() || (popupItemPrivate->background.isExecuting() && popupItemPrivate->background->clip())) {
696 q->leftInset() < 0 ? -q->leftInset() : 0,
697 q->topInset() < 0 ? -q->topInset() : 0,
698 q->rightInset() < 0 ? -q->rightInset() : 0,
699 q->bottomInset() < 0 ? -q->bottomInset() : 0
703QPointF QQuickPopupPrivate::windowInsetsTopLeft()
const
705 const QMarginsF windowMargins = windowInsets();
706 return {windowMargins.left(), windowMargins.top()};
709void QQuickPopupPrivate::setEffectivePosFromWindowPos(
const QPointF &windowPos)
726 const QPointF oldEffectivePos = effectivePos;
727 effectivePos = windowPos + windowInsetsTopLeft();
728 if (!qFuzzyCompare(oldEffectivePos.x(), effectivePos.x()))
730 if (!qFuzzyCompare(oldEffectivePos.y(), effectivePos.y()))
734#if QT_CONFIG(quicktemplates2_multitouch)
735bool QQuickPopupPrivate::handleTouchEvent(QQuickItem *item, QTouchEvent *event)
737 switch (event->type()) {
738 case QEvent::TouchBegin:
739 case QEvent::TouchUpdate:
740 case QEvent::TouchEnd:
741 for (
const QTouchEvent::TouchPoint &point : event->points()) {
742 if (event->type() != QEvent::TouchEnd && !acceptTouch(point))
743 return blockInput(item, point.position());
745 switch (point.state()) {
746 case QEventPoint::Pressed:
747 return handlePress(item, point.scenePosition(), event->timestamp());
748 case QEventPoint::Updated:
749 return handleMove(item, point.scenePosition(), event->timestamp());
750 case QEventPoint::Released:
751 return handleRelease(item, point.scenePosition(), event->timestamp());
758 case QEvent::TouchCancel:
770bool QQuickPopupPrivate::prepareEnterTransition()
774 qmlWarning(q) <<
"cannot find any window to open popup in.";
778 if (transitionState == EnterTransition && transitionManager.isRunning())
781 if (transitionState != EnterTransition) {
782 const QPointer<QQuickItem> lastActiveFocusItem = window->activeFocusItem();
784 adjustPopupItemParentAndWindow();
788 emit q->aboutToShow();
789 transitionState = EnterTransition;
790 getPositioner()->setParentItem(parentItem);
791 emit q->visibleChanged();
793 if (lastActiveFocusItem) {
794 this->lastActiveFocusItem = lastActiveFocusItem;
795 if (
auto *overlay = QQuickOverlay::overlay(window, parentItem)) {
796 auto *overlayPrivate = QQuickOverlayPrivate::get(overlay);
797 if (overlayPrivate->lastActiveFocusItem.isNull() && !popupItem->isAncestorOf(lastActiveFocusItem)) {
798 overlayPrivate->lastActiveFocusItem = lastActiveFocusItem;
799 overlayPrivate->lastActiveFocusItemPopup = q;
805 popupItem->setFocus(
true, Qt::PopupFocusReason);
810bool QQuickPopupPrivate::prepareExitTransition()
813 if (transitionState == ExitTransition && transitionManager.isRunning())
820 prevScale = popupItem->scale();
821 prevOpacity = popupItem->opacity();
823 if (transitionState != ExitTransition) {
826 if (!hadActiveFocusBeforeExitTransition) {
827 const auto *da = QQuickItemPrivate::get(popupItem)->deliveryAgentPrivate();
828 hadActiveFocusBeforeExitTransition = popupItem->hasActiveFocus() || (da && da->focusTargetItem() == popupItem);
831 popupItem->setFocus(
false, Qt::PopupFocusReason);
832 transitionState = ExitTransition;
834 emit q->aboutToHide();
835 emit q->openedChanged();
840void QQuickPopupPrivate::finalizeEnterTransition()
843 transitionState = NoTransition;
845 emit q->openedChanged();
849void QQuickPopupPrivate::finalizeExitTransition()
852 getPositioner()->setParentItem(
nullptr);
854 popupItem->setParentItem(
nullptr);
855 popupItem->setVisible(
false);
859 if (
auto *overlay = QQuickOverlay::overlay(window, parentItem)) {
860 auto *overlayPrivate = QQuickOverlayPrivate::get(overlay);
861 const auto stackingOrderPopups = overlayPrivate->stackingOrderPopups();
863 bool resetLastActiveFocusItem = (overlayPrivate->lastActiveFocusItemPopup == q);
864 if (resetLastActiveFocusItem) {
866
867
868
869
870
871
872
873 for (
auto popup : stackingOrderPopups) {
874 if (QQuickPopupPrivate::get(popup)->transitionState != ExitTransition) {
875 if (
auto savedFocusItem = QQuickPopupPrivate::get(popup)->lastActiveFocusItem) {
876 if (!qobject_cast<QQuickRootItem *>(savedFocusItem) && savedFocusItem != popupItem
877 && !popupItem->isAncestorOf(savedFocusItem)) {
878 overlayPrivate->lastActiveFocusItem = savedFocusItem;
880 overlayPrivate->lastActiveFocusItemPopup = popup;
881 resetLastActiveFocusItem =
false;
889 if (hadActiveFocusBeforeExitTransition) {
890 QQuickPopup *nextFocusPopup =
nullptr;
891 for (
auto popup : stackingOrderPopups) {
893 if (QQuickPopupPrivate::get(popup)->transitionState != ExitTransition
894 && popup->hasFocus() && !popup->hasActiveFocus()) {
895 nextFocusPopup = popup;
899 if (nextFocusPopup) {
900 nextFocusPopup->forceActiveFocus(Qt::PopupFocusReason);
902 auto *appWindow = qobject_cast<QQuickApplicationWindow*>(window);
903 auto *contentItem = appWindow ? appWindow->contentItem() : window->contentItem();
904 if (!contentItem->scopedFocusItem()
905 && !overlayPrivate->lastActiveFocusItem.isNull()) {
908 overlayPrivate->lastActiveFocusItem->forceActiveFocus(Qt::OtherFocusReason);
910 contentItem->setFocus(
true, Qt::PopupFocusReason);
916 if (resetLastActiveFocusItem || stackingOrderPopups.isEmpty()) {
917 overlayPrivate->lastActiveFocusItem =
nullptr;
918 overlayPrivate->lastActiveFocusItemPopup =
nullptr;
923 adjustPopupItemParentAndWindow();
924 transitionState = NoTransition;
925 hadActiveFocusBeforeExitTransition =
false;
926 lastActiveFocusItem =
nullptr;
927 emit q->visibleChanged();
929#if QT_CONFIG(accessibility)
930 const auto type = q->effectiveAccessibleRole() == QAccessible::PopupMenu
931 ? QAccessible::PopupMenuEnd
932 : QAccessible::DialogEnd;
933 QAccessibleEvent ev(q->popupItem(), type);
934 QAccessible::updateAccessibility(&ev);
937 popupItem->setScale(prevScale);
938 popupItem->setOpacity(prevOpacity);
942void QQuickPopupPrivate::opened()
946#if QT_CONFIG(accessibility)
947 const auto type = q->effectiveAccessibleRole() == QAccessible::PopupMenu
948 ? QAccessible::PopupMenuStart
949 : QAccessible::DialogStart;
950 QAccessibleEvent ev(q->popupItem(), type);
951 QAccessible::updateAccessibility(&ev);
955Qt::WindowFlags QQuickPopupPrivate::popupWindowFlags()
const
960void QQuickPopupPrivate::setPopupWindowFlags(Qt::WindowFlags flags)
965QMarginsF QQuickPopupPrivate::getMargins()
const
967 Q_Q(
const QQuickPopup);
968 return QMarginsF(q->leftMargin(), q->topMargin(), q->rightMargin(), q->bottomMargin());
971void QQuickPopupPrivate::setTopMargin(qreal value,
bool reset)
974 qreal oldMargin = q->topMargin();
976 hasTopMargin = !reset;
977 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
978 emit q->topMarginChanged();
979 q->marginsChange(QMarginsF(leftMargin, topMargin, rightMargin, bottomMargin),
980 QMarginsF(leftMargin, oldMargin, rightMargin, bottomMargin));
984void QQuickPopupPrivate::setLeftMargin(qreal value,
bool reset)
987 qreal oldMargin = q->leftMargin();
989 hasLeftMargin = !reset;
990 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
991 emit q->leftMarginChanged();
992 q->marginsChange(QMarginsF(leftMargin, topMargin, rightMargin, bottomMargin),
993 QMarginsF(oldMargin, topMargin, rightMargin, bottomMargin));
997void QQuickPopupPrivate::setRightMargin(qreal value,
bool reset)
1000 qreal oldMargin = q->rightMargin();
1001 rightMargin = value;
1002 hasRightMargin = !reset;
1003 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
1004 emit q->rightMarginChanged();
1005 q->marginsChange(QMarginsF(leftMargin, topMargin, rightMargin, bottomMargin),
1006 QMarginsF(leftMargin, topMargin, oldMargin, bottomMargin));
1010void QQuickPopupPrivate::setBottomMargin(qreal value,
bool reset)
1013 qreal oldMargin = q->bottomMargin();
1014 bottomMargin = value;
1015 hasBottomMargin = !reset;
1016 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
1017 emit q->bottomMarginChanged();
1018 q->marginsChange(QMarginsF(leftMargin, topMargin, rightMargin, bottomMargin),
1019 QMarginsF(leftMargin, topMargin, rightMargin, oldMargin));
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056QQuickPopupAnchors *QQuickPopupPrivate::getAnchors()
1060 anchors =
new QQuickPopupAnchors(q);
1064QQuickPopupPositioner *QQuickPopupPrivate::getPositioner()
1068 positioner =
new QQuickPopupPositioner(q);
1096 observer->disconnect();
1097 observer->deleteLater();
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1115#if defined(Q_OS_MACOS)
1116 d->transitionManager.transitionEnter();
1118 const auto callPrepareEnterTransition = [d]() {
1119 d->transitionManager.transitionEnter();
1122 if (d->usePopupWindow() && d->window->isVisible() && !d->window->isExposed())
1125 callPrepareEnterTransition();
1129void QQuickPopupPrivate::setWindow(QQuickWindow *newWindow)
1132 if (window == newWindow)
1136 QQuickOverlay *overlay = QQuickOverlay::overlay(window, parentItem);
1138 QQuickOverlayPrivate::get(overlay)->removePopup(q);
1143 if (!newWindow && popupItem)
1144 popupItem->setParentItem(
nullptr);
1150 QQuickOverlay *overlay = QQuickOverlay::overlay(newWindow, parentItem);
1152 QQuickOverlayPrivate::get(overlay)->addPopup(q);
1154 QQuickControlPrivate *p = QQuickControlPrivate::get(popupItem);
1156 if (QQuickApplicationWindow *appWindow = qobject_cast<QQuickApplicationWindow *>(newWindow))
1157 p->updateLocale(appWindow->locale(),
false);
1160 emit q->windowChanged(newWindow);
1162 if (complete && visible && window)
1166void QQuickPopupPrivate::itemDestroyed(QQuickItem *item)
1169 if (item == parentItem)
1170 q->setParentItem(
nullptr);
1173void QQuickPopupPrivate::reposition()
1175 getPositioner()->reposition();
1178QPalette QQuickPopupPrivate::defaultPalette()
const
1180 return QQuickTheme::palette(QQuickTheme::System);
1183QQuickPopup::PopupType QQuickPopupPrivate::resolvedPopupType()
const
1193 if (popupType == QQuickPopup::PopupType::Window
1194 || popupType == QQuickPopup::PopupType::Native) {
1195 if (QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::Capability::MultipleWindows))
1196 return QQuickPopup::PopupType::Window;
1199 return QQuickPopup::PopupType::Item;
1202bool QQuickPopupPrivate::usePopupWindow()
const
1204 return resolvedPopupType() == QQuickPopup::PopupType::Window;
1207void QQuickPopupPrivate::adjustPopupItemParentAndWindow()
1210 QQuickOverlay *overlay = QQuickOverlay::overlay(window, parentItem);
1212 if (visible && popupWindowDirty) {
1213 popupItem->setParentItem(overlay);
1215 popupWindow->deleteLater();
1216 popupWindow =
nullptr;
1218 popupWindowDirty =
false;
1221 if (usePopupWindow()) {
1224 popupWindow =
new QQuickPopupWindow(q, window);
1227 const qreal initialWidth = popupItem->width() + windowInsets().left() + windowInsets().right();
1228 const qreal initialHeight = popupItem->height() + windowInsets().top() + windowInsets().bottom();
1229 popupItem->setParentItem(popupWindow->contentItem());
1230 popupWindow->resize(qCeil(initialWidth), qCeil(initialHeight));
1231 if (popupWndModality != Qt::NonModal)
1232 popupWindow->setModality(popupWndModality);
1234 popupWindow->setModality(modal ? Qt::ApplicationModal : Qt::NonModal);
1235 popupItem->resetTitle();
1236 popupWindow->setTitle(title);
1238 popupItem->setParentItem(popupWindow->contentItem());
1239 popupItem->forceActiveFocus(Qt::PopupFocusReason);
1241 if (popupWindow && popupWindow->transientParent()) {
1242 auto *transientParentPriv = QQuickWindowPrivate::get(qobject_cast<QQuickWindow *>(popupWindow->transientParent()));
1243 if (!transientParentPriv->inDestructor)
1244 popupWindow->setVisible(visible);
1248 popupItem->setParentItem(overlay);
1249 const auto popupStack = QQuickOverlayPrivate::get(overlay)->stackingOrderPopups();
1253 const QQuickPopup *topPopup = popupStack.isEmpty() ?
nullptr : popupStack.first();
1254 const QObject *ancestor = q;
1255 while (ancestor && topPopup) {
1256 if (ancestor == topPopup)
1258 ancestor = ancestor->parent();
1260 if (topPopup && topPopup != q && ancestor) {
1261 QQuickItem *topPopupItem = popupStack.first()->popupItem();
1262 popupItem->stackAfter(topPopupItem);
1266 popupItem->setZ(qMax(topPopupItem->z(), popupItem->z()));
1268 q->setModal((popupWndModality != Qt::NonModal) || modal);
1271 popupItem->setTitle(title);
1273 popupItem->setVisible(visible);
1276QQuickItem *QQuickPopupPrivate::createDimmer(QQmlComponent *component, QQuickPopup *popup, QQuickItem *parent)
const
1278 QQuickItem *item =
nullptr;
1280 QQmlContext *context = component->creationContext();
1282 context = qmlContext(popup);
1283 item = qobject_cast<QQuickItem*>(component->beginCreate(context));
1288 if (!item && popup->isModal())
1289 item =
new QQuickItem;
1292 item->setParentItem(parent);
1293 if (resolvedPopupType() != QQuickPopup::PopupType::Window)
1294 item->stackBefore(popup->popupItem());
1295 item->setZ(popup->z());
1297 qCDebug(lcDimmer) <<
"dimmer" << item <<
"registered with" << parent;
1298 parent->setProperty(
"_q_dimmerItem", QVariant::fromValue<QQuickItem*>(item));
1299 if (popup->isModal()) {
1300 item->setAcceptedMouseButtons(Qt::AllButtons);
1301#if QT_CONFIG(cursor)
1302 item->setCursor(Qt::ArrowCursor);
1304#if QT_CONFIG(quicktemplates2_hover)
1306 item->setAcceptHoverEvents(
true);
1312 component->completeCreate();
1314 qCDebug(lcDimmer) <<
"finished creating dimmer from component" << component
1315 <<
"for popup" << popup <<
"with parent" << parent <<
"- item is:" << item;
1319void QQuickPopupPrivate::createOverlay()
1322 QQuickOverlay *overlay = QQuickOverlay::overlay(window, parentItem);
1326 QQmlComponent *component =
nullptr;
1327 QQuickOverlayAttached *overlayAttached = qobject_cast<QQuickOverlayAttached *>(qmlAttachedPropertiesObject<QQuickOverlay>(q,
false));
1328 if (overlayAttached)
1329 component = modal ? overlayAttached->modal() : overlayAttached->modeless();
1332 component = modal ? overlay->modal() : overlay->modeless();
1335 dimmer = createDimmer(component, q, overlay);
1342 explicitDimmerOpacity = dimmer->opacity();
1344 dimmer->setOpacity(0);
1351void QQuickPopupPrivate::destroyDimmer()
1354 qCDebug(lcDimmer) <<
"destroying dimmer" << dimmer;
1355 if (QObject *dimmerParentItem = dimmer->parentItem()) {
1356 if (dimmerParentItem->property(
"_q_dimmerItem").value<QQuickItem*>() == dimmer)
1357 dimmerParentItem->setProperty(
"_q_dimmerItem", QVariant());
1359 dimmer->setParentItem(
nullptr);
1360 dimmer->deleteLater();
1365void QQuickPopupPrivate::toggleOverlay()
1372void QQuickPopupPrivate::updateContentPalettes(
const QPalette& parentPalette)
1375 if (providesPalette())
1376 inheritPalette(parentPalette);
1378 QQuickItemPrivate::get(popupItem)->updateChildrenPalettes(parentPalette);
1381void QQuickPopupPrivate::updateChildrenPalettes(
const QPalette& parentPalette)
1383 updateContentPalettes(parentPalette);
1386void QQuickPopupPrivate::showDimmer()
1390 QQmlProperty::write(dimmer, QStringLiteral(
"opacity"), explicitDimmerOpacity);
1393void QQuickPopupPrivate::hideDimmer()
1397 QQmlProperty::write(dimmer, QStringLiteral(
"opacity"), 0.0);
1400void QQuickPopupPrivate::resizeDimmer()
1405 const QQuickOverlay *overlay = QQuickOverlay::overlay(window, parentItem);
1407 qreal w = overlay ? overlay->width() : 0;
1408 qreal h = overlay ? overlay->height() : 0;
1409 dimmer->setSize(QSizeF(w, h));
1412QQuickPopupTransitionManager::QQuickPopupTransitionManager(QQuickPopupPrivate *popup)
1417void QQuickPopupTransitionManager::transitionEnter()
1419 if (popup->transitionState == QQuickPopupPrivate::ExitTransition)
1422 if (!popup->prepareEnterTransition())
1426 transition(popup->enterActions, popup->enter, popup->q_func());
1431void QQuickPopupTransitionManager::transitionExit()
1433 if (!popup->prepareExitTransition())
1437 transition(popup->exitActions, popup->exit, popup->q_func());
1442void QQuickPopupTransitionManager::finished()
1444 if (popup->transitionState == QQuickPopupPrivate::EnterTransition)
1445 popup->finalizeEnterTransition();
1446 else if (popup->transitionState == QQuickPopupPrivate::ExitTransition)
1447 popup->finalizeExitTransition();
1450QQuickPopup::QQuickPopup(QObject *parent)
1451 : QObject(*(
new QQuickPopupPrivate), parent)
1456 d->relaxEdgeConstraint =
true;
1459QQuickPopup::QQuickPopup(QQuickPopupPrivate &dd, QObject *parent)
1460 : QObject(dd, parent)
1466QQuickPopup::~QQuickPopup()
1469 d->inDestructor =
true;
1471 QQuickItem *currentContentItem = d->popupItem->d_func()->contentItem.data();
1472 if (currentContentItem) {
1473 disconnect(currentContentItem, &QQuickItem::childrenChanged,
1474 this, &QQuickPopup::contentChildrenChanged);
1477 setParentItem(
nullptr);
1482 if (d->transitionState == QQuickPopupPrivate::ExitTransition && d->transitionManager.isRunning())
1483 d->finalizeExitTransition();
1485 delete d->popupItem;
1486 d->popupItem =
nullptr;
1487 delete d->positioner;
1488 d->positioner =
nullptr;
1490 delete d->popupWindow;
1491 d->popupWindow =
nullptr;
1495
1496
1497
1498
1499
1500
1501void QQuickPopup::open()
1507
1508
1509
1510
1511
1512
1513void QQuickPopup::close()
1519
1520
1521
1522
1523
1524
1525qreal QQuickPopup::x()
const
1527 return d_func()->effectivePos.x();
1530void QQuickPopup::setX(qreal x)
1533 setPosition(QPointF(x, d->y));
1537
1538
1539
1540
1541
1542
1543qreal QQuickPopup::y()
const
1545 return d_func()->effectivePos.y();
1548void QQuickPopup::setY(qreal y)
1551 setPosition(QPointF(d->x, y));
1554QPointF QQuickPopup::position()
const
1556 return d_func()->effectivePos;
1559void QQuickPopup::setPosition(
const QPointF &pos)
1562 const bool xChange = !qFuzzyCompare(d->x, pos.x());
1563 const bool yChange = !qFuzzyCompare(d->y, pos.y());
1564 if (!xChange && !yChange)
1569 if (d->popupItem->isVisible()) {
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599qreal QQuickPopup::z()
const
1601 Q_D(
const QQuickPopup);
1602 return d->popupItem->z();
1605void QQuickPopup::setZ(qreal z)
1609 bool previousZ = d->popupWindow ? d->popupWindow->z() : d->popupItem->z();
1610 if (qFuzzyCompare(z, previousZ))
1613 d->popupWindow->setZ(z);
1615 d->popupItem->setZ(z);
1619void QQuickPopup::resetZ()
1627
1628
1629
1630
1631qreal QQuickPopup::width()
const
1633 Q_D(
const QQuickPopup);
1634 return d->popupItem->width();
1637void QQuickPopup::setWidth(qreal width)
1648 d->popupWindow->setWidth(width + d->windowInsets().left() + d->windowInsets().right());
1650 d->popupItem->setWidth(width);
1653void QQuickPopup::resetWidth()
1659 d->hasWidth =
false;
1660 d->popupItem->resetWidth();
1661 if (d->popupItem->isVisible())
1666
1667
1668
1669
1670qreal QQuickPopup::height()
const
1672 Q_D(
const QQuickPopup);
1673 return d->popupItem->height();
1676void QQuickPopup::setHeight(qreal height)
1679 d->hasHeight =
true;
1687 d->popupWindow->setHeight(height + d->windowInsets().top() + d->windowInsets().bottom());
1689 d->popupItem->setHeight(height);
1692void QQuickPopup::resetHeight()
1698 d->hasHeight =
false;
1699 d->popupItem->resetHeight();
1700 if (d->popupItem->isVisible())
1705
1706
1707
1708
1709qreal QQuickPopup::implicitWidth()
const
1711 Q_D(
const QQuickPopup);
1712 return d->popupItem->implicitWidth();
1715void QQuickPopup::setImplicitWidth(qreal width)
1718 d->popupItem->setImplicitWidth(width);
1722
1723
1724
1725
1726qreal QQuickPopup::implicitHeight()
const
1728 Q_D(
const QQuickPopup);
1729 return d->popupItem->implicitHeight();
1732void QQuickPopup::setImplicitHeight(qreal height)
1735 d->popupItem->setImplicitHeight(height);
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748qreal QQuickPopup::contentWidth()
const
1750 Q_D(
const QQuickPopup);
1751 return d->popupItem->contentWidth();
1754void QQuickPopup::setContentWidth(qreal width)
1757 d->popupItem->setContentWidth(width);
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770qreal QQuickPopup::contentHeight()
const
1772 Q_D(
const QQuickPopup);
1773 return d->popupItem->contentHeight();
1776void QQuickPopup::setContentHeight(qreal height)
1779 d->popupItem->setContentHeight(height);
1783
1784
1785
1786
1787
1788
1789
1790
1791qreal QQuickPopup::availableWidth()
const
1793 Q_D(
const QQuickPopup);
1794 return d->popupItem->availableWidth();
1798
1799
1800
1801
1802
1803
1804
1805
1806qreal QQuickPopup::availableHeight()
const
1808 Q_D(
const QQuickPopup);
1809 return d->popupItem->availableHeight();
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824qreal QQuickPopup::spacing()
const
1826 Q_D(
const QQuickPopup);
1827 return d->popupItem->spacing();
1830void QQuickPopup::setSpacing(qreal spacing)
1833 d->popupItem->setSpacing(spacing);
1836void QQuickPopup::resetSpacing()
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852qreal QQuickPopup::margins()
const
1854 Q_D(
const QQuickPopup);
1858void QQuickPopup::setMargins(qreal margins)
1861 if (qFuzzyCompare(d->margins, margins))
1863 QMarginsF oldMargins(leftMargin(), topMargin(), rightMargin(), bottomMargin());
1864 d->margins = margins;
1865 emit marginsChanged();
1866 QMarginsF newMargins(leftMargin(), topMargin(), rightMargin(), bottomMargin());
1867 if (!qFuzzyCompare(newMargins.top(), oldMargins.top()))
1868 emit topMarginChanged();
1869 if (!qFuzzyCompare(newMargins.left(), oldMargins.left()))
1870 emit leftMarginChanged();
1871 if (!qFuzzyCompare(newMargins.right(), oldMargins.right()))
1872 emit rightMarginChanged();
1873 if (!qFuzzyCompare(newMargins.bottom(), oldMargins.bottom()))
1874 emit bottomMarginChanged();
1875 marginsChange(newMargins, oldMargins);
1878void QQuickPopup::resetMargins()
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894qreal QQuickPopup::topMargin()
const
1896 Q_D(
const QQuickPopup);
1897 if (d->hasTopMargin)
1898 return d->topMargin;
1902void QQuickPopup::setTopMargin(qreal margin)
1905 d->setTopMargin(margin);
1908void QQuickPopup::resetTopMargin()
1911 d->setTopMargin(-1,
true);
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925qreal QQuickPopup::leftMargin()
const
1927 Q_D(
const QQuickPopup);
1928 if (d->hasLeftMargin)
1929 return d->leftMargin;
1933void QQuickPopup::setLeftMargin(qreal margin)
1936 d->setLeftMargin(margin);
1939void QQuickPopup::resetLeftMargin()
1942 d->setLeftMargin(-1,
true);
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956qreal QQuickPopup::rightMargin()
const
1958 Q_D(
const QQuickPopup);
1959 if (d->hasRightMargin)
1960 return d->rightMargin;
1964void QQuickPopup::setRightMargin(qreal margin)
1967 d->setRightMargin(margin);
1970void QQuickPopup::resetRightMargin()
1973 d->setRightMargin(-1,
true);
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987qreal QQuickPopup::bottomMargin()
const
1989 Q_D(
const QQuickPopup);
1990 if (d->hasBottomMargin)
1991 return d->bottomMargin;
1995void QQuickPopup::setBottomMargin(qreal margin)
1998 d->setBottomMargin(margin);
2001void QQuickPopup::resetBottomMargin()
2004 d->setBottomMargin(-1,
true);
2008
2009
2010
2011
2012
2013
2014
2015
2016qreal QQuickPopup::padding()
const
2018 Q_D(
const QQuickPopup);
2019 return d->popupItem->padding();
2022void QQuickPopup::setPadding(qreal padding)
2025 d->popupItem->setPadding(padding);
2028void QQuickPopup::resetPadding()
2031 d->popupItem->resetPadding();
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044qreal QQuickPopup::topPadding()
const
2046 Q_D(
const QQuickPopup);
2047 return d->popupItem->topPadding();
2050void QQuickPopup::setTopPadding(qreal padding)
2053 d->popupItem->setTopPadding(padding);
2056void QQuickPopup::resetTopPadding()
2059 d->popupItem->resetTopPadding();
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072qreal QQuickPopup::leftPadding()
const
2074 Q_D(
const QQuickPopup);
2075 return d->popupItem->leftPadding();
2078void QQuickPopup::setLeftPadding(qreal padding)
2081 d->popupItem->setLeftPadding(padding);
2084void QQuickPopup::resetLeftPadding()
2087 d->popupItem->resetLeftPadding();
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100qreal QQuickPopup::rightPadding()
const
2102 Q_D(
const QQuickPopup);
2103 return d->popupItem->rightPadding();
2106void QQuickPopup::setRightPadding(qreal padding)
2109 d->popupItem->setRightPadding(padding);
2112void QQuickPopup::resetRightPadding()
2115 d->popupItem->resetRightPadding();
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128qreal QQuickPopup::bottomPadding()
const
2130 Q_D(
const QQuickPopup);
2131 return d->popupItem->bottomPadding();
2134void QQuickPopup::setBottomPadding(qreal padding)
2137 d->popupItem->setBottomPadding(padding);
2140void QQuickPopup::resetBottomPadding()
2143 d->popupItem->resetBottomPadding();
2147
2148
2149
2150
2151
2152
2153QLocale QQuickPopup::locale()
const
2155 Q_D(
const QQuickPopup);
2156 return d->popupItem->locale();
2159void QQuickPopup::setLocale(
const QLocale &locale)
2162 d->popupItem->setLocale(locale);
2165void QQuickPopup::resetLocale()
2168 d->popupItem->resetLocale();
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184bool QQuickPopup::isMirrored()
const
2186 Q_D(
const QQuickPopup);
2187 return d->popupItem->isMirrored();
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217QFont QQuickPopup::font()
const
2219 Q_D(
const QQuickPopup);
2220 return d->popupItem->font();
2223void QQuickPopup::setFont(
const QFont &font)
2226 d->popupItem->setFont(font);
2229void QQuickPopup::resetFont()
2232 d->popupItem->resetFont();
2235QQuickWindow *QQuickPopup::window()
const
2237 Q_D(
const QQuickPopup);
2241QQuickItem *QQuickPopup::popupItem()
const
2243 Q_D(
const QQuickPopup);
2244 return d->popupItem;
2248
2249
2250
2251
2252QQuickItem *QQuickPopup::parentItem()
const
2254 Q_D(
const QQuickPopup);
2255 return d->parentItem;
2258void QQuickPopup::setParentItem(QQuickItem *parent)
2261 if (d->parentItem == parent)
2264 if (d->parentItem) {
2265 QObjectPrivate::disconnect(d->parentItem, &QQuickItem::windowChanged, d, &QQuickPopupPrivate::setWindow);
2266 QQuickItemPrivate::get(d->parentItem)->removeItemChangeListener(d, QQuickItemPrivate::Destroyed);
2268 d->parentItem = parent;
2269 QQuickPopupPositioner *positioner = d->getPositioner();
2270 if (positioner->parentItem())
2271 positioner->setParentItem(parent);
2273 QObjectPrivate::connect(parent, &QQuickItem::windowChanged, d, &QQuickPopupPrivate::setWindow);
2274 QQuickItemPrivate::get(d->parentItem)->addItemChangeListener(d, QQuickItemPrivate::Destroyed);
2275 }
else if (d->inDestructor) {
2279 if (!d->window && d->transitionManager.isRunning()) {
2280 if (d->transitionState == QQuickPopupPrivate::EnterTransition)
2281 d->finalizeEnterTransition();
2282 else if (d->transitionState == QQuickPopupPrivate::ExitTransition)
2283 d->finalizeExitTransition();
2289 d->setWindow(parent ? parent->window() :
nullptr);
2290 emit parentChanged();
2293void QQuickPopup::resetParentItem()
2295 if (QQuickWindow *window = qobject_cast<QQuickWindow *>(parent()))
2296 setParentItem(window->contentItem());
2298 setParentItem(findParentItem());
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318QQuickItem *QQuickPopup::background()
const
2320 Q_D(
const QQuickPopup);
2321 return d->popupItem->background();
2324void QQuickPopup::setBackground(QQuickItem *background)
2329 QQuickControlPrivate::warnIfCustomizationNotSupported(
this, background, QStringLiteral(
"background"));
2330 d->popupItem->setBackground(background);
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353QQuickItem *QQuickPopup::contentItem()
const
2355 Q_D(
const QQuickPopup);
2356 return d->popupItem->contentItem();
2359void QQuickPopup::setContentItem(QQuickItem *item)
2363 QQuickControlPrivate::warnIfCustomizationNotSupported(
this, item, QStringLiteral(
"contentItem"));
2364 QQuickItem *oldContentItem = d->complete ? d->popupItem->d_func()->contentItem.data()
2367 disconnect(oldContentItem, &QQuickItem::childrenChanged,
this, &QQuickPopup::contentChildrenChanged);
2368 d->popupItem->setContentItem(item);
2370 QQuickItem *newContentItem = d->popupItem->d_func()->contentItem.data();
2372 connect(newContentItem, &QQuickItem::childrenChanged,
this, &QQuickPopup::contentChildrenChanged);
2373 if (oldContentItem != newContentItem)
2374 emit contentChildrenChanged();
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392QQmlListProperty<QObject> QQuickPopupPrivate::contentData()
2394 QQuickControlPrivate *p = QQuickControlPrivate::get(popupItem);
2395 if (!p->contentItem)
2396 p->executeContentItem();
2397 return QQmlListProperty<QObject>(popupItem->contentItem(),
nullptr,
2398 QQuickItemPrivate::data_append,
2399 QQuickItemPrivate::data_count,
2400 QQuickItemPrivate::data_at,
2401 QQuickItemPrivate::data_clear);
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417QQmlListProperty<QQuickItem> QQuickPopupPrivate::contentChildren()
2419 return QQmlListProperty<QQuickItem>(popupItem->contentItem(),
nullptr,
2420 QQuickItemPrivate::children_append,
2421 QQuickItemPrivate::children_count,
2422 QQuickItemPrivate::children_at,
2423 QQuickItemPrivate::children_clear);
2427
2428
2429
2430
2431
2432bool QQuickPopup::clip()
const
2434 Q_D(
const QQuickPopup);
2435 return d->popupItem->clip() && !d->usePopupWindow();
2438void QQuickPopup::setClip(
bool clip)
2441 if (clip == d->popupItem->clip() || d->usePopupWindow())
2443 d->popupItem->setClip(clip);
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459bool QQuickPopup::hasFocus()
const
2461 Q_D(
const QQuickPopup);
2465void QQuickPopup::setFocus(
bool focus)
2468 if (d->focus == focus)
2471 emit focusChanged();
2475
2476
2477
2478
2479
2480
2481
2482bool QQuickPopup::hasActiveFocus()
const
2484 Q_D(
const QQuickPopup);
2485 return d->popupItem->hasActiveFocus();
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509bool QQuickPopup::isModal()
const
2511 Q_D(
const QQuickPopup);
2515void QQuickPopup::setModal(
bool modal)
2518 if (d->modal == modal)
2521 d->popupWindowDirty =
true;
2522 if (d->complete && d->visible)
2524 emit modalChanged();
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542bool QQuickPopup::dim()
const
2544 Q_D(
const QQuickPopup);
2548void QQuickPopup::setDim(
bool dim)
2557 if (d->complete && d->visible)
2562void QQuickPopup::resetDim()
2573
2574
2575
2576
2577
2578
2579bool QQuickPopup::isVisible()
const
2581 Q_D(
const QQuickPopup);
2582 return d->visible && d->popupItem->isVisible();
2585void QQuickPopup::setVisible(
bool visible)
2591 if (d->visible && visible && d->transitionState != QQuickPopupPrivate::ExitTransition)
2594 if (!d->visible && !visible)
2597 if (!d->complete || (visible && !d->window)) {
2598 d->visible = visible;
2602 if (visible && !parentItem()) {
2603 qmlWarning(
this) <<
"cannot show popup: parent is null";
2610 d->transitionManager.transitionExit();
2614
2615
2616
2617
2618
2619
2620
2621bool QQuickPopup::isEnabled()
const
2623 Q_D(
const QQuickPopup);
2624 return d->popupItem->isEnabled();
2627void QQuickPopup::setEnabled(
bool enabled)
2630 d->popupItem->setEnabled(enabled);
2634
2635
2636
2637
2638
2639
2640
2641
2642bool QQuickPopup::isOpened()
const
2644 Q_D(
const QQuickPopup);
2645 return d->transitionState == QQuickPopupPrivate::NoTransition && isVisible();
2649
2650
2651
2652
2653
2654
2655
2656qreal QQuickPopup::opacity()
const
2658 Q_D(
const QQuickPopup);
2659 return d->popupItem->opacity();
2662void QQuickPopup::setOpacity(qreal opacity)
2665 d->popupItem->setOpacity(opacity);
2669
2670
2671
2672
2673
2674
2675
2676
2677qreal QQuickPopup::scale()
const
2679 Q_D(
const QQuickPopup);
2680 return d->popupItem->scale();
2683void QQuickPopup::setScale(qreal scale)
2686 if (qFuzzyCompare(scale, d->popupItem->scale()))
2688 d->popupItem->setScale(scale);
2689 emit scaleChanged();
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718QQuickPopup::ClosePolicy QQuickPopup::closePolicy()
const
2720 Q_D(
const QQuickPopup);
2721 return d->closePolicy;
2724void QQuickPopup::setClosePolicy(ClosePolicy policy)
2727 d->hasClosePolicy =
true;
2728 if (d->closePolicy == policy)
2730 d->closePolicy = policy;
2731 emit closePolicyChanged();
2734void QQuickPopup::resetClosePolicy()
2737 setClosePolicy(QQuickPopupPrivate::DefaultClosePolicy);
2738 d->hasClosePolicy =
false;
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754QQuickPopup::TransformOrigin QQuickPopup::transformOrigin()
const
2756 Q_D(
const QQuickPopup);
2757 return static_cast<TransformOrigin>(d->popupItem->transformOrigin());
2760void QQuickPopup::setTransformOrigin(TransformOrigin origin)
2763 d->popupItem->setTransformOrigin(
static_cast<QQuickItem::TransformOrigin>(origin));
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784QQuickTransition *QQuickPopup::enter()
const
2786 Q_D(
const QQuickPopup);
2790void QQuickPopup::setEnter(QQuickTransition *transition)
2793 if (d->enter == transition)
2795 d->enter = transition;
2796 emit enterChanged();
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817QQuickTransition *QQuickPopup::exit()
const
2819 Q_D(
const QQuickPopup);
2823void QQuickPopup::setExit(QQuickTransition *transition)
2826 if (d->exit == transition)
2828 d->exit = transition;
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843qreal QQuickPopup::horizontalPadding()
const
2845 Q_D(
const QQuickPopup);
2846 return d->popupItem->horizontalPadding();
2849void QQuickPopup::setHorizontalPadding(qreal padding)
2852 d->popupItem->setHorizontalPadding(padding);
2855void QQuickPopup::resetHorizontalPadding()
2858 d->popupItem->resetHorizontalPadding();
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872qreal QQuickPopup::verticalPadding()
const
2874 Q_D(
const QQuickPopup);
2875 return d->popupItem->verticalPadding();
2878void QQuickPopup::setVerticalPadding(qreal padding)
2881 d->popupItem->setVerticalPadding(padding);
2884void QQuickPopup::resetVerticalPadding()
2887 d->popupItem->resetVerticalPadding();
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901qreal QQuickPopup::implicitContentWidth()
const
2903 Q_D(
const QQuickPopup);
2904 return d->popupItem->implicitContentWidth();
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918qreal QQuickPopup::implicitContentHeight()
const
2920 Q_D(
const QQuickPopup);
2921 return d->popupItem->implicitContentHeight();
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935qreal QQuickPopup::implicitBackgroundWidth()
const
2937 Q_D(
const QQuickPopup);
2938 return d->popupItem->implicitBackgroundWidth();
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952qreal QQuickPopup::implicitBackgroundHeight()
const
2954 Q_D(
const QQuickPopup);
2955 return d->popupItem->implicitBackgroundHeight();
2959
2960
2961
2962
2963
2964
2965
2966qreal QQuickPopup::topInset()
const
2968 Q_D(
const QQuickPopup);
2969 return d->popupItem->topInset();
2972void QQuickPopup::setTopInset(qreal inset)
2975 d->popupItem->setTopInset(inset);
2978void QQuickPopup::resetTopInset()
2981 d->popupItem->resetTopInset();
2985
2986
2987
2988
2989
2990
2991
2992qreal QQuickPopup::leftInset()
const
2994 Q_D(
const QQuickPopup);
2995 return d->popupItem->leftInset();
2998void QQuickPopup::setLeftInset(qreal inset)
3001 d->popupItem->setLeftInset(inset);
3004void QQuickPopup::resetLeftInset()
3007 d->popupItem->resetLeftInset();
3011
3012
3013
3014
3015
3016
3017
3018qreal QQuickPopup::rightInset()
const
3020 Q_D(
const QQuickPopup);
3021 return d->popupItem->rightInset();
3024void QQuickPopup::setRightInset(qreal inset)
3027 d->popupItem->setRightInset(inset);
3030void QQuickPopup::resetRightInset()
3033 d->popupItem->resetRightInset();
3037
3038
3039
3040
3041
3042
3043
3044qreal QQuickPopup::bottomInset()
const
3046 Q_D(
const QQuickPopup);
3047 return d->popupItem->bottomInset();
3050void QQuickPopup::setBottomInset(qreal inset)
3053 d->popupItem->setBottomInset(inset);
3056void QQuickPopup::resetBottomInset()
3059 d->popupItem->resetBottomInset();
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106QQuickPopup::PopupType QQuickPopup::popupType()
const
3108 Q_D(
const QQuickPopup);
3109 return d->popupType;
3112void QQuickPopup::setPopupType(PopupType popupType)
3115 if (d->popupType == popupType)
3118 d->popupType = popupType;
3120 emit popupTypeChanged();
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3153bool QQuickPopup::filtersChildMouseEvents()
const
3155 Q_D(
const QQuickPopup);
3156 return d->popupItem->filtersChildMouseEvents();
3159void QQuickPopup::setFiltersChildMouseEvents(
bool filter)
3162 d->popupItem->setFiltersChildMouseEvents(filter);
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175void QQuickPopup::forceActiveFocus(Qt::FocusReason reason)
3178 d->popupItem->forceActiveFocus(reason);
3181void QQuickPopup::classBegin()
3184 d->complete =
false;
3185 QQmlContext *context = qmlContext(
this);
3187 QQmlEngine::setContextForObject(d->popupItem, context);
3188 d->popupItem->classBegin();
3191void QQuickPopup::componentComplete()
3194 qCDebug(lcQuickPopup) <<
"componentComplete" <<
this;
3199 d->popupItem->setObjectName(QQmlMetaType::prettyTypeName(
this));
3200 d->popupItem->componentComplete();
3202 if (
auto currentContentItem = d->popupItem->d_func()->contentItem.data()) {
3203 connect(currentContentItem, &QQuickItem::childrenChanged,
3204 this, &QQuickPopup::contentChildrenChanged);
3207 if (d->visible && d->window)
3211bool QQuickPopup::isComponentComplete()
const
3213 Q_D(
const QQuickPopup);
3217bool QQuickPopup::childMouseEventFilter(QQuickItem *child, QEvent *event)
3224void QQuickPopup::focusInEvent(QFocusEvent *event)
3229void QQuickPopup::focusOutEvent(QFocusEvent *event)
3234void QQuickPopup::keyPressEvent(QKeyEvent *event)
3237 if (!hasActiveFocus())
3240#if QT_CONFIG(shortcut)
3241 if (d->closePolicy.testFlag(QQuickPopup::CloseOnEscape)
3242 && (event->matches(QKeySequence::Cancel)
3243#if defined(Q_OS_ANDROID)
3244 || event->key() == Qt::Key_Back
3254 if (hasActiveFocus() && (event->key() == Qt::Key_Tab || event->key() == Qt::Key_Backtab)) {
3256 QQuickItemPrivate::focusNextPrev(d->popupItem, event->key() == Qt::Key_Tab);
3260void QQuickPopup::keyReleaseEvent(QKeyEvent *event)
3265void QQuickPopup::mousePressEvent(QMouseEvent *event)
3268 event->setAccepted(d->handleMouseEvent(d->popupItem, event));
3271void QQuickPopup::mouseMoveEvent(QMouseEvent *event)
3274 event->setAccepted(d->handleMouseEvent(d->popupItem, event));
3277void QQuickPopup::mouseReleaseEvent(QMouseEvent *event)
3280 event->setAccepted(d->handleMouseEvent(d->popupItem, event));
3283void QQuickPopup::mouseDoubleClickEvent(QMouseEvent *event)
3288void QQuickPopup::mouseUngrabEvent()
3297 QQuickItem *sourceAncestor = source;
3298 while (sourceAncestor) {
3299 QQuickItem *parentItem = sourceAncestor->parentItem();
3300 if (parentItem == overlay)
3301 return sourceAncestor;
3302 sourceAncestor = parentItem;
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320bool QQuickPopup::overlayEvent(QQuickItem *item, QEvent *event)
3327 auto *overlay = QQuickOverlay::overlay(d->window, d->parentItem);
3329 const QList<QQuickItem *> paintOrderChildItems = QQuickOverlayPrivate::get(overlay)->paintOrderChildItems();
3330 const qsizetype targetItemPaintOrderIndex = paintOrderChildItems.indexOf(findRootOfOverlaySubtree(item, overlay));
3331 const qsizetype popupItemPaintOrderIndex = paintOrderChildItems.indexOf(d->popupItem);
3332 if (targetItemPaintOrderIndex > popupItemPaintOrderIndex)
3335 switch (event->type()) {
3336 case QEvent::KeyPress:
3337 case QEvent::KeyRelease:
3338 case QEvent::MouseMove:
3343 case QEvent::DragEnter:
3344 case QEvent::DragMove:
3345 case QEvent::DragLeave:
3352#if QT_CONFIG(tabletevent)
3353 case QEvent::TabletPress:
3354 case QEvent::TabletMove:
3355 case QEvent::TabletRelease:
3360#if QT_CONFIG(quicktemplates2_multitouch)
3361 case QEvent::TouchBegin:
3362 case QEvent::TouchUpdate:
3363 case QEvent::TouchEnd:
3364 return d->handleTouchEvent(item,
static_cast<QTouchEvent *>(event));
3366 case QEvent::HoverEnter:
3367 case QEvent::HoverMove:
3368 case QEvent::HoverLeave:
3369 return d->handleHoverEvent(item,
static_cast<QHoverEvent *>(event));
3371 case QEvent::MouseButtonPress:
3372 case QEvent::MouseButtonRelease:
3373 return d->handleMouseEvent(item,
static_cast<QMouseEvent *>(event));
3380#if QT_CONFIG(quicktemplates2_multitouch)
3381void QQuickPopup::touchEvent(QTouchEvent *event)
3384 event->setAccepted(d->handleTouchEvent(d->popupItem, event));
3387void QQuickPopup::touchUngrabEvent()
3394#if QT_CONFIG(wheelevent)
3395void QQuickPopup::wheelEvent(QWheelEvent *event)
3401#if QT_CONFIG(quick_draganddrop)
3402void QQuickPopup::dragMoveEvent(QDragMoveEvent *event)
3407void QQuickPopup::dragLeaveEvent(QDragLeaveEvent *event)
3412void QQuickPopup::dropEvent(QDropEvent *event)
3417void QQuickPopup::dragEnterEvent(QDragEnterEvent *event)
3423void QQuickPopup::contentItemChange(QQuickItem *newItem, QQuickItem *oldItem)
3429void QQuickPopup::contentSizeChange(
const QSizeF &newSize,
const QSizeF &oldSize)
3431 qCDebug(lcQuickPopup) <<
"contentSizeChange called on" <<
this <<
"with newSize" << newSize <<
"oldSize" << oldSize;
3432 if (!qFuzzyCompare(newSize.width(), oldSize.width()))
3433 emit contentWidthChanged();
3434 if (!qFuzzyCompare(newSize.height(), oldSize.height()))
3435 emit contentHeightChanged();
3438void QQuickPopup::fontChange(
const QFont &newFont,
const QFont &oldFont)
3445void QQuickPopup::geometryChange(
const QRectF &newGeometry,
const QRectF &oldGeometry)
3448 qCDebug(lcQuickPopup) <<
"geometryChange called on" <<
this <<
"with newGeometry" << newGeometry <<
"oldGeometry" << oldGeometry;
3449 if (!d->usePopupWindow())
3451 if (!qFuzzyCompare(newGeometry.width(), oldGeometry.width())) {
3452 emit widthChanged();
3453 emit availableWidthChanged();
3455 if (!qFuzzyCompare(newGeometry.height(), oldGeometry.height())) {
3456 emit heightChanged();
3457 emit availableHeightChanged();
3461void QQuickPopup::itemChange(QQuickItem::ItemChange change,
const QQuickItem::ItemChangeData &)
3464 case QQuickItem::ItemActiveFocusHasChanged:
3465 emit activeFocusChanged();
3467 case QQuickItem::ItemOpacityHasChanged:
3468 emit opacityChanged();
3475void QQuickPopup::localeChange(
const QLocale &newLocale,
const QLocale &oldLocale)
3477 Q_UNUSED(newLocale);
3478 Q_UNUSED(oldLocale);
3479 emit localeChanged();
3482void QQuickPopup::marginsChange(
const QMarginsF &newMargins,
const QMarginsF &oldMargins)
3485 Q_UNUSED(newMargins);
3486 Q_UNUSED(oldMargins);
3490void QQuickPopup::paddingChange(
const QMarginsF &newPadding,
const QMarginsF &oldPadding)
3492 const bool tp = !qFuzzyCompare(newPadding.top(), oldPadding.top());
3493 const bool lp = !qFuzzyCompare(newPadding.left(), oldPadding.left());
3494 const bool rp = !qFuzzyCompare(newPadding.right(), oldPadding.right());
3495 const bool bp = !qFuzzyCompare(newPadding.bottom(), oldPadding.bottom());
3498 emit topPaddingChanged();
3500 emit leftPaddingChanged();
3502 emit rightPaddingChanged();
3504 emit bottomPaddingChanged();
3507 emit horizontalPaddingChanged();
3508 emit availableWidthChanged();
3511 emit verticalPaddingChanged();
3512 emit availableHeightChanged();
3516void QQuickPopup::spacingChange(qreal newSpacing, qreal oldSpacing)
3518 Q_UNUSED(newSpacing);
3519 Q_UNUSED(oldSpacing);
3520 emit spacingChanged();
3523void QQuickPopup::insetChange(
const QMarginsF &newInset,
const QMarginsF &oldInset)
3525 if (!qFuzzyCompare(newInset.top(), oldInset.top()))
3526 emit topInsetChanged();
3527 if (!qFuzzyCompare(newInset.left(), oldInset.left()))
3528 emit leftInsetChanged();
3529 if (!qFuzzyCompare(newInset.right(), oldInset.right()))
3530 emit rightInsetChanged();
3531 if (!qFuzzyCompare(newInset.bottom(), oldInset.bottom()))
3532 emit bottomInsetChanged();
3535QFont QQuickPopup::defaultFont()
const
3537 return QQuickTheme::font(QQuickTheme::System);
3540#if QT_CONFIG(accessibility)
3541QAccessible::Role QQuickPopup::effectiveAccessibleRole()
const
3543 auto *attached = qmlAttachedPropertiesObject<QQuickAccessibleAttached>(
this,
false);
3545 auto role = QAccessible::NoRole;
3546 if (
auto *accessibleAttached = qobject_cast<QQuickAccessibleAttached *>(attached))
3547 role = accessibleAttached->role();
3548 if (role == QAccessible::NoRole)
3549 role = accessibleRole();
3554QAccessible::Role QQuickPopup::accessibleRole()
const
3556 return QAccessible::Dialog;
3559void QQuickPopup::accessibilityActiveChanged(
bool active)
3565QString QQuickPopup::accessibleName()
const
3567 Q_D(
const QQuickPopup);
3568 return d->popupItem->accessibleName();
3571void QQuickPopup::maybeSetAccessibleName(
const QString &name)
3574 d->popupItem->maybeSetAccessibleName(name);
3577QVariant QQuickPopup::accessibleProperty(
const char *propertyName)
3579 Q_D(
const QQuickPopup);
3580 return d->popupItem->accessibleProperty(propertyName);
3583bool QQuickPopup::setAccessibleProperty(
const char *propertyName,
const QVariant &value)
3586 return d->popupItem->setAccessibleProperty(propertyName, value);
3589void QQuickPopup::setWindowModality(
const Qt::WindowModality modality)
3592 d->popupWndModality = modality;
3595QQuickItem *QQuickPopup::safeAreaAttachmentItem()
3600QQuickItem *QQuickPopup::attacheeItem()
const
3605QtPrivate::QQuickAttachedPropertyPropagator *QQuickPopup::attachedParent(
3606 const QMetaObject *ourAttachedType)
const
3608 auto *popupWindow = popupItem()->window();
3609 qCDebug(lcAttachedPropertyPropagator).noquote() <<
"- attachee is a popup; checking its window"
3611 auto *object = QtPrivate::QQuickAttachedPropertyPropagator::attachedObject(
3612 ourAttachedType, popupWindow);
3616 if (qobject_cast<QQuickPopupWindow *>(popupWindow)) {
3617 qCDebug(lcAttachedPropertyPropagator).noquote() <<
"- checking its window's transientParent"
3618 << popupWindow->transientParent();
3619 return QtPrivate::QQuickAttachedPropertyPropagator::attachedObject(ourAttachedType,
3620 popupWindow->transientParent());
3628#include "qquickpopup.moc"
3629#include "moc_qquickpopup_p.cpp"
Combined button and popup list for selecting options.
void operator()(QWindowExposedObserver *observer)