mirror of
https://github.com/status-im/react-native.git
synced 2025-01-19 14:02:10 +00:00
57d69772b7
Summary: Apparently, `calculateMutationInstructions` must also produce mutation instructions for root node as well. To make it possible we have to change the signature of the function and weak some restrictions in TreeMutationInstruction. Reviewed By: fkgozali Differential Revision: D7958248 fbshipit-source-id: 4109a6bce3a77f7eb89157201fd0e80f98487dbd
105 lines
2.8 KiB
C++
105 lines
2.8 KiB
C++
// Copyright 2004-present Facebook. All Rights Reserved.
|
|
|
|
#include "ShadowTree.h"
|
|
|
|
#include <fabric/core/LayoutContext.h>
|
|
#include <fabric/core/LayoutPrimitives.h>
|
|
|
|
#include "ShadowTreeDelegate.h"
|
|
#include "Differentiator.h"
|
|
#include "TreeMutationInstruction.h"
|
|
|
|
namespace facebook {
|
|
namespace react {
|
|
|
|
ShadowTree::ShadowTree(Tag rootTag):
|
|
rootTag_(rootTag) {
|
|
|
|
rootShadowNode_ = std::make_shared<RootShadowNode>(
|
|
rootTag,
|
|
rootTag,
|
|
nullptr,
|
|
RootShadowNode::defaultSharedProps()
|
|
);
|
|
}
|
|
|
|
Tag ShadowTree::getRootTag() const {
|
|
return rootTag_;
|
|
}
|
|
|
|
#pragma mark - Layout
|
|
|
|
Size ShadowTree::measure(const LayoutConstraints &layoutConstraints, const LayoutContext &layoutContext) const {
|
|
auto newRootShadowNode = cloneRootShadowNode(layoutConstraints, layoutContext);
|
|
newRootShadowNode->layout();
|
|
return newRootShadowNode->getLayoutMetrics().frame.size;
|
|
}
|
|
|
|
void ShadowTree::constraintLayout(const LayoutConstraints &layoutConstraints, const LayoutContext &layoutContext) {
|
|
auto newRootShadowNode = cloneRootShadowNode(layoutConstraints, layoutContext);
|
|
complete(newRootShadowNode);
|
|
}
|
|
|
|
#pragma mark - Commiting
|
|
|
|
UnsharedRootShadowNode ShadowTree::cloneRootShadowNode(const LayoutConstraints &layoutConstraints, const LayoutContext &layoutContext) const {
|
|
auto oldRootShadowNode = rootShadowNode_;
|
|
auto &&props = std::make_shared<const RootProps>(*oldRootShadowNode->getProps(), layoutConstraints, layoutContext);
|
|
auto newRootShadowNode = std::make_shared<RootShadowNode>(oldRootShadowNode, props, nullptr);
|
|
return newRootShadowNode;
|
|
}
|
|
|
|
void ShadowTree::complete(const SharedShadowNodeUnsharedList &rootChildNodes) {
|
|
auto oldRootShadowNode = rootShadowNode_;
|
|
auto newRootShadowNode =
|
|
std::make_shared<RootShadowNode>(oldRootShadowNode, nullptr, SharedShadowNodeSharedList(rootChildNodes));
|
|
|
|
complete(newRootShadowNode);
|
|
}
|
|
|
|
void ShadowTree::complete(UnsharedRootShadowNode newRootShadowNode) {
|
|
SharedRootShadowNode oldRootShadowNode = rootShadowNode_;
|
|
|
|
newRootShadowNode->layout();
|
|
|
|
newRootShadowNode->sealRecursive();
|
|
|
|
TreeMutationInstructionList instructions = TreeMutationInstructionList();
|
|
|
|
calculateMutationInstructions(
|
|
instructions,
|
|
oldRootShadowNode,
|
|
newRootShadowNode
|
|
);
|
|
|
|
if (commit(newRootShadowNode)) {
|
|
if (delegate_) {
|
|
delegate_->shadowTreeDidCommit(shared_from_this(), instructions);
|
|
}
|
|
}
|
|
}
|
|
|
|
bool ShadowTree::commit(const SharedRootShadowNode &newRootShadowNode) {
|
|
std::lock_guard<std::mutex> lock(commitMutex_);
|
|
|
|
if (newRootShadowNode->getSourceNode() != rootShadowNode_) {
|
|
return false;
|
|
}
|
|
|
|
rootShadowNode_ = newRootShadowNode;
|
|
return true;
|
|
}
|
|
|
|
#pragma mark - Delegate
|
|
|
|
void ShadowTree::setDelegate(ShadowTreeDelegate *delegate) {
|
|
delegate_ = delegate;
|
|
}
|
|
|
|
ShadowTreeDelegate *ShadowTree::getDelegate() const {
|
|
return delegate_;
|
|
}
|
|
|
|
} // namespace react
|
|
} // namespace facebook
|