Compare commits
19 Commits
export-D70
...
mateoguzma
Author | SHA1 | Date | |
---|---|---|---|
|
0ea3cc6d2e | ||
|
8bf7a34d02 | ||
|
82671c0132 | ||
|
9f2a9476e5 | ||
|
c7c85621fc | ||
|
73980a3cf8 | ||
|
4b5ca50117 | ||
|
30291398f3 | ||
|
27d632c697 | ||
|
117fa494f7 | ||
|
073c136117 | ||
|
1232761571 | ||
|
c935fd5e10 | ||
|
624325302c | ||
|
37a94a86de | ||
|
4abc1a7d5f | ||
|
51e6095005 | ||
|
79cef614ce | ||
|
6455a848a7 |
@@ -24,7 +24,7 @@ jobs:
|
||||
ORG_GRADLE_PROJECT_SIGNING_PWD: ${{ secrets.ORG_GRADLE_PROJECT_SIGNING_PWD }}
|
||||
|
||||
- name: Upload Build Artifacts
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: 'snapshot-artifacts'
|
||||
path: '~/.m2/repository/'
|
||||
|
@@ -23,7 +23,7 @@ jobs:
|
||||
ORG_GRADLE_PROJECT_USE_SNAPSHOT: true
|
||||
|
||||
- name: Upload Build Artifacts
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: 'snapshot-artifacts'
|
||||
path: '~/.m2/repository/'
|
||||
|
2
.github/workflows/validate-js.yml
vendored
2
.github/workflows/validate-js.yml
vendored
@@ -110,7 +110,7 @@ jobs:
|
||||
run: yarn pack --filename yoga-layout.tar.gz
|
||||
working-directory: javascript
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: npm-package
|
||||
path: javascript/yoga-layout.tar.gz
|
||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@@ -73,3 +73,6 @@ local.properties
|
||||
|
||||
# Docusarus build
|
||||
.docusaurus
|
||||
|
||||
# Android Studio
|
||||
.idea
|
||||
|
@@ -9,6 +9,7 @@ plugins {
|
||||
id("com.android.library") version "8.7.1" apply false
|
||||
id("com.android.application") version "8.7.1" apply false
|
||||
id("io.github.gradle-nexus.publish-plugin") version "1.3.0"
|
||||
id 'org.jetbrains.kotlin.android' version '2.1.20' apply false
|
||||
}
|
||||
|
||||
allprojects {
|
||||
@@ -34,6 +35,8 @@ nexusPublishing {
|
||||
sonatype {
|
||||
username.set(sonatypeUsername)
|
||||
password.set(sonatypePassword)
|
||||
nexusUrl.set(uri("https://ossrh-staging-api.central.sonatype.com/service/local/"))
|
||||
snapshotRepositoryUrl.set(uri("https://central.sonatype.com/repository/maven-snapshots/"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -240,3 +240,14 @@
|
||||
<div style="position:relative; width:50px; height:50px;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="align_items_non_stretch_s526008"
|
||||
style="flex-direction: column; width: 400px; height: 400px;">
|
||||
<div style="flex-direction: row;">
|
||||
<div style="flex-direction: column; align-items: flex-start;">
|
||||
<div>
|
||||
<div style="width: 0; height: 10px;"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -1,17 +0,0 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
// You can use this script to configure the gradleEnterprise{} block in your build.
|
||||
// You need to rename this file to ./gradle/gradle-enterprise.gradle.kts in order for
|
||||
// this to be processed.
|
||||
extensions.getByName("gradleEnterprise").withGroovyBuilder {
|
||||
setProperty("server", "https://your-gradle-enterprise-instance.example.com")
|
||||
getProperty("buildScan").withGroovyBuilder {
|
||||
"publishAlways"()
|
||||
"tag"(if(System.getenv("CI") != null) "CI" else "Local")
|
||||
}
|
||||
}
|
@@ -9,6 +9,7 @@ plugins {
|
||||
id("com.android.library")
|
||||
id("maven-publish")
|
||||
id("signing")
|
||||
id("org.jetbrains.kotlin.android")
|
||||
}
|
||||
|
||||
group = "com.facebook.yoga"
|
||||
@@ -48,6 +49,8 @@ android {
|
||||
}
|
||||
}
|
||||
|
||||
kotlinOptions { jvmTarget = "1.8" }
|
||||
|
||||
publishing {
|
||||
multipleVariants {
|
||||
withSourcesJar()
|
||||
@@ -60,6 +63,7 @@ android {
|
||||
dependencies {
|
||||
implementation("com.google.code.findbugs:jsr305:3.0.2")
|
||||
implementation("com.facebook.soloader:soloader:0.10.5")
|
||||
implementation("androidx.core:core-ktx:1.16.0")
|
||||
testImplementation("junit:junit:4.12")
|
||||
}
|
||||
|
||||
|
@@ -1,25 +0,0 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package com.facebook.yoga;
|
||||
|
||||
public class YogaConstants {
|
||||
|
||||
public static final float UNDEFINED = Float.NaN;
|
||||
|
||||
public static boolean isUndefined(float value) {
|
||||
return Float.compare(value, UNDEFINED) == 0;
|
||||
}
|
||||
|
||||
public static boolean isUndefined(YogaValue value) {
|
||||
return value.unit == YogaUnit.UNDEFINED;
|
||||
}
|
||||
|
||||
public static float getUndefined() {
|
||||
return UNDEFINED;
|
||||
}
|
||||
}
|
18
java/com/facebook/yoga/YogaConstants.kt
Normal file
18
java/com/facebook/yoga/YogaConstants.kt
Normal file
@@ -0,0 +1,18 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package com.facebook.yoga
|
||||
|
||||
public object YogaConstants {
|
||||
@JvmField public val UNDEFINED: Float = Float.NaN
|
||||
|
||||
@JvmStatic public fun isUndefined(value: Float): Boolean = value.compareTo(UNDEFINED) == 0
|
||||
|
||||
@JvmStatic public fun isUndefined(value: YogaValue): Boolean = value.unit == YogaUnit.UNDEFINED
|
||||
|
||||
@JvmStatic public fun getUndefined(): Float = UNDEFINED
|
||||
}
|
@@ -1,279 +0,0 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package com.facebook.yoga;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public abstract class YogaNode implements YogaProps {
|
||||
|
||||
/** The interface the {@link #getData()} object can optionally implement. */
|
||||
public interface Inputs {
|
||||
|
||||
/** Requests the data object to disable mutations of its inputs. */
|
||||
void freeze(final YogaNode node, final @Nullable YogaNode parent);
|
||||
}
|
||||
|
||||
public abstract void reset();
|
||||
|
||||
public abstract int getChildCount();
|
||||
|
||||
public abstract YogaNode getChildAt(int i);
|
||||
|
||||
public abstract void addChildAt(YogaNode child, int i);
|
||||
|
||||
public abstract void setIsReferenceBaseline(boolean isReferenceBaseline);
|
||||
|
||||
public abstract boolean isReferenceBaseline();
|
||||
|
||||
public abstract YogaNode removeChildAt(int i);
|
||||
|
||||
/**
|
||||
* @returns the {@link YogaNode} that owns this {@link YogaNode}. The owner is used to identify
|
||||
* the YogaTree that a {@link YogaNode} belongs to. This method will return the parent of the
|
||||
* {@link YogaNode} when the {@link YogaNode} only belongs to one YogaTree or null when the
|
||||
* {@link YogaNode} is shared between two or more YogaTrees.
|
||||
*/
|
||||
@Nullable
|
||||
public abstract YogaNode getOwner();
|
||||
|
||||
/** @deprecated Use #getOwner() instead. This will be removed in the next version. */
|
||||
@Deprecated
|
||||
@Nullable
|
||||
public abstract YogaNode getParent();
|
||||
|
||||
public abstract int indexOf(YogaNode child);
|
||||
|
||||
public abstract void calculateLayout(float width, float height);
|
||||
|
||||
public abstract boolean hasNewLayout();
|
||||
|
||||
public abstract void dirty();
|
||||
|
||||
public abstract boolean isDirty();
|
||||
|
||||
public abstract void copyStyle(YogaNode srcNode);
|
||||
|
||||
public abstract void markLayoutSeen();
|
||||
|
||||
public abstract YogaDirection getStyleDirection();
|
||||
|
||||
public abstract void setDirection(YogaDirection direction);
|
||||
|
||||
public abstract YogaFlexDirection getFlexDirection();
|
||||
|
||||
public abstract void setFlexDirection(YogaFlexDirection flexDirection);
|
||||
|
||||
public abstract YogaJustify getJustifyContent();
|
||||
|
||||
public abstract void setJustifyContent(YogaJustify justifyContent);
|
||||
|
||||
public abstract YogaAlign getAlignItems();
|
||||
|
||||
public abstract void setAlignItems(YogaAlign alignItems);
|
||||
|
||||
public abstract YogaAlign getAlignSelf();
|
||||
|
||||
public abstract void setAlignSelf(YogaAlign alignSelf);
|
||||
|
||||
public abstract YogaAlign getAlignContent();
|
||||
|
||||
public abstract void setAlignContent(YogaAlign alignContent);
|
||||
|
||||
public abstract YogaPositionType getPositionType();
|
||||
|
||||
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);
|
||||
|
||||
public abstract YogaOverflow getOverflow();
|
||||
|
||||
public abstract void setOverflow(YogaOverflow overflow);
|
||||
|
||||
public abstract YogaDisplay getDisplay();
|
||||
|
||||
public abstract void setDisplay(YogaDisplay display);
|
||||
|
||||
public abstract float getFlex();
|
||||
|
||||
public abstract void setFlex(float flex);
|
||||
|
||||
public abstract float getFlexGrow();
|
||||
|
||||
public abstract void setFlexGrow(float flexGrow);
|
||||
|
||||
public abstract float getFlexShrink();
|
||||
|
||||
public abstract void setFlexShrink(float flexShrink);
|
||||
|
||||
public abstract YogaValue getFlexBasis();
|
||||
|
||||
public abstract void setFlexBasis(float flexBasis);
|
||||
|
||||
public abstract void setFlexBasisPercent(float percent);
|
||||
|
||||
public abstract void setFlexBasisAuto();
|
||||
|
||||
public abstract void setFlexBasisMaxContent();
|
||||
|
||||
public abstract void setFlexBasisFitContent();
|
||||
|
||||
public abstract void setFlexBasisStretch();
|
||||
|
||||
public abstract YogaValue getMargin(YogaEdge edge);
|
||||
|
||||
public abstract void setMargin(YogaEdge edge, float margin);
|
||||
|
||||
public abstract void setMarginPercent(YogaEdge edge, float percent);
|
||||
|
||||
public abstract void setMarginAuto(YogaEdge edge);
|
||||
|
||||
public abstract YogaValue getPadding(YogaEdge edge);
|
||||
|
||||
public abstract void setPadding(YogaEdge edge, float padding);
|
||||
|
||||
public abstract void setPaddingPercent(YogaEdge edge, float percent);
|
||||
|
||||
public abstract float getBorder(YogaEdge edge);
|
||||
|
||||
public abstract void setBorder(YogaEdge edge, float border);
|
||||
|
||||
public abstract YogaValue getPosition(YogaEdge edge);
|
||||
|
||||
public abstract void setPosition(YogaEdge edge, float position);
|
||||
|
||||
public abstract void setPositionPercent(YogaEdge edge, float percent);
|
||||
|
||||
public abstract void setPositionAuto(YogaEdge edge);
|
||||
|
||||
public abstract YogaValue getWidth();
|
||||
|
||||
public abstract void setWidth(float width);
|
||||
|
||||
public abstract void setWidthPercent(float percent);
|
||||
|
||||
public abstract void setWidthAuto();
|
||||
|
||||
public abstract void setWidthMaxContent();
|
||||
|
||||
public abstract void setWidthFitContent();
|
||||
|
||||
public abstract void setWidthStretch();
|
||||
|
||||
public abstract YogaValue getHeight();
|
||||
|
||||
public abstract void setHeight(float height);
|
||||
|
||||
public abstract void setHeightPercent(float percent);
|
||||
|
||||
public abstract void setHeightAuto();
|
||||
|
||||
public abstract void setHeightMaxContent();
|
||||
|
||||
public abstract void setHeightFitContent();
|
||||
|
||||
public abstract void setHeightStretch();
|
||||
|
||||
public abstract YogaValue getMinWidth();
|
||||
|
||||
public abstract void setMinWidth(float minWidth);
|
||||
|
||||
public abstract void setMinWidthPercent(float percent);
|
||||
|
||||
public abstract void setMinWidthMaxContent();
|
||||
|
||||
public abstract void setMinWidthFitContent();
|
||||
|
||||
public abstract void setMinWidthStretch();
|
||||
|
||||
public abstract YogaValue getMinHeight();
|
||||
|
||||
public abstract void setMinHeight(float minHeight);
|
||||
|
||||
public abstract void setMinHeightPercent(float percent);
|
||||
|
||||
public abstract void setMinHeightMaxContent();
|
||||
|
||||
public abstract void setMinHeightFitContent();
|
||||
|
||||
public abstract void setMinHeightStretch();
|
||||
|
||||
public abstract YogaValue getMaxWidth();
|
||||
|
||||
public abstract void setMaxWidth(float maxWidth);
|
||||
|
||||
public abstract void setMaxWidthPercent(float percent);
|
||||
|
||||
public abstract void setMaxWidthMaxContent();
|
||||
|
||||
public abstract void setMaxWidthFitContent();
|
||||
|
||||
public abstract void setMaxWidthStretch();
|
||||
|
||||
public abstract YogaValue getMaxHeight();
|
||||
|
||||
public abstract void setMaxHeight(float maxheight);
|
||||
|
||||
public abstract void setMaxHeightPercent(float percent);
|
||||
|
||||
public abstract void setMaxHeightMaxContent();
|
||||
|
||||
public abstract void setMaxHeightFitContent();
|
||||
|
||||
public abstract void setMaxHeightStretch();
|
||||
|
||||
public abstract float getAspectRatio();
|
||||
|
||||
public abstract void setAspectRatio(float aspectRatio);
|
||||
|
||||
public abstract YogaValue getGap(YogaGutter gutter);
|
||||
|
||||
public abstract void setGap(YogaGutter gutter, float gapLength);
|
||||
|
||||
public abstract void setGapPercent(YogaGutter gutter, float gapLength);
|
||||
|
||||
public abstract float getLayoutX();
|
||||
|
||||
public abstract float getLayoutY();
|
||||
|
||||
public abstract float getLayoutWidth();
|
||||
|
||||
public abstract float getLayoutHeight();
|
||||
|
||||
public abstract float getLayoutMargin(YogaEdge edge);
|
||||
|
||||
public abstract float getLayoutPadding(YogaEdge edge);
|
||||
|
||||
public abstract float getLayoutBorder(YogaEdge edge);
|
||||
|
||||
public abstract YogaDirection getLayoutDirection();
|
||||
|
||||
public abstract void setMeasureFunction(YogaMeasureFunction measureFunction);
|
||||
|
||||
public abstract void setBaselineFunction(YogaBaselineFunction baselineFunction);
|
||||
|
||||
public abstract boolean isMeasureDefined();
|
||||
|
||||
public abstract boolean isBaselineDefined();
|
||||
|
||||
public abstract void setData(Object data);
|
||||
|
||||
@Nullable
|
||||
public abstract Object getData();
|
||||
|
||||
public abstract YogaNode cloneWithoutChildren();
|
||||
|
||||
public abstract YogaNode cloneWithChildren();
|
||||
|
||||
public abstract void setAlwaysFormsContainingBlock(boolean alwaysFormsContainingBlock);
|
||||
}
|
273
java/com/facebook/yoga/YogaNode.kt
Normal file
273
java/com/facebook/yoga/YogaNode.kt
Normal file
@@ -0,0 +1,273 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package com.facebook.yoga
|
||||
|
||||
public abstract class YogaNode : YogaProps {
|
||||
/** The interface the [getData] object can optionally implement. */
|
||||
public fun interface Inputs {
|
||||
/** Requests the data object to disable mutations of its inputs. */
|
||||
public fun freeze(node: YogaNode, parent: YogaNode?)
|
||||
}
|
||||
|
||||
public abstract fun reset()
|
||||
|
||||
public abstract fun getChildCount(): Int
|
||||
|
||||
public abstract fun getChildAt(i: Int): YogaNode
|
||||
|
||||
public abstract fun addChildAt(child: YogaNode, i: Int)
|
||||
|
||||
abstract override fun setIsReferenceBaseline(isReferenceBaseline: Boolean)
|
||||
|
||||
public abstract fun isReferenceBaseline(): Boolean
|
||||
|
||||
public abstract fun removeChildAt(i: Int): YogaNode
|
||||
|
||||
/**
|
||||
* @returns the [YogaNode] that owns this [YogaNode]. The owner is used to identify the YogaTree
|
||||
* that a [YogaNode] belongs to. This method will return the parent of the [YogaNode] when the
|
||||
* [YogaNode] only belongs to one YogaTree or null when the [YogaNode] is shared between two or
|
||||
* more YogaTrees.
|
||||
*/
|
||||
public abstract fun getOwner(): YogaNode?
|
||||
|
||||
@Deprecated(
|
||||
"Use getOwner() instead. This will be removed in the next version. ",
|
||||
replaceWith = ReplaceWith("getOwner()"))
|
||||
public abstract fun getParent(): YogaNode?
|
||||
|
||||
public abstract fun indexOf(child: YogaNode): Int
|
||||
|
||||
public abstract fun calculateLayout(width: Float, height: Float)
|
||||
|
||||
public abstract fun hasNewLayout(): Boolean
|
||||
|
||||
public abstract fun dirty()
|
||||
|
||||
public abstract fun isDirty(): Boolean
|
||||
|
||||
public abstract fun copyStyle(srcNode: YogaNode)
|
||||
|
||||
public abstract fun markLayoutSeen()
|
||||
|
||||
abstract override fun getStyleDirection(): YogaDirection
|
||||
|
||||
abstract override fun setDirection(direction: YogaDirection)
|
||||
|
||||
abstract override fun getFlexDirection(): YogaFlexDirection
|
||||
|
||||
abstract override fun setFlexDirection(flexDirection: YogaFlexDirection)
|
||||
|
||||
abstract override fun getJustifyContent(): YogaJustify
|
||||
|
||||
abstract override fun setJustifyContent(justifyContent: YogaJustify)
|
||||
|
||||
abstract override fun getAlignItems(): YogaAlign
|
||||
|
||||
abstract override fun setAlignItems(alignItems: YogaAlign)
|
||||
|
||||
abstract override fun getAlignSelf(): YogaAlign
|
||||
|
||||
abstract override fun setAlignSelf(alignSelf: YogaAlign)
|
||||
|
||||
abstract override fun getAlignContent(): YogaAlign
|
||||
|
||||
abstract override fun setAlignContent(alignContent: YogaAlign)
|
||||
|
||||
abstract override fun getPositionType(): YogaPositionType
|
||||
|
||||
abstract override fun setPositionType(positionType: YogaPositionType)
|
||||
|
||||
abstract override fun getBoxSizing(): YogaBoxSizing
|
||||
|
||||
abstract override fun setBoxSizing(boxSizing: YogaBoxSizing)
|
||||
|
||||
public abstract fun getWrap(): YogaWrap
|
||||
|
||||
abstract override fun setWrap(flexWrap: YogaWrap)
|
||||
|
||||
public abstract fun getOverflow(): YogaOverflow
|
||||
|
||||
public abstract fun setOverflow(overflow: YogaOverflow)
|
||||
|
||||
public abstract fun getDisplay(): YogaDisplay
|
||||
|
||||
public abstract fun setDisplay(display: YogaDisplay)
|
||||
|
||||
public abstract fun getFlex(): Float
|
||||
|
||||
abstract override fun setFlex(flex: Float)
|
||||
|
||||
abstract override fun getFlexGrow(): Float
|
||||
|
||||
abstract override fun setFlexGrow(flexGrow: Float)
|
||||
|
||||
abstract override fun getFlexShrink(): Float
|
||||
|
||||
abstract override fun setFlexShrink(flexShrink: Float)
|
||||
|
||||
abstract override fun getFlexBasis(): YogaValue
|
||||
|
||||
abstract override fun setFlexBasis(flexBasis: Float)
|
||||
|
||||
abstract override fun setFlexBasisPercent(percent: Float)
|
||||
|
||||
abstract override fun setFlexBasisAuto()
|
||||
|
||||
abstract override fun setFlexBasisMaxContent()
|
||||
|
||||
abstract override fun setFlexBasisFitContent()
|
||||
|
||||
abstract override fun setFlexBasisStretch()
|
||||
|
||||
abstract override fun getMargin(edge: YogaEdge): YogaValue
|
||||
|
||||
abstract override fun setMargin(edge: YogaEdge, margin: Float)
|
||||
|
||||
abstract override fun setMarginPercent(edge: YogaEdge, percent: Float)
|
||||
|
||||
abstract override fun setMarginAuto(edge: YogaEdge)
|
||||
|
||||
abstract override fun getPadding(edge: YogaEdge): YogaValue
|
||||
|
||||
abstract override fun setPadding(edge: YogaEdge, padding: Float)
|
||||
|
||||
abstract override fun setPaddingPercent(edge: YogaEdge, percent: Float)
|
||||
|
||||
abstract override fun getBorder(edge: YogaEdge): Float
|
||||
|
||||
abstract override fun setBorder(edge: YogaEdge, border: Float)
|
||||
|
||||
abstract override fun getPosition(edge: YogaEdge): YogaValue
|
||||
|
||||
abstract override fun setPosition(edge: YogaEdge, position: Float)
|
||||
|
||||
abstract override fun setPositionPercent(edge: YogaEdge, percent: Float)
|
||||
|
||||
public abstract fun setPositionAuto(edge: YogaEdge)
|
||||
|
||||
abstract override fun getWidth(): YogaValue
|
||||
|
||||
abstract override fun setWidth(width: Float)
|
||||
|
||||
abstract override fun setWidthPercent(percent: Float)
|
||||
|
||||
abstract override fun setWidthAuto()
|
||||
|
||||
abstract override fun setWidthMaxContent()
|
||||
|
||||
abstract override fun setWidthFitContent()
|
||||
|
||||
abstract override fun setWidthStretch()
|
||||
|
||||
abstract override fun getHeight(): YogaValue
|
||||
|
||||
abstract override fun setHeight(height: Float)
|
||||
|
||||
abstract override fun setHeightPercent(percent: Float)
|
||||
|
||||
abstract override fun setHeightAuto()
|
||||
|
||||
abstract override fun setHeightMaxContent()
|
||||
|
||||
abstract override fun setHeightFitContent()
|
||||
|
||||
abstract override fun setHeightStretch()
|
||||
|
||||
abstract override fun getMinWidth(): YogaValue
|
||||
|
||||
abstract override fun setMinWidth(minWidth: Float)
|
||||
|
||||
abstract override fun setMinWidthPercent(percent: Float)
|
||||
|
||||
abstract override fun setMinWidthMaxContent()
|
||||
|
||||
abstract override fun setMinWidthFitContent()
|
||||
|
||||
abstract override fun setMinWidthStretch()
|
||||
|
||||
abstract override fun getMinHeight(): YogaValue
|
||||
|
||||
abstract override fun setMinHeight(minHeight: Float)
|
||||
|
||||
abstract override fun setMinHeightPercent(percent: Float)
|
||||
|
||||
abstract override fun setMinHeightMaxContent()
|
||||
|
||||
abstract override fun setMinHeightFitContent()
|
||||
|
||||
abstract override fun setMinHeightStretch()
|
||||
|
||||
abstract override fun getMaxWidth(): YogaValue
|
||||
|
||||
abstract override fun setMaxWidth(maxWidth: Float)
|
||||
|
||||
abstract override fun setMaxWidthPercent(percent: Float)
|
||||
|
||||
abstract override fun setMaxWidthMaxContent()
|
||||
|
||||
abstract override fun setMaxWidthFitContent()
|
||||
|
||||
abstract override fun setMaxWidthStretch()
|
||||
|
||||
abstract override fun getMaxHeight(): YogaValue
|
||||
|
||||
abstract override fun setMaxHeight(maxheight: Float)
|
||||
|
||||
abstract override fun setMaxHeightPercent(percent: Float)
|
||||
|
||||
abstract override fun setMaxHeightMaxContent()
|
||||
|
||||
abstract override fun setMaxHeightFitContent()
|
||||
|
||||
abstract override fun setMaxHeightStretch()
|
||||
|
||||
abstract override fun getAspectRatio(): Float
|
||||
|
||||
abstract override fun setAspectRatio(aspectRatio: Float)
|
||||
|
||||
public abstract fun getGap(gutter: YogaGutter): YogaValue
|
||||
|
||||
public abstract fun setGap(gutter: YogaGutter, gapLength: Float)
|
||||
|
||||
public abstract fun setGapPercent(gutter: YogaGutter, gapLength: Float)
|
||||
|
||||
public abstract fun getLayoutX(): Float
|
||||
|
||||
public abstract fun getLayoutY(): Float
|
||||
|
||||
public abstract fun getLayoutWidth(): Float
|
||||
|
||||
public abstract fun getLayoutHeight(): Float
|
||||
|
||||
public abstract fun getLayoutMargin(edge: YogaEdge): Float
|
||||
|
||||
public abstract fun getLayoutPadding(edge: YogaEdge): Float
|
||||
|
||||
public abstract fun getLayoutBorder(edge: YogaEdge): Float
|
||||
|
||||
public abstract fun getLayoutDirection(): YogaDirection
|
||||
|
||||
abstract override fun setMeasureFunction(measureFunction: YogaMeasureFunction)
|
||||
|
||||
abstract override fun setBaselineFunction(baselineFunction: YogaBaselineFunction)
|
||||
|
||||
public abstract fun isMeasureDefined(): Boolean
|
||||
|
||||
public abstract fun isBaselineDefined(): Boolean
|
||||
|
||||
public abstract fun setData(data: Any)
|
||||
|
||||
public abstract fun getData(): Any?
|
||||
|
||||
public abstract fun cloneWithoutChildren(): YogaNode
|
||||
|
||||
public abstract fun cloneWithChildren(): YogaNode
|
||||
|
||||
public abstract fun setAlwaysFormsContainingBlock(alwaysFormsContainingBlock: Boolean)
|
||||
}
|
@@ -4,7 +4,7 @@
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @generated SignedSource<<e8d11c0e97041bb2f1487f0d87363fdc>>
|
||||
* @generated SignedSource<<84597dd8b2c4f3aac1f21abe68f25308>>
|
||||
* generated by gentest/gentest-driver.ts from gentest/fixtures/YGAlignItemsTest.html
|
||||
*/
|
||||
|
||||
@@ -2293,6 +2293,86 @@ public class YGAlignItemsTest {
|
||||
assertEquals(50f, root_child1.getLayoutHeight(), 0.0f);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test_align_items_non_stretch_s526008() {
|
||||
YogaConfig config = YogaConfigFactory.create();
|
||||
|
||||
final YogaNode root = createNode(config);
|
||||
root.setPositionType(YogaPositionType.ABSOLUTE);
|
||||
root.setWidth(400f);
|
||||
root.setHeight(400f);
|
||||
|
||||
final YogaNode root_child0 = createNode(config);
|
||||
root_child0.setFlexDirection(YogaFlexDirection.ROW);
|
||||
root.addChildAt(root_child0, 0);
|
||||
|
||||
final YogaNode root_child0_child0 = createNode(config);
|
||||
root_child0_child0.setAlignItems(YogaAlign.FLEX_START);
|
||||
root_child0.addChildAt(root_child0_child0, 0);
|
||||
|
||||
final YogaNode root_child0_child0_child0 = createNode(config);
|
||||
root_child0_child0.addChildAt(root_child0_child0_child0, 0);
|
||||
|
||||
final YogaNode root_child0_child0_child0_child0 = createNode(config);
|
||||
root_child0_child0_child0_child0.setHeight(10f);
|
||||
root_child0_child0_child0.addChildAt(root_child0_child0_child0_child0, 0);
|
||||
root.setDirection(YogaDirection.LTR);
|
||||
root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED);
|
||||
|
||||
assertEquals(0f, root.getLayoutX(), 0.0f);
|
||||
assertEquals(0f, root.getLayoutY(), 0.0f);
|
||||
assertEquals(400f, root.getLayoutWidth(), 0.0f);
|
||||
assertEquals(400f, root.getLayoutHeight(), 0.0f);
|
||||
|
||||
assertEquals(0f, root_child0.getLayoutX(), 0.0f);
|
||||
assertEquals(0f, root_child0.getLayoutY(), 0.0f);
|
||||
assertEquals(400f, root_child0.getLayoutWidth(), 0.0f);
|
||||
assertEquals(10f, root_child0.getLayoutHeight(), 0.0f);
|
||||
|
||||
assertEquals(0f, root_child0_child0.getLayoutX(), 0.0f);
|
||||
assertEquals(0f, root_child0_child0.getLayoutY(), 0.0f);
|
||||
assertEquals(0f, root_child0_child0.getLayoutWidth(), 0.0f);
|
||||
assertEquals(10f, root_child0_child0.getLayoutHeight(), 0.0f);
|
||||
|
||||
assertEquals(0f, root_child0_child0_child0.getLayoutX(), 0.0f);
|
||||
assertEquals(0f, root_child0_child0_child0.getLayoutY(), 0.0f);
|
||||
assertEquals(0f, root_child0_child0_child0.getLayoutWidth(), 0.0f);
|
||||
assertEquals(10f, root_child0_child0_child0.getLayoutHeight(), 0.0f);
|
||||
|
||||
assertEquals(0f, root_child0_child0_child0_child0.getLayoutX(), 0.0f);
|
||||
assertEquals(0f, root_child0_child0_child0_child0.getLayoutY(), 0.0f);
|
||||
assertEquals(0f, root_child0_child0_child0_child0.getLayoutWidth(), 0.0f);
|
||||
assertEquals(10f, root_child0_child0_child0_child0.getLayoutHeight(), 0.0f);
|
||||
|
||||
root.setDirection(YogaDirection.RTL);
|
||||
root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED);
|
||||
|
||||
assertEquals(0f, root.getLayoutX(), 0.0f);
|
||||
assertEquals(0f, root.getLayoutY(), 0.0f);
|
||||
assertEquals(400f, root.getLayoutWidth(), 0.0f);
|
||||
assertEquals(400f, root.getLayoutHeight(), 0.0f);
|
||||
|
||||
assertEquals(0f, root_child0.getLayoutX(), 0.0f);
|
||||
assertEquals(0f, root_child0.getLayoutY(), 0.0f);
|
||||
assertEquals(400f, root_child0.getLayoutWidth(), 0.0f);
|
||||
assertEquals(10f, root_child0.getLayoutHeight(), 0.0f);
|
||||
|
||||
assertEquals(400f, root_child0_child0.getLayoutX(), 0.0f);
|
||||
assertEquals(0f, root_child0_child0.getLayoutY(), 0.0f);
|
||||
assertEquals(0f, root_child0_child0.getLayoutWidth(), 0.0f);
|
||||
assertEquals(10f, root_child0_child0.getLayoutHeight(), 0.0f);
|
||||
|
||||
assertEquals(0f, root_child0_child0_child0.getLayoutX(), 0.0f);
|
||||
assertEquals(0f, root_child0_child0_child0.getLayoutY(), 0.0f);
|
||||
assertEquals(0f, root_child0_child0_child0.getLayoutWidth(), 0.0f);
|
||||
assertEquals(10f, root_child0_child0_child0.getLayoutHeight(), 0.0f);
|
||||
|
||||
assertEquals(0f, root_child0_child0_child0_child0.getLayoutX(), 0.0f);
|
||||
assertEquals(0f, root_child0_child0_child0_child0.getLayoutY(), 0.0f);
|
||||
assertEquals(0f, root_child0_child0_child0_child0.getLayoutWidth(), 0.0f);
|
||||
assertEquals(10f, root_child0_child0_child0_child0.getLayoutHeight(), 0.0f);
|
||||
}
|
||||
|
||||
private YogaNode createNode(YogaConfig config) {
|
||||
return mNodeFactory.create(config);
|
||||
}
|
||||
|
@@ -4,7 +4,7 @@
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @generated SignedSource<<075a0b67003e5c4a1f51bd99da71c700>>
|
||||
* @generated SignedSource<<fd80af208d8635435f86ffa8f3810b39>>
|
||||
* generated by gentest/gentest-driver.ts from gentest/fixtures/YGAlignItemsTest.html
|
||||
*/
|
||||
|
||||
@@ -2442,3 +2442,88 @@ test('align_stretch_with_row_reverse', () => {
|
||||
config.free();
|
||||
}
|
||||
});
|
||||
test('align_items_non_stretch_s526008', () => {
|
||||
const config = Yoga.Config.create();
|
||||
let root;
|
||||
|
||||
try {
|
||||
root = Yoga.Node.create(config);
|
||||
root.setPositionType(PositionType.Absolute);
|
||||
root.setWidth(400);
|
||||
root.setHeight(400);
|
||||
|
||||
const root_child0 = Yoga.Node.create(config);
|
||||
root_child0.setFlexDirection(FlexDirection.Row);
|
||||
root.insertChild(root_child0, 0);
|
||||
|
||||
const root_child0_child0 = Yoga.Node.create(config);
|
||||
root_child0_child0.setAlignItems(Align.FlexStart);
|
||||
root_child0.insertChild(root_child0_child0, 0);
|
||||
|
||||
const root_child0_child0_child0 = Yoga.Node.create(config);
|
||||
root_child0_child0.insertChild(root_child0_child0_child0, 0);
|
||||
|
||||
const root_child0_child0_child0_child0 = Yoga.Node.create(config);
|
||||
root_child0_child0_child0_child0.setHeight(10);
|
||||
root_child0_child0_child0.insertChild(root_child0_child0_child0_child0, 0);
|
||||
root.calculateLayout(undefined, undefined, Direction.LTR);
|
||||
|
||||
expect(root.getComputedLeft()).toBe(0);
|
||||
expect(root.getComputedTop()).toBe(0);
|
||||
expect(root.getComputedWidth()).toBe(400);
|
||||
expect(root.getComputedHeight()).toBe(400);
|
||||
|
||||
expect(root_child0.getComputedLeft()).toBe(0);
|
||||
expect(root_child0.getComputedTop()).toBe(0);
|
||||
expect(root_child0.getComputedWidth()).toBe(400);
|
||||
expect(root_child0.getComputedHeight()).toBe(10);
|
||||
|
||||
expect(root_child0_child0.getComputedLeft()).toBe(0);
|
||||
expect(root_child0_child0.getComputedTop()).toBe(0);
|
||||
expect(root_child0_child0.getComputedWidth()).toBe(0);
|
||||
expect(root_child0_child0.getComputedHeight()).toBe(10);
|
||||
|
||||
expect(root_child0_child0_child0.getComputedLeft()).toBe(0);
|
||||
expect(root_child0_child0_child0.getComputedTop()).toBe(0);
|
||||
expect(root_child0_child0_child0.getComputedWidth()).toBe(0);
|
||||
expect(root_child0_child0_child0.getComputedHeight()).toBe(10);
|
||||
|
||||
expect(root_child0_child0_child0_child0.getComputedLeft()).toBe(0);
|
||||
expect(root_child0_child0_child0_child0.getComputedTop()).toBe(0);
|
||||
expect(root_child0_child0_child0_child0.getComputedWidth()).toBe(0);
|
||||
expect(root_child0_child0_child0_child0.getComputedHeight()).toBe(10);
|
||||
|
||||
root.calculateLayout(undefined, undefined, Direction.RTL);
|
||||
|
||||
expect(root.getComputedLeft()).toBe(0);
|
||||
expect(root.getComputedTop()).toBe(0);
|
||||
expect(root.getComputedWidth()).toBe(400);
|
||||
expect(root.getComputedHeight()).toBe(400);
|
||||
|
||||
expect(root_child0.getComputedLeft()).toBe(0);
|
||||
expect(root_child0.getComputedTop()).toBe(0);
|
||||
expect(root_child0.getComputedWidth()).toBe(400);
|
||||
expect(root_child0.getComputedHeight()).toBe(10);
|
||||
|
||||
expect(root_child0_child0.getComputedLeft()).toBe(400);
|
||||
expect(root_child0_child0.getComputedTop()).toBe(0);
|
||||
expect(root_child0_child0.getComputedWidth()).toBe(0);
|
||||
expect(root_child0_child0.getComputedHeight()).toBe(10);
|
||||
|
||||
expect(root_child0_child0_child0.getComputedLeft()).toBe(0);
|
||||
expect(root_child0_child0_child0.getComputedTop()).toBe(0);
|
||||
expect(root_child0_child0_child0.getComputedWidth()).toBe(0);
|
||||
expect(root_child0_child0_child0.getComputedHeight()).toBe(10);
|
||||
|
||||
expect(root_child0_child0_child0_child0.getComputedLeft()).toBe(0);
|
||||
expect(root_child0_child0_child0_child0.getComputedTop()).toBe(0);
|
||||
expect(root_child0_child0_child0_child0.getComputedWidth()).toBe(0);
|
||||
expect(root_child0_child0_child0_child0.getComputedHeight()).toBe(10);
|
||||
} finally {
|
||||
if (typeof root !== 'undefined') {
|
||||
root.freeRecursive();
|
||||
}
|
||||
|
||||
config.free();
|
||||
}
|
||||
});
|
||||
|
@@ -19,10 +19,11 @@ include(":yoga")
|
||||
|
||||
project(":yoga").projectDir = file("java")
|
||||
|
||||
rootProject.name = "yoga-github"
|
||||
|
||||
// If you specify a file inside gradle/gradle-enterprise.gradle.kts
|
||||
// you can configure your custom Gradle Enterprise instance
|
||||
if (file("./gradle/gradle-enterprise.gradle.kts").exists()) {
|
||||
apply(from = "./gradle/gradle-enterprise.gradle.kts")
|
||||
gradleEnterprise {
|
||||
buildScan {
|
||||
termsOfServiceUrl = "https://gradle.com/terms-of-service"
|
||||
termsOfServiceAgree = "yes"
|
||||
}
|
||||
}
|
||||
|
||||
rootProject.name = "yoga-github"
|
||||
|
7
tests/.clang-tidy
Normal file
7
tests/.clang-tidy
Normal file
@@ -0,0 +1,7 @@
|
||||
---
|
||||
InheritParentConfig: true
|
||||
Checks: '
|
||||
-facebook-hte-CArray,
|
||||
-modernize-avoid-c-arrays,
|
||||
'
|
||||
...
|
214
tests/YGPersistentNodeCloningTest.cpp
Normal file
214
tests/YGPersistentNodeCloningTest.cpp
Normal file
@@ -0,0 +1,214 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <yoga/Yoga.h>
|
||||
#include <yoga/config/Config.h>
|
||||
#include <yoga/node/Node.h>
|
||||
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
namespace facebook::yoga {
|
||||
|
||||
struct YGPersistentNodeCloningTest : public ::testing::Test {
|
||||
struct NodeWrapper {
|
||||
explicit NodeWrapper(
|
||||
YGConfigRef config,
|
||||
std::vector<std::shared_ptr<NodeWrapper>> children = {})
|
||||
: node{YGNodeNewWithConfig(config)}, children{std::move(children)} {
|
||||
YGNodeSetContext(node, this);
|
||||
|
||||
auto privateNode = resolveRef(node);
|
||||
for (const auto& child : this->children) {
|
||||
auto privateChild = resolveRef(child->node);
|
||||
// Claim first ownership of not yet owned nodes, to avoid immediately
|
||||
// cloning them
|
||||
if (YGNodeGetOwner(child->node) == nullptr) {
|
||||
privateChild->setOwner(privateNode);
|
||||
}
|
||||
privateNode->insertChild(privateChild, privateNode->getChildCount());
|
||||
}
|
||||
}
|
||||
|
||||
// Clone, with current children, for mutation
|
||||
NodeWrapper(const NodeWrapper& other)
|
||||
: node{YGNodeClone(other.node)}, children{other.children} {
|
||||
YGNodeSetContext(node, this);
|
||||
|
||||
auto privateNode = resolveRef(node);
|
||||
privateNode->setOwner(nullptr);
|
||||
}
|
||||
|
||||
// Clone, with new children
|
||||
NodeWrapper(
|
||||
const NodeWrapper& other,
|
||||
std::vector<std::shared_ptr<NodeWrapper>> children)
|
||||
: node{YGNodeClone(other.node)}, children{std::move(children)} {
|
||||
YGNodeSetContext(node, this);
|
||||
|
||||
auto privateNode = resolveRef(node);
|
||||
privateNode->setOwner(nullptr);
|
||||
privateNode->setChildren({});
|
||||
privateNode->setDirty(true);
|
||||
|
||||
for (const auto& child : this->children) {
|
||||
auto privateChild = resolveRef(child->node);
|
||||
// Claim first ownership of not yet owned nodes, to avoid immediately
|
||||
// cloning them
|
||||
if (YGNodeGetOwner(child->node) == nullptr) {
|
||||
privateChild->setOwner(privateNode);
|
||||
}
|
||||
privateNode->insertChild(privateChild, privateNode->getChildCount());
|
||||
}
|
||||
}
|
||||
|
||||
NodeWrapper(NodeWrapper&&) = delete;
|
||||
|
||||
~NodeWrapper() {
|
||||
YGNodeFree(node);
|
||||
}
|
||||
|
||||
NodeWrapper& operator=(const NodeWrapper& other) = delete;
|
||||
NodeWrapper& operator=(NodeWrapper&& other) = delete;
|
||||
|
||||
YGNodeRef node;
|
||||
std::vector<std::shared_ptr<NodeWrapper>> children;
|
||||
};
|
||||
|
||||
struct ConfigWrapper {
|
||||
ConfigWrapper() {
|
||||
YGConfigSetCloneNodeFunc(
|
||||
config,
|
||||
[](YGNodeConstRef oldNode, YGNodeConstRef owner, size_t childIndex) {
|
||||
onClone(oldNode, owner, childIndex);
|
||||
auto wrapper = static_cast<NodeWrapper*>(YGNodeGetContext(owner));
|
||||
auto old = static_cast<NodeWrapper*>(YGNodeGetContext(oldNode));
|
||||
|
||||
wrapper->children[childIndex] = std::make_shared<NodeWrapper>(*old);
|
||||
return wrapper->children[childIndex]->node;
|
||||
});
|
||||
}
|
||||
|
||||
ConfigWrapper(const ConfigWrapper&) = delete;
|
||||
ConfigWrapper(ConfigWrapper&&) = delete;
|
||||
|
||||
~ConfigWrapper() {
|
||||
YGConfigFree(config);
|
||||
}
|
||||
|
||||
ConfigWrapper& operator=(const ConfigWrapper&) = delete;
|
||||
ConfigWrapper& operator=(ConfigWrapper&&) = delete;
|
||||
|
||||
YGConfigRef config{YGConfigNew()};
|
||||
};
|
||||
|
||||
ConfigWrapper configWrapper;
|
||||
YGConfigRef config{configWrapper.config};
|
||||
|
||||
void SetUp() override {
|
||||
onClone = [](...) {};
|
||||
}
|
||||
|
||||
// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
|
||||
static inline std::function<void(YGNodeConstRef, YGNodeConstRef, size_t)>
|
||||
onClone;
|
||||
};
|
||||
|
||||
TEST_F(
|
||||
YGPersistentNodeCloningTest,
|
||||
changing_sibling_height_does_not_clone_neighbors) {
|
||||
// <ScrollView>
|
||||
// <View id="Sibling" style={{ height: 1 }} />
|
||||
// <View id="A" style={{ height: 1 }}>
|
||||
// <View id="B">
|
||||
// <View id="C">
|
||||
// <View id="D"/>
|
||||
// </View>
|
||||
// </View>
|
||||
// </View>
|
||||
// </ScrollView>
|
||||
|
||||
auto sibling = std::make_shared<NodeWrapper>(config);
|
||||
YGNodeStyleSetHeight(sibling->node, 1);
|
||||
|
||||
auto d = std::make_shared<NodeWrapper>(config);
|
||||
auto c = std::make_shared<NodeWrapper>(config, std::vector{d});
|
||||
auto b = std::make_shared<NodeWrapper>(config, std::vector{c});
|
||||
auto a = std::make_shared<NodeWrapper>(config, std::vector{b});
|
||||
YGNodeStyleSetHeight(a->node, 1);
|
||||
|
||||
auto scrollContentView =
|
||||
std::make_shared<NodeWrapper>(config, std::vector{sibling, a});
|
||||
YGNodeStyleSetPositionType(scrollContentView->node, YGPositionTypeAbsolute);
|
||||
|
||||
auto scrollView =
|
||||
std::make_shared<NodeWrapper>(config, std::vector{scrollContentView});
|
||||
YGNodeStyleSetWidth(scrollView->node, 100);
|
||||
YGNodeStyleSetHeight(scrollView->node, 100);
|
||||
|
||||
// We don't expect any cloning during the first layout
|
||||
onClone = [](...) { FAIL(); };
|
||||
|
||||
YGNodeCalculateLayout(
|
||||
scrollView->node, YGUndefined, YGUndefined, YGDirectionLTR);
|
||||
|
||||
auto siblingPrime = std::make_shared<NodeWrapper>(config);
|
||||
YGNodeStyleSetHeight(siblingPrime->node, 2);
|
||||
|
||||
auto scrollContentViewPrime = std::make_shared<NodeWrapper>(
|
||||
*scrollContentView, std::vector{siblingPrime, a});
|
||||
auto scrollViewPrime = std::make_shared<NodeWrapper>(
|
||||
*scrollView, std::vector{scrollContentViewPrime});
|
||||
|
||||
std::vector<NodeWrapper*> nodesCloned;
|
||||
// We should only need to clone "A"
|
||||
onClone = [&](YGNodeConstRef oldNode,
|
||||
YGNodeConstRef /*owner*/,
|
||||
size_t /*childIndex*/) {
|
||||
nodesCloned.push_back(static_cast<NodeWrapper*>(YGNodeGetContext(oldNode)));
|
||||
};
|
||||
|
||||
YGNodeCalculateLayout(
|
||||
scrollViewPrime->node, YGUndefined, YGUndefined, YGDirectionLTR);
|
||||
|
||||
EXPECT_EQ(nodesCloned.size(), 1);
|
||||
EXPECT_EQ(nodesCloned[0], a.get());
|
||||
}
|
||||
|
||||
TEST_F(YGPersistentNodeCloningTest, clone_leaf_display_contents_node) {
|
||||
// <View id="A">
|
||||
// <View id="B" style={{ display: 'contents' }} />
|
||||
// </View>
|
||||
|
||||
auto b = std::make_shared<NodeWrapper>(config);
|
||||
auto a = std::make_shared<NodeWrapper>(config, std::vector{b});
|
||||
YGNodeStyleSetDisplay(b->node, YGDisplayContents);
|
||||
|
||||
// We don't expect any cloning during the first layout
|
||||
onClone = [](...) { FAIL(); };
|
||||
|
||||
YGNodeCalculateLayout(a->node, YGUndefined, YGUndefined, YGDirectionLTR);
|
||||
|
||||
auto aPrime = std::make_shared<NodeWrapper>(config, std::vector{b});
|
||||
|
||||
std::vector<NodeWrapper*> nodesCloned;
|
||||
// We should clone "C"
|
||||
onClone = [&](YGNodeConstRef oldNode,
|
||||
YGNodeConstRef /*owner*/,
|
||||
size_t /*childIndex*/) {
|
||||
nodesCloned.push_back(static_cast<NodeWrapper*>(YGNodeGetContext(oldNode)));
|
||||
};
|
||||
|
||||
YGNodeCalculateLayout(aPrime->node, 100, 100, YGDirectionLTR);
|
||||
|
||||
EXPECT_EQ(nodesCloned.size(), 1);
|
||||
EXPECT_EQ(nodesCloned[0], b.get());
|
||||
}
|
||||
|
||||
} // namespace facebook::yoga
|
@@ -161,3 +161,23 @@ TEST(YogaTest, per_node_point_scale_factor) {
|
||||
YGConfigFree(config2);
|
||||
YGConfigFree(config3);
|
||||
}
|
||||
|
||||
TEST(YogaTest, raw_layout_dimensions) {
|
||||
YGConfigRef config = YGConfigNew();
|
||||
YGConfigSetPointScaleFactor(config, 0.5f);
|
||||
|
||||
YGNodeRef root = YGNodeNewWithConfig(config);
|
||||
YGNodeStyleSetWidth(root, 11.5f);
|
||||
YGNodeStyleSetHeight(root, 9.5f);
|
||||
|
||||
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
|
||||
|
||||
ASSERT_EQ(YGNodeLayoutGetWidth(root), 12.0f);
|
||||
ASSERT_EQ(YGNodeLayoutGetHeight(root), 10.0f);
|
||||
ASSERT_EQ(YGNodeLayoutGetRawWidth(root), 11.5f);
|
||||
ASSERT_EQ(YGNodeLayoutGetRawHeight(root), 9.5f);
|
||||
|
||||
YGNodeFreeRecursive(root);
|
||||
|
||||
YGConfigFree(config);
|
||||
}
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* clang-format off
|
||||
* @generated SignedSource<<71295a398c89ea424490884a05e2c77c>>
|
||||
* @generated SignedSource<<1db57b05babb408c08efcec7dbdf16fb>>
|
||||
* generated by gentest/gentest-driver.ts from gentest/fixtures/YGAlignItemsTest.html
|
||||
*/
|
||||
|
||||
@@ -2310,3 +2310,84 @@ TEST(YogaTest, align_stretch_with_row_reverse) {
|
||||
|
||||
YGConfigFree(config);
|
||||
}
|
||||
|
||||
TEST(YogaTest, align_items_non_stretch_s526008) {
|
||||
YGConfigRef config = YGConfigNew();
|
||||
|
||||
YGNodeRef root = YGNodeNewWithConfig(config);
|
||||
YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute);
|
||||
YGNodeStyleSetWidth(root, 400);
|
||||
YGNodeStyleSetHeight(root, 400);
|
||||
|
||||
YGNodeRef root_child0 = YGNodeNewWithConfig(config);
|
||||
YGNodeStyleSetFlexDirection(root_child0, YGFlexDirectionRow);
|
||||
YGNodeInsertChild(root, root_child0, 0);
|
||||
|
||||
YGNodeRef root_child0_child0 = YGNodeNewWithConfig(config);
|
||||
YGNodeStyleSetAlignItems(root_child0_child0, YGAlignFlexStart);
|
||||
YGNodeInsertChild(root_child0, root_child0_child0, 0);
|
||||
|
||||
YGNodeRef root_child0_child0_child0 = YGNodeNewWithConfig(config);
|
||||
YGNodeInsertChild(root_child0_child0, root_child0_child0_child0, 0);
|
||||
|
||||
YGNodeRef root_child0_child0_child0_child0 = YGNodeNewWithConfig(config);
|
||||
YGNodeStyleSetHeight(root_child0_child0_child0_child0, 10);
|
||||
YGNodeInsertChild(root_child0_child0_child0, root_child0_child0_child0_child0, 0);
|
||||
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
|
||||
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
|
||||
ASSERT_FLOAT_EQ(400, YGNodeLayoutGetWidth(root));
|
||||
ASSERT_FLOAT_EQ(400, YGNodeLayoutGetHeight(root));
|
||||
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
|
||||
ASSERT_FLOAT_EQ(400, YGNodeLayoutGetWidth(root_child0));
|
||||
ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0));
|
||||
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0_child0));
|
||||
ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0_child0));
|
||||
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0_child0_child0));
|
||||
ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0_child0_child0));
|
||||
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0_child0_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0_child0_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0_child0_child0_child0));
|
||||
ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0_child0_child0_child0));
|
||||
|
||||
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
|
||||
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
|
||||
ASSERT_FLOAT_EQ(400, YGNodeLayoutGetWidth(root));
|
||||
ASSERT_FLOAT_EQ(400, YGNodeLayoutGetHeight(root));
|
||||
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
|
||||
ASSERT_FLOAT_EQ(400, YGNodeLayoutGetWidth(root_child0));
|
||||
ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0));
|
||||
|
||||
ASSERT_FLOAT_EQ(400, YGNodeLayoutGetLeft(root_child0_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0_child0));
|
||||
ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0_child0));
|
||||
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0_child0_child0));
|
||||
ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0_child0_child0));
|
||||
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0_child0_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0_child0_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0_child0_child0_child0));
|
||||
ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0_child0_child0_child0));
|
||||
|
||||
YGNodeFreeRecursive(root);
|
||||
|
||||
YGConfigFree(config);
|
||||
}
|
||||
|
@@ -17,15 +17,15 @@ has effect when items are wrapped to multiple lines using [flex wrap](/docs/styl
|
||||
|
||||
**Center**: Align wrapped lines in the center of the container's cross axis.
|
||||
|
||||
**Space between**: Evenly space wrapped lines across the container's main axis, distributing
|
||||
**Space between**: Evenly space wrapped lines across the container's cross axis, distributing
|
||||
remaining space between the lines.
|
||||
|
||||
**Space around**: Evenly space wrapped lines across the container's main axis, distributing
|
||||
**Space around**: Evenly space wrapped lines across the container's cross axis, distributing
|
||||
remaining space around the lines. Compared to space between using
|
||||
space around will result in space being distributed to the beginning of
|
||||
the first lines and end of the last line.
|
||||
|
||||
**Space evenly**: Evenly space wrapped lines across the container's main axis, distributing
|
||||
**Space evenly**: Evenly space wrapped lines across the container's cross axis, distributing
|
||||
remaining space around the lines. Compared to space around, space evenly will not
|
||||
double the gaps between children. The size of gaps between children and between
|
||||
the parent's edges and the first/last child will all be equal.
|
||||
|
@@ -90,3 +90,11 @@ float YGNodeLayoutGetPadding(YGNodeConstRef node, YGEdge edge) {
|
||||
return getResolvedLayoutProperty<&LayoutResults::padding>(
|
||||
node, scopedEnum(edge));
|
||||
}
|
||||
|
||||
float YGNodeLayoutGetRawHeight(YGNodeConstRef node) {
|
||||
return resolveRef(node)->getLayout().rawDimension(Dimension::Height);
|
||||
}
|
||||
|
||||
float YGNodeLayoutGetRawWidth(YGNodeConstRef node) {
|
||||
return resolveRef(node)->getLayout().rawDimension(Dimension::Width);
|
||||
}
|
||||
|
@@ -32,4 +32,14 @@ YG_EXPORT float YGNodeLayoutGetMargin(YGNodeConstRef node, YGEdge edge);
|
||||
YG_EXPORT float YGNodeLayoutGetBorder(YGNodeConstRef node, YGEdge edge);
|
||||
YG_EXPORT float YGNodeLayoutGetPadding(YGNodeConstRef node, YGEdge edge);
|
||||
|
||||
/**
|
||||
* Return the measured height of the node, before layout rounding
|
||||
*/
|
||||
YG_EXPORT float YGNodeLayoutGetRawHeight(YGNodeConstRef node);
|
||||
|
||||
/**
|
||||
* Return the measured width of the node, before layout rounding
|
||||
*/
|
||||
YG_EXPORT float YGNodeLayoutGetRawWidth(YGNodeConstRef node);
|
||||
|
||||
YG_EXTERN_C_END
|
||||
|
@@ -72,9 +72,9 @@ inline bool operator==(const YGValue& lhs, const YGValue& rhs) {
|
||||
case YGUnitPoint:
|
||||
case YGUnitPercent:
|
||||
return lhs.value == rhs.value;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
inline bool operator!=(const YGValue& lhs, const YGValue& rhs) {
|
||||
|
16
yoga/Yoga.h
16
yoga/Yoga.h
@@ -11,11 +11,11 @@
|
||||
* `#include <yoga/Yoga.h>` includes all of Yoga's public headers.
|
||||
*/
|
||||
|
||||
#include <yoga/YGConfig.h>
|
||||
#include <yoga/YGEnums.h>
|
||||
#include <yoga/YGMacros.h>
|
||||
#include <yoga/YGNode.h>
|
||||
#include <yoga/YGNodeLayout.h>
|
||||
#include <yoga/YGNodeStyle.h>
|
||||
#include <yoga/YGPixelGrid.h>
|
||||
#include <yoga/YGValue.h>
|
||||
#include <yoga/YGConfig.h> // IWYU pragma: export
|
||||
#include <yoga/YGEnums.h> // IWYU pragma: export
|
||||
#include <yoga/YGMacros.h> // IWYU pragma: export
|
||||
#include <yoga/YGNode.h> // IWYU pragma: export
|
||||
#include <yoga/YGNodeLayout.h> // IWYU pragma: export
|
||||
#include <yoga/YGNodeStyle.h> // IWYU pragma: export
|
||||
#include <yoga/YGPixelGrid.h> // IWYU pragma: export
|
||||
#include <yoga/YGValue.h> // IWYU pragma: export
|
||||
|
@@ -415,6 +415,12 @@ static void measureNodeWithoutChildren(
|
||||
Dimension::Height);
|
||||
}
|
||||
|
||||
inline bool isFixedSize(float dim, SizingMode sizingMode) {
|
||||
return sizingMode == SizingMode::StretchFit ||
|
||||
(yoga::isDefined(dim) && sizingMode == SizingMode::FitContent &&
|
||||
dim <= 0.0);
|
||||
}
|
||||
|
||||
static bool measureNodeWithFixedSize(
|
||||
yoga::Node* const node,
|
||||
const Direction direction,
|
||||
@@ -424,12 +430,8 @@ static bool measureNodeWithFixedSize(
|
||||
const SizingMode heightSizingMode,
|
||||
const float ownerWidth,
|
||||
const float ownerHeight) {
|
||||
if ((yoga::isDefined(availableWidth) &&
|
||||
widthSizingMode == SizingMode::FitContent && availableWidth <= 0.0f) ||
|
||||
(yoga::isDefined(availableHeight) &&
|
||||
heightSizingMode == SizingMode::FitContent && availableHeight <= 0.0f) ||
|
||||
(widthSizingMode == SizingMode::StretchFit &&
|
||||
heightSizingMode == SizingMode::StretchFit)) {
|
||||
if (isFixedSize(availableWidth, widthSizingMode) &&
|
||||
isFixedSize(availableHeight, heightSizingMode)) {
|
||||
node->setLayoutMeasuredDimension(
|
||||
boundAxis(
|
||||
node,
|
||||
@@ -476,16 +478,19 @@ static void zeroOutLayoutRecursively(yoga::Node* const node) {
|
||||
}
|
||||
|
||||
static void cleanupContentsNodesRecursively(yoga::Node* const node) {
|
||||
for (auto child : node->getChildren()) {
|
||||
if (child->style().display() == Display::Contents) {
|
||||
child->getLayout() = {};
|
||||
child->setLayoutDimension(0, Dimension::Width);
|
||||
child->setLayoutDimension(0, Dimension::Height);
|
||||
child->setHasNewLayout(true);
|
||||
child->setDirty(false);
|
||||
child->cloneChildrenIfNeeded();
|
||||
if (node->hasContentsChildren()) [[unlikely]] {
|
||||
node->cloneContentsChildrenIfNeeded();
|
||||
for (auto child : node->getChildren()) {
|
||||
if (child->style().display() == Display::Contents) {
|
||||
child->getLayout() = {};
|
||||
child->setLayoutDimension(0, Dimension::Width);
|
||||
child->setLayoutDimension(0, Dimension::Height);
|
||||
child->setHasNewLayout(true);
|
||||
child->setDirty(false);
|
||||
child->cloneChildrenIfNeeded();
|
||||
|
||||
cleanupContentsNodesRecursively(child);
|
||||
cleanupContentsNodesRecursively(child);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -106,25 +106,25 @@ void roundLayoutResultsToPixelGrid(
|
||||
const bool hasFractionalHeight =
|
||||
!yoga::inexactEquals(round(scaledNodeHeight), scaledNodeHeight);
|
||||
|
||||
node->setLayoutDimension(
|
||||
node->getLayout().setDimension(
|
||||
Dimension::Width,
|
||||
roundValueToPixelGrid(
|
||||
absoluteNodeRight,
|
||||
pointScaleFactor,
|
||||
(textRounding && hasFractionalWidth),
|
||||
(textRounding && !hasFractionalWidth)) -
|
||||
roundValueToPixelGrid(
|
||||
absoluteNodeLeft, pointScaleFactor, false, textRounding),
|
||||
Dimension::Width);
|
||||
absoluteNodeLeft, pointScaleFactor, false, textRounding));
|
||||
|
||||
node->setLayoutDimension(
|
||||
node->getLayout().setDimension(
|
||||
Dimension::Height,
|
||||
roundValueToPixelGrid(
|
||||
absoluteNodeBottom,
|
||||
pointScaleFactor,
|
||||
(textRounding && hasFractionalHeight),
|
||||
(textRounding && !hasFractionalHeight)) -
|
||||
roundValueToPixelGrid(
|
||||
absoluteNodeTop, pointScaleFactor, false, textRounding),
|
||||
Dimension::Height);
|
||||
absoluteNodeTop, pointScaleFactor, false, textRounding));
|
||||
}
|
||||
|
||||
for (yoga::Node* child : node->getChildren()) {
|
||||
|
@@ -19,6 +19,7 @@ namespace facebook::yoga {
|
||||
#if defined(__cpp_exceptions)
|
||||
throw std::logic_error(message);
|
||||
#else
|
||||
static_cast<void>(message); // Unused
|
||||
std::terminate();
|
||||
#endif
|
||||
}
|
||||
|
@@ -36,12 +36,12 @@ enum struct LayoutPassReason : int {
|
||||
};
|
||||
|
||||
struct LayoutData {
|
||||
int layouts;
|
||||
int measures;
|
||||
uint32_t maxMeasureCache;
|
||||
int cachedLayouts;
|
||||
int cachedMeasures;
|
||||
int measureCallbacks;
|
||||
int layouts = 0;
|
||||
int measures = 0;
|
||||
uint32_t maxMeasureCache = 0;
|
||||
int cachedLayouts = 0;
|
||||
int cachedMeasures = 0;
|
||||
int measureCallbacks = 0;
|
||||
std::array<int, static_cast<uint8_t>(LayoutPassReason::COUNT)>
|
||||
measureCallbackReasonsCount;
|
||||
};
|
||||
|
@@ -66,10 +66,18 @@ struct LayoutResults {
|
||||
return measuredDimensions_[yoga::to_underlying(axis)];
|
||||
}
|
||||
|
||||
float rawDimension(Dimension axis) const {
|
||||
return rawDimensions_[yoga::to_underlying(axis)];
|
||||
}
|
||||
|
||||
void setMeasuredDimension(Dimension axis, float dimension) {
|
||||
measuredDimensions_[yoga::to_underlying(axis)] = dimension;
|
||||
}
|
||||
|
||||
void setRawDimension(Dimension axis, float dimension) {
|
||||
rawDimensions_[yoga::to_underlying(axis)] = dimension;
|
||||
}
|
||||
|
||||
float position(PhysicalEdge physicalEdge) const {
|
||||
return position_[yoga::to_underlying(physicalEdge)];
|
||||
}
|
||||
@@ -113,6 +121,7 @@ struct LayoutResults {
|
||||
|
||||
std::array<float, 2> dimensions_ = {{YGUndefined, YGUndefined}};
|
||||
std::array<float, 2> measuredDimensions_ = {{YGUndefined, YGUndefined}};
|
||||
std::array<float, 2> rawDimensions_ = {{YGUndefined, YGUndefined}};
|
||||
std::array<float, 4> position_ = {};
|
||||
std::array<float, 4> margin_ = {};
|
||||
std::array<float, 4> border_ = {};
|
||||
|
@@ -181,6 +181,17 @@ void Node::setDirty(bool isDirty) {
|
||||
}
|
||||
}
|
||||
|
||||
void Node::setChildren(const std::vector<Node*>& children) {
|
||||
children_ = children;
|
||||
|
||||
contentsChildrenCount_ = 0;
|
||||
for (const auto& child : children) {
|
||||
if (child->style().display() == Display::Contents) {
|
||||
contentsChildrenCount_++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool Node::removeChild(Node* child) {
|
||||
auto p = std::find(children_.begin(), children_.end(), child);
|
||||
if (p != children_.end()) {
|
||||
@@ -247,6 +258,7 @@ void Node::setLayoutHadOverflow(bool hadOverflow) {
|
||||
|
||||
void Node::setLayoutDimension(float lengthValue, Dimension dimension) {
|
||||
layout_.setDimension(dimension, lengthValue);
|
||||
layout_.setRawDimension(dimension, lengthValue);
|
||||
}
|
||||
|
||||
// If both left and right are defined, then use left. Otherwise return +left or
|
||||
@@ -379,6 +391,23 @@ void Node::cloneChildrenIfNeeded() {
|
||||
if (child->getOwner() != this) {
|
||||
child = resolveRef(config_->cloneNode(child, this, i));
|
||||
child->setOwner(this);
|
||||
|
||||
if (child->hasContentsChildren()) [[unlikely]] {
|
||||
child->cloneContentsChildrenIfNeeded();
|
||||
}
|
||||
}
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
|
||||
void Node::cloneContentsChildrenIfNeeded() {
|
||||
size_t i = 0;
|
||||
for (Node*& child : children_) {
|
||||
if (child->style().display() == Display::Contents &&
|
||||
child->getOwner() != this) {
|
||||
child = resolveRef(config_->cloneNode(child, this, i));
|
||||
child->setOwner(this);
|
||||
child->cloneChildrenIfNeeded();
|
||||
}
|
||||
i += 1;
|
||||
}
|
||||
|
@@ -96,6 +96,10 @@ class YG_EXPORT Node : public ::YGNode {
|
||||
return config_->hasErrata(errata);
|
||||
}
|
||||
|
||||
bool hasContentsChildren() const {
|
||||
return contentsChildrenCount_ != 0;
|
||||
}
|
||||
|
||||
YGDirtiedFunc getDirtiedFunc() const {
|
||||
return dirtiedFunc_;
|
||||
}
|
||||
@@ -244,15 +248,12 @@ class YG_EXPORT Node : public ::YGNode {
|
||||
owner_ = owner;
|
||||
}
|
||||
|
||||
void setChildren(const std::vector<Node*>& children) {
|
||||
children_ = children;
|
||||
}
|
||||
|
||||
// TODO: rvalue override for setChildren
|
||||
|
||||
void setConfig(Config* config);
|
||||
|
||||
void setDirty(bool isDirty);
|
||||
void setChildren(const std::vector<Node*>& children);
|
||||
void setLayoutLastOwnerDirection(Direction direction);
|
||||
void setLayoutComputedFlexBasis(FloatOptional computedFlexBasis);
|
||||
void setLayoutComputedFlexBasisGeneration(
|
||||
@@ -286,6 +287,7 @@ class YG_EXPORT Node : public ::YGNode {
|
||||
void removeChild(size_t index);
|
||||
|
||||
void cloneChildrenIfNeeded();
|
||||
void cloneContentsChildrenIfNeeded();
|
||||
void markDirtyAndPropagate();
|
||||
float resolveFlexGrow() const;
|
||||
float resolveFlexShrink() const;
|
||||
|
Reference in New Issue
Block a user