Skip to content

Commit 53e75a1

Browse files
NickGerlemanmeta-codesync[bot]
authored andcommitted
CSS Grid 5/9: Java/Kotlin bindings
Summary: X-link: facebook/yoga#1881 Add Java/Kotlin bindings for CSS Grid support. Includes grid API classes (YogaGridTrackList, YogaGridTrackValue, YogaGridTrackType), JNI bridge updates, enum changes (YogaDisplay, YogaAlign, YogaJustify). Also includes React Native Android mirror of all Java/Kotlin changes. Differential Revision: D93946256
1 parent 1e254b5 commit 53e75a1

6 files changed

Lines changed: 609 additions & 0 deletions

File tree

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
package com.facebook.yoga
9+
10+
/**
11+
* Represents a list of grid tracks for use with grid-template-rows/columns.
12+
*/
13+
public class YogaGridTrackList {
14+
private val tracks: MutableList<YogaGridTrackValue> = mutableListOf()
15+
16+
public fun addTrack(track: YogaGridTrackValue) {
17+
tracks.add(track)
18+
}
19+
20+
public fun getTracks(): List<YogaGridTrackValue> = tracks.toList()
21+
22+
public fun size(): Int = tracks.size
23+
24+
public operator fun get(index: Int): YogaGridTrackValue = tracks[index]
25+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
package com.facebook.yoga
9+
10+
/**
11+
* Represents a grid track value for use with grid-template-rows/columns.
12+
*/
13+
public class YogaGridTrackValue private constructor(
14+
public val type: Type,
15+
public val value: Float,
16+
public val minValue: YogaGridTrackValue?,
17+
public val maxValue: YogaGridTrackValue?
18+
) {
19+
public enum class Type {
20+
AUTO,
21+
POINTS,
22+
PERCENT,
23+
FR,
24+
MINMAX
25+
}
26+
27+
private constructor(type: Type, value: Float) : this(type, value, null, null)
28+
29+
private constructor(min: YogaGridTrackValue, max: YogaGridTrackValue) : this(Type.MINMAX, 0f, min, max)
30+
31+
public companion object {
32+
@JvmStatic
33+
public fun auto(): YogaGridTrackValue = YogaGridTrackValue(Type.AUTO, 0f)
34+
35+
@JvmStatic
36+
public fun points(points: Float): YogaGridTrackValue = YogaGridTrackValue(Type.POINTS, points)
37+
38+
@JvmStatic
39+
public fun percent(percent: Float): YogaGridTrackValue = YogaGridTrackValue(Type.PERCENT, percent)
40+
41+
@JvmStatic
42+
public fun fr(fr: Float): YogaGridTrackValue = YogaGridTrackValue(Type.FR, fr)
43+
44+
@JvmStatic
45+
public fun minMax(min: YogaGridTrackValue, max: YogaGridTrackValue): YogaGridTrackValue =
46+
YogaGridTrackValue(min, max)
47+
}
48+
}

packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaNative.kt

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,4 +328,68 @@ public object YogaNative {
328328
nativePointer: Long,
329329
alwaysFormContainingBlock: Boolean,
330330
)
331+
332+
@JvmStatic
333+
public external fun jni_YGNodeStyleSetGridTemplateColumnsJNI(
334+
nativePointer: Long,
335+
types: IntArray,
336+
values: FloatArray,
337+
minTypes: IntArray,
338+
minValues: FloatArray,
339+
maxTypes: IntArray,
340+
maxValues: FloatArray,
341+
)
342+
343+
@JvmStatic
344+
public external fun jni_YGNodeStyleSetGridTemplateRowsJNI(
345+
nativePointer: Long,
346+
types: IntArray,
347+
values: FloatArray,
348+
minTypes: IntArray,
349+
minValues: FloatArray,
350+
maxTypes: IntArray,
351+
maxValues: FloatArray,
352+
)
353+
354+
@JvmStatic
355+
public external fun jni_YGNodeStyleSetGridAutoColumnsJNI(
356+
nativePointer: Long,
357+
types: IntArray,
358+
values: FloatArray,
359+
minTypes: IntArray,
360+
minValues: FloatArray,
361+
maxTypes: IntArray,
362+
maxValues: FloatArray,
363+
)
364+
365+
@JvmStatic
366+
public external fun jni_YGNodeStyleSetGridAutoRowsJNI(
367+
nativePointer: Long,
368+
types: IntArray,
369+
values: FloatArray,
370+
minTypes: IntArray,
371+
minValues: FloatArray,
372+
maxTypes: IntArray,
373+
maxValues: FloatArray,
374+
)
375+
376+
@JvmStatic
377+
public external fun jni_YGNodeStyleSetGridColumnStartJNI(nativePointer: Long, value: Int)
378+
379+
@JvmStatic
380+
public external fun jni_YGNodeStyleSetGridColumnStartSpanJNI(nativePointer: Long, span: Int)
381+
382+
@JvmStatic public external fun jni_YGNodeStyleSetGridColumnEndJNI(nativePointer: Long, value: Int)
383+
384+
@JvmStatic
385+
public external fun jni_YGNodeStyleSetGridColumnEndSpanJNI(nativePointer: Long, span: Int)
386+
387+
@JvmStatic public external fun jni_YGNodeStyleSetGridRowStartJNI(nativePointer: Long, value: Int)
388+
389+
@JvmStatic
390+
public external fun jni_YGNodeStyleSetGridRowStartSpanJNI(nativePointer: Long, span: Int)
391+
392+
@JvmStatic public external fun jni_YGNodeStyleSetGridRowEndJNI(nativePointer: Long, value: Int)
393+
394+
@JvmStatic public external fun jni_YGNodeStyleSetGridRowEndSpanJNI(nativePointer: Long, span: Int)
331395
}

packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaNode.kt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,30 @@ public abstract class YogaNode : YogaProps {
210210

211211
public abstract fun setGapPercent(gutter: YogaGutter, gapLength: Float)
212212

213+
public abstract fun setGridTemplateColumns(trackList: YogaGridTrackList)
214+
215+
public abstract fun setGridTemplateRows(trackList: YogaGridTrackList)
216+
217+
public abstract fun setGridAutoColumns(trackList: YogaGridTrackList)
218+
219+
public abstract fun setGridAutoRows(trackList: YogaGridTrackList)
220+
221+
public abstract fun setGridColumnStart(value: Int)
222+
223+
public abstract fun setGridColumnStartSpan(span: Int)
224+
225+
public abstract fun setGridColumnEnd(value: Int)
226+
227+
public abstract fun setGridColumnEndSpan(span: Int)
228+
229+
public abstract fun setGridRowStart(value: Int)
230+
231+
public abstract fun setGridRowStartSpan(span: Int)
232+
233+
public abstract fun setGridRowEnd(value: Int)
234+
235+
public abstract fun setGridRowEndSpan(span: Int)
236+
213237
public abstract val layoutX: Float
214238

215239
public abstract val layoutY: Float

packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeJNIBase.java

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -824,4 +824,140 @@ public void setGap(YogaGutter gutter, float gapLength) {
824824
public void setGapPercent(YogaGutter gutter, float gapLength) {
825825
YogaNative.jni_YGNodeStyleSetGapPercentJNI(mNativePointer, gutter.intValue(), gapLength);
826826
}
827+
828+
@Override
829+
public void setGridTemplateColumns(YogaGridTrackList trackList) {
830+
int[] types = new int[trackList.size()];
831+
float[] values = new float[trackList.size()];
832+
int[] minTypes = new int[trackList.size()];
833+
float[] minValues = new float[trackList.size()];
834+
int[] maxTypes = new int[trackList.size()];
835+
float[] maxValues = new float[trackList.size()];
836+
837+
for (int i = 0; i < trackList.size(); i++) {
838+
YogaGridTrackValue track = trackList.get(i);
839+
types[i] = track.getType().ordinal();
840+
values[i] = track.getValue();
841+
if (track.getType() == YogaGridTrackValue.Type.MINMAX) {
842+
minTypes[i] = track.getMinValue().getType().ordinal();
843+
minValues[i] = track.getMinValue().getValue();
844+
maxTypes[i] = track.getMaxValue().getType().ordinal();
845+
maxValues[i] = track.getMaxValue().getValue();
846+
}
847+
}
848+
YogaNative.jni_YGNodeStyleSetGridTemplateColumnsJNI(
849+
mNativePointer, types, values, minTypes, minValues, maxTypes, maxValues);
850+
}
851+
852+
@Override
853+
public void setGridTemplateRows(YogaGridTrackList trackList) {
854+
int[] types = new int[trackList.size()];
855+
float[] values = new float[trackList.size()];
856+
int[] minTypes = new int[trackList.size()];
857+
float[] minValues = new float[trackList.size()];
858+
int[] maxTypes = new int[trackList.size()];
859+
float[] maxValues = new float[trackList.size()];
860+
861+
for (int i = 0; i < trackList.size(); i++) {
862+
YogaGridTrackValue track = trackList.get(i);
863+
types[i] = track.getType().ordinal();
864+
values[i] = track.getValue();
865+
if (track.getType() == YogaGridTrackValue.Type.MINMAX) {
866+
minTypes[i] = track.getMinValue().getType().ordinal();
867+
minValues[i] = track.getMinValue().getValue();
868+
maxTypes[i] = track.getMaxValue().getType().ordinal();
869+
maxValues[i] = track.getMaxValue().getValue();
870+
}
871+
}
872+
YogaNative.jni_YGNodeStyleSetGridTemplateRowsJNI(
873+
mNativePointer, types, values, minTypes, minValues, maxTypes, maxValues);
874+
}
875+
876+
@Override
877+
public void setGridAutoColumns(YogaGridTrackList trackList) {
878+
int[] types = new int[trackList.size()];
879+
float[] values = new float[trackList.size()];
880+
int[] minTypes = new int[trackList.size()];
881+
float[] minValues = new float[trackList.size()];
882+
int[] maxTypes = new int[trackList.size()];
883+
float[] maxValues = new float[trackList.size()];
884+
885+
for (int i = 0; i < trackList.size(); i++) {
886+
YogaGridTrackValue track = trackList.get(i);
887+
types[i] = track.getType().ordinal();
888+
values[i] = track.getValue();
889+
if (track.getType() == YogaGridTrackValue.Type.MINMAX) {
890+
minTypes[i] = track.getMinValue().getType().ordinal();
891+
minValues[i] = track.getMinValue().getValue();
892+
maxTypes[i] = track.getMaxValue().getType().ordinal();
893+
maxValues[i] = track.getMaxValue().getValue();
894+
}
895+
}
896+
YogaNative.jni_YGNodeStyleSetGridAutoColumnsJNI(
897+
mNativePointer, types, values, minTypes, minValues, maxTypes, maxValues);
898+
}
899+
900+
@Override
901+
public void setGridAutoRows(YogaGridTrackList trackList) {
902+
int[] types = new int[trackList.size()];
903+
float[] values = new float[trackList.size()];
904+
int[] minTypes = new int[trackList.size()];
905+
float[] minValues = new float[trackList.size()];
906+
int[] maxTypes = new int[trackList.size()];
907+
float[] maxValues = new float[trackList.size()];
908+
909+
for (int i = 0; i < trackList.size(); i++) {
910+
YogaGridTrackValue track = trackList.get(i);
911+
types[i] = track.getType().ordinal();
912+
values[i] = track.getValue();
913+
if (track.getType() == YogaGridTrackValue.Type.MINMAX) {
914+
minTypes[i] = track.getMinValue().getType().ordinal();
915+
minValues[i] = track.getMinValue().getValue();
916+
maxTypes[i] = track.getMaxValue().getType().ordinal();
917+
maxValues[i] = track.getMaxValue().getValue();
918+
}
919+
}
920+
YogaNative.jni_YGNodeStyleSetGridAutoRowsJNI(
921+
mNativePointer, types, values, minTypes, minValues, maxTypes, maxValues);
922+
}
923+
924+
@Override
925+
public void setGridColumnStart(int value) {
926+
YogaNative.jni_YGNodeStyleSetGridColumnStartJNI(mNativePointer, value);
927+
}
928+
929+
@Override
930+
public void setGridColumnStartSpan(int span) {
931+
YogaNative.jni_YGNodeStyleSetGridColumnStartSpanJNI(mNativePointer, span);
932+
}
933+
934+
@Override
935+
public void setGridColumnEnd(int value) {
936+
YogaNative.jni_YGNodeStyleSetGridColumnEndJNI(mNativePointer, value);
937+
}
938+
939+
@Override
940+
public void setGridColumnEndSpan(int span) {
941+
YogaNative.jni_YGNodeStyleSetGridColumnEndSpanJNI(mNativePointer, span);
942+
}
943+
944+
@Override
945+
public void setGridRowStart(int value) {
946+
YogaNative.jni_YGNodeStyleSetGridRowStartJNI(mNativePointer, value);
947+
}
948+
949+
@Override
950+
public void setGridRowStartSpan(int span) {
951+
YogaNative.jni_YGNodeStyleSetGridRowStartSpanJNI(mNativePointer, span);
952+
}
953+
954+
@Override
955+
public void setGridRowEnd(int value) {
956+
YogaNative.jni_YGNodeStyleSetGridRowEndJNI(mNativePointer, value);
957+
}
958+
959+
@Override
960+
public void setGridRowEndSpan(int span) {
961+
YogaNative.jni_YGNodeStyleSetGridRowEndSpanJNI(mNativePointer, span);
962+
}
827963
}

0 commit comments

Comments
 (0)