• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "core/interfaces/native/node/node_refresh_modifier.h"
16 
17 #include "core/components_ng/pattern/refresh/refresh_model_ng.h"
18 #include "core/interfaces/native/node/node_refresh_modifier.h"
19 
20 namespace OHOS::Ace::NG {
21 namespace {
22 const float ERROR_FLOAT_CODE = -1.0f;
23 
SetRefreshing(ArkUINodeHandle node,ArkUI_Bool value)24 void SetRefreshing(ArkUINodeHandle node, ArkUI_Bool value)
25 {
26     auto* frameNode = reinterpret_cast<FrameNode*>(node);
27     CHECK_NULL_VOID(frameNode);
28     RefreshModelNG::SetRefreshing(frameNode, static_cast<bool>(value));
29 }
30 
GetRefreshing(ArkUINodeHandle node)31 ArkUI_Bool GetRefreshing(ArkUINodeHandle node)
32 {
33     auto* frameNode = reinterpret_cast<FrameNode*>(node);
34     CHECK_NULL_RETURN(frameNode, false);
35     return static_cast<ArkUI_Bool>(RefreshModelNG::GetRefreshing(frameNode));
36 }
37 
SetRefreshOffset(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit)38 void SetRefreshOffset(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit)
39 {
40     auto* frameNode = reinterpret_cast<FrameNode*>(node);
41     CHECK_NULL_VOID(frameNode);
42     RefreshModelNG::SetRefreshOffset(frameNode, Dimension(value, static_cast<OHOS::Ace::DimensionUnit>(unit)));
43 }
44 
ResetRefreshOffset(ArkUINodeHandle node)45 void ResetRefreshOffset(ArkUINodeHandle node)
46 {
47     auto* frameNode = reinterpret_cast<FrameNode*>(node);
48     CHECK_NULL_VOID(frameNode);
49     RefreshModelNG::SetRefreshOffset(frameNode, Dimension(0.0f, DimensionUnit::VP));
50 }
51 
SetPullToRefresh(ArkUINodeHandle node,ArkUI_Bool value)52 void SetPullToRefresh(ArkUINodeHandle node, ArkUI_Bool value)
53 {
54     auto* frameNode = reinterpret_cast<FrameNode*>(node);
55     CHECK_NULL_VOID(frameNode);
56     RefreshModelNG::SetPullToRefresh(frameNode, value);
57 }
58 
ResetPullToRefresh(ArkUINodeHandle node)59 void ResetPullToRefresh(ArkUINodeHandle node)
60 {
61     auto* frameNode = reinterpret_cast<FrameNode*>(node);
62     CHECK_NULL_VOID(frameNode);
63     RefreshModelNG::SetPullToRefresh(frameNode, true);
64 }
65 
SetRefreshContent(ArkUINodeHandle node,ArkUINodeHandle content)66 void SetRefreshContent(ArkUINodeHandle node, ArkUINodeHandle content)
67 {
68     auto* frameNode = reinterpret_cast<FrameNode*>(node);
69     CHECK_NULL_VOID(frameNode);
70     auto contentNode = reinterpret_cast<FrameNode*>(content);
71     CHECK_NULL_VOID(contentNode);
72     RefreshModelNG::SetCustomBuilder(frameNode, contentNode);
73 }
74 
SetPullDownRatio(ArkUINodeHandle node,ArkUI_Float32 ratio)75 void SetPullDownRatio(ArkUINodeHandle node, ArkUI_Float32 ratio)
76 {
77     auto* frameNode = reinterpret_cast<FrameNode*>(node);
78     CHECK_NULL_VOID(frameNode);
79     float value = 0.0;
80     if (LessNotEqual(ratio, 0.0)) {
81         value = 0.0;
82     } else if (GreatNotEqual(ratio, 1.0)) {
83         value = 1.0;
84     }
85     value = ratio ;
86     std::optional<float> ratioValue = value;
87     RefreshModelNG::SetPullDownRatio(frameNode, ratioValue);
88 }
89 
ResetPullDownRatio(ArkUINodeHandle node)90 void ResetPullDownRatio(ArkUINodeHandle node)
91 {
92     auto* frameNode = reinterpret_cast<FrameNode*>(node);
93     CHECK_NULL_VOID(frameNode);
94     std::optional<float> ratioValue = std::nullopt;
95     RefreshModelNG::SetPullDownRatio(frameNode, ratioValue);
96 }
97 
GetPullDownRatio(ArkUINodeHandle node)98 ArkUI_Float32 GetPullDownRatio(ArkUINodeHandle node)
99 {
100     auto* frameNode = reinterpret_cast<FrameNode*>(node);
101     CHECK_NULL_RETURN(frameNode, ERROR_FLOAT_CODE);
102     return RefreshModelNG::GetPullDownRatio(frameNode);
103 }
104 
GetRefreshOffset(ArkUINodeHandle node,ArkUI_Int32 unit)105 ArkUI_Float32 GetRefreshOffset(ArkUINodeHandle node, ArkUI_Int32 unit)
106 {
107     auto* frameNode = reinterpret_cast<FrameNode*>(node);
108     CHECK_NULL_RETURN(frameNode, ERROR_FLOAT_CODE);
109     return RefreshModelNG::GetRefreshOffset(frameNode).GetNativeValue(static_cast<DimensionUnit>(unit));
110 }
111 
GetPullToRefresh(ArkUINodeHandle node)112 ArkUI_Bool GetPullToRefresh(ArkUINodeHandle node)
113 {
114     auto* frameNode = reinterpret_cast<FrameNode*>(node);
115     CHECK_NULL_RETURN(frameNode, false);
116     return static_cast<ArkUI_Bool>(RefreshModelNG::GetPullToRefresh(frameNode));
117 }
118 } // namespace
119 namespace NodeModifier {
120 
GetRefreshModifier()121 const ArkUIRefreshModifier* GetRefreshModifier()
122 {
123     CHECK_INITIALIZED_FIELDS_BEGIN(); // don't move this line
124     static const ArkUIRefreshModifier modifier = {
125         .setRefreshing = SetRefreshing,
126         .getRefreshing = GetRefreshing,
127         .setRefreshOffset = SetRefreshOffset,
128         .resetRefreshOffset = ResetRefreshOffset,
129         .setPullToRefresh = SetPullToRefresh,
130         .resetPullToRefresh = ResetPullToRefresh,
131         .setRefreshContent = SetRefreshContent,
132         .setPullDownRatio = SetPullDownRatio,
133         .resetPullDownRatio = ResetPullDownRatio,
134         .getPullDownRatio = GetPullDownRatio,
135         .getRefreshOffset = GetRefreshOffset,
136         .getPullToRefresh = GetPullToRefresh,
137     };
138     CHECK_INITIALIZED_FIELDS_END(modifier, 0, 0, 0); // don't move this line
139     return &modifier;
140 }
141 
GetCJUIRefreshModifier()142 const CJUIRefreshModifier* GetCJUIRefreshModifier()
143 {
144     CHECK_INITIALIZED_FIELDS_BEGIN(); // don't move this line
145     static const CJUIRefreshModifier modifier = {
146         .setRefreshing = SetRefreshing,
147         .getRefreshing = GetRefreshing,
148         .setRefreshContent = SetRefreshContent,
149         .setRefreshOffset = SetRefreshOffset,
150         .resetRefreshOffset = ResetRefreshOffset,
151         .setPullToRefresh = SetPullToRefresh,
152         .resetPullToRefresh = ResetPullToRefresh,
153         .setPullDownRatio = SetPullDownRatio,
154         .resetPullDownRatio = ResetPullDownRatio,
155         .getPullDownRatio = GetPullDownRatio,
156         .getRefreshOffset = GetRefreshOffset,
157         .getPullToRefresh = GetPullToRefresh,
158     };
159     CHECK_INITIALIZED_FIELDS_END(modifier, 0, 0, 0); // don't move this line
160     return &modifier;
161 }
162 
SetRefreshOnStateChange(ArkUINodeHandle node,void * extraParam)163 void SetRefreshOnStateChange(ArkUINodeHandle node, void* extraParam)
164 {
165     auto* frameNode = reinterpret_cast<FrameNode*>(node);
166     CHECK_NULL_VOID(frameNode);
167     auto onEvent = [node, extraParam](const int32_t value) {
168         ArkUINodeEvent event;
169         event.kind = COMPONENT_ASYNC_EVENT;
170         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
171         event.componentAsyncEvent.subKind = ON_REFRESH_STATE_CHANGE;
172         event.componentAsyncEvent.data[0].i32 = value;
173         SendArkUISyncEvent(&event);
174     };
175     RefreshModelNG::SetOnStateChange(frameNode, std::move(onEvent));
176 }
177 
SetOnRefreshing(ArkUINodeHandle node,void * extraParam)178 void SetOnRefreshing(ArkUINodeHandle node, void* extraParam)
179 {
180     auto* frameNode = reinterpret_cast<FrameNode*>(node);
181     CHECK_NULL_VOID(frameNode);
182     auto onEvent = [node, extraParam]() {
183         ArkUINodeEvent event;
184         event.kind = COMPONENT_ASYNC_EVENT;
185         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
186         event.componentAsyncEvent.subKind = ON_REFRESH_REFRESHING;
187         SendArkUISyncEvent(&event);
188     };
189     RefreshModelNG::SetOnRefreshing(frameNode, std::move(onEvent));
190 }
191 
SetRefreshOnOffsetChange(ArkUINodeHandle node,void * extraParam)192 void SetRefreshOnOffsetChange(ArkUINodeHandle node, void* extraParam)
193 {
194     auto* frameNode = reinterpret_cast<FrameNode*>(node);
195     CHECK_NULL_VOID(frameNode);
196     auto onEvent = [node, extraParam](const float value) {
197         ArkUINodeEvent event;
198         event.kind = COMPONENT_ASYNC_EVENT;
199         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
200         event.componentAsyncEvent.subKind = ON_REFRESH_ON_OFFSET_CHANGE;
201         event.componentAsyncEvent.data[0].f32 = value;
202         SendArkUISyncEvent(&event);
203     };
204     RefreshModelNG::SetOnOffsetChange(frameNode, std::move(onEvent));
205 }
206 
SetRefreshChangeEvent(ArkUINodeHandle node,void * extraParam)207 void SetRefreshChangeEvent(ArkUINodeHandle node, void* extraParam)
208 {
209     auto* frameNode = reinterpret_cast<FrameNode*>(node);
210     CHECK_NULL_VOID(frameNode);
211     auto onEvent = [node, extraParam](const std::string& value) {
212         ArkUINodeEvent event;
213         event.kind = COMPONENT_ASYNC_EVENT;
214         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
215         event.componentAsyncEvent.subKind = ON_REFRESH_CHANGE_EVENT;
216         bool newValue = value == "true";
217         event.componentAsyncEvent.data[0].u32 = newValue;
218         SendArkUISyncEvent(&event);
219     };
220     RefreshModelNG::SetChangeEvent(frameNode, std::move(onEvent));
221 }
222 
ResetRefreshOnStateChange(ArkUINodeHandle node)223 void ResetRefreshOnStateChange(ArkUINodeHandle node)
224 {
225     auto* frameNode = reinterpret_cast<FrameNode*>(node);
226     CHECK_NULL_VOID(frameNode);
227     RefreshModelNG::SetOnStateChange(frameNode, nullptr);
228 }
ResetOnRefreshing(ArkUINodeHandle node)229 void ResetOnRefreshing(ArkUINodeHandle node)
230 {
231     auto* frameNode = reinterpret_cast<FrameNode*>(node);
232     CHECK_NULL_VOID(frameNode);
233     RefreshModelNG::SetOnRefreshing(frameNode, nullptr);
234 }
ResetRefreshOnOffsetChange(ArkUINodeHandle node)235 void ResetRefreshOnOffsetChange(ArkUINodeHandle node)
236 {
237     auto* frameNode = reinterpret_cast<FrameNode*>(node);
238     CHECK_NULL_VOID(frameNode);
239     RefreshModelNG::SetOnOffsetChange(frameNode, nullptr);
240 }
ResetRefreshChangeEvent(ArkUINodeHandle node)241 void ResetRefreshChangeEvent(ArkUINodeHandle node)
242 {
243     auto* frameNode = reinterpret_cast<FrameNode*>(node);
244     CHECK_NULL_VOID(frameNode);
245     RefreshModelNG::SetChangeEvent(frameNode, nullptr);
246 }
247 } // namespace NodeModifier
248 } // namespace OHOS::Ace::NG
249