123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- /*
- * 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 <react/components/view/ViewEventEmitter.h>
- #include <react/components/view/ViewProps.h>
- #include <react/components/view/YogaLayoutableShadowNode.h>
- #include <react/core/ConcreteShadowNode.h>
- #include <react/core/LayoutableShadowNode.h>
- #include <react/core/ShadowNode.h>
- #include <react/core/ShadowNodeFragment.h>
- #include <react/debug/DebugStringConvertibleItem.h>
- namespace facebook {
- namespace react {
- /*
- * Template for all <View>-like classes (classes which have all same props
- * as <View> and similar basic behaviour).
- * For example: <Paragraph>, <Image>, but not <Text>, <RawText>.
- */
- template <
- const char *concreteComponentName,
- typename ViewPropsT = ViewProps,
- typename ViewEventEmitterT = ViewEventEmitter,
- typename... Ts>
- class ConcreteViewShadowNode : public ConcreteShadowNode<
- concreteComponentName,
- YogaLayoutableShadowNode,
- ViewPropsT,
- ViewEventEmitterT,
- Ts...> {
- static_assert(
- std::is_base_of<ViewProps, ViewPropsT>::value,
- "ViewPropsT must be a descendant of ViewProps");
- static_assert(
- std::is_base_of<YogaStylableProps, ViewPropsT>::value,
- "ViewPropsT must be a descendant of YogaStylableProps");
- static_assert(
- std::is_base_of<AccessibilityProps, ViewPropsT>::value,
- "ViewPropsT must be a descendant of AccessibilityProps");
- public:
- using BaseShadowNode = ConcreteShadowNode<
- concreteComponentName,
- YogaLayoutableShadowNode,
- ViewPropsT,
- ViewEventEmitterT,
- Ts...>;
- ConcreteViewShadowNode(
- ShadowNodeFragment const &fragment,
- ShadowNodeFamily::Shared const &family,
- ShadowNodeTraits traits)
- : BaseShadowNode(fragment, family, traits) {
- initialize();
- }
- ConcreteViewShadowNode(
- ShadowNode const &sourceShadowNode,
- ShadowNodeFragment const &fragment)
- : BaseShadowNode(sourceShadowNode, fragment) {
- initialize();
- }
- using ConcreteViewProps = ViewPropsT;
- using BaseShadowNode::BaseShadowNode;
- static ShadowNodeTraits BaseTraits() {
- auto traits = BaseShadowNode::BaseTraits();
- traits.set(ShadowNodeTraits::Trait::ViewKind);
- traits.set(ShadowNodeTraits::Trait::FormsStackingContext);
- traits.set(ShadowNodeTraits::Trait::FormsView);
- return traits;
- }
- Transform getTransform() const override {
- return BaseShadowNode::getConcreteProps().transform;
- }
- #pragma mark - DebugStringConvertible
- #if RN_DEBUG_STRING_CONVERTIBLE
- SharedDebugStringConvertibleList getDebugProps() const override {
- auto list = SharedDebugStringConvertibleList{};
- auto basePropsList = ShadowNode::getDebugProps();
- std::move(
- basePropsList.begin(), basePropsList.end(), std::back_inserter(list));
- list.push_back(std::make_shared<DebugStringConvertibleItem>(
- "layout", "", LayoutableShadowNode::getDebugProps()));
- return list;
- }
- #endif
- private:
- void initialize() noexcept {
- BaseShadowNode::orderIndex_ = BaseShadowNode::getConcreteProps().zIndex;
- }
- };
- } // namespace react
- } // namespace facebook
|