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