aboutsummaryrefslogtreecommitdiffstats
path: root/src/templates
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
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')
-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;