summaryrefslogtreecommitdiffstats
path: root/src/gui/graphicsview
diff options
context:
space:
mode:
authorCaio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>2009-09-24 20:09:16 (GMT)
committerJan-Arve Sæther <jan-arve.saether@nokia.com>2009-10-06 09:28:35 (GMT)
commit5dd77be3acfb53b44d7d6b0015af0c33124ab84a (patch)
tree799242dc831e7623cc5b8d8e1c89e63a3b6ccd2c /src/gui/graphicsview
parente210bea72ef65f99babb4c6f5bd442184c671d3b (diff)
downloadQt-5dd77be3acfb53b44d7d6b0015af0c33124ab84a.zip
Qt-5dd77be3acfb53b44d7d6b0015af0c33124ab84a.tar.gz
Qt-5dd77be3acfb53b44d7d6b0015af0c33124ab84a.tar.bz2
QGraphicsAnchorLayout: cleaning up AnchorData
Use just one constructor for AnchorData and tweak the struct when necessary. Also use the function refreshSizeHints() for Normal anchors to get the item information instead of passing to the constructor. This has the advantage that we don't need to replicate the code for checking and updating the size hint and size policies. Note that the code before only considered the size policies after the first refreshSizeHints() -- which we know will be called after the simplification, so the assumption seems to be correct, but we don't depend on that anymore.. Signed-off-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org> Reviewed-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org>
Diffstat (limited to 'src/gui/graphicsview')
-rw-r--r--src/gui/graphicsview/qgraphicsanchorlayout_p.cpp89
-rw-r--r--src/gui/graphicsview/qgraphicsanchorlayout_p.h53
2 files changed, 59 insertions, 83 deletions
diff --git a/src/gui/graphicsview/qgraphicsanchorlayout_p.cpp b/src/gui/graphicsview/qgraphicsanchorlayout_p.cpp
index 93ccf83..dc8d211 100644
--- a/src/gui/graphicsview/qgraphicsanchorlayout_p.cpp
+++ b/src/gui/graphicsview/qgraphicsanchorlayout_p.cpp
@@ -94,8 +94,6 @@ qreal QGraphicsAnchorPrivate::spacing() const
void AnchorData::refreshSizeHints(qreal effectiveSpacing)
{
- isExpanding = 0;
-
if (!isLayoutAnchor && (from->m_item == to->m_item)) {
QGraphicsLayoutItem *item = from->m_item;
@@ -140,9 +138,6 @@ void AnchorData::refreshSizeHints(qreal effectiveSpacing)
if (policy & QSizePolicy::IgnoreFlag)
prefSize = minSize;
- if (policy & QSizePolicy::ExpandFlag)
- isExpanding = 1;
-
bool hasCenter = (from->m_edge == centerEdge || to->m_edge == centerEdge);
if (hasCenter) {
@@ -151,6 +146,14 @@ void AnchorData::refreshSizeHints(qreal effectiveSpacing)
maxSize /= 2;
}
+ if (policy & QSizePolicy::ExpandFlag) {
+ isExpanding = 1;
+ expSize = maxSize;
+ } else {
+ isExpanding = 0;
+ expSize = prefSize;
+ }
+
// Set the anchor effective sizes to preferred.
//
// Note: The idea here is that all items should remain at their
@@ -167,8 +170,11 @@ void AnchorData::refreshSizeHints(qreal effectiveSpacing)
// Anchor has no size defined, use given default information
minSize = effectiveSpacing;
prefSize = effectiveSpacing;
+ expSize = effectiveSpacing;
maxSize = effectiveSpacing;
+ isExpanding = 0;
+
sizeAtMinimum = prefSize;
sizeAtPreferred = prefSize;
sizeAtExpanding = prefSize;
@@ -830,9 +836,10 @@ void QGraphicsAnchorLayoutPrivate::createLayoutEdges()
QGraphicsLayoutItem *layout = q;
// Horizontal
- AnchorData *data = new AnchorData(0, 0, QWIDGETSIZE_MAX);
+ AnchorData *data = new AnchorData;
addAnchor_helper(layout, Qt::AnchorLeft, layout,
- Qt::AnchorRight, data);
+ Qt::AnchorRight, data);
+ data->maxSize = QWIDGETSIZE_MAX;
data->skipInPreferred = 1;
// Set the Layout Left edge as the root of the horizontal graph.
@@ -840,9 +847,10 @@ void QGraphicsAnchorLayoutPrivate::createLayoutEdges()
graph[Horizontal].setRootVertex(v);
// Vertical
- data = new AnchorData(0, 0, QWIDGETSIZE_MAX);
+ data = new AnchorData;
addAnchor_helper(layout, Qt::AnchorTop, layout,
- Qt::AnchorBottom, data);
+ Qt::AnchorBottom, data);
+ data->maxSize = QWIDGETSIZE_MAX;
data->skipInPreferred = 1;
// Set the Layout Top edge as the root of the vertical graph.
@@ -869,19 +877,15 @@ void QGraphicsAnchorLayoutPrivate::createItemEdges(QGraphicsLayoutItem *item)
items.append(item);
- QSizeF minSize = item->effectiveSizeHint(Qt::MinimumSize);
- QSizeF prefSize = item->effectiveSizeHint(Qt::PreferredSize);
- QSizeF maxSize = item->effectiveSizeHint(Qt::MaximumSize);
-
- // Horizontal
- AnchorData *data = new AnchorData(minSize.width(), prefSize.width(), maxSize.width());
- addAnchor_helper(item, Qt::AnchorLeft, item,
- Qt::AnchorRight, data);
+ // Create horizontal and vertical internal anchors for the item and
+ // refresh its size hint / policy values.
+ AnchorData *data = new AnchorData;
+ addAnchor_helper(item, Qt::AnchorLeft, item, Qt::AnchorRight, data);
+ data->refreshSizeHints(0); // 0 = effectiveSpacing, will not be used
- // Vertical
- data = new AnchorData(minSize.height(), prefSize.height(), maxSize.height());
- addAnchor_helper(item, Qt::AnchorTop, item,
- Qt::AnchorBottom, data);
+ data = new AnchorData;
+ addAnchor_helper(item, Qt::AnchorTop, item, Qt::AnchorBottom, data);
+ data->refreshSizeHints(0); // 0 = effectiveSpacing, will not be used
}
/*!
@@ -934,20 +938,17 @@ void QGraphicsAnchorLayoutPrivate::createCenterAnchors(
Q_ASSERT(first && last);
// Create new anchors
- AnchorData *oldData = graph[orientation].edgeData(first, last);
-
- qreal minimumSize = oldData->minSize / 2;
- qreal preferredSize = oldData->prefSize / 2;
- qreal maximumSize = oldData->maxSize / 2;
-
QSimplexConstraint *c = new QSimplexConstraint;
- AnchorData *data = new AnchorData(minimumSize, preferredSize, maximumSize);
+
+ AnchorData *data = new AnchorData;
c->variables.insert(data, 1.0);
addAnchor_helper(item, firstEdge, item, centerEdge, data);
+ data->refreshSizeHints(0);
- data = new AnchorData(minimumSize, preferredSize, maximumSize);
+ data = new AnchorData;
c->variables.insert(data, -1.0);
addAnchor_helper(item, centerEdge, item, lastEdge, data);
+ data->refreshSizeHints(0);
itemCenterConstraints[orientation].append(c);
@@ -1008,14 +1009,9 @@ void QGraphicsAnchorLayoutPrivate::removeCenterAnchors(
if (substitute) {
// Create the new anchor that should substitute the left-center-right anchors.
- AnchorData *oldData = g.edgeData(first, center);
-
- qreal minimumSize = oldData->minSize * 2;
- qreal preferredSize = oldData->prefSize * 2;
- qreal maximumSize = oldData->maxSize * 2;
-
- AnchorData *data = new AnchorData(minimumSize, preferredSize, maximumSize);
+ AnchorData *data = new AnchorData;
addAnchor_helper(item, firstEdge, item, lastEdge, data);
+ data->refreshSizeHints(0);
// Remove old anchors
removeAnchor_helper(first, center);
@@ -1133,7 +1129,7 @@ QGraphicsAnchor *QGraphicsAnchorLayoutPrivate::addAnchor(QGraphicsLayoutItem *fi
// Use heuristics to find out what the user meant with this anchor.
correctEdgeDirection(firstItem, firstEdge, secondItem, secondEdge);
- AnchorData *data;
+ AnchorData *data = new AnchorData;
if (!spacing) {
// If firstItem or secondItem is the layout itself, the spacing will default to 0.
// Otherwise, the following matrix is used (questionmark means that the spacing
@@ -1143,22 +1139,25 @@ QGraphicsAnchor *QGraphicsAnchorLayoutPrivate::addAnchor(QGraphicsLayoutItem *fi
// Left 0 0 ?
// HCenter 0 0 0
// Right ? 0 0
- if (firstItem != q
- && secondItem != q
- && pickEdge(firstEdge, Horizontal) != Qt::AnchorHorizontalCenter
- && oppositeEdge(firstEdge) == secondEdge) {
- data = new AnchorData; // ask the style later
+ if (firstItem == q
+ || secondItem == q
+ || pickEdge(firstEdge, Horizontal) == Qt::AnchorHorizontalCenter
+ || oppositeEdge(firstEdge) != secondEdge) {
+ data->setFixedSize(0);
} else {
- data = new AnchorData(0); // spacing should be 0
+ data->unsetSize();
}
addAnchor_helper(firstItem, firstEdge, secondItem, secondEdge, data);
+
} else if (*spacing >= 0) {
- data = new AnchorData(*spacing);
+ data->setFixedSize(*spacing);
addAnchor_helper(firstItem, firstEdge, secondItem, secondEdge, data);
+
} else {
- data = new AnchorData(-*spacing);
+ data->setFixedSize(-*spacing);
addAnchor_helper(secondItem, secondEdge, firstItem, firstEdge, data);
}
+
return acquireGraphicsAnchor(data);
}
diff --git a/src/gui/graphicsview/qgraphicsanchorlayout_p.h b/src/gui/graphicsview/qgraphicsanchorlayout_p.h
index 47df786..047be39 100644
--- a/src/gui/graphicsview/qgraphicsanchorlayout_p.h
+++ b/src/gui/graphicsview/qgraphicsanchorlayout_p.h
@@ -149,33 +149,15 @@ struct AnchorData : public QSimplexVariable {
Sequential,
Parallel
};
- AnchorData(qreal minimumSize, qreal preferredSize, qreal maximumSize)
- : QSimplexVariable(), from(0), to(0),
- minSize(minimumSize), prefSize(preferredSize),
- maxSize(maximumSize), sizeAtMinimum(preferredSize),
- sizeAtPreferred(preferredSize), sizeAtExpanding(preferredSize),
- sizeAtMaximum(preferredSize),
- graphicsAnchor(0),
- skipInPreferred(0), type(Normal), hasSize(true),
- isLayoutAnchor(false) {}
-
- AnchorData(qreal size)
- : QSimplexVariable(), from(0), to(0),
- minSize(size), prefSize(size), maxSize(size),
- sizeAtMinimum(size), sizeAtPreferred(size), sizeAtExpanding(size),
- sizeAtMaximum(size),
- graphicsAnchor(0),
- skipInPreferred(0), type(Normal), hasSize(true),
- isLayoutAnchor(false) {}
AnchorData()
: QSimplexVariable(), from(0), to(0),
- minSize(0), prefSize(0), maxSize(0),
- sizeAtMinimum(0), sizeAtPreferred(0), sizeAtExpanding(0),
- sizeAtMaximum(0),
- graphicsAnchor(0),
- skipInPreferred(0), type(Normal), hasSize(false),
- isLayoutAnchor(false) {}
+ minSize(0), prefSize(0), expSize(0), maxSize(0),
+ sizeAtMinimum(0), sizeAtPreferred(0),
+ sizeAtExpanding(0), sizeAtMaximum(0),
+ graphicsAnchor(0), skipInPreferred(0),
+ type(Normal), hasSize(true), isLayoutAnchor(false),
+ isExpanding(false) {}
virtual void updateChildrenSizes() {}
virtual void refreshSizeHints(qreal effectiveSpacing);
@@ -192,6 +174,7 @@ struct AnchorData : public QSimplexVariable {
{
minSize = size;
prefSize = size;
+ expSize = size;
maxSize = size;
sizeAtMinimum = size;
sizeAtPreferred = size;
@@ -215,6 +198,7 @@ struct AnchorData : public QSimplexVariable {
// size.
qreal minSize;
qreal prefSize;
+ qreal expSize;
qreal maxSize;
// These attributes define which sizes should that anchor be in when the
@@ -231,17 +215,6 @@ struct AnchorData : public QSimplexVariable {
uint hasSize : 1; // if false, get size from style.
uint isLayoutAnchor : 1; // if this anchor is connected to a layout 'edge'
uint isExpanding : 1; // if true, expands before other anchors
-
-protected:
- AnchorData(Type type, qreal size = 0)
- : QSimplexVariable(), from(0), to(0),
- minSize(size), prefSize(size),
- maxSize(size), sizeAtMinimum(size),
- sizeAtPreferred(size), sizeAtExpanding(size),
- sizeAtMaximum(size),
- graphicsAnchor(0),
- skipInPreferred(0), type(type), hasSize(true),
- isLayoutAnchor(false) {}
};
#ifdef QT_DEBUG
@@ -253,8 +226,10 @@ inline QString AnchorData::toString() const
struct SequentialAnchorData : public AnchorData
{
- SequentialAnchorData() : AnchorData(AnchorData::Sequential)
+ SequentialAnchorData() : AnchorData()
{
+ type = AnchorData::Sequential;
+ hasSize = true;
#ifdef QT_DEBUG
name = QLatin1String("SequentialAnchorData");
#endif
@@ -278,9 +253,11 @@ struct SequentialAnchorData : public AnchorData
struct ParallelAnchorData : public AnchorData
{
ParallelAnchorData(AnchorData *first, AnchorData *second)
- : AnchorData(AnchorData::Parallel),
- firstEdge(first), secondEdge(second)
+ : AnchorData(), firstEdge(first), secondEdge(second)
{
+ type = AnchorData::Parallel;
+ hasSize = true;
+
// ### Those asserts force that both child anchors have the same direction,
// but can't we simplify a pair of anchors in opposite directions?
Q_ASSERT(first->from == second->from);