aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items
diff options
context:
space:
mode:
authorAndrew den Exter <andrew.den-exter@nokia.com>2012-06-29 17:06:38 +1000
committerQt by Nokia <qt-info@nokia.com>2012-07-06 05:24:45 +0200
commitaeac9840e4c46786e84ab7eb16a89db22d4ff81a (patch)
tree2aaae5a3dccfa9ee447f0896a659cc60caba5b86 /src/quick/items
parentea9c14f3e1a42080be03d95b825a7ba8ed303bbc (diff)
Allow all explicit margins to override margins.
Task-number: QTBUG-24515 Change-Id: Ibfc657dec9fd0c8e71cf3686a04ea7b00ad72c11 Reviewed-by: Michael Brasser <michael.brasser@nokia.com>
Diffstat (limited to 'src/quick/items')
-rw-r--r--src/quick/items/qquickanchors.cpp105
-rw-r--r--src/quick/items/qquickanchors_p.h12
-rw-r--r--src/quick/items/qquickanchors_p_p.h10
-rw-r--r--src/quick/items/qquickitem.cpp2
4 files changed, 114 insertions, 15 deletions
diff --git a/src/quick/items/qquickanchors.cpp b/src/quick/items/qquickanchors.cpp
index 0626c66fbb..9097cc421b 100644
--- a/src/quick/items/qquickanchors.cpp
+++ b/src/quick/items/qquickanchors.cpp
@@ -985,6 +985,7 @@ qreal QQuickAnchors::leftMargin() const
void QQuickAnchors::setLeftMargin(qreal offset)
{
Q_D(QQuickAnchors);
+ d->leftMarginExplicit = true;
if (d->leftMargin == offset)
return;
d->leftMargin = offset;
@@ -995,6 +996,20 @@ void QQuickAnchors::setLeftMargin(qreal offset)
emit leftMarginChanged();
}
+void QQuickAnchors::resetLeftMargin()
+{
+ Q_D(QQuickAnchors);
+ d->leftMarginExplicit = false;
+ if (d->leftMargin == d->margins)
+ return;
+ d->leftMargin = d->margins;
+ if (d->fill)
+ d->fillChanged();
+ else
+ d->updateHorizontalAnchors();
+ emit leftMarginChanged();
+}
+
qreal QQuickAnchors::rightMargin() const
{
Q_D(const QQuickAnchors);
@@ -1004,6 +1019,7 @@ qreal QQuickAnchors::rightMargin() const
void QQuickAnchors::setRightMargin(qreal offset)
{
Q_D(QQuickAnchors);
+ d->rightMarginExplicit = true;
if (d->rightMargin == offset)
return;
d->rightMargin = offset;
@@ -1014,6 +1030,20 @@ void QQuickAnchors::setRightMargin(qreal offset)
emit rightMarginChanged();
}
+void QQuickAnchors::resetRightMargin()
+{
+ Q_D(QQuickAnchors);
+ d->rightMarginExplicit = false;
+ if (d->rightMargin == d->margins)
+ return;
+ d->rightMargin = d->margins;
+ if (d->fill)
+ d->fillChanged();
+ else
+ d->updateHorizontalAnchors();
+ emit rightMarginChanged();
+}
+
qreal QQuickAnchors::margins() const
{
Q_D(const QQuickAnchors);
@@ -1025,18 +1055,43 @@ void QQuickAnchors::setMargins(qreal offset)
Q_D(QQuickAnchors);
if (d->margins == offset)
return;
- //###Is it significantly faster to set them directly so we can call fillChanged only once?
- if (!d->rightMargin || d->rightMargin == d->margins)
- setRightMargin(offset);
- if (!d->leftMargin || d->leftMargin == d->margins)
- setLeftMargin(offset);
- if (!d->topMargin || d->topMargin == d->margins)
- setTopMargin(offset);
- if (!d->bottomMargin || d->bottomMargin == d->margins)
- setBottomMargin(offset);
d->margins = offset;
- emit marginsChanged();
+ bool updateHorizontal = false;
+ bool updateVertical = false;
+
+ if (!d->rightMarginExplicit && d->rightMargin != offset) {
+ d->rightMargin = offset;
+ updateHorizontal = true;
+ emit rightMarginChanged();
+ }
+ if (!d->leftMarginExplicit && d->leftMargin != offset) {
+ d->leftMargin = offset;
+ updateHorizontal = true;
+ emit leftMarginChanged();
+ }
+ if (!d->topMarginExplicit && d->topMargin != offset) {
+ d->topMargin = offset;
+ updateVertical = true;
+ emit topMarginChanged();
+ }
+ if (!d->bottomMarginExplicit && d->bottomMargin != offset) {
+ d->bottomMargin = offset;
+ updateVertical = true;
+ emit bottomMarginChanged();
+ }
+
+ if (d->fill) {
+ if (updateHorizontal || updateVertical)
+ d->fillChanged();
+ } else {
+ if (updateHorizontal)
+ d->updateHorizontalAnchors();
+ if (updateVertical)
+ d->updateVerticalAnchors();
+ }
+
+ emit marginsChanged();
}
qreal QQuickAnchors::horizontalCenterOffset() const
@@ -1067,6 +1122,7 @@ qreal QQuickAnchors::topMargin() const
void QQuickAnchors::setTopMargin(qreal offset)
{
Q_D(QQuickAnchors);
+ d->topMarginExplicit = true;
if (d->topMargin == offset)
return;
d->topMargin = offset;
@@ -1077,6 +1133,20 @@ void QQuickAnchors::setTopMargin(qreal offset)
emit topMarginChanged();
}
+void QQuickAnchors::resetTopMargin()
+{
+ Q_D(QQuickAnchors);
+ d->topMarginExplicit = false;
+ if (d->topMargin == d->margins)
+ return;
+ d->topMargin = d->margins;
+ if (d->fill)
+ d->fillChanged();
+ else
+ d->updateVerticalAnchors();
+ emit topMarginChanged();
+}
+
qreal QQuickAnchors::bottomMargin() const
{
Q_D(const QQuickAnchors);
@@ -1086,6 +1156,7 @@ qreal QQuickAnchors::bottomMargin() const
void QQuickAnchors::setBottomMargin(qreal offset)
{
Q_D(QQuickAnchors);
+ d->bottomMarginExplicit = true;
if (d->bottomMargin == offset)
return;
d->bottomMargin = offset;
@@ -1096,6 +1167,20 @@ void QQuickAnchors::setBottomMargin(qreal offset)
emit bottomMarginChanged();
}
+void QQuickAnchors::resetBottomMargin()
+{
+ Q_D(QQuickAnchors);
+ d->bottomMarginExplicit = false;
+ if (d->bottomMargin == d->margins)
+ return;
+ d->bottomMargin = d->margins;
+ if (d->fill)
+ d->fillChanged();
+ else
+ d->updateVerticalAnchors();
+ emit bottomMarginChanged();
+}
+
qreal QQuickAnchors::verticalCenterOffset() const
{
Q_D(const QQuickAnchors);
diff --git a/src/quick/items/qquickanchors_p.h b/src/quick/items/qquickanchors_p.h
index 3fb3a7bd49..8890d23311 100644
--- a/src/quick/items/qquickanchors_p.h
+++ b/src/quick/items/qquickanchors_p.h
@@ -67,11 +67,11 @@ class Q_QUICK_PRIVATE_EXPORT QQuickAnchors : public QObject
Q_PROPERTY(QQuickAnchorLine verticalCenter READ verticalCenter WRITE setVerticalCenter RESET resetVerticalCenter NOTIFY verticalCenterChanged)
Q_PROPERTY(QQuickAnchorLine baseline READ baseline WRITE setBaseline RESET resetBaseline NOTIFY baselineChanged)
Q_PROPERTY(qreal margins READ margins WRITE setMargins NOTIFY marginsChanged)
- Q_PROPERTY(qreal leftMargin READ leftMargin WRITE setLeftMargin NOTIFY leftMarginChanged)
- Q_PROPERTY(qreal rightMargin READ rightMargin WRITE setRightMargin NOTIFY rightMarginChanged)
+ Q_PROPERTY(qreal leftMargin READ leftMargin WRITE setLeftMargin RESET resetLeftMargin NOTIFY leftMarginChanged)
+ Q_PROPERTY(qreal rightMargin READ rightMargin WRITE setRightMargin RESET resetRightMargin NOTIFY rightMarginChanged)
Q_PROPERTY(qreal horizontalCenterOffset READ horizontalCenterOffset WRITE setHorizontalCenterOffset NOTIFY horizontalCenterOffsetChanged)
- Q_PROPERTY(qreal topMargin READ topMargin WRITE setTopMargin NOTIFY topMarginChanged)
- Q_PROPERTY(qreal bottomMargin READ bottomMargin WRITE setBottomMargin NOTIFY bottomMarginChanged)
+ Q_PROPERTY(qreal topMargin READ topMargin WRITE setTopMargin RESET resetTopMargin NOTIFY topMarginChanged)
+ Q_PROPERTY(qreal bottomMargin READ bottomMargin WRITE setBottomMargin RESET resetBottomMargin NOTIFY bottomMarginChanged)
Q_PROPERTY(qreal verticalCenterOffset READ verticalCenterOffset WRITE setVerticalCenterOffset NOTIFY verticalCenterOffsetChanged)
Q_PROPERTY(qreal baselineOffset READ baselineOffset WRITE setBaselineOffset NOTIFY baselineOffsetChanged)
Q_PROPERTY(QQuickItem *fill READ fill WRITE setFill RESET resetFill NOTIFY fillChanged)
@@ -125,18 +125,22 @@ public:
qreal leftMargin() const;
void setLeftMargin(qreal);
+ void resetLeftMargin();
qreal rightMargin() const;
void setRightMargin(qreal);
+ void resetRightMargin();
qreal horizontalCenterOffset() const;
void setHorizontalCenterOffset(qreal);
qreal topMargin() const;
void setTopMargin(qreal);
+ void resetTopMargin();
qreal bottomMargin() const;
void setBottomMargin(qreal);
+ void resetBottomMargin();
qreal margins() const;
void setMargins(qreal);
diff --git a/src/quick/items/qquickanchors_p_p.h b/src/quick/items/qquickanchors_p_p.h
index 0fdcd1540c..c641745577 100644
--- a/src/quick/items/qquickanchors_p_p.h
+++ b/src/quick/items/qquickanchors_p_p.h
@@ -92,10 +92,13 @@ class QQuickAnchorsPrivate : public QObjectPrivate, public QQuickItemChangeListe
Q_DECLARE_PUBLIC(QQuickAnchors)
public:
QQuickAnchorsPrivate(QQuickItem *i)
- : componentComplete(true), updatingMe(false), inDestructor(false), centerAligned(true), updatingHorizontalAnchor(0),
+ : componentComplete(true), updatingMe(false), inDestructor(false), centerAligned(true),
+ leftMarginExplicit(false), rightMarginExplicit(false), topMarginExplicit(false),
+ bottomMarginExplicit(false), updatingHorizontalAnchor(0),
updatingVerticalAnchor(0), updatingFill(0), updatingCenterIn(0), item(i), usedAnchors(0), fill(0),
centerIn(0), leftMargin(0), rightMargin(0), topMargin(0), bottomMargin(0),
margins(0), vCenterOffset(0), hCenterOffset(0), baselineOffset(0)
+
{
}
@@ -110,6 +113,10 @@ public:
bool updatingMe:1;
bool inDestructor:1;
bool centerAligned:1;
+ bool leftMarginExplicit : 1;
+ bool rightMarginExplicit : 1;
+ bool topMarginExplicit : 1;
+ bool bottomMarginExplicit : 1;
uint updatingHorizontalAnchor:2;
uint updatingVerticalAnchor:2;
uint updatingFill:2;
@@ -165,6 +172,7 @@ public:
qreal hCenterOffset;
qreal baselineOffset;
+
static inline QQuickAnchorsPrivate *get(QQuickAnchors *o) {
return static_cast<QQuickAnchorsPrivate *>(QObjectPrivate::get(o));
}
diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp
index 9c43645f1e..d3c8973653 100644
--- a/src/quick/items/qquickitem.cpp
+++ b/src/quick/items/qquickitem.cpp
@@ -2872,6 +2872,8 @@ void QQuickItemPrivate::transform_clear(QQmlListProperty<QQuickTransform> *prop)
Margins apply to top, bottom, left, right, and fill anchors.
The \c anchors.margins property can be used to set all of the various margins at once, to the same value.
+ It will not override a specific margin that has been previously set; to clear an explicit margin
+ set it's value to \c undefined.
Note that margins are anchor-specific and are not applied if an item does not
use anchors.