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_gauge_bridge.h"
16
17 #include "base/geometry/dimension.h"
18 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
19 #include "bridge/declarative_frontend/jsview/js_linear_gradient.h"
20 #include "core/components/common/properties/color.h"
21 #include "core/components_ng/pattern/gauge/gauge_paint_property.h"
22 #include "core/components_ng/pattern/gauge/gauge_theme.h"
23 #include "core/components_ng/base/frame_node.h"
24 #include "core/components_ng/pattern/gauge/gauge_model_ng.h"
25
26 namespace OHOS::Ace::NG {
27 namespace {
28 constexpr Color ERROR_COLOR = Color(0xFFE84026);
29 constexpr uint32_t NUM_0 = 0;
30 constexpr uint32_t NUM_1 = 1;
31 constexpr uint32_t NUM_2 = 2;
32 const char* GAUGE_NODEPTR_OF_UINODE = "nodePtr_";
33
ResetColor(ArkUINodeHandle nativeNode)34 void ResetColor(ArkUINodeHandle nativeNode)
35 {
36 auto nodeModifiers = GetArkUINodeModifiers();
37 CHECK_NULL_VOID(nodeModifiers);
38 if (!Container::LessThanAPIVersion(PlatformVersion::VERSION_ELEVEN)) {
39 nodeModifiers->getGaugeModifier()->resetGradientColors(nativeNode);
40 } else {
41 nodeModifiers->getGaugeModifier()->resetColors(nativeNode);
42 }
43 }
44 }
45
SortColorStopOffset(std::vector<NG::ColorStopArray> & colors)46 void SortColorStopOffset(std::vector<NG::ColorStopArray>& colors)
47 {
48 for (auto& colorStopArray : colors) {
49 std::sort(colorStopArray.begin(), colorStopArray.end(),
50 [](const std::pair<Color, Dimension>& left, const std::pair<Color, Dimension>& right) {
51 return left.second.Value() < right.second.Value();
52 });
53
54 auto iter = std::unique(colorStopArray.begin(), colorStopArray.end(),
55 [](const std::pair<Color, Dimension>& left, const std::pair<Color, Dimension>& right) {
56 return left.second.Value() == right.second.Value();
57 });
58 colorStopArray.erase(iter, colorStopArray.end());
59 }
60 }
61
ConvertResourceColor(const EcmaVM * vm,const Local<JSValueRef> & item,std::vector<NG::ColorStopArray> & colors)62 void ConvertResourceColor(const EcmaVM* vm, const Local<JSValueRef>& item, std::vector<NG::ColorStopArray>& colors)
63 {
64 Color color;
65 if (!ArkTSUtils::ParseJsColorAlpha(vm, item, color)) {
66 color = ERROR_COLOR;
67 }
68 NG::ColorStopArray colorStopArray;
69 colorStopArray.emplace_back(std::make_pair(color, Dimension(0.0)));
70 colors.emplace_back(colorStopArray);
71 }
72
ConvertGradientColor(const EcmaVM * vm,const Local<JSValueRef> & itemParam,std::vector<NG::ColorStopArray> & colors,NG::GaugeType & type,bool & isGradientColor)73 void ConvertGradientColor(const EcmaVM* vm, const Local<JSValueRef>& itemParam, std::vector<NG::ColorStopArray>& colors,
74 NG::GaugeType& type, bool& isGradientColor)
75 {
76 if (!itemParam->IsObject(vm)) {
77 type = NG::GaugeType::TYPE_CIRCULAR_MONOCHROME;
78 return ConvertResourceColor(vm, itemParam, colors);
79 }
80 Framework::JSLinearGradient* jsLinearGradient =
81 static_cast<Framework::JSLinearGradient*>(itemParam->ToObject(vm)->GetNativePointerField(vm, 0));
82 if (!jsLinearGradient) {
83 type = NG::GaugeType::TYPE_CIRCULAR_MONOCHROME;
84 return ConvertResourceColor(vm, itemParam, colors);
85 }
86
87 type = NG::GaugeType::TYPE_CIRCULAR_SINGLE_SEGMENT_GRADIENT;
88 if (jsLinearGradient->GetGradient().size() == 0) {
89 NG::ColorStopArray colorStopArray;
90 colorStopArray.emplace_back(std::make_pair(ERROR_COLOR, Dimension(0.0)));
91 colors.emplace_back(colorStopArray);
92 } else {
93 isGradientColor = true;
94 colors.emplace_back(jsLinearGradient->GetGradient());
95 }
96 }
97
SetGradientColorsObject(const EcmaVM * vm,const Local<JSValueRef> & info,std::vector<NG::ColorStopArray> & colors,std::vector<float> & weights,NG::GaugeType & type,ArkUINodeHandle nativeNode)98 void SetGradientColorsObject(const EcmaVM* vm, const Local<JSValueRef>& info, std::vector<NG::ColorStopArray>& colors,
99 std::vector<float>& weights, NG::GaugeType& type, ArkUINodeHandle nativeNode)
100 {
101 ArkUIGradientType gradient;
102 bool isGradientColor = false;
103 ConvertGradientColor(vm, info, colors, type, isGradientColor);
104 auto colorStruct = std::make_unique<uint32_t[]>(colors[0].size());
105 auto colorResourceIdStruct = std::make_unique<uint32_t[]>(colors[0].size());
106 auto offsetStruct = std::make_unique<ArkUILengthType[]>(colors[0].size());
107 std::vector<uint32_t> linearLengths { colors[0].size() };
108 for (uint32_t i = 0; i < colors[0].size(); i++) {
109 colorStruct[i] = colors[0][i].first.GetValue();
110 colorResourceIdStruct[i] = colors[0][i].first.GetResourceId();
111 offsetStruct[i].number = colors[0][i].second.Value();
112 offsetStruct[i].unit = static_cast<int8_t>(colors[0][i].second.Unit());
113 }
114 gradient.color = colorStruct.get();
115 gradient.colorResourceId = colorResourceIdStruct.get();
116 gradient.offset = offsetStruct.get();
117 gradient.gradientLength = &(*linearLengths.begin());
118 gradient.weight = nullptr;
119 gradient.type = static_cast<uint32_t>(type);
120 gradient.length = 1;
121 gradient.isGradientColor = isGradientColor;
122 auto nodeModifiers = GetArkUINodeModifiers();
123 CHECK_NULL_VOID(nodeModifiers);
124 nodeModifiers->getGaugeModifier()->setGradientColors(nativeNode, &gradient, 0);
125 }
126
127 struct GradientParams {
128 std::vector<float>& weights;
129 std::vector<NG::ColorStopArray>& colors;
130 bool& isGradientColor;
131 };
132
SetGradientColorsArray(const EcmaVM * vm,const Local<JSValueRef> & info,ArkUINodeHandle nativeNode,NG::GaugeType & type,const GradientParams & params)133 void SetGradientColorsArray(const EcmaVM* vm, const Local<JSValueRef>& info, ArkUINodeHandle nativeNode,
134 NG::GaugeType& type, const GradientParams& params)
135 {
136 ArkUIGradientType gradient;
137 uint32_t totalLength = 0;
138 std::vector<uint32_t> linearLengths(params.colors.size(), 0);
139 for (uint32_t i = 0; i < params.colors.size(); i++) {
140 linearLengths[i] = params.colors[i].size();
141 totalLength += params.colors[i].size();
142 }
143 auto colorStruct = std::make_unique<uint32_t[]>(totalLength);
144 auto colorResourceIdStruct = std::make_unique<uint32_t[]>(totalLength);
145 auto offsetStruct = std::make_unique<ArkUILengthType[]>(totalLength);
146 int32_t pos = 0;
147 for (uint32_t i = 0; i < params.colors.size(); i++) {
148 for (uint32_t j = 0; j < params.colors[i].size(); j++, pos++) {
149 colorStruct[pos] = params.colors[i][j].first.GetValue();
150 colorResourceIdStruct[pos] = params.colors[i][j].first.GetResourceId();
151 offsetStruct[pos].number = params.colors[i][j].second.Value();
152 offsetStruct[pos].unit = static_cast<int8_t>(params.colors[i][j].second.Unit());
153 }
154 }
155 gradient.color = colorStruct.get();
156 gradient.colorResourceId = colorResourceIdStruct.get();
157 gradient.offset = offsetStruct.get();
158 gradient.gradientLength = &(*linearLengths.begin());
159 gradient.weight = &(*params.weights.begin());
160 gradient.type = static_cast<uint32_t>(type);
161 gradient.length = params.colors.size();
162 gradient.isGradientColor = params.isGradientColor;
163 auto nodeModifiers = GetArkUINodeModifiers();
164 CHECK_NULL_VOID(nodeModifiers);
165 nodeModifiers->getGaugeModifier()->setGradientColors(nativeNode, &gradient, params.weights.size());
166 }
167
SetGradientColors(const EcmaVM * vm,const Local<JSValueRef> & info,ArkUINodeHandle nativeNode)168 void SetGradientColors(const EcmaVM* vm, const Local<JSValueRef>& info, ArkUINodeHandle nativeNode)
169 {
170 auto nodeModifiers = GetArkUINodeModifiers();
171 CHECK_NULL_VOID(nodeModifiers);
172 if (info->IsNull() || info->IsUndefined()) {
173 nodeModifiers->getGaugeModifier()->resetGradientColors(nativeNode);
174 return;
175 }
176 NG::GaugeType type = NG::GaugeType::TYPE_CIRCULAR_MULTI_SEGMENT_GRADIENT;
177 std::vector<NG::ColorStopArray> colors;
178 std::vector<float> weights;
179 if (!info->IsArray(vm)) {
180 SetGradientColorsObject(vm, info, colors, weights, type, nativeNode);
181 return;
182 }
183 auto jsColorsArray = panda::CopyableGlobal<panda::ArrayRef>(vm, info);
184 if (jsColorsArray.IsEmpty() || jsColorsArray->IsUndefined()
185 || jsColorsArray->IsNull() || jsColorsArray->Length(vm) == 0) {
186 nodeModifiers->getGaugeModifier()->resetGradientColors(nativeNode);
187 return;
188 }
189 bool isGradientColor = false;
190 for (size_t i = 0; i < jsColorsArray->Length(vm); ++i) {
191 if (static_cast<int32_t>(i) >= NG::COLORS_MAX_COUNT) {
192 break;
193 }
194 auto jsValue = jsColorsArray->GetValueAt(vm, info, i);
195 if (!jsValue->IsArray(vm)) {
196 continue;
197 }
198 auto tempColors = panda::CopyableGlobal<panda::ArrayRef>(vm, jsValue);
199 if (tempColors.IsEmpty() || tempColors->IsUndefined() || tempColors->IsNull()) {
200 continue;
201 }
202 // Get weight
203 float weight = tempColors->GetValueAt(vm, jsValue, 1)->ToNumber(vm)->Value();
204 if (NonPositive(weight)) {
205 continue;
206 }
207 weights.push_back(weight);
208 // Get color
209 auto jsColorValue = tempColors->GetValueAt(vm, jsValue, 0);
210 ConvertGradientColor(vm, jsColorValue, colors, type, isGradientColor);
211 }
212 type = NG::GaugeType::TYPE_CIRCULAR_MULTI_SEGMENT_GRADIENT;
213 SortColorStopOffset(colors);
214 SetGradientColorsArray(vm, info, nativeNode, type, { weights, colors, isGradientColor });
215 }
216
SetColors(ArkUIRuntimeCallInfo * runtimeCallInfo)217 ArkUINativeModuleValue GaugeBridge::SetColors(ArkUIRuntimeCallInfo* runtimeCallInfo)
218 {
219 EcmaVM* vm = runtimeCallInfo->GetVM();
220 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
221 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
222 Local<JSValueRef> jsArg = runtimeCallInfo->GetCallArgRef(NUM_1);
223 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
224 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
225
226 if (!Container::LessThanAPIVersion(PlatformVersion::VERSION_ELEVEN)) {
227 SetGradientColors(vm, jsArg, nativeNode);
228 return panda::JSValueRef::Undefined(vm);
229 }
230
231 if (!jsArg->IsArray(vm)) {
232 ResetColor(nativeNode);
233 return panda::JSValueRef::Undefined(vm);
234 }
235 auto jsColor = panda::CopyableGlobal<panda::ArrayRef>(vm, jsArg);
236 if (jsColor.IsEmpty() || jsColor->IsUndefined() || jsColor->IsNull()) {
237 return panda::JSValueRef::Undefined(vm);
238 }
239 size_t length = jsColor->Length(vm);
240 auto colors = std::make_unique<uint32_t[]>(length);
241 auto weights = std::make_unique<float[]>(length);
242
243 auto theme = ArkTSUtils::GetTheme<ProgressTheme>();
244 for (size_t i = 0; i < length; i++) {
245 auto jsValue = jsColor->GetValueAt(vm, jsArg, i);
246 if (!jsValue->IsArray(vm)) {
247 ResetColor(nativeNode);
248 return panda::JSValueRef::Undefined(vm);
249 }
250 auto handle = panda::CopyableGlobal<panda::ArrayRef>(vm, jsValue);
251 if (handle.IsEmpty() || handle->IsUndefined() || handle->IsNull()) {
252 return panda::JSValueRef::Undefined(vm);
253 }
254 float weight = handle->GetValueAt(vm, jsValue, 1)->ToNumber(vm)->Value();
255 Color selectedColor;
256 if (!ArkTSUtils::ParseJsColorAlpha(vm, handle->GetValueAt(vm, jsValue, 1), selectedColor)) {
257 selectedColor = ERROR_COLOR;
258 }
259 colors[i] = selectedColor.GetValue();
260 if (weight > 0) {
261 weights[i] = weight;
262 } else {
263 weights[i] = 0.0f;
264 }
265 }
266 auto nodeModifiers = GetArkUINodeModifiers();
267 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
268 nodeModifiers->getGaugeModifier()->setColors(nativeNode, colors.get(), weights.get(), length);
269 return panda::JSValueRef::Undefined(vm);
270 }
271
ResetColors(ArkUIRuntimeCallInfo * runtimeCallInfo)272 ArkUINativeModuleValue GaugeBridge::ResetColors(ArkUIRuntimeCallInfo* runtimeCallInfo)
273 {
274 EcmaVM* vm = runtimeCallInfo->GetVM();
275 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
276 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
277 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
278 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
279 ResetColor(nativeNode);
280 return panda::JSValueRef::Undefined(vm);
281 }
282
SetGaugeValue(ArkUIRuntimeCallInfo * runtimeCallInfo)283 ArkUINativeModuleValue GaugeBridge::SetGaugeValue(ArkUIRuntimeCallInfo* runtimeCallInfo)
284 {
285 EcmaVM* vm = runtimeCallInfo->GetVM();
286 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
287 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
288 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
289 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
290 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
291
292 auto nodeModifiers = GetArkUINodeModifiers();
293 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
294 if (!secondArg->IsNumber()) {
295 nodeModifiers->getGaugeModifier()->resetGaugeValue(nativeNode);
296 return panda::JSValueRef::Undefined(vm);
297 }
298
299 float value = static_cast<float>(secondArg->ToNumber(vm)->Value());
300 nodeModifiers->getGaugeModifier()->setGaugeValue(nativeNode, value);
301 return panda::JSValueRef::Undefined(vm);
302 }
303
ResetGaugeValue(ArkUIRuntimeCallInfo * runtimeCallInfo)304 ArkUINativeModuleValue GaugeBridge::ResetGaugeValue(ArkUIRuntimeCallInfo* runtimeCallInfo)
305 {
306 EcmaVM* vm = runtimeCallInfo->GetVM();
307 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
308 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
309 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
310 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
311 auto nodeModifiers = GetArkUINodeModifiers();
312 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
313 nodeModifiers->getGaugeModifier()->resetGaugeValue(nativeNode);
314 return panda::JSValueRef::Undefined(vm);
315 }
316
SetGaugeStartAngle(ArkUIRuntimeCallInfo * runtimeCallInfo)317 ArkUINativeModuleValue GaugeBridge::SetGaugeStartAngle(ArkUIRuntimeCallInfo* runtimeCallInfo)
318 {
319 EcmaVM* vm = runtimeCallInfo->GetVM();
320 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
321 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
322 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
323 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
324 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
325
326 auto nodeModifiers = GetArkUINodeModifiers();
327 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
328 if (!secondArg->IsNumber()) {
329 nodeModifiers->getGaugeModifier()->resetGaugeStartAngle(nativeNode);
330 return panda::JSValueRef::Undefined(vm);
331 }
332
333 float value = static_cast<float>(secondArg->ToNumber(vm)->Value());
334 nodeModifiers->getGaugeModifier()->setGaugeStartAngle(nativeNode, value);
335 return panda::JSValueRef::Undefined(vm);
336 }
337
ResetGaugeStartAngle(ArkUIRuntimeCallInfo * runtimeCallInfo)338 ArkUINativeModuleValue GaugeBridge::ResetGaugeStartAngle(ArkUIRuntimeCallInfo* runtimeCallInfo)
339 {
340 EcmaVM* vm = runtimeCallInfo->GetVM();
341 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
342 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
343 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
344 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
345 auto nodeModifiers = GetArkUINodeModifiers();
346 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
347 nodeModifiers->getGaugeModifier()->resetGaugeStartAngle(nativeNode);
348 return panda::JSValueRef::Undefined(vm);
349 }
350
SetGaugeEndAngle(ArkUIRuntimeCallInfo * runtimeCallInfo)351 ArkUINativeModuleValue GaugeBridge::SetGaugeEndAngle(ArkUIRuntimeCallInfo* runtimeCallInfo)
352 {
353 EcmaVM* vm = runtimeCallInfo->GetVM();
354 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
355 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
356 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
357 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
358 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
359
360 auto nodeModifiers = GetArkUINodeModifiers();
361 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
362 if (!secondArg->IsNumber()) {
363 nodeModifiers->getGaugeModifier()->resetGaugeEndAngle(nativeNode);
364 return panda::JSValueRef::Undefined(vm);
365 }
366
367 float value = static_cast<float>(secondArg->ToNumber(vm)->Value());
368 nodeModifiers->getGaugeModifier()->setGaugeEndAngle(nativeNode, value);
369 return panda::JSValueRef::Undefined(vm);
370 }
371
ResetGaugeEndAngle(ArkUIRuntimeCallInfo * runtimeCallInfo)372 ArkUINativeModuleValue GaugeBridge::ResetGaugeEndAngle(ArkUIRuntimeCallInfo* runtimeCallInfo)
373 {
374 EcmaVM* vm = runtimeCallInfo->GetVM();
375 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
376 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
377 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
378 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
379 auto nodeModifiers = GetArkUINodeModifiers();
380 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
381 nodeModifiers->getGaugeModifier()->resetGaugeEndAngle(nativeNode);
382 return panda::JSValueRef::Undefined(vm);
383 }
384
SetGaugeStrokeWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)385 ArkUINativeModuleValue GaugeBridge::SetGaugeStrokeWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
386 {
387 EcmaVM* vm = runtimeCallInfo->GetVM();
388 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
389 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
390 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
391 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
392 Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
393
394 CalcDimension strokeWidth;
395 RefPtr<ResourceObject> strokeWidthResObj;
396 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, jsValue, strokeWidth, strokeWidthResObj) ||
397 strokeWidth.Unit() == DimensionUnit::PERCENT) {
398 strokeWidth = CalcDimension(0);
399 }
400 auto nodeModifiers = GetArkUINodeModifiers();
401 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
402 auto strokeWidthRawPtr = AceType::RawPtr(strokeWidthResObj);
403 nodeModifiers->getGaugeModifier()->setGaugeStrokeWidthPtr(
404 nativeNode, strokeWidth.Value(), static_cast<int>(strokeWidth.Unit()), strokeWidthRawPtr);
405 return panda::JSValueRef::Undefined(vm);
406 }
407
ResetGaugeStrokeWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)408 ArkUINativeModuleValue GaugeBridge::ResetGaugeStrokeWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
409 {
410 EcmaVM* vm = runtimeCallInfo->GetVM();
411 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
412 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
413 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
414 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
415 auto nodeModifiers = GetArkUINodeModifiers();
416 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
417 nodeModifiers->getGaugeModifier()->resetGaugeStrokeWidth(nativeNode);
418 return panda::JSValueRef::Undefined(vm);
419 }
420
SetGaugeTrackShadow(ArkUIRuntimeCallInfo * runtimeCallInfo)421 ArkUINativeModuleValue GaugeBridge::SetGaugeTrackShadow(ArkUIRuntimeCallInfo* runtimeCallInfo)
422 {
423 EcmaVM* vm = runtimeCallInfo->GetVM();
424 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
425 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
426 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
427 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
428 Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
429 auto radiusArg = runtimeCallInfo->GetCallArgRef(2);
430 auto offsetXArg = runtimeCallInfo->GetCallArgRef(3);
431 auto offsetYArg = runtimeCallInfo->GetCallArgRef(4);
432
433 auto nodeModifiers = GetArkUINodeModifiers();
434 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
435 if (jsValue->IsNull()) {
436 nodeModifiers->getGaugeModifier()->setShadowOptions(nativeNode, DEFAULT_GAUGE_SHADOW_RADIUS,
437 DEFAULT_GAUGE_SHADOW_OFFSETX, DEFAULT_GAUGE_SHADOW_OFFSETY, false);
438 return panda::JSValueRef::Undefined(vm);
439 }
440
441 if (!jsValue->IsObject(vm)) {
442 nodeModifiers->getGaugeModifier()->resetShadowOptions(nativeNode);
443 nodeModifiers->getGaugeModifier()->setIsShowIndicator(nativeNode, true);
444 return panda::JSValueRef::Undefined(vm);
445 }
446 ArkUIGaugeShadowOptions shadowOptions = { .radius = 0.0, .offsetX = 0.0, .offsetY = 0.0, .isShadowVisible = true };
447 ArkUIShadowOptionsResource shadowOptionsResource;
448 RefPtr<ResourceObject> radiusResObj;
449 if (!ArkTSUtils::ParseJsDouble(vm, radiusArg, shadowOptions.radius, radiusResObj)) {
450 shadowOptions.radius = DEFAULT_GAUGE_SHADOW_RADIUS;
451 }
452 if (NonPositive(shadowOptions.radius)) {
453 shadowOptions.radius = DEFAULT_GAUGE_SHADOW_RADIUS;
454 }
455 RefPtr<ResourceObject> offsetXResObj;
456 if (!ArkTSUtils::ParseJsDouble(vm, offsetXArg, shadowOptions.offsetX, offsetXResObj)) {
457 shadowOptions.offsetX = DEFAULT_GAUGE_SHADOW_OFFSETX;
458 }
459 RefPtr<ResourceObject> offsetYResObj;
460 if (!ArkTSUtils::ParseJsDouble(vm, offsetYArg, shadowOptions.offsetY, offsetYResObj)) {
461 shadowOptions.offsetY = DEFAULT_GAUGE_SHADOW_OFFSETY;
462 }
463 shadowOptionsResource.radiusRawPtr = AceType::RawPtr(radiusResObj);
464 shadowOptionsResource.offsetXRawPtr = AceType::RawPtr(offsetXResObj);
465 shadowOptionsResource.offsetYRawPtr = AceType::RawPtr(offsetYResObj);
466
467 nodeModifiers->getGaugeModifier()->setShadowOptionsPtr(nativeNode, shadowOptions, shadowOptionsResource);
468 return panda::JSValueRef::Undefined(vm);
469 }
470
ResetGaugeTrackShadow(ArkUIRuntimeCallInfo * runtimeCallInfo)471 ArkUINativeModuleValue GaugeBridge::ResetGaugeTrackShadow(ArkUIRuntimeCallInfo* runtimeCallInfo)
472 {
473 EcmaVM* vm = runtimeCallInfo->GetVM();
474 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
475 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
476 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
477 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
478 auto nodeModifiers = GetArkUINodeModifiers();
479 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
480 nodeModifiers->getGaugeModifier()->resetShadowOptions(nativeNode);
481 return panda::JSValueRef::Undefined(vm);
482 }
483
SetGaugeIndicator(ArkUIRuntimeCallInfo * runtimeCallInfo)484 ArkUINativeModuleValue GaugeBridge::SetGaugeIndicator(ArkUIRuntimeCallInfo* runtimeCallInfo)
485 {
486 EcmaVM* vm = runtimeCallInfo->GetVM();
487 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
488 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
489 auto iconArg = runtimeCallInfo->GetCallArgRef(1);
490 auto spaceArg = runtimeCallInfo->GetCallArgRef(2);
491 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
492 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
493 auto nodeModifiers = GetArkUINodeModifiers();
494 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
495 nodeModifiers->getGaugeModifier()->setIsShowIndicator(nativeNode, true);
496 std::string iconPath;
497 RefPtr<ResourceObject> iconPathResObj;
498 if (ArkTSUtils::ParseJsMedia(vm, iconArg, iconPath, iconPathResObj)) {
499 std::string bundleName;
500 std::string moduleName;
501 auto iconPathRawPtr = AceType::RawPtr(iconPathResObj);
502 ArkTSUtils::GetJsMediaBundleInfo(vm, iconArg, bundleName, moduleName);
503 nodeModifiers->getGaugeModifier()->setIndicatorIconPathPtr(
504 nativeNode, iconPath.c_str(), bundleName.c_str(), moduleName.c_str(), iconPathRawPtr);
505 } else {
506 nodeModifiers->getGaugeModifier()->resetIndicatorIconPath(nativeNode);
507 }
508 CalcDimension space;
509 RefPtr<ResourceObject> spaceResObj;
510 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, spaceArg, space, false)) {
511 space = NG::INDICATOR_DISTANCE_TO_TOP;
512 }
513 if (space.IsNegative()) {
514 space = NG::INDICATOR_DISTANCE_TO_TOP;
515 }
516 auto spaceRawPtr = AceType::RawPtr(spaceResObj);
517 nodeModifiers->getGaugeModifier()->setIndicatorSpacePtr(
518 nativeNode, space.CalcValue().c_str(), space.Value(), static_cast<int32_t>(space.Unit()), spaceRawPtr);
519 return panda::JSValueRef::Undefined(vm);
520 }
521
ResetGaugeIndicator(ArkUIRuntimeCallInfo * runtimeCallInfo)522 ArkUINativeModuleValue GaugeBridge::ResetGaugeIndicator(ArkUIRuntimeCallInfo* runtimeCallInfo)
523 {
524 EcmaVM* vm = runtimeCallInfo->GetVM();
525 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
526 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
527 auto valueArg = runtimeCallInfo->GetCallArgRef(1);
528 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
529 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
530 auto nodeModifiers = GetArkUINodeModifiers();
531 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
532 if (valueArg->IsNull()) {
533 nodeModifiers->getGaugeModifier()->setIsShowIndicator(nativeNode, false);
534 } else if (valueArg->IsUndefined() || (!valueArg->IsObject(vm))) {
535 nodeModifiers->getGaugeModifier()->resetIndicatorIconPath(nativeNode);
536 nodeModifiers->getGaugeModifier()->resetIndicatorSpace(nativeNode);
537 nodeModifiers->getGaugeModifier()->setIsShowIndicator(nativeNode, true);
538 }
539 return panda::JSValueRef::Undefined(vm);
540 }
541
SetContentModifierBuilder(ArkUIRuntimeCallInfo * runtimeCallInfo)542 ArkUINativeModuleValue GaugeBridge::SetContentModifierBuilder(ArkUIRuntimeCallInfo* runtimeCallInfo)
543 {
544 EcmaVM* vm = runtimeCallInfo->GetVM();
545 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
546 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
547 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
548 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
549 auto* frameNode = reinterpret_cast<FrameNode*>(firstArg->ToNativePointer(vm)->Value());
550 if (!secondArg->IsObject(vm)) {
551 GaugeModelNG::SetBuilderFunc(frameNode, nullptr);
552 return panda::JSValueRef::Undefined(vm);
553 }
554 panda::CopyableGlobal<panda::ObjectRef> obj(vm, secondArg);
555 auto containerId = Container::CurrentId();
556 GaugeModelNG::SetBuilderFunc(frameNode,
557 [vm, frameNode, obj = std::move(obj), containerId](
558 GaugeConfiguration config) -> RefPtr<FrameNode> {
559 ContainerScope scope(containerId);
560 auto context = ArkTSUtils::GetContext(vm);
561 const char* keyOfGauge[] = { "value", "min", "max" };
562 Local<JSValueRef> valuesOfGauge[] = { panda::NumberRef::New(vm, config.value_),
563 panda::NumberRef::New(vm, config.min_), panda::NumberRef::New(vm, config.max_) };
564 auto gauge = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keyOfGauge),
565 keyOfGauge, valuesOfGauge);
566 gauge->SetNativePointerFieldCount(vm, 1);
567 gauge->SetNativePointerField(vm, 0, static_cast<void*>(frameNode));
568 panda::Local<panda::JSValueRef> params[NUM_2] = { context, gauge };
569 LocalScope pandaScope(vm);
570 panda::TryCatch trycatch(vm);
571 auto jsObject = obj.ToLocal();
572 auto makeFunc = jsObject->Get(vm, panda::StringRef::NewFromUtf8(vm, "makeContentModifierNode"));
573 CHECK_EQUAL_RETURN(makeFunc->IsFunction(vm), false, nullptr);
574 panda::Local<panda::FunctionRef> func = makeFunc;
575 auto result = func->Call(vm, jsObject, params, NUM_2);
576 JSNApi::ExecutePendingJob(vm);
577 CHECK_EQUAL_RETURN(result.IsEmpty() || trycatch.HasCaught() || !result->IsObject(vm), true, nullptr);
578 auto resultObj = result->ToObject(vm);
579 panda::Local<panda::JSValueRef> nodeptr =
580 resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, GAUGE_NODEPTR_OF_UINODE));
581 CHECK_EQUAL_RETURN(nodeptr.IsEmpty() || nodeptr->IsUndefined() || nodeptr->IsNull(), true, nullptr);
582 auto* frameNode = reinterpret_cast<FrameNode*>(nodeptr->ToNativePointer(vm)->Value());
583 CHECK_NULL_RETURN(frameNode, nullptr);
584 return AceType::Claim(frameNode);
585 });
586 return panda::JSValueRef::Undefined(vm);
587 }
588
SetGaugePrivacySensitive(ArkUIRuntimeCallInfo * runtimeCallInfo)589 ArkUINativeModuleValue GaugeBridge::SetGaugePrivacySensitive(ArkUIRuntimeCallInfo* runtimeCallInfo)
590 {
591 EcmaVM* vm = runtimeCallInfo->GetVM();
592 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
593 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
594 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
595 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
596 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
597 uint32_t sensitive = false;
598 if (secondArg->IsBoolean()) {
599 sensitive = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
600 }
601 auto nodeModifiers = GetArkUINodeModifiers();
602 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
603 nodeModifiers->getCommonModifier()->setPrivacySensitive(nativeNode, sensitive);
604 return panda::JSValueRef::Undefined(vm);
605 }
606
ResetGaugePrivacySensitive(ArkUIRuntimeCallInfo * runtimeCallInfo)607 ArkUINativeModuleValue GaugeBridge::ResetGaugePrivacySensitive(ArkUIRuntimeCallInfo* runtimeCallInfo)
608 {
609 EcmaVM* vm = runtimeCallInfo->GetVM();
610 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
611 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
612 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
613 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
614 auto nodeModifiers = GetArkUINodeModifiers();
615 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
616 nodeModifiers->getCommonModifier()->resetPrivacySensitive(nativeNode);
617 return panda::JSValueRef::Undefined(vm);
618 }
619 } // namespace OHOS::Ace::NG
620