aboutsummaryrefslogtreecommitdiffstats
path: root/src/templates/qquickapplicationwindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/templates/qquickapplicationwindow.cpp')
-rw-r--r--src/templates/qquickapplicationwindow.cpp231
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"