Fabric: Proper way to specity layout constraints for root Yoga node

Summary:
This diff changes how we apply layout constraints to a root node before layout. We previously used two arguments of `YGNodeCalculateLayout` but that's not expressive enough in cases we have min & max sizes.

Changelog: [Internal] Fabric-specific internal change.

Reviewed By: JoshuaGross, sammy-SC

Differential Revision: D20268051

fbshipit-source-id: 85aaae65326432993296c3cbc9f7fb8919b07386
This commit is contained in:
Valentin Shergin 2020-03-09 16:32:33 -07:00 коммит произвёл Facebook Github Bot
Родитель 0d33cdf146
Коммит 02f2c81240
1 изменённых файлов: 21 добавлений и 6 удалений

Просмотреть файл

@ -21,6 +21,23 @@
namespace facebook { namespace facebook {
namespace react { namespace react {
static void applyLayoutConstraints(
YGStyle &yogaStyle,
LayoutConstraints const &layoutConstraints) {
yogaStyle.minDimensions()[YGDimensionWidth] =
yogaStyleValueFromFloat(layoutConstraints.minimumSize.width);
yogaStyle.minDimensions()[YGDimensionHeight] =
yogaStyleValueFromFloat(layoutConstraints.minimumSize.height);
yogaStyle.maxDimensions()[YGDimensionWidth] =
yogaStyleValueFromFloat(layoutConstraints.maximumSize.width);
yogaStyle.maxDimensions()[YGDimensionHeight] =
yogaStyleValueFromFloat(layoutConstraints.maximumSize.height);
yogaStyle.direction() =
yogaDirectionFromLayoutDirection(layoutConstraints.layoutDirection);
}
ShadowNodeTraits YogaLayoutableShadowNode::BaseTraits() { ShadowNodeTraits YogaLayoutableShadowNode::BaseTraits() {
auto traits = LayoutableShadowNode::BaseTraits(); auto traits = LayoutableShadowNode::BaseTraits();
traits.set(ShadowNodeTraits::Trait::YogaLayoutableKind); traits.set(ShadowNodeTraits::Trait::YogaLayoutableKind);
@ -239,25 +256,23 @@ void YogaLayoutableShadowNode::layoutTree(
*/ */
yogaConfig_.pointScaleFactor = layoutContext.pointScaleFactor; yogaConfig_.pointScaleFactor = layoutContext.pointScaleFactor;
auto maximumSize = layoutConstraints.maximumSize; applyLayoutConstraints(yogaNode_.getStyle(), layoutConstraints);
auto availableWidth = yogaFloatFromFloat(maximumSize.width);
auto availableHeight = yogaFloatFromFloat(maximumSize.height);
{ {
SystraceSection s("YogaLayoutableShadowNode::YGNodeCalculateLayout"); SystraceSection s("YogaLayoutableShadowNode::YGNodeCalculateLayout");
YGNodeCalculateLayout( YGNodeCalculateLayout(
&yogaNode_, availableWidth, availableHeight, YGDirectionInherit); &yogaNode_, YGUndefined, YGUndefined, YGDirectionInherit);
} }
layout(layoutContext);
if (getHasNewLayout()) { if (getHasNewLayout()) {
auto layoutMetrics = layoutMetricsFromYogaNode(yogaNode_); auto layoutMetrics = layoutMetricsFromYogaNode(yogaNode_);
layoutMetrics.pointScaleFactor = layoutContext.pointScaleFactor; layoutMetrics.pointScaleFactor = layoutContext.pointScaleFactor;
setLayoutMetrics(layoutMetrics); setLayoutMetrics(layoutMetrics);
setHasNewLayout(false); setHasNewLayout(false);
} }
layout(layoutContext);
} }
void YogaLayoutableShadowNode::layoutChildren(LayoutContext layoutContext) { void YogaLayoutableShadowNode::layoutChildren(LayoutContext layoutContext) {