diff options
Diffstat (limited to 'src/templates/qquickapplicationwindow.cpp')
-rw-r--r-- | src/templates/qquickapplicationwindow.cpp | 231 |
1 files changed, 213 insertions, 18 deletions
diff --git a/src/templates/qquickapplicationwindow.cpp b/src/templates/qquickapplicationwindow.cpp index 2c4cd7c9..46f07d3e 100644 --- a/src/templates/qquickapplicationwindow.cpp +++ b/src/templates/qquickapplicationwindow.cpp @@ -36,6 +36,9 @@ #include "qquickapplicationwindow_p.h" #include "qquickoverlay_p.h" +#include "qquickcontrol_p_p.h" +#include "qquicktextarea_p.h" +#include "qquicktextfield_p.h" #include <QtCore/private/qobject_p.h> #include <QtQuick/private/qquickitem_p.h> @@ -56,6 +59,26 @@ QT_BEGIN_NAMESPACE \image qtlabscontrols-applicationwindow-wireframe.png + \qml + import Qt.labs.controls 1.0 + + ApplicationWindow { + visible: true + + header: ToolBar { + // ... + } + + footer: TabBar { + // ... + } + + StackView { + anchors.fill: parent + } + } + \endqml + \note By default, an ApplicationWindow is not visible. \sa {Container Controls} @@ -72,6 +95,7 @@ public: , header(Q_NULLPTR) , footer(Q_NULLPTR) , overlay(Q_NULLPTR) + , activeFocusControl(Q_NULLPTR) { } void relayout(); @@ -79,11 +103,25 @@ public: void itemImplicitWidthChanged(QQuickItem *item) Q_DECL_OVERRIDE; void itemImplicitHeightChanged(QQuickItem *item) Q_DECL_OVERRIDE; + void updateFont(const QFont &); + inline void setFont_helper(const QFont &f) { + if (font.resolve() == f.resolve() && font == f) + return; + updateFont(f); + } + void resolveFont(); + + void _q_updateActiveFocus(); + void setActiveFocusControl(QQuickItem *item); + bool complete; QQuickItem *contentItem; QQuickItem *header; QQuickItem *footer; QQuickOverlay *overlay; + QFont font; + QLocale locale; + QQuickItem *activeFocusControl; QQuickApplicationWindow *q_ptr; }; @@ -135,10 +173,44 @@ void QQuickApplicationWindowPrivate::itemImplicitHeightChanged(QQuickItem *item) relayout(); } +void QQuickApplicationWindowPrivate::_q_updateActiveFocus() +{ + Q_Q(QQuickApplicationWindow); + QQuickItem *item = q->activeFocusItem(); + while (item) { + QQuickControl *control = qobject_cast<QQuickControl *>(item); + if (control) { + setActiveFocusControl(control); + break; + } + QQuickTextField *textField = qobject_cast<QQuickTextField *>(item); + if (textField) { + setActiveFocusControl(textField); + break; + } + QQuickTextArea *textArea = qobject_cast<QQuickTextArea *>(item); + if (textArea) { + setActiveFocusControl(textArea); + break; + } + item = item->parentItem(); + } +} + +void QQuickApplicationWindowPrivate::setActiveFocusControl(QQuickItem *control) +{ + Q_Q(QQuickApplicationWindow); + if (activeFocusControl != control) { + activeFocusControl = control; + emit q->activeFocusControlChanged(); + } +} + QQuickApplicationWindow::QQuickApplicationWindow(QWindow *parent) : QQuickWindowQmlImpl(parent), d_ptr(new QQuickApplicationWindowPrivate) { d_ptr->q_ptr = this; + connect(this, SIGNAL(activeFocusItemChanged()), this, SLOT(_q_updateActiveFocus())); } QQuickApplicationWindow::~QQuickApplicationWindow() @@ -153,8 +225,8 @@ QQuickApplicationWindow::~QQuickApplicationWindow() /*! \qmlproperty Item Qt.labs.controls::ApplicationWindow::header - A header item for the window, for example a title bar, menu or tool-bar. - By default this property is empty, no header will be shown. + This property holds the window header item. The header item is positioned to + the top, and resized to the width of the window. The default value is \c null. \sa footer */ @@ -186,8 +258,8 @@ void QQuickApplicationWindow::setHeader(QQuickItem *header) /*! \qmlproperty Item Qt.labs.controls::ApplicationWindow::footer - A footer item for the window, for example a status bar or menu. - By default this property is empty, no footer will be shown. + This property holds the window footer item. The footer item is positioned to + the bottom, and resized to the width of the window. The default value is \c null. \sa header */ @@ -216,11 +288,26 @@ void QQuickApplicationWindow::setFooter(QQuickItem *footer) } } +/*! + \qmlproperty list<Object> Qt.labs.controls::ApplicationWindow::contentData + \default + + This default property holds the list of all objects declared as children of + the window. + + \sa contentItem +*/ QQmlListProperty<QObject> QQuickApplicationWindow::contentData() { return QQuickItemPrivate::get(contentItem())->data(); } +/*! + \qmlproperty Item Qt.labs.controls::ApplicationWindow::contentItem + \readonly + + This property holds the window content item. +*/ QQuickItem *QQuickApplicationWindow::contentItem() const { QQuickApplicationWindowPrivate *d = const_cast<QQuickApplicationWindowPrivate *>(d_func()); @@ -231,7 +318,37 @@ QQuickItem *QQuickApplicationWindow::contentItem() const return d->contentItem; } -QQuickItem *QQuickApplicationWindow::overlay() const +/*! + \qmlproperty Control Qt.labs.controls::ApplicationWindow::activeFocusControl + + This property holds the control that currently has active focus, or \c null if there is + no control with active focus. + + The difference between \l Window::activeFocusItem and ApplicationWindow::activeFocusControl + is that the former may point to a building block of a control, whereas the latter points + to the enclosing control. For example, when SpinBox has focus, activeFocusItem points to + the editor and acticeFocusControl to the SpinBox itself. + + \sa Window::activeFocusItem +*/ +QQuickItem *QQuickApplicationWindow::activeFocusControl() const +{ + Q_D(const QQuickApplicationWindow); + return d->activeFocusControl; +} + +/*! + \qmlpropertygroup Qt.labs.controls::ApplicationWindow::overlay + \qmlproperty Item Qt.labs.controls::ApplicationWindow::overlay + \qmlproperty Item Qt.labs.controls::ApplicationWindow::overlay.background + + This property holds the window overlay item and its background that implements the + background dimming when any modal popups are open. Popups are automatically + reparented to the overlay. + + \sa Popup +*/ +QQuickOverlay *QQuickApplicationWindow::overlay() const { QQuickApplicationWindowPrivate *d = const_cast<QQuickApplicationWindowPrivate *>(d_func()); if (!d->overlay) { @@ -241,6 +358,81 @@ QQuickItem *QQuickApplicationWindow::overlay() const return d->overlay; } +/*! + \qmlproperty font Qt.labs.controls::ApplicationWindow::font + + This property holds the font currently set for the window. + + The default font depends on the system environment. QGuiApplication maintains a system/theme + font which serves as a default for all application windows. You can also set the default font + for windows by passing a custom font to QGuiApplication::setFont(), before loading any QML. + Finally, the font is matched against Qt's font database to find the best match. + + ApplicationWindow propagates explicit font properties to child controls. If you change a specific + property on the window's font, that property propagates to all child controls in the window, + overriding any system defaults for that property. + + \sa Control::font +*/ +QFont QQuickApplicationWindow::font() const +{ + Q_D(const QQuickApplicationWindow); + return d->font; +} + +void QQuickApplicationWindow::setFont(const QFont &f) +{ + Q_D(QQuickApplicationWindow); + if (d->font == f) + return; + + QFont resolvedFont = f.resolve(QQuickControlPrivate::themeFont(QPlatformTheme::SystemFont)); + d->setFont_helper(resolvedFont); +} + +void QQuickApplicationWindow::resetFont() +{ + setFont(QFont()); +} + +void QQuickApplicationWindowPrivate::resolveFont() +{ + QFont resolvedFont = font.resolve(QQuickControlPrivate::themeFont(QPlatformTheme::SystemFont)); + setFont_helper(resolvedFont); +} + +void QQuickApplicationWindowPrivate::updateFont(const QFont &f) +{ + Q_Q(QQuickApplicationWindow); + font = f; + + QQuickControlPrivate::updateFontRecur(q->contentItem(), f); + + emit q->fontChanged(); +} + +QLocale QQuickApplicationWindow::locale() const +{ + Q_D(const QQuickApplicationWindow); + return d->locale; +} + +void QQuickApplicationWindow::setLocale(const QLocale &locale) +{ + Q_D(QQuickApplicationWindow); + if (d->locale == locale) + return; + + d->locale = locale; + QQuickControlPrivate::updateLocaleRecur(contentItem(), locale); + emit localeChanged(); +} + +void QQuickApplicationWindow::resetLocale() +{ + setLocale(QLocale()); +} + QQuickApplicationWindowAttached *QQuickApplicationWindow::qmlAttachedProperties(QObject *object) { return new QQuickApplicationWindowAttached(object); @@ -285,16 +477,16 @@ void QQuickApplicationWindowAttachedPrivate::windowChange(QQuickWindow *wnd) if (window != newWindow) { QQuickApplicationWindow *oldWindow = window; if (oldWindow) { - QObject::disconnect(oldWindow, &QQuickApplicationWindow::activeFocusItemChanged, - q, &QQuickApplicationWindowAttached::activeFocusItemChanged); + QObject::disconnect(oldWindow, &QQuickApplicationWindow::activeFocusControlChanged, + q, &QQuickApplicationWindowAttached::activeFocusControlChanged); QObject::disconnect(oldWindow, &QQuickApplicationWindow::headerChanged, q, &QQuickApplicationWindowAttached::headerChanged); QObject::disconnect(oldWindow, &QQuickApplicationWindow::footerChanged, q, &QQuickApplicationWindowAttached::footerChanged); } if (newWindow) { - QObject::connect(newWindow, &QQuickApplicationWindow::activeFocusItemChanged, - q, &QQuickApplicationWindowAttached::activeFocusItemChanged); + QObject::connect(newWindow, &QQuickApplicationWindow::activeFocusControlChanged, + q, &QQuickApplicationWindowAttached::activeFocusControlChanged); QObject::connect(newWindow, &QQuickApplicationWindow::headerChanged, q, &QQuickApplicationWindowAttached::headerChanged); QObject::connect(newWindow, &QQuickApplicationWindow::footerChanged, @@ -306,8 +498,8 @@ void QQuickApplicationWindowAttachedPrivate::windowChange(QQuickWindow *wnd) emit q->contentItemChanged(); emit q->overlayChanged(); - if ((oldWindow && oldWindow->activeFocusItem()) || (newWindow && newWindow->activeFocusItem())) - emit q->activeFocusItemChanged(); + if ((oldWindow && oldWindow->activeFocusControl()) || (newWindow && newWindow->activeFocusControl())) + emit q->activeFocusControlChanged(); if ((oldWindow && oldWindow->header()) || (newWindow && newWindow->header())) emit q->headerChanged(); if ((oldWindow && oldWindow->footer()) || (newWindow && newWindow->footer())) @@ -351,18 +543,19 @@ QQuickItem *QQuickApplicationWindowAttached::contentItem() const } /*! - \qmlattachedproperty Item Qt.labs.controls::ApplicationWindow::activeFocusItem + \qmlattachedproperty Control Qt.labs.controls::ApplicationWindow::activeFocusControl - This attached property holds the active focus item. The property can be attached - to any item. The value is \c null if the item is not in an ApplicationWindow, or - the window has no active focus. + This attached property holds the control that currently has active focus, or \c null + if there is no control with active focus. The property can be attached to any item. + The value is \c null if the item is not in an ApplicationWindow, or the window has + no active focus. \sa Window::activeFocusItem */ -QQuickItem *QQuickApplicationWindowAttached::activeFocusItem() const +QQuickItem *QQuickApplicationWindowAttached::activeFocusControl() const { Q_D(const QQuickApplicationWindowAttached); - return d->window ? d->window->activeFocusItem() : Q_NULLPTR; + return d->window ? d->window->activeFocusControl() : Q_NULLPTR; } /*! @@ -397,10 +590,12 @@ QQuickItem *QQuickApplicationWindowAttached::footer() const This attached property holds the window overlay item. The property can be attached to any item. The value is \c null if the item is not in an ApplicationWindow. */ -QQuickItem *QQuickApplicationWindowAttached::overlay() const +QQuickOverlay *QQuickApplicationWindowAttached::overlay() const { Q_D(const QQuickApplicationWindowAttached); return d->window ? d->window->overlay() : Q_NULLPTR; } QT_END_NAMESPACE + +#include "moc_qquickapplicationwindow_p.cpp" |