• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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