QQuickContents::QQuickContents(QQuickItem *item)
: m_item(item), m_x(0), m_y(0), m_width(0), m_height(0)
{
- //### optimize
- connect(this, SIGNAL(rectChanged(QRectF)), m_item, SIGNAL(childrenRectChanged(QRectF)));
}
QQuickContents::~QQuickContents()
}
}
-QRectF QQuickContents::rectF() const
-{
- return QRectF(m_x, m_y, m_width, m_height);
-}
-
-void QQuickContents::calcHeight(QQuickItem *changed)
+bool QQuickContents::calcHeight(QQuickItem *changed)
{
qreal oldy = m_y;
qreal oldheight = m_height;
m_height = qMax(bottom - top, qreal(0.0));
}
- if (m_height != oldheight || m_y != oldy)
- emit rectChanged(rectF());
+ return (m_height != oldheight || m_y != oldy);
}
-void QQuickContents::calcWidth(QQuickItem *changed)
+bool QQuickContents::calcWidth(QQuickItem *changed)
{
qreal oldx = m_x;
qreal oldwidth = m_width;
m_width = qMax(right - left, qreal(0.0));
}
- if (m_width != oldwidth || m_x != oldx)
- emit rectChanged(rectF());
+ return (m_width != oldwidth || m_x != oldx);
}
void QQuickContents::complete()
{
+ QQuickItemPrivate::get(m_item)->addItemChangeListener(this, QQuickItemPrivate::Children);
+
QList<QQuickItem *> children = m_item->childItems();
for (int i = 0; i < children.count(); ++i) {
QQuickItem *child = children.at(i);
QQuickItemPrivate::get(child)->addItemChangeListener(this, QQuickItemPrivate::Geometry | QQuickItemPrivate::Destroyed);
//###what about changes to visibility?
}
-
calcGeometry();
}
+void QQuickContents::updateRect()
+{
+ QQuickItemPrivate::get(m_item)->emitChildrenRectChanged(rectF());
+}
+
void QQuickContents::itemGeometryChanged(QQuickItem *changed, const QRectF &newGeometry, const QRectF &oldGeometry)
{
Q_UNUSED(changed)
+ bool wChanged = false;
+ bool hChanged = false;
//### we can only pass changed if the left edge has moved left, or the right edge has moved right
if (newGeometry.width() != oldGeometry.width() || newGeometry.x() != oldGeometry.x())
- calcWidth(/*changed*/);
+ wChanged = calcWidth(/*changed*/);
if (newGeometry.height() != oldGeometry.height() || newGeometry.y() != oldGeometry.y())
- calcHeight(/*changed*/);
+ hChanged = calcHeight(/*changed*/);
+ if (wChanged || hChanged)
+ updateRect();
}
void QQuickContents::itemDestroyed(QQuickItem *item)
calcGeometry();
}
-void QQuickContents::childRemoved(QQuickItem *item)
+void QQuickContents::itemChildRemoved(QQuickItem *, QQuickItem *item)
{
if (item)
QQuickItemPrivate::get(item)->removeItemChangeListener(this, QQuickItemPrivate::Geometry | QQuickItemPrivate::Destroyed);
calcGeometry();
}
-void QQuickContents::childAdded(QQuickItem *item)
+void QQuickContents::itemChildAdded(QQuickItem *, QQuickItem *item)
{
if (item)
QQuickItemPrivate::get(item)->addItemChangeListener(this, QQuickItemPrivate::Geometry | QQuickItemPrivate::Destroyed);
- calcWidth(item);
- calcHeight(item);
+ calcGeometry(item);
}
QQuickItemKeyFilter::QQuickItemKeyFilter(QQuickItem *item)
switch (change) {
case QQuickItem::ItemChildAddedChange:
q->itemChange(change, data);
- if (_contents && componentComplete)
- _contents->childAdded(data.item);
for (int ii = 0; ii < changeListeners.count(); ++ii) {
const QQuickItemPrivate::ChangeListener &change = changeListeners.at(ii);
if (change.types & QQuickItemPrivate::Children) {
break;
case QQuickItem::ItemChildRemovedChange:
q->itemChange(change, data);
- if (_contents && componentComplete)
- _contents->childRemoved(data.item);
for (int ii = 0; ii < changeListeners.count(); ++ii) {
const QQuickItemPrivate::ChangeListener &change = changeListeners.at(ii);
if (change.types & QQuickItemPrivate::Children) {
class QQuickItemKeyFilter;
class QQuickLayoutMirroringAttached;
-//### merge into private?
-class QQuickContents : public QObject, public QQuickItemChangeListener
+class QQuickContents : public QQuickItemChangeListener
{
- Q_OBJECT
public:
QQuickContents(QQuickItem *item);
~QQuickContents();
- QRectF rectF() const;
-
- void childRemoved(QQuickItem *item);
- void childAdded(QQuickItem *item);
+ QRectF rectF() const { return QRectF(m_x, m_y, m_width, m_height); }
- void calcGeometry() { calcWidth(); calcHeight(); }
+ inline void calcGeometry(QQuickItem *changed = 0);
void complete();
-Q_SIGNALS:
- void rectChanged(QRectF);
-
protected:
void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry);
void itemDestroyed(QQuickItem *item);
+ void itemChildAdded(QQuickItem *, QQuickItem *);
+ void itemChildRemoved(QQuickItem *, QQuickItem *);
//void itemVisibilityChanged(QQuickItem *item)
private:
- void calcHeight(QQuickItem *changed = 0);
- void calcWidth(QQuickItem *changed = 0);
+ bool calcHeight(QQuickItem *changed = 0);
+ bool calcWidth(QQuickItem *changed = 0);
+ void updateRect();
QQuickItem *m_item;
qreal m_x;
qreal m_height;
};
+void QQuickContents::calcGeometry(QQuickItem *changed)
+{
+ bool wChanged = calcWidth(changed);
+ bool hChanged = calcHeight(changed);
+ if (wChanged || hChanged)
+ updateRect();
+}
+
class QQuickTransformPrivate : public QObjectPrivate
{
Q_DECLARE_PUBLIC(QQuickTransform);
return effectiveLayoutMirror;
}
+ void emitChildrenRectChanged(const QRectF &rect) {
+ Q_Q(QQuickItem);
+ emit q->childrenRectChanged(rect);
+ }
+
QPointF computeTransformOrigin() const;
QList<QQuickTransform *> transforms;
virtual void transformChanged();