Skip to content

Commit

Permalink
Expose box sizing getters and setters in Yoga
Browse files Browse the repository at this point in the history
Summary: I would like to write some tests for box sizing that will drive a lot of my development as I implement content box. To do that, I need this publicly exposed. Obviously not that ideal since this currently does not do anything. Maybe we can name the value in such a way that its clear it is in development?

Reviewed By: NickGerleman

Differential Revision: D63135970
  • Loading branch information
joevilches authored and facebook-github-bot committed Sep 24, 2024
1 parent 6212e56 commit f45f40f
Show file tree
Hide file tree
Showing 18 changed files with 161 additions and 1 deletion.
2 changes: 1 addition & 1 deletion enums.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.

import math
import os

ENUMS = {
Expand Down Expand Up @@ -34,6 +33,7 @@
"PositionType": ["Static", "Relative", "Absolute"],
"Display": ["Flex", "None"],
"Wrap": ["NoWrap", "Wrap", "WrapReverse"],
"BoxSizing": ["ContentBox", "BorderBox"],
"MeasureMode": ["Undefined", "Exactly", "AtMost"],
"Dimension": ["Width", "Height"],
"Edge": [
Expand Down
33 changes: 33 additions & 0 deletions java/com/facebook/yoga/YogaBoxSizing.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

// @generated by enums.py

package com.facebook.yoga;

public enum YogaBoxSizing {
CONTENT_BOX(0),
BORDER_BOX(1);

private final int mIntValue;

YogaBoxSizing(int intValue) {
mIntValue = intValue;
}

public int intValue() {
return mIntValue;
}

public static YogaBoxSizing fromInt(int value) {
switch (value) {
case 0: return CONTENT_BOX;
case 1: return BORDER_BOX;
default: throw new IllegalArgumentException("Unknown enum value: " + value);
}
}
}
2 changes: 2 additions & 0 deletions java/com/facebook/yoga/YogaNative.java
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ public class YogaNative {
static native void jni_YGNodeStyleSetAlignContentJNI(long nativePointer, int alignContent);
static native int jni_YGNodeStyleGetPositionTypeJNI(long nativePointer);
static native void jni_YGNodeStyleSetPositionTypeJNI(long nativePointer, int positionType);
static native int jni_YGNodeStyleGetBoxSizingJNI(long nativePointer);
static native void jni_YGNodeStyleSetBoxSizingJNI(long nativePointer, int boxSizing);
static native int jni_YGNodeStyleGetFlexWrapJNI(long nativePointer);
static native void jni_YGNodeStyleSetFlexWrapJNI(long nativePointer, int wrapType);
static native int jni_YGNodeStyleGetOverflowJNI(long nativePointer);
Expand Down
4 changes: 4 additions & 0 deletions java/com/facebook/yoga/YogaNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,10 @@ public interface Inputs {

public abstract void setPositionType(YogaPositionType positionType);

public abstract YogaBoxSizing getBoxSizing();

public abstract void setBoxSizing(YogaBoxSizing boxSizing);

public abstract YogaWrap getWrap();

public abstract void setWrap(YogaWrap flexWrap);
Expand Down
8 changes: 8 additions & 0 deletions java/com/facebook/yoga/YogaNodeJNIBase.java
Original file line number Diff line number Diff line change
Expand Up @@ -299,6 +299,14 @@ public void setPositionType(YogaPositionType positionType) {
YogaNative.jni_YGNodeStyleSetPositionTypeJNI(mNativePointer, positionType.intValue());
}

public YogaBoxSizing getBoxSizing() {
return YogaBoxSizing.fromInt(YogaNative.jni_YGNodeStyleGetBoxSizingJNI(mNativePointer));
}

public void setBoxSizing(YogaBoxSizing boxSizing) {
YogaNative.jni_YGNodeStyleSetBoxSizingJNI(mNativePointer, boxSizing.intValue());
}

public YogaWrap getWrap() {
return YogaWrap.fromInt(YogaNative.jni_YGNodeStyleGetFlexWrapJNI(mNativePointer));
}
Expand Down
4 changes: 4 additions & 0 deletions java/com/facebook/yoga/YogaProps.java
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,8 @@ public interface YogaProps {

void setBaselineFunction(YogaBaselineFunction yogaBaselineFunction);

void setBoxSizing(YogaBoxSizing boxSizing);

/* Getters */

YogaValue getWidth();
Expand Down Expand Up @@ -148,4 +150,6 @@ public interface YogaProps {
YogaValue getPosition(YogaEdge edge);

float getBorder(YogaEdge edge);

YogaBoxSizing getBoxSizing();
}
7 changes: 7 additions & 0 deletions java/jni/YGJNIVanilla.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -475,6 +475,7 @@ YG_NODE_JNI_STYLE_PROP(jint, YGAlign, AlignItems);
YG_NODE_JNI_STYLE_PROP(jint, YGAlign, AlignSelf);
YG_NODE_JNI_STYLE_PROP(jint, YGAlign, AlignContent);
YG_NODE_JNI_STYLE_PROP(jint, YGPositionType, PositionType);
YG_NODE_JNI_STYLE_PROP(jint, YGBoxSizing, BoxSizing);
YG_NODE_JNI_STYLE_PROP(jint, YGWrap, FlexWrap);
YG_NODE_JNI_STYLE_PROP(jint, YGOverflow, Overflow);
YG_NODE_JNI_STYLE_PROP(jint, YGDisplay, Display);
Expand Down Expand Up @@ -819,6 +820,12 @@ static JNINativeMethod methods[] = {
{"jni_YGNodeStyleSetPositionTypeJNI",
"(JI)V",
(void*)jni_YGNodeStyleSetPositionTypeJNI},
{"jni_YGNodeStyleGetBoxSizingJNI",
"(J)I",
(void*)jni_YGNodeStyleGetBoxSizingJNI},
{"jni_YGNodeStyleSetBoxSizingJNI",
"(JI)V",
(void*)jni_YGNodeStyleSetBoxSizingJNI},
{"jni_YGNodeStyleGetFlexWrapJNI",
"(J)I",
(void*)jni_YGNodeStyleGetFlexWrapJNI},
Expand Down
8 changes: 8 additions & 0 deletions javascript/src/Node.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,10 @@ void Node::copyStyle(Node const& other) {
YGNodeCopyStyle(m_node, other.m_node);
}

void Node::setBoxSizing(int boxSizing) {
YGNodeStyleSetBoxSizing(m_node, static_cast<YGBoxSizing>(boxSizing));
}

void Node::setPositionType(int positionType) {
YGNodeStyleSetPositionType(m_node, static_cast<YGPositionType>(positionType));
}
Expand Down Expand Up @@ -248,6 +252,10 @@ void Node::setGapPercent(int gutter, double gapLength) {
YGNodeStyleSetGapPercent(m_node, static_cast<YGGutter>(gutter), gapLength);
}

int Node::getBoxSizing(void) const {
return YGNodeStyleGetBoxSizing(m_node);
}

int Node::getPositionType(void) const {
return YGNodeStyleGetPositionType(m_node);
}
Expand Down
4 changes: 4 additions & 0 deletions javascript/src/Node.h
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,8 @@ class Node {
void setGap(int gutter, double gapLength);
void setGapPercent(int gutter, double gapLength);

void setBoxSizing(int boxSizing);

public: // Style getters
int getPositionType(void) const;
Value getPosition(int edge) const;
Expand Down Expand Up @@ -165,6 +167,8 @@ class Node {

float getGap(int gutter);

int getBoxSizing(void) const;

public: // Tree hierarchy mutators
void insertChild(Node* child, unsigned index);
void removeChild(Node* child);
Expand Down
4 changes: 4 additions & 0 deletions javascript/src/embind.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,8 @@ EMSCRIPTEN_BINDINGS(YOGA_LAYOUT) {
.function("setMaxHeight", &Node::setMaxHeight)
.function("setMaxHeightPercent", &Node::setMaxHeightPercent)

.function("setBoxSizing", &Node::setBoxSizing)

.function("setAspectRatio", &Node::setAspectRatio)

.function("setBorder", &Node::setBorder)
Expand Down Expand Up @@ -146,6 +148,8 @@ EMSCRIPTEN_BINDINGS(YOGA_LAYOUT) {
.function("getMaxWidth", &Node::getMaxWidth)
.function("getMaxHeight", &Node::getMaxHeight)

.function("getBoxSizing", &Node::getBoxSizing)

.function("getAspectRatio", &Node::getAspectRatio)

.function("getBorder", &Node::getBorder)
Expand Down
7 changes: 7 additions & 0 deletions javascript/src/generated/YGEnums.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@ export enum Align {
SpaceEvenly = 8,
}

export enum BoxSizing {
ContentBox = 0,
BorderBox = 1,
}

export enum Dimension {
Width = 0,
Height = 1,
Expand Down Expand Up @@ -137,6 +142,8 @@ const constants = {
ALIGN_SPACE_BETWEEN: Align.SpaceBetween,
ALIGN_SPACE_AROUND: Align.SpaceAround,
ALIGN_SPACE_EVENLY: Align.SpaceEvenly,
BOX_SIZING_CONTENT_BOX: BoxSizing.ContentBox,
BOX_SIZING_BORDER_BOX: BoxSizing.BorderBox,
DIMENSION_WIDTH: Dimension.Width,
DIMENSION_HEIGHT: Dimension.Height,
DIRECTION_INHERIT: Direction.Inherit,
Expand Down
3 changes: 3 additions & 0 deletions javascript/src/wrapAssembly.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import YGEnums from './generated/YGEnums.ts';

import type {
Align,
BoxSizing,
Display,
Edge,
Errata,
Expand Down Expand Up @@ -115,6 +116,7 @@ export type Node = {
getParent(): Node | null;
getPosition(edge: Edge): Value;
getPositionType(): PositionType;
getBoxSizing(): BoxSizing;
getWidth(): Value;
insertChild(child: Node, index: number): void;
isDirty(): boolean;
Expand Down Expand Up @@ -169,6 +171,7 @@ export type Node = {
setPositionPercent(edge: Edge, position: number | undefined): void;
setPositionType(positionType: PositionType): void;
setPositionAuto(edge: Edge): void;
setBoxSizing(boxSizing: BoxSizing): void;
setWidth(width: number | 'auto' | `${number}%` | undefined): void;
setWidthAuto(): void;
setWidthPercent(width: number | undefined): void;
Expand Down
10 changes: 10 additions & 0 deletions yoga/YGEnums.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,16 @@ const char* YGAlignToString(const YGAlign value) {
return "unknown";
}

const char* YGBoxSizingToString(const YGBoxSizing value) {
switch (value) {
case YGBoxSizingContentBox:
return "content-box";
case YGBoxSizingBorderBox:
return "border-box";
}
return "unknown";
}

const char* YGDimensionToString(const YGDimension value) {
switch (value) {
case YGDimensionWidth:
Expand Down
5 changes: 5 additions & 0 deletions yoga/YGEnums.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,11 @@ YG_ENUM_DECL(
YGAlignSpaceAround,
YGAlignSpaceEvenly)

YG_ENUM_DECL(
YGBoxSizing,
YGBoxSizingContentBox,
YGBoxSizingBorderBox)

YG_ENUM_DECL(
YGDimension,
YGDimensionWidth,
Expand Down
9 changes: 9 additions & 0 deletions yoga/YGNodeStyle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,15 @@ float YGNodeStyleGetAspectRatio(const YGNodeConstRef node) {
return op.isUndefined() ? YGUndefined : op.unwrap();
}

void YGNodeStyleSetBoxSizing(YGNodeRef node, YGBoxSizing boxSizing) {
updateStyle<&Style::boxSizing, &Style::setBoxSizing>(
node, scopedEnum(boxSizing));
}

YGBoxSizing YGNodeStyleGetBoxSizing(const YGNodeConstRef node) {
return unscopedEnum(resolveRef(node)->style().boxSizing());
}

void YGNodeStyleSetWidth(YGNodeRef node, float points) {
updateStyle<&Style::dimension, &Style::setDimension>(
node, Dimension::Width, value::points(points));
Expand Down
3 changes: 3 additions & 0 deletions yoga/YGNodeStyle.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,9 @@ YG_EXPORT void
YGNodeStyleSetGapPercent(YGNodeRef node, YGGutter gutter, float gapLength);
YG_EXPORT float YGNodeStyleGetGap(YGNodeConstRef node, YGGutter gutter);

YG_EXPORT void YGNodeStyleSetBoxSizing(YGNodeRef node, YGBoxSizing boxSizing);
YG_EXPORT YGBoxSizing YGNodeStyleGetBoxSizing(YGNodeConstRef node);

YG_EXPORT void YGNodeStyleSetWidth(YGNodeRef node, float width);
YG_EXPORT void YGNodeStyleSetWidthPercent(YGNodeRef node, float width);
YG_EXPORT void YGNodeStyleSetWidthAuto(YGNodeRef node);
Expand Down
40 changes: 40 additions & 0 deletions yoga/enums/BoxSizing.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

// @generated by enums.py
// clang-format off
#pragma once

#include <cstdint>
#include <yoga/YGEnums.h>
#include <yoga/enums/YogaEnums.h>

namespace facebook::yoga {

enum class BoxSizing : uint8_t {
ContentBox = YGBoxSizingContentBox,
BorderBox = YGBoxSizingBorderBox,
};

template <>
constexpr int32_t ordinalCount<BoxSizing>() {
return 2;
}

constexpr BoxSizing scopedEnum(YGBoxSizing unscoped) {
return static_cast<BoxSizing>(unscoped);
}

constexpr YGBoxSizing unscopedEnum(BoxSizing scoped) {
return static_cast<YGBoxSizing>(scoped);
}

inline const char* toString(BoxSizing e) {
return YGBoxSizingToString(unscopedEnum(e));
}

} // namespace facebook::yoga
9 changes: 9 additions & 0 deletions yoga/style/Style.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

#include <yoga/algorithm/FlexDirection.h>
#include <yoga/enums/Align.h>
#include <yoga/enums/BoxSizing.h>
#include <yoga/enums/Dimension.h>
#include <yoga/enums/Direction.h>
#include <yoga/enums/Display.h>
Expand Down Expand Up @@ -206,6 +207,13 @@ class YG_EXPORT Style {
value == 0.0f || std::isinf(value.unwrap()) ? FloatOptional{} : value);
}

BoxSizing boxSizing() const {
return boxSizing_;
}
void setBoxSizing(BoxSizing value) {
boxSizing_ = value;
}

bool horizontalInsetsDefined() const {
return position_[yoga::to_underlying(Edge::Left)].isDefined() ||
position_[yoga::to_underlying(Edge::Right)].isDefined() ||
Expand Down Expand Up @@ -675,6 +683,7 @@ class YG_EXPORT Style {
Wrap flexWrap_ : bitCount<Wrap>() = Wrap::NoWrap;
Overflow overflow_ : bitCount<Overflow>() = Overflow::Visible;
Display display_ : bitCount<Display>() = Display::Flex;
BoxSizing boxSizing_ : bitCount<BoxSizing>() = BoxSizing::BorderBox;

StyleValueHandle flex_{};
StyleValueHandle flexGrow_{};
Expand Down

0 comments on commit f45f40f

Please sign in to comment.