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->rightInset() < 0 ? -q->rightInset() : 0,
698 q->topInset() < 0 ? -q->topInset() : 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);
1072void QQuickPopupPrivate::setWindow(QQuickWindow *newWindow)
1075 if (window == newWindow)
1079 QQuickOverlay *overlay = QQuickOverlay::overlay(window, parentItem);
1081 QQuickOverlayPrivate::get(overlay)->removePopup(q);
1086 if (!newWindow && popupItem)
1087 popupItem->setParentItem(
nullptr);
1093 QQuickOverlay *overlay = QQuickOverlay::overlay(newWindow, parentItem);
1095 QQuickOverlayPrivate::get(overlay)->addPopup(q);
1097 QQuickControlPrivate *p = QQuickControlPrivate::get(popupItem);
1099 if (QQuickApplicationWindow *appWindow = qobject_cast<QQuickApplicationWindow *>(newWindow))
1100 p->updateLocale(appWindow->locale(),
false);
1103 emit q->windowChanged(newWindow);
1105 if (complete && visible && window)
1106 transitionManager.transitionEnter();
1109void QQuickPopupPrivate::itemDestroyed(QQuickItem *item)
1112 if (item == parentItem)
1113 q->setParentItem(
nullptr);
1116void QQuickPopupPrivate::reposition()
1118 getPositioner()->reposition();
1121QPalette QQuickPopupPrivate::defaultPalette()
const
1123 return QQuickTheme::palette(QQuickTheme::System);
1126QQuickPopup::PopupType QQuickPopupPrivate::resolvedPopupType()
const
1136 if (popupType == QQuickPopup::PopupType::Window
1137 || popupType == QQuickPopup::PopupType::Native) {
1138 if (QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::Capability::MultipleWindows))
1139 return QQuickPopup::PopupType::Window;
1142 return QQuickPopup::PopupType::Item;
1145bool QQuickPopupPrivate::usePopupWindow()
const
1147 return resolvedPopupType() == QQuickPopup::PopupType::Window;
1150void QQuickPopupPrivate::adjustPopupItemParentAndWindow()
1153 QQuickOverlay *overlay = QQuickOverlay::overlay(window, parentItem);
1155 if (visible && popupWindowDirty) {
1156 popupItem->setParentItem(overlay);
1158 popupWindow->deleteLater();
1159 popupWindow =
nullptr;
1161 popupWindowDirty =
false;
1164 if (usePopupWindow()) {
1167 popupWindow =
new QQuickPopupWindow(q, window);
1170 const qreal initialWidth = popupItem->width() + windowInsets().left() + windowInsets().right();
1171 const qreal initialHeight = popupItem->height() + windowInsets().top() + windowInsets().bottom();
1172 popupItem->setParentItem(popupWindow->contentItem());
1173 popupWindow->resize(qCeil(initialWidth), qCeil(initialHeight));
1174 if (popupWndModality != Qt::NonModal)
1175 popupWindow->setModality(popupWndModality);
1177 popupWindow->setModality(modal ? Qt::ApplicationModal : Qt::NonModal);
1178 popupItem->resetTitle();
1179 popupWindow->setTitle(title);
1181 popupItem->setParentItem(popupWindow->contentItem());
1182 popupItem->forceActiveFocus(Qt::PopupFocusReason);
1184 if (popupWindow && popupWindow->transientParent()) {
1185 auto *transientParentPriv = QQuickWindowPrivate::get(qobject_cast<QQuickWindow *>(popupWindow->transientParent()));
1186 if (!transientParentPriv->inDestructor)
1187 popupWindow->setVisible(visible);
1191 popupItem->setParentItem(overlay);
1192 const auto popupStack = QQuickOverlayPrivate::get(overlay)->stackingOrderPopups();
1196 const QQuickPopup *topPopup = popupStack.isEmpty() ?
nullptr : popupStack.first();
1197 const QObject *ancestor = q;
1198 while (ancestor && topPopup) {
1199 if (ancestor == topPopup)
1201 ancestor = ancestor->parent();
1203 if (topPopup && topPopup != q && ancestor) {
1204 QQuickItem *topPopupItem = popupStack.first()->popupItem();
1205 popupItem->stackAfter(topPopupItem);
1209 popupItem->setZ(qMax(topPopupItem->z(), popupItem->z()));
1211 q->setModal((popupWndModality != Qt::NonModal) || modal);
1214 popupItem->setTitle(title);
1216 popupItem->setVisible(visible);
1219QQuickItem *QQuickPopupPrivate::createDimmer(QQmlComponent *component, QQuickPopup *popup, QQuickItem *parent)
const
1221 QQuickItem *item =
nullptr;
1223 QQmlContext *context = component->creationContext();
1225 context = qmlContext(popup);
1226 item = qobject_cast<QQuickItem*>(component->beginCreate(context));
1231 if (!item && popup->isModal())
1232 item =
new QQuickItem;
1235 item->setParentItem(parent);
1236 if (resolvedPopupType() != QQuickPopup::PopupType::Window)
1237 item->stackBefore(popup->popupItem());
1238 item->setZ(popup->z());
1240 qCDebug(lcDimmer) <<
"dimmer" << item <<
"registered with" << parent;
1241 parent->setProperty(
"_q_dimmerItem", QVariant::fromValue<QQuickItem*>(item));
1242 if (popup->isModal()) {
1243 item->setAcceptedMouseButtons(Qt::AllButtons);
1244#if QT_CONFIG(cursor)
1245 item->setCursor(Qt::ArrowCursor);
1247#if QT_CONFIG(quicktemplates2_hover)
1249 item->setAcceptHoverEvents(
true);
1255 component->completeCreate();
1257 qCDebug(lcDimmer) <<
"finished creating dimmer from component" << component
1258 <<
"for popup" << popup <<
"with parent" << parent <<
"- item is:" << item;
1262void QQuickPopupPrivate::createOverlay()
1265 QQuickOverlay *overlay = QQuickOverlay::overlay(window, parentItem);
1269 QQmlComponent *component =
nullptr;
1270 QQuickOverlayAttached *overlayAttached = qobject_cast<QQuickOverlayAttached *>(qmlAttachedPropertiesObject<QQuickOverlay>(q,
false));
1271 if (overlayAttached)
1272 component = modal ? overlayAttached->modal() : overlayAttached->modeless();
1275 component = modal ? overlay->modal() : overlay->modeless();
1278 dimmer = createDimmer(component, q, overlay);
1285 explicitDimmerOpacity = dimmer->opacity();
1287 dimmer->setOpacity(0);
1294void QQuickPopupPrivate::destroyDimmer()
1297 qCDebug(lcDimmer) <<
"destroying dimmer" << dimmer;
1298 if (QObject *dimmerParentItem = dimmer->parentItem()) {
1299 if (dimmerParentItem->property(
"_q_dimmerItem").value<QQuickItem*>() == dimmer)
1300 dimmerParentItem->setProperty(
"_q_dimmerItem", QVariant());
1302 dimmer->setParentItem(
nullptr);
1303 dimmer->deleteLater();
1308void QQuickPopupPrivate::toggleOverlay()
1315void QQuickPopupPrivate::updateContentPalettes(
const QPalette& parentPalette)
1318 if (providesPalette())
1319 inheritPalette(parentPalette);
1321 QQuickItemPrivate::get(popupItem)->updateChildrenPalettes(parentPalette);
1324void QQuickPopupPrivate::updateChildrenPalettes(
const QPalette& parentPalette)
1326 updateContentPalettes(parentPalette);
1329void QQuickPopupPrivate::showDimmer()
1333 QQmlProperty::write(dimmer, QStringLiteral(
"opacity"), explicitDimmerOpacity);
1336void QQuickPopupPrivate::hideDimmer()
1340 QQmlProperty::write(dimmer, QStringLiteral(
"opacity"), 0.0);
1343void QQuickPopupPrivate::resizeDimmer()
1348 const QQuickOverlay *overlay = QQuickOverlay::overlay(window, parentItem);
1350 qreal w = overlay ? overlay->width() : 0;
1351 qreal h = overlay ? overlay->height() : 0;
1352 dimmer->setSize(QSizeF(w, h));
1355QQuickPopupTransitionManager::QQuickPopupTransitionManager(QQuickPopupPrivate *popup)
1360void QQuickPopupTransitionManager::transitionEnter()
1362 if (popup->transitionState == QQuickPopupPrivate::ExitTransition)
1365 if (!popup->prepareEnterTransition())
1369 transition(popup->enterActions, popup->enter, popup->q_func());
1374void QQuickPopupTransitionManager::transitionExit()
1376 if (!popup->prepareExitTransition())
1380 transition(popup->exitActions, popup->exit, popup->q_func());
1385void QQuickPopupTransitionManager::finished()
1387 if (popup->transitionState == QQuickPopupPrivate::EnterTransition)
1388 popup->finalizeEnterTransition();
1389 else if (popup->transitionState == QQuickPopupPrivate::ExitTransition)
1390 popup->finalizeExitTransition();
1393QQuickPopup::QQuickPopup(QObject *parent)
1394 : QObject(*(
new QQuickPopupPrivate), parent)
1399 d->relaxEdgeConstraint =
true;
1402QQuickPopup::QQuickPopup(QQuickPopupPrivate &dd, QObject *parent)
1403 : QObject(dd, parent)
1409QQuickPopup::~QQuickPopup()
1412 d->inDestructor =
true;
1414 QQuickItem *currentContentItem = d->popupItem->d_func()->contentItem.data();
1415 if (currentContentItem) {
1416 disconnect(currentContentItem, &QQuickItem::childrenChanged,
1417 this, &QQuickPopup::contentChildrenChanged);
1420 setParentItem(
nullptr);
1425 if (d->transitionState == QQuickPopupPrivate::ExitTransition && d->transitionManager.isRunning())
1426 d->finalizeExitTransition();
1428 delete d->popupItem;
1429 d->popupItem =
nullptr;
1430 delete d->positioner;
1431 d->positioner =
nullptr;
1433 delete d->popupWindow;
1434 d->popupWindow =
nullptr;
1438
1439
1440
1441
1442
1443
1444void QQuickPopup::open()
1450
1451
1452
1453
1454
1455
1456void QQuickPopup::close()
1462
1463
1464
1465
1466
1467
1468qreal QQuickPopup::x()
const
1470 return d_func()->effectivePos.x();
1473void QQuickPopup::setX(qreal x)
1476 setPosition(QPointF(x, d->y));
1480
1481
1482
1483
1484
1485
1486qreal QQuickPopup::y()
const
1488 return d_func()->effectivePos.y();
1491void QQuickPopup::setY(qreal y)
1494 setPosition(QPointF(d->x, y));
1497QPointF QQuickPopup::position()
const
1499 return d_func()->effectivePos;
1502void QQuickPopup::setPosition(
const QPointF &pos)
1505 const bool xChange = !qFuzzyCompare(d->x, pos.x());
1506 const bool yChange = !qFuzzyCompare(d->y, pos.y());
1507 if (!xChange && !yChange)
1512 if (d->popupItem->isVisible()) {
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542qreal QQuickPopup::z()
const
1544 Q_D(
const QQuickPopup);
1545 return d->popupItem->z();
1548void QQuickPopup::setZ(qreal z)
1552 bool previousZ = d->popupWindow ? d->popupWindow->z() : d->popupItem->z();
1553 if (qFuzzyCompare(z, previousZ))
1556 d->popupWindow->setZ(z);
1558 d->popupItem->setZ(z);
1562void QQuickPopup::resetZ()
1570
1571
1572
1573
1574qreal QQuickPopup::width()
const
1576 Q_D(
const QQuickPopup);
1577 return d->popupItem->width();
1580void QQuickPopup::setWidth(qreal width)
1591 d->popupWindow->setWidth(width + d->windowInsets().left() + d->windowInsets().right());
1593 d->popupItem->setWidth(width);
1596void QQuickPopup::resetWidth()
1602 d->hasWidth =
false;
1603 d->popupItem->resetWidth();
1604 if (d->popupItem->isVisible())
1609
1610
1611
1612
1613qreal QQuickPopup::height()
const
1615 Q_D(
const QQuickPopup);
1616 return d->popupItem->height();
1619void QQuickPopup::setHeight(qreal height)
1622 d->hasHeight =
true;
1630 d->popupWindow->setHeight(height + d->windowInsets().top() + d->windowInsets().bottom());
1632 d->popupItem->setHeight(height);
1635void QQuickPopup::resetHeight()
1641 d->hasHeight =
false;
1642 d->popupItem->resetHeight();
1643 if (d->popupItem->isVisible())
1648
1649
1650
1651
1652qreal QQuickPopup::implicitWidth()
const
1654 Q_D(
const QQuickPopup);
1655 return d->popupItem->implicitWidth();
1658void QQuickPopup::setImplicitWidth(qreal width)
1661 d->popupItem->setImplicitWidth(width);
1665
1666
1667
1668
1669qreal QQuickPopup::implicitHeight()
const
1671 Q_D(
const QQuickPopup);
1672 return d->popupItem->implicitHeight();
1675void QQuickPopup::setImplicitHeight(qreal height)
1678 d->popupItem->setImplicitHeight(height);
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691qreal QQuickPopup::contentWidth()
const
1693 Q_D(
const QQuickPopup);
1694 return d->popupItem->contentWidth();
1697void QQuickPopup::setContentWidth(qreal width)
1700 d->popupItem->setContentWidth(width);
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713qreal QQuickPopup::contentHeight()
const
1715 Q_D(
const QQuickPopup);
1716 return d->popupItem->contentHeight();
1719void QQuickPopup::setContentHeight(qreal height)
1722 d->popupItem->setContentHeight(height);
1726
1727
1728
1729
1730
1731
1732
1733
1734qreal QQuickPopup::availableWidth()
const
1736 Q_D(
const QQuickPopup);
1737 return d->popupItem->availableWidth();
1741
1742
1743
1744
1745
1746
1747
1748
1749qreal QQuickPopup::availableHeight()
const
1751 Q_D(
const QQuickPopup);
1752 return d->popupItem->availableHeight();
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767qreal QQuickPopup::spacing()
const
1769 Q_D(
const QQuickPopup);
1770 return d->popupItem->spacing();
1773void QQuickPopup::setSpacing(qreal spacing)
1776 d->popupItem->setSpacing(spacing);
1779void QQuickPopup::resetSpacing()
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795qreal QQuickPopup::margins()
const
1797 Q_D(
const QQuickPopup);
1801void QQuickPopup::setMargins(qreal margins)
1804 if (qFuzzyCompare(d->margins, margins))
1806 QMarginsF oldMargins(leftMargin(), topMargin(), rightMargin(), bottomMargin());
1807 d->margins = margins;
1808 emit marginsChanged();
1809 QMarginsF newMargins(leftMargin(), topMargin(), rightMargin(), bottomMargin());
1810 if (!qFuzzyCompare(newMargins.top(), oldMargins.top()))
1811 emit topMarginChanged();
1812 if (!qFuzzyCompare(newMargins.left(), oldMargins.left()))
1813 emit leftMarginChanged();
1814 if (!qFuzzyCompare(newMargins.right(), oldMargins.right()))
1815 emit rightMarginChanged();
1816 if (!qFuzzyCompare(newMargins.bottom(), oldMargins.bottom()))
1817 emit bottomMarginChanged();
1818 marginsChange(newMargins, oldMargins);
1821void QQuickPopup::resetMargins()
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837qreal QQuickPopup::topMargin()
const
1839 Q_D(
const QQuickPopup);
1840 if (d->hasTopMargin)
1841 return d->topMargin;
1845void QQuickPopup::setTopMargin(qreal margin)
1848 d->setTopMargin(margin);
1851void QQuickPopup::resetTopMargin()
1854 d->setTopMargin(-1,
true);
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868qreal QQuickPopup::leftMargin()
const
1870 Q_D(
const QQuickPopup);
1871 if (d->hasLeftMargin)
1872 return d->leftMargin;
1876void QQuickPopup::setLeftMargin(qreal margin)
1879 d->setLeftMargin(margin);
1882void QQuickPopup::resetLeftMargin()
1885 d->setLeftMargin(-1,
true);
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899qreal QQuickPopup::rightMargin()
const
1901 Q_D(
const QQuickPopup);
1902 if (d->hasRightMargin)
1903 return d->rightMargin;
1907void QQuickPopup::setRightMargin(qreal margin)
1910 d->setRightMargin(margin);
1913void QQuickPopup::resetRightMargin()
1916 d->setRightMargin(-1,
true);
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930qreal QQuickPopup::bottomMargin()
const
1932 Q_D(
const QQuickPopup);
1933 if (d->hasBottomMargin)
1934 return d->bottomMargin;
1938void QQuickPopup::setBottomMargin(qreal margin)
1941 d->setBottomMargin(margin);
1944void QQuickPopup::resetBottomMargin()
1947 d->setBottomMargin(-1,
true);
1951
1952
1953
1954
1955
1956
1957
1958
1959qreal QQuickPopup::padding()
const
1961 Q_D(
const QQuickPopup);
1962 return d->popupItem->padding();
1965void QQuickPopup::setPadding(qreal padding)
1968 d->popupItem->setPadding(padding);
1971void QQuickPopup::resetPadding()
1974 d->popupItem->resetPadding();
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987qreal QQuickPopup::topPadding()
const
1989 Q_D(
const QQuickPopup);
1990 return d->popupItem->topPadding();
1993void QQuickPopup::setTopPadding(qreal padding)
1996 d->popupItem->setTopPadding(padding);
1999void QQuickPopup::resetTopPadding()
2002 d->popupItem->resetTopPadding();
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015qreal QQuickPopup::leftPadding()
const
2017 Q_D(
const QQuickPopup);
2018 return d->popupItem->leftPadding();
2021void QQuickPopup::setLeftPadding(qreal padding)
2024 d->popupItem->setLeftPadding(padding);
2027void QQuickPopup::resetLeftPadding()
2030 d->popupItem->resetLeftPadding();
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043qreal QQuickPopup::rightPadding()
const
2045 Q_D(
const QQuickPopup);
2046 return d->popupItem->rightPadding();
2049void QQuickPopup::setRightPadding(qreal padding)
2052 d->popupItem->setRightPadding(padding);
2055void QQuickPopup::resetRightPadding()
2058 d->popupItem->resetRightPadding();
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071qreal QQuickPopup::bottomPadding()
const
2073 Q_D(
const QQuickPopup);
2074 return d->popupItem->bottomPadding();
2077void QQuickPopup::setBottomPadding(qreal padding)
2080 d->popupItem->setBottomPadding(padding);
2083void QQuickPopup::resetBottomPadding()
2086 d->popupItem->resetBottomPadding();
2090
2091
2092
2093
2094
2095
2096QLocale QQuickPopup::locale()
const
2098 Q_D(
const QQuickPopup);
2099 return d->popupItem->locale();
2102void QQuickPopup::setLocale(
const QLocale &locale)
2105 d->popupItem->setLocale(locale);
2108void QQuickPopup::resetLocale()
2111 d->popupItem->resetLocale();
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127bool QQuickPopup::isMirrored()
const
2129 Q_D(
const QQuickPopup);
2130 return d->popupItem->isMirrored();
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160QFont QQuickPopup::font()
const
2162 Q_D(
const QQuickPopup);
2163 return d->popupItem->font();
2166void QQuickPopup::setFont(
const QFont &font)
2169 d->popupItem->setFont(font);
2172void QQuickPopup::resetFont()
2175 d->popupItem->resetFont();
2178QQuickWindow *QQuickPopup::window()
const
2180 Q_D(
const QQuickPopup);
2184QQuickItem *QQuickPopup::popupItem()
const
2186 Q_D(
const QQuickPopup);
2187 return d->popupItem;
2191
2192
2193
2194
2195QQuickItem *QQuickPopup::parentItem()
const
2197 Q_D(
const QQuickPopup);
2198 return d->parentItem;
2201void QQuickPopup::setParentItem(QQuickItem *parent)
2204 if (d->parentItem == parent)
2207 if (d->parentItem) {
2208 QObjectPrivate::disconnect(d->parentItem, &QQuickItem::windowChanged, d, &QQuickPopupPrivate::setWindow);
2209 QQuickItemPrivate::get(d->parentItem)->removeItemChangeListener(d, QQuickItemPrivate::Destroyed);
2211 d->parentItem = parent;
2212 QQuickPopupPositioner *positioner = d->getPositioner();
2213 if (positioner->parentItem())
2214 positioner->setParentItem(parent);
2216 QObjectPrivate::connect(parent, &QQuickItem::windowChanged, d, &QQuickPopupPrivate::setWindow);
2217 QQuickItemPrivate::get(d->parentItem)->addItemChangeListener(d, QQuickItemPrivate::Destroyed);
2218 }
else if (d->inDestructor) {
2222 if (!d->window && d->transitionManager.isRunning()) {
2223 if (d->transitionState == QQuickPopupPrivate::EnterTransition)
2224 d->finalizeEnterTransition();
2225 else if (d->transitionState == QQuickPopupPrivate::ExitTransition)
2226 d->finalizeExitTransition();
2232 d->setWindow(parent ? parent->window() :
nullptr);
2233 emit parentChanged();
2236void QQuickPopup::resetParentItem()
2238 if (QQuickWindow *window = qobject_cast<QQuickWindow *>(parent()))
2239 setParentItem(window->contentItem());
2241 setParentItem(findParentItem());
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261QQuickItem *QQuickPopup::background()
const
2263 Q_D(
const QQuickPopup);
2264 return d->popupItem->background();
2267void QQuickPopup::setBackground(QQuickItem *background)
2272 QQuickControlPrivate::warnIfCustomizationNotSupported(
this, background, QStringLiteral(
"background"));
2273 d->popupItem->setBackground(background);
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296QQuickItem *QQuickPopup::contentItem()
const
2298 Q_D(
const QQuickPopup);
2299 return d->popupItem->contentItem();
2302void QQuickPopup::setContentItem(QQuickItem *item)
2306 QQuickControlPrivate::warnIfCustomizationNotSupported(
this, item, QStringLiteral(
"contentItem"));
2307 QQuickItem *oldContentItem = d->complete ? d->popupItem->d_func()->contentItem.data()
2310 disconnect(oldContentItem, &QQuickItem::childrenChanged,
this, &QQuickPopup::contentChildrenChanged);
2311 d->popupItem->setContentItem(item);
2313 QQuickItem *newContentItem = d->popupItem->d_func()->contentItem.data();
2315 connect(newContentItem, &QQuickItem::childrenChanged,
this, &QQuickPopup::contentChildrenChanged);
2316 if (oldContentItem != newContentItem)
2317 emit contentChildrenChanged();
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335QQmlListProperty<QObject> QQuickPopupPrivate::contentData()
2337 QQuickControlPrivate *p = QQuickControlPrivate::get(popupItem);
2338 if (!p->contentItem)
2339 p->executeContentItem();
2340 return QQmlListProperty<QObject>(popupItem->contentItem(),
nullptr,
2341 QQuickItemPrivate::data_append,
2342 QQuickItemPrivate::data_count,
2343 QQuickItemPrivate::data_at,
2344 QQuickItemPrivate::data_clear);
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360QQmlListProperty<QQuickItem> QQuickPopupPrivate::contentChildren()
2362 return QQmlListProperty<QQuickItem>(popupItem->contentItem(),
nullptr,
2363 QQuickItemPrivate::children_append,
2364 QQuickItemPrivate::children_count,
2365 QQuickItemPrivate::children_at,
2366 QQuickItemPrivate::children_clear);
2370
2371
2372
2373
2374
2375bool QQuickPopup::clip()
const
2377 Q_D(
const QQuickPopup);
2378 return d->popupItem->clip() && !d->usePopupWindow();
2381void QQuickPopup::setClip(
bool clip)
2384 if (clip == d->popupItem->clip() || d->usePopupWindow())
2386 d->popupItem->setClip(clip);
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402bool QQuickPopup::hasFocus()
const
2404 Q_D(
const QQuickPopup);
2408void QQuickPopup::setFocus(
bool focus)
2411 if (d->focus == focus)
2414 emit focusChanged();
2418
2419
2420
2421
2422
2423
2424
2425bool QQuickPopup::hasActiveFocus()
const
2427 Q_D(
const QQuickPopup);
2428 return d->popupItem->hasActiveFocus();
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452bool QQuickPopup::isModal()
const
2454 Q_D(
const QQuickPopup);
2458void QQuickPopup::setModal(
bool modal)
2461 if (d->modal == modal)
2464 d->popupWindowDirty =
true;
2465 if (d->complete && d->visible)
2467 emit modalChanged();
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485bool QQuickPopup::dim()
const
2487 Q_D(
const QQuickPopup);
2491void QQuickPopup::setDim(
bool dim)
2500 if (d->complete && d->visible)
2505void QQuickPopup::resetDim()
2516
2517
2518
2519
2520
2521
2522bool QQuickPopup::isVisible()
const
2524 Q_D(
const QQuickPopup);
2525 return d->visible && d->popupItem->isVisible();
2528void QQuickPopup::setVisible(
bool visible)
2534 if (d->visible && visible && d->transitionState != QQuickPopupPrivate::ExitTransition)
2537 if (!d->visible && !visible)
2540 if (!d->complete || (visible && !d->window)) {
2541 d->visible = visible;
2545 if (visible && !parentItem()) {
2546 qmlWarning(
this) <<
"cannot show popup: parent is null";
2551 d->transitionManager.transitionEnter();
2553 d->transitionManager.transitionExit();
2557
2558
2559
2560
2561
2562
2563
2564bool QQuickPopup::isEnabled()
const
2566 Q_D(
const QQuickPopup);
2567 return d->popupItem->isEnabled();
2570void QQuickPopup::setEnabled(
bool enabled)
2573 d->popupItem->setEnabled(enabled);
2577
2578
2579
2580
2581
2582
2583
2584
2585bool QQuickPopup::isOpened()
const
2587 Q_D(
const QQuickPopup);
2588 return d->transitionState == QQuickPopupPrivate::NoTransition && isVisible();
2592
2593
2594
2595
2596
2597
2598
2599qreal QQuickPopup::opacity()
const
2601 Q_D(
const QQuickPopup);
2602 return d->popupItem->opacity();
2605void QQuickPopup::setOpacity(qreal opacity)
2608 d->popupItem->setOpacity(opacity);
2612
2613
2614
2615
2616
2617
2618
2619
2620qreal QQuickPopup::scale()
const
2622 Q_D(
const QQuickPopup);
2623 return d->popupItem->scale();
2626void QQuickPopup::setScale(qreal scale)
2629 if (qFuzzyCompare(scale, d->popupItem->scale()))
2631 d->popupItem->setScale(scale);
2632 emit scaleChanged();
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661QQuickPopup::ClosePolicy QQuickPopup::closePolicy()
const
2663 Q_D(
const QQuickPopup);
2664 return d->closePolicy;
2667void QQuickPopup::setClosePolicy(ClosePolicy policy)
2670 d->hasClosePolicy =
true;
2671 if (d->closePolicy == policy)
2673 d->closePolicy = policy;
2674 emit closePolicyChanged();
2677void QQuickPopup::resetClosePolicy()
2680 setClosePolicy(QQuickPopupPrivate::DefaultClosePolicy);
2681 d->hasClosePolicy =
false;
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697QQuickPopup::TransformOrigin QQuickPopup::transformOrigin()
const
2699 Q_D(
const QQuickPopup);
2700 return static_cast<TransformOrigin>(d->popupItem->transformOrigin());
2703void QQuickPopup::setTransformOrigin(TransformOrigin origin)
2706 d->popupItem->setTransformOrigin(
static_cast<QQuickItem::TransformOrigin>(origin));
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727QQuickTransition *QQuickPopup::enter()
const
2729 Q_D(
const QQuickPopup);
2733void QQuickPopup::setEnter(QQuickTransition *transition)
2736 if (d->enter == transition)
2738 d->enter = transition;
2739 emit enterChanged();
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760QQuickTransition *QQuickPopup::exit()
const
2762 Q_D(
const QQuickPopup);
2766void QQuickPopup::setExit(QQuickTransition *transition)
2769 if (d->exit == transition)
2771 d->exit = transition;
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786qreal QQuickPopup::horizontalPadding()
const
2788 Q_D(
const QQuickPopup);
2789 return d->popupItem->horizontalPadding();
2792void QQuickPopup::setHorizontalPadding(qreal padding)
2795 d->popupItem->setHorizontalPadding(padding);
2798void QQuickPopup::resetHorizontalPadding()
2801 d->popupItem->resetHorizontalPadding();
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815qreal QQuickPopup::verticalPadding()
const
2817 Q_D(
const QQuickPopup);
2818 return d->popupItem->verticalPadding();
2821void QQuickPopup::setVerticalPadding(qreal padding)
2824 d->popupItem->setVerticalPadding(padding);
2827void QQuickPopup::resetVerticalPadding()
2830 d->popupItem->resetVerticalPadding();
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844qreal QQuickPopup::implicitContentWidth()
const
2846 Q_D(
const QQuickPopup);
2847 return d->popupItem->implicitContentWidth();
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861qreal QQuickPopup::implicitContentHeight()
const
2863 Q_D(
const QQuickPopup);
2864 return d->popupItem->implicitContentHeight();
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878qreal QQuickPopup::implicitBackgroundWidth()
const
2880 Q_D(
const QQuickPopup);
2881 return d->popupItem->implicitBackgroundWidth();
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895qreal QQuickPopup::implicitBackgroundHeight()
const
2897 Q_D(
const QQuickPopup);
2898 return d->popupItem->implicitBackgroundHeight();
2902
2903
2904
2905
2906
2907
2908
2909qreal QQuickPopup::topInset()
const
2911 Q_D(
const QQuickPopup);
2912 return d->popupItem->topInset();
2915void QQuickPopup::setTopInset(qreal inset)
2918 d->popupItem->setTopInset(inset);
2921void QQuickPopup::resetTopInset()
2924 d->popupItem->resetTopInset();
2928
2929
2930
2931
2932
2933
2934
2935qreal QQuickPopup::leftInset()
const
2937 Q_D(
const QQuickPopup);
2938 return d->popupItem->leftInset();
2941void QQuickPopup::setLeftInset(qreal inset)
2944 d->popupItem->setLeftInset(inset);
2947void QQuickPopup::resetLeftInset()
2950 d->popupItem->resetLeftInset();
2954
2955
2956
2957
2958
2959
2960
2961qreal QQuickPopup::rightInset()
const
2963 Q_D(
const QQuickPopup);
2964 return d->popupItem->rightInset();
2967void QQuickPopup::setRightInset(qreal inset)
2970 d->popupItem->setRightInset(inset);
2973void QQuickPopup::resetRightInset()
2976 d->popupItem->resetRightInset();
2980
2981
2982
2983
2984
2985
2986
2987qreal QQuickPopup::bottomInset()
const
2989 Q_D(
const QQuickPopup);
2990 return d->popupItem->bottomInset();
2993void QQuickPopup::setBottomInset(qreal inset)
2996 d->popupItem->setBottomInset(inset);
2999void QQuickPopup::resetBottomInset()
3002 d->popupItem->resetBottomInset();
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049QQuickPopup::PopupType QQuickPopup::popupType()
const
3051 Q_D(
const QQuickPopup);
3052 return d->popupType;
3055void QQuickPopup::setPopupType(PopupType popupType)
3058 if (d->popupType == popupType)
3061 d->popupType = popupType;
3063 emit popupTypeChanged();
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
3096bool QQuickPopup::filtersChildMouseEvents()
const
3098 Q_D(
const QQuickPopup);
3099 return d->popupItem->filtersChildMouseEvents();
3102void QQuickPopup::setFiltersChildMouseEvents(
bool filter)
3105 d->popupItem->setFiltersChildMouseEvents(filter);
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118void QQuickPopup::forceActiveFocus(Qt::FocusReason reason)
3121 d->popupItem->forceActiveFocus(reason);
3124void QQuickPopup::classBegin()
3127 d->complete =
false;
3128 QQmlContext *context = qmlContext(
this);
3130 QQmlEngine::setContextForObject(d->popupItem, context);
3131 d->popupItem->classBegin();
3134void QQuickPopup::componentComplete()
3137 qCDebug(lcQuickPopup) <<
"componentComplete" <<
this;
3141 if (d->visible && d->window)
3142 d->transitionManager.transitionEnter();
3145 d->popupItem->setObjectName(QQmlMetaType::prettyTypeName(
this));
3146 d->popupItem->componentComplete();
3148 if (
auto currentContentItem = d->popupItem->d_func()->contentItem.data()) {
3149 connect(currentContentItem, &QQuickItem::childrenChanged,
3150 this, &QQuickPopup::contentChildrenChanged);
3154bool QQuickPopup::isComponentComplete()
const
3156 Q_D(
const QQuickPopup);
3160bool QQuickPopup::childMouseEventFilter(QQuickItem *child, QEvent *event)
3167void QQuickPopup::focusInEvent(QFocusEvent *event)
3172void QQuickPopup::focusOutEvent(QFocusEvent *event)
3177void QQuickPopup::keyPressEvent(QKeyEvent *event)
3180 if (!hasActiveFocus())
3183#if QT_CONFIG(shortcut)
3184 if (d->closePolicy.testFlag(QQuickPopup::CloseOnEscape)
3185 && (event->matches(QKeySequence::Cancel)
3186#if defined(Q_OS_ANDROID)
3187 || event->key() == Qt::Key_Back
3197 if (hasActiveFocus() && (event->key() == Qt::Key_Tab || event->key() == Qt::Key_Backtab)) {
3199 QQuickItemPrivate::focusNextPrev(d->popupItem, event->key() == Qt::Key_Tab);
3203void QQuickPopup::keyReleaseEvent(QKeyEvent *event)
3208void QQuickPopup::mousePressEvent(QMouseEvent *event)
3211 event->setAccepted(d->handleMouseEvent(d->popupItem, event));
3214void QQuickPopup::mouseMoveEvent(QMouseEvent *event)
3217 event->setAccepted(d->handleMouseEvent(d->popupItem, event));
3220void QQuickPopup::mouseReleaseEvent(QMouseEvent *event)
3223 event->setAccepted(d->handleMouseEvent(d->popupItem, event));
3226void QQuickPopup::mouseDoubleClickEvent(QMouseEvent *event)
3231void QQuickPopup::mouseUngrabEvent()
3240 QQuickItem *sourceAncestor = source;
3241 while (sourceAncestor) {
3242 QQuickItem *parentItem = sourceAncestor->parentItem();
3243 if (parentItem == overlay)
3244 return sourceAncestor;
3245 sourceAncestor = parentItem;
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263bool QQuickPopup::overlayEvent(QQuickItem *item, QEvent *event)
3270 auto *overlay = QQuickOverlay::overlay(d->window, d->parentItem);
3272 const QList<QQuickItem *> paintOrderChildItems = QQuickOverlayPrivate::get(overlay)->paintOrderChildItems();
3273 const qsizetype targetItemPaintOrderIndex = paintOrderChildItems.indexOf(findRootOfOverlaySubtree(item, overlay));
3274 const qsizetype popupItemPaintOrderIndex = paintOrderChildItems.indexOf(d->popupItem);
3275 if (targetItemPaintOrderIndex > popupItemPaintOrderIndex)
3278 switch (event->type()) {
3279 case QEvent::KeyPress:
3280 case QEvent::KeyRelease:
3281 case QEvent::MouseMove:
3287#if QT_CONFIG(quicktemplates2_multitouch)
3288 case QEvent::TouchBegin:
3289 case QEvent::TouchUpdate:
3290 case QEvent::TouchEnd:
3291 return d->handleTouchEvent(item,
static_cast<QTouchEvent *>(event));
3293 case QEvent::HoverEnter:
3294 case QEvent::HoverMove:
3295 case QEvent::HoverLeave:
3296 return d->handleHoverEvent(item,
static_cast<QHoverEvent *>(event));
3298 case QEvent::MouseButtonPress:
3299 case QEvent::MouseButtonRelease:
3300 return d->handleMouseEvent(item,
static_cast<QMouseEvent *>(event));
3307#if QT_CONFIG(quicktemplates2_multitouch)
3308void QQuickPopup::touchEvent(QTouchEvent *event)
3311 event->setAccepted(d->handleTouchEvent(d->popupItem, event));
3314void QQuickPopup::touchUngrabEvent()
3321#if QT_CONFIG(wheelevent)
3322void QQuickPopup::wheelEvent(QWheelEvent *event)
3328void QQuickPopup::contentItemChange(QQuickItem *newItem, QQuickItem *oldItem)
3334void QQuickPopup::contentSizeChange(
const QSizeF &newSize,
const QSizeF &oldSize)
3336 qCDebug(lcQuickPopup) <<
"contentSizeChange called on" <<
this <<
"with newSize" << newSize <<
"oldSize" << oldSize;
3337 if (!qFuzzyCompare(newSize.width(), oldSize.width()))
3338 emit contentWidthChanged();
3339 if (!qFuzzyCompare(newSize.height(), oldSize.height()))
3340 emit contentHeightChanged();
3343void QQuickPopup::fontChange(
const QFont &newFont,
const QFont &oldFont)
3350void QQuickPopup::geometryChange(
const QRectF &newGeometry,
const QRectF &oldGeometry)
3353 qCDebug(lcQuickPopup) <<
"geometryChange called on" <<
this <<
"with newGeometry" << newGeometry <<
"oldGeometry" << oldGeometry;
3354 if (!d->usePopupWindow())
3356 if (!qFuzzyCompare(newGeometry.width(), oldGeometry.width())) {
3357 emit widthChanged();
3358 emit availableWidthChanged();
3360 if (!qFuzzyCompare(newGeometry.height(), oldGeometry.height())) {
3361 emit heightChanged();
3362 emit availableHeightChanged();
3366void QQuickPopup::itemChange(QQuickItem::ItemChange change,
const QQuickItem::ItemChangeData &)
3369 case QQuickItem::ItemActiveFocusHasChanged:
3370 emit activeFocusChanged();
3372 case QQuickItem::ItemOpacityHasChanged:
3373 emit opacityChanged();
3380void QQuickPopup::localeChange(
const QLocale &newLocale,
const QLocale &oldLocale)
3382 Q_UNUSED(newLocale);
3383 Q_UNUSED(oldLocale);
3384 emit localeChanged();
3387void QQuickPopup::marginsChange(
const QMarginsF &newMargins,
const QMarginsF &oldMargins)
3390 Q_UNUSED(newMargins);
3391 Q_UNUSED(oldMargins);
3395void QQuickPopup::paddingChange(
const QMarginsF &newPadding,
const QMarginsF &oldPadding)
3397 const bool tp = !qFuzzyCompare(newPadding.top(), oldPadding.top());
3398 const bool lp = !qFuzzyCompare(newPadding.left(), oldPadding.left());
3399 const bool rp = !qFuzzyCompare(newPadding.right(), oldPadding.right());
3400 const bool bp = !qFuzzyCompare(newPadding.bottom(), oldPadding.bottom());
3403 emit topPaddingChanged();
3405 emit leftPaddingChanged();
3407 emit rightPaddingChanged();
3409 emit bottomPaddingChanged();
3412 emit horizontalPaddingChanged();
3413 emit availableWidthChanged();
3416 emit verticalPaddingChanged();
3417 emit availableHeightChanged();
3421void QQuickPopup::spacingChange(qreal newSpacing, qreal oldSpacing)
3423 Q_UNUSED(newSpacing);
3424 Q_UNUSED(oldSpacing);
3425 emit spacingChanged();
3428void QQuickPopup::insetChange(
const QMarginsF &newInset,
const QMarginsF &oldInset)
3430 if (!qFuzzyCompare(newInset.top(), oldInset.top()))
3431 emit topInsetChanged();
3432 if (!qFuzzyCompare(newInset.left(), oldInset.left()))
3433 emit leftInsetChanged();
3434 if (!qFuzzyCompare(newInset.right(), oldInset.right()))
3435 emit rightInsetChanged();
3436 if (!qFuzzyCompare(newInset.bottom(), oldInset.bottom()))
3437 emit bottomInsetChanged();
3440QFont QQuickPopup::defaultFont()
const
3442 return QQuickTheme::font(QQuickTheme::System);
3445#if QT_CONFIG(accessibility)
3446QAccessible::Role QQuickPopup::effectiveAccessibleRole()
const
3448 auto *attached = qmlAttachedPropertiesObject<QQuickAccessibleAttached>(
this,
false);
3450 auto role = QAccessible::NoRole;
3451 if (
auto *accessibleAttached = qobject_cast<QQuickAccessibleAttached *>(attached))
3452 role = accessibleAttached->role();
3453 if (role == QAccessible::NoRole)
3454 role = accessibleRole();
3459QAccessible::Role QQuickPopup::accessibleRole()
const
3461 return QAccessible::Dialog;
3464void QQuickPopup::accessibilityActiveChanged(
bool active)
3470QString QQuickPopup::accessibleName()
const
3472 Q_D(
const QQuickPopup);
3473 return d->popupItem->accessibleName();
3476void QQuickPopup::maybeSetAccessibleName(
const QString &name)
3479 d->popupItem->maybeSetAccessibleName(name);
3482QVariant QQuickPopup::accessibleProperty(
const char *propertyName)
3484 Q_D(
const QQuickPopup);
3485 return d->popupItem->accessibleProperty(propertyName);
3488bool QQuickPopup::setAccessibleProperty(
const char *propertyName,
const QVariant &value)
3491 return d->popupItem->setAccessibleProperty(propertyName, value);
3494void QQuickPopup::setWindowModality(
const Qt::WindowModality modality)
3497 d->popupWndModality = modality;
3500QQuickItem *QQuickPopup::safeAreaAttachmentItem()
3505QQuickItem *QQuickPopup::attacheeItem()
const
3510QtPrivate::QQuickAttachedPropertyPropagator *QQuickPopup::attachedParent(
3511 const QMetaObject *ourAttachedType)
const
3513 auto *popupWindow = popupItem()->window();
3514 qCDebug(lcAttachedPropertyPropagator).noquote() <<
"- attachee is a popup; checking its window"
3516 auto *object = QtPrivate::QQuickAttachedPropertyPropagator::attachedObject(
3517 ourAttachedType, popupWindow);
3521 if (qobject_cast<QQuickPopupWindow *>(popupWindow)) {
3522 qCDebug(lcAttachedPropertyPropagator).noquote() <<
"- checking its window's transientParent"
3523 << popupWindow->transientParent();
3524 return QtPrivate::QQuickAttachedPropertyPropagator::attachedObject(ourAttachedType,
3525 popupWindow->transientParent());
3533#include "moc_qquickpopup_p.cpp"
Combined button and popup list for selecting options.