/** * Copyright (c) 2015-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include #include #include namespace facebook { namespace react { class YogaLayoutableShadowNode; // We accept that Yoga node is highly mutable thing and we don't try to enforce immutability, // so it does not have `const` qualifier (and we mark it as `mutable` in the class). using SharedYogaNode = std::shared_ptr; using SharedYogaConfig = std::shared_ptr; using SharedYogaLayoutableShadowNode = std::shared_ptr; using SharedYogaLayoutableShadowNodeList = std::vector; using SharedYogaLayoutableShadowNodeSharedList = std::shared_ptr; class YogaLayoutableShadowNode: public LayoutableShadowNode, public virtual DebugStringConvertible, public virtual Sealable { public: #pragma mark - Constructors YogaLayoutableShadowNode( const SharedYogaStylableProps &props, const SharedShadowNodeSharedList &children ); YogaLayoutableShadowNode( const SharedYogaLayoutableShadowNode &shadowNode, const SharedYogaStylableProps &props = nullptr, const SharedShadowNodeSharedList &children = nullptr ); #pragma mark - Mutating Methods /* * Connects `measureFunc` function of Yoga node with * `LayoutableShadowNode::measure()` method. */ void enableMeasurement(); /* * Appends `child`'s Yoga node to the own Yoga node. * So, it complements `ShadowNode::appendChild(...)` functionality from Yoga * perspective. */ void appendChild(SharedYogaLayoutableShadowNode child); void cleanLayout() override; void dirtyLayout() override; bool getIsLayoutClean() const override; void setHasNewLayout(bool hasNewLayout) override; bool getHasNewLayout() const override; /* * Computes layout using Yoga layout engine. * See `LayoutableShadowNode` for more details. */ void layout(LayoutContext layoutContext) override; void layoutChildren(LayoutContext layoutContext) override; private: mutable SharedYogaNode yogaNode_; static SharedYogaConfig suitableYogaConfig(); static void setYogaNodeChildrenBasedOnShadowNodeChildren(YGNode &yogaNode, const SharedShadowNodeSharedList &children); static YGNode *yogaNodeCloneCallbackConnector(YGNode *oldYogaNode, YGNode *parentYogaNode, int childIndex); static YGSize yogaNodeMeasureCallbackConnector(YGNode *yogaNode, float width, YGMeasureMode widthMode, float height, YGMeasureMode heightMode); }; } // namespace react } // namespace facebook