From 0cdda4d8d92726be058243fd0aa75e2165f84aa4 Mon Sep 17 00:00:00 2001 From: Emil Sjolander Date: Thu, 5 Jan 2017 12:48:10 -0800 Subject: [PATCH] Expose layout paddding in java api Reviewed By: passy Differential Revision: D4377069 fbshipit-source-id: 2e0c04104560e1be586562b27b3457576590dc18 --- .../main/java/com/facebook/yoga/YogaNode.java | 28 +++++++++++++++++++ .../java/com/facebook/yoga/YogaNodeAPI.java | 1 + .../jni/first-party/yogajni/jni/YGJNI.cpp | 11 ++++++++ 3 files changed, 40 insertions(+) diff --git a/ReactAndroid/src/main/java/com/facebook/yoga/YogaNode.java b/ReactAndroid/src/main/java/com/facebook/yoga/YogaNode.java index 0a4e0bac4..87b22985c 100644 --- a/ReactAndroid/src/main/java/com/facebook/yoga/YogaNode.java +++ b/ReactAndroid/src/main/java/com/facebook/yoga/YogaNode.java @@ -69,6 +69,14 @@ public class YogaNode implements YogaNodeAPI { @DoNotStrip private float mLeft = YogaConstants.UNDEFINED; @DoNotStrip + private float mPaddingLeft = 0; + @DoNotStrip + private float mPaddingTop = 0; + @DoNotStrip + private float mPaddingRight = 0; + @DoNotStrip + private float mPaddingBottom = 0; + @DoNotStrip private int mLayoutDirection = 0; private native long jni_YGNodeNew(); @@ -564,6 +572,26 @@ public class YogaNode implements YogaNodeAPI { return mHeight; } + @Override + public float getLayoutPadding(YogaEdge edge) { + switch (edge) { + case LEFT: + return mPaddingLeft; + case TOP: + return mPaddingTop; + case RIGHT: + return mPaddingRight; + case BOTTOM: + return mPaddingBottom; + case START: + return getLayoutDirection() == YogaDirection.RTL ? mPaddingRight : mPaddingLeft; + case END: + return getLayoutDirection() == YogaDirection.RTL ? mPaddingLeft : mPaddingRight; + default: + throw new IllegalArgumentException("Cannot get layout paddings of multi-edge shorthands"); + } + } + @Override public YogaDirection getLayoutDirection() { return YogaDirection.values()[mLayoutDirection]; diff --git a/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeAPI.java b/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeAPI.java index b3cf0ac3f..98742d340 100644 --- a/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeAPI.java +++ b/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeAPI.java @@ -81,6 +81,7 @@ public interface YogaNodeAPI { float getLayoutY(); float getLayoutWidth(); float getLayoutHeight(); + float getLayoutPadding(YogaEdge edge); YogaDirection getLayoutDirection(); YogaOverflow getOverflow(); void setOverflow(YogaOverflow overflow); diff --git a/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNI.cpp b/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNI.cpp index de648a4ba..46aaecfbd 100644 --- a/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNI.cpp +++ b/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNI.cpp @@ -30,10 +30,21 @@ static void YGTransferLayoutOutputsRecursive(YGNodeRef root) { static auto leftField = obj->getClass()->getField("mLeft"); static auto topField = obj->getClass()->getField("mTop"); + static auto paddingLeftField = obj->getClass()->getField("mPaddingLeft"); + static auto paddingTopField = obj->getClass()->getField("mPaddingTop"); + static auto paddingRightField = obj->getClass()->getField("mPaddingRight"); + static auto paddingBottomField = obj->getClass()->getField("mPaddingBottom"); + obj->setFieldValue(widthField, YGNodeLayoutGetWidth(root)); obj->setFieldValue(heightField, YGNodeLayoutGetHeight(root)); obj->setFieldValue(leftField, YGNodeLayoutGetLeft(root)); obj->setFieldValue(topField, YGNodeLayoutGetTop(root)); + + obj->setFieldValue(paddingLeftField, YGNodeLayoutGetPadding(root, YGEdgeLeft)); + obj->setFieldValue(paddingTopField, YGNodeLayoutGetPadding(root, YGEdgeTop)); + obj->setFieldValue(paddingRightField, YGNodeLayoutGetPadding(root, YGEdgeRight)); + obj->setFieldValue(paddingBottomField, YGNodeLayoutGetPadding(root, YGEdgeBottom)); + YGTransferLayoutDirection(root, obj); for (uint32_t i = 0; i < YGNodeGetChildCount(root); i++) {