Introducing `LayoutableShadowNode::isLayoutOnly` and (theoretical) view-flattening
Summary: @public Voalá, this small change actually implements view flattening. Obviously, it does not work right now because there are no `ShadowNode` classes which implement `isLayoutOnly`. Surprisingly, correct implementing of `isLayoutOnly` is quite tricky, we will work on this in coming diffs. Reviewed By: mdvacca Differential Revision: D9403565 fbshipit-source-id: 1f16f912cb5c6841405a1fc3cf36aec28698c11f
This commit is contained in:
parent
0792fba63f
commit
1068da2ec7
|
@ -31,6 +31,10 @@ bool LayoutableShadowNode::setLayoutMetrics(LayoutMetrics layoutMetrics) {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool LayoutableShadowNode::LayoutableShadowNode::isLayoutOnly() const {
|
||||
return false;
|
||||
}
|
||||
|
||||
void LayoutableShadowNode::cleanLayout() {
|
||||
isLayoutClean_ = true;
|
||||
}
|
||||
|
|
|
@ -52,6 +52,13 @@ public:
|
|||
*/
|
||||
virtual LayoutMetrics getLayoutMetrics() const;
|
||||
|
||||
/*
|
||||
* Returns `true` if the node represents only information necessary for
|
||||
* layout computation and can be safely removed from view hierarchy.
|
||||
* Default implementation returns `false`.
|
||||
*/
|
||||
virtual bool isLayoutOnly() const;
|
||||
|
||||
protected:
|
||||
|
||||
/*
|
||||
|
|
|
@ -11,13 +11,27 @@
|
|||
namespace facebook {
|
||||
namespace react {
|
||||
|
||||
static void sliceChildShadowNodeViewPairsRecursively(ShadowViewNodePairList &pairList, Point layoutOffset, const ShadowNode &shadowNode) {
|
||||
for (const auto &childShadowNode : shadowNode.getChildren()) {
|
||||
auto shadowView = ShadowView(*childShadowNode);
|
||||
|
||||
const auto layoutableShadowNode = dynamic_cast<const LayoutableShadowNode *>(childShadowNode.get());
|
||||
if (layoutableShadowNode && layoutableShadowNode->isLayoutOnly()) {
|
||||
sliceChildShadowNodeViewPairsRecursively(
|
||||
pairList,
|
||||
layoutOffset + shadowView.layoutMetrics.frame.origin,
|
||||
*childShadowNode
|
||||
);
|
||||
} else {
|
||||
shadowView.layoutMetrics.frame.origin += layoutOffset;
|
||||
pairList.push_back({shadowView, *childShadowNode});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static ShadowViewNodePairList sliceChildShadowNodeViewPairs(const ShadowNode &shadowNode) {
|
||||
ShadowViewNodePairList pairList;
|
||||
|
||||
for (const auto &childShadowNode : shadowNode.getChildren()) {
|
||||
pairList.push_back({ShadowView(*childShadowNode), *childShadowNode});
|
||||
}
|
||||
|
||||
sliceChildShadowNodeViewPairsRecursively(pairList, {0, 0}, shadowNode);
|
||||
return pairList;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue