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_tabs_bridge.h"
16
17 #include "base/log/ace_scoring_log.h"
18 #include "base/utils/utils.h"
19 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
20 #include "bridge/declarative_frontend/engine/functions/js_tabs_function.h"
21 #include "bridge/declarative_frontend/jsview/js_tabs.h"
22 #include "bridge/declarative_frontend/jsview/js_tabs_controller.h"
23 #include "core/components/common/properties/color.h"
24 #include "frameworks/bridge/common/utils/utils.h"
25 #include "frameworks/bridge/declarative_frontend/engine/js_types.h"
26 #include "frameworks/bridge/declarative_frontend/jsview/js_view_abstract.h"
27 #include "frameworks/core/components/tab_bar/tabs_event.h"
28 #include "core/components_ng/pattern/tabs/tabs_model_ng.h"
29
30 namespace OHOS::Ace::NG {
31 constexpr int SIZE_OF_FIVE = 5;
32 constexpr int SIZE_OF_THREE = 3;
33 constexpr int SIZE_OF_VALUES = 2;
34 constexpr int TABS_ARG_INDEX_0 = 0;
35 constexpr int TABS_ARG_INDEX_1 = 1;
36 constexpr int TABS_ARG_INDEX_2 = 2;
37 constexpr int TABS_ARG_INDEX_3 = 3;
38 constexpr int TABS_ARG_INDEX_4 = 4;
39 constexpr int TABS_ARG_INDEX_5 = 5;
40 constexpr int TABS_ARG_INDEX_6 = 6;
41 constexpr int TABS_ARG_INDEX_7 = 7;
42 constexpr int TABS_ARG_INDEX_8 = 8;
43 constexpr int TABS_ARG_INDEX_9 = 9;
44 constexpr int32_t SM_COLUMN_NUM = 4;
45 constexpr int32_t MD_COLUMN_NUM = 8;
46 constexpr int32_t LG_COLUMN_NUM = 12;
47 constexpr int32_t DEFAULT_COLUMN = -1;
48 constexpr int REMAINDER = 2;
49 constexpr int TABBARMODE_SCROLLABLE = 1;
50 constexpr int32_t DEFAULT_CUSTOM_ANIMATION_TIMEOUT = 1000;
51 constexpr int ANIMATION_CURVE_TYPE_DEFAULT = 0;
52 constexpr int ANIMATION_CURVE_TYPE_STR = 1;
53 constexpr int ANIMATION_CURVE_TYPE_FUNC = 2;
54 namespace {
GetAnimationCurveInfo(ArkUIRuntimeCallInfo * runtimeCallInfo,ArkUI_Uint32 & type,std::string & aniTimFunc,std::function<float (float)> & customCallBack)55 void GetAnimationCurveInfo(ArkUIRuntimeCallInfo* runtimeCallInfo, ArkUI_Uint32& type, std::string& aniTimFunc,
56 std::function<float(float)>& customCallBack)
57 {
58 type = ANIMATION_CURVE_TYPE_DEFAULT;
59 aniTimFunc.clear();
60 customCallBack = nullptr;
61 CHECK_NULL_VOID(runtimeCallInfo);
62 EcmaVM* vm = runtimeCallInfo->GetVM();
63 CHECK_NULL_VOID(vm);
64 Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
65 if (!valueArg->IsObject(vm)) {
66 return;
67 }
68 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
69 auto object = Framework::JSRef<Framework::JSObject>::Cast(info[TABS_ARG_INDEX_1]);
70 Framework::JSRef<Framework::JSVal> onCallBack = object->GetProperty("__curveCustomFunc");
71 if (onCallBack->IsFunction()) {
72 RefPtr<Framework::JsFunction> jsFuncCallBack =
73 AceType::MakeRefPtr<Framework::JsFunction>(Framework::JSRef<Framework::JSObject>(),
74 Framework::JSRef<Framework::JSFunc>::Cast(onCallBack));
75 customCallBack = [func = std::move(jsFuncCallBack), id = Container::CurrentId()](float time) -> float {
76 ContainerScope scope(id);
77 Framework::JSRef<Framework::JSVal> params[1];
78 params[0] = Framework::JSRef<Framework::JSVal>::Make(Framework::ToJSValue(time));
79 auto result = func->ExecuteJS(1, params);
80 auto resultValue = result->IsNumber() ? result->ToNumber<float>() : 1.0f;
81 return resultValue;
82 };
83 }
84 auto jsCurveString = object->GetProperty("__curveString");
85 if (jsCurveString->IsString()) {
86 aniTimFunc = jsCurveString->ToString();
87 if (aniTimFunc == DOM_ANIMATION_TIMING_FUNCTION_CUSTOM && customCallBack) {
88 type = ANIMATION_CURVE_TYPE_FUNC;
89 } else if (aniTimFunc != DOM_ANIMATION_TIMING_FUNCTION_CUSTOM) {
90 type = ANIMATION_CURVE_TYPE_STR;
91 }
92 }
93 }
94 } // namespace
95
SetTabBarMode(ArkUIRuntimeCallInfo * runtimeCallInfo)96 ArkUINativeModuleValue TabsBridge::SetTabBarMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
97 {
98 EcmaVM* vm = runtimeCallInfo->GetVM();
99 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
100 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
101 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
102 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
103 Local<JSValueRef> barModeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
104 Local<JSValueRef> marginArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_2);
105 Local<JSValueRef> nonScrollableLayoutStyleArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_3);
106
107 if (barModeArg->IsNull() || barModeArg->IsUndefined()) {
108 GetArkUINodeModifiers()->getTabsModifier()->resetTabBarMode(nativeNode);
109 return panda::JSValueRef::Undefined(vm);
110 }
111 TabBarMode barMode = TabBarMode::FIXED;
112 barMode = Framework::ConvertStrToTabBarMode(barModeArg->ToString(vm)->ToString(vm));
113 int32_t tabBarMode = static_cast<int32_t>(barMode);
114 GetArkUINodeModifiers()->getTabsModifier()->setTabBarMode(nativeNode, tabBarMode);
115
116 GetArkUINodeModifiers()->getTabsModifier()->createScrollableBarModeOptionsWithResourceObj(nativeNode, nullptr);
117 if (tabBarMode == TABBARMODE_SCROLLABLE) {
118 if (marginArg->IsNull() || marginArg->IsUndefined() || nonScrollableLayoutStyleArg->IsNull() ||
119 nonScrollableLayoutStyleArg->IsUndefined()) {
120 GetArkUINodeModifiers()->getTabsModifier()->resetScrollableBarModeOptions(nativeNode);
121 return panda::JSValueRef::Undefined(vm);
122 }
123 int barModeStyle = nonScrollableLayoutStyleArg->Int32Value(vm);
124 CalcDimension margin(0.0, DimensionUnit::VP);
125 RefPtr<ResourceObject> marginResObj;
126 if (!ArkTSUtils::ParseJsDimensionVp(vm, marginArg, margin, marginResObj)) {
127 margin.Reset();
128 }
129
130 GetArkUINodeModifiers()->getTabsModifier()->setScrollableBarModeOptions(
131 nativeNode, margin.Value(), static_cast<int>(margin.Unit()), barModeStyle);
132 GetArkUINodeModifiers()->getTabsModifier()->createScrollableBarModeOptionsWithResourceObj(
133 nativeNode, AceType::RawPtr(marginResObj));
134 }
135 return panda::JSValueRef::Undefined(vm);
136 }
137
ResetTabBarMode(ArkUIRuntimeCallInfo * runtimeCallInfo)138 ArkUINativeModuleValue TabsBridge::ResetTabBarMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
139 {
140 EcmaVM* vm = runtimeCallInfo->GetVM();
141 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
142 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
143 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
144 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
145 GetArkUINodeModifiers()->getTabsModifier()->resetTabBarMode(nativeNode);
146 return panda::JSValueRef::Undefined(vm);
147 }
148
SetScrollableBarModeOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)149 ArkUINativeModuleValue TabsBridge::SetScrollableBarModeOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
150 {
151 EcmaVM* vm = runtimeCallInfo->GetVM();
152 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
153 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
154 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
155 Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_2);
156 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
157 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
158
159 if (thirdArg->IsUndefined()) {
160 GetArkUINodeModifiers()->getTabsModifier()->resetScrollableBarModeOptions(nativeNode);
161 return panda::JSValueRef::Undefined(vm);
162 }
163 int barModeStyle = thirdArg->Int32Value(vm);
164
165 CalcDimension margin(0.0, DimensionUnit::VP);
166 RefPtr<ResourceObject> marginResObj;
167 if (!ArkTSUtils::ParseJsDimensionVp(vm, secondArg, margin, marginResObj)) {
168 margin.Reset();
169 }
170
171 GetArkUINodeModifiers()->getTabsModifier()->setScrollableBarModeOptions(
172 nativeNode, margin.Value(), static_cast<int>(margin.Unit()), barModeStyle);
173 GetArkUINodeModifiers()->getTabsModifier()->createScrollableBarModeOptionsWithResourceObj(
174 nativeNode, AceType::RawPtr(marginResObj));
175 return panda::JSValueRef::Undefined(vm);
176 }
177
ResetScrollableBarModeOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)178 ArkUINativeModuleValue TabsBridge::ResetScrollableBarModeOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
179 {
180 EcmaVM* vm = runtimeCallInfo->GetVM();
181 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
182 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
183 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
184 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
185 GetArkUINodeModifiers()->getTabsModifier()->resetScrollableBarModeOptions(nativeNode);
186 return panda::JSValueRef::Undefined(vm);
187 }
188
SetBarGridAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)189 ArkUINativeModuleValue TabsBridge::SetBarGridAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
190 {
191 EcmaVM* vm = runtimeCallInfo->GetVM();
192 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
193 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
194 Local<JSValueRef> smArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
195 Local<JSValueRef> mdArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_2);
196 Local<JSValueRef> lgArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_3);
197 Local<JSValueRef> gutterArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_4);
198 Local<JSValueRef> marginArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_5);
199 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
200 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
201
202 int32_t sm = DEFAULT_COLUMN;
203 int32_t md = DEFAULT_COLUMN;
204 int32_t lg = DEFAULT_COLUMN;
205 if (smArg->IsNumber() && smArg->Int32Value(vm) >= 0 && smArg->Int32Value(vm) <= SM_COLUMN_NUM &&
206 smArg->Int32Value(vm) % REMAINDER == 0) {
207 sm = smArg->Int32Value(vm);
208 }
209 if (mdArg->IsNumber() && mdArg->Int32Value(vm) >= 0 && mdArg->Int32Value(vm) <= MD_COLUMN_NUM &&
210 mdArg->Int32Value(vm) % REMAINDER == 0) {
211 md = mdArg->Int32Value(vm);
212 }
213 if (lgArg->IsNumber() && lgArg->Int32Value(vm) >= 0 && lgArg->Int32Value(vm) <= LG_COLUMN_NUM &&
214 lgArg->Int32Value(vm) % REMAINDER == 0) {
215 lg = lgArg->Int32Value(vm);
216 }
217
218 CalcDimension columnGutter;
219 CalcDimension columnMargin;
220 RefPtr<ResourceObject> columnGutterResObj;
221 RefPtr<ResourceObject> columnMarginResObj;
222 if (!ArkTSUtils::ParseJsDimensionVp(vm, gutterArg, columnGutter, columnGutterResObj) ||
223 !NonNegative(columnGutter.Value()) ||
224 columnGutter.Unit() == DimensionUnit::PERCENT) {
225 columnGutter.Reset();
226 }
227 if (!ArkTSUtils::ParseJsDimensionVp(vm, marginArg, columnMargin, columnMarginResObj) ||
228 !NonNegative(columnMargin.Value()) ||
229 columnMargin.Unit() == DimensionUnit::PERCENT) {
230 columnMargin.Reset();
231 }
232
233 ArkUI_Float32 values[SIZE_OF_VALUES] = { static_cast<ArkUI_Float32>(columnGutter.Value()),
234 static_cast<ArkUI_Float32>(columnMargin.Value()) };
235 int unitsAndColumn[SIZE_OF_FIVE] = { static_cast<int>(columnGutter.Unit()), static_cast<int>(columnMargin.Unit()),
236 sm, md, lg };
237
238 GetArkUINodeModifiers()->getTabsModifier()->setBarGridAlign(
239 nativeNode, values, SIZE_OF_VALUES, unitsAndColumn, SIZE_OF_FIVE);
240 GetArkUINodeModifiers()->getTabsModifier()->createBarGridAlignWithResourceObj(
241 nativeNode, AceType::RawPtr(columnGutterResObj), AceType::RawPtr(columnMarginResObj));
242 return panda::JSValueRef::Undefined(vm);
243 }
244
ResetBarGridAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)245 ArkUINativeModuleValue TabsBridge::ResetBarGridAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
246 {
247 EcmaVM* vm = runtimeCallInfo->GetVM();
248 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
249 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
250 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
251 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
252 GetArkUINodeModifiers()->getTabsModifier()->resetBarGridAlign(nativeNode);
253 return panda::JSValueRef::Undefined(vm);
254 }
255
SetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)256 ArkUINativeModuleValue TabsBridge::SetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
257 {
258 EcmaVM* vm = runtimeCallInfo->GetVM();
259 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
260 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
261 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
262 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
263 Local<JSValueRef> dividerStrokeWidthArgs = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
264 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_2);
265 Local<JSValueRef> dividerStartMarginArgs = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_3);
266 Local<JSValueRef> dividerEndMarginArgs = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_4);
267 auto isDividerStrokeWidthArgsInvalid = dividerStrokeWidthArgs->IsNull() || dividerStrokeWidthArgs->IsUndefined();
268 auto isDividerStartMarginArgsInvalid = dividerStartMarginArgs->IsNull() || dividerStartMarginArgs->IsUndefined();
269 auto isDividerEndMarginArgsInvalid = dividerEndMarginArgs->IsNull() || dividerEndMarginArgs->IsUndefined();
270 auto isColorArgInvalid = colorArg->IsNull() || colorArg->IsUndefined();
271 if (isDividerStrokeWidthArgsInvalid && isDividerStartMarginArgsInvalid && isDividerEndMarginArgsInvalid &&
272 isColorArgInvalid) {
273 GetArkUINodeModifiers()->getTabsModifier()->resetDivider(nativeNode);
274 return panda::JSValueRef::Undefined(vm);
275 }
276
277 CalcDimension dividerStrokeWidth;
278 CalcDimension dividerStartMargin;
279 CalcDimension dividerEndMargin;
280 uint32_t color;
281 auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
282 CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
283 auto context = frameNode->GetContext();
284 CHECK_NULL_RETURN(context, panda::NativePointerRef::New(vm, nullptr));
285 auto themeManager = context->GetThemeManager();
286 CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
287 auto tabTheme = themeManager->GetTheme<TabTheme>();
288 CHECK_NULL_RETURN(tabTheme, panda::NativePointerRef::New(vm, nullptr));
289
290 RefPtr<ResourceObject> strokeWidthResObj;
291 RefPtr<ResourceObject> colorResObj;
292 RefPtr<ResourceObject> startMarginResObj;
293 RefPtr<ResourceObject> endMarginResObj;
294 if (isDividerStrokeWidthArgsInvalid ||
295 !ArkTSUtils::ParseJsDimensionVp(vm, dividerStrokeWidthArgs, dividerStrokeWidth, strokeWidthResObj) ||
296 LessNotEqual(dividerStrokeWidth.Value(), 0.0f) || dividerStrokeWidth.Unit() == DimensionUnit::PERCENT) {
297 dividerStrokeWidth.Reset();
298 }
299 Color colorObj;
300 auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
301 if (isColorArgInvalid || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, colorObj, colorResObj, nodeInfo)) {
302 color = tabTheme->GetDividerColor().GetValue();
303 GetArkUINodeModifiers()->getTabsModifier()->setDividerColorByUser(nativeNode, false);
304 } else {
305 color = colorObj.GetValue();
306 GetArkUINodeModifiers()->getTabsModifier()->setDividerColorByUser(nativeNode, true);
307 }
308 if (isDividerStartMarginArgsInvalid ||
309 !ArkTSUtils::ParseJsDimensionVp(vm, dividerStartMarginArgs, dividerStartMargin, startMarginResObj) ||
310 LessNotEqual(dividerStartMargin.Value(), 0.0f) || dividerStartMargin.Unit() == DimensionUnit::PERCENT) {
311 dividerStartMargin.Reset();
312 }
313 if (isDividerEndMarginArgsInvalid ||
314 !ArkTSUtils::ParseJsDimensionVp(vm, dividerEndMarginArgs, dividerEndMargin, endMarginResObj) ||
315 LessNotEqual(dividerEndMargin.Value(), 0.0f) || dividerEndMargin.Unit() == DimensionUnit::PERCENT) {
316 dividerEndMargin.Reset();
317 }
318 uint32_t size = SIZE_OF_THREE;
319 ArkUI_Float32 values[size];
320 int32_t units[size];
321 values[TABS_ARG_INDEX_0] = static_cast<ArkUI_Float32>(dividerStrokeWidth.Value());
322 values[TABS_ARG_INDEX_1] = static_cast<ArkUI_Float32>(dividerStartMargin.Value());
323 values[TABS_ARG_INDEX_2] = static_cast<ArkUI_Float32>(dividerEndMargin.Value());
324 units[TABS_ARG_INDEX_0] = static_cast<int32_t>(dividerStrokeWidth.Unit());
325 units[TABS_ARG_INDEX_1] = static_cast<int32_t>(dividerStartMargin.Unit());
326 units[TABS_ARG_INDEX_2] = static_cast<int32_t>(dividerEndMargin.Unit());
327 GetArkUINodeModifiers()->getTabsModifier()->setDivider(nativeNode, color, values, units, size);
328 GetArkUINodeModifiers()->getTabsModifier()->createDividerWithResourceObj(nativeNode,
329 AceType::RawPtr(strokeWidthResObj), AceType::RawPtr(colorResObj), AceType::RawPtr(startMarginResObj),
330 AceType::RawPtr(endMarginResObj));
331 return panda::JSValueRef::Undefined(vm);
332 }
333
ResetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)334 ArkUINativeModuleValue TabsBridge::ResetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
335 {
336 EcmaVM* vm = runtimeCallInfo->GetVM();
337 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
338 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
339 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
340 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
341 GetArkUINodeModifiers()->getTabsModifier()->resetDivider(nativeNode);
342 return panda::JSValueRef::Undefined(vm);
343 }
344
SetFadingEdge(ArkUIRuntimeCallInfo * runtimeCallInfo)345 ArkUINativeModuleValue TabsBridge::SetFadingEdge(ArkUIRuntimeCallInfo* runtimeCallInfo)
346 {
347 EcmaVM* vm = runtimeCallInfo->GetVM();
348 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
349 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
350 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
351 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
352 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
353 if (secondArg->IsUndefined() || secondArg->IsNull()) {
354 GetArkUINodeModifiers()->getTabsModifier()->resetFadingEdge(nativeNode);
355 return panda::JSValueRef::Undefined(vm);
356 }
357 bool fadingEdge = secondArg->ToBoolean(vm)->Value();
358 GetArkUINodeModifiers()->getTabsModifier()->setFadingEdge(nativeNode, fadingEdge);
359 return panda::JSValueRef::Undefined(vm);
360 }
361
ResetFadingEdge(ArkUIRuntimeCallInfo * runtimeCallInfo)362 ArkUINativeModuleValue TabsBridge::ResetFadingEdge(ArkUIRuntimeCallInfo* runtimeCallInfo)
363 {
364 EcmaVM* vm = runtimeCallInfo->GetVM();
365 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
366 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
367 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
368 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
369 GetArkUINodeModifiers()->getTabsModifier()->resetFadingEdge(nativeNode);
370 return panda::JSValueRef::Undefined(vm);
371 }
372
SetTabOnUnselected(ArkUIRuntimeCallInfo * runtimeCallInfo)373 ArkUINativeModuleValue TabsBridge::SetTabOnUnselected(ArkUIRuntimeCallInfo* runtimeCallInfo)
374 {
375 EcmaVM* vm = runtimeCallInfo->GetVM();
376 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
377 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
378 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
379 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
380 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
381 GetArkUINodeModifiers()->getTabsModifier()->resetTabOnUnselected(nativeNode);
382 return panda::JSValueRef::Undefined(vm);
383 }
384 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
385 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
386 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
387 std::function<void(const BaseEventInfo* info)> callback =
388 [vm, frameNode, func = panda::CopyableGlobal(vm, func)](const BaseEventInfo* info) {
389 panda::LocalScope pandaScope(vm);
390 panda::TryCatch trycatch(vm);
391 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
392 const auto* tabsInfo = TypeInfoHelper::DynamicCast<TabContentChangeEvent>(info);
393 if (!tabsInfo) {
394 TAG_LOGW(AceLogTag::ACE_TABS, "Tabs OnUnselected callback execute failed.");
395 return;
396 }
397 panda::Local<panda::NumberRef> indexParam = panda::NumberRef::New(vm, tabsInfo->GetIndex());
398 panda::Local<panda::JSValueRef> params[1] = { indexParam }; // 1: Array length
399 func->Call(vm, func.ToLocal(), params, 1); // 1: Array length
400 };
401 GetArkUINodeModifiers()->getTabsModifier()->setTabOnUnselected(nativeNode, reinterpret_cast<void*>(&callback));
402 return panda::JSValueRef::Undefined(vm);
403 }
404
ResetTabOnUnselected(ArkUIRuntimeCallInfo * runtimeCallInfo)405 ArkUINativeModuleValue TabsBridge::ResetTabOnUnselected(ArkUIRuntimeCallInfo* runtimeCallInfo)
406 {
407 EcmaVM* vm = runtimeCallInfo->GetVM();
408 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
409 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
410 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
411 GetArkUINodeModifiers()->getTabsModifier()->resetTabOnUnselected(nativeNode);
412 return panda::JSValueRef::Undefined(vm);
413 }
414
SetBarBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)415 ArkUINativeModuleValue TabsBridge::SetBarBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
416 {
417 EcmaVM* vm = runtimeCallInfo->GetVM();
418 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
419 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
420 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
421 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
422 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
423 Color color;
424 RefPtr<ResourceObject> backgroundColorResObj;
425 auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
426 if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color, backgroundColorResObj, nodeInfo)) {
427 GetArkUINodeModifiers()->getTabsModifier()->resetBarBackgroundColor(nativeNode);
428 } else {
429 GetArkUINodeModifiers()->getTabsModifier()->setBarBackgroundColor(nativeNode, color.GetValue());
430 auto bgColorRawPtr = AceType::RawPtr(backgroundColorResObj);
431 GetArkUINodeModifiers()->getTabsModifier()->createBarBackgroundColorWithResourceObj(nativeNode, bgColorRawPtr);
432 }
433 return panda::JSValueRef::Undefined(vm);
434 }
435
ResetBarBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)436 ArkUINativeModuleValue TabsBridge::ResetBarBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
437 {
438 EcmaVM* vm = runtimeCallInfo->GetVM();
439 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
440 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
441 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
442 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
443 GetArkUINodeModifiers()->getTabsModifier()->resetBarBackgroundColor(nativeNode);
444 return panda::JSValueRef::Undefined(vm);
445 }
446
ParseJsInt32(const EcmaVM * vm,const Local<JSValueRef> & value,int32_t & result)447 bool ParseJsInt32(const EcmaVM *vm, const Local<JSValueRef> &value, int32_t &result)
448 {
449 if (value->IsNumber()) {
450 result = value->Int32Value(vm);
451 return true;
452 }
453 if (value->IsString(vm)) {
454 result = StringUtils::StringToInt(value->ToString(vm)->ToString(vm));
455 return true;
456 }
457
458 return false;
459 }
460
SetBarBackgroundBlurStyleParam(ArkUIRuntimeCallInfo * runtimeCallInfo,ArkUI_Bool & isValidColor,Color & inactiveColor,ArkUI_Int32 & policy,ArkUI_Int32 & blurType,ArkUINodeHandle nativeNode)461 RefPtr<ResourceObject> SetBarBackgroundBlurStyleParam(ArkUIRuntimeCallInfo* runtimeCallInfo, ArkUI_Bool& isValidColor,
462 Color& inactiveColor, ArkUI_Int32& policy, ArkUI_Int32& blurType, ArkUINodeHandle nativeNode)
463 {
464 EcmaVM *vm = runtimeCallInfo->GetVM();
465 Local<JSValueRef> policyArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_6);
466 Local<JSValueRef> inactiveColorArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_7);
467 Local<JSValueRef> typeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_8);
468 RefPtr<ResourceObject> inactiveColorResObj;
469 auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
470 if (ArkTSUtils::ParseJsColor(vm, inactiveColorArg, inactiveColor, inactiveColorResObj, nodeInfo)) {
471 isValidColor = true;
472 }
473 ParseJsInt32(vm, policyArg, policy);
474 if (policy < static_cast<int32_t>(BlurStyleActivePolicy::FOLLOWS_WINDOW_ACTIVE_STATE) ||
475 policy > static_cast<int32_t>(BlurStyleActivePolicy::ALWAYS_INACTIVE)) {
476 policy = static_cast<int32_t>(BlurStyleActivePolicy::ALWAYS_ACTIVE);
477 }
478 ParseJsInt32(vm, typeArg, blurType);
479 if (blurType < static_cast<int32_t>(BlurType::WITHIN_WINDOW) ||
480 blurType > static_cast<int32_t>(BlurType::BEHIND_WINDOW)) {
481 blurType = static_cast<int32_t>(BlurType::WITHIN_WINDOW);
482 }
483 return inactiveColorResObj;
484 }
485
SetBarBackgroundBlurStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)486 ArkUINativeModuleValue TabsBridge::SetBarBackgroundBlurStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
487 {
488 EcmaVM* vm = runtimeCallInfo->GetVM();
489 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
490 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
491 Local<JSValueRef> blurStyleArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
492 Local<JSValueRef> colorModeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_2);
493 Local<JSValueRef> adaptiveColorArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_3);
494 Local<JSValueRef> scaleArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_4);
495 Local<JSValueRef> blurOptionsArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_5);
496 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
497 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
498 BlurOption blurOption;
499 ArkUITabBarBackgroundBlurStyle styleOption = { static_cast<int32_t>(BlurStyle::NO_MATERIAL),
500 static_cast<int32_t>(ThemeColorMode::SYSTEM), static_cast<int32_t>(AdaptiveColor::DEFAULT),
501 1.0, blurOption.grayscale.data(), static_cast<ArkUI_Int32>(blurOption.grayscale.size()),
502 static_cast<int32_t>(BlurStyleActivePolicy::ALWAYS_ACTIVE), Color::TRANSPARENT.GetValue(),
503 false, static_cast<int32_t>(BlurType::WITHIN_WINDOW) };
504 if (blurStyleArg->IsNumber()) {
505 styleOption.blurStyle = blurStyleArg->Int32Value(vm);
506 }
507 bool isHasOptions = !(colorModeArg->IsUndefined() && adaptiveColorArg->IsUndefined() && scaleArg->IsUndefined() &&
508 blurOptionsArg->IsUndefined());
509 if (isHasOptions) {
510 ParseJsInt32(vm, colorModeArg, styleOption.colorMode);
511 ParseJsInt32(vm, adaptiveColorArg, styleOption.adaptiveColor);
512 if (scaleArg->IsNumber()) {
513 styleOption.scale = scaleArg->ToNumber(vm)->Value();
514 }
515 if (blurOptionsArg->IsArray(vm)) {
516 Local<panda::ArrayRef> params = static_cast<Local<panda::ArrayRef>>(blurOptionsArg);
517 auto grey1 = params->GetValueAt(vm, blurOptionsArg, 0)->Uint32Value(vm);
518 auto grey2 = params->GetValueAt(vm, blurOptionsArg, 1)->Uint32Value(vm);
519 std::vector<float> greyVec = {0.0f, 0.0f};
520 greyVec[0] = grey1;
521 greyVec[1] = grey2;
522 blurOption.grayscale = greyVec;
523 styleOption.blurValues = blurOption.grayscale.data();
524 styleOption.blurValuesSize = static_cast<ArkUI_Int32>(blurOption.grayscale.size());
525 }
526 }
527 Color inactiveColor = Color::TRANSPARENT;
528 auto inactiveColorResObj = SetBarBackgroundBlurStyleParam(runtimeCallInfo, styleOption.isValidColor, inactiveColor,
529 styleOption.policy, styleOption.blurType, nativeNode);
530 styleOption.inactiveColor = inactiveColor.GetValue();
531 GetArkUINodeModifiers()->getTabsModifier()->setBarBackgroundBlurStyle(nativeNode, &styleOption);
532 GetArkUINodeModifiers()->getTabsModifier()->createBarBackgroundBlurStyleWithResourceObj(nativeNode,
533 AceType::RawPtr(inactiveColorResObj));
534 return panda::JSValueRef::Undefined(vm);
535 }
536
ResetBarBackgroundBlurStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)537 ArkUINativeModuleValue TabsBridge::ResetBarBackgroundBlurStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
538 {
539 EcmaVM* vm = runtimeCallInfo->GetVM();
540 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
541 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
542 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
543 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
544 GetArkUINodeModifiers()->getTabsModifier()->resetBarBackgroundBlurStyle(nativeNode);
545 return panda::JSValueRef::Undefined(vm);
546 }
547
SetBarBackgroundEffectParam(ArkUIRuntimeCallInfo * runtimeCallInfo,ArkUI_Int32 & policy,ArkUI_Int32 & blurType,Color & inactiveColor,ArkUI_Bool & isValidColor,ArkUINodeHandle nativeNode)548 RefPtr<ResourceObject> SetBarBackgroundEffectParam(ArkUIRuntimeCallInfo* runtimeCallInfo, ArkUI_Int32& policy,
549 ArkUI_Int32& blurType, Color& inactiveColor, ArkUI_Bool& isValidColor, ArkUINodeHandle nativeNode)
550 {
551 EcmaVM* vm = runtimeCallInfo->GetVM();
552 Local<JSValueRef> policyArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_7);
553 Local<JSValueRef> inactiveColorArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_8);
554 Local<JSValueRef> typeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_9);
555 ParseJsInt32(vm, policyArg, policy);
556 if (policy < static_cast<int32_t>(BlurStyleActivePolicy::FOLLOWS_WINDOW_ACTIVE_STATE) ||
557 policy > static_cast<int32_t>(BlurStyleActivePolicy::ALWAYS_INACTIVE)) {
558 policy = static_cast<int32_t>(BlurStyleActivePolicy::ALWAYS_ACTIVE);
559 }
560 ParseJsInt32(vm, typeArg, blurType);
561 if (blurType < static_cast<int32_t>(BlurType::WITHIN_WINDOW) ||
562 blurType > static_cast<int32_t>(BlurType::BEHIND_WINDOW)) {
563 blurType = static_cast<int32_t>(BlurType::WITHIN_WINDOW);
564 }
565 RefPtr<ResourceObject> inactiveColorResObj;
566 auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
567 if (ArkTSUtils::ParseJsColor(vm, inactiveColorArg, inactiveColor, inactiveColorResObj, nodeInfo)) {
568 isValidColor = true;
569 }
570 return inactiveColorResObj;
571 }
572
SetAdaptiveColorAndBlurOptionParam(ArkUIRuntimeCallInfo * runtimeCallInfo,AdaptiveColor & adaptiveColor,BlurOption & blurOption)573 void SetAdaptiveColorAndBlurOptionParam(ArkUIRuntimeCallInfo* runtimeCallInfo, AdaptiveColor& adaptiveColor,
574 BlurOption& blurOption)
575 {
576 EcmaVM* vm = runtimeCallInfo->GetVM();
577 Local<JSValueRef> adaptiveColorArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_5);
578 Local<JSValueRef> blurOptionsArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_6);
579 auto adaptiveColorValue = static_cast<int32_t>(AdaptiveColor::DEFAULT);
580 if (adaptiveColorArg->IsNumber()) {
581 adaptiveColorValue = adaptiveColorArg->Int32Value(vm);
582 if (adaptiveColorValue >= static_cast<int32_t>(AdaptiveColor::DEFAULT) &&
583 adaptiveColorValue <= static_cast<int32_t>(AdaptiveColor::AVERAGE)) {
584 adaptiveColor = static_cast<AdaptiveColor>(adaptiveColorValue);
585 }
586 }
587 if (blurOptionsArg->IsArray(vm)) {
588 Local<panda::ArrayRef> params = static_cast<Local<panda::ArrayRef>>(blurOptionsArg);
589 auto grey1 = params->GetValueAt(vm, blurOptionsArg, 0)->Uint32Value(vm);
590 auto grey2 = params->GetValueAt(vm, blurOptionsArg, 1)->Uint32Value(vm);
591 std::vector<float> greyVec = {0.0f, 0.0f};
592 greyVec[0] = grey1;
593 greyVec[1] = grey2;
594 blurOption.grayscale = greyVec;
595 }
596 }
597
SetSaturationAndBrightnessEffectOptionParam(const EcmaVM * vm,const Local<JSValueRef> & saturationArg,const Local<JSValueRef> & brightnessArg,ArkUITabBarBackgroundEffect & effectOption)598 void SetSaturationAndBrightnessEffectOptionParam(const EcmaVM* vm, const Local<JSValueRef>& saturationArg,
599 const Local<JSValueRef>& brightnessArg, ArkUITabBarBackgroundEffect& effectOption)
600 {
601 if (saturationArg->IsNumber()) {
602 effectOption.saturation = saturationArg->ToNumber(vm)->Value();
603 effectOption.saturation = (effectOption.saturation > 0.0f || NearZero(effectOption.saturation)) ?
604 effectOption.saturation : 1.0f;
605 }
606 if (brightnessArg->IsNumber()) {
607 effectOption.brightness = brightnessArg->ToNumber(vm)->Value();
608 effectOption.brightness = (effectOption.brightness > 0.0f || NearZero(effectOption.brightness)) ?
609 effectOption.brightness : 1.0f;
610 }
611 }
612
SetBarBackgroundEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)613 ArkUINativeModuleValue TabsBridge::SetBarBackgroundEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
614 {
615 EcmaVM* vm = runtimeCallInfo->GetVM();
616 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
617 Local<JSValueRef> frameNodeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
618 Local<JSValueRef> radiusArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
619 Local<JSValueRef> saturationArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_2);
620 Local<JSValueRef> brightnessArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_3);
621 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_4);
622 CHECK_NULL_RETURN(frameNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
623 auto nativeNode = nodePtr(frameNodeArg->ToNativePointer(vm)->Value());
624 BlurOption blurOption;
625 ArkUITabBarBackgroundEffect effectOption = { 0.0f, 1.0f, 1.0f, Color::TRANSPARENT.GetValue(),
626 static_cast<int32_t>(AdaptiveColor::DEFAULT), blurOption.grayscale.data(),
627 static_cast<int32_t>(blurOption.grayscale.size()),
628 static_cast<int32_t>(BlurStyleActivePolicy::ALWAYS_ACTIVE), static_cast<int32_t>(BlurType::WITHIN_WINDOW),
629 static_cast<ArkUI_Bool>(Color::TRANSPARENT.GetValue()), false };
630 CalcDimension radius;
631 if (!ArkTSUtils::ParseJsDimensionVp(vm, radiusArg, radius) || LessNotEqual(radius.Value(), 0.0f)) {
632 radius.SetValue(0.0f);
633 }
634 effectOption.radius = static_cast<ArkUI_Float32>(radius.Value());
635 SetSaturationAndBrightnessEffectOptionParam(vm, saturationArg, brightnessArg, effectOption);
636 RefPtr<ResourceObject> colorResObj;
637 Color color = Color::TRANSPARENT;
638 auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
639 if (!ArkTSUtils::ParseJsColor(vm, colorArg, color, colorResObj, nodeInfo)) {
640 color.SetValue(Color::TRANSPARENT.GetValue());
641 }
642 effectOption.color = color.GetValue();
643 auto adaptiveColor = AdaptiveColor::DEFAULT;
644 SetAdaptiveColorAndBlurOptionParam(runtimeCallInfo, adaptiveColor, blurOption);
645 effectOption.adaptiveColor = static_cast<ArkUI_Int32>(adaptiveColor);
646 effectOption.blurValues = blurOption.grayscale.data();
647 effectOption.blurValuesSize = static_cast<ArkUI_Int32>(blurOption.grayscale.size());
648 Color inactiveColor = Color::TRANSPARENT;
649 auto inactiveColorResObj = SetBarBackgroundEffectParam(runtimeCallInfo, effectOption.policy, effectOption.blurType,
650 inactiveColor, effectOption.isValidColor, nativeNode);
651 effectOption.inactiveColor = inactiveColor.GetValue();
652 GetArkUINodeModifiers()->getTabsModifier()->setBarBackgroundEffect(nativeNode, &effectOption);
653 GetArkUINodeModifiers()->getTabsModifier()->createBarBackgroundEffectWithResourceObj(nativeNode,
654 AceType::RawPtr(colorResObj), AceType::RawPtr(inactiveColorResObj));
655 return panda::JSValueRef::Undefined(vm);
656 }
657
ResetBarBackgroundEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)658 ArkUINativeModuleValue TabsBridge::ResetBarBackgroundEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
659 {
660 EcmaVM* vm = runtimeCallInfo->GetVM();
661 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
662 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
663 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
664 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
665 GetArkUINodeModifiers()->getTabsModifier()->resetBarBackgroundEffect(nativeNode);
666 return panda::JSValueRef::Undefined(vm);
667 }
668
SetBarOverlap(ArkUIRuntimeCallInfo * runtimeCallInfo)669 ArkUINativeModuleValue TabsBridge::SetBarOverlap(ArkUIRuntimeCallInfo* runtimeCallInfo)
670 {
671 EcmaVM* vm = runtimeCallInfo->GetVM();
672 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
673 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
674 Local<JSValueRef> overlapArg = runtimeCallInfo->GetCallArgRef(1);
675 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
676 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
677 if (overlapArg->IsUndefined()) {
678 GetArkUINodeModifiers()->getTabsModifier()->resetBarOverlap(nativeNode);
679 } else {
680 bool overlap = overlapArg->ToBoolean(vm)->Value();
681 GetArkUINodeModifiers()->getTabsModifier()->setBarOverlap(nativeNode, overlap);
682 }
683 return panda::JSValueRef::Undefined(vm);
684 }
685
ResetBarOverlap(ArkUIRuntimeCallInfo * runtimeCallInfo)686 ArkUINativeModuleValue TabsBridge::ResetBarOverlap(ArkUIRuntimeCallInfo* runtimeCallInfo)
687 {
688 EcmaVM* vm = runtimeCallInfo->GetVM();
689 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
690 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
691 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
692 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
693 GetArkUINodeModifiers()->getTabsModifier()->resetBarOverlap(nativeNode);
694 return panda::JSValueRef::Undefined(vm);
695 }
SetIsVertical(ArkUIRuntimeCallInfo * runtimeCallInfo)696 ArkUINativeModuleValue TabsBridge::SetIsVertical(ArkUIRuntimeCallInfo* runtimeCallInfo)
697 {
698 EcmaVM* vm = runtimeCallInfo->GetVM();
699 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
700 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
701 Local<JSValueRef> isVerticalArg = runtimeCallInfo->GetCallArgRef(1);
702 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
703 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
704 if (isVerticalArg->IsNull() || isVerticalArg->IsUndefined()) {
705 GetArkUINodeModifiers()->getTabsModifier()->resetIsVertical(nativeNode);
706 return panda::JSValueRef::Undefined(vm);
707 }
708 bool isVertical = isVerticalArg->ToBoolean(vm)->Value();
709 GetArkUINodeModifiers()->getTabsModifier()->setIsVertical(nativeNode, isVertical);
710 return panda::JSValueRef::Undefined(vm);
711 }
712
ResetIsVertical(ArkUIRuntimeCallInfo * runtimeCallInfo)713 ArkUINativeModuleValue TabsBridge::ResetIsVertical(ArkUIRuntimeCallInfo* runtimeCallInfo)
714 {
715 EcmaVM* vm = runtimeCallInfo->GetVM();
716 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
717 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
718 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
719 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
720 GetArkUINodeModifiers()->getTabsModifier()->resetIsVertical(nativeNode);
721 return panda::JSValueRef::Undefined(vm);
722 }
723
SetTabBarPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)724 ArkUINativeModuleValue TabsBridge::SetTabBarPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
725 {
726 EcmaVM* vm = runtimeCallInfo->GetVM();
727 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
728 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
729 Local<JSValueRef> barValArg = runtimeCallInfo->GetCallArgRef(1);
730 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
731 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
732 if (barValArg->IsNull() || barValArg->IsUndefined()) {
733 GetArkUINodeModifiers()->getTabsModifier()->resetTabBarPosition(nativeNode);
734 } else {
735 int32_t barVal = barValArg->Int32Value(vm);
736 GetArkUINodeModifiers()->getTabsModifier()->setTabBarPosition(nativeNode, barVal);
737 }
738
739 return panda::JSValueRef::Undefined(vm);
740 }
741
ResetTabBarPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)742 ArkUINativeModuleValue TabsBridge::ResetTabBarPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
743 {
744 EcmaVM* vm = runtimeCallInfo->GetVM();
745 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
746 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
747 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
748 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
749 GetArkUINodeModifiers()->getTabsModifier()->resetTabBarPosition(nativeNode);
750 return panda::JSValueRef::Undefined(vm);
751 }
752
SetTabsOptionsIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)753 ArkUINativeModuleValue TabsBridge::SetTabsOptionsIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
754 {
755 EcmaVM* vm = runtimeCallInfo->GetVM();
756 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
757 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
758 Local<JSValueRef> indexValArg = runtimeCallInfo->GetCallArgRef(1);
759 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
760 if (indexValArg->IsNull() || indexValArg->IsUndefined()) {
761 GetArkUINodeModifiers()->getTabsModifier()->resetTabsOptionsIndex(nativeNode);
762 } else {
763 int32_t indexVal = indexValArg->Int32Value(vm);
764 GetArkUINodeModifiers()->getTabsModifier()->setTabsOptionsIndex(nativeNode, indexVal);
765 }
766 return panda::JSValueRef::Undefined(vm);
767 }
768
ResetTabsOptionsIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)769 ArkUINativeModuleValue TabsBridge::ResetTabsOptionsIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
770 {
771 EcmaVM* vm = runtimeCallInfo->GetVM();
772 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
773 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
774 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
775 GetArkUINodeModifiers()->getTabsModifier()->resetTabsOptionsIndex(nativeNode);
776 return panda::JSValueRef::Undefined(vm);
777 }
778
SetTabsOptionsController(ArkUIRuntimeCallInfo * runtimeCallInfo)779 ArkUINativeModuleValue TabsBridge::SetTabsOptionsController(ArkUIRuntimeCallInfo* runtimeCallInfo)
780 {
781 EcmaVM* vm = runtimeCallInfo->GetVM();
782 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
783 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
784 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
785
786 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
787 RefPtr<NG::TabsControllerNG> tabsController = AceType::MakeRefPtr<NG::TabsControllerNG>();
788 if (info[1]->IsObject()) {
789 auto* jsTabsController =
790 Framework::JSRef<Framework::JSObject>::Cast(info[1])->Unwrap<Framework::JSTabsController>();
791 if (jsTabsController) {
792 jsTabsController->SetInstanceId(Container::CurrentId());
793 jsTabsController->SetTabsController(tabsController);
794 }
795 }
796 GetArkUINodeModifiers()->getTabsModifier()->setTabsOptionsController(nativeNode,
797 reinterpret_cast<ArkUINodeHandle>(AceType::RawPtr(tabsController)));
798 return panda::JSValueRef::Undefined(vm);
799 }
800
ResetTabsOptionsController(ArkUIRuntimeCallInfo * runtimeCallInfo)801 ArkUINativeModuleValue TabsBridge::ResetTabsOptionsController(ArkUIRuntimeCallInfo* runtimeCallInfo)
802 {
803 EcmaVM* vm = runtimeCallInfo->GetVM();
804 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
805 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
806 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
807 RefPtr<NG::TabsControllerNG> tabsController = AceType::MakeRefPtr<NG::TabsControllerNG>();
808 GetArkUINodeModifiers()->getTabsModifier()->setTabsOptionsController(nativeNode,
809 reinterpret_cast<ArkUINodeHandle>(AceType::RawPtr(tabsController)));
810 return panda::JSValueRef::Undefined(vm);
811 }
812
SetTabsOptionsBarModifier(ArkUIRuntimeCallInfo * runtimeCallInfo)813 ArkUINativeModuleValue TabsBridge::SetTabsOptionsBarModifier(ArkUIRuntimeCallInfo* runtimeCallInfo)
814 {
815 EcmaVM* vm = runtimeCallInfo->GetVM();
816 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
817 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
818 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
819 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
820 std::function<void(WeakPtr<NG::FrameNode>)> onApply;
821 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
822 Framework::JSTabs::SetBarModifierApply(runtimeCallInfo, onApply, info[1]);
823 GetArkUINodeModifiers()->getTabsModifier()->setTabsOptionsBarModifier(
824 nativeNode, reinterpret_cast<void*>(&onApply));
825 return panda::JSValueRef::Undefined(runtimeCallInfo->GetVM());
826 }
827
ResetTabsOptionsBarModifier(ArkUIRuntimeCallInfo * runtimeCallInfo)828 ArkUINativeModuleValue TabsBridge::ResetTabsOptionsBarModifier(ArkUIRuntimeCallInfo* runtimeCallInfo)
829 {
830 EcmaVM* vm = runtimeCallInfo->GetVM();
831 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
832 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
833 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
834 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
835 GetArkUINodeModifiers()->getTabsModifier()->resetTabsOptionsBarModifier(nativeNode);
836 return panda::JSValueRef::Undefined(vm);
837 }
838
SetScrollable(ArkUIRuntimeCallInfo * runtimeCallInfo)839 ArkUINativeModuleValue TabsBridge::SetScrollable(ArkUIRuntimeCallInfo* runtimeCallInfo)
840 {
841 EcmaVM* vm = runtimeCallInfo->GetVM();
842 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
843 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
844 Local<JSValueRef> scrollableArg = runtimeCallInfo->GetCallArgRef(1);
845 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
846 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
847 ArkUINativeModuleValue undefinedRes = panda::JSValueRef::Undefined(vm);
848
849 if (scrollableArg->IsNull() || scrollableArg->IsUndefined()) {
850 GetArkUINodeModifiers()->getTabsModifier()->resetScrollable(nativeNode);
851 return undefinedRes;
852 }
853
854 bool scrollable = scrollableArg->ToBoolean(vm)->Value();
855 GetArkUINodeModifiers()->getTabsModifier()->setScrollable(nativeNode, scrollable);
856 return undefinedRes;
857 }
858
ResetScrollable(ArkUIRuntimeCallInfo * runtimeCallInfo)859 ArkUINativeModuleValue TabsBridge::ResetScrollable(ArkUIRuntimeCallInfo* runtimeCallInfo)
860 {
861 EcmaVM* vm = runtimeCallInfo->GetVM();
862 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
863 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
864 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
865 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
866 GetArkUINodeModifiers()->getTabsModifier()->resetScrollable(nativeNode);
867 return panda::JSValueRef::Undefined(vm);
868 }
869
SetTabBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)870 ArkUINativeModuleValue TabsBridge::SetTabBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
871 {
872 EcmaVM* vm = runtimeCallInfo->GetVM();
873 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
874 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
875 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
876 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
877 Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
878 CalcDimension width;
879 ArkUINativeModuleValue undefinedRes = panda::JSValueRef::Undefined(vm);
880
881 RefPtr<ResourceObject> widthResObj;
882 if (jsValue->IsNull() || jsValue->IsUndefined() || !ArkTSUtils::ParseJsDimensionVpNG(vm, jsValue, width,
883 widthResObj)) {
884 GetArkUINodeModifiers()->getTabsModifier()->resetTabBarWidth(nativeNode);
885 return undefinedRes;
886 }
887
888 GetArkUINodeModifiers()->getTabsModifier()->setTabBarWidth(
889 nativeNode, width.Value(), static_cast<int>(width.Unit()));
890 auto widthRawPtr = AceType::RawPtr(widthResObj);
891 GetArkUINodeModifiers()->getTabsModifier()->createTabBarWidthWithResourceObj(nativeNode, widthRawPtr);
892 return undefinedRes;
893 }
894
ResetTabBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)895 ArkUINativeModuleValue TabsBridge::ResetTabBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
896 {
897 EcmaVM* vm = runtimeCallInfo->GetVM();
898 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
899 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
900 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
901 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
902 GetArkUINodeModifiers()->getTabsModifier()->resetTabBarWidth(nativeNode);
903 return panda::JSValueRef::Undefined(vm);
904 }
905
SetTabBarHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)906 ArkUINativeModuleValue TabsBridge::SetTabBarHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
907 {
908 EcmaVM* vm = runtimeCallInfo->GetVM();
909 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
910 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
911 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
912 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
913 Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
914 CalcDimension height;
915 ArkUINativeModuleValue undefinedRes = panda::JSValueRef::Undefined(vm);
916
917 RefPtr<ResourceObject> heightResObj;
918 if (jsValue->IsNull() || jsValue->IsUndefined() || !ArkTSUtils::ParseJsDimensionVpNG(vm, jsValue, height,
919 heightResObj)) {
920 GetArkUINodeModifiers()->getTabsModifier()->resetTabBarHeight(nativeNode);
921 return undefinedRes;
922 }
923
924 GetArkUINodeModifiers()->getTabsModifier()->setTabBarHeight(
925 nativeNode, height.Value(), static_cast<int>(height.Unit()));
926 auto heightRawPtr = AceType::RawPtr(heightResObj);
927 GetArkUINodeModifiers()->getTabsModifier()->createTabBarHeightWithResourceObj(nativeNode, heightRawPtr);
928 return undefinedRes;
929 }
930
ResetTabBarHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)931 ArkUINativeModuleValue TabsBridge::ResetTabBarHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
932 {
933 EcmaVM* vm = runtimeCallInfo->GetVM();
934 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
935 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
936 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
937 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
938 GetArkUINodeModifiers()->getTabsModifier()->resetTabBarHeight(nativeNode);
939 return panda::JSValueRef::Undefined(vm);
940 }
941
SetBarAdaptiveHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)942 ArkUINativeModuleValue TabsBridge::SetBarAdaptiveHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
943 {
944 EcmaVM* vm = runtimeCallInfo->GetVM();
945 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
946 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
947 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
948 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
949 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
950 bool value = secondArg->ToBoolean(vm)->Value();
951 GetArkUINodeModifiers()->getTabsModifier()->setBarAdaptiveHeight(nativeNode, value);
952 return panda::JSValueRef::Undefined(vm);
953 }
954
ResetBarAdaptiveHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)955 ArkUINativeModuleValue TabsBridge::ResetBarAdaptiveHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
956 {
957 EcmaVM* vm = runtimeCallInfo->GetVM();
958 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
959 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
960 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
961 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
962 GetArkUINodeModifiers()->getTabsModifier()->resetBarAdaptiveHeight(nativeNode);
963 return panda::JSValueRef::Undefined(vm);
964 }
965
SetAnimationCurve(ArkUIRuntimeCallInfo * runtimeCallInfo)966 ArkUINativeModuleValue TabsBridge::SetAnimationCurve(ArkUIRuntimeCallInfo* runtimeCallInfo)
967 {
968 EcmaVM* vm = runtimeCallInfo->GetVM();
969 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
970 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
971 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
972 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
973 Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
974 if (valueArg->IsString(vm)) {
975 std::string curve = valueArg->ToString(vm)->ToString(vm);
976 GetArkUINodeModifiers()->getTabsModifier()->setAnimationCurve(nativeNode,
977 ANIMATION_CURVE_TYPE_STR, curve.c_str(), nullptr);
978 } else if (valueArg->IsObject(vm)) {
979 ArkUI_Uint32 type = ANIMATION_CURVE_TYPE_DEFAULT;
980 std::string aniTimFunc;
981 std::function<float(float)> customCallBack = nullptr;
982 GetAnimationCurveInfo(runtimeCallInfo, type, aniTimFunc, customCallBack);
983 GetArkUINodeModifiers()->getTabsModifier()->setAnimationCurve(nativeNode,
984 type, aniTimFunc.c_str(), reinterpret_cast<void*>(&customCallBack));
985 } else {
986 GetArkUINodeModifiers()->getTabsModifier()->resetAnimationCurve(nativeNode);
987 }
988 return panda::JSValueRef::Undefined(vm);
989 }
990
ResetAnimationCurve(ArkUIRuntimeCallInfo * runtimeCallInfo)991 ArkUINativeModuleValue TabsBridge::ResetAnimationCurve(ArkUIRuntimeCallInfo* runtimeCallInfo)
992 {
993 EcmaVM* vm = runtimeCallInfo->GetVM();
994 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
995 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
996 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
997 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
998 GetArkUINodeModifiers()->getTabsModifier()->resetAnimationCurve(nativeNode);
999 return panda::JSValueRef::Undefined(vm);
1000 }
1001
SetNoMinHeightLimit(ArkUIRuntimeCallInfo * runtimeCallInfo)1002 ArkUINativeModuleValue TabsBridge::SetNoMinHeightLimit(ArkUIRuntimeCallInfo* runtimeCallInfo)
1003 {
1004 EcmaVM* vm = runtimeCallInfo->GetVM();
1005 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1006 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1007 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1008 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1009 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1010 bool value = secondArg->ToBoolean(vm)->Value();
1011 GetArkUINodeModifiers()->getTabsModifier()->setNoMinHeightLimit(nativeNode, value);
1012 return panda::JSValueRef::Undefined(vm);
1013 }
1014
ResetNoMinHeightLimit(ArkUIRuntimeCallInfo * runtimeCallInfo)1015 ArkUINativeModuleValue TabsBridge::ResetNoMinHeightLimit(ArkUIRuntimeCallInfo* runtimeCallInfo)
1016 {
1017 EcmaVM* vm = runtimeCallInfo->GetVM();
1018 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1019 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1020 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1021 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1022 GetArkUINodeModifiers()->getTabsModifier()->resetNoMinHeightLimit(nativeNode);
1023 return panda::JSValueRef::Undefined(vm);
1024 }
1025
SetAnimationDuration(ArkUIRuntimeCallInfo * runtimeCallInfo)1026 ArkUINativeModuleValue TabsBridge::SetAnimationDuration(ArkUIRuntimeCallInfo* runtimeCallInfo)
1027 {
1028 EcmaVM* vm = runtimeCallInfo->GetVM();
1029 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1030 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1031 Local<JSValueRef> durationArg = runtimeCallInfo->GetCallArgRef(1);
1032 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1033 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1034 if (durationArg->IsNull() || durationArg->IsUndefined()) {
1035 GetArkUINodeModifiers()->getTabsModifier()->resetAnimationDuration(nativeNode);
1036 return panda::JSValueRef::Undefined(vm);
1037 }
1038 float duration = durationArg->ToNumber(vm)->Value();
1039 GetArkUINodeModifiers()->getTabsModifier()->setAnimationDuration(nativeNode, duration);
1040 return panda::JSValueRef::Undefined(vm);
1041 }
1042
ResetAnimationDuration(ArkUIRuntimeCallInfo * runtimeCallInfo)1043 ArkUINativeModuleValue TabsBridge::ResetAnimationDuration(ArkUIRuntimeCallInfo* runtimeCallInfo)
1044 {
1045 EcmaVM* vm = runtimeCallInfo->GetVM();
1046 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1047 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1048 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1049 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1050 GetArkUINodeModifiers()->getTabsModifier()->resetAnimationDuration(nativeNode);
1051 return panda::JSValueRef::Undefined(vm);
1052 }
1053
SetBarPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)1054 ArkUINativeModuleValue TabsBridge::SetBarPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
1055 {
1056 EcmaVM* vm = runtimeCallInfo->GetVM();
1057 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1058 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1059 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1060 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1061 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1062 int32_t barVal = secondArg->ToNumber(vm)->Value();
1063 GetArkUINodeModifiers()->getTabsModifier()->setTabBarPosition(nativeNode, barVal);
1064 return panda::JSValueRef::Undefined(vm);
1065 }
1066
ResetBarPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)1067 ArkUINativeModuleValue TabsBridge::ResetBarPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
1068 {
1069 EcmaVM* vm = runtimeCallInfo->GetVM();
1070 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1071 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1072 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1073 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1074 GetArkUINodeModifiers()->getTabsModifier()->resetTabBarPosition(nativeNode);
1075 return panda::JSValueRef::Undefined(vm);
1076 }
1077
SetTabClip(ArkUIRuntimeCallInfo * runtimeCallInfo)1078 ArkUINativeModuleValue TabsBridge::SetTabClip(ArkUIRuntimeCallInfo* runtimeCallInfo)
1079 {
1080 EcmaVM* vm = runtimeCallInfo->GetVM();
1081 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1082 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1083 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1084 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1085 auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1086
1087 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1088 if (info[TABS_ARG_INDEX_1]->IsUndefined()) {
1089 ViewAbstract::SetClipEdge(frameNode, false);
1090 return panda::JSValueRef::Undefined(vm);
1091 }
1092 if (info[TABS_ARG_INDEX_1]->IsObject()) {
1093 CommonBridge::SetClip(runtimeCallInfo);
1094 } else if (info[TABS_ARG_INDEX_1]->IsBoolean()) {
1095 GetArkUINodeModifiers()->getTabsModifier()->setTabClip(nativeNode, info[TABS_ARG_INDEX_1]->ToBoolean());
1096 }
1097 return panda::JSValueRef::Undefined(vm);
1098 }
1099
ResetTabClip(ArkUIRuntimeCallInfo * runtimeCallInfo)1100 ArkUINativeModuleValue TabsBridge::ResetTabClip(ArkUIRuntimeCallInfo* runtimeCallInfo)
1101 {
1102 EcmaVM* vm = runtimeCallInfo->GetVM();
1103 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1104 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1105 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1106 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1107 GetArkUINodeModifiers()->getTabsModifier()->resetTabClip(nativeNode);
1108 return panda::JSValueRef::Undefined(vm);
1109 }
1110
SetTabEdgeEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)1111 ArkUINativeModuleValue TabsBridge::SetTabEdgeEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
1112 {
1113 EcmaVM* vm = runtimeCallInfo->GetVM();
1114 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1115 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1116 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1117 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1118 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1119
1120 int32_t effect = static_cast<int32_t>(EdgeEffect::SPRING);
1121 if (secondArg->IsUndefined() || secondArg->IsNull()) {
1122 effect = static_cast<int32_t>(EdgeEffect::SPRING);
1123 } else {
1124 effect = secondArg->Int32Value(vm);
1125 }
1126 if (effect < static_cast<int32_t>(EdgeEffect::SPRING) || effect > static_cast<int32_t>(EdgeEffect::NONE)) {
1127 effect = static_cast<int32_t>(EdgeEffect::SPRING);
1128 }
1129 GetArkUINodeModifiers()->getTabsModifier()->setTabEdgeEffect(nativeNode, effect);
1130 return panda::JSValueRef::Undefined(vm);
1131 }
1132
ResetTabEdgeEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)1133 ArkUINativeModuleValue TabsBridge::ResetTabEdgeEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
1134 {
1135 EcmaVM* vm = runtimeCallInfo->GetVM();
1136 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1137 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1138 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1139 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1140 GetArkUINodeModifiers()->getTabsModifier()->resetTabEdgeEffect(nativeNode);
1141 return panda::JSValueRef::Undefined(vm);
1142 }
1143
SetTabPageFlipMode(ArkUIRuntimeCallInfo * runtimeCallInfo)1144 ArkUINativeModuleValue TabsBridge::SetTabPageFlipMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
1145 {
1146 EcmaVM* vm = runtimeCallInfo->GetVM();
1147 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1148 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1149 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1150 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1151 Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);
1152 if (valueArg->IsNumber()) {
1153 int32_t pageFlipMode = valueArg->Int32Value(vm);
1154 GetArkUINodeModifiers()->getTabsModifier()->setTabPageFlipMode(nativeNode, pageFlipMode);
1155 } else {
1156 GetArkUINodeModifiers()->getTabsModifier()->resetTabPageFlipMode(nativeNode);
1157 }
1158 return panda::JSValueRef::Undefined(vm);
1159 }
1160
ResetTabPageFlipMode(ArkUIRuntimeCallInfo * runtimeCallInfo)1161 ArkUINativeModuleValue TabsBridge::ResetTabPageFlipMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
1162 {
1163 EcmaVM* vm = runtimeCallInfo->GetVM();
1164 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1165 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1166 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1167 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1168 GetArkUINodeModifiers()->getTabsModifier()->resetTabPageFlipMode(nativeNode);
1169 return panda::JSValueRef::Undefined(vm);
1170 }
1171
SetWidthAuto(ArkUIRuntimeCallInfo * runtimeCallInfo)1172 ArkUINativeModuleValue TabsBridge::SetWidthAuto(ArkUIRuntimeCallInfo* runtimeCallInfo)
1173 {
1174 EcmaVM* vm = runtimeCallInfo->GetVM();
1175 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1176 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1177 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1178 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1179 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1180
1181 CalcDimension width;
1182 ArkTSUtils::ParseJsDimensionVpNG(vm, secondArg, width);
1183 if (width.Unit() == DimensionUnit::AUTO) {
1184 CommonBridge::SetWidth(runtimeCallInfo);
1185 GetArkUINodeModifiers()->getTabsModifier()->setTabWidthAuto(nativeNode);
1186 return panda::JSValueRef::Undefined(vm);
1187 } else {
1188 CommonBridge::SetWidth(runtimeCallInfo);
1189 GetArkUINodeModifiers()->getTabsModifier()->resetTabWidthAuto(nativeNode);
1190 }
1191 CommonBridge::SetWidth(runtimeCallInfo);
1192 return panda::JSValueRef::Undefined(vm);
1193 }
1194
ResetWidthAuto(ArkUIRuntimeCallInfo * runtimeCallInfo)1195 ArkUINativeModuleValue TabsBridge::ResetWidthAuto(ArkUIRuntimeCallInfo* runtimeCallInfo)
1196 {
1197 CommonBridge::ResetWidth(runtimeCallInfo);
1198 EcmaVM* vm = runtimeCallInfo->GetVM();
1199 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1200 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1201 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1202 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1203 GetArkUINodeModifiers()->getTabsModifier()->resetTabWidthAuto(nativeNode);
1204 return panda::JSValueRef::Undefined(vm);
1205 }
1206
SetHeightAuto(ArkUIRuntimeCallInfo * runtimeCallInfo)1207 ArkUINativeModuleValue TabsBridge::SetHeightAuto(ArkUIRuntimeCallInfo* runtimeCallInfo)
1208 {
1209 EcmaVM* vm = runtimeCallInfo->GetVM();
1210 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1211 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1212 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1213 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1214 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1215
1216 CalcDimension height;
1217 ArkTSUtils::ParseJsDimensionVpNG(vm, secondArg, height);
1218 if (height.Unit() == DimensionUnit::AUTO) {
1219 CommonBridge::SetHeight(runtimeCallInfo);
1220 GetArkUINodeModifiers()->getTabsModifier()->setTabHeightAuto(nativeNode);
1221 return panda::JSValueRef::Undefined(vm);
1222 } else {
1223 CommonBridge::SetHeight(runtimeCallInfo);
1224 GetArkUINodeModifiers()->getTabsModifier()->resetTabHeightAuto(nativeNode);
1225 }
1226 CommonBridge::SetHeight(runtimeCallInfo);
1227 return panda::JSValueRef::Undefined(vm);
1228 }
1229
ResetHeightAuto(ArkUIRuntimeCallInfo * runtimeCallInfo)1230 ArkUINativeModuleValue TabsBridge::ResetHeightAuto(ArkUIRuntimeCallInfo* runtimeCallInfo)
1231 {
1232 CommonBridge::ResetHeight(runtimeCallInfo);
1233 EcmaVM* vm = runtimeCallInfo->GetVM();
1234 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1235 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1236 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1237 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1238 GetArkUINodeModifiers()->getTabsModifier()->resetTabHeightAuto(nativeNode);
1239 return panda::JSValueRef::Undefined(vm);
1240 }
1241
SetAnimateMode(ArkUIRuntimeCallInfo * runtimeCallInfo)1242 ArkUINativeModuleValue TabsBridge::SetAnimateMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
1243 {
1244 EcmaVM* vm = runtimeCallInfo->GetVM();
1245 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1246 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1247 Local<JSValueRef> animateModeArg = runtimeCallInfo->GetCallArgRef(1);
1248 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1249 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1250 if (!animateModeArg->IsNumber()) {
1251 GetArkUINodeModifiers()->getTabsModifier()->resetAnimateMode(nativeNode);
1252 return panda::JSValueRef::Undefined(vm);
1253 }
1254 uint32_t animateModeValue = animateModeArg->Uint32Value(vm);
1255 if (animateModeValue >= static_cast<uint32_t>(TabAnimateMode::MAX_VALUE)) {
1256 GetArkUINodeModifiers()->getTabsModifier()->resetAnimateMode(nativeNode);
1257 return panda::JSValueRef::Undefined(vm);
1258 }
1259 GetArkUINodeModifiers()->getTabsModifier()->setAnimateMode(nativeNode, animateModeValue);
1260 return panda::JSValueRef::Undefined(vm);
1261 }
1262
ResetAnimateMode(ArkUIRuntimeCallInfo * runtimeCallInfo)1263 ArkUINativeModuleValue TabsBridge::ResetAnimateMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
1264 {
1265 EcmaVM* vm = runtimeCallInfo->GetVM();
1266 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1267 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1268 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1269 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1270 GetArkUINodeModifiers()->getTabsModifier()->resetAnimateMode(nativeNode);
1271 return panda::JSValueRef::Undefined(vm);
1272 }
1273
SetTabsOnSelected(ArkUIRuntimeCallInfo * runtimeCallInfo)1274 ArkUINativeModuleValue TabsBridge::SetTabsOnSelected(ArkUIRuntimeCallInfo* runtimeCallInfo)
1275 {
1276 EcmaVM* vm = runtimeCallInfo->GetVM();
1277 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1278 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1279 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
1280 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1281 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1282 GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnSelected(nativeNode);
1283 return panda::JSValueRef::Undefined(vm);
1284 }
1285 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1286 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1287 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1288 std::function<void(const BaseEventInfo* info)> callback =
1289 [vm, frameNode, func = panda::CopyableGlobal(vm, func)](const BaseEventInfo* info) {
1290 panda::LocalScope pandaScope(vm);
1291 panda::TryCatch trycatch(vm);
1292 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1293 const auto* tabsInfo = TypeInfoHelper::DynamicCast<TabContentChangeEvent>(info);
1294 if (!tabsInfo) {
1295 TAG_LOGW(AceLogTag::ACE_TABS, "Tabs onSelected callback execute failed.");
1296 return;
1297 }
1298 panda::Local<panda::NumberRef> indexParam = panda::NumberRef::New(vm, tabsInfo->GetIndex());
1299 panda::Local<panda::JSValueRef> params[1] = { indexParam }; // 1: Array length
1300 func->Call(vm, func.ToLocal(), params, 1); // 1: Array length
1301 };
1302 GetArkUINodeModifiers()->getTabsModifier()->setTabsOnSelected(nativeNode, reinterpret_cast<void*>(&callback));
1303 return panda::JSValueRef::Undefined(vm);
1304 }
1305
ResetTabsOnSelected(ArkUIRuntimeCallInfo * runtimeCallInfo)1306 ArkUINativeModuleValue TabsBridge::ResetTabsOnSelected(ArkUIRuntimeCallInfo* runtimeCallInfo)
1307 {
1308 EcmaVM* vm = runtimeCallInfo->GetVM();
1309 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1310 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1311 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1312 GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnSelected(nativeNode);
1313 return panda::JSValueRef::Undefined(vm);
1314 }
1315
SetCachedMaxCount(ArkUIRuntimeCallInfo * runtimeCallInfo)1316 ArkUINativeModuleValue TabsBridge::SetCachedMaxCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
1317 {
1318 EcmaVM* vm = runtimeCallInfo->GetVM();
1319 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1320 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1321 Local<JSValueRef> countArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
1322 Local<JSValueRef> modeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_2);
1323 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1324 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1325
1326 int32_t count = 0;
1327 if (countArg->IsNumber() && countArg->Int32Value(vm) >= 0) {
1328 count = countArg->Int32Value(vm);
1329 } else {
1330 GetArkUINodeModifiers()->getTabsModifier()->resetCachedMaxCount(nativeNode);
1331 return panda::JSValueRef::Undefined(vm);
1332 }
1333 int32_t mode = 0;
1334 if (modeArg->IsNumber()) {
1335 mode = modeArg->Int32Value(vm);
1336 }
1337 GetArkUINodeModifiers()->getTabsModifier()->setCachedMaxCount(nativeNode, count, mode);
1338 return panda::JSValueRef::Undefined(vm);
1339 }
1340
ResetCachedMaxCount(ArkUIRuntimeCallInfo * runtimeCallInfo)1341 ArkUINativeModuleValue TabsBridge::ResetCachedMaxCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
1342 {
1343 EcmaVM* vm = runtimeCallInfo->GetVM();
1344 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1345 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1346 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1347 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1348 GetArkUINodeModifiers()->getTabsModifier()->resetCachedMaxCount(nativeNode);
1349 return panda::JSValueRef::Undefined(vm);
1350 }
SetTabsOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1351 ArkUINativeModuleValue TabsBridge::SetTabsOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1352 {
1353 EcmaVM* vm = runtimeCallInfo->GetVM();
1354 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1355 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1356 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
1357 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1358 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1359 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1360 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1361 GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnChange(nativeNode);
1362 return panda::JSValueRef::Undefined(vm);
1363 }
1364 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1365
1366 std::function<void(const BaseEventInfo* info)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
1367 const BaseEventInfo* info) {
1368 panda::LocalScope pandaScope(vm);
1369 panda::TryCatch trycatch(vm);
1370 const auto* tabsInfo = TypeInfoHelper::DynamicCast<TabContentChangeEvent>(info);
1371 if (!tabsInfo) {
1372 TAG_LOGW(AceLogTag::ACE_TABS, "Tabs onChange callback execute failed.");
1373 return;
1374 }
1375 ACE_SCORING_EVENT("Tabs.onChange");
1376 ACE_SCOPED_TRACE("Tabs.onChange index %d", tabsInfo->GetIndex());
1377 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1378 panda::Local<panda::JSValueRef> params[1] = { panda::NumberRef::New(vm, tabsInfo->GetIndex()) };
1379 func->Call(vm, func.ToLocal(), params, 1);
1380 };
1381 GetArkUINodeModifiers()->getTabsModifier()->setTabsOnChange(nativeNode, reinterpret_cast<void*>(&callback));
1382 return panda::JSValueRef::Undefined(vm);
1383 }
1384
ResetTabsOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1385 ArkUINativeModuleValue TabsBridge::ResetTabsOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1386 {
1387 EcmaVM* vm = runtimeCallInfo->GetVM();
1388 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1389 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1390 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1391 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1392 GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnChange(nativeNode);
1393 return panda::JSValueRef::Undefined(vm);
1394 }
1395
SetTabsOnTabBarClick(ArkUIRuntimeCallInfo * runtimeCallInfo)1396 ArkUINativeModuleValue TabsBridge::SetTabsOnTabBarClick(ArkUIRuntimeCallInfo* runtimeCallInfo)
1397 {
1398 EcmaVM* vm = runtimeCallInfo->GetVM();
1399 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1400 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1401 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
1402 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1403 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1404 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1405 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1406 GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnTabBarClick(nativeNode);
1407 return panda::JSValueRef::Undefined(vm);
1408 }
1409 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1410
1411 std::function<void(const BaseEventInfo* info)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
1412 const BaseEventInfo* info) {
1413 panda::LocalScope pandaScope(vm);
1414 panda::TryCatch trycatch(vm);
1415 const auto* tabsInfo = TypeInfoHelper::DynamicCast<TabContentChangeEvent>(info);
1416 if (!tabsInfo) {
1417 TAG_LOGW(AceLogTag::ACE_TABS, "Tabs onTabBarClick callback execute failed.");
1418 return;
1419 }
1420 ACE_SCORING_EVENT("Tabs.onTabBarClick");
1421 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1422 panda::Local<panda::JSValueRef> params[1] = { panda::NumberRef::New(vm, tabsInfo->GetIndex()) };
1423 func->Call(vm, func.ToLocal(), params, 1);
1424 };
1425 GetArkUINodeModifiers()->getTabsModifier()->setTabsOnTabBarClick(nativeNode, reinterpret_cast<void*>(&callback));
1426 return panda::JSValueRef::Undefined(vm);
1427 }
1428
ResetTabsOnTabBarClick(ArkUIRuntimeCallInfo * runtimeCallInfo)1429 ArkUINativeModuleValue TabsBridge::ResetTabsOnTabBarClick(ArkUIRuntimeCallInfo* runtimeCallInfo)
1430 {
1431 EcmaVM* vm = runtimeCallInfo->GetVM();
1432 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1433 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1434 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1435 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1436 GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnTabBarClick(nativeNode);
1437 return panda::JSValueRef::Undefined(vm);
1438 }
1439
SetTabsOnAnimationStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1440 ArkUINativeModuleValue TabsBridge::SetTabsOnAnimationStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1441 {
1442 EcmaVM* vm = runtimeCallInfo->GetVM();
1443 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1444 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1445 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1446 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1447 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1448 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1449 GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnAnimationStart(nativeNode);
1450 return panda::JSValueRef::Undefined(vm);
1451 }
1452 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1453 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1454 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1455
1456 std::function<void(int32_t, int32_t, const AnimationCallbackInfo&)> callback =
1457 [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
1458 int32_t index, int32_t targetIndex, const AnimationCallbackInfo& extraInfo) {
1459 panda::LocalScope pandaScope(vm);
1460 panda::TryCatch trycatch(vm);
1461 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1462 panda::Local<panda::NumberRef> indexParam = panda::NumberRef::New(vm, index);
1463 panda::Local<panda::NumberRef> targetIndexParam = panda::NumberRef::New(vm, targetIndex);
1464 const char* keys[] = { "currentOffset", "targetOffset", "velocity" };
1465 Local<JSValueRef> values[] = { panda::NumberRef::New(vm, extraInfo.currentOffset.value_or(0.0f)),
1466 panda::NumberRef::New(vm, extraInfo.targetOffset.value_or(0.0f)),
1467 panda::NumberRef::New(vm, extraInfo.velocity.value_or(0.0f)) };
1468 auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1469 panda::Local<panda::JSValueRef> params[3] = { indexParam, targetIndexParam,
1470 eventObject }; // 3: Array length
1471 func->Call(vm, func.ToLocal(), params, 3); // 3: Array length
1472 };
1473 GetArkUINodeModifiers()->getTabsModifier()->setTabsOnAnimationStart(nativeNode, reinterpret_cast<void*>(&callback));
1474 return panda::JSValueRef::Undefined(vm);
1475 }
ResetTabsOnAnimationStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1476 ArkUINativeModuleValue TabsBridge::ResetTabsOnAnimationStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1477 {
1478 EcmaVM* vm = runtimeCallInfo->GetVM();
1479 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1480 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1481 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1482 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1483 GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnAnimationStart(nativeNode);
1484 return panda::JSValueRef::Undefined(vm);
1485 }
1486
SetTabsOnAnimationEnd(ArkUIRuntimeCallInfo * runtimeCallInfo)1487 ArkUINativeModuleValue TabsBridge::SetTabsOnAnimationEnd(ArkUIRuntimeCallInfo* runtimeCallInfo)
1488 {
1489 EcmaVM* vm = runtimeCallInfo->GetVM();
1490 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1491 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1492 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1493 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1494 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1495 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1496 GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnAnimationEnd(nativeNode);
1497 return panda::JSValueRef::Undefined(vm);
1498 }
1499 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1500 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1501 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1502 std::function<void(int32_t, const AnimationCallbackInfo&)> callback =
1503 [vm, frameNode, func = panda::CopyableGlobal(vm, func)](int32_t index, const AnimationCallbackInfo& extraInfo) {
1504 panda::LocalScope pandaScope(vm);
1505 panda::TryCatch trycatch(vm);
1506 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1507 panda::Local<panda::NumberRef> indexParam = panda::NumberRef::New(vm, index);
1508 const char* keys[] = { "currentOffset", "targetOffset", "velocity" };
1509 Local<JSValueRef> values[] = { panda::NumberRef::New(vm, extraInfo.currentOffset.value_or(0.0f)),
1510 panda::NumberRef::New(vm, 0), panda::NumberRef::New(vm, 0) };
1511 auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1512 panda::Local<panda::JSValueRef> params[2] = { indexParam, eventObject }; // 2: Array length
1513 func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
1514 };
1515 GetArkUINodeModifiers()->getTabsModifier()->setTabsOnAnimationEnd(nativeNode, reinterpret_cast<void*>(&callback));
1516 return panda::JSValueRef::Undefined(vm);
1517 }
1518
ResetTabsOnAnimationEnd(ArkUIRuntimeCallInfo * runtimeCallInfo)1519 ArkUINativeModuleValue TabsBridge::ResetTabsOnAnimationEnd(ArkUIRuntimeCallInfo* runtimeCallInfo)
1520 {
1521 EcmaVM* vm = runtimeCallInfo->GetVM();
1522 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1523 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1524 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1525 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1526 GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnAnimationEnd(nativeNode);
1527 return panda::JSValueRef::Undefined(vm);
1528 }
1529
SetTabsOnGestureSwipe(ArkUIRuntimeCallInfo * runtimeCallInfo)1530 ArkUINativeModuleValue TabsBridge::SetTabsOnGestureSwipe(ArkUIRuntimeCallInfo* runtimeCallInfo)
1531 {
1532 EcmaVM* vm = runtimeCallInfo->GetVM();
1533 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1534 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1535 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
1536 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1537 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1538 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1539 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1540 GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnGestureSwipe(nativeNode);
1541 return panda::JSValueRef::Undefined(vm);
1542 }
1543 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1544
1545 std::function<void(int32_t, const AnimationCallbackInfo&)> callback =
1546 [vm, frameNode, func = panda::CopyableGlobal(vm, func)](int32_t index, const AnimationCallbackInfo& extraInfo) {
1547 panda::LocalScope pandaScope(vm);
1548 panda::TryCatch trycatch(vm);
1549 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1550 panda::Local<panda::NumberRef> indexParam = panda::NumberRef::New(vm, index);
1551 const char* keys[] = { "currentOffset", "targetOffset", "velocity" };
1552 Local<JSValueRef> values[] = { panda::NumberRef::New(vm, extraInfo.currentOffset.value_or(0.0f)),
1553 panda::NumberRef::New(vm, 0), panda::NumberRef::New(vm, 0) };
1554 auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1555 panda::Local<panda::JSValueRef> params[2] = { indexParam, eventObject }; // 2: Array length
1556 func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
1557 };
1558 GetArkUINodeModifiers()->getTabsModifier()->setTabsOnGestureSwipe(nativeNode, reinterpret_cast<void*>(&callback));
1559 return panda::JSValueRef::Undefined(vm);
1560 }
1561
ResetTabsOnGestureSwipe(ArkUIRuntimeCallInfo * runtimeCallInfo)1562 ArkUINativeModuleValue TabsBridge::ResetTabsOnGestureSwipe(ArkUIRuntimeCallInfo* runtimeCallInfo)
1563 {
1564 EcmaVM* vm = runtimeCallInfo->GetVM();
1565 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1566 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1567 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1568 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1569 GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnGestureSwipe(nativeNode);
1570 return panda::JSValueRef::Undefined(vm);
1571 }
1572
SetTabsOnContentWillChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1573 ArkUINativeModuleValue TabsBridge::SetTabsOnContentWillChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1574 {
1575 EcmaVM* vm = runtimeCallInfo->GetVM();
1576 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1577 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1578 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_1);
1579 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1580 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1581 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1582 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1583 GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnContentWillChange(nativeNode);
1584 return panda::JSValueRef::Undefined(vm);
1585 }
1586
1587 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1588 std::function<bool(int32_t, int32_t)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
1589 int32_t currentIndex, int32_t comingIndex) -> bool {
1590 panda::LocalScope pandaScope(vm);
1591 panda::TryCatch trycatch(vm);
1592 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1593
1594 panda::Local<panda::NumberRef> currentIndexParam = panda::NumberRef::New(vm, currentIndex);
1595 panda::Local<panda::NumberRef> comingIndexParam = panda::NumberRef::New(vm, comingIndex);
1596 // 2: Array length
1597 panda::Local<panda::JSValueRef> params[2] = { currentIndexParam, comingIndexParam };
1598 auto result = func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
1599 if (result->IsBoolean()) {
1600 return result->ToBoolean(vm)->Value();
1601 }
1602 return false;
1603 };
1604 GetArkUINodeModifiers()->getTabsModifier()->setTabsOnContentWillChange(
1605 nativeNode, reinterpret_cast<void*>(&callback));
1606 return panda::JSValueRef::Undefined(vm);
1607 }
1608
ResetTabsOnContentWillChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1609 ArkUINativeModuleValue TabsBridge::ResetTabsOnContentWillChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1610 {
1611 EcmaVM* vm = runtimeCallInfo->GetVM();
1612 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1613 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1614 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1615 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1616 GetArkUINodeModifiers()->getTabsModifier()->resetTabsOnContentWillChange(nativeNode);
1617 return panda::JSValueRef::Undefined(vm);
1618 }
1619
SetTabsCustomContentTransition(ArkUIRuntimeCallInfo * runtimeCallInfo)1620 ArkUINativeModuleValue TabsBridge::SetTabsCustomContentTransition(ArkUIRuntimeCallInfo* runtimeCallInfo)
1621 {
1622 EcmaVM* vm = runtimeCallInfo->GetVM();
1623 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1624 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1625 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1626 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1627 auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1628 using namespace OHOS::Ace::Framework;
1629 JsiCallbackInfo info = JsiCallbackInfo(runtimeCallInfo);
1630 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1631 if (info.Length() != 2) { // 2: Array length
1632 return panda::JSValueRef::Undefined(vm);
1633 }
1634
1635 if (!info[1]->IsFunction()) {
1636 GetArkUINodeModifiers()->getTabsModifier()->resetTabsIsCustomAnimation(nativeNode);
1637 return panda::JSValueRef::Undefined(vm);
1638 }
1639 auto transitionFunc = JSRef<JSFunc>::Cast(info[1]);
1640
1641 ParseCustomContentTransition(transitionFunc, info);
1642
1643 GetArkUINodeModifiers()->getTabsModifier()->setTabsIsCustomAnimation(nativeNode, true);
1644 return panda::JSValueRef::Undefined(vm);
1645 }
1646
ResetTabsCustomContentTransition(ArkUIRuntimeCallInfo * runtimeCallInfo)1647 ArkUINativeModuleValue TabsBridge::ResetTabsCustomContentTransition(ArkUIRuntimeCallInfo* runtimeCallInfo)
1648 {
1649 EcmaVM* vm = runtimeCallInfo->GetVM();
1650 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1651 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(TABS_ARG_INDEX_0);
1652 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1653 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1654 GetArkUINodeModifiers()->getTabsModifier()->resetTabsIsCustomAnimation(nativeNode);
1655 return panda::JSValueRef::Undefined(vm);
1656 }
1657
ParseCustomContentTransition(const Framework::JSRef<Framework::JSFunc> & transitionFunc,const Framework::JsiCallbackInfo & info)1658 void TabsBridge::ParseCustomContentTransition(
1659 const Framework::JSRef<Framework::JSFunc>& transitionFunc, const Framework::JsiCallbackInfo& info)
1660 {
1661 using namespace OHOS::Ace::Framework;
1662 RefPtr<JsTabsFunction> jsCustomAnimationFunc =
1663 AceType::MakeRefPtr<JsTabsFunction>(transitionFunc);
1664 auto onCustomAnimation = [execCtx = info.GetExecutionContext(), func = std::move(jsCustomAnimationFunc)](
1665 int32_t from, int32_t to) -> TabContentAnimatedTransition {
1666 TabContentAnimatedTransition transitionInfo;
1667 JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx, transitionInfo);
1668
1669 auto ret = func->Execute(from, to);
1670 if (!ret->IsObject()) {
1671 return transitionInfo;
1672 }
1673
1674 auto transitionObj = JSRef<JSObject>::Cast(ret);
1675 JSRef<JSVal> timeoutProperty = transitionObj->GetProperty("timeout");
1676 transitionInfo.timeout = DEFAULT_CUSTOM_ANIMATION_TIMEOUT;
1677 if (timeoutProperty->IsNumber()) {
1678 auto timeout = timeoutProperty->ToNumber<int32_t>();
1679 transitionInfo.timeout = timeout < 0 ? DEFAULT_CUSTOM_ANIMATION_TIMEOUT : timeout;
1680 }
1681
1682 JSRef<JSVal> transition = transitionObj->GetProperty("transition");
1683 if (transition->IsFunction()) {
1684 RefPtr<JsTabsFunction> jsOnTransition =
1685 AceType::MakeRefPtr<JsTabsFunction>(transition);
1686 auto onTransition = [execCtx, func = std::move(jsOnTransition)](
1687 const RefPtr<TabContentTransitionProxy>& proxy) {
1688 JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
1689 ACE_SCORING_EVENT("onTransition");
1690 func->Execute(proxy);
1691 };
1692
1693 transitionInfo.transition = std::move(onTransition);
1694 }
1695
1696 return transitionInfo;
1697 };
1698
1699 TabsModel::GetInstance()->SetOnCustomAnimation(std::move(onCustomAnimation));
1700 }
1701 } // namespace OHOS::Ace::NG
1702