summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Roard <nicolasroard@google.com>2018-03-19 20:28:39 -0700
committerNicolas Roard <nicolasroard@google.com>2018-03-20 04:31:24 +0000
commit947c83efa6acb38519b71070134d79b7e5a0a447 (patch)
treec26add342e603a66870ac74c01cd9a6a8d41797c
parentec94fde36dee1c7586ef91812c61c92415797619 (diff)
downloadsherpa-947c83efa6acb38519b71070134d79b7e5a0a447.tar.gz
Change Chains margins behavior. Margins are now not part of the "spread" space.
They are still additive. Test: added in ChainTest, plus added check163 in sherpa and updated checks in sherpa. Fixes: 73521836, 74537416, 74130324
-rw-r--r--solver/src/main/java/android/support/constraint/solver/widgets/Chain.java28
-rw-r--r--solver/src/test/java/android/support/constraint/solver/ChainTest.java34
2 files changed, 53 insertions, 9 deletions
diff --git a/solver/src/main/java/android/support/constraint/solver/widgets/Chain.java b/solver/src/main/java/android/support/constraint/solver/widgets/Chain.java
index 777ae64..3ec6fca 100644
--- a/solver/src/main/java/android/support/constraint/solver/widgets/Chain.java
+++ b/solver/src/main/java/android/support/constraint/solver/widgets/Chain.java
@@ -317,13 +317,12 @@ class Chain {
SolverVariable beginNext = null;
SolverVariable beginNextTarget = null;
int beginMargin = beginAnchor.getMargin();
- int nextMargin = 0;
+ int nextMargin = widget.mListAnchors[offset + 1].getMargin();
if (next != null) {
beginNextAnchor = next.mListAnchors[offset];
beginNext = beginNextAnchor.mSolverVariable;
beginNextTarget = beginNextAnchor.mTarget != null ? beginNextAnchor.mTarget.mSolverVariable : null;
- nextMargin = beginNextAnchor.getMargin();
} else {
beginNextAnchor = last.mListAnchors[offset + 1].mTarget;
if (beginNextAnchor != null) {
@@ -332,12 +331,18 @@ class Chain {
beginNextTarget = widget.mListAnchors[offset + 1].mSolverVariable;
}
+ if (beginNextAnchor != null) {
+ nextMargin += beginNextAnchor.getMargin();
+ }
+ if (previousVisibleWidget != null) {
+ beginMargin += previousVisibleWidget.mListAnchors[offset + 1].getMargin();
+ }
if (begin != null && beginTarget != null && beginNext != null && beginNextTarget != null) {
- int margin1 = 0;
+ int margin1 = beginMargin;
if (widget == firstVisibleWidget) {
margin1 = firstVisibleWidget.mListAnchors[offset].getMargin();
}
- int margin2 = 0;
+ int margin2 = nextMargin;
if (widget == lastVisibleWidget) {
margin2 = lastVisibleWidget.mListAnchors[offset + 1].getMargin();
}
@@ -355,7 +360,7 @@ class Chain {
ConstraintWidget previousVisibleWidget = firstVisibleWidget;
while (widget != null) {
next = widget.mListNextVisibleWidget[orientation];
- if (widget != firstVisibleWidget && next != null) {
+ if (widget != firstVisibleWidget && widget != lastVisibleWidget && next != null) {
if (next == lastVisibleWidget) {
next = null;
}
@@ -367,13 +372,12 @@ class Chain {
SolverVariable beginNext = null;
SolverVariable beginNextTarget = null;
int beginMargin = beginAnchor.getMargin();
- int nextMargin = 0;
+ int nextMargin = widget.mListAnchors[offset + 1].getMargin();
if (next != null) {
beginNextAnchor = next.mListAnchors[offset];
beginNext = beginNextAnchor.mSolverVariable;
beginNextTarget = beginNextAnchor.mTarget != null ? beginNextAnchor.mTarget.mSolverVariable : null;
- nextMargin = beginNextAnchor.getMargin();
} else {
beginNextAnchor = widget.mListAnchors[offset + 1].mTarget;
if (beginNextAnchor != null) {
@@ -382,9 +386,15 @@ class Chain {
beginNextTarget = widget.mListAnchors[offset + 1].mSolverVariable;
}
+ if (beginNextAnchor != null) {
+ nextMargin += beginNextAnchor.getMargin();
+ }
+ if (previousVisibleWidget != null) {
+ beginMargin += previousVisibleWidget.mListAnchors[offset + 1].getMargin();
+ }
if (begin != null && beginTarget != null && beginNext != null && beginNextTarget != null) {
- system.addCentering(begin, beginTarget, 0, 0.5f,
- beginNext, beginNextTarget, 0,
+ system.addCentering(begin, beginTarget, beginMargin, 0.5f,
+ beginNext, beginNextTarget, nextMargin,
SolverVariable.STRENGTH_HIGHEST);
}
}
diff --git a/solver/src/test/java/android/support/constraint/solver/ChainTest.java b/solver/src/test/java/android/support/constraint/solver/ChainTest.java
index 53c7c90..8fc02d4 100644
--- a/solver/src/test/java/android/support/constraint/solver/ChainTest.java
+++ b/solver/src/test/java/android/support/constraint/solver/ChainTest.java
@@ -28,6 +28,40 @@ import static org.testng.Assert.assertEquals;
public class ChainTest {
@Test
+ public void testSpreadInsideChain2() {
+ ConstraintWidgetContainer root = new ConstraintWidgetContainer(0, 0, 600, 600);
+ ConstraintWidget A = new ConstraintWidget(100, 20);
+ ConstraintWidget B = new ConstraintWidget(100, 20);
+ ConstraintWidget C = new ConstraintWidget(100, 20);
+ root.setDebugName("root");
+ A.setDebugName("A");
+ B.setDebugName("B");
+ C.setDebugName("C");
+ root.add(A);
+ root.add(B);
+ root.add(C);
+
+ A.connect(ConstraintAnchor.Type.LEFT, root, ConstraintAnchor.Type.LEFT);
+ A.connect(ConstraintAnchor.Type.RIGHT, B, ConstraintAnchor.Type.LEFT);
+ B.connect(ConstraintAnchor.Type.LEFT, A, ConstraintAnchor.Type.RIGHT);
+ B.connect(ConstraintAnchor.Type.RIGHT, C, ConstraintAnchor.Type.LEFT);
+ C.connect(ConstraintAnchor.Type.LEFT, B, ConstraintAnchor.Type.RIGHT, 25);
+ C.connect(ConstraintAnchor.Type.RIGHT, root, ConstraintAnchor.Type.RIGHT);
+
+ A.setHorizontalChainStyle(ConstraintWidget.CHAIN_SPREAD_INSIDE);
+ B.setHorizontalDimensionBehaviour(ConstraintWidget.DimensionBehaviour.MATCH_CONSTRAINT);
+
+ root.layout();
+ System.out.println("A: " + A + " B: " + B + " C: " + C);
+ assertEquals(A.getLeft(), 0);
+ assertEquals(A.getRight(), 100);
+ assertEquals(B.getLeft(), 100);
+ assertEquals(B.getRight(), 475);
+ assertEquals(C.getLeft(), 500);
+ assertEquals(C.getRight(), 600);
+ }
+
+ @Test
public void testPackChain() {
ConstraintWidgetContainer root = new ConstraintWidgetContainer(0, 0, 600, 600);
ConstraintWidget A = new ConstraintWidget(100, 20);