11#include <private/qtquicktemplates2-config_p.h>
12#if QT_CONFIG(quicktemplates2_container)
13#include "qquicktabbar_p.h"
14#include "qquickdialogbuttonbox_p.h"
19#include <QtCore/private/qobject_p.h>
20#include <QtCore/qscopedvaluerollback.h>
21#include <QtQml/private/qqmlpropertytopropertybinding_p.h>
22#include <QtQuick/private/qquickitem_p.h>
23#include <QtQuick/private/qquicksafearea_p.h>
24#include <QtQuick/private/qquickitemchangelistener_p.h>
25#include <QtQuick/private/qquickwindowmodule_p_p.h>
29using namespace Qt::StringLiterals;
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
116 | QQuickItemPrivate::Geometry | QQuickItemPrivate::ImplicitWidth | QQuickItemPrivate::ImplicitHeight;
118static void layoutItem(QQuickItem *item, qreal y, qreal width)
124 QQuickItemPrivate *p = QQuickItemPrivate::get(item);
125 if (!p->widthValid()) {
126 item->setWidth(width);
127 p->widthValidFlag =
false;
131void QQuickApplicationWindowPrivate::updateHasBackgroundFlags()
136 QQuickItemPrivate *backgroundPrivate = QQuickItemPrivate::get(background);
137 hasBackgroundWidth = backgroundPrivate->widthValid();
138 hasBackgroundHeight = backgroundPrivate->heightValid();
141void QQuickApplicationWindowPrivate::relayout()
143 Q_Q(QQuickApplicationWindow);
144 if (!componentComplete)
150 QScopedValueRollback<
bool> guard(insideRelayout,
true);
154 auto menuBarHeight = [
this]{
return menuBar && menuBar->isVisible() ? menuBar->height() : 0; };
155 auto headerheight = [
this]{
return header && header->isVisible() ? header->height() : 0; };
156 auto footerHeight = [
this]{
return footer && footer->isVisible() ? footer->height() : 0; };
158 control->setSize(q->size());
160 layoutItem(menuBar, 0, q->width());
161 layoutItem(header, menuBarHeight(), q->width());
162 layoutItem(footer, control->height() - footerHeight(), q->width());
165 if (!hasBackgroundWidth && qFuzzyIsNull(background->x()))
166 background->setWidth(q->width());
167 if (!hasBackgroundHeight && qFuzzyIsNull(background->y()))
168 background->setHeight(q->height());
174 auto *controlSafeArea =
static_cast<QQuickSafeArea*>(qmlAttachedPropertiesObject<QQuickSafeArea>(control));
175 auto *windowSafeArea =
static_cast<QQuickSafeArea*>(qmlAttachedPropertiesObject<QQuickSafeArea>(q));
176 const auto inheritedMargins = windowSafeArea->margins();
177 controlSafeArea->setAdditionalMargins(QMarginsF(
178 0, (menuBarHeight() + headerheight()) - inheritedMargins.top(),
179 0, footerHeight() - inheritedMargins.bottom()));
182void QQuickApplicationWindowPrivate::itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change,
const QRectF &diff)
186 if (!insideRelayout && item == background && change.sizeChange()) {
189 updateHasBackgroundFlags();
195void QQuickApplicationWindowPrivate::itemVisibilityChanged(QQuickItem *item)
201void QQuickApplicationWindowPrivate::itemImplicitWidthChanged(QQuickItem *item)
207void QQuickApplicationWindowPrivate::itemImplicitHeightChanged(QQuickItem *item)
213void QQuickApplicationWindowPrivate::updateFont(
const QFont &f)
215 Q_Q(QQuickApplicationWindow);
216 const bool changed = font != f;
219 QQuickControlPrivate::updateFontRecur(q->QQuickWindow::contentItem(), f);
221 const QList<QQuickPopup *> popups = q->findChildren<QQuickPopup *>();
222 for (QQuickPopup *popup : popups)
223 QQuickControlPrivate::get(
static_cast<QQuickControl *>(popup->popupItem()))->inheritFont(f);
226 emit q->fontChanged();
229void QQuickApplicationWindowPrivate::resolveFont()
231 QFont resolvedFont = font.resolve(QQuickTheme::font(QQuickTheme::System));
232 setFont_helper(resolvedFont);
237 auto *appWindow = qobject_cast<QQuickApplicationWindow *>(window);
238 auto *appWindowPriv = appWindow ? QQuickApplicationWindowPrivate::get(appWindow) :
nullptr;
240 QQuickItem *item = window->activeFocusItem();
244 if (appWindow && item == appWindowPriv->control)
248 item = item->parentItem();
253void QQuickApplicationWindowPrivate::_q_updateActiveFocus()
255 Q_Q(QQuickApplicationWindow);
256 setActiveFocusControl(findActiveFocusControl(q));
259void QQuickApplicationWindowPrivate::setActiveFocusControl(QQuickItem *control)
261 Q_Q(QQuickApplicationWindow);
262 if (activeFocusControl != control) {
263 activeFocusControl = control;
264 emit q->activeFocusControlChanged();
268void QQuickApplicationWindowPrivate::contentData_append(QQmlListProperty<QObject> *prop, QObject *obj)
270 QQuickItemPrivate::data_append(prop, obj);
273 if (QQuickPopup *popup = qobject_cast<QQuickPopup *>(obj))
274 QQuickPopupPrivate::get(popup)->setWindow(
static_cast<QQuickApplicationWindow *>(prop->data));
277void QQuickApplicationWindowPrivate::cancelBackground()
279 Q_Q(QQuickApplicationWindow);
280 quickCancelDeferred(q, backgroundName());
283void QQuickApplicationWindowPrivate::executeBackground(
bool complete)
285 Q_Q(QQuickApplicationWindow);
286 if (background.wasExecuted())
289 if (!background || complete)
290 quickBeginDeferred(q, backgroundName(), background);
292 quickCompleteDeferred(q, backgroundName(), background);
294 updateHasBackgroundFlags();
299QQuickApplicationWindow::QQuickApplicationWindow(QWindow *parent)
300 : QQuickWindowQmlImpl(*(
new QQuickApplicationWindowPrivate), parent)
302 connect(
this, SIGNAL(activeFocusItemChanged()),
this, SLOT(_q_updateActiveFocus()));
305QQuickApplicationWindow::~QQuickApplicationWindow()
307 Q_D(QQuickApplicationWindow);
308 d->setActiveFocusControl(
nullptr);
309 disconnect(
this, SIGNAL(activeFocusItemChanged()),
this, SLOT(_q_updateActiveFocus()));
311 QQuickItemPrivate::get(d->menuBar)->removeItemChangeListener(d, ItemChanges);
313 QQuickItemPrivate::get(d->header)->removeItemChangeListener(d, ItemChanges);
315 QQuickItemPrivate::get(d->footer)->removeItemChangeListener(d, ItemChanges);
318QQuickApplicationWindowAttached *QQuickApplicationWindow::qmlAttachedProperties(QObject *object)
320 return new QQuickApplicationWindowAttached(object);
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341QQuickItem *QQuickApplicationWindow::background()
const
343 QQuickApplicationWindowPrivate *d =
const_cast<QQuickApplicationWindowPrivate *>(d_func());
345 d->executeBackground();
346 return d->background;
349void QQuickApplicationWindow::setBackground(QQuickItem *background)
351 Q_D(QQuickApplicationWindow);
352 if (d->background == background)
355 if (!d->background.isExecuting())
356 d->cancelBackground();
359 d->hasBackgroundWidth =
false;
360 d->hasBackgroundHeight =
false;
362 QQuickControlPrivate::hideOldItem(d->background);
364 d->background = background;
367 background->setParentItem(QQuickWindow::contentItem());
369 if (qFuzzyIsNull(background->z()))
370 background->setZ(-1);
375 if (!d->background.isExecuting()) {
376 d->updateHasBackgroundFlags();
378 if (isComponentComplete())
382 if (!d->background.isExecuting())
383 emit backgroundChanged();
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407QQuickItem *QQuickApplicationWindow::header()
const
409 Q_D(
const QQuickApplicationWindow);
413void QQuickApplicationWindow::setHeader(QQuickItem *header)
415 Q_D(QQuickApplicationWindow);
416 if (d->header == header)
420 QQuickItemPrivate::get(d->header)->removeItemChangeListener(d, ItemChanges);
421 d->header->setParentItem(
nullptr);
425 header->setParentItem(QQuickWindow::contentItem());
426 QQuickItemPrivate *p = QQuickItemPrivate::get(header);
427 p->addItemChangeListener(d, ItemChanges);
428 if (qFuzzyIsNull(header->z()))
430 if (QQuickToolBar *toolBar = qobject_cast<QQuickToolBar *>(header))
431 toolBar->setPosition(QQuickToolBar::Header);
432#if QT_CONFIG(quicktemplates2_container)
433 else if (QQuickTabBar *tabBar = qobject_cast<QQuickTabBar *>(header))
434 tabBar->setPosition(QQuickTabBar::Header);
435 else if (QQuickDialogButtonBox *buttonBox = qobject_cast<QQuickDialogButtonBox *>(header))
436 buttonBox->setPosition(QQuickDialogButtonBox::Header);
439 header->stackBefore(d->control);
441 if (isComponentComplete())
443 emit headerChanged();
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466QQuickItem *QQuickApplicationWindow::footer()
const
468 Q_D(
const QQuickApplicationWindow);
472void QQuickApplicationWindow::setFooter(QQuickItem *footer)
474 Q_D(QQuickApplicationWindow);
475 if (d->footer == footer)
479 QQuickItemPrivate::get(d->footer)->removeItemChangeListener(d, ItemChanges);
480 d->footer->setParentItem(
nullptr);
484 footer->setParentItem(QQuickWindow::contentItem());
485 QQuickItemPrivate *p = QQuickItemPrivate::get(footer);
486 p->addItemChangeListener(d, ItemChanges);
487 if (qFuzzyIsNull(footer->z()))
489 if (QQuickToolBar *toolBar = qobject_cast<QQuickToolBar *>(footer))
490 toolBar->setPosition(QQuickToolBar::Footer);
491#if QT_CONFIG(quicktemplates2_container)
492 else if (QQuickTabBar *tabBar = qobject_cast<QQuickTabBar *>(footer))
493 tabBar->setPosition(QQuickTabBar::Footer);
494 else if (QQuickDialogButtonBox *buttonBox = qobject_cast<QQuickDialogButtonBox *>(footer))
495 buttonBox->setPosition(QQuickDialogButtonBox::Footer);
497 footer->stackAfter(d->control);
500 if (isComponentComplete())
502 emit footerChanged();
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525QQmlListProperty<QObject> QQuickApplicationWindowPrivate::contentData()
527 Q_Q(QQuickApplicationWindow);
528 return QQmlListProperty<QObject>(q->contentItem(), q,
529 QQuickApplicationWindowPrivate::contentData_append,
530 QQuickItemPrivate::data_count,
531 QQuickItemPrivate::data_at,
532 QQuickItemPrivate::data_clear);
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551QQuickItem *QQuickApplicationWindow::contentItem()
const
553 Q_D(
const QQuickApplicationWindow);
554 return d->control->contentItem();
558
559
560
561
562
563
564
565
566
569
570
571
572
573
574
575
576
577
580
581
582
583
584
585
586
587
588
591
592
593
594
595
596
597
598
599
602
603
604
605
606
607
608
609
610
611
612
613
614
615QQuickItem *QQuickApplicationWindow::activeFocusControl()
const
617 Q_D(
const QQuickApplicationWindow);
618 return d->activeFocusControl;
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637QFont QQuickApplicationWindow::font()
const
639 Q_D(
const QQuickApplicationWindow);
643void QQuickApplicationWindow::setFont(
const QFont &font)
645 Q_D(QQuickApplicationWindow);
646 if (d->font.resolveMask() == font.resolveMask() && d->font == font)
649 QFont resolvedFont = font.resolve(QQuickTheme::font(QQuickTheme::System));
650 d->setFont_helper(resolvedFont);
653void QQuickApplicationWindow::resetFont()
659
660
661
662
663
664
665
666
667
668
669
670
671
672QLocale QQuickApplicationWindow::locale()
const
674 Q_D(
const QQuickApplicationWindow);
678void QQuickApplicationWindow::setLocale(
const QLocale &locale)
680 Q_D(QQuickApplicationWindow);
681 if (d->locale == locale)
685 QQuickControlPrivate::updateLocaleRecur(QQuickWindow::contentItem(), locale);
688 const QList<QQuickPopup *> popups = QQuickWindow::contentItem()->findChildren<QQuickPopup *>();
689 for (QQuickPopup *popup : popups)
690 QQuickControlPrivate::get(
static_cast<QQuickControl *>(popup->popupItem()))->updateLocale(locale,
false);
692 emit localeChanged();
695void QQuickApplicationWindow::resetLocale()
697 setLocale(QLocale());
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718QQuickItem *QQuickApplicationWindow::menuBar()
const
720 Q_D(
const QQuickApplicationWindow);
724void QQuickApplicationWindow::setMenuBar(QQuickItem *menuBar)
726 Q_D(QQuickApplicationWindow);
727 if (d->menuBar == menuBar)
731 QQuickItemPrivate::get(d->menuBar)->removeItemChangeListener(d, ItemChanges);
732 d->menuBar->setParentItem(
nullptr);
734 d->menuBar = menuBar;
736 menuBar->setParentItem(QQuickWindow::contentItem());
737 QQuickItemPrivate *p = QQuickItemPrivate::get(menuBar);
738 p->addItemChangeListener(d, ItemChanges);
739 if (qFuzzyIsNull(menuBar->z()))
743 menuBar->stackBefore(header());
745 menuBar->stackBefore(d->control);
747 if (isComponentComplete())
749 emit menuBarChanged();
752bool QQuickApplicationWindow::isComponentComplete()
const
754 Q_D(
const QQuickApplicationWindow);
755 return d->componentComplete;
758void QQuickApplicationWindow::classBegin()
760 Q_D(QQuickApplicationWindow);
761 d->componentComplete =
false;
762 QQuickWindowQmlImpl::classBegin();
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780 d->control =
new QQuickControl(QQuickWindow::contentItem());
781 d->control->setObjectName(
"ApplicationWindowContentControl");
782 auto *contentItem =
new QQuickContentItem(
this, d->control);
789 d->control->setContentItem(contentItem);
791 auto *context = qmlContext(
this);
792 auto installPropertyBinding = [&](QObject *targetObject,
const QString &targetPropertyName,
793 QObject *sourceObject,
const QString &sourcePropertyName) {
794 const QQmlProperty targetProperty(targetObject, targetPropertyName);
795 QQmlAnyBinding binding = QQmlPropertyToPropertyBinding::create(
796 context->engine(), QQmlProperty(sourceObject, sourcePropertyName), targetProperty);
797 binding.installOn(targetProperty);
805 auto *controlSafeArea = qmlAttachedPropertiesObject<QQuickSafeArea>(d->control);
806 installPropertyBinding(
this,
"leftPadding"_L1, controlSafeArea,
"margins.left"_L1);
807 installPropertyBinding(
this,
"topPadding"_L1, controlSafeArea,
"margins.top"_L1);
808 installPropertyBinding(
this,
"rightPadding"_L1, controlSafeArea,
"margins.right"_L1);
809 installPropertyBinding(
this,
"bottomPadding"_L1, controlSafeArea,
"margins.bottom"_L1);
812 auto *windowSafeArea =
static_cast<QQuickSafeArea*>(qmlAttachedPropertiesObject<QQuickSafeArea>(
this));
813 QObject::connect(windowSafeArea, &QQuickSafeArea::marginsChanged,
this, [d]{
818void QQuickApplicationWindow::componentComplete()
820 Q_D(QQuickApplicationWindow);
821 d->componentComplete =
true;
822 QQuickWindow::contentItem()->setObjectName(QQmlMetaType::prettyTypeName(
this));
823 d->executeBackground(
true);
824 QQuickWindowQmlImpl::componentComplete();
828void QQuickApplicationWindow::resizeEvent(QResizeEvent *event)
830 Q_D(QQuickApplicationWindow);
831 QQuickWindowQmlImpl::resizeEvent(event);
838 Q_DECLARE_PUBLIC(QQuickApplicationWindowAttached)
849 Q_Q(QQuickApplicationWindowAttached);
853 QQuickApplicationWindow *oldWindow = qobject_cast<QQuickApplicationWindow *>(window);
854 if (oldWindow && !QQuickApplicationWindowPrivate::get(oldWindow))
858 disconnect(oldWindow, &QQuickApplicationWindow::activeFocusControlChanged,
860 QObject::disconnect(oldWindow, &QQuickApplicationWindow::menuBarChanged,
861 q, &QQuickApplicationWindowAttached::menuBarChanged);
862 QObject::disconnect(oldWindow, &QQuickApplicationWindow::headerChanged,
863 q, &QQuickApplicationWindowAttached::headerChanged);
864 QObject::disconnect(oldWindow, &QQuickApplicationWindow::footerChanged,
865 q, &QQuickApplicationWindowAttached::footerChanged);
867 disconnect(window, &QQuickWindow::activeFocusItemChanged,
871 QQuickApplicationWindow *newWindow = qobject_cast<QQuickApplicationWindow *>(wnd);
873 connect(newWindow, &QQuickApplicationWindow::activeFocusControlChanged,
875 QObject::connect(newWindow, &QQuickApplicationWindow::menuBarChanged,
876 q, &QQuickApplicationWindowAttached::menuBarChanged);
877 QObject::connect(newWindow, &QQuickApplicationWindow::headerChanged,
878 q, &QQuickApplicationWindowAttached::headerChanged);
879 QObject::connect(newWindow, &QQuickApplicationWindow::footerChanged,
880 q, &QQuickApplicationWindowAttached::footerChanged);
882 connect(wnd, &QQuickWindow::activeFocusItemChanged,
887 emit q->windowChanged();
888 emit q->contentItemChanged();
891 if ((oldWindow && oldWindow->menuBar()) || (newWindow && newWindow->menuBar()))
892 emit q->menuBarChanged();
893 if ((oldWindow && oldWindow->header()) || (newWindow && newWindow->header()))
894 emit q->headerChanged();
895 if ((oldWindow && oldWindow->footer()) || (newWindow && newWindow->footer()))
896 emit q->footerChanged();
901 Q_Q(QQuickApplicationWindowAttached);
902 QQuickItem *control =
nullptr;
903 if (QQuickApplicationWindow *appWindow = qobject_cast<QQuickApplicationWindow *>(window))
904 control = appWindow->activeFocusControl();
906 control = findActiveFocusControl(window);
907 if (activeFocusControl == control)
910 activeFocusControl = control;
911 emit q->activeFocusControlChanged();
914QQuickApplicationWindowAttached::QQuickApplicationWindowAttached(QObject *parent)
915 : QObject(*(
new QQuickApplicationWindowAttachedPrivate), parent)
917 Q_D(QQuickApplicationWindowAttached);
918 if (QQuickItem *item = qobject_cast<QQuickItem *>(parent)) {
919 d->windowChange(item->window());
920 QObjectPrivate::connect(item, &QQuickItem::windowChanged, d, &QQuickApplicationWindowAttachedPrivate::windowChange);
922 QQuickItem *p = item;
924 if (QQuickPopup *popup = qobject_cast<QQuickPopup *>(p->parent())) {
925 d->windowChange(popup->window());
926 QObjectPrivate::connect(popup, &QQuickPopup::windowChanged, d, &QQuickApplicationWindowAttachedPrivate::windowChange);
931 }
else if (QQuickPopup *popup = qobject_cast<QQuickPopup *>(parent)) {
932 d->windowChange(popup->window());
933 QObjectPrivate::connect(popup, &QQuickPopup::windowChanged, d, &QQuickApplicationWindowAttachedPrivate::windowChange);
938
939
940
941
942
943
944
945
946QQuickApplicationWindow *QQuickApplicationWindowAttached::window()
const
948 Q_D(
const QQuickApplicationWindowAttached);
949 return qobject_cast<QQuickApplicationWindow *>(d->window);
953
954
955
956
957
958
959
960
961QQuickItem *QQuickApplicationWindowAttached::contentItem()
const
963 Q_D(
const QQuickApplicationWindowAttached);
964 if (QQuickApplicationWindow *window = qobject_cast<QQuickApplicationWindow *>(d->window))
965 return window->contentItem();
970
971
972
973
974
975
976
977
978
979QQuickItem *QQuickApplicationWindowAttached::activeFocusControl()
const
981 Q_D(
const QQuickApplicationWindowAttached);
982 return d->activeFocusControl;
986
987
988
989
990
991
992
993
994
995QQuickItem *QQuickApplicationWindowAttached::header()
const
997 Q_D(
const QQuickApplicationWindowAttached);
998 if (QQuickApplicationWindow *window = qobject_cast<QQuickApplicationWindow *>(d->window))
999 return window->header();
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013QQuickItem *QQuickApplicationWindowAttached::footer()
const
1015 Q_D(
const QQuickApplicationWindowAttached);
1016 if (QQuickApplicationWindow *window = qobject_cast<QQuickApplicationWindow *>(d->window))
1017 return window->footer();
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032QQuickItem *QQuickApplicationWindowAttached::menuBar()
const
1034 Q_D(
const QQuickApplicationWindowAttached);
1035 if (QQuickApplicationWindow *window = qobject_cast<QQuickApplicationWindow *>(d->window))
1036 return window->menuBar();
1042#include "moc_qquickapplicationwindow_p.cpp"
QQuickItem * activeFocusControl
bool isInteractiveControlType(const QQuickItem *item)
Combined button and popup list for selecting options.
static void layoutItem(QQuickItem *item, qreal y, qreal width)
static const QQuickItemPrivate::ChangeTypes ItemChanges
Styled top-level window with support for a header and footer.
static QQuickItem * findActiveFocusControl(QQuickWindow *window)