summaryrefslogtreecommitdiffstats
path: root/src/gui/graphicsview
Commit message (Collapse)AuthorAgeFilesLines
* Merge commit 'origin/4.6' into 4.6Olivier Goffart2009-12-041-1/+1
|\
| * Merge commit 'c0b81480b2909b18ac15bdd124a562ae005c2f41' into origin-4.6Olivier Goffart2009-12-041-2/+2
| |\
| * | Fix for virtual keyboard poping up when it should not.Robert Griebl2009-12-031-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | Pressing and releasing the finger/stylus on an editable text widget should only trigger the input method if the release position is still within the widget's boundaries. Reviewed-by: axis
* | | Merge branch '4.6' of scm.dev.nokia.troll.no:qt/oslo-staging-2 into 4.6Jan-Arve Sæther2009-12-043-5/+4
|\ \ \
| * | | Fixes clipping bug in the embedded dialogs demo.Yoann Lopes2009-12-041-1/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The problem was that when using DeviceCoordinateCache for items in a scene, newly exposed areas were wrongly painted over the Pixmap in the cache, instead of blending into it. Autotest included. Task-number: QTBUG-657 Reviewed-by: Andreas Reviewed-by: bnilsen
| * | | Fix crash when QGraphicsItem destructor deletes other QGraphicsItemOlivier Goffart2009-12-041-2/+2
| | |/ | |/| | | | | | | | | | | | | Same fix as e7a10b00be3e4aa197900ecf424e6d44b07248ae Reviewed-by: Alexis
| * | Some doc fixesJan-Arve Sæther2009-12-031-2/+2
| |/ | | | | | | | | | | - Remove a lie. - When referring to the size of an anchor, refer to it consistently as 'spacing' instead of magnitude.
* | Merge branch 'fleury-ooo-sequential' into 4.6Jan-Arve Sæther2009-12-044-206/+438
|\ \ | |/ |/|
| * Made sure that we didn't reference dangling parallel anchors.Jan-Arve Sæther2009-12-041-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We cannot delete the parallel anchors before we do the actual vertex restoration, since the parallel anchors created by vertex simplification will always be connected to some of the AnchorVertexPair found in simplifiedVertices that we iterate over later. Thus, we must delete the parallel anchors created by vertex simplification after we have done the restoration of the vertices. (the parallel anchor will be properly dealt with (i.e. taken out of the graph as we do the restoration)), so not deleting it won't cause it to be revisited later if that is a worry. Reviewed-by: Eduardo M. Fleury
| * Rename the global limit to g_offset.Jan-Arve Sæther2009-12-031-13/+13
| | | | | | | | | | It is both a limit and an offset (the offset is dictated by the limit), but in the code is it interpreted as an offset.
| * Merge branch 'ooo-sequential' of ↵Jan-Arve Sæther2009-12-014-206/+438
| |\ | | | | | | | | | | | | | | | | | | git://gitorious.org/~fleury/qt/fleury-openbossa-clone into fleury-ooo-sequential Conflicts: tests/auto/qgraphicsanchorlayout/tst_qgraphicsanchorlayout.cpp
| | * QGAL: Remove deprecated assert clausesEduardo M. Fleury2009-11-271-16/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | These assert messages are no longer valid since some anchors can have their size not respected if they are in parallel with the layout and have size equal to "QWIDGETSIZE_MAX". Signed-off-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org> Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
| | * QGAL: Refactor solvePreferred to support min/maxPrefSizeEduardo M. Fleury2009-11-271-24/+69
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | With the addition of min and maxPrefSizeHints, the logic used in the preferred simplex had to be changed. The concept behind it is still the same, we minimize the deviation from each item's preferred size. Previously we would make an special effort to avoid items being shrunk, that's why the "shinker" simplex variables had larger multipliers in the objective function. Now we still have variables with large multipliers and others with small mutlipliers, but rather than differentiating between shrinker and/or grower variables, we classify them as "soft" or "hard". "Soft" variables, or slacks, are those that allow the anchor to change its value up to the minPref or maxPref boundaries, OTOH, "hard" slacks are those that allow the item to go all the way to its minimum or maximum sizes. Naturally, the "hard" slacks get large coeficients in the objective function while the "soft" ones get small ones. Now all the slack variables are restricted in size as to respect the boundaries of each interval: - Minimum to MinimumPreferred, - MinimumPreferred to Preferred, - Preferred to MaximumPreferred and - MaximumPreferred to Maximum With such limits, the SizeHint constraints became redundant in the calculation of preferred sizes so they are no longer used. Additionally, as an optimization, if a given interval is NULL (for instance, MinimumPreferred is equal to Preferred), then the associated slack variable would have its size restricted to zero, therefore it is not created at all. Signed-off-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org> Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
| | * QGAL: Add AnchorData::minPrefSize and maxPrefSizeEduardo M. Fleury2009-11-273-46/+149
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | With the addition of out-of-order sequential simplification, the calculation of preferred sizes became more complicated. In the past, when parallel anchors or the simplex solver had to decide between conflicting preferred sizes, they could assume that increasing the size of an anchor was better than decreasing it. That assumption comes from early discussions with Jan-Arve regarding the preferred size calculation algorithm. However, when ooo-sequential anchors exist, we can have a situation where increasing the size of an anchor can actually reduce the size of a simplified anchor inside it. To solve that, we need to expose some information regarding the internal anchors to the decision makers outside, ie. the simplex solver and parallel anchors. This information is now being provided in terms of two additional values present in each anchor, as follows: - minPrefSize: Always in the interval [minSize, prefSize]. Denotes the minimum size an anchor can assume as to avoid shrinking anchors below their preferred sizes. - maxPrefSize: Always in the interval [prefSize, maxSize]. Similar to the value above, but refering to the maximum size the anchor should assume. Some examples: 1) Standard anchor: 10 / 50 / 500 o----------------------------> Becomes: 10 / 50 / 50 / 500 / 500 o----------------------------> We'd rather grow than shrink, so we say that our preferred size is 50, but if we need to grow up to 500, that's OK. Note that we are still able to shrink all the way to 10, but it will hurt us more. 2) Two anchors: 100 / 200 / 500 10 / 20 / 40 o--------------------> <-------------------o Resulting sequential anchor: 60 / 160 / 180 / 480 / 490 o------------------------------------------> The resulting anchor have a preferred size of 180 but it can "easily" grow to 480 (only the first half grows). If it had to go all the way to 490 the second half would have to shrink below its preferred size. OTOH, if it had to shrink, it could go to 160 if the second half grew. However, shrinking even more, towards 60, would require the first half to shrink below its preferred size. With this information parallel and simplex are now able to choose the best solutions when solving conflicts. Signed-off-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org> Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
| | * QGAL: parallel anchors sometimes have to fix constraintsCaio Marcelo de Oliveira Filho2009-11-271-16/+35
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | For an out-of-order parallel anchor, i.e. when the second child is backwards in relation to the parallel anchor, we need to fix the constraints that used to have the second child. The parallel anchor will replace its child, but we must change the multiplier signal, so the constraint remain valid. This commit also changes the order of restoration steps, since now we depend on correct vertex information to fix back the constraints, we do it before the restoring of pair vertices. Signed-off-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org> Reviewed-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org>
| | * QGAL: move second child direction check to a functionCaio Marcelo de Oliveira Filho2009-11-272-12/+24
| | | | | | | | | | | | | | | | | | | | | | | | | | | In a parallel anchor, the second child anchor may be forward or backwards in relation to the parallel itself. Moves the directionality check to a function. It'll be useful in the next commit. Signed-off-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org> Reviewed-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org>
| | * QGAL: Use single arrow in "dumpGraph"Eduardo M. Fleury2009-11-271-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Modify the "dot" format graph to use a single arrow between each pair of vertices. Previously we would use two anchors (a black forward one and a gray backwards). With a single arrow the graph loooks cleaner. Signed-off-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org> Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
| | * QGAL: Enable out-of-order sequential simplificationEduardo M. Fleury2009-11-271-46/+23
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Modify the simplification code to allow the creation of out-of-order sequential anchors. Basically the "changedDirection" end-of-sequence condition was removed, also note that createSequence no longer bothers to revert the direction of anchors if the order it receives is not standard. Removing expect-fail clause from test since now we pass :-) Signed-off-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org> Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
| | * QGAL: Support for out-of-order sequential anchorsEduardo M. Fleury2009-11-271-6/+34
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Now sequential anchors account for the fact they may be composed of anchors with different directions. Both refreshSizeHints and updateChildrenSizes have been updated to support this situation. Signed-off-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org> Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
| | * QGAL: Do not revert negative anchorsJesus Sanchez-Palencia2009-11-272-23/+4
| | | | | | | | | | | | | | | | | | | | | | | | Since we now support anchors with size less then zero, we no longer need to revert anchors with negative spacing. Signed-off-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org> Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
| | * QGAL: Limit absolute size of anchors and add offset to calculationEduardo M. Fleury2009-11-272-12/+57
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This commit is groundwork for the support of negative-sized anchors by the simplex solver. The idea is to add to all variables an offset large enough to ensure they are never negative. The implementation limits all variable sizes in the range [-limit, limit] and feed them into the simplex with an offset of "limit". Subtracting this offset later to find out the real values. "limit" is defined as QWIDGETSIZE_MAX for platforms where qreal is double and as QWIDGETSIZE_MAX / 32 when it is float. This is to avoid numerical errors in the simplex solver. This commit also modifies the ASSERT clause inside QSimplex so it becomes less prone to false positives due to numerical errors. Signed-off-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org> Signed-off-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
| | * QGAL: Rename internalSizeHints to applySizePolicyEduardo M. Fleury2009-11-271-10/+15
| | | | | | | | | | | | | | | | | | | | | Former name did not reflect actual work done by the function. Signed-off-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org> Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
| | * QGAL: Fix memory management issues (leak + invalid read)Eduardo M. Fleury2009-11-272-6/+27
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Fixing QGraphicsAnchor memory leak and access to free'd region. -- Leak: User-created anchors have two representations in QGAL, one visible externally (QGraphicsAnchor) and other internal (AnchorData). When such anchors are removed externally (QGraphicsAnchor is deleted), the former implementation ensured that the internal representation would be deleted too. However the opposite was not true. In cases where the anchors are deleted internally (in the layout destructor, for instance, or when an item is removed through the removeAt API), the public QGraphicsAnchor object would leak. This commit ensures the deletion will happen in both directions and adds protection to avoid a deletion loop. -- Invalid read: In QGAL::removeAnchor(vertex1, vertex2), we read vertex information after calling removeAnchor_helper(vertex1, vertex2). The problem is that in cases where the removed anchor is the last anchor to connect to a center vertex, its removal will cause also the removal of such vertex. Thus, accessing the vertices after the removeAnchor_helper() call is unsafe. To solve that we cache the information we need and then clear the vertex pointers to avoid errors in the future. Signed-off-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org> Reviewed-by: Artur Duque de Souza <artur.souza@openbossa.org>
| | * QGAL: Prevent internal anchors from being exposed by QGAL::anchor()Eduardo M. Fleury2009-11-271-2/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Adding check to prevent the structural layout anchors as well as those internal to items, from being exposed through the public API. These checks also ensure no QGraphicsAnchor instances will be created for those anchors. Signed-off-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org> Reviewed-by: Artur Duque de Souza <artur.souza@openbossa.org>
| | * QGAL: default spacing can be unset using a negative valueEduardo M. Fleury2009-11-271-21/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | After a default spacing is set through QGAL::setSpacing() family of methods, the user must be able to unset it. To avoid adding another public method, we enabled this feature by allowing a negative value to be passed to those methods. Signed-off-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org> Reviewed-by: Anselmo Lacerda S. de Melo <anselmo.melo@openbossa.org>
* | | Only call updateFont if the font have changed.Alexis Menard2009-11-301-1/+2
|/ / | | | | | | | | | | | | | | | | When receiving the polish event, we call updateFont only if the font has changed (from the QApplication::font()). This avoid to clear sizeHints cache. Task-number:QTBUG-6272 Reviewed-by:janarve
* | Merge commit 'upstream/4.6' into oslo-staging-2/4.6Olivier Goffart2009-11-271-3/+3
|\ \
| * \ Merge commit oslo-staging-2/4.6 into upstream/4.6Olivier Goffart2009-11-275-226/+32
| |\ \ | | |/ | |/|
| * | Merge branch '4.6' of git@scm.dev.nokia.troll.no:qt/qt into 4.6David Boddie2009-11-253-12/+25
| |\ \
| * \ \ Merge branch '4.6' of git@scm.dev.nokia.troll.no:qt/oslo-staging-1 into 4.6David Boddie2009-11-242-1/+2
| |\ \ \
| * | | | Doc: Fixes to markup.David Boddie2009-11-241-3/+3
| | | | | | | | | | | | | | | | | | | | Reviewed-by: Trust Me
* | | | | Merge branch 'fixes' of ↵Jan-Arve Sæther2009-11-271-21/+2
|\ \ \ \ \ | |_|_|_|/ |/| | | | | | | | | | | | | | | | | | | | | | | | git://gitorious.org/~fleury/qt/fleury-openbossa-clone into fleury-fixes Conflicts: tests/auto/qgraphicsanchorlayout/tst_qgraphicsanchorlayout.cpp
| * | | | QGAL: default spacing can be unset using a negative valueEduardo M. Fleury2009-11-251-21/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | After a default spacing is set through QGAL::setSpacing() family of methods, the user must be able to unset it. To avoid adding another public method, we enabled this feature by allowing a negative value to be passed to those methods. Signed-off-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org> Reviewed-by: Anselmo Lacerda S. de Melo <anselmo.melo@openbossa.org>
| * | | | QGAL: sizeHint constraints needed by anchors parallel with the layoutEduardo M. Fleury2009-11-251-6/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The method "constraintsFromSizeHints" does not create constraints for anchors between the layout vertices _only if_ these anchors have infinite maximum sizes. However, this test was not being done for half-anchors, ie. those created when the layout center anchorage point is used. That was OK when there was no chance that the center anchors had been simplified by a parallel anchor. Nowadays there's a chance that happens, so the test was extended. Commit also adds a test to avoid regressions. Signed-off-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org> Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
| * | | | QGAL: deal correctly with anchors in parallel with the layoutCaio Marcelo de Oliveira Filho2009-11-252-6/+4
| | |/ / | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In the preferred size calculation, we should not add 'layout anchors' (either one or the two halves) into the objective function, since the layout doesn't impose or prefer any size at all. This already worked for cases when the layout anchor is one, but not when we have two halves. The mechanism was a 'skipInPreferred' flag that were not being set. The flag is pretty much redundant right now, since we can get this information from the 'isLayoutAnchor' flag. So, the flag was removed and a test was added for both a parallel case with the entire layout and other with half of the layout (which wasn't passing before). Signed-off-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org> Reviewed-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org>
* | | | Fix a crash in KDE/Plasma with QGraphicsView. TopLevel list of itemsAlexis Menard2009-11-261-1/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | was corrupted. This nasty bug was triggered when the index sort the top level list of items. We forgot to set the flag topLevelSequentialOrdering to false so when an item was removed from the top level list it was using the sibling index which can be not valid anymore since the list is not sorted by sequential order. So it let some dangling pointers in the list which make processDirtyItemRecursive crash the next paint event. Reviewed-by:bnilsen Reviewed-by:andreas
* | | | QGraphicsTextItem::setDefaultTextColor check change before calling update()Olivier Goffart2009-11-261-1/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Some applications call setDefaultTextColor in the paint event. Task-number: QTBUG-6242 Reviewed-by: Gabriel
* | | | Remove unused variables in QGraphicsItem and QGraphicsScene.Bjørn Erik Nilsen2009-11-254-34/+20
| | | | | | | | | | | | | | | | | | | | maybeDirtyClipPath and ingoreClipping is not relevant anymore now that the cached clip path is removed.
* | | | Remove caching of QGraphicsItem::clipPath().Bjørn Erik Nilsen2009-11-253-191/+8
| |_|/ |/| | | | | | | | | | | | | | | | | | | | | | | The cache was added in 4.5 and was useful at that time. With 4.6 it is not relevant anymore since the only use case for it is item-lookup releated to mouse events and collision detection, so the overhead of maintaining the cache is more pain than gain. All existing auto tests pass.
* | | Mac: Fixes painting artifacts in Graphics ViewBjørn Erik Nilsen2009-11-241-0/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | Problem was that pending updates were not dispatched properly on the Mac, which is strongly required in order to get correct behavior wrt QGraphicsItem::update(). Task-number: QTBUG-4160 Reviewed-by: bnilsen
* | | Merge branch 'fixes' of ↵Jan-Arve Sæther2009-11-232-12/+18
|\ \ \ | |/ / |/| | | | | git://gitorious.org/~fleury/qt/fleury-openbossa-clone into fleury-fixes2
| * | QGAL: sizeHint constraints needed by anchors parallel with the layoutEduardo M. Fleury2009-11-201-6/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The method "constraintsFromSizeHints" does not create constraints for anchors between the layout vertices _only if_ these anchors have infinite maximum sizes. However, this test was not being done for half-anchors, ie. those created when the layout center anchorage point is used. That was OK when there was no chance that the center anchors had been simplified by a parallel anchor. Nowadays there's a chance that happens, so the test was extended. Commit also adds a test to avoid regressions. Signed-off-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org> Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
| * | QGAL: deal correctly with anchors in parallel with the layoutCaio Marcelo de Oliveira Filho2009-11-202-6/+4
| |/ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In the preferred size calculation, we should not add 'layout anchors' (either one or the two halves) into the objective function, since the layout doesn't impose or prefer any size at all. This already worked for cases when the layout anchor is one, but not when we have two halves. The mechanism was a 'skipInPreferred' flag that were not being set. The flag is pretty much redundant right now, since we can get this information from the 'isLayoutAnchor' flag. So, the flag was removed and a test was added for both a parallel case with the entire layout and other with half of the layout (which wasn't passing before). Signed-off-by: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org> Reviewed-by: Eduardo M. Fleury <eduardo.fleury@openbossa.org>
* | Fixes painting issues when scaling a QGraphicsView.Yoann Lopes2009-11-201-1/+1
| | | | | | | | | | | | | | | | | | The problem was that the 'exposed rectangle' passed to the Item's paint() function was rounded to Int values, whereas the one passed to drawBackground and drawForeground was not. Autotest included. Task-number: QTBUG-5859 Reviewed-by: bnilsen
* | Mark QGraphicsItemAnimation as deprecatedThierry Bastian2009-11-191-0/+1
|/ | | | Task-number: QTBUG-5968
* Ran the script utils/normalizeOlivier Goffart2009-11-181-2/+2
| | | | Over src/ tools/ examples/ and demos/
* Crash when rendering a scene using DeviceCoordinateCacheGabriel de Dietrich2009-11-181-3/+6
| | | | | | | | | | The execution flow would allow the widget the scene would be rendered on to be null. However this very widget was being used when using DeviceCoordinateCache to get the desktop size. We now skip this optimisation when no widget is given. Auto-test included. Reviewed-by: bnilsen Task-number: QTBUG-5904
* Merge upstream/4.6 into oslo-staging-2Olivier Goffart2009-11-171-2/+3
|\
| * Merge oslo-staging-2/4.6 into upstream/4.6Olivier Goffart2009-11-171-0/+2
| |\
| * \ Merge remote branch 'staging/4.6' into 4.6Simon Hausmann2009-11-171-2/+3
| |\ \