From e539ecc9aa7bf9c836fec65a90df79480ca24d9e 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 Summary: Expose layout padding api from D4376572 Reviewed By: passy Differential Revision: D4377069 fbshipit-source-id: 2e0c04104560e1be586562b27b3457576590dc18 --- java/com/facebook/yoga/YogaNode.java | 28 +++++++++++++++++++ java/com/facebook/yoga/YogaNodeAPI.java | 1 + java/jni/YGJNI.cpp | 11 ++++++++ .../tests/com/facebook/yoga/YogaNodeTest.java | 17 +++++++++++ 4 files changed, 57 insertions(+) diff --git a/java/com/facebook/yoga/YogaNode.java b/java/com/facebook/yoga/YogaNode.java index 0a4e0bac..87b22985 100644 --- a/java/com/facebook/yoga/YogaNode.java +++ b/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/java/com/facebook/yoga/YogaNodeAPI.java b/java/com/facebook/yoga/YogaNodeAPI.java index b3cf0ac3..98742d34 100644 --- a/java/com/facebook/yoga/YogaNodeAPI.java +++ b/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/java/jni/YGJNI.cpp b/java/jni/YGJNI.cpp index de648a4b..46aaecfb 100644 --- a/java/jni/YGJNI.cpp +++ b/java/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++) { diff --git a/java/tests/com/facebook/yoga/YogaNodeTest.java b/java/tests/com/facebook/yoga/YogaNodeTest.java index 2e7a9e7a..ddec8cff 100644 --- a/java/tests/com/facebook/yoga/YogaNodeTest.java +++ b/java/tests/com/facebook/yoga/YogaNodeTest.java @@ -138,4 +138,21 @@ public class YogaNodeTest { node0.copyStyle(node1); assertEquals(100, (int) node0.getMaxHeight().value); } + + @Test + public void testLayoutPadding() { + final YogaNode node = new YogaNode(); + node.setWidth(100); + node.setHeight(100); + node.setPadding(YogaEdge.START, 1); + node.setPadding(YogaEdge.END, 2); + node.setPadding(YogaEdge.TOP, 3); + node.setPadding(YogaEdge.BOTTOM, 4); + node.calculateLayout(); + + assertEquals(1, (int) node.getLayoutPadding(YogaEdge.LEFT)); + assertEquals(2, (int) node.getLayoutPadding(YogaEdge.RIGHT)); + assertEquals(3, (int) node.getLayoutPadding(YogaEdge.TOP)); + assertEquals(4, (int) node.getLayoutPadding(YogaEdge.BOTTOM)); + } }