mirror of
https://github.com/status-im/react-native.git
synced 2025-03-01 01:20:31 +00:00
Summary: I recently realized (Thanks David!) that we should not use `shared_ptr` for storing YGNode* because ShadowNode does not share ownership of the Yoga node with anybody. So the lifecycle of shadow node and yoga node must be synchronized (this is already the case but changing to unique_ptr makes this explicit and a bit more performant). Reviewed By: fkgozali Differential Revision: D8030417 fbshipit-source-id: c7f85ea309598d2a5ebfed55b1d182d3fe1336ae
94 lines
2.7 KiB
C++
94 lines
2.7 KiB
C++
/**
|
|
* 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 <memory>
|
|
#include <vector>
|
|
|
|
#include <yoga/YGNode.h>
|
|
|
|
#include <fabric/core/LayoutableShadowNode.h>
|
|
#include <fabric/core/Sealable.h>
|
|
#include <fabric/core/ShadowNode.h>
|
|
#include <fabric/debug/DebugStringConvertible.h>
|
|
#include <fabric/view/YogaStylableProps.h>
|
|
|
|
namespace facebook {
|
|
namespace react {
|
|
|
|
class YogaLayoutableShadowNode;
|
|
|
|
using SharedYogaConfig = std::shared_ptr<YGConfig>;
|
|
|
|
using SharedYogaLayoutableShadowNode = std::shared_ptr<const YogaLayoutableShadowNode>;
|
|
using SharedYogaLayoutableShadowNodeList = std::vector<const SharedYogaLayoutableShadowNode>;
|
|
using SharedYogaLayoutableShadowNodeSharedList = std::shared_ptr<const SharedYogaLayoutableShadowNodeList>;
|
|
|
|
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;
|
|
|
|
protected:
|
|
std::unique_ptr<YGNode> yogaNode_;
|
|
|
|
private:
|
|
static SharedYogaConfig suitableYogaConfig();
|
|
static void setYogaNodeChildrenBasedOnShadowNodeChildren(YGNode *yogaNodeRawPtr, 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
|