aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/templates/qquickapplicationwindow.cpp6
-rw-r--r--src/templates/qquickcontrol.cpp5
-rw-r--r--src/templates/qquickpopup.cpp47
-rw-r--r--src/templates/qquickpopup_p.h8
-rw-r--r--src/templates/qquickpopup_p_p.h1
-rw-r--r--tests/auto/controls/data/tst_popup.qml88
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()
}