/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include "LayoutableShadowNode.h" #include #include #include #include #include namespace facebook { namespace react { LayoutMetrics LayoutableShadowNode::getLayoutMetrics() const { return layoutMetrics_; } bool LayoutableShadowNode::setLayoutMetrics(LayoutMetrics layoutMetrics) { if (layoutMetrics_ == layoutMetrics) { return false; } ensureUnsealed(); layoutMetrics_ = layoutMetrics; return true; } bool LayoutableShadowNode::LayoutableShadowNode::isLayoutOnly() const { return false; } void LayoutableShadowNode::cleanLayout() { isLayoutClean_ = true; } void LayoutableShadowNode::dirtyLayout() { isLayoutClean_ = false; } bool LayoutableShadowNode::getIsLayoutClean() const { return isLayoutClean_; } bool LayoutableShadowNode::getHasNewLayout() const { return hasNewLayout_; }; void LayoutableShadowNode::setHasNewLayout(bool hasNewLayout) { hasNewLayout_ = hasNewLayout; } Size LayoutableShadowNode::measure(LayoutConstraints layoutConstraints) const { return Size(); } Float LayoutableShadowNode::firstBaseline(Size size) const { return 0; } Float LayoutableShadowNode::lastBaseline(Size size) const { return 0; } void LayoutableShadowNode::layout(LayoutContext layoutContext) { layoutChildren(layoutContext); for (auto child : getLayoutableChildNodes()) { if (!child->getHasNewLayout()) { continue; } child->ensureUnsealed(); child->setHasNewLayout(false); const auto childLayoutMetrics = child->getLayoutMetrics(); if (childLayoutMetrics.displayType == DisplayType::None) { continue; } auto childLayoutContext = LayoutContext(layoutContext); childLayoutContext.absolutePosition += childLayoutMetrics.frame.origin; child->layout(layoutContext); } } void LayoutableShadowNode::layoutChildren(LayoutContext layoutContext) { // Default implementation does nothing. } SharedDebugStringConvertibleList LayoutableShadowNode::getDebugProps() const { auto list = SharedDebugStringConvertibleList {}; if (getHasNewLayout()) { list.push_back(std::make_shared("hasNewLayout")); } if (!getIsLayoutClean()) { list.push_back(std::make_shared("dirty")); } auto layoutMetrics = getLayoutMetrics(); auto defaultLayoutMetrics = LayoutMetrics(); list.push_back(std::make_shared("frame", toString(layoutMetrics.frame))); if (layoutMetrics.borderWidth != defaultLayoutMetrics.borderWidth) { list.push_back(std::make_shared("borderWidth", toString(layoutMetrics.borderWidth))); } if (layoutMetrics.contentInsets != defaultLayoutMetrics.contentInsets) { list.push_back(std::make_shared("contentInsets", toString(layoutMetrics.contentInsets))); } if (layoutMetrics.displayType == DisplayType::None) { list.push_back(std::make_shared("hidden")); } if (layoutMetrics.layoutDirection == LayoutDirection::RightToLeft) { list.push_back(std::make_shared("rtl")); } return list; } } // namespace react } // namespace facebook