1 /*
2 * Copyright (c) 2023 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 "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_data_panel_bridge.h"
16
17 #include "base/geometry/dimension.h"
18 #include "bridge/declarative_frontend/jsview/js_linear_gradient.h"
19 #include "bridge/declarative_frontend/jsview/js_view_abstract.h"
20 #include "core/components/common/properties/color.h"
21 #include "core/components/data_panel/data_panel_theme.h"
22 #include "core/components/divider/divider_theme.h"
23 #include "core/components_ng/pattern/gauge/gauge_paint_property.h"
24 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
25
26 #include "core/components_ng/base/frame_node.h"
27 #include "core/components_ng/pattern/data_panel/data_panel_model_ng.h"
28
29 namespace {
30 const char* DATA_PANEL_NODEPTR_OF_UINODE = "nodePtr_";
31 } // namespace
32 namespace OHOS::Ace::NG {
33 namespace {
34 constexpr int32_t NUM_0 = 0;
35 constexpr int32_t NUM_1 = 1;
36 constexpr int32_t NUM_2 = 2;
37
ConvertThemeColor(std::vector<OHOS::Ace::NG::Gradient> & colors)38 void ConvertThemeColor(std::vector<OHOS::Ace::NG::Gradient>& colors)
39 {
40 RefPtr<DataPanelTheme> theme = ArkTSUtils::GetTheme<DataPanelTheme>();
41 auto themeColors = theme->GetColorsArray();
42 for (const auto& item : themeColors) {
43 OHOS::Ace::NG::Gradient gradient;
44 OHOS::Ace::NG::GradientColor gradientColorStart;
45 gradientColorStart.SetLinearColor(LinearColor(item.first));
46 gradientColorStart.SetDimension(Dimension(0.0));
47 gradient.AddColor(gradientColorStart);
48 OHOS::Ace::NG::GradientColor gradientColorEnd;
49 gradientColorEnd.SetLinearColor(LinearColor(item.second));
50 gradientColorEnd.SetDimension(Dimension(1.0));
51 gradient.AddColor(gradientColorEnd);
52 colors.emplace_back(gradient);
53 }
54 }
55
ConvertResourceColor(const EcmaVM * vm,const Local<JSValueRef> & item,OHOS::Ace::NG::Gradient & gradient)56 bool ConvertResourceColor(const EcmaVM* vm, const Local<JSValueRef>& item, OHOS::Ace::NG::Gradient& gradient)
57 {
58 Color color;
59 if (!ArkTSUtils::ParseJsColorAlpha(vm, item, color)) {
60 return false;
61 }
62 OHOS::Ace::NG::GradientColor gradientColorStart;
63 gradientColorStart.SetLinearColor(LinearColor(color));
64 gradientColorStart.SetDimension(Dimension(0.0));
65 gradient.AddColor(gradientColorStart);
66 OHOS::Ace::NG::GradientColor gradientColorEnd;
67 gradientColorEnd.SetLinearColor(LinearColor(color));
68 gradientColorEnd.SetDimension(Dimension(1.0));
69 gradient.AddColor(gradientColorEnd);
70 return true;
71 }
72
ConvertGradientColor(const EcmaVM * vm,const Local<JSValueRef> & itemParam,OHOS::Ace::NG::Gradient & gradient)73 bool ConvertGradientColor(const EcmaVM* vm, const Local<JSValueRef>& itemParam, OHOS::Ace::NG::Gradient& gradient)
74 {
75 if (!itemParam->IsObject(vm)) {
76 return ConvertResourceColor(vm, itemParam, gradient);
77 }
78 Framework::JSLinearGradient* jsLinearGradient =
79 static_cast<Framework::JSLinearGradient*>(itemParam->ToObject(vm)->GetNativePointerField(vm, 0));
80 if (!jsLinearGradient) {
81 return ConvertResourceColor(vm, itemParam, gradient);
82 }
83
84 size_t colorLength = jsLinearGradient->GetGradient().size();
85 if (colorLength == 0) {
86 return false;
87 }
88 for (size_t colorIndex = 0; colorIndex < colorLength; ++colorIndex) {
89 OHOS::Ace::NG::GradientColor gradientColor;
90 gradientColor.SetLinearColor(LinearColor(jsLinearGradient->GetGradient().at(colorIndex).first));
91 gradientColor.SetDimension(jsLinearGradient->GetGradient().at(colorIndex).second);
92 gradient.AddColor(gradientColor);
93 }
94 return true;
95 }
96
SetTrackShadowObject(ArkUINodeHandle nativeNode,std::vector<OHOS::Ace::NG::Gradient> & shadowColors,double radius,double offsetX,double offsetY)97 void SetTrackShadowObject(ArkUINodeHandle nativeNode, std::vector<OHOS::Ace::NG::Gradient>& shadowColors,
98 double radius, double offsetX, double offsetY)
99 {
100 ArkUIGradientType gradient;
101 gradient.length = shadowColors.size();
102 auto linearLength = std::make_unique<uint32_t[]>(shadowColors.size());
103 std::vector<uint32_t> allColor;
104 std::vector<ArkUILengthType> allOffset;
105 for (uint32_t i = 0; i < shadowColors.size(); i++) {
106 linearLength[i] = shadowColors[i].GetColors().size();
107 for (uint32_t j = 0; j < linearLength[i]; j++) {
108 allColor.emplace_back(shadowColors[i].GetColors()[j].GetLinearColor().GetValue());
109 allOffset.emplace_back(ArkUILengthType { .number = shadowColors[i].GetColors()[j].GetDimension().Value(),
110 .unit = static_cast<int8_t>(shadowColors[i].GetColors()[j].GetDimension().Unit()) });
111 }
112 }
113 gradient.color = &(*allColor.begin());
114 gradient.offset = &(*allOffset.begin());
115 gradient.gradientLength = linearLength.get();
116 auto nodeModifiers = GetArkUINodeModifiers();
117 CHECK_NULL_VOID(nodeModifiers);
118 nodeModifiers->getDataPanelModifier()->setTrackShadow(nativeNode, &gradient, radius, offsetX, offsetY);
119 }
120 } // namespace
121
SetValueColors(ArkUIRuntimeCallInfo * runtimeCallInfo)122 ArkUINativeModuleValue DataPanelBridge::SetValueColors(ArkUIRuntimeCallInfo* runtimeCallInfo)
123 {
124 EcmaVM* vm = runtimeCallInfo->GetVM();
125 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
126 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
127 Local<JSValueRef> colors = runtimeCallInfo->GetCallArgRef(NUM_1);
128 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
129 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
130
131 std::vector<OHOS::Ace::NG::Gradient> shadowColors;
132 if (!colors.IsEmpty() && colors->IsArray(vm)) {
133 auto colorsArray = panda::CopyableGlobal<panda::ArrayRef>(vm, colors);
134 if (colorsArray.IsEmpty() || colorsArray->IsUndefined() || colorsArray->IsNull()) {
135 return panda::JSValueRef::Undefined(vm);
136 }
137 for (size_t i = 0; i < colorsArray->Length(vm); ++i) {
138 auto item = colorsArray->GetValueAt(vm, colors, i);
139 OHOS::Ace::NG::Gradient gradient;
140 if (!ConvertGradientColor(vm, item, gradient)) {
141 shadowColors.clear();
142 ConvertThemeColor(shadowColors);
143 break;
144 }
145 shadowColors.emplace_back(gradient);
146 }
147 }
148 ArkUIGradientType gradient;
149 gradient.length = shadowColors.size();
150 auto linearLength = std::make_unique<uint32_t[]>(shadowColors.size());
151 std::vector<uint32_t> allColor;
152 std::vector<ArkUILengthType> allOffset;
153 for (uint32_t i = 0; i < shadowColors.size(); i++) {
154 linearLength[i] = shadowColors[i].GetColors().size();
155 for (uint32_t j = 0; j < linearLength[i]; j++) {
156 allColor.emplace_back(shadowColors[i].GetColors()[j].GetLinearColor().GetValue());
157 allOffset.emplace_back(ArkUILengthType { .number = shadowColors[i].GetColors()[j].GetDimension().Value(),
158 .unit = static_cast<int8_t>(shadowColors[i].GetColors()[j].GetDimension().Unit()) });
159 }
160 }
161 gradient.color = &(*allColor.begin());
162 gradient.offset = &(*allOffset.begin());
163 gradient.gradientLength = linearLength.get();
164 auto nodeModifiers = GetArkUINodeModifiers();
165 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
166 nodeModifiers->getDataPanelModifier()->setValueColors(nativeNode, &gradient);
167 return panda::JSValueRef::Undefined(vm);
168 }
169
ResetValueColors(ArkUIRuntimeCallInfo * runtimeCallInfo)170 ArkUINativeModuleValue DataPanelBridge::ResetValueColors(ArkUIRuntimeCallInfo* runtimeCallInfo)
171 {
172 EcmaVM* vm = runtimeCallInfo->GetVM();
173 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
174 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
175 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
176 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
177 auto nodeModifiers = GetArkUINodeModifiers();
178 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
179 nodeModifiers->getDataPanelModifier()->resetValueColors(nativeNode);
180 return panda::JSValueRef::Undefined(vm);
181 }
182
SetTrackShadow(ArkUIRuntimeCallInfo * runtimeCallInfo)183 ArkUINativeModuleValue DataPanelBridge::SetTrackShadow(ArkUIRuntimeCallInfo* runtimeCallInfo)
184 {
185 EcmaVM* vm = runtimeCallInfo->GetVM();
186 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
187 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
188 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
189 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
190 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
191 auto nodeModifiers = GetArkUINodeModifiers();
192 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
193 if (secondArg->IsNull()) {
194 nodeModifiers->getDataPanelModifier()->setNullTrackShadow(nativeNode);
195 return panda::JSValueRef::Undefined(vm);
196 }
197 if (!secondArg->IsObject(vm)) {
198 nodeModifiers->getDataPanelModifier()->resetTrackShadow(nativeNode);
199 return panda::JSValueRef::Undefined(vm);
200 }
201 auto obj = secondArg->ToObject(vm);
202 auto jsRadius = obj->Get(vm, panda::StringRef::NewFromUtf8(vm, "radius"));
203 auto jsOffsetX = obj->Get(vm, panda::StringRef::NewFromUtf8(vm, "offsetX"));
204 auto jsOffsetY = obj->Get(vm, panda::StringRef::NewFromUtf8(vm, "offsetY"));
205 RefPtr<DataPanelTheme> theme = ArkTSUtils::GetTheme<DataPanelTheme>();
206 double radius = 0.0;
207 if (!ArkTSUtils::ParseJsDouble(vm, jsRadius, radius) || NonPositive(radius)) {
208 radius = theme->GetTrackShadowRadius().ConvertToVp();
209 }
210
211 double offsetX = 0.0;
212 if (!ArkTSUtils::ParseJsDouble(vm, jsOffsetX, offsetX)) {
213 offsetX = theme->GetTrackShadowOffsetX().ConvertToVp();
214 }
215
216 double offsetY = 0.0;
217 if (!ArkTSUtils::ParseJsDouble(vm, jsOffsetY, offsetY)) {
218 offsetY = theme->GetTrackShadowOffsetY().ConvertToVp();
219 }
220
221 auto colors = obj->Get(vm, panda::StringRef::NewFromUtf8(vm, "colors"));
222 std::vector<OHOS::Ace::NG::Gradient> shadowColors;
223 ConvertThemeColor(shadowColors);
224 if (!colors.IsEmpty() && colors->IsArray(vm)) {
225 shadowColors.clear();
226 auto colorsArray = panda::CopyableGlobal<panda::ArrayRef>(vm, colors);
227 if (colorsArray.IsEmpty() || colorsArray->IsUndefined() || colorsArray->IsNull()) {
228 SetTrackShadowObject(nativeNode, shadowColors, radius, offsetX, offsetY);
229 return panda::JSValueRef::Undefined(vm);
230 }
231 for (size_t i = 0; i < colorsArray->Length(vm); ++i) {
232 auto item = colorsArray->GetValueAt(vm, colors, i);
233 OHOS::Ace::NG::Gradient gradient;
234 if (!ConvertGradientColor(vm, item, gradient)) {
235 shadowColors.clear();
236 ConvertThemeColor(shadowColors);
237 break;
238 }
239 shadowColors.emplace_back(gradient);
240 }
241 }
242 SetTrackShadowObject(nativeNode, shadowColors, radius, offsetX, offsetY);
243 return panda::JSValueRef::Undefined(vm);
244 }
245
ResetTrackShadow(ArkUIRuntimeCallInfo * runtimeCallInfo)246 ArkUINativeModuleValue DataPanelBridge::ResetTrackShadow(ArkUIRuntimeCallInfo* runtimeCallInfo)
247 {
248 EcmaVM* vm = runtimeCallInfo->GetVM();
249 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
250 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
251 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
252 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
253 auto nodeModifiers = GetArkUINodeModifiers();
254 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
255 nodeModifiers->getDataPanelModifier()->resetTrackShadow(nativeNode);
256 return panda::JSValueRef::Undefined(vm);
257 }
SetCloseEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)258 ArkUINativeModuleValue DataPanelBridge::SetCloseEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
259 {
260 EcmaVM* vm = runtimeCallInfo->GetVM();
261 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
262 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
263 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
264 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
265 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
266 bool boolValue = secondArg->ToBoolean(vm)->Value();
267 auto nodeModifiers = GetArkUINodeModifiers();
268 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
269 nodeModifiers->getDataPanelModifier()->setCloseEffect(nativeNode, boolValue);
270 return panda::JSValueRef::Undefined(vm);
271 }
272
ResetCloseEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)273 ArkUINativeModuleValue DataPanelBridge::ResetCloseEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
274 {
275 EcmaVM* vm = runtimeCallInfo->GetVM();
276 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
277 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
278 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
279 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
280 auto nodeModifiers = GetArkUINodeModifiers();
281 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
282 nodeModifiers->getDataPanelModifier()->resetCloseEffect(nativeNode);
283 return panda::JSValueRef::Undefined(vm);
284 }
285
SetDataPanelTrackBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)286 ArkUINativeModuleValue DataPanelBridge::SetDataPanelTrackBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
287 {
288 EcmaVM* vm = runtimeCallInfo->GetVM();
289 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
290 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
291 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
292 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
293 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
294
295 Color color;
296 if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
297 RefPtr<DataPanelTheme> theme = ArkTSUtils::GetTheme<DataPanelTheme>();
298 color = theme->GetBackgroundColor();
299 }
300 auto nodeModifiers = GetArkUINodeModifiers();
301 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
302 nodeModifiers->getDataPanelModifier()->setDataPanelTrackBackgroundColor(nativeNode, color.GetValue());
303 return panda::JSValueRef::Undefined(vm);
304 }
305
ResetDataPanelTrackBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)306 ArkUINativeModuleValue DataPanelBridge::ResetDataPanelTrackBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
307 {
308 EcmaVM* vm = runtimeCallInfo->GetVM();
309 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
310 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
311 CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
312 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
313 auto nodeModifiers = GetArkUINodeModifiers();
314 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
315 nodeModifiers->getDataPanelModifier()->resetDataPanelTrackBackgroundColor(nativeNode);
316 return panda::JSValueRef::Undefined(vm);
317 }
318
SetDataPanelStrokeWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)319 ArkUINativeModuleValue DataPanelBridge::SetDataPanelStrokeWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
320 {
321 EcmaVM* vm = runtimeCallInfo->GetVM();
322 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
323 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
324 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
325 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
326 Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
327
328 RefPtr<DataPanelTheme> theme = ArkTSUtils::GetTheme<DataPanelTheme>();
329 CalcDimension strokeWidth;
330
331 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, jsValue, strokeWidth)) {
332 strokeWidth = theme->GetThickness();
333 }
334
335 if (jsValue->IsString(vm) && (jsValue->ToString(vm)->ToString(vm).empty() ||
336 !StringUtils::StringToDimensionWithUnitNG(
337 jsValue->ToString(vm)->ToString(vm), strokeWidth))) {
338 strokeWidth = theme->GetThickness();
339 }
340
341 if (strokeWidth.IsNegative() || strokeWidth.Unit() == DimensionUnit::PERCENT) {
342 strokeWidth = theme->GetThickness();
343 }
344
345 auto nodeModifiers = GetArkUINodeModifiers();
346 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
347 nodeModifiers->getDataPanelModifier()->setDataPanelStrokeWidth(
348 nativeNode, strokeWidth.Value(), static_cast<int32_t>(strokeWidth.Unit()));
349 return panda::JSValueRef::Undefined(vm);
350 }
351
ResetDataPanelStrokeWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)352 ArkUINativeModuleValue DataPanelBridge::ResetDataPanelStrokeWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
353 {
354 EcmaVM* vm = runtimeCallInfo->GetVM();
355 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
356 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
357 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
358 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
359 auto nodeModifiers = GetArkUINodeModifiers();
360 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
361 nodeModifiers->getDataPanelModifier()->resetDataPanelStrokeWidth(nativeNode);
362 return panda::JSValueRef::Undefined(vm);
363 }
364
SetContentModifierBuilder(ArkUIRuntimeCallInfo * runtimeCallInfo)365 ArkUINativeModuleValue DataPanelBridge::SetContentModifierBuilder(ArkUIRuntimeCallInfo* runtimeCallInfo)
366 {
367 EcmaVM* vm = runtimeCallInfo->GetVM();
368 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
369 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
370 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
371 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
372 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
373 auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
374 if (!secondArg->IsObject(vm)) {
375 DataPanelModelNG::SetBuilderFunc(frameNode, nullptr);
376 return panda::JSValueRef::Undefined(vm);
377 }
378 panda::CopyableGlobal<panda::ObjectRef> globalObj(vm, secondArg);
379 auto containerId = Container::CurrentId();
380 DataPanelModelNG::SetBuilderFunc(frameNode,
381 [vm, frameNode, globalObj = std::move(globalObj), containerId](
382 DataPanelConfiguration config) -> RefPtr<FrameNode> {
383 ContainerScope scope(containerId);
384 CHECK_NULL_RETURN(Container::Current(), nullptr);
385 CHECK_NULL_RETURN(Container::Current()->GetFrontend(), nullptr);
386 auto context = NapiValueToLocalValue(Container::Current()->GetFrontend()->GetContextValue());
387 auto obj = panda::ObjectRef::New(vm);
388 auto valueArray = panda::ArrayRef::New(vm, config.values_.size());
389 for (uint32_t i = 0; i < config.values_.size(); ++i) {
390 panda::ArrayRef::SetValueAt(vm, valueArray, i, panda::NumberRef::New(vm, config.values_[i]));
391 }
392 obj->Set(vm, panda::StringRef::NewFromUtf8(vm, "values"), valueArray);
393 obj->Set(vm, panda::StringRef::NewFromUtf8(vm, "maxValue"), panda::NumberRef::New(vm, config.maxValue_));
394 obj->SetNativePointerFieldCount(vm, 1);
395 obj->SetNativePointerField(vm, 0, static_cast<void*>(frameNode));
396 panda::Local<panda::JSValueRef> params[NUM_2] = { context, obj };
397 LocalScope pandaScope(vm);
398 panda::TryCatch trycatch(vm);
399 auto jsObject = globalObj.ToLocal();
400 auto makeFunc = jsObject->Get(vm, panda::StringRef::NewFromUtf8(vm, "makeContentModifierNode"));
401 if (!makeFunc->IsFunction(vm)) { return nullptr; }
402 panda::Local<panda::FunctionRef> func = makeFunc;
403 auto result = func->Call(vm, jsObject, params, 2);
404 JSNApi::ExecutePendingJob(vm);
405 if (result.IsEmpty() || trycatch.HasCaught() || !result->IsObject(vm)) { return nullptr; }
406 auto resultObj = result->ToObject(vm);
407 panda::Local<panda::JSValueRef> nodeptr = resultObj->Get(vm,
408 panda::StringRef::NewFromUtf8(vm, DATA_PANEL_NODEPTR_OF_UINODE));
409 if (nodeptr.IsEmpty() || nodeptr->IsUndefined() || nodeptr->IsNull()) { return nullptr; }
410 auto* node = nodeptr->ToNativePointer(vm)->Value();
411 auto* frameNode = reinterpret_cast<FrameNode*>(node);
412 CHECK_NULL_RETURN(frameNode, nullptr);
413 return AceType::Claim(frameNode);
414 });
415 return panda::JSValueRef::Undefined(vm);
416 }
417 } // namespace OHOS::Ace::NG
418