mirror of
https://github.com/zoriya/react-native-svg.git
synced 2025-12-06 07:06:11 +00:00
# Summary Implement custom shadow nodes for nearly all `Svg` components. While it's a foundation for numerous upcoming changes, it currently addresses and resolves #2544. ## Test Plan There shouldn't be any noticeable changes, and everything should function as before, except that `onLayout` will now be triggered only once and with the correct dimensions. ## Compatibility | OS | Implemented | | ------- | :---------: | | iOS | ✅ | | MacOS | ✅ | | Android | ✅ | --------- Co-authored-by: Jakub Piasecki <jakubpiasecki67@gmail.com>
60 lines
1.9 KiB
C++
60 lines
1.9 KiB
C++
#pragma once
|
|
|
|
#include <react/renderer/components/view/ViewEventEmitter.h>
|
|
#include <react/renderer/components/view/ViewProps.h>
|
|
#include <react/renderer/core/ConcreteShadowNode.h>
|
|
#include "RNSVGLayoutableShadowNode.h"
|
|
|
|
namespace facebook::react {
|
|
|
|
template <const char *concreteComponentName, typename PropsT = ViewProps>
|
|
class RNSVGConcreteShadowNode : public ConcreteShadowNode<
|
|
concreteComponentName,
|
|
RNSVGLayoutableShadowNode,
|
|
PropsT,
|
|
ViewEventEmitter,
|
|
StateData,
|
|
false> {
|
|
public:
|
|
using BaseShadowNode = ConcreteShadowNode<
|
|
concreteComponentName,
|
|
RNSVGLayoutableShadowNode,
|
|
PropsT,
|
|
ViewEventEmitter,
|
|
StateData,
|
|
false>;
|
|
|
|
using ConcreteViewProps = PropsT;
|
|
|
|
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 {
|
|
auto layoutMetrics = BaseShadowNode::getLayoutMetrics();
|
|
return BaseShadowNode::getConcreteProps().resolveTransform(layoutMetrics);
|
|
}
|
|
|
|
bool canBeTouchTarget() const override {
|
|
auto pointerEvents =
|
|
BaseShadowNode::getConcreteProps().ViewProps::pointerEvents;
|
|
return pointerEvents == PointerEventsMode::Auto ||
|
|
pointerEvents == PointerEventsMode::BoxOnly;
|
|
}
|
|
|
|
bool canChildrenBeTouchTarget() const override {
|
|
auto pointerEvents =
|
|
BaseShadowNode::getConcreteProps().ViewProps::pointerEvents;
|
|
return pointerEvents == PointerEventsMode::Auto ||
|
|
pointerEvents == PointerEventsMode::BoxNone;
|
|
}
|
|
};
|
|
|
|
} // namespace facebook::react
|