diff options
author | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-03-17 12:12:36 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-03-18 16:09:57 +0000 |
commit | e1963859d6ade7a3341a48229f1bb64ef3c9ea68 (patch) | |
tree | fec6d8f0408faad8d8e9b7c021737d266de286ab | |
parent | 76dc0b49120b5352526595951ed1275f9001c8f2 (diff) |
Add Popup::locale
Change-Id: I1f07318f3e018debd74e41bc0a1443c45def7bf3
Task-number: QTBUG-50984
Reviewed-by: Mitch Curtis <mitch.curtis@theqtcompany.com>
-rw-r--r-- | src/templates/qquickapplicationwindow.cpp | 6 | ||||
-rw-r--r-- | src/templates/qquickcontrol.cpp | 5 | ||||
-rw-r--r-- | src/templates/qquickpopup.cpp | 47 | ||||
-rw-r--r-- | src/templates/qquickpopup_p.h | 8 | ||||
-rw-r--r-- | src/templates/qquickpopup_p_p.h | 1 | ||||
-rw-r--r-- | tests/auto/controls/data/tst_popup.qml | 88 |
6 files changed, 122 insertions, 33 deletions
diff --git a/src/templates/qquickapplicationwindow.cpp b/src/templates/qquickapplicationwindow.cpp index 93908f3d..0281e3c3 100644 --- a/src/templates/qquickapplicationwindow.cpp +++ b/src/templates/qquickapplicationwindow.cpp @@ -518,6 +518,12 @@ void QQuickApplicationWindow::setLocale(const QLocale &locale) d->locale = locale; QQuickControlPrivate::updateLocaleRecur(QQuickWindow::contentItem(), locale); + + // TODO: internal QQuickPopupManager that provides reliable access to all QQuickPopup instances + const QList<QQuickPopup *> popups = QQuickWindow::contentItem()->findChildren<QQuickPopup *>(); + for (QQuickPopup *popup : popups) + QQuickControlPrivate::get(static_cast<QQuickControl *>(popup->popupItem()))->updateLocale(locale, false); // explicit=false + emit localeChanged(); } diff --git a/src/templates/qquickcontrol.cpp b/src/templates/qquickcontrol.cpp index 96036d33..71e783e7 100644 --- a/src/templates/qquickcontrol.cpp +++ b/src/templates/qquickcontrol.cpp @@ -672,11 +672,6 @@ QLocale QQuickControlPrivate::calcLocale(const QQuickItem *item) { const QQuickItem *p = item; while (p) { - if (const QQuickPopupItem *popup = qobject_cast<const QQuickPopupItem *>(p)) { - item = popup; - break; - } - if (const QQuickControl *control = qobject_cast<const QQuickControl *>(p)) return control->locale(); diff --git a/src/templates/qquickpopup.cpp b/src/templates/qquickpopup.cpp index e5ccb15b..25053967 100644 --- a/src/templates/qquickpopup.cpp +++ b/src/templates/qquickpopup.cpp @@ -409,6 +409,13 @@ void QQuickPopupItem::geometryChanged(const QRectF &newGeometry, const QRectF &o d->popup->geometryChanged(newGeometry, oldGeometry); } +void QQuickPopupItem::localeChange(const QLocale &newLocale, const QLocale &oldLocale) +{ + Q_D(QQuickPopupItem); + QQuickControl::localeChange(newLocale, oldLocale); + d->popup->localeChange(newLocale, oldLocale); +} + void QQuickPopupItem::itemChange(ItemChange change, const ItemChangeData &data) { Q_D(QQuickPopupItem); @@ -1199,6 +1206,31 @@ void QQuickPopup::resetBottomPadding() } /*! + \qmlproperty Locale Qt.labs.controls::Popup::locale + + This property holds the locale of the popup. + + \sa {LayoutMirroring}{LayoutMirroring} +*/ +QLocale QQuickPopup::locale() const +{ + Q_D(const QQuickPopup); + return d->popupItem->locale(); +} + +void QQuickPopup::setLocale(const QLocale &locale) +{ + Q_D(QQuickPopup); + d->popupItem->setLocale(locale); +} + +void QQuickPopup::resetLocale() +{ + Q_D(QQuickPopup); + d->popupItem->resetLocale(); +} + +/*! \qmlproperty font Qt.labs.controls::Popup::font This property holds the font currently set for the popup. @@ -1256,8 +1288,12 @@ void QQuickPopup::setParentItem(QQuickItem *parent) d->parentItem = parent; if (d->positioner.parentItem()) d->positioner.setParentItem(parent); - if (parent) - QQuickControlPrivate::get(d->popupItem)->resolveFont(); + if (parent) { + QQuickControlPrivate *p = QQuickControlPrivate::get(d->popupItem); + p->resolveFont(); + if (QQuickApplicationWindow *window = qobject_cast<QQuickApplicationWindow *>(parent->window())) + p->updateLocale(window->locale(), false); // explicit=false + } emit parentChanged(); } @@ -1742,6 +1778,13 @@ void QQuickPopup::itemChange(QQuickItem::ItemChange change, const QQuickItem::It } } +void QQuickPopup::localeChange(const QLocale &newLocale, const QLocale &oldLocale) +{ + Q_UNUSED(newLocale); + Q_UNUSED(oldLocale); + emit localeChanged(); +} + void QQuickPopup::marginsChange(const QMarginsF &newMargins, const QMarginsF &oldMargins) { Q_D(QQuickPopup); diff --git a/src/templates/qquickpopup_p.h b/src/templates/qquickpopup_p.h index b5703746..33f44210 100644 --- a/src/templates/qquickpopup_p.h +++ b/src/templates/qquickpopup_p.h @@ -51,6 +51,7 @@ #include <QtCore/qobject.h> #include <QtCore/qmargins.h> #include <QtGui/qevent.h> +#include <QtCore/qlocale.h> #include <QtGui/qfont.h> #include <QtQuickTemplates/private/qtquicktemplatesglobal_p.h> #include <QtQml/qqml.h> @@ -93,6 +94,7 @@ class Q_QUICKTEMPLATES_EXPORT QQuickPopup : public QObject, public QQmlParserSta Q_PROPERTY(qreal leftPadding READ leftPadding WRITE setLeftPadding RESET resetLeftPadding NOTIFY leftPaddingChanged FINAL) Q_PROPERTY(qreal rightPadding READ rightPadding WRITE setRightPadding RESET resetRightPadding NOTIFY rightPaddingChanged FINAL) Q_PROPERTY(qreal bottomPadding READ bottomPadding WRITE setBottomPadding RESET resetBottomPadding NOTIFY bottomPaddingChanged FINAL) + Q_PROPERTY(QLocale locale READ locale WRITE setLocale RESET resetLocale NOTIFY localeChanged FINAL) Q_PROPERTY(QFont font READ font WRITE setFont RESET resetFont NOTIFY fontChanged FINAL) Q_PROPERTY(QQuickItem *parent READ parentItem WRITE setParentItem NOTIFY parentChanged FINAL) Q_PROPERTY(QQuickItem *background READ background WRITE setBackground NOTIFY backgroundChanged FINAL) @@ -191,6 +193,10 @@ public: void setBottomPadding(qreal padding); void resetBottomPadding(); + QLocale locale() const; + void setLocale(const QLocale &locale); + void resetLocale(); + QFont font() const; void setFont(const QFont &font); void resetFont(); @@ -291,6 +297,7 @@ Q_SIGNALS: void rightPaddingChanged(); void bottomPaddingChanged(); void fontChanged(); + void localeChanged(); void parentChanged(); void backgroundChanged(); void contentItemChanged(); @@ -333,6 +340,7 @@ protected: virtual void contentItemChange(QQuickItem *newItem, QQuickItem *oldItem); virtual void fontChange(const QFont &newFont, const QFont &oldFont); virtual void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry); + virtual void localeChange(const QLocale &newLocale, const QLocale &oldLocale); virtual void itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &data); virtual void marginsChange(const QMarginsF &newMargins, const QMarginsF &oldMargins); virtual void paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding); diff --git a/src/templates/qquickpopup_p_p.h b/src/templates/qquickpopup_p_p.h index acfe4ffc..5134eec6 100644 --- a/src/templates/qquickpopup_p_p.h +++ b/src/templates/qquickpopup_p_p.h @@ -107,6 +107,7 @@ protected: void contentItemChange(QQuickItem *newItem, QQuickItem *oldItem) override; void fontChange(const QFont &newFont, const QFont &oldFont) override; void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) override; + void localeChange(const QLocale &newLocale, const QLocale &oldLocale) override; void itemChange(ItemChange change, const ItemChangeData &data) override; void paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding) override; diff --git a/tests/auto/controls/data/tst_popup.qml b/tests/auto/controls/data/tst_popup.qml index 95934f54..00ac3979 100644 --- a/tests/auto/controls/data/tst_popup.qml +++ b/tests/auto/controls/data/tst_popup.qml @@ -502,16 +502,20 @@ TestCase { property alias button1: _button1 property alias button2: _button2 y: _button.height + locale: Qt.locale("fi_FI") implicitHeight: Math.min(396, _column.contentHeight) contentItem: Column { id: _column Button { id: _button1 text: "Button 1" + objectName: "1" } Button { id: _button2 text: "Button 2" + locale: Qt.locale("nb_NO") + objectName: "2" } } } @@ -524,26 +528,14 @@ TestCase { // test looking up natural locale from ancestors var control = localeComponent.createObject(applicationWindow.contentItem) verify(control) - verify(control.button) - verify(control.popup) - verify(control.popup.button1) - verify(control.popup.button2) - applicationWindow.visible = true - waitForRendering(control) - - control.popup.open() - verify(control.popup.visible) - - control.ApplicationWindow.window.locale = Qt.locale("fi_FI") - compare(control.ApplicationWindow.window.locale.name, "fi_FI") compare(control.locale.name, "en_US") compare(control.button.locale.name, "nb_NO") + compare(control.popup.locale.name, "fi_FI") compare(control.popup.button1.locale.name, "fi_FI") - compare(control.popup.button2.locale.name, "fi_FI") + compare(control.popup.button2.locale.name, "nb_NO") control.ApplicationWindow.window.locale = undefined - applicationWindow.visible = false control.destroy() } @@ -579,6 +571,10 @@ TestCase { property alias button2: _button2 y: _button.height implicitHeight: Math.min(396, _column.contentHeight) + property SignalSpy localespy: SignalSpy { + target: _popup + signalName: "localeChanged" + } contentItem: Column { id: _column Button { @@ -616,21 +612,12 @@ TestCase { // test default locale and locale inheritance var control = localeChangeComponent.createObject(applicationWindow.contentItem) verify(control) - verify(control.button) - verify(control.popup) - verify(control.popup.button1) - verify(control.popup.button2) - - applicationWindow.visible = true - waitForRendering(control) - - control.popup.open() - verify(control.popup.visible) var defaultLocale = Qt.locale() compare(control.ApplicationWindow.window.locale.name, defaultLocale.name) compare(control.locale.name, defaultLocale.name) compare(control.button.locale.name, defaultLocale.name) + compare(control.popup.locale.name, defaultLocale.name) compare(control.popup.button1.locale.name, defaultLocale.name) compare(control.popup.button2.locale.name, defaultLocale.name) @@ -638,10 +625,12 @@ TestCase { compare(control.ApplicationWindow.window.locale.name, "nb_NO") compare(control.locale.name, "nb_NO") compare(control.button.locale.name, "nb_NO") + compare(control.popup.locale.name, "nb_NO") compare(control.popup.button1.locale.name, "nb_NO") compare(control.popup.button2.locale.name, "nb_NO") compare(control.localespy.count, 1) compare(control.button.localespy.count, 1) + compare(control.popup.localespy.count, 1) compare(control.popup.button1.localespy.count, 1) compare(control.popup.button2.localespy.count, 1) @@ -649,10 +638,12 @@ TestCase { compare(control.ApplicationWindow.window.locale.name, defaultLocale.name) compare(control.locale.name, defaultLocale.name) compare(control.button.locale.name, defaultLocale.name) + compare(control.popup.locale.name, defaultLocale.name) compare(control.popup.button1.locale.name, defaultLocale.name) compare(control.popup.button2.locale.name, defaultLocale.name) compare(control.localespy.count, 2) compare(control.button.localespy.count, 2) + compare(control.popup.localespy.count, 2) compare(control.popup.button1.localespy.count, 2) compare(control.popup.button2.localespy.count, 2) @@ -660,12 +651,14 @@ TestCase { compare(control.ApplicationWindow.window.locale.name, defaultLocale.name) compare(control.locale.name, "ar_EG") compare(control.button.locale.name, "ar_EG") + compare(control.popup.locale.name, defaultLocale.name) compare(control.popup.button1.locale.name, defaultLocale.name) compare(control.popup.button2.locale.name, defaultLocale.name) compare(control.localespy.count, 3) compare(control.mirrorspy.count, 1) compare(control.button.localespy.count, 3) compare(control.button.mirrorspy.count, 1) + compare(control.popup.localespy.count, 2) compare(control.popup.button1.localespy.count, 2) compare(control.popup.button2.localespy.count, 2) @@ -673,12 +666,14 @@ TestCase { compare(control.ApplicationWindow.window.locale.name, "ar_EG") compare(control.locale.name, "ar_EG") compare(control.button.locale.name, "ar_EG") + compare(control.popup.locale.name, "ar_EG") compare(control.popup.button1.locale.name, "ar_EG") compare(control.popup.button2.locale.name, "ar_EG") compare(control.localespy.count, 3) compare(control.mirrorspy.count, 1) compare(control.button.localespy.count, 3) compare(control.button.mirrorspy.count, 1) + compare(control.popup.localespy.count, 3) compare(control.popup.button1.localespy.count, 3) compare(control.popup.button1.mirrorspy.count, 1) compare(control.popup.button2.localespy.count, 3) @@ -688,12 +683,14 @@ TestCase { compare(control.ApplicationWindow.window.locale.name, "ar_EG") compare(control.locale.name, "ar_EG") compare(control.button.locale.name, "nb_NO") + compare(control.popup.locale.name, "ar_EG") compare(control.popup.button1.locale.name, "ar_EG") compare(control.popup.button2.locale.name, "ar_EG") compare(control.localespy.count, 3) compare(control.mirrorspy.count, 1) compare(control.button.localespy.count, 4) compare(control.button.mirrorspy.count, 2) + compare(control.popup.localespy.count, 3) compare(control.popup.button1.localespy.count, 3) compare(control.popup.button2.localespy.count, 3) @@ -701,12 +698,14 @@ TestCase { compare(control.ApplicationWindow.window.locale.name, "ar_EG") compare(control.locale.name, "ar_EG") compare(control.button.locale.name, "nb_NO") + compare(control.popup.locale.name, "ar_EG") compare(control.popup.button1.locale.name, "ar_EG") compare(control.popup.button2.locale.name, "ar_EG") compare(control.localespy.count, 3) compare(control.mirrorspy.count, 1) compare(control.button.localespy.count, 4) compare(control.button.mirrorspy.count, 2) + compare(control.popup.localespy.count, 3) compare(control.popup.button1.localespy.count, 3) compare(control.popup.button2.localespy.count, 3) @@ -714,33 +713,70 @@ TestCase { compare(control.ApplicationWindow.window.locale.name, "ar_EG") compare(control.locale.name, "ar_EG") compare(control.button.locale.name, "nb_NO") + compare(control.popup.locale.name, "ar_EG") compare(control.popup.button1.locale.name, "nb_NO") compare(control.popup.button2.locale.name, "ar_EG") compare(control.localespy.count, 3) compare(control.mirrorspy.count, 1) compare(control.button.localespy.count, 4) compare(control.button.mirrorspy.count, 2) + compare(control.popup.localespy.count, 3) compare(control.popup.button1.localespy.count, 4) compare(control.popup.button1.mirrorspy.count, 2) compare(control.popup.button2.localespy.count, 3) compare(control.popup.button2.mirrorspy.count, 1) + control.popup.locale = Qt.locale("fi_FI") + compare(control.ApplicationWindow.window.locale.name, "ar_EG") + compare(control.locale.name, "ar_EG") + compare(control.button.locale.name, "nb_NO") + compare(control.popup.locale.name, "fi_FI") + compare(control.popup.button1.locale.name, "nb_NO") + compare(control.popup.button2.locale.name, "fi_FI") + compare(control.localespy.count, 3) + compare(control.mirrorspy.count, 1) + compare(control.button.localespy.count, 4) + compare(control.button.mirrorspy.count, 2) + compare(control.popup.localespy.count, 4) + compare(control.popup.button1.localespy.count, 4) + compare(control.popup.button1.mirrorspy.count, 2) + compare(control.popup.button2.localespy.count, 4) + compare(control.popup.button2.mirrorspy.count, 2) + control.ApplicationWindow.window.locale = undefined compare(control.ApplicationWindow.window.locale.name, defaultLocale.name) compare(control.locale.name, defaultLocale.name) compare(control.button.locale.name, "nb_NO") + compare(control.popup.locale.name, "fi_FI") compare(control.popup.button1.locale.name, "nb_NO") - compare(control.popup.button2.locale.name, defaultLocale.name) + compare(control.popup.button2.locale.name, "fi_FI") compare(control.localespy.count, 4) compare(control.mirrorspy.count, 2) compare(control.button.localespy.count, 4) compare(control.button.mirrorspy.count, 2) + compare(control.popup.localespy.count, 4) compare(control.popup.button1.localespy.count, 4) compare(control.popup.button1.mirrorspy.count, 2) compare(control.popup.button2.localespy.count, 4) compare(control.popup.button2.mirrorspy.count, 2) - applicationWindow.visible = false + control.popup.locale = undefined + compare(control.ApplicationWindow.window.locale.name, defaultLocale.name) + compare(control.locale.name, defaultLocale.name) + compare(control.button.locale.name, "nb_NO") + compare(control.popup.locale.name, defaultLocale.name) + compare(control.popup.button1.locale.name, "nb_NO") + compare(control.popup.button2.locale.name, defaultLocale.name) + compare(control.localespy.count, 4) + compare(control.mirrorspy.count, 2) + compare(control.button.localespy.count, 4) + compare(control.button.mirrorspy.count, 2) + compare(control.popup.localespy.count, 5) + compare(control.popup.button1.localespy.count, 4) + compare(control.popup.button1.mirrorspy.count, 2) + compare(control.popup.button2.localespy.count, 5) + compare(control.popup.button2.mirrorspy.count, 2) + control.destroy() } |