| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
| |
spacing.
|
|
|
|
| |
Hopefully we won't need it more...
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
In order to be consistent with QGraphicsGridLayout(QGGL), we remove the
void setSpacing(Qt::Orientations );
qreal spacing(Qt::Orientations );
in favor to
void setHorizontalSpacing(qreal spacing);
void setVerticalSpacing(qreal spacing);
void setSpacing(qreal spacing);
qreal horizontalSpacing() const;
qreal verticalSpacing() const;
The API for setting and retrieving spacings should now be the same as
in QGGL.
|
|
|
|
|
| |
This was done to avoid any potential shadowing problems (we already use
the variable name 'spacing' several places)
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Bring back the refreshSizeHints() now that we have locally the
necessary information to get the size hints given an arbitrary anchor
data. We also created a bit to set whether the AnchorData is an anchor
of a layout (i.e. connects the layout with something else) or not.
This costs one pointer more in the AnchorData, but simplifies a good
deal of code and avoid traversing the graph to get this information
back, so I think it's worthwhile.
Signed-off-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
Reviewed-by: Artur Duque de Souza <artur.souza@openbossa.org>
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Make AnchorData aware of both vertices instead only one (the
origin). This information is useful for many functions when working in
simplified mode. Changed the name "origin" to "from", and add an "to" field.
Also change setAnchorSizeHintsFromItems() and its helpers to make use
of this information. In a later commit we will rollback to using
recursion for initializing the size hint information.
Signed-off-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
Reviewed-by: Artur Duque de Souza <artur.souza@openbossa.org>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This commit makes setAnchorSizeHintsFromItems() support a simplified
graph. Instead of going recursively, since AnchorData doesn't have all
needed information, we make a list with all anchors/vertexpairs with
dependencies first. That way we are sure to fill all information, and
the group anchors can peek at its children anchors (dependencies) and
they'll have updated information.
This solutions doesn't require refreshSizeHints(). Alternative
solutions that we might consider are: complementing the AnchorData
information or making refreshSizeHints() take two AnchorVertex as
parameters and use the recursive approach.
Signed-off-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
Reviewed-by: Artur Duque de Souza <artur.souza@openbossa.org>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Add variables to track whether the graph is simplified or not, as well
as make the functions that need it simplified/restored call the
corresponding functions. The functions look at the state variables, so
it's safe to just call them.
Also added Q_ASSERT() through the code paths that SHOULD have the full
graph (not simplified), for making easy to track bugs in future
refactorings.
Ironically this commit cause more calls to simplify/restore right now,
but the state will be better when we fix some functions to be
simplification compatible ;-)
Signed-off-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
Reviewed-by: Artur Duque de Souza <artur.souza@openbossa.org>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
We changed the parallel example because the expected values for
preferred size are wrong. Before we had a parallel anchor ("d|e") that
should have the maximum preferred of the both children, so this end up
being 170. This parallel is in a sequence with another item ("b") with
a preferred of 150 ending up with 320.
This group is in parallel with "c" that has a maximum of 300. So in
the preferred size of the layout, the group was constraint to 300,
which would be proportionally distributed between "b" and "d|e", and
50%/50% as the test expected.
The proportional distribution is a feature and we changed the test to
illustrate that more. We gave a bump in "c" maximum to 350 and "b"
maximum to 300, so the preferred is 100% for both "b" and "d|e", and
the proportional feature shows up in the maximum allocation, which is
not 100% for the group (b and d|e).
In the group, the maximum possible is 500 but the layout only allows
350, so the sizes need to be proportionally, but in relation not to
zero, but to the preferred which is 320 (this is the same logic used
for setGeometry()). So the growth is 30 / (500 - 320) = 30 / 180 = 1/6.
This 1/6 should be the factor given to the children (b and d|e),
taking their preferred sizes as starting points.
Note that the test still fails, but serve as a milestone to see when
the feature is correct implemented.
Signed-off-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
Reviewed-by: Artur Duque de Souza <artur.souza@openbossa.org>
|
|
|
|
|
|
|
|
|
|
| |
This test (which fails right now) check whether a sequential anchor is
distributing proportionally the size between its parts. This should pass
when we make calculateVertexPositions() work together with the simplified
graph.
Signed-off-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
Reviewed-by: Artur Duque de Souza <artur.souza@openbossa.org>
|
|
|
|
|
|
|
|
|
|
|
|
| |
Re-start the simplification procedure every time there's a change it
the adjacent count of a vertex -- which happens when a new parallel
anchor is created.
The original algorithm stopped some simplifications too early,
demanding the simplex unnecessarily.
Signed-off-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
Reviewed-by: Artur Duque de Souza <artur.souza@openbossa.org>
|
|
|
|
|
|
|
|
| |
Enable simplification by default. Allow disable during runtime by
using the environment variable QT_ANCHORLAYOUT_NO_SIMPLIFICATION=1 when
running the code.
Signed-off-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Adding tests that were helpful during debugging simplification
- example: a replica of the anchorlayout example, which has a few interesting
cases.
- parallel2: a small pararell test case, subset of example.
- snakeOppositeDirections: snake but with connections in the opposite
directions (this will end up with anchors with opposite directions).
- fairDistributionOppositeDirections: same as before, but in the end,
this should be taken care by our API which makes internally the same as
fairDistribution.
Some work on adding QCOMPARE() statements may still be needed for this
examples.
Note that is interesting to notice (maybe we can make this available
for the test checking automatically) whether the simplex is being used
or not when simplification is active.
Signed-off-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
|
|
|
|
|
|
| |
Useful for verifying whether Simplex is being triggered or not.
Signed-off-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
|
|
|
|
|
|
|
|
| |
The function setAnchorSizeHintsFromDefaults() is not necessary, since
a more updated version (ready or almost-ready for simplification) was
added: setAnchorSizeHintsFromItems().
Signed-off-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
|
|
|
|
|
|
|
|
|
| |
Instead of going through all anchors after the calculation of the graphs,
do it as early as possible for each part (trunk and nonTrunks) and
recursively updates the children in case of a simplified graph.
Signed-off-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
Reviewed-by: Artur Duque de Souza <artur.souza@openbossa.org>
|
|
|
|
| |
Signed-off-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
In simplification, the preferred size of a parallel group should get the
maximum preferred size (and bound it to the maximum size). This follows
the principle that for an layout item: 'growing is better than
shrinking', and is consistent with what our linear program also do.
This patch also make sure that the sizeAt* are properly initialized to
the preferred size, the idea is if there's no restriction upon an
anchor, it'll keep it's preferred size no matter what.
Signed-off-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
Reviewed-by: Artur Duque de Souza <artur.souza@openbossa.org>
|
|
|
|
| |
Patch from Jan-Arve.
|
|
|
|
| |
Patch from Jan-Arve.
|
|
|
|
|
|
|
|
|
| |
This reverts commit 9e701f76f7478ea078e58076c91fee0d2ec505b4 and also
add a comment explaining why is needed to delay the creation of the
nonTrunkVariables to a later moment.
Signed-off-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
Reviewed-by: Artur Duque de Souza <artur.souza@openbossa.org>
|
|
|
|
|
|
|
|
| |
More user friendly API for anchor layouts. Changed method names
and also provided more methods to receive spacing.
Signed-off-by: Artur Duque de Souza <artur.souza@openbossa.org>
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
|
| |
|
| |
|
|
|
|
| |
ready.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The problem was that if an item had a center anchor and we removed the
left-center anchor before we called removeCenterAnchors().
Suppose the center vertex had 3 edges, (refcount was 3)
removeAnchor would then *first* remove the left-center edge, causing the
internalVertex refcount to go to 2. That would cause removeInternalVertex()
to try to "merge" the two center anchors by calling removeCenterAnchors().
Of course, calling removeCenterAnchors at that point did not work since
removeCenterAnchors() assumed that the only two edges connected to the center
vertex was its internal left-center and center-right anchors. This was not
the case, and the assertion
Q_ASSERT(first && center && last);
was triggered, since first (or last) was removed at that point.
Of course it was not enough to simply call removeCenterAnchors first,
because that function assumed that the only two anchors connected to the
center vertex was "internal center anchors".
removeAnchors is a bit special since we are not really interested in
first converting the "internal center anchors" to a single internal anchor
because the ultimate goal of that function is to remove *all* anchors.
The solution was the additional argument "substitute" to indicate
that we really just want to substitute with a simpler anchor (normal
behaviour). If not, we really just want to delete the center anchors (don't
even try to merge them into a simple internal anchor).
|
|
|
|
|
|
|
| |
This gives a list of all "edges" in the graph, but each edge is
specified as a pair of vertices, since you cannot easily know the
two AnchorVertex'es of an EdgeData.
Added some debug stuff.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This commit enables graph simplification in its simplest way, which is
to simplify the graph, run simplex and then restore it back.
It also adds code to handle cases where the simplification handles
the whole graph, and that therefore no simplex needs to be run.
Additionally, the updateChildrenSizes() method is called on every
root anchor in order to propagate the new sizes down the tree.
A know issue appeared after this commit, as the quote below explains:
=====
Q_ASSERT error in "Parallel" test
That's something that started happening in the Parallel test
(tests/auto/qgraphicsanchorlayout) after my commit of today, that enables
simplification. I haven't been able to investigate it deeply but that's what
I know about it:
- It's triggered when the layout is destroyed, more precisely, from within
"deleteLayoutEdges". What happens is that the layout structural anchors are
missing at that point.
- I suspect there's something to do with the simplifyGraph() and/or
restoreSimplifyGraph() code. I say that because I tried moving the
"restoreSimplifiedGraph" call from the end of the calculateGraph(s) method
to the line exactly below the "simplifyGraph()" and the error still happens.
That means that simplifying and then immediately restoring the graph might
not leave it to the point where it was before the simplification.
====
Signed-off-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org>
|
|
|
|
|
|
|
| |
That's too important a method to remain without at least some doc ;)
Signed-off-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org>
Reviewed-by: Jan-Arve Sæther <jan-arve.saether@nokia.com>
|
|
|
|
|
|
|
|
|
|
|
| |
This method is meant to be called by the AnchorLayout after it has
set the sizes of all root anchors of a simplified graph.
The idea here it that these anchors will then propagate its new
sizes down the simplification tree.
Signed-off-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org>
Reviewed-by: Jan-Arve Sæther <jan-arve.saether@nokia.com>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
We were missing a call to "removeCenterAnchors" in the "removeAnchors"
method. To solve that, and also reduce the number of useless calls to
that method, this commit:
1) Calls it only from "removeInternalVertex"
2) Does some preliminary testing before calling it
3) Replace the former test inside "removeCenterAnchors" by a Q_ASSERT
It also adds other Q_ASSERTs to protect us from regression bugs.
Signed-off-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org>
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
|
|
|
|
|
|
|
|
| |
Using same logic as for the items. We now create the center anchors
on demand and delete them when not needed anymore.
Signed-off-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org>
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
|
|
|
|
| |
Signed-off-by: Jesus Sanchez-Palencia <jesus.palencia@openbossa.org>
|
|
|
|
|
|
|
|
|
| |
Continuing the effort to enforcing center anchors to exist only
when needed, this commit removes the central anchors when they
are no longer used.
Signed-off-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org>
Reviewed-by: Anselmo Lacerda S. de Melo <anselmo.melo@openbossa.org>
|
|
|
|
|
|
|
|
|
|
| |
Since the previous commit, center anchors are no longer created
when an item is added to the layout.
This commit creates only the required anchors, when needed.
Signed-off-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org>
Reviewed-by: Anselmo Lacerda S. de Melo <anselmo.melo@openbossa.org>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Previously we would create two half anchors internally to each
item added to the layout. These anchors are meant to enforce the
central anchorage point remains on its position.
It is not effecient however, to create these anchors for all
items if not all of them will have anchors linked to their center.
This commit removes the creation of center anchors, the idea is
to postpone this to the moment their are really needed, therefore
reducing the number of variables and constraints sent to the simplex
solver on the average case.
Signed-off-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org>
Reviewed-by: Anselmo Lacerda S. de Melo <anselmo.melo@openbossa.org>
|
|
|
|
|
|
|
|
|
|
| |
The layout was not aware of the fact an anchor could already exist when it
was added. This commit ensures that only one anchor exists between two
vertices to avoid unwanted behavior and memory leaks (AnchorData's and
Vertices would leak otherwise).
Signed-off-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org>
Reviewed-by: Anselmo Lacerda S. de Melo <anselmo.melo@openbossa.org>
|
|
|
|
|
|
|
| |
To avoid non-deterministic behavior.
Signed-off-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org>
Reviewed-by: Anselmo Lacerda S. de Melo <anselmo.melo@openbossa.org>
|
|
|
|
|
|
|
|
| |
Replacing two IF tests for Q_ASSERT statements instead. These tests
are sanity checks that should never be false.
Signed-off-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org>
Reviewed-by: Anselmo Lacerda S. de Melo <anselmo.melo@openbossa.org>
|
|
|
|
|
| |
Since the spacing will be 0 in most cases, we therefore "invert" the
if (..) to only check for the cases where the spacing will *not* be zero.
|
| |
|
| |
|
|
|
|
|
| |
This broke after commit 0872f78d8924b9bea8b8da6618e24cd7d06c5d7d that
fixed the default spacings.
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This commit fixes several related issues:
1. QGAL::anchor() had a spacing argument that defaulted to 0. That made
it impossible to know if the user meant that the spacing should be 0
or if the spacing should be picked from the style.
Instead we have to overload anchor, so now we have one function that
does not take spacing as an argument. That one will create an anchor
where the spacing is queried from the style. The other overload
allows the user to explicitly set the spacing, thus the default
spacing is ignored.
2. Make sure we pick up the spacing correctly from the style if needed.
setAnchorSizeHintsFromDefaults() will set the correct spacing on
anchors that was created without specifying a spacing value.
3. Add QGAL::anchor(Qt::Corner, ...) convenience function with an
overload (for the same reason as explained in 1.)
4. Added QGraphicsAnchorLayoutPrivate::anchor() as a helper function
that is called from all the 4 public API anchor() functions so that
we don't need to have duplicate code for argument checking etc.
5. Fix autotests. They assumed that anchor() without a spacing argument
created a spacing of 0.
|
|
|
|
|
|
|
|
| |
A small optimization.
Added a verification in combineRows to skip calculating
x = x + y*0.0 as it obviously won't change the value of x.
Signed-off-by: Anselmo Lacerda S. de Melo <anselmo.melo@openbossa.org>
|