Add support for marginVertical and marginHorizontal
* implement margin as an array of values * apply margins with the correct priority (e.g. left, horizontal, all) * update transpiler & tests
This commit is contained in:
@@ -54,17 +54,22 @@ function __transpileSingleTestToJava(code) {
|
||||
return 'layout.' + (match1 == 'TOP' ? 'y' : 'x');
|
||||
})
|
||||
.replace( // style.position[CSS_TOP] => style.positionTop
|
||||
/style\.(position|margin|border|padding)\[CSS_(TOP|BOTTOM|LEFT|RIGHT)\]/g,
|
||||
/style\.(position|border|padding)\[CSS_(TOP|BOTTOM|LEFT|RIGHT)\]/g,
|
||||
function (str, match1, match2) {
|
||||
return 'style.' + match1 + match2[0] + match2.substring(1).toLowerCase();
|
||||
})
|
||||
.replace( // style.margin[CSS_TOP] => style.margin[CSSStyle.SPACING_TOP]
|
||||
/style\.(margin)\[CSS_(TOP|BOTTOM|LEFT|RIGHT)\]/g,
|
||||
function (str, match1, match2) {
|
||||
return 'style.' + match1 + '[CSSStyle.SPACING_' + match2 + ']';
|
||||
})
|
||||
.replace(/get_child\(.*context\,\s([^\)]+)\)/g, 'getChildAt($1)')
|
||||
.replace(/init_css_node_children/g, 'addChildren')
|
||||
.replace(/css_node_t(\s)\*/g, 'TestCSSNode$1')
|
||||
.replace(/\->/g, '.')
|
||||
.replace(/(\d+\.\d+)/g, '$1f')
|
||||
.replace( // style.flex_direction => style.flexDirection
|
||||
/style\.([^_\s]+)_(\w)(\w+)/g,
|
||||
/style\.([^_\[\]\s]+)_(\w)(\w+)/g,
|
||||
function (str, match1, match2, match3) {
|
||||
return 'style.' + match1 + match2.toUpperCase() + match3;
|
||||
})
|
||||
|
@@ -35,6 +35,24 @@ public class CSSNode {
|
||||
UP_TO_DATE,
|
||||
}
|
||||
|
||||
public static final int SPACING_ALL = 0;
|
||||
public static final int SPACING_VERTICAL = 1;
|
||||
public static final int SPACING_HORIZONTAL = 2;
|
||||
public static final int SPACING_LEFT = 3;
|
||||
public static final int SPACING_RIGHT = 4;
|
||||
public static final int SPACING_TOP = 5;
|
||||
public static final int SPACING_BOTTOM = 6;
|
||||
|
||||
private final float[] mMargin = new float[] {
|
||||
Float.NaN,
|
||||
Float.NaN,
|
||||
Float.NaN,
|
||||
Float.NaN,
|
||||
Float.NaN,
|
||||
Float.NaN,
|
||||
Float.NaN
|
||||
};
|
||||
|
||||
// Only one copy kept around to keep from allocating a bunch of MeasureOutput objects
|
||||
// NOT THREAD SAFE! NOT RE-ENTRANT SAFE!
|
||||
private static final MeasureOutput MEASURE_OUTPUT = new MeasureOutput();
|
||||
@@ -243,30 +261,33 @@ public class CSSNode {
|
||||
}
|
||||
}
|
||||
|
||||
public void setMarginTop(float marginTop) {
|
||||
if (!valuesEqual(style.marginTop, marginTop)) {
|
||||
style.marginTop = marginTop;
|
||||
dirty();
|
||||
}
|
||||
public void setMargin(int spacingType, float margin) {
|
||||
setSpacing(mMargin, spacingType, margin, style.margin);
|
||||
}
|
||||
|
||||
public void setMarginBottom(float marginBottom) {
|
||||
if (!valuesEqual(style.marginBottom, marginBottom)) {
|
||||
style.marginBottom = marginBottom;
|
||||
dirty();
|
||||
}
|
||||
}
|
||||
|
||||
public void setMarginLeft(float marginLeft) {
|
||||
if (!valuesEqual(style.marginLeft, marginLeft)) {
|
||||
style.marginLeft = marginLeft;
|
||||
dirty();
|
||||
}
|
||||
}
|
||||
|
||||
public void setMarginRight(float marginRight) {
|
||||
if (!valuesEqual(style.marginRight, marginRight)) {
|
||||
style.marginRight = marginRight;
|
||||
protected void setSpacing(float[] spacingDef, int spacingType, float spacing, float[] cssStyle) {
|
||||
if (!valuesEqual(spacingDef[spacingType], spacing)) {
|
||||
spacingDef[spacingType] = spacing;
|
||||
cssStyle[CSSStyle.SPACING_TOP] =
|
||||
!Float.isNaN(spacingDef[SPACING_TOP]) ? spacingDef[SPACING_TOP]
|
||||
: !Float.isNaN(spacingDef[SPACING_VERTICAL]) ? spacingDef[SPACING_VERTICAL]
|
||||
: !Float.isNaN(spacingDef[SPACING_ALL]) ? spacingDef[SPACING_ALL]
|
||||
: 0;
|
||||
cssStyle[CSSStyle.SPACING_BOTTOM] =
|
||||
!Float.isNaN(spacingDef[SPACING_BOTTOM]) ? spacingDef[SPACING_BOTTOM]
|
||||
: !Float.isNaN(spacingDef[SPACING_VERTICAL]) ? spacingDef[SPACING_VERTICAL]
|
||||
: !Float.isNaN(spacingDef[SPACING_ALL]) ? spacingDef[SPACING_ALL]
|
||||
: 0;
|
||||
cssStyle[CSSStyle.SPACING_LEFT] =
|
||||
!Float.isNaN(spacingDef[SPACING_LEFT]) ? spacingDef[SPACING_LEFT]
|
||||
: !Float.isNaN(spacingDef[SPACING_HORIZONTAL]) ? spacingDef[SPACING_HORIZONTAL]
|
||||
: !Float.isNaN(spacingDef[SPACING_ALL]) ? spacingDef[SPACING_ALL]
|
||||
: 0;
|
||||
cssStyle[CSSStyle.SPACING_RIGHT] =
|
||||
!Float.isNaN(spacingDef[SPACING_RIGHT]) ? spacingDef[SPACING_RIGHT]
|
||||
: !Float.isNaN(spacingDef[SPACING_HORIZONTAL]) ? spacingDef[SPACING_HORIZONTAL]
|
||||
: !Float.isNaN(spacingDef[SPACING_ALL]) ? spacingDef[SPACING_ALL]
|
||||
: 0;
|
||||
dirty();
|
||||
}
|
||||
}
|
||||
|
@@ -13,6 +13,11 @@ package com.facebook.csslayout;
|
||||
*/
|
||||
public class CSSStyle {
|
||||
|
||||
public static final int SPACING_TOP = 0;
|
||||
public static final int SPACING_RIGHT = 1;
|
||||
public static final int SPACING_BOTTOM = 2;
|
||||
public static final int SPACING_LEFT = 3;
|
||||
|
||||
public CSSFlexDirection flexDirection = CSSFlexDirection.COLUMN;
|
||||
public CSSJustify justifyContent = CSSJustify.FLEX_START;
|
||||
public CSSAlign alignItems = CSSAlign.STRETCH;
|
||||
@@ -20,10 +25,7 @@ public class CSSStyle {
|
||||
public CSSPositionType positionType = CSSPositionType.RELATIVE;
|
||||
public float flex;
|
||||
|
||||
public float marginTop;
|
||||
public float marginBottom;
|
||||
public float marginLeft;
|
||||
public float marginRight;
|
||||
public float[] margin = new float[4];
|
||||
|
||||
public float paddingTop;
|
||||
public float paddingBottom;
|
||||
|
@@ -131,13 +131,13 @@ public class LayoutEngine {
|
||||
private static float getMargin(CSSNode node, PositionIndex position) {
|
||||
switch (position) {
|
||||
case TOP:
|
||||
return node.style.marginTop;
|
||||
return node.style.margin[CSSStyle.SPACING_TOP];
|
||||
case BOTTOM:
|
||||
return node.style.marginBottom;
|
||||
return node.style.margin[CSSStyle.SPACING_BOTTOM];
|
||||
case LEFT:
|
||||
return node.style.marginLeft;
|
||||
return node.style.margin[CSSStyle.SPACING_LEFT];
|
||||
case RIGHT:
|
||||
return node.style.marginRight;
|
||||
return node.style.margin[CSSStyle.SPACING_RIGHT];
|
||||
default:
|
||||
throw new RuntimeException("Someone added a new cardinal direction...");
|
||||
}
|
||||
|
@@ -114,7 +114,7 @@ public class LayoutCachingTest {
|
||||
root.calculateLayout();
|
||||
markLayoutAppliedForTree(root);
|
||||
|
||||
c1.setMarginLeft(10);
|
||||
c1.setMargin(CSSNode.SPACING_LEFT, 10);
|
||||
root.calculateLayout();
|
||||
|
||||
assertTrue(root.hasNewLayout());
|
||||
|
@@ -242,10 +242,10 @@ public class LayoutEngineTest {
|
||||
TestCSSNode node_0 = root_node;
|
||||
node_0.style.width = 100;
|
||||
node_0.style.height = 200;
|
||||
node_0.style.marginLeft = 10;
|
||||
node_0.style.marginTop = 10;
|
||||
node_0.style.marginRight = 10;
|
||||
node_0.style.marginBottom = 10;
|
||||
node_0.style.margin[CSSStyle.SPACING_LEFT] = 10;
|
||||
node_0.style.margin[CSSStyle.SPACING_TOP] = 10;
|
||||
node_0.style.margin[CSSStyle.SPACING_RIGHT] = 10;
|
||||
node_0.style.margin[CSSStyle.SPACING_BOTTOM] = 10;
|
||||
}
|
||||
|
||||
TestCSSNode root_layout = new TestCSSNode();
|
||||
@@ -268,34 +268,34 @@ public class LayoutEngineTest {
|
||||
TestCSSNode node_0 = root_node;
|
||||
node_0.style.width = 1000;
|
||||
node_0.style.height = 1000;
|
||||
node_0.style.marginLeft = 10;
|
||||
node_0.style.marginTop = 10;
|
||||
node_0.style.marginRight = 10;
|
||||
node_0.style.marginBottom = 10;
|
||||
node_0.style.margin[CSSStyle.SPACING_LEFT] = 10;
|
||||
node_0.style.margin[CSSStyle.SPACING_TOP] = 10;
|
||||
node_0.style.margin[CSSStyle.SPACING_RIGHT] = 10;
|
||||
node_0.style.margin[CSSStyle.SPACING_BOTTOM] = 10;
|
||||
addChildren(node_0, 3);
|
||||
{
|
||||
TestCSSNode node_1;
|
||||
node_1 = node_0.getChildAt(0);
|
||||
node_1.style.width = 100;
|
||||
node_1.style.height = 100;
|
||||
node_1.style.marginLeft = 50;
|
||||
node_1.style.marginTop = 50;
|
||||
node_1.style.marginRight = 50;
|
||||
node_1.style.marginBottom = 50;
|
||||
node_1.style.margin[CSSStyle.SPACING_LEFT] = 50;
|
||||
node_1.style.margin[CSSStyle.SPACING_TOP] = 50;
|
||||
node_1.style.margin[CSSStyle.SPACING_RIGHT] = 50;
|
||||
node_1.style.margin[CSSStyle.SPACING_BOTTOM] = 50;
|
||||
node_1 = node_0.getChildAt(1);
|
||||
node_1.style.width = 100;
|
||||
node_1.style.height = 100;
|
||||
node_1.style.marginLeft = 25;
|
||||
node_1.style.marginTop = 25;
|
||||
node_1.style.marginRight = 25;
|
||||
node_1.style.marginBottom = 25;
|
||||
node_1.style.margin[CSSStyle.SPACING_LEFT] = 25;
|
||||
node_1.style.margin[CSSStyle.SPACING_TOP] = 25;
|
||||
node_1.style.margin[CSSStyle.SPACING_RIGHT] = 25;
|
||||
node_1.style.margin[CSSStyle.SPACING_BOTTOM] = 25;
|
||||
node_1 = node_0.getChildAt(2);
|
||||
node_1.style.width = 100;
|
||||
node_1.style.height = 100;
|
||||
node_1.style.marginLeft = 10;
|
||||
node_1.style.marginTop = 10;
|
||||
node_1.style.marginRight = 10;
|
||||
node_1.style.marginBottom = 10;
|
||||
node_1.style.margin[CSSStyle.SPACING_LEFT] = 10;
|
||||
node_1.style.margin[CSSStyle.SPACING_TOP] = 10;
|
||||
node_1.style.margin[CSSStyle.SPACING_RIGHT] = 10;
|
||||
node_1.style.margin[CSSStyle.SPACING_BOTTOM] = 10;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -546,21 +546,21 @@ public class LayoutEngineTest {
|
||||
TestCSSNode node_0 = root_node;
|
||||
node_0.style.width = 1000;
|
||||
node_0.style.height = 1000;
|
||||
node_0.style.marginLeft = 5;
|
||||
node_0.style.marginTop = 10;
|
||||
node_0.style.margin[CSSStyle.SPACING_LEFT] = 5;
|
||||
node_0.style.margin[CSSStyle.SPACING_TOP] = 10;
|
||||
addChildren(node_0, 2);
|
||||
{
|
||||
TestCSSNode node_1;
|
||||
node_1 = node_0.getChildAt(0);
|
||||
node_1.style.width = 100;
|
||||
node_1.style.height = 100;
|
||||
node_1.style.marginLeft = 15;
|
||||
node_1.style.marginTop = 50;
|
||||
node_1.style.marginBottom = 20;
|
||||
node_1.style.margin[CSSStyle.SPACING_LEFT] = 15;
|
||||
node_1.style.margin[CSSStyle.SPACING_TOP] = 50;
|
||||
node_1.style.margin[CSSStyle.SPACING_BOTTOM] = 20;
|
||||
node_1 = node_0.getChildAt(1);
|
||||
node_1.style.width = 100;
|
||||
node_1.style.height = 100;
|
||||
node_1.style.marginLeft = 30;
|
||||
node_1.style.margin[CSSStyle.SPACING_LEFT] = 30;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1135,10 +1135,10 @@ public class LayoutEngineTest {
|
||||
{
|
||||
TestCSSNode node_1;
|
||||
node_1 = node_0.getChildAt(0);
|
||||
node_1.style.marginLeft = 5;
|
||||
node_1.style.marginTop = 5;
|
||||
node_1.style.marginRight = 5;
|
||||
node_1.style.marginBottom = 5;
|
||||
node_1.style.margin[CSSStyle.SPACING_LEFT] = 5;
|
||||
node_1.style.margin[CSSStyle.SPACING_TOP] = 5;
|
||||
node_1.style.margin[CSSStyle.SPACING_RIGHT] = 5;
|
||||
node_1.style.margin[CSSStyle.SPACING_BOTTOM] = 5;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1239,7 +1239,7 @@ public class LayoutEngineTest {
|
||||
{
|
||||
TestCSSNode node_1;
|
||||
node_1 = node_0.getChildAt(0);
|
||||
node_1.style.marginTop = 10;
|
||||
node_1.style.margin[CSSStyle.SPACING_TOP] = 10;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1279,10 +1279,10 @@ public class LayoutEngineTest {
|
||||
{
|
||||
TestCSSNode node_2;
|
||||
node_2 = node_1.getChildAt(0);
|
||||
node_2.style.marginLeft = 10;
|
||||
node_2.style.marginTop = 10;
|
||||
node_2.style.marginRight = 10;
|
||||
node_2.style.marginBottom = 10;
|
||||
node_2.style.margin[CSSStyle.SPACING_LEFT] = 10;
|
||||
node_2.style.margin[CSSStyle.SPACING_TOP] = 10;
|
||||
node_2.style.margin[CSSStyle.SPACING_RIGHT] = 10;
|
||||
node_2.style.margin[CSSStyle.SPACING_BOTTOM] = 10;
|
||||
node_2 = node_1.getChildAt(1);
|
||||
node_2.style.height = 100;
|
||||
}
|
||||
@@ -1370,7 +1370,7 @@ public class LayoutEngineTest {
|
||||
{
|
||||
TestCSSNode node_1;
|
||||
node_1 = node_0.getChildAt(0);
|
||||
node_1.style.marginLeft = 10;
|
||||
node_1.style.margin[CSSStyle.SPACING_LEFT] = 10;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1471,10 +1471,10 @@ public class LayoutEngineTest {
|
||||
{
|
||||
TestCSSNode node_1;
|
||||
node_1 = node_0.getChildAt(0);
|
||||
node_1.style.marginLeft = 5;
|
||||
node_1.style.marginTop = 5;
|
||||
node_1.style.marginRight = 5;
|
||||
node_1.style.marginBottom = 5;
|
||||
node_1.style.margin[CSSStyle.SPACING_LEFT] = 5;
|
||||
node_1.style.margin[CSSStyle.SPACING_TOP] = 5;
|
||||
node_1.style.margin[CSSStyle.SPACING_RIGHT] = 5;
|
||||
node_1.style.margin[CSSStyle.SPACING_BOTTOM] = 5;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1596,10 +1596,10 @@ public class LayoutEngineTest {
|
||||
{
|
||||
TestCSSNode node_2;
|
||||
node_2 = node_1.getChildAt(0);
|
||||
node_2.style.marginLeft = 16;
|
||||
node_2.style.marginTop = 16;
|
||||
node_2.style.marginRight = 16;
|
||||
node_2.style.marginBottom = 16;
|
||||
node_2.style.margin[CSSStyle.SPACING_LEFT] = 16;
|
||||
node_2.style.margin[CSSStyle.SPACING_TOP] = 16;
|
||||
node_2.style.margin[CSSStyle.SPACING_RIGHT] = 16;
|
||||
node_2.style.margin[CSSStyle.SPACING_BOTTOM] = 16;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1799,7 +1799,7 @@ public class LayoutEngineTest {
|
||||
TestCSSNode node_1;
|
||||
node_1 = node_0.getChildAt(0);
|
||||
node_1.style.positionType = CSSPositionType.ABSOLUTE;
|
||||
node_1.style.marginRight = 15;
|
||||
node_1.style.margin[CSSStyle.SPACING_RIGHT] = 15;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2096,7 +2096,7 @@ public class LayoutEngineTest {
|
||||
TestCSSNode node_1;
|
||||
node_1 = node_0.getChildAt(0);
|
||||
node_1.style.positionType = CSSPositionType.ABSOLUTE;
|
||||
node_1.style.marginTop = 5;
|
||||
node_1.style.margin[CSSStyle.SPACING_TOP] = 5;
|
||||
node_1.style.positionTop = 5;
|
||||
}
|
||||
}
|
||||
@@ -2133,7 +2133,7 @@ public class LayoutEngineTest {
|
||||
TestCSSNode node_1;
|
||||
node_1 = node_0.getChildAt(0);
|
||||
node_1.style.positionType = CSSPositionType.ABSOLUTE;
|
||||
node_1.style.marginLeft = 5;
|
||||
node_1.style.margin[CSSStyle.SPACING_LEFT] = 5;
|
||||
node_1.style.positionLeft = 5;
|
||||
}
|
||||
}
|
||||
@@ -2215,7 +2215,7 @@ public class LayoutEngineTest {
|
||||
TestCSSNode node_1;
|
||||
node_1 = node_0.getChildAt(0);
|
||||
node_1.style.flex = 1;
|
||||
node_1.style.marginLeft = 5;
|
||||
node_1.style.margin[CSSStyle.SPACING_LEFT] = 5;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2300,7 +2300,7 @@ public class LayoutEngineTest {
|
||||
node_1.style.flex = 1;
|
||||
node_1 = node_0.getChildAt(1);
|
||||
node_1.style.flex = 1;
|
||||
node_1.style.marginLeft = 5;
|
||||
node_1.style.margin[CSSStyle.SPACING_LEFT] = 5;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2568,7 +2568,7 @@ public class LayoutEngineTest {
|
||||
TestCSSNode node_1;
|
||||
node_1 = node_0.getChildAt(0);
|
||||
node_1.style.alignSelf = CSSAlign.STRETCH;
|
||||
node_1.style.marginLeft = 20;
|
||||
node_1.style.margin[CSSStyle.SPACING_LEFT] = 20;
|
||||
node_1.style.paddingLeft = 20;
|
||||
node_1.style.paddingTop = 20;
|
||||
node_1.style.paddingRight = 20;
|
||||
@@ -2644,7 +2644,7 @@ public class LayoutEngineTest {
|
||||
{
|
||||
TestCSSNode node_1;
|
||||
node_1 = node_0.getChildAt(0);
|
||||
node_1.style.marginRight = -8;
|
||||
node_1.style.margin[CSSStyle.SPACING_RIGHT] = -8;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3003,10 +3003,10 @@ public class LayoutEngineTest {
|
||||
TestCSSNode node_1;
|
||||
node_1 = node_0.getChildAt(0);
|
||||
node_1.style.alignSelf = CSSAlign.FLEX_START;
|
||||
node_1.style.marginLeft = 10;
|
||||
node_1.style.marginTop = 10;
|
||||
node_1.style.marginRight = 10;
|
||||
node_1.style.marginBottom = 10;
|
||||
node_1.style.margin[CSSStyle.SPACING_LEFT] = 10;
|
||||
node_1.style.margin[CSSStyle.SPACING_TOP] = 10;
|
||||
node_1.style.margin[CSSStyle.SPACING_RIGHT] = 10;
|
||||
node_1.style.margin[CSSStyle.SPACING_BOTTOM] = 10;
|
||||
addChildren(node_1, 1);
|
||||
{
|
||||
TestCSSNode node_2;
|
||||
@@ -3144,10 +3144,10 @@ public class LayoutEngineTest {
|
||||
{
|
||||
TestCSSNode node_2;
|
||||
node_2 = node_1.getChildAt(0);
|
||||
node_2.style.marginLeft = 20;
|
||||
node_2.style.marginTop = 20;
|
||||
node_2.style.marginRight = 20;
|
||||
node_2.style.marginBottom = 20;
|
||||
node_2.style.margin[CSSStyle.SPACING_LEFT] = 20;
|
||||
node_2.style.margin[CSSStyle.SPACING_TOP] = 20;
|
||||
node_2.style.margin[CSSStyle.SPACING_RIGHT] = 20;
|
||||
node_2.style.margin[CSSStyle.SPACING_BOTTOM] = 20;
|
||||
node_2.setMeasureFunction(sTestMeasureFunction);
|
||||
node_2.context = "loooooooooong with space";
|
||||
}
|
||||
@@ -3199,10 +3199,10 @@ public class LayoutEngineTest {
|
||||
{
|
||||
TestCSSNode node_2;
|
||||
node_2 = node_1.getChildAt(0);
|
||||
node_2.style.marginLeft = 20;
|
||||
node_2.style.marginTop = 20;
|
||||
node_2.style.marginRight = 20;
|
||||
node_2.style.marginBottom = 20;
|
||||
node_2.style.margin[CSSStyle.SPACING_LEFT] = 20;
|
||||
node_2.style.margin[CSSStyle.SPACING_TOP] = 20;
|
||||
node_2.style.margin[CSSStyle.SPACING_RIGHT] = 20;
|
||||
node_2.style.margin[CSSStyle.SPACING_BOTTOM] = 20;
|
||||
node_2.setMeasureFunction(sTestMeasureFunction);
|
||||
node_2.context = "loooooooooong with space";
|
||||
}
|
||||
|
Reference in New Issue
Block a user