aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@theqtcompany.com>2016-02-20 07:30:41 +0100
committerJ-P Nurmi <jpnurmi@theqtcompany.com>2016-02-20 07:36:55 +0100
commit7116f3959c9ade06397de9df66d66667a1a703fe (patch)
tree2b5eae5581d1d8750ece6195f9d7b337ccc32130 /src
parentd475ba88cc7e0875cfc30371867d7b82f006770f (diff)
parent20b60be518f05611fb11a98b57e73f6bb6c8b46e (diff)
Merge remote-tracking branch 'origin/5.6' into 5.7
Conflicts: src/templates/qquickapplicationwindow.cpp src/templates/qquickcontrol_p.h src/templates/qquickpage.cpp src/templates/qquickpopup.cpp src/templates/qquickpopup_p_p.h Change-Id: I265e0267afb22e3d3f80801191f1a810cd2be312
Diffstat (limited to 'src')
-rw-r--r--src/imports/controls/material/ComboBox.qml2
-rw-r--r--src/imports/controls/material/MenuItem.qml2
-rw-r--r--src/imports/controls/material/qquickmaterialtheme.cpp30
-rw-r--r--src/imports/controls/material/qquickmaterialtheme_p.h5
-rw-r--r--src/templates/qquickapplicationwindow.cpp12
-rw-r--r--src/templates/qquickcontrol.cpp55
-rw-r--r--src/templates/qquickcontrol_p.h1
-rw-r--r--src/templates/qquickcontrol_p_p.h3
-rw-r--r--src/templates/qquickmenu.cpp1
-rw-r--r--src/templates/qquickmenu_p_p.h1
-rw-r--r--src/templates/qquickpage.cpp8
-rw-r--r--src/templates/qquickpopup.cpp277
-rw-r--r--src/templates/qquickpopup_p_p.h24
13 files changed, 201 insertions, 220 deletions
diff --git a/src/imports/controls/material/ComboBox.qml b/src/imports/controls/material/ComboBox.qml
index b87034c5..5529c546 100644
--- a/src/imports/controls/material/ComboBox.qml
+++ b/src/imports/controls/material/ComboBox.qml
@@ -54,7 +54,7 @@ T.ComboBox {
padding: 12
//! [delegate]
- delegate: ItemDelegate {
+ delegate: MenuItem {
width: control.width
text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData
highlighted: control.highlightedIndex === index
diff --git a/src/imports/controls/material/MenuItem.qml b/src/imports/controls/material/MenuItem.qml
index c09e9912..e2042894 100644
--- a/src/imports/controls/material/MenuItem.qml
+++ b/src/imports/controls/material/MenuItem.qml
@@ -146,7 +146,7 @@ T.MenuItem {
background: Rectangle {
implicitWidth: 200
visible: control.pressed || control.highlighted
- color: control.pressed ? control.Material.flatButtonPressColor : control.Material.backgroundColor
+ color: control.pressed ? control.Material.flatButtonPressColor : control.Material.listHighlightColor
}
//! [background]
}
diff --git a/src/imports/controls/material/qquickmaterialtheme.cpp b/src/imports/controls/material/qquickmaterialtheme.cpp
index 4124735a..c373c61b 100644
--- a/src/imports/controls/material/qquickmaterialtheme.cpp
+++ b/src/imports/controls/material/qquickmaterialtheme.cpp
@@ -50,11 +50,23 @@ QQuickMaterialTheme::QQuickMaterialTheme(QPlatformTheme *theme)
if (font.exactMatch()) {
systemFont.setFamily(font.family());
- tabButtonFont.setFamily(font.family());
+ buttonFont.setFamily(font.family());
+ toolButtonFont.setFamily(font.family());
+ itemViewFont.setFamily(font.family());
+ menuItemFont.setFamily(font.family());
}
- tabButtonFont.setPixelSize(14);
- tabButtonFont.setCapitalization(QFont::AllUppercase);
+ buttonFont.setPixelSize(14);
+ buttonFont.setCapitalization(QFont::AllUppercase);
+ buttonFont.setWeight(QFont::Medium);
+
+ toolButtonFont.setPixelSize(14);
+ toolButtonFont.setCapitalization(QFont::AllUppercase);
+
+ itemViewFont.setPixelSize(14);
+ itemViewFont.setWeight(QFont::Medium);
+
+ menuItemFont.setPixelSize(16);
}
QQuickMaterialTheme::~QQuickMaterialTheme()
@@ -65,7 +77,17 @@ const QFont *QQuickMaterialTheme::font(QPlatformTheme::Font type) const
{
switch (type) {
case QPlatformTheme::TabButtonFont:
- return &tabButtonFont;
+ case QPlatformTheme::PushButtonFont:
+ return &buttonFont;
+ case QPlatformTheme::ToolButtonFont:
+ return &toolButtonFont;
+ case QPlatformTheme::ItemViewFont:
+ return &itemViewFont;
+ case QPlatformTheme::MenuItemFont:
+ case QPlatformTheme::ComboMenuItemFont:
+ case QPlatformTheme::CheckBoxFont:
+ case QPlatformTheme::RadioButtonFont:
+ return &menuItemFont;
default:
return &systemFont;
}
diff --git a/src/imports/controls/material/qquickmaterialtheme_p.h b/src/imports/controls/material/qquickmaterialtheme_p.h
index e144233c..27ffdddc 100644
--- a/src/imports/controls/material/qquickmaterialtheme_p.h
+++ b/src/imports/controls/material/qquickmaterialtheme_p.h
@@ -65,7 +65,10 @@ public:
private:
QFont systemFont;
- QFont tabButtonFont;
+ QFont buttonFont;
+ QFont toolButtonFont;
+ QFont itemViewFont;
+ QFont menuItemFont;
};
QT_END_NAMESPACE
diff --git a/src/templates/qquickapplicationwindow.cpp b/src/templates/qquickapplicationwindow.cpp
index 12d8133d..7756a7bf 100644
--- a/src/templates/qquickapplicationwindow.cpp
+++ b/src/templates/qquickapplicationwindow.cpp
@@ -81,6 +81,10 @@ QT_BEGIN_NAMESPACE
}
\endqml
+ ApplicationWindow supports popups via its \l overlay property, which
+ ensures that popups are displayed above other content and that the
+ background is dimmed when a modal popup is visible.
+
\note By default, an ApplicationWindow is not visible.
\labs
@@ -249,8 +253,10 @@ void QQuickApplicationWindow::setHeader(QQuickItem *header)
if (d->header == header)
return;
- if (d->header)
+ if (d->header) {
QQuickItemPrivate::get(d->header)->removeItemChangeListener(d, QQuickItemPrivate::ImplicitWidth | QQuickItemPrivate::ImplicitHeight);
+ d->header->setParentItem(nullptr);
+ }
d->header = header;
if (header) {
header->setParentItem(contentItem());
@@ -291,8 +297,10 @@ void QQuickApplicationWindow::setFooter(QQuickItem *footer)
if (d->footer == footer)
return;
- if (d->footer)
+ if (d->footer) {
QQuickItemPrivate::get(d->footer)->removeItemChangeListener(d, QQuickItemPrivate::ImplicitWidth | QQuickItemPrivate::ImplicitHeight);
+ d->footer->setParentItem(nullptr);
+ }
d->footer = footer;
if (footer) {
footer->setParentItem(contentItem());
diff --git a/src/templates/qquickcontrol.cpp b/src/templates/qquickcontrol.cpp
index 5bf42da0..6ec9b4a4 100644
--- a/src/templates/qquickcontrol.cpp
+++ b/src/templates/qquickcontrol.cpp
@@ -44,6 +44,8 @@
#include "qquicktextarea_p_p.h"
#include "qquicktextfield_p.h"
#include "qquicktextfield_p_p.h"
+#include "qquickpopup_p.h"
+#include "qquickpopup_p_p.h"
#include "qquickapplicationwindow_p.h"
#include <QtGui/private/qguiapplication_p.h>
@@ -223,7 +225,12 @@ QFont QQuickControlPrivate::naturalControlFont(const QQuickItem *q)
QQuickItem *p = q->parentItem();
bool found = false;
while (p) {
- if (QQuickControl *qc = qobject_cast<QQuickControl *>(p)) {
+ if (QQuickPopupItem *qpi = qobject_cast<QQuickPopupItem *>(p)) {
+ if (const QQuickPopup *qp = qobject_cast<const QQuickPopup *>(qpi->parent())) {
+ p = qp->parentItem();
+ continue;
+ }
+ } else if (QQuickControl *qc = qobject_cast<QQuickControl *>(p)) {
naturalFont = qc->font();
found = true;
break;
@@ -297,6 +304,13 @@ void QQuickControlPrivate::updateFontRecur(QQuickItem *item, const QFont &f)
else
QQuickControlPrivate::updateFontRecur(child, f);
}
+
+ foreach (QObject *child, item->children()) {
+ if (QQuickPopup *qp = qobject_cast<QQuickPopup *>(child)) {
+ if (QQuickPopupItem *qpi = qobject_cast<QQuickPopupItem *>(qp->popupItem()))
+ QQuickControlPrivate::updateFontRecur(qpi, f);
+ }
+ }
}
QString QQuickControl::accessibleName() const
@@ -353,13 +367,6 @@ QQuickControl::QQuickControl(QQuickControlPrivate &dd, QQuickItem *parent) :
{
}
-void QQuickControl::classBegin()
-{
- Q_D(QQuickControl);
- QQuickItem::classBegin();
- d->resolveFont();
-}
-
void QQuickControl::itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &value)
{
Q_D(QQuickControl);
@@ -367,7 +374,7 @@ void QQuickControl::itemChange(QQuickItem::ItemChange change, const QQuickItem::
if (change == ItemParentHasChanged && isComponentComplete()) {
d->resolveFont();
if (!d->hasLocale)
- d->locale = d->calcLocale();
+ d->locale = QQuickControlPrivate::calcLocale(d->parentItem);
}
}
@@ -646,14 +653,20 @@ void QQuickControl::resetLocale()
if (!d->hasLocale)
return;
- d->updateLocale(d->calcLocale(), false); // explicit=false
+ d->updateLocale(QQuickControlPrivate::calcLocale(d->parentItem), false); // explicit=false
}
-QLocale QQuickControlPrivate::calcLocale() const
+QLocale QQuickControlPrivate::calcLocale(QQuickItem *q)
{
- Q_Q(const QQuickControl);
- QQuickItem *p = q->parentItem();
+ QQuickItem *p = q;
while (p) {
+ if (QQuickPopupItem *qpi = qobject_cast<QQuickPopupItem *>(p)) {
+ if (const QQuickPopup *qp = qobject_cast<const QQuickPopup *>(qpi->parent())) {
+ p = qp->parentItem();
+ continue;
+ }
+ }
+
if (QQuickControl *qc = qobject_cast<QQuickControl *>(p))
return qc->locale();
@@ -664,8 +677,10 @@ QLocale QQuickControlPrivate::calcLocale() const
p = p->parentItem();
}
- if (QQuickApplicationWindow *w = qobject_cast<QQuickApplicationWindow *>(q->window()))
- return w->locale();
+ if (q) {
+ if (QQuickApplicationWindow *w = qobject_cast<QQuickApplicationWindow *>(q->window()))
+ return w->locale();
+ }
return QLocale();
}
@@ -698,6 +713,13 @@ void QQuickControlPrivate::updateLocaleRecur(QQuickItem *item, const QLocale &l)
else
updateLocaleRecur(child, l);
}
+
+ foreach (QObject *child, item->children()) {
+ if (QQuickPopup *qp = qobject_cast<QQuickPopup *>(child)) {
+ if (QQuickPopupItem *qpi = qobject_cast<QQuickPopupItem *>(qp->popupItem()))
+ updateLocaleRecur(qpi, l);
+ }
+ }
}
/*!
@@ -821,6 +843,9 @@ void QQuickControl::componentComplete()
{
Q_D(QQuickControl);
QQuickItem::componentComplete();
+ d->resolveFont();
+ if (!d->hasLocale)
+ d->locale = QQuickControlPrivate::calcLocale(d->parentItem);
#ifndef QT_NO_ACCESSIBILITY
if (!d->accessibleAttached && QAccessible::isActive())
accessibilityActiveChanged(true);
diff --git a/src/templates/qquickcontrol_p.h b/src/templates/qquickcontrol_p.h
index 648a140b..c658ff74 100644
--- a/src/templates/qquickcontrol_p.h
+++ b/src/templates/qquickcontrol_p.h
@@ -144,7 +144,6 @@ protected:
QQuickControl(QQuickControlPrivate &dd, QQuickItem *parent);
- void classBegin() override;
void componentComplete() override;
void itemChange(ItemChange change, const ItemChangeData &value) override;
diff --git a/src/templates/qquickcontrol_p_p.h b/src/templates/qquickcontrol_p_p.h
index 1450184b..e32af257 100644
--- a/src/templates/qquickcontrol_p_p.h
+++ b/src/templates/qquickcontrol_p_p.h
@@ -104,8 +104,7 @@ public:
static QFont themeFont(QPlatformTheme::Font type);
void updateLocale(const QLocale &l, bool e);
static void updateLocaleRecur(QQuickItem *item, const QLocale &l);
-
- QLocale calcLocale() const;
+ static QLocale calcLocale(QQuickItem *);
QFont font;
bool hasTopPadding;
diff --git a/src/templates/qquickmenu.cpp b/src/templates/qquickmenu.cpp
index acfcdb70..2a45b6df 100644
--- a/src/templates/qquickmenu.cpp
+++ b/src/templates/qquickmenu.cpp
@@ -484,6 +484,7 @@ void QQuickMenu::contentItemChange(QQuickItem *newItem, QQuickItem *oldItem)
QObjectPrivate::connect(d->dummyFocusItem.data(), &QQuickItem::activeFocusChanged, d, &QQuickMenuPrivate::maybeUnsetDummyFocusOnTab);
}
+ d->contentItem = newItem;
}
bool QQuickMenu::eventFilter(QObject *object, QEvent *event)
diff --git a/src/templates/qquickmenu_p_p.h b/src/templates/qquickmenu_p_p.h
index 505f3cb9..366dbc35 100644
--- a/src/templates/qquickmenu_p_p.h
+++ b/src/templates/qquickmenu_p_p.h
@@ -89,6 +89,7 @@ public:
static QObject *contentData_at(QQmlListProperty<QObject> *prop, int index);
static void contentData_clear(QQmlListProperty<QObject> *prop);
+ QQuickItem *contentItem; // TODO: cleanup
QVector<QObject *> contentData;
QQmlObjectModel *contentModel;
QPointer<QQuickItem> dummyFocusItem;
diff --git a/src/templates/qquickpage.cpp b/src/templates/qquickpage.cpp
index bf1fc42d..a4225028 100644
--- a/src/templates/qquickpage.cpp
+++ b/src/templates/qquickpage.cpp
@@ -167,8 +167,10 @@ void QQuickPage::setHeader(QQuickItem *header)
if (d->header == header)
return;
- if (d->header)
+ if (d->header) {
QQuickItemPrivate::get(d->header)->removeItemChangeListener(d, QQuickItemPrivate::ImplicitWidth | QQuickItemPrivate::ImplicitHeight);
+ d->header->setParentItem(nullptr);
+ }
d->header = header;
if (header) {
header->setParentItem(this);
@@ -209,8 +211,10 @@ void QQuickPage::setFooter(QQuickItem *footer)
if (d->footer == footer)
return;
- if (d->footer)
+ if (d->footer) {
QQuickItemPrivate::get(d->footer)->removeItemChangeListener(d, QQuickItemPrivate::ImplicitWidth | QQuickItemPrivate::ImplicitHeight);
+ d->footer->setParentItem(nullptr);
+ }
d->footer = footer;
if (footer) {
footer->setParentItem(this);
diff --git a/src/templates/qquickpopup.cpp b/src/templates/qquickpopup.cpp
index 8214df8a..4b953fc6 100644
--- a/src/templates/qquickpopup.cpp
+++ b/src/templates/qquickpopup.cpp
@@ -38,6 +38,7 @@
#include "qquickpopup_p_p.h"
#include "qquickapplicationwindow_p.h"
#include "qquickoverlay_p.h"
+#include "qquickcontrol_p_p.h"
#include <QtQml/qqmlinfo.h>
#include <QtQuick/qquickitem.h>
@@ -54,7 +55,40 @@ QT_BEGIN_NAMESPACE
\ingroup qtlabscontrols-popups
\brief The base type of popup-like user interface controls.
- Popup is the base type of popup-like user interface controls.
+ Popup is the base type of popup-like user interface controls. It can be
+ used with Window or ApplicationWindow.
+
+ \qml
+ import QtQuick.Window 2.2
+ import Qt.labs.controls 1.0
+
+ Window {
+ id: window
+ width: 400
+ height: 400
+ visible: true
+
+ Button {
+ text: "Open"
+ onClicked: popup.open()
+ }
+
+ Popup {
+ id: popup
+ x: 100
+ y: 100
+ width: 200
+ height: 300
+ modal: true
+ focus: true
+ closePolicy: Popup.OnEscape | Popup.OnPressOutside
+ }
+ }
+ \endqml
+
+ In order to ensure that a popup is displayed above other items in the
+ scene, it is recommended to use ApplicationWindow. ApplicationWindow also
+ provides background dimming effects.
\labs
*/
@@ -75,26 +109,15 @@ QQuickPopupPrivate::QQuickPopupPrivate()
, hasLeftMargin(false)
, hasRightMargin(false)
, hasBottomMargin(false)
- , hasTopPadding(false)
- , hasLeftPadding(false)
- , hasRightPadding(false)
- , hasBottomPadding(false)
, margins(0)
, topMargin(0)
, leftMargin(0)
, rightMargin(0)
, bottomMargin(0)
- , padding(0)
- , topPadding(0)
- , leftPadding(0)
- , rightPadding(0)
- , bottomPadding(0)
, contentWidth(0)
, contentHeight(0)
, closePolicy(QQuickPopup::OnEscape)
, parentItem(nullptr)
- , background(nullptr)
- , contentItem(nullptr)
, enter(nullptr)
, exit(nullptr)
, popupItem(nullptr)
@@ -108,6 +131,7 @@ void QQuickPopupPrivate::init()
Q_Q(QQuickPopup);
popupItem = new QQuickPopupItem(q);
q->setParentItem(qobject_cast<QQuickItem *>(parent));
+ QObject::connect(popupItem, &QQuickControl::paddingChanged, q, &QQuickPopup::paddingChanged);
}
bool QQuickPopupPrivate::tryClose(QQuickItem *item, QMouseEvent *event)
@@ -146,31 +170,6 @@ void QQuickPopupPrivate::finalizeExitTransition()
popupItem->setVisible(false);
}
-void QQuickPopupPrivate::resizeBackground()
-{
- Q_Q(QQuickPopup);
- if (background) {
- QQuickItemPrivate *p = QQuickItemPrivate::get(background);
- if (!p->widthValid && qFuzzyIsNull(background->x())) {
- background->setWidth(q->width());
- p->widthValid = false;
- }
- if (!p->heightValid && qFuzzyIsNull(background->y())) {
- background->setHeight(q->height());
- p->heightValid = false;
- }
- }
-}
-
-void QQuickPopupPrivate::resizeContent()
-{
- Q_Q(QQuickPopup);
- if (contentItem) {
- contentItem->setPosition(QPointF(q->leftPadding(), q->topPadding()));
- contentItem->setSize(QSizeF(q->availableWidth(), q->availableHeight()));
- }
-}
-
QMarginsF QQuickPopupPrivate::getMargins() const
{
Q_Q(const QQuickPopup);
@@ -229,63 +228,7 @@ void QQuickPopupPrivate::setBottomMargin(qreal value, bool reset)
}
}
-void QQuickPopupPrivate::setTopPadding(qreal value, bool reset)
-{
- Q_Q(QQuickPopup);
- qreal oldPadding = q->topPadding();
- topPadding = value;
- hasTopPadding = !reset;
- if ((!reset && !qFuzzyCompare(oldPadding, value)) || (reset && !qFuzzyCompare(oldPadding, padding))) {
- emit q->topPaddingChanged();
- emit q->availableHeightChanged();
- q->paddingChange(QMarginsF(leftPadding, topPadding, rightPadding, bottomPadding),
- QMarginsF(leftPadding, oldPadding, rightPadding, bottomPadding));
- }
-}
-
-void QQuickPopupPrivate::setLeftPadding(qreal value, bool reset)
-{
- Q_Q(QQuickPopup);
- qreal oldPadding = q->leftPadding();
- leftPadding = value;
- hasLeftPadding = !reset;
- if ((!reset && !qFuzzyCompare(oldPadding, value)) || (reset && !qFuzzyCompare(oldPadding, padding))) {
- emit q->leftPaddingChanged();
- emit q->availableWidthChanged();
- q->paddingChange(QMarginsF(leftPadding, topPadding, rightPadding, bottomPadding),
- QMarginsF(oldPadding, topPadding, rightPadding, bottomPadding));
- }
-}
-
-void QQuickPopupPrivate::setRightPadding(qreal value, bool reset)
-{
- Q_Q(QQuickPopup);
- qreal oldPadding = q->rightPadding();
- rightPadding = value;
- hasRightPadding = !reset;
- if ((!reset && !qFuzzyCompare(oldPadding, value)) || (reset && !qFuzzyCompare(oldPadding, padding))) {
- emit q->rightPaddingChanged();
- emit q->availableWidthChanged();
- q->paddingChange(QMarginsF(leftPadding, topPadding, rightPadding, bottomPadding),
- QMarginsF(leftPadding, topPadding, oldPadding, bottomPadding));
- }
-}
-
-void QQuickPopupPrivate::setBottomPadding(qreal value, bool reset)
-{
- Q_Q(QQuickPopup);
- qreal oldPadding = q->bottomPadding();
- bottomPadding = value;
- hasBottomPadding = !reset;
- if ((!reset && !qFuzzyCompare(oldPadding, value)) || (reset && !qFuzzyCompare(oldPadding, padding))) {
- emit q->bottomPaddingChanged();
- emit q->availableHeightChanged();
- q->paddingChange(QMarginsF(leftPadding, topPadding, rightPadding, bottomPadding),
- QMarginsF(leftPadding, topPadding, rightPadding, oldPadding));
- }
-}
-
-class QQuickPopupItemPrivate : public QQuickItemPrivate
+class QQuickPopupItemPrivate : public QQuickControlPrivate
{
Q_DECLARE_PUBLIC(QQuickPopupItem)
@@ -305,16 +248,18 @@ QQuickPopupItemPrivate::QQuickPopupItemPrivate(QQuickPopup *popup) : popup(popup
void QQuickPopupItemPrivate::implicitWidthChanged()
{
+ QQuickControlPrivate::implicitWidthChanged();
emit popup->implicitHeightChanged();
}
void QQuickPopupItemPrivate::implicitHeightChanged()
{
+ QQuickControlPrivate::implicitHeightChanged();
emit popup->implicitHeightChanged();
}
QQuickPopupItem::QQuickPopupItem(QQuickPopup *popup) :
- QQuickItem(*(new QQuickPopupItemPrivate(popup)))
+ QQuickControl(*(new QQuickPopupItemPrivate(popup)), nullptr)
{
setParent(popup);
setVisible(false);
@@ -382,16 +327,24 @@ void QQuickPopupItem::wheelEvent(QWheelEvent *event)
d->popup->wheelEvent(event);
}
+void QQuickPopupItem::contentItemChange(QQuickItem *newItem, QQuickItem *oldItem)
+{
+ Q_D(QQuickPopupItem);
+ QQuickControl::contentItemChange(newItem, oldItem);
+ d->popup->contentItemChange(newItem, oldItem);
+}
+
void QQuickPopupItem::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
{
Q_D(QQuickPopupItem);
+ QQuickControl::geometryChanged(newGeometry, oldGeometry);
d->popup->geometryChanged(newGeometry, oldGeometry);
}
void QQuickPopupItem::itemChange(ItemChange change, const ItemChangeData &data)
{
Q_D(QQuickPopupItem);
- QQuickItem::itemChange(change, data);
+ QQuickControl::itemChange(change, data);
switch (change) {
case ItemVisibleHasChanged:
emit d->popup->visibleChanged();
@@ -407,6 +360,13 @@ void QQuickPopupItem::itemChange(ItemChange change, const ItemChangeData &data)
}
}
+void QQuickPopupItem::paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding)
+{
+ Q_D(QQuickPopupItem);
+ QQuickControl::paddingChange(newPadding, oldPadding);
+ d->popup->paddingChange(newPadding, oldPadding);
+}
+
QQuickPopupPositioner::QQuickPopupPositioner(QQuickPopupPrivate *popup) :
m_x(0),
m_y(0),
@@ -895,7 +855,8 @@ void QQuickPopup::setContentHeight(qreal height)
*/
qreal QQuickPopup::availableWidth() const
{
- return qMax<qreal>(0.0, width() - leftPadding() - rightPadding());
+ Q_D(const QQuickPopup);
+ return d->popupItem->availableWidth();
}
/*!
@@ -908,7 +869,8 @@ qreal QQuickPopup::availableWidth() const
*/
qreal QQuickPopup::availableHeight() const
{
- return qMax<qreal>(0.0, height() - topPadding() - bottomPadding());
+ Q_D(const QQuickPopup);
+ return d->popupItem->availableHeight();
}
/*!
@@ -1067,36 +1029,19 @@ void QQuickPopup::resetBottomMargin()
qreal QQuickPopup::padding() const
{
Q_D(const QQuickPopup);
- return d->padding;
+ return d->popupItem->padding();
}
void QQuickPopup::setPadding(qreal padding)
{
Q_D(QQuickPopup);
- if (qFuzzyCompare(d->padding, padding))
- return;
- QMarginsF oldPadding(leftPadding(), topPadding(), rightPadding(), bottomPadding());
- d->padding = padding;
- emit paddingChanged();
- QMarginsF newPadding(leftPadding(), topPadding(), rightPadding(), bottomPadding());
- if (!qFuzzyCompare(newPadding.top(), oldPadding.top()))
- emit topPaddingChanged();
- if (!qFuzzyCompare(newPadding.left(), oldPadding.left()))
- emit leftPaddingChanged();
- if (!qFuzzyCompare(newPadding.right(), oldPadding.right()))
- emit rightPaddingChanged();
- if (!qFuzzyCompare(newPadding.bottom(), oldPadding.bottom()))
- emit bottomPaddingChanged();
- if (!qFuzzyCompare(newPadding.top(), oldPadding.top()) || !qFuzzyCompare(newPadding.bottom(), oldPadding.bottom()))
- emit availableHeightChanged();
- if (!qFuzzyCompare(newPadding.left(), oldPadding.left()) || !qFuzzyCompare(newPadding.right(), oldPadding.right()))
- emit availableWidthChanged();
- paddingChange(newPadding, oldPadding);
+ d->popupItem->setPadding(padding);
}
void QQuickPopup::resetPadding()
{
- setPadding(0);
+ Q_D(QQuickPopup);
+ d->popupItem->resetPadding();
}
/*!
@@ -1109,21 +1054,19 @@ void QQuickPopup::resetPadding()
qreal QQuickPopup::topPadding() const
{
Q_D(const QQuickPopup);
- if (d->hasTopPadding)
- return d->topPadding;
- return d->padding;
+ return d->popupItem->topPadding();
}
void QQuickPopup::setTopPadding(qreal padding)
{
Q_D(QQuickPopup);
- d->setTopPadding(padding);
+ d->popupItem->setTopPadding(padding);
}
void QQuickPopup::resetTopPadding()
{
Q_D(QQuickPopup);
- d->setTopPadding(0, true);
+ d->popupItem->resetTopPadding();
}
/*!
@@ -1136,21 +1079,19 @@ void QQuickPopup::resetTopPadding()
qreal QQuickPopup::leftPadding() const
{
Q_D(const QQuickPopup);
- if (d->hasLeftPadding)
- return d->leftPadding;
- return d->padding;
+ return d->popupItem->leftPadding();
}
void QQuickPopup::setLeftPadding(qreal padding)
{
Q_D(QQuickPopup);
- d->setLeftPadding(padding);
+ d->popupItem->setLeftPadding(padding);
}
void QQuickPopup::resetLeftPadding()
{
Q_D(QQuickPopup);
- d->setLeftPadding(0, true);
+ d->popupItem->resetLeftPadding();
}
/*!
@@ -1163,21 +1104,19 @@ void QQuickPopup::resetLeftPadding()
qreal QQuickPopup::rightPadding() const
{
Q_D(const QQuickPopup);
- if (d->hasRightPadding)
- return d->rightPadding;
- return d->padding;
+ return d->popupItem->rightPadding();
}
void QQuickPopup::setRightPadding(qreal padding)
{
Q_D(QQuickPopup);
- d->setRightPadding(padding);
+ d->popupItem->setRightPadding(padding);
}
void QQuickPopup::resetRightPadding()
{
Q_D(QQuickPopup);
- d->setRightPadding(0, true);
+ d->popupItem->resetRightPadding();
}
/*!
@@ -1190,21 +1129,19 @@ void QQuickPopup::resetRightPadding()
qreal QQuickPopup::bottomPadding() const
{
Q_D(const QQuickPopup);
- if (d->hasBottomPadding)
- return d->bottomPadding;
- return d->padding;
+ return d->popupItem->bottomPadding();
}
void QQuickPopup::setBottomPadding(qreal padding)
{
Q_D(QQuickPopup);
- d->setBottomPadding(padding);
+ d->popupItem->setBottomPadding(padding);
}
void QQuickPopup::resetBottomPadding()
{
Q_D(QQuickPopup);
- d->setBottomPadding(0, true);
+ d->popupItem->resetBottomPadding();
}
QQuickItem *QQuickPopup::popupItem() const
@@ -1233,6 +1170,10 @@ void QQuickPopup::setParentItem(QQuickItem *parent)
d->parentItem = parent;
if (d->positioner.parentItem())
d->positioner.setParentItem(parent);
+ if (d->popupItem) {
+ QQuickControlPrivate::updateFontRecur(d->popupItem, QQuickControlPrivate::naturalControlFont(parent));
+ QQuickControlPrivate::updateLocaleRecur(d->popupItem, QQuickControlPrivate::calcLocale(parent));
+ }
emit parentChanged();
}
@@ -1248,24 +1189,16 @@ void QQuickPopup::setParentItem(QQuickItem *parent)
QQuickItem *QQuickPopup::background() const
{
Q_D(const QQuickPopup);
- return d->background;
+ return d->popupItem->background();
}
void QQuickPopup::setBackground(QQuickItem *background)
{
Q_D(QQuickPopup);
- if (d->background == background)
+ if (d->popupItem->background() == background)
return;
- delete d->background;
- d->background = background;
- if (background) {
- background->setParentItem(d->popupItem);
- if (qFuzzyIsNull(background->z()))
- background->setZ(-1);
- if (isComponentComplete())
- d->resizeBackground();
- }
+ d->popupItem->setBackground(background);
emit backgroundChanged();
}
@@ -1282,24 +1215,13 @@ void QQuickPopup::setBackground(QQuickItem *background)
QQuickItem *QQuickPopup::contentItem() const
{
Q_D(const QQuickPopup);
- return d->contentItem;
+ return d->popupItem->contentItem();
}
void QQuickPopup::setContentItem(QQuickItem *item)
{
Q_D(QQuickPopup);
- if (d->contentItem == item)
- return;
-
- contentItemChange(item, d->contentItem);
- delete d->contentItem;
- d->contentItem = item;
- if (item) {
- item->setParentItem(d->popupItem);
- if (isComponentComplete())
- d->resizeContent();
- }
- emit contentItemChanged();
+ d->popupItem->setContentItem(item);
}
/*!
@@ -1313,7 +1235,7 @@ void QQuickPopup::setContentItem(QQuickItem *item)
QQmlListProperty<QObject> QQuickPopup::contentData()
{
Q_D(QQuickPopup);
- return QQmlListProperty<QObject>(d->contentItem, nullptr,
+ return QQmlListProperty<QObject>(d->popupItem->contentItem(), nullptr,
QQuickItemPrivate::data_append,
QQuickItemPrivate::data_count,
QQuickItemPrivate::data_at,
@@ -1330,7 +1252,7 @@ QQmlListProperty<QObject> QQuickPopup::contentData()
QQmlListProperty<QQuickItem> QQuickPopup::contentChildren()
{
Q_D(QQuickPopup);
- return QQmlListProperty<QQuickItem>(d->contentItem, nullptr,
+ return QQmlListProperty<QQuickItem>(d->popupItem->contentItem(), nullptr,
QQuickItemPrivate::children_append,
QQuickItemPrivate::children_count,
QQuickItemPrivate::children_at,
@@ -1667,13 +1589,12 @@ void QQuickPopup::contentItemChange(QQuickItem *newItem, QQuickItem *oldItem)
{
Q_UNUSED(newItem);
Q_UNUSED(oldItem);
+ emit contentItemChanged();
}
void QQuickPopup::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
{
Q_D(QQuickPopup);
- d->resizeBackground();
- d->resizeContent();
d->positioner.repositionPopup();
if (!qFuzzyCompare(newGeometry.width(), oldGeometry.width())) {
emit widthChanged();
@@ -1695,10 +1616,24 @@ void QQuickPopup::marginsChange(const QMarginsF &newMargins, const QMarginsF &ol
void QQuickPopup::paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding)
{
- Q_D(QQuickPopup);
- Q_UNUSED(newPadding);
- Q_UNUSED(oldPadding);
- d->resizeContent();
+ const bool tp = !qFuzzyCompare(newPadding.top(), oldPadding.top());
+ const bool lp = !qFuzzyCompare(newPadding.left(), oldPadding.left());
+ const bool rp = !qFuzzyCompare(newPadding.right(), oldPadding.right());
+ const bool bp = !qFuzzyCompare(newPadding.bottom(), oldPadding.bottom());
+
+ if (tp)
+ emit topPaddingChanged();
+ if (lp)
+ emit leftPaddingChanged();
+ if (rp)
+ emit rightPaddingChanged();
+ if (bp)
+ emit bottomPaddingChanged();
+
+ if (lp || rp)
+ emit availableWidthChanged();
+ if (tp || bp)
+ emit availableHeightChanged();
}
QT_END_NAMESPACE
diff --git a/src/templates/qquickpopup_p_p.h b/src/templates/qquickpopup_p_p.h
index c576071b..ba1e90a8 100644
--- a/src/templates/qquickpopup_p_p.h
+++ b/src/templates/qquickpopup_p_p.h
@@ -49,6 +49,7 @@
//
#include "qquickpopup_p.h"
+#include "qquickcontrol_p.h"
#include <QtCore/private/qobject_p.h>
#include <QtQuick/qquickitem.h>
@@ -83,7 +84,7 @@ private:
QQuickPopupPrivate *popup;
};
-class QQuickPopupItem : public QQuickItem
+class QQuickPopupItem : public QQuickControl
{
Q_OBJECT
@@ -102,8 +103,10 @@ protected:
void mouseUngrabEvent() override;
void wheelEvent(QWheelEvent *event) override;
+ void contentItemChange(QQuickItem *newItem, QQuickItem *oldItem) override;
void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) override;
void itemChange(ItemChange change, const ItemChangeData &data) override;
+ void paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding) override;
private:
Q_DECLARE_PRIVATE(QQuickPopupItem)
@@ -162,9 +165,6 @@ public:
void finalizeEnterTransition();
void finalizeExitTransition();
- void resizeBackground();
- void resizeContent();
-
QMarginsF getMargins() const;
void setTopMargin(qreal value, bool reset = false);
@@ -172,11 +172,6 @@ public:
void setRightMargin(qreal value, bool reset = false);
void setBottomMargin(qreal value, bool reset = false);
- void setTopPadding(qreal value, bool reset = false);
- void setLeftPadding(qreal value, bool reset = false);
- void setRightPadding(qreal value, bool reset = false);
- void setBottomPadding(qreal value, bool reset = false);
-
bool focus;
bool modal;
bool complete;
@@ -184,26 +179,15 @@ public:
bool hasLeftMargin;
bool hasRightMargin;
bool hasBottomMargin;
- bool hasTopPadding;
- bool hasLeftPadding;
- bool hasRightPadding;
- bool hasBottomPadding;
qreal margins;
qreal topMargin;
qreal leftMargin;
qreal rightMargin;
qreal bottomMargin;
- qreal padding;
- qreal topPadding;
- qreal leftPadding;
- qreal rightPadding;
- qreal bottomPadding;
qreal contentWidth;
qreal contentHeight;
QQuickPopup::ClosePolicy closePolicy;
QQuickItem *parentItem;
- QQuickItem *background;
- QQuickItem *contentItem;
QQuickTransition *enter;
QQuickTransition *exit;
QQuickPopupItem *popupItem;