aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/templates/qquickmenu.cpp1
-rw-r--r--src/templates/qquickmenu_p_p.h1
-rw-r--r--src/templates/qquickpopup.cpp235
-rw-r--r--src/templates/qquickpopup_p_p.h21
4 files changed, 71 insertions, 187 deletions
diff --git a/src/templates/qquickmenu.cpp b/src/templates/qquickmenu.cpp
index d3fc88d9..b61985d5 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 167f865b..4c2aed16 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/qquickpopup.cpp b/src/templates/qquickpopup.cpp
index df452a73..18a11208 100644
--- a/src/templates/qquickpopup.cpp
+++ b/src/templates/qquickpopup.cpp
@@ -109,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(Q_NULLPTR)
- , background(Q_NULLPTR)
- , contentItem(Q_NULLPTR)
, enter(Q_NULLPTR)
, exit(Q_NULLPTR)
, popupItem(Q_NULLPTR)
@@ -142,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)
@@ -180,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);
@@ -263,62 +228,6 @@ 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 QQuickControlPrivate
{
Q_DECLARE_PUBLIC(QQuickPopupItem)
@@ -339,11 +248,13 @@ QQuickPopupItemPrivate::QQuickPopupItemPrivate(QQuickPopup *popup) : popup(popup
void QQuickPopupItemPrivate::implicitWidthChanged()
{
+ QQuickControlPrivate::implicitWidthChanged();
emit popup->implicitHeightChanged();
}
void QQuickPopupItemPrivate::implicitHeightChanged()
{
+ QQuickControlPrivate::implicitHeightChanged();
emit popup->implicitHeightChanged();
}
@@ -416,9 +327,17 @@ 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);
}
@@ -441,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),
@@ -925,7 +851,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();
}
/*!
@@ -938,7 +865,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();
}
/*!
@@ -1097,36 +1025,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();
}
/*!
@@ -1139,21 +1050,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();
}
/*!
@@ -1166,21 +1075,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();
}
/*!
@@ -1193,21 +1100,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();
}
/*!
@@ -1220,21 +1125,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
@@ -1281,24 +1184,17 @@ 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) {
- delete d->background;
- d->background = background;
- if (background) {
- background->setParentItem(d->popupItem);
- if (qFuzzyIsNull(background->z()))
- background->setZ(-1);
- if (isComponentComplete())
- d->resizeBackground();
- }
- emit backgroundChanged();
- }
+ if (d->popupItem->background() == background)
+ return;
+
+ d->popupItem->setBackground(background);
+ emit backgroundChanged();
}
/*!
@@ -1314,23 +1210,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) {
- 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);
}
/*!
@@ -1344,7 +1230,7 @@ void QQuickPopup::setContentItem(QQuickItem *item)
QQmlListProperty<QObject> QQuickPopup::contentData()
{
Q_D(QQuickPopup);
- return QQmlListProperty<QObject>(d->contentItem, Q_NULLPTR,
+ return QQmlListProperty<QObject>(d->popupItem->contentItem(), Q_NULLPTR,
QQuickItemPrivate::data_append,
QQuickItemPrivate::data_count,
QQuickItemPrivate::data_at,
@@ -1361,7 +1247,7 @@ QQmlListProperty<QObject> QQuickPopup::contentData()
QQmlListProperty<QQuickItem> QQuickPopup::contentChildren()
{
Q_D(QQuickPopup);
- return QQmlListProperty<QQuickItem>(d->contentItem, Q_NULLPTR,
+ return QQmlListProperty<QQuickItem>(d->popupItem->contentItem(), Q_NULLPTR,
QQuickItemPrivate::children_append,
QQuickItemPrivate::children_count,
QQuickItemPrivate::children_at,
@@ -1712,13 +1598,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();
@@ -1740,10 +1625,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 ab53a616..45dd7fd9 100644
--- a/src/templates/qquickpopup_p_p.h
+++ b/src/templates/qquickpopup_p_p.h
@@ -103,8 +103,10 @@ protected:
void mouseUngrabEvent() Q_DECL_OVERRIDE;
void wheelEvent(QWheelEvent *event) Q_DECL_OVERRIDE;
+ void contentItemChange(QQuickItem *newItem, QQuickItem *oldItem) Q_DECL_OVERRIDE;
void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE;
void itemChange(ItemChange change, const ItemChangeData &data) Q_DECL_OVERRIDE;
+ void paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding) Q_DECL_OVERRIDE;
private:
Q_DECLARE_PRIVATE(QQuickPopupItem)
@@ -163,9 +165,6 @@ public:
void finalizeEnterTransition();
void finalizeExitTransition();
- void resizeBackground();
- void resizeContent();
-
QMarginsF getMargins() const;
void setTopMargin(qreal value, bool reset = false);
@@ -173,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;
@@ -185,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;