diff options
author | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-02-20 07:30:41 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-02-20 07:36:55 +0100 |
commit | 7116f3959c9ade06397de9df66d66667a1a703fe (patch) | |
tree | 2b5eae5581d1d8750ece6195f9d7b337ccc32130 /src | |
parent | d475ba88cc7e0875cfc30371867d7b82f006770f (diff) | |
parent | 20b60be518f05611fb11a98b57e73f6bb6c8b46e (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.qml | 2 | ||||
-rw-r--r-- | src/imports/controls/material/MenuItem.qml | 2 | ||||
-rw-r--r-- | src/imports/controls/material/qquickmaterialtheme.cpp | 30 | ||||
-rw-r--r-- | src/imports/controls/material/qquickmaterialtheme_p.h | 5 | ||||
-rw-r--r-- | src/templates/qquickapplicationwindow.cpp | 12 | ||||
-rw-r--r-- | src/templates/qquickcontrol.cpp | 55 | ||||
-rw-r--r-- | src/templates/qquickcontrol_p.h | 1 | ||||
-rw-r--r-- | src/templates/qquickcontrol_p_p.h | 3 | ||||
-rw-r--r-- | src/templates/qquickmenu.cpp | 1 | ||||
-rw-r--r-- | src/templates/qquickmenu_p_p.h | 1 | ||||
-rw-r--r-- | src/templates/qquickpage.cpp | 8 | ||||
-rw-r--r-- | src/templates/qquickpopup.cpp | 277 | ||||
-rw-r--r-- | src/templates/qquickpopup_p_p.h | 24 |
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; |