mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
8684ef499f
Summary: This implements the `MeasurableYogaNode` trait in `YogaLayoutableShadowNode`. We had this trait from the very beginning but never used it. Now, if the trait is specified, `YogaLayoutableShadowNode` will set the measure function for the node and dirty it during cloning. Previously, we used (and still use) a dedicated method for setting up the measure function - `YogaLayoutableShadowNode::enableMeasurement()`. The problem with it is that to make it work we have to dirty the Yoga node every time we clone it. And the only proper way to do this in the `YogaLayoutableShadowNode` constructor because if we do it later ancestor nodes could not observe this and react to this. Therefore we have to have a trait for it. The plan is to use it for TextInput first to fix a crash (see the next diff). After we confirm it works fine, we will replace all the usages of `enableMeasurement` with the new trait. This diff also renames the other two yoga-related traits (to make them less verbose and look unified), adds more comments, and asserts. Changelog: [Internal] Fabric-specific internal change. Reviewed By: sammy-SC Differential Revision: D25937711 fbshipit-source-id: fafbd5d62537ac09e02ffbfd56adab6d629d791d
108 lines
3.1 KiB
C++
108 lines
3.1 KiB
C++
/*
|
|
* 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.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <cstdint>
|
|
|
|
namespace facebook {
|
|
namespace react {
|
|
|
|
/*
|
|
* A set of predefined traits associated with a particular `ShadowNode` class
|
|
* and an instance of that class. Used for efficient checking for interface
|
|
* conformance for and storing important flags.
|
|
*/
|
|
class ShadowNodeTraits {
|
|
public:
|
|
/*
|
|
* Underlying type for the traits.
|
|
* The first 16 bits are reserved for Core.
|
|
*/
|
|
enum Trait : int32_t {
|
|
None = 0,
|
|
|
|
// Note:
|
|
// Not all traits are used yet (but all will be used in the near future).
|
|
|
|
// Inherits `LayoutableShadowNode`.
|
|
LayoutableKind = 1 << 0,
|
|
|
|
// Inherits `YogaLayoutableShadowNode`.
|
|
YogaLayoutableKind = 1 << 1,
|
|
|
|
// Inherits `ConcreteViewShadowNode<>` template.
|
|
ViewKind = 1 << 2,
|
|
|
|
// Inherits `BaseTextShadowNode`.
|
|
TextKind = 1 << 3,
|
|
|
|
// Used when calculating relative layout in
|
|
// LayoutableShadowNode::getRelativeLayoutMetrics. This trait marks node as
|
|
// root, so when calculating relative layout, the calculation will not
|
|
// traverse beyond this node. See T61257516 for details.
|
|
RootNodeKind = 1 << 4,
|
|
|
|
// `ViewShadowNode` (exact!) class.
|
|
View = 1 << 5,
|
|
|
|
// The node is hidden.
|
|
// Nodes with this trait (and all their descendants) will not produce views.
|
|
Hidden = 1 << 6,
|
|
|
|
// Indicates that the `YogaLayoutableShadowNode` must set `isDirty` flag for
|
|
// Yoga node when a `ShadowNode` is being cloned. `ShadowNode`s that modify
|
|
// Yoga styles in the constructor (or later) *after* the `ShadowNode`
|
|
// is cloned must set this trait.
|
|
// Any Yoga node (not only Leaf ones) can have this trait.
|
|
DirtyYogaNode = 1 << 9,
|
|
|
|
// Inherits `YogaLayoutableShadowNode` and enforces that the `YGNode` is a
|
|
// leaf.
|
|
LeafYogaNode = 1 << 10,
|
|
|
|
// Inherits `YogaLayoutableShadowNode` and has a custom measure function.
|
|
// Only Leaf nodes can have this trait.
|
|
MeasurableYogaNode = 1 << 11,
|
|
|
|
// Indicates that the `ShadowNode` must form a stacking context.
|
|
// A Stacking Context forms a level of a `ShadowView` hierarchy (in contrast
|
|
// with a level of a `ShadowNode` hierarchy).
|
|
// See W3C standard for more details: https://www.w3.org/TR/CSS2/zindex.html
|
|
FormsStackingContext = 1 << 13,
|
|
|
|
// Indicates that the node must form a `ShadowView`.
|
|
FormsView = 1 << 14,
|
|
|
|
// Internal to `ShadowNode`; do not use it outside.
|
|
// Indicates that `children` list is shared between nodes and need
|
|
// to be cloned before the first mutation.
|
|
ChildrenAreShared = 1 << 15,
|
|
};
|
|
|
|
/*
|
|
* Sets, unsets, and checks individual traits.
|
|
*/
|
|
inline void set(Trait trait) {
|
|
traits_ = ShadowNodeTraits::Trait(traits_ | trait);
|
|
}
|
|
|
|
inline void unset(Trait trait) {
|
|
traits_ = ShadowNodeTraits::Trait(traits_ & ~trait);
|
|
}
|
|
|
|
inline bool check(Trait traits) const {
|
|
return ShadowNodeTraits::Trait(traits_ & traits) == traits;
|
|
}
|
|
|
|
private:
|
|
Trait traits_{Trait::None};
|
|
};
|
|
|
|
} // namespace react
|
|
} // namespace facebook
|