@onekeyfe/react-native-segment-slider 3.0.96 → 3.0.98
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/nitrogen/generated/android/c++/views/JHybridSegmentSliderStateUpdater.cpp +137 -99
- package/lib/nitrogen/generated/android/c++/views/JHybridSegmentSliderStateUpdater.hpp +6 -1
- package/lib/nitrogen/generated/android/kotlin/com/margelo/nitro/segmentslider/views/HybridSegmentSliderManager.kt +26 -10
- package/lib/nitrogen/generated/android/kotlin/com/margelo/nitro/segmentslider/views/HybridSegmentSliderStateUpdater.kt +2 -2
- package/lib/nitrogen/generated/ios/c++/views/HybridSegmentSliderComponent.mm +163 -121
- package/lib/nitrogen/generated/shared/c++/views/HybridSegmentSliderComponent.cpp +26 -255
- package/lib/nitrogen/generated/shared/c++/views/HybridSegmentSliderComponent.hpp +83 -69
- package/nitrogen/generated/android/c++/views/JHybridSegmentSliderStateUpdater.cpp +137 -99
- package/nitrogen/generated/android/c++/views/JHybridSegmentSliderStateUpdater.hpp +6 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/segmentslider/views/HybridSegmentSliderManager.kt +26 -10
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/segmentslider/views/HybridSegmentSliderStateUpdater.kt +2 -2
- package/nitrogen/generated/ios/c++/views/HybridSegmentSliderComponent.mm +163 -121
- package/nitrogen/generated/shared/c++/views/HybridSegmentSliderComponent.cpp +26 -255
- package/nitrogen/generated/shared/c++/views/HybridSegmentSliderComponent.hpp +83 -69
- package/package.json +4 -4
|
@@ -7,14 +7,15 @@
|
|
|
7
7
|
|
|
8
8
|
#pragma once
|
|
9
9
|
|
|
10
|
-
#include <
|
|
11
|
-
#include <NitroModules/
|
|
12
|
-
#include <NitroModules/
|
|
13
|
-
#include <NitroModules/CachedProp.hpp>
|
|
14
|
-
#include <react/renderer/core/ConcreteComponentDescriptor.h>
|
|
15
|
-
#include <react/renderer/core/PropsParserContext.h>
|
|
10
|
+
#include <NitroModules/ReactProp.hpp>
|
|
11
|
+
#include <NitroModules/ViewComponentDescriptor.hpp>
|
|
12
|
+
#include <NitroModules/ViewPropsHolderState.hpp>
|
|
16
13
|
#include <react/renderer/components/view/ConcreteViewShadowNode.h>
|
|
17
14
|
#include <react/renderer/components/view/ViewProps.h>
|
|
15
|
+
#include <react/renderer/core/PropsParserContext.h>
|
|
16
|
+
#include <react/renderer/core/RawProps.h>
|
|
17
|
+
|
|
18
|
+
#include <string>
|
|
18
19
|
|
|
19
20
|
#include <string>
|
|
20
21
|
#include <functional>
|
|
@@ -42,28 +43,80 @@ namespace margelo::nitro::segmentslider::views {
|
|
|
42
43
|
const react::RawProps& rawProps);
|
|
43
44
|
|
|
44
45
|
public:
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
46
|
+
nitro::ReactProp<double> defaultValue;
|
|
47
|
+
nitro::ReactProp<double> min;
|
|
48
|
+
nitro::ReactProp<double> max;
|
|
49
|
+
nitro::ReactProp<double> segments;
|
|
50
|
+
nitro::ReactProp<double> sliderHeight;
|
|
51
|
+
nitro::ReactProp<bool> disabled;
|
|
52
|
+
nitro::ReactProp<bool> showBubble;
|
|
53
|
+
nitro::ReactProp<bool> centerOrigin;
|
|
54
|
+
nitro::ReactProp<bool> snapTapToSegment;
|
|
55
|
+
nitro::ReactProp<std::string> fillColor;
|
|
56
|
+
nitro::ReactProp<std::string> trackColor;
|
|
57
|
+
nitro::ReactProp<std::string> thumbColor;
|
|
58
|
+
nitro::ReactProp<std::string> thumbBorderColor;
|
|
59
|
+
nitro::ReactProp<std::string> markActiveColor;
|
|
60
|
+
nitro::ReactProp<std::string> markInactiveColor;
|
|
61
|
+
nitro::ReactProp<std::string> markBorderColor;
|
|
62
|
+
nitro::ReactProp<std::string> bubbleColor;
|
|
63
|
+
nitro::ReactProp<std::string> bubbleTextColor;
|
|
64
|
+
nitro::ReactProp<std::optional<std::function<void(double /* value */)>>> onChange;
|
|
65
|
+
nitro::ReactProp<std::optional<std::function<void()>>> onSlideStart;
|
|
66
|
+
nitro::ReactProp<std::optional<std::function<void()>>> onSlideComplete;
|
|
67
|
+
nitro::ReactProp<std::optional<std::function<void(const std::shared_ptr<HybridSegmentSliderSpec>& /* ref */)>>> hybridRef;
|
|
68
|
+
|
|
69
|
+
[[nodiscard]]
|
|
70
|
+
bool hasSameProps(const HybridSegmentSliderProps& other) const noexcept {
|
|
71
|
+
return defaultValue.hasSameValue(other.defaultValue) &&
|
|
72
|
+
min.hasSameValue(other.min) &&
|
|
73
|
+
max.hasSameValue(other.max) &&
|
|
74
|
+
segments.hasSameValue(other.segments) &&
|
|
75
|
+
sliderHeight.hasSameValue(other.sliderHeight) &&
|
|
76
|
+
disabled.hasSameValue(other.disabled) &&
|
|
77
|
+
showBubble.hasSameValue(other.showBubble) &&
|
|
78
|
+
centerOrigin.hasSameValue(other.centerOrigin) &&
|
|
79
|
+
snapTapToSegment.hasSameValue(other.snapTapToSegment) &&
|
|
80
|
+
fillColor.hasSameValue(other.fillColor) &&
|
|
81
|
+
trackColor.hasSameValue(other.trackColor) &&
|
|
82
|
+
thumbColor.hasSameValue(other.thumbColor) &&
|
|
83
|
+
thumbBorderColor.hasSameValue(other.thumbBorderColor) &&
|
|
84
|
+
markActiveColor.hasSameValue(other.markActiveColor) &&
|
|
85
|
+
markInactiveColor.hasSameValue(other.markInactiveColor) &&
|
|
86
|
+
markBorderColor.hasSameValue(other.markBorderColor) &&
|
|
87
|
+
bubbleColor.hasSameValue(other.bubbleColor) &&
|
|
88
|
+
bubbleTextColor.hasSameValue(other.bubbleTextColor) &&
|
|
89
|
+
onChange.hasSameValue(other.onChange) &&
|
|
90
|
+
onSlideStart.hasSameValue(other.onSlideStart) &&
|
|
91
|
+
onSlideComplete.hasSameValue(other.onSlideComplete) &&
|
|
92
|
+
hybridRef.hasSameValue(other.hybridRef);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
[[nodiscard]]
|
|
96
|
+
bool hasAnyProvidedProps() const noexcept {
|
|
97
|
+
return defaultValue.isProvided() ||
|
|
98
|
+
min.isProvided() ||
|
|
99
|
+
max.isProvided() ||
|
|
100
|
+
segments.isProvided() ||
|
|
101
|
+
sliderHeight.isProvided() ||
|
|
102
|
+
disabled.isProvided() ||
|
|
103
|
+
showBubble.isProvided() ||
|
|
104
|
+
centerOrigin.isProvided() ||
|
|
105
|
+
snapTapToSegment.isProvided() ||
|
|
106
|
+
fillColor.isProvided() ||
|
|
107
|
+
trackColor.isProvided() ||
|
|
108
|
+
thumbColor.isProvided() ||
|
|
109
|
+
thumbBorderColor.isProvided() ||
|
|
110
|
+
markActiveColor.isProvided() ||
|
|
111
|
+
markInactiveColor.isProvided() ||
|
|
112
|
+
markBorderColor.isProvided() ||
|
|
113
|
+
bubbleColor.isProvided() ||
|
|
114
|
+
bubbleTextColor.isProvided() ||
|
|
115
|
+
onChange.isProvided() ||
|
|
116
|
+
onSlideStart.isProvided() ||
|
|
117
|
+
onSlideComplete.isProvided() ||
|
|
118
|
+
hybridRef.isProvided();
|
|
119
|
+
}
|
|
67
120
|
|
|
68
121
|
private:
|
|
69
122
|
static bool filterObjectKeys(const std::string& propName);
|
|
@@ -72,32 +125,7 @@ namespace margelo::nitro::segmentslider::views {
|
|
|
72
125
|
/**
|
|
73
126
|
* State for the "SegmentSlider" View.
|
|
74
127
|
*/
|
|
75
|
-
|
|
76
|
-
public:
|
|
77
|
-
HybridSegmentSliderState() = default;
|
|
78
|
-
explicit HybridSegmentSliderState(const std::shared_ptr<HybridSegmentSliderProps>& props):
|
|
79
|
-
_props(props) {}
|
|
80
|
-
|
|
81
|
-
public:
|
|
82
|
-
[[nodiscard]]
|
|
83
|
-
const std::shared_ptr<HybridSegmentSliderProps>& getProps() const {
|
|
84
|
-
return _props;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
public:
|
|
88
|
-
#ifdef ANDROID
|
|
89
|
-
HybridSegmentSliderState(const HybridSegmentSliderState& /* previousState */, folly::dynamic /* data */) {}
|
|
90
|
-
folly::dynamic getDynamic() const {
|
|
91
|
-
throw std::runtime_error("HybridSegmentSliderState does not support folly!");
|
|
92
|
-
}
|
|
93
|
-
react::MapBuffer getMapBuffer() const {
|
|
94
|
-
throw std::runtime_error("HybridSegmentSliderState does not support MapBuffer!");
|
|
95
|
-
};
|
|
96
|
-
#endif
|
|
97
|
-
|
|
98
|
-
private:
|
|
99
|
-
std::shared_ptr<HybridSegmentSliderProps> _props;
|
|
100
|
-
};
|
|
128
|
+
using HybridSegmentSliderState = nitro::ViewPropsHolderState<HybridSegmentSliderProps>;
|
|
101
129
|
|
|
102
130
|
/**
|
|
103
131
|
* The Shadow Node for the "SegmentSlider" View.
|
|
@@ -110,21 +138,7 @@ namespace margelo::nitro::segmentslider::views {
|
|
|
110
138
|
/**
|
|
111
139
|
* The Component Descriptor for the "SegmentSlider" View.
|
|
112
140
|
*/
|
|
113
|
-
|
|
114
|
-
public:
|
|
115
|
-
explicit HybridSegmentSliderComponentDescriptor(const react::ComponentDescriptorParameters& parameters);
|
|
116
|
-
|
|
117
|
-
public:
|
|
118
|
-
/**
|
|
119
|
-
* A faster path for cloning props - reuses the caching logic from `HybridSegmentSliderProps`.
|
|
120
|
-
*/
|
|
121
|
-
std::shared_ptr<const react::Props> cloneProps(const react::PropsParserContext& context,
|
|
122
|
-
const std::shared_ptr<const react::Props>& props,
|
|
123
|
-
react::RawProps rawProps) const override;
|
|
124
|
-
#ifdef ANDROID
|
|
125
|
-
void adopt(react::ShadowNode& shadowNode) const override;
|
|
126
|
-
#endif
|
|
127
|
-
};
|
|
141
|
+
using HybridSegmentSliderComponentDescriptor = nitro::ViewComponentDescriptor<HybridSegmentSliderShadowNode>;
|
|
128
142
|
|
|
129
143
|
/* The actual view for "SegmentSlider" needs to be implemented in platform-specific code. */
|
|
130
144
|
|
|
@@ -15,121 +15,159 @@ namespace margelo::nitro::segmentslider::views {
|
|
|
15
15
|
using namespace facebook;
|
|
16
16
|
using ConcreteStateData = react::ConcreteState<HybridSegmentSliderState>;
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
std::shared_ptr<const HybridSegmentSliderProps> JHybridSegmentSliderStateUpdater::getPropsFromStateWrapper(
|
|
19
|
+
jni::alias_ref<JStateWrapper::javaobject> stateWrapper) {
|
|
20
|
+
if (stateWrapper.get() == nullptr) {
|
|
21
|
+
return nullptr;
|
|
22
|
+
}
|
|
23
23
|
// Get concrete StateWrapperImpl from passed StateWrapper interface object
|
|
24
|
-
jobject rawStateWrapper =
|
|
25
|
-
if (!
|
|
26
|
-
|
|
24
|
+
jobject rawStateWrapper = stateWrapper.get();
|
|
25
|
+
if (!stateWrapper->isInstanceOf(react::StateWrapperImpl::javaClassStatic())) [[unlikely]] {
|
|
26
|
+
throw std::runtime_error("StateWrapper is not a StateWrapperImpl");
|
|
27
|
+
}
|
|
28
|
+
auto stateWrapperImpl = jni::alias_ref<react::StateWrapperImpl::javaobject>{
|
|
29
|
+
static_cast<react::StateWrapperImpl::javaobject>(rawStateWrapper)
|
|
30
|
+
};
|
|
31
|
+
std::shared_ptr<const react::State> state = stateWrapperImpl->cthis()->getState();
|
|
32
|
+
if (state == nullptr) {
|
|
33
|
+
return nullptr;
|
|
27
34
|
}
|
|
28
|
-
auto stateWrapper = jni::alias_ref<react::StateWrapperImpl::javaobject>{
|
|
29
|
-
static_cast<react::StateWrapperImpl::javaobject>(rawStateWrapper)};
|
|
30
|
-
std::shared_ptr<const react::State> state = stateWrapper->cthis()->getState();
|
|
31
35
|
auto concreteState = std::static_pointer_cast<const ConcreteStateData>(state);
|
|
32
36
|
const HybridSegmentSliderState& data = concreteState->getData();
|
|
33
|
-
const std::shared_ptr<HybridSegmentSliderProps>& props = data.getProps();
|
|
37
|
+
const std::shared_ptr<const HybridSegmentSliderProps>& props = data.getProps();
|
|
34
38
|
if (props == nullptr) [[unlikely]] {
|
|
35
|
-
// Props aren't set yet!
|
|
36
39
|
throw std::runtime_error("HybridSegmentSliderState's data doesn't contain any props!");
|
|
37
40
|
}
|
|
41
|
+
return props;
|
|
42
|
+
}
|
|
38
43
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
if (props->max.isDirty) {
|
|
49
|
-
hybridView->setMax(props->max.value);
|
|
50
|
-
props->max.isDirty = false;
|
|
51
|
-
}
|
|
52
|
-
if (props->segments.isDirty) {
|
|
53
|
-
hybridView->setSegments(props->segments.value);
|
|
54
|
-
props->segments.isDirty = false;
|
|
55
|
-
}
|
|
56
|
-
if (props->sliderHeight.isDirty) {
|
|
57
|
-
hybridView->setSliderHeight(props->sliderHeight.value);
|
|
58
|
-
props->sliderHeight.isDirty = false;
|
|
59
|
-
}
|
|
60
|
-
if (props->disabled.isDirty) {
|
|
61
|
-
hybridView->setDisabled(props->disabled.value);
|
|
62
|
-
props->disabled.isDirty = false;
|
|
63
|
-
}
|
|
64
|
-
if (props->showBubble.isDirty) {
|
|
65
|
-
hybridView->setShowBubble(props->showBubble.value);
|
|
66
|
-
props->showBubble.isDirty = false;
|
|
67
|
-
}
|
|
68
|
-
if (props->centerOrigin.isDirty) {
|
|
69
|
-
hybridView->setCenterOrigin(props->centerOrigin.value);
|
|
70
|
-
props->centerOrigin.isDirty = false;
|
|
71
|
-
}
|
|
72
|
-
if (props->snapTapToSegment.isDirty) {
|
|
73
|
-
hybridView->setSnapTapToSegment(props->snapTapToSegment.value);
|
|
74
|
-
props->snapTapToSegment.isDirty = false;
|
|
75
|
-
}
|
|
76
|
-
if (props->fillColor.isDirty) {
|
|
77
|
-
hybridView->setFillColor(props->fillColor.value);
|
|
78
|
-
props->fillColor.isDirty = false;
|
|
79
|
-
}
|
|
80
|
-
if (props->trackColor.isDirty) {
|
|
81
|
-
hybridView->setTrackColor(props->trackColor.value);
|
|
82
|
-
props->trackColor.isDirty = false;
|
|
83
|
-
}
|
|
84
|
-
if (props->thumbColor.isDirty) {
|
|
85
|
-
hybridView->setThumbColor(props->thumbColor.value);
|
|
86
|
-
props->thumbColor.isDirty = false;
|
|
87
|
-
}
|
|
88
|
-
if (props->thumbBorderColor.isDirty) {
|
|
89
|
-
hybridView->setThumbBorderColor(props->thumbBorderColor.value);
|
|
90
|
-
props->thumbBorderColor.isDirty = false;
|
|
91
|
-
}
|
|
92
|
-
if (props->markActiveColor.isDirty) {
|
|
93
|
-
hybridView->setMarkActiveColor(props->markActiveColor.value);
|
|
94
|
-
props->markActiveColor.isDirty = false;
|
|
95
|
-
}
|
|
96
|
-
if (props->markInactiveColor.isDirty) {
|
|
97
|
-
hybridView->setMarkInactiveColor(props->markInactiveColor.value);
|
|
98
|
-
props->markInactiveColor.isDirty = false;
|
|
99
|
-
}
|
|
100
|
-
if (props->markBorderColor.isDirty) {
|
|
101
|
-
hybridView->setMarkBorderColor(props->markBorderColor.value);
|
|
102
|
-
props->markBorderColor.isDirty = false;
|
|
103
|
-
}
|
|
104
|
-
if (props->bubbleColor.isDirty) {
|
|
105
|
-
hybridView->setBubbleColor(props->bubbleColor.value);
|
|
106
|
-
props->bubbleColor.isDirty = false;
|
|
107
|
-
}
|
|
108
|
-
if (props->bubbleTextColor.isDirty) {
|
|
109
|
-
hybridView->setBubbleTextColor(props->bubbleTextColor.value);
|
|
110
|
-
props->bubbleTextColor.isDirty = false;
|
|
111
|
-
}
|
|
112
|
-
if (props->onChange.isDirty) {
|
|
113
|
-
hybridView->setOnChange(props->onChange.value);
|
|
114
|
-
props->onChange.isDirty = false;
|
|
115
|
-
}
|
|
116
|
-
if (props->onSlideStart.isDirty) {
|
|
117
|
-
hybridView->setOnSlideStart(props->onSlideStart.value);
|
|
118
|
-
props->onSlideStart.isDirty = false;
|
|
44
|
+
void JHybridSegmentSliderStateUpdater::updateViewProps(jni::alias_ref<jni::JClass> /* class */,
|
|
45
|
+
jni::alias_ref<JHybridSegmentSliderSpec::JavaPart> javaView,
|
|
46
|
+
jni::alias_ref<JStateWrapper::javaobject> newState,
|
|
47
|
+
jni::alias_ref<JStateWrapper::javaobject> oldState) {
|
|
48
|
+
std::shared_ptr<JHybridSegmentSliderSpec> hybridView = javaView->getJHybridSegmentSliderSpec();
|
|
49
|
+
std::shared_ptr<const HybridSegmentSliderProps> newProps = getPropsFromStateWrapper(newState);
|
|
50
|
+
std::shared_ptr<const HybridSegmentSliderProps> oldProps = getPropsFromStateWrapper(oldState);
|
|
51
|
+
if (newProps == nullptr) [[unlikely]] {
|
|
52
|
+
throw std::runtime_error("Current StateWrapper doesn't contain any props!");
|
|
119
53
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
54
|
+
|
|
55
|
+
// Update only props that differ from the previous State snapshot.
|
|
56
|
+
if (oldProps == nullptr
|
|
57
|
+
? newProps->defaultValue.isProvided()
|
|
58
|
+
: !newProps->defaultValue.hasSameValue(oldProps->defaultValue)) {
|
|
59
|
+
hybridView->setDefaultValue(newProps->defaultValue.get());
|
|
60
|
+
}
|
|
61
|
+
if (oldProps == nullptr
|
|
62
|
+
? newProps->min.isProvided()
|
|
63
|
+
: !newProps->min.hasSameValue(oldProps->min)) {
|
|
64
|
+
hybridView->setMin(newProps->min.get());
|
|
65
|
+
}
|
|
66
|
+
if (oldProps == nullptr
|
|
67
|
+
? newProps->max.isProvided()
|
|
68
|
+
: !newProps->max.hasSameValue(oldProps->max)) {
|
|
69
|
+
hybridView->setMax(newProps->max.get());
|
|
70
|
+
}
|
|
71
|
+
if (oldProps == nullptr
|
|
72
|
+
? newProps->segments.isProvided()
|
|
73
|
+
: !newProps->segments.hasSameValue(oldProps->segments)) {
|
|
74
|
+
hybridView->setSegments(newProps->segments.get());
|
|
75
|
+
}
|
|
76
|
+
if (oldProps == nullptr
|
|
77
|
+
? newProps->sliderHeight.isProvided()
|
|
78
|
+
: !newProps->sliderHeight.hasSameValue(oldProps->sliderHeight)) {
|
|
79
|
+
hybridView->setSliderHeight(newProps->sliderHeight.get());
|
|
80
|
+
}
|
|
81
|
+
if (oldProps == nullptr
|
|
82
|
+
? newProps->disabled.isProvided()
|
|
83
|
+
: !newProps->disabled.hasSameValue(oldProps->disabled)) {
|
|
84
|
+
hybridView->setDisabled(newProps->disabled.get());
|
|
85
|
+
}
|
|
86
|
+
if (oldProps == nullptr
|
|
87
|
+
? newProps->showBubble.isProvided()
|
|
88
|
+
: !newProps->showBubble.hasSameValue(oldProps->showBubble)) {
|
|
89
|
+
hybridView->setShowBubble(newProps->showBubble.get());
|
|
90
|
+
}
|
|
91
|
+
if (oldProps == nullptr
|
|
92
|
+
? newProps->centerOrigin.isProvided()
|
|
93
|
+
: !newProps->centerOrigin.hasSameValue(oldProps->centerOrigin)) {
|
|
94
|
+
hybridView->setCenterOrigin(newProps->centerOrigin.get());
|
|
95
|
+
}
|
|
96
|
+
if (oldProps == nullptr
|
|
97
|
+
? newProps->snapTapToSegment.isProvided()
|
|
98
|
+
: !newProps->snapTapToSegment.hasSameValue(oldProps->snapTapToSegment)) {
|
|
99
|
+
hybridView->setSnapTapToSegment(newProps->snapTapToSegment.get());
|
|
100
|
+
}
|
|
101
|
+
if (oldProps == nullptr
|
|
102
|
+
? newProps->fillColor.isProvided()
|
|
103
|
+
: !newProps->fillColor.hasSameValue(oldProps->fillColor)) {
|
|
104
|
+
hybridView->setFillColor(newProps->fillColor.get());
|
|
105
|
+
}
|
|
106
|
+
if (oldProps == nullptr
|
|
107
|
+
? newProps->trackColor.isProvided()
|
|
108
|
+
: !newProps->trackColor.hasSameValue(oldProps->trackColor)) {
|
|
109
|
+
hybridView->setTrackColor(newProps->trackColor.get());
|
|
110
|
+
}
|
|
111
|
+
if (oldProps == nullptr
|
|
112
|
+
? newProps->thumbColor.isProvided()
|
|
113
|
+
: !newProps->thumbColor.hasSameValue(oldProps->thumbColor)) {
|
|
114
|
+
hybridView->setThumbColor(newProps->thumbColor.get());
|
|
115
|
+
}
|
|
116
|
+
if (oldProps == nullptr
|
|
117
|
+
? newProps->thumbBorderColor.isProvided()
|
|
118
|
+
: !newProps->thumbBorderColor.hasSameValue(oldProps->thumbBorderColor)) {
|
|
119
|
+
hybridView->setThumbBorderColor(newProps->thumbBorderColor.get());
|
|
120
|
+
}
|
|
121
|
+
if (oldProps == nullptr
|
|
122
|
+
? newProps->markActiveColor.isProvided()
|
|
123
|
+
: !newProps->markActiveColor.hasSameValue(oldProps->markActiveColor)) {
|
|
124
|
+
hybridView->setMarkActiveColor(newProps->markActiveColor.get());
|
|
125
|
+
}
|
|
126
|
+
if (oldProps == nullptr
|
|
127
|
+
? newProps->markInactiveColor.isProvided()
|
|
128
|
+
: !newProps->markInactiveColor.hasSameValue(oldProps->markInactiveColor)) {
|
|
129
|
+
hybridView->setMarkInactiveColor(newProps->markInactiveColor.get());
|
|
130
|
+
}
|
|
131
|
+
if (oldProps == nullptr
|
|
132
|
+
? newProps->markBorderColor.isProvided()
|
|
133
|
+
: !newProps->markBorderColor.hasSameValue(oldProps->markBorderColor)) {
|
|
134
|
+
hybridView->setMarkBorderColor(newProps->markBorderColor.get());
|
|
135
|
+
}
|
|
136
|
+
if (oldProps == nullptr
|
|
137
|
+
? newProps->bubbleColor.isProvided()
|
|
138
|
+
: !newProps->bubbleColor.hasSameValue(oldProps->bubbleColor)) {
|
|
139
|
+
hybridView->setBubbleColor(newProps->bubbleColor.get());
|
|
140
|
+
}
|
|
141
|
+
if (oldProps == nullptr
|
|
142
|
+
? newProps->bubbleTextColor.isProvided()
|
|
143
|
+
: !newProps->bubbleTextColor.hasSameValue(oldProps->bubbleTextColor)) {
|
|
144
|
+
hybridView->setBubbleTextColor(newProps->bubbleTextColor.get());
|
|
145
|
+
}
|
|
146
|
+
if (oldProps == nullptr
|
|
147
|
+
? newProps->onChange.isProvided()
|
|
148
|
+
: !newProps->onChange.hasSameValue(oldProps->onChange)) {
|
|
149
|
+
hybridView->setOnChange(newProps->onChange.get());
|
|
150
|
+
}
|
|
151
|
+
if (oldProps == nullptr
|
|
152
|
+
? newProps->onSlideStart.isProvided()
|
|
153
|
+
: !newProps->onSlideStart.hasSameValue(oldProps->onSlideStart)) {
|
|
154
|
+
hybridView->setOnSlideStart(newProps->onSlideStart.get());
|
|
155
|
+
}
|
|
156
|
+
if (oldProps == nullptr
|
|
157
|
+
? newProps->onSlideComplete.isProvided()
|
|
158
|
+
: !newProps->onSlideComplete.hasSameValue(oldProps->onSlideComplete)) {
|
|
159
|
+
hybridView->setOnSlideComplete(newProps->onSlideComplete.get());
|
|
123
160
|
}
|
|
124
161
|
|
|
125
162
|
// Update hybridRef if it changed
|
|
126
|
-
if (
|
|
163
|
+
if (oldProps == nullptr
|
|
164
|
+
? newProps->hybridRef.isProvided()
|
|
165
|
+
: !newProps->hybridRef.hasSameValue(oldProps->hybridRef)) {
|
|
127
166
|
// hybridRef changed - call it with new this
|
|
128
|
-
const auto& maybeFunc =
|
|
167
|
+
const auto& maybeFunc = newProps->hybridRef.get();
|
|
129
168
|
if (maybeFunc.has_value()) {
|
|
130
169
|
maybeFunc.value()(hybridView);
|
|
131
170
|
}
|
|
132
|
-
props->hybridRef.isDirty = false;
|
|
133
171
|
}
|
|
134
172
|
}
|
|
135
173
|
|
|
@@ -31,7 +31,12 @@ public:
|
|
|
31
31
|
public:
|
|
32
32
|
static void updateViewProps(jni::alias_ref<jni::JClass> /* class */,
|
|
33
33
|
jni::alias_ref<JHybridSegmentSliderSpec::JavaPart> view,
|
|
34
|
-
jni::alias_ref<JStateWrapper::javaobject>
|
|
34
|
+
jni::alias_ref<JStateWrapper::javaobject> newState,
|
|
35
|
+
jni::alias_ref<JStateWrapper::javaobject> oldState);
|
|
36
|
+
|
|
37
|
+
private:
|
|
38
|
+
static std::shared_ptr<const HybridSegmentSliderProps> getPropsFromStateWrapper(
|
|
39
|
+
jni::alias_ref<JStateWrapper::javaobject> stateWrapper);
|
|
35
40
|
|
|
36
41
|
public:
|
|
37
42
|
static void registerNatives() {
|
|
@@ -20,6 +20,14 @@ import com.margelo.nitro.segmentslider.*
|
|
|
20
20
|
* Represents the React Native `ViewManager` for the "SegmentSlider" Nitro HybridView.
|
|
21
21
|
*/
|
|
22
22
|
public class HybridSegmentSliderManager: SimpleViewManager<View>() {
|
|
23
|
+
/**
|
|
24
|
+
* Represents the View and its last state snapshot (mutable)
|
|
25
|
+
*/
|
|
26
|
+
private class HybridViewHolder(
|
|
27
|
+
val hybridView: HybridSegmentSlider,
|
|
28
|
+
var lastState: StateWrapper? = null,
|
|
29
|
+
)
|
|
30
|
+
|
|
23
31
|
init {
|
|
24
32
|
if (RecyclableView::class.java.isAssignableFrom(HybridSegmentSlider::class.java)) {
|
|
25
33
|
// Enable view recycling
|
|
@@ -34,33 +42,41 @@ public class HybridSegmentSliderManager: SimpleViewManager<View>() {
|
|
|
34
42
|
override fun createViewInstance(reactContext: ThemedReactContext): View {
|
|
35
43
|
val hybridView = HybridSegmentSlider(reactContext)
|
|
36
44
|
val view = hybridView.view
|
|
37
|
-
view.setTag(associated_hybrid_view_tag, hybridView)
|
|
45
|
+
view.setTag(associated_hybrid_view_tag, HybridViewHolder(hybridView))
|
|
38
46
|
return view
|
|
39
47
|
}
|
|
40
48
|
|
|
41
49
|
override fun updateState(view: View, props: ReactStylesDiffMap, stateWrapper: StateWrapper): Any? {
|
|
42
|
-
val
|
|
50
|
+
val holder = getHybridViewHolder(view)
|
|
43
51
|
?: throw Error("Couldn't find view $view in local views table!")
|
|
52
|
+
val hybridView = holder.hybridView
|
|
53
|
+
val oldState = holder.lastState
|
|
54
|
+
val newState = stateWrapper
|
|
44
55
|
|
|
45
56
|
// 1. Update each prop individually
|
|
46
57
|
hybridView.beforeUpdate()
|
|
47
|
-
HybridSegmentSliderStateUpdater.updateViewProps(hybridView,
|
|
58
|
+
HybridSegmentSliderStateUpdater.updateViewProps(hybridView, newState, oldState)
|
|
48
59
|
hybridView.afterUpdate()
|
|
60
|
+
holder.lastState = newState
|
|
49
61
|
|
|
50
62
|
// 2. Continue in base View props
|
|
51
|
-
return super.updateState(view, props,
|
|
63
|
+
return super.updateState(view, props, newState)
|
|
52
64
|
}
|
|
53
65
|
|
|
54
66
|
override fun onDropViewInstance(view: View) {
|
|
55
|
-
val
|
|
56
|
-
|
|
67
|
+
val holder = getHybridViewHolder(view)
|
|
68
|
+
holder?.lastState = null
|
|
69
|
+
holder?.hybridView?.onDropView()
|
|
57
70
|
return super.onDropViewInstance(view)
|
|
58
71
|
}
|
|
59
72
|
|
|
60
73
|
protected override fun prepareToRecycleView(reactContext: ThemedReactContext, view: View): View? {
|
|
61
|
-
super.prepareToRecycleView(reactContext, view)
|
|
62
|
-
|
|
74
|
+
val preparedView = super.prepareToRecycleView(reactContext, view)
|
|
75
|
+
?: return null
|
|
76
|
+
val holder = getHybridViewHolder(preparedView)
|
|
63
77
|
?: return null
|
|
78
|
+
val hybridView = holder.hybridView
|
|
79
|
+
holder.lastState = null
|
|
64
80
|
|
|
65
81
|
@Suppress("USELESS_IS_CHECK")
|
|
66
82
|
if (hybridView is RecyclableView) {
|
|
@@ -74,7 +90,7 @@ public class HybridSegmentSliderManager: SimpleViewManager<View>() {
|
|
|
74
90
|
}
|
|
75
91
|
}
|
|
76
92
|
|
|
77
|
-
private fun
|
|
78
|
-
return view.getTag(associated_hybrid_view_tag) as?
|
|
93
|
+
private fun getHybridViewHolder(view: View): HybridViewHolder? {
|
|
94
|
+
return view.getTag(associated_hybrid_view_tag) as? HybridViewHolder
|
|
79
95
|
}
|
|
80
96
|
}
|
|
@@ -14,10 +14,10 @@ internal class HybridSegmentSliderStateUpdater {
|
|
|
14
14
|
companion object {
|
|
15
15
|
/**
|
|
16
16
|
* Updates the props for [view] through C++.
|
|
17
|
-
* The [
|
|
17
|
+
* The [newState] prop is expected to contain [view]'s props as wrapped Fabric state.
|
|
18
18
|
*/
|
|
19
19
|
@Suppress("KotlinJniMissingFunction")
|
|
20
20
|
@JvmStatic
|
|
21
|
-
external fun updateViewProps(view: HybridSegmentSliderSpec,
|
|
21
|
+
external fun updateViewProps(view: HybridSegmentSliderSpec, newState: StateWrapper, oldState: StateWrapper?)
|
|
22
22
|
}
|
|
23
23
|
}
|