diff --git a/Examples/UIExplorer/js/TextInputExample.android.js b/Examples/UIExplorer/js/TextInputExample.android.js index 1e3b761a4..d04a32b3e 100644 --- a/Examples/UIExplorer/js/TextInputExample.android.js +++ b/Examples/UIExplorer/js/TextInputExample.android.js @@ -241,6 +241,23 @@ class BlurOnSubmitExample extends React.Component { } } +class ToggleDefaultPaddingExample extends React.Component { + constructor(props) { + super(props); + this.state = {hasPadding: false}; + } + render() { + return ( + + + this.setState({hasPadding: !this.state.hasPadding})}> + Toggle padding + + + ); + } +} + var styles = StyleSheet.create({ multiline: { height: 60, @@ -602,4 +619,8 @@ exports.examples = [ ); } }, + { + title: 'Toggle Default Padding', + render: function(): ReactElement { return ; }, + }, ]; diff --git a/ReactAndroid/src/main/java/com/facebook/csslayout/CSSNode.java b/ReactAndroid/src/main/java/com/facebook/csslayout/CSSNode.java index 6ae5a472d..97a5e9378 100644 --- a/ReactAndroid/src/main/java/com/facebook/csslayout/CSSNode.java +++ b/ReactAndroid/src/main/java/com/facebook/csslayout/CSSNode.java @@ -553,16 +553,6 @@ public class CSSNode implements CSSNodeAPI { return layout.direction; } - /** - * Set a default padding (left/top/right/bottom) for this node. - */ - @Override - public void setDefaultPadding(int spacingType, float padding) { - if (style.padding.setDefault(spacingType, padding)) { - dirty(); - } - } - /** * Get this node's overflow property, as defined in the style */ diff --git a/ReactAndroid/src/main/java/com/facebook/csslayout/CSSNodeAPI.java b/ReactAndroid/src/main/java/com/facebook/csslayout/CSSNodeAPI.java index aa2dc030a..b7f176876 100644 --- a/ReactAndroid/src/main/java/com/facebook/csslayout/CSSNodeAPI.java +++ b/ReactAndroid/src/main/java/com/facebook/csslayout/CSSNodeAPI.java @@ -79,7 +79,6 @@ public interface CSSNodeAPI { float getLayoutWidth(); float getLayoutHeight(); CSSDirection getLayoutDirection(); - void setDefaultPadding(int spacingType, float padding); CSSOverflow getOverflow(); void setOverflow(CSSOverflow overflow); void setData(Object data); diff --git a/ReactAndroid/src/main/java/com/facebook/csslayout/CSSNodeJNI.java b/ReactAndroid/src/main/java/com/facebook/csslayout/CSSNodeJNI.java index 11205b765..550ac7ebd 100644 --- a/ReactAndroid/src/main/java/com/facebook/csslayout/CSSNodeJNI.java +++ b/ReactAndroid/src/main/java/com/facebook/csslayout/CSSNodeJNI.java @@ -335,11 +335,6 @@ public class CSSNodeJNI implements CSSNodeAPI { jni_CSSNodeStyleSetPadding(mNativePointer, spacingType, padding); } - @Override - public void setDefaultPadding(int spacingType, float padding) { - // TODO - } - private native float jni_CSSNodeStyleGetBorder(long nativePointer, int edge); @Override public Spacing getBorder() { diff --git a/ReactAndroid/src/main/java/com/facebook/csslayout/CSSStyle.java b/ReactAndroid/src/main/java/com/facebook/csslayout/CSSStyle.java index b2a8d8b86..d0ffd35c7 100644 --- a/ReactAndroid/src/main/java/com/facebook/csslayout/CSSStyle.java +++ b/ReactAndroid/src/main/java/com/facebook/csslayout/CSSStyle.java @@ -30,7 +30,7 @@ public class CSSStyle { public Spacing margin = new Spacing(); public Spacing padding = new Spacing(); public Spacing border = new Spacing(); - public Spacing position = new Spacing(); + public Spacing position = new Spacing(CSSConstants.UNDEFINED); public float[] dimensions = new float[2]; @@ -61,13 +61,6 @@ public class CSSStyle { border.reset(); position.reset(); - position.setDefault(Spacing.LEFT, CSSConstants.UNDEFINED); - position.setDefault(Spacing.RIGHT, CSSConstants.UNDEFINED); - position.setDefault(Spacing.TOP, CSSConstants.UNDEFINED); - position.setDefault(Spacing.BOTTOM, CSSConstants.UNDEFINED); - position.setDefault(Spacing.START, CSSConstants.UNDEFINED); - position.setDefault(Spacing.END, CSSConstants.UNDEFINED); - Arrays.fill(dimensions, CSSConstants.UNDEFINED); minWidth = CSSConstants.UNDEFINED; diff --git a/ReactAndroid/src/main/java/com/facebook/csslayout/Spacing.java b/ReactAndroid/src/main/java/com/facebook/csslayout/Spacing.java index af46cbd4a..1d068f6f9 100644 --- a/ReactAndroid/src/main/java/com/facebook/csslayout/Spacing.java +++ b/ReactAndroid/src/main/java/com/facebook/csslayout/Spacing.java @@ -9,8 +9,6 @@ package com.facebook.csslayout; -import javax.annotation.Nullable; - import java.util.Arrays; /** @@ -71,10 +69,18 @@ public class Spacing { }; private final float[] mSpacing = newFullSpacingArray(); - @Nullable private float[] mDefaultSpacing = null; private int mValueFlags = 0; + private float mDefaultValue; private boolean mHasAliasesSet; + public Spacing() { + this(0); + } + + public Spacing(float defaultValue) { + mDefaultValue = defaultValue; + } + /** * Set a spacing value. * @@ -101,25 +107,7 @@ public class Spacing { return true; } - return false; - } - /** - * Set a default spacing value. This is used as a fallback when no spacing has been set for a - * particular direction. - * - * @param spacingType one of {@link #LEFT}, {@link #TOP}, {@link #RIGHT}, {@link #BOTTOM} - * @param value the default value for this direction - * @return - */ - public boolean setDefault(int spacingType, float value) { - if (mDefaultSpacing == null) { - mDefaultSpacing = newSpacingResultArray(); - } - if (!FloatUtil.floatsEqual(mDefaultSpacing[spacingType], value)) { - mDefaultSpacing[spacingType] = value; - return true; - } return false; } @@ -129,9 +117,9 @@ public class Spacing { * @param spacingType one of {@link #LEFT}, {@link #TOP}, {@link #RIGHT}, {@link #BOTTOM} */ public float get(int spacingType) { - float defaultValue = (mDefaultSpacing != null) - ? mDefaultSpacing[spacingType] - : (spacingType == START || spacingType == END ? CSSConstants.UNDEFINED : 0); + float defaultValue = (spacingType == START || spacingType == END + ? CSSConstants.UNDEFINED + : mDefaultValue); if (mValueFlags == 0) { return defaultValue; @@ -170,7 +158,6 @@ public class Spacing { */ void reset() { Arrays.fill(mSpacing, CSSConstants.UNDEFINED); - mDefaultSpacing = null; mHasAliasesSet = false; mValueFlags = 0; } @@ -200,22 +187,4 @@ public class Spacing { CSSConstants.UNDEFINED, }; } - - private static float[] newSpacingResultArray() { - return newSpacingResultArray(0); - } - - private static float[] newSpacingResultArray(float defaultValue) { - return new float[] { - defaultValue, - defaultValue, - defaultValue, - defaultValue, - CSSConstants.UNDEFINED, - CSSConstants.UNDEFINED, - defaultValue, - defaultValue, - defaultValue, - }; - } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java index 2fbb96216..31e55d848 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java @@ -13,7 +13,9 @@ import javax.annotation.Nullable; import java.util.ArrayList; +import com.facebook.csslayout.CSSConstants; import com.facebook.csslayout.CSSNode; +import com.facebook.csslayout.Spacing; import com.facebook.infer.annotation.Assertions; import com.facebook.react.uimanager.annotations.ReactPropertyHolder; @@ -59,6 +61,8 @@ public class ReactShadowNode extends CSSNode { private float mAbsoluteTop; private float mAbsoluteRight; private float mAbsoluteBottom; + private final Spacing mDefaultPadding = new Spacing(0); + private final Spacing mPadding = new Spacing(CSSConstants.UNDEFINED); /** * Nodes that return {@code true} will be treated as "virtual" nodes. That is, nodes that are not @@ -116,6 +120,48 @@ public class ReactShadowNode extends CSSNode { } } + public void setDefaultPadding(int spacingType, float padding) { + mDefaultPadding.set(spacingType, padding); + updatePadding(); + } + + @Override + public void setPadding(int spacingType, float padding) { + mPadding.set(spacingType, padding); + updatePadding(); + } + + private void updatePadding() { + for (int spacingType = Spacing.LEFT; spacingType <= Spacing.ALL; spacingType++) { + if (spacingType == Spacing.LEFT || + spacingType == Spacing.RIGHT || + spacingType == Spacing.START || + spacingType == Spacing.END) { + if (CSSConstants.isUndefined(mPadding.getRaw(spacingType)) && + CSSConstants.isUndefined(mPadding.getRaw(Spacing.HORIZONTAL)) && + CSSConstants.isUndefined(mPadding.getRaw(Spacing.ALL))) { + super.setPadding(spacingType, mDefaultPadding.getRaw(spacingType)); + } else { + super.setPadding(spacingType, mPadding.getRaw(spacingType)); + } + } else if (spacingType == Spacing.TOP || spacingType == Spacing.BOTTOM) { + if (CSSConstants.isUndefined(mPadding.getRaw(spacingType)) && + CSSConstants.isUndefined(mPadding.getRaw(Spacing.VERTICAL)) && + CSSConstants.isUndefined(mPadding.getRaw(Spacing.ALL))) { + super.setPadding(spacingType, mDefaultPadding.getRaw(spacingType)); + } else { + super.setPadding(spacingType, mPadding.getRaw(spacingType)); + } + } else { + if (CSSConstants.isUndefined(mPadding.getRaw(spacingType))) { + super.setPadding(spacingType, mDefaultPadding.getRaw(spacingType)); + } else { + super.setPadding(spacingType, mPadding.getRaw(spacingType)); + } + } + } + } + @Override public void addChildAt(CSSNode child, int i) { super.addChildAt(child, i); diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewBackgroundDrawable.java b/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewBackgroundDrawable.java index eaf5ecfc6..f90bb3847 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewBackgroundDrawable.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewBackgroundDrawable.java @@ -145,7 +145,7 @@ import com.facebook.csslayout.Spacing; super.getOutline(outline); return; } - if((!CSSConstants.isUndefined(mBorderRadius) && mBorderRadius > 0) || mBorderCornerRadii != null) { + if ((!CSSConstants.isUndefined(mBorderRadius) && mBorderRadius > 0) || mBorderCornerRadii != null) { updatePath(); outline.setConvexPath(mPathForBorderRadiusOutline); @@ -176,10 +176,10 @@ import com.facebook.csslayout.Spacing; // set RGB component if (mBorderRGB == null) { mBorderRGB = new Spacing(); - mBorderRGB.setDefault(Spacing.LEFT, DEFAULT_BORDER_RGB); - mBorderRGB.setDefault(Spacing.TOP, DEFAULT_BORDER_RGB); - mBorderRGB.setDefault(Spacing.RIGHT, DEFAULT_BORDER_RGB); - mBorderRGB.setDefault(Spacing.BOTTOM, DEFAULT_BORDER_RGB); + mBorderRGB.set(Spacing.LEFT, DEFAULT_BORDER_RGB); + mBorderRGB.set(Spacing.TOP, DEFAULT_BORDER_RGB); + mBorderRGB.set(Spacing.RIGHT, DEFAULT_BORDER_RGB); + mBorderRGB.set(Spacing.BOTTOM, DEFAULT_BORDER_RGB); } if (!FloatUtil.floatsEqual(mBorderRGB.getRaw(position), rgb)) { mBorderRGB.set(position, rgb); @@ -191,10 +191,10 @@ import com.facebook.csslayout.Spacing; // set Alpha component if (mBorderAlpha == null) { mBorderAlpha = new Spacing(); - mBorderAlpha.setDefault(Spacing.LEFT, DEFAULT_BORDER_ALPHA); - mBorderAlpha.setDefault(Spacing.TOP, DEFAULT_BORDER_ALPHA); - mBorderAlpha.setDefault(Spacing.RIGHT, DEFAULT_BORDER_ALPHA); - mBorderAlpha.setDefault(Spacing.BOTTOM, DEFAULT_BORDER_ALPHA); + mBorderAlpha.set(Spacing.LEFT, DEFAULT_BORDER_ALPHA); + mBorderAlpha.set(Spacing.TOP, DEFAULT_BORDER_ALPHA); + mBorderAlpha.set(Spacing.RIGHT, DEFAULT_BORDER_ALPHA); + mBorderAlpha.set(Spacing.BOTTOM, DEFAULT_BORDER_ALPHA); } if (!FloatUtil.floatsEqual(mBorderAlpha.getRaw(position), alpha)) { mBorderAlpha.set(position, alpha); @@ -291,7 +291,6 @@ import com.facebook.csslayout.Spacing; float bottomRightRadius = mBorderCornerRadii != null && !CSSConstants.isUndefined(mBorderCornerRadii[2]) ? mBorderCornerRadii[2] : defaultBorderRadius; float bottomLeftRadius = mBorderCornerRadii != null && !CSSConstants.isUndefined(mBorderCornerRadii[3]) ? mBorderCornerRadii[3] : defaultBorderRadius; - mPathForBorderRadius.addRoundRect( mTempRectForBorderRadius, new float[] {