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