aboutsummaryrefslogtreecommitdiffstats
path: root/src/templates/qquickpopup.cpp
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@theqtcompany.com>2016-02-19 13:19:40 +0100
committerJ-P Nurmi <jpnurmi@theqtcompany.com>2016-02-19 18:34:57 +0000
commit20b60be518f05611fb11a98b57e73f6bb6c8b46e (patch)
treebaf1c73681dd290138af501fb73cd673364fc0be /src/templates/qquickpopup.cpp
parentda3bf2a7c16763c21b1bc127382130f8eee92cd0 (diff)
Popup: use available size and paddings from the popup item
Now that the internal popup item inherits Control, which already provides these features, we may use them directly instead of re-doing them in Popup. NOTE: QQuickMenu code has lots of direct references to the content item, which used to be stored in QQuickPopupPrivate, which is the base class of QQuickMenuPrivate. Now that the content item is stored by QQuickPopupItem instead, the direct references don't work. Thus, as a temporary solution to avoid this patch growing large, we'll store the content item in QQuickMenuPrivate. Change-Id: I80a16d34432131a4326c1b6ae54419470be53f96 Reviewed-by: Liang Qi <liang.qi@theqtcompany.com>
Diffstat (limited to 'src/templates/qquickpopup.cpp')
-rw-r--r--src/templates/qquickpopup.cpp235
1 files changed, 67 insertions, 168 deletions
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