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_grid_row_bridge.h"
16 #include "bridge/declarative_frontend/engine/jsi/jsi_types.h"
17 #include "core/components/common/layout/constants.h"
18 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
19
20 namespace OHOS::Ace::NG {
21 constexpr int32_t MAX_NUMBER_BREAKPOINT = 6;
22 constexpr int XS = 0;
23 constexpr int SM = 1;
24 constexpr int MD = 2;
25 constexpr int LG = 3;
26 constexpr int XL = 4;
27 constexpr int XXL = 5;
28 constexpr int32_t MAX_NUMBER_GUTTER = 12;
29 constexpr int X_XS = 0;
30 constexpr int X_SM = 1;
31 constexpr int X_MD = 2;
32 constexpr int X_LG = 3;
33 constexpr int X_XL = 4;
34 constexpr int X_XXL = 5;
35 constexpr int Y_XS = 6;
36 constexpr int Y_SM = 7;
37 constexpr int Y_MD = 8;
38 constexpr int Y_LG = 9;
39 constexpr int Y_XL = 10;
40 constexpr int Y_XXL = 11;
41
SetAlignItems(ArkUIRuntimeCallInfo * runtimeCallInfo)42 ArkUINativeModuleValue GridRowBridge::SetAlignItems(ArkUIRuntimeCallInfo* runtimeCallInfo)
43 {
44 EcmaVM* vm = runtimeCallInfo->GetVM();
45 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
46 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
47 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
48 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
49 if (secondArg->IsNumber()) {
50 int32_t alignItem = secondArg->Int32Value(vm);
51 if (alignItem == static_cast<int32_t>(OHOS::Ace::FlexAlign::FLEX_START) ||
52 alignItem == static_cast<int32_t>(OHOS::Ace::FlexAlign::FLEX_END) ||
53 alignItem == static_cast<int32_t>(OHOS::Ace::FlexAlign::CENTER) ||
54 alignItem == static_cast<int32_t>(OHOS::Ace::FlexAlign::STRETCH)) {
55 GetArkUINodeModifiers()->getGridRowModifier()->setAlignItems(nativeNode, alignItem);
56 } else if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TEN)) {
57 GetArkUINodeModifiers()->getGridRowModifier()->setAlignItems(nativeNode,
58 static_cast<int32_t>(OHOS::Ace::FlexAlign::FLEX_START));
59 }
60 } else {
61 GetArkUINodeModifiers()->getGridRowModifier()->resetAlignItems(nativeNode);
62 }
63 return panda::JSValueRef::Undefined(vm);
64 }
65
ResetAlignItems(ArkUIRuntimeCallInfo * runtimeCallInfo)66 ArkUINativeModuleValue GridRowBridge::ResetAlignItems(ArkUIRuntimeCallInfo* runtimeCallInfo)
67 {
68 EcmaVM* vm = runtimeCallInfo->GetVM();
69 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
70 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
71 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
72 GetArkUINodeModifiers()->getGridRowModifier()->resetAlignItems(nativeNode);
73 return panda::JSValueRef::Undefined(vm);
74 }
75
SetDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)76 ArkUINativeModuleValue GridRowBridge::SetDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
77 {
78 EcmaVM* vm = runtimeCallInfo->GetVM();
79 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
80 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
81 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
82 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
83 if (secondArg->IsNumber()) {
84 GetArkUINodeModifiers()->getGridRowModifier()->setDirection(nativeNode, secondArg->Int32Value(vm));
85 } else {
86 GetArkUINodeModifiers()->getGridRowModifier()->resetDirection(nativeNode);
87 }
88 return panda::JSValueRef::Undefined(vm);
89 }
ResetDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)90 ArkUINativeModuleValue GridRowBridge::ResetDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
91 {
92 EcmaVM* vm = runtimeCallInfo->GetVM();
93 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
94 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
95 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
96 GetArkUINodeModifiers()->getGridRowModifier()->resetDirection(nativeNode);
97 return panda::JSValueRef::Undefined(vm);
98 }
99
SetBreakpoints(ArkUIRuntimeCallInfo * runtimeCallInfo)100 ArkUINativeModuleValue GridRowBridge::SetBreakpoints(ArkUIRuntimeCallInfo* runtimeCallInfo)
101 {
102 EcmaVM* vm = runtimeCallInfo->GetVM();
103 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
104 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
105 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
106 Local<JSValueRef> threeArg = runtimeCallInfo->GetCallArgRef(2);
107 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
108
109 int32_t reference = 0;
110 if (threeArg->IsNumber()) {
111 reference = threeArg->Int32Value(vm);
112 }
113
114 std::vector<ArkUI_Float32> pointValues;
115 std::vector<const char*> pointStr;
116 int32_t size = 0;
117 if (!secondArg->IsArray(vm)) {
118 GetArkUINodeModifiers()->getGridRowModifier()->setBreakpoints(
119 nativeNode, reference, pointValues.data(), pointStr.data(), size);
120 return panda::JSValueRef::Undefined(vm);
121 }
122 auto arrayVal = panda::Local<panda::ArrayRef>(secondArg);
123 auto length = arrayVal->Length(vm);
124 if (length <= 0 || length > (MAX_NUMBER_BREAKPOINT-1)) {
125 GetArkUINodeModifiers()->getGridRowModifier()->setBreakpoints(
126 nativeNode, reference, pointValues.data(), pointStr.data(), size);
127 return panda::JSValueRef::Undefined(vm);
128 }
129 for (uint32_t index = 0; index < length; index++) {
130 CalcDimension calvalue;
131 std::string calcStr;
132 auto item = panda::ArrayRef::GetValueAt(vm, arrayVal, index);
133 calcStr = item->ToString(vm)->ToString(vm);
134 if (!ArkTSUtils::ParseJsDimensionVp(vm, item, calvalue, false)) {
135 calvalue = CalcDimension(0, DimensionUnit::VP);
136 }
137 pointValues.push_back(calvalue.Value());
138 pointStr.push_back(calcStr.c_str());
139 size++;
140 }
141 GetArkUINodeModifiers()->getGridRowModifier()->setBreakpoints(nativeNode, reference, pointValues.data(),
142 pointStr.data(), size);
143 return panda::JSValueRef::Undefined(vm);
144 }
ResetBreakpoints(ArkUIRuntimeCallInfo * runtimeCallInfo)145 ArkUINativeModuleValue GridRowBridge::ResetBreakpoints(ArkUIRuntimeCallInfo* runtimeCallInfo)
146 {
147 EcmaVM* vm = runtimeCallInfo->GetVM();
148 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
149 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
150 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
151 GetArkUINodeModifiers()->getGridRowModifier()->resetBreakpoints(nativeNode);
152 return panda::JSValueRef::Undefined(vm);
153 }
154
SetColumns(ArkUIRuntimeCallInfo * runtimeCallInfo)155 ArkUINativeModuleValue GridRowBridge::SetColumns(ArkUIRuntimeCallInfo* runtimeCallInfo)
156 {
157 EcmaVM* vm = runtimeCallInfo->GetVM();
158 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
159 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
160 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
161 Local<JSValueRef> xs = runtimeCallInfo->GetCallArgRef(XS + 1);
162 Local<JSValueRef> sm = runtimeCallInfo->GetCallArgRef(SM + 1);
163 Local<JSValueRef> md = runtimeCallInfo->GetCallArgRef(MD + 1);
164 Local<JSValueRef> lg = runtimeCallInfo->GetCallArgRef(LG + 1);
165 Local<JSValueRef> xl = runtimeCallInfo->GetCallArgRef(XL + 1);
166 Local<JSValueRef> xxl = runtimeCallInfo->GetCallArgRef(XXL + 1);
167 int32_t containerSizeArray[MAX_NUMBER_BREAKPOINT];
168 if (xs->IsNumber() && xs->Int32Value(vm) >= 0) {
169 containerSizeArray[XS] = xs->Int32Value(vm);
170 } else {
171 containerSizeArray[XS] = -1;
172 }
173 if (sm->IsNumber() && sm->Int32Value(vm) >= 0) {
174 containerSizeArray[SM] = sm->Int32Value(vm);
175 } else {
176 containerSizeArray[SM] = -1;
177 }
178 if (md->IsNumber() && md->Int32Value(vm) >= 0) {
179 containerSizeArray[MD] = md->Int32Value(vm);
180 } else {
181 containerSizeArray[MD] = -1;
182 }
183 if (lg->IsNumber() && lg->Int32Value(vm) >= 0) {
184 containerSizeArray[LG] = lg->Int32Value(vm);
185 } else {
186 containerSizeArray[LG] = -1;
187 }
188 if (xl->IsNumber() && xl->Int32Value(vm) >= 0) {
189 containerSizeArray[XL] = xl->Int32Value(vm);
190 } else {
191 containerSizeArray[XL] = -1;
192 }
193 if (xxl->IsNumber() && xxl->Int32Value(vm) >= 0) {
194 containerSizeArray[XXL] = xxl->Int32Value(vm);
195 } else {
196 containerSizeArray[XXL] = -1;
197 }
198 GetArkUINodeModifiers()->getGridRowModifier()->setColumns(nativeNode, containerSizeArray, MAX_NUMBER_BREAKPOINT);
199 return panda::JSValueRef::Undefined(vm);
200 }
ResetColumns(ArkUIRuntimeCallInfo * runtimeCallInfo)201 ArkUINativeModuleValue GridRowBridge::ResetColumns(ArkUIRuntimeCallInfo* runtimeCallInfo)
202 {
203 EcmaVM* vm = runtimeCallInfo->GetVM();
204 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
205 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
206 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
207 GetArkUINodeModifiers()->getGridRowModifier()->resetColumns(nativeNode);
208 return panda::JSValueRef::Undefined(vm);
209 }
210
SetGutter(ArkUIRuntimeCallInfo * runtimeCallInfo)211 ArkUINativeModuleValue GridRowBridge::SetGutter(ArkUIRuntimeCallInfo* runtimeCallInfo)
212 {
213 EcmaVM* vm = runtimeCallInfo->GetVM();
214 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
215 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
216 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
217 Local<JSValueRef> xXs = runtimeCallInfo->GetCallArgRef(X_XS + 1);
218 Local<JSValueRef> xSm = runtimeCallInfo->GetCallArgRef(X_SM + 1);
219 Local<JSValueRef> xMd = runtimeCallInfo->GetCallArgRef(X_MD + 1);
220 Local<JSValueRef> xLg = runtimeCallInfo->GetCallArgRef(X_LG + 1);
221 Local<JSValueRef> xXl = runtimeCallInfo->GetCallArgRef(X_XL + 1);
222 Local<JSValueRef> xXxl = runtimeCallInfo->GetCallArgRef(X_XXL + 1);
223 Local<JSValueRef> yXs = runtimeCallInfo->GetCallArgRef(Y_XS + 1);
224 Local<JSValueRef> ySm = runtimeCallInfo->GetCallArgRef(Y_SM + 1);
225 Local<JSValueRef> yMd = runtimeCallInfo->GetCallArgRef(Y_MD + 1);
226 Local<JSValueRef> yLg = runtimeCallInfo->GetCallArgRef(Y_LG + 1);
227 Local<JSValueRef> yXl = runtimeCallInfo->GetCallArgRef(Y_XL + 1);
228 Local<JSValueRef> yXxl = runtimeCallInfo->GetCallArgRef(Y_XXL + 1);
229 int32_t containerSizeArray[MAX_NUMBER_GUTTER];
230 if (xXs->IsNumber()) {
231 containerSizeArray[X_XS] = xXs->Int32Value(vm);
232 } else {
233 containerSizeArray[X_XS] = 0;
234 }
235 if (xSm->IsNumber()) {
236 containerSizeArray[X_SM] = xSm->Int32Value(vm);
237 } else {
238 containerSizeArray[X_SM] = containerSizeArray[X_XS];
239 }
240 if (xMd->IsNumber()) {
241 containerSizeArray[X_MD] = xMd->Int32Value(vm);
242 } else {
243 containerSizeArray[X_MD] = containerSizeArray[X_SM];
244 }
245 if (xLg->IsNumber()) {
246 containerSizeArray[X_LG] = xLg->Int32Value(vm);
247 } else {
248 containerSizeArray[X_LG] = containerSizeArray[X_MD];
249 }
250 if (xXl->IsNumber()) {
251 containerSizeArray[X_XL] = xXl->Int32Value(vm);
252 } else {
253 containerSizeArray[X_XL] = containerSizeArray[X_LG];
254 }
255 if (xXxl->IsNumber()) {
256 containerSizeArray[X_XXL] = xXxl->Int32Value(vm);
257 } else {
258 containerSizeArray[X_XXL] = containerSizeArray[X_XL];
259 }
260
261 if (yXs->IsNumber()) {
262 containerSizeArray[Y_XS] = yXs->Int32Value(vm);
263 } else {
264 containerSizeArray[Y_XS] = 0;
265 }
266 if (ySm->IsNumber()) {
267 containerSizeArray[Y_SM] = ySm->Int32Value(vm);
268 } else {
269 containerSizeArray[Y_SM] = containerSizeArray[Y_XS];
270 }
271 if (yMd->IsNumber()) {
272 containerSizeArray[Y_MD] = yMd->Int32Value(vm);
273 } else {
274 containerSizeArray[Y_MD] = containerSizeArray[Y_SM];
275 }
276 if (yLg->IsNumber()) {
277 containerSizeArray[Y_LG] = yLg->Int32Value(vm);
278 } else {
279 containerSizeArray[Y_LG] = containerSizeArray[Y_MD];
280 }
281 if (yXl->IsNumber()) {
282 containerSizeArray[Y_XL] = yXl->Int32Value(vm);
283 } else {
284 containerSizeArray[Y_XL] = containerSizeArray[Y_LG];
285 }
286 if (yXxl->IsNumber()) {
287 containerSizeArray[Y_XXL] = yXxl->Int32Value(vm);
288 } else {
289 containerSizeArray[Y_XXL] = containerSizeArray[Y_XL];
290 }
291 GetArkUINodeModifiers()->getGridRowModifier()->setGutter(nativeNode, containerSizeArray, MAX_NUMBER_GUTTER);
292 return panda::JSValueRef::Undefined(vm);
293 }
ResetGutter(ArkUIRuntimeCallInfo * runtimeCallInfo)294 ArkUINativeModuleValue GridRowBridge::ResetGutter(ArkUIRuntimeCallInfo* runtimeCallInfo)
295 {
296 EcmaVM* vm = runtimeCallInfo->GetVM();
297 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
298 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
299 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
300 GetArkUINodeModifiers()->getGridRowModifier()->resetGutter(nativeNode);
301 return panda::JSValueRef::Undefined(vm);
302 }
303
SetOnBreakpointChange(ArkUIRuntimeCallInfo * runtimeCallInfo)304 ArkUINativeModuleValue GridRowBridge::SetOnBreakpointChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
305 {
306 EcmaVM *vm = runtimeCallInfo->GetVM();
307 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
308 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
309 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
310 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
311 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
312 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
313 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
314 GetArkUINodeModifiers()->getGridRowModifier()->resetOnBreakpointChange(nativeNode);
315 return panda::JSValueRef::Undefined(vm);
316 }
317 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
318 std::function<void(const std::string&)> callback = [vm, frameNode,
319 func = panda::CopyableGlobal(vm, func)](const std::string& changeStr) {
320 panda::LocalScope pandaScope(vm);
321 panda::TryCatch trycatch(vm);
322 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
323 panda::Local<panda::JSValueRef> params[1] = {
324 panda::StringRef::NewFromUtf8(vm, changeStr.c_str()) };
325 func->Call(vm, func.ToLocal(), params, 1);
326 };
327 GetArkUINodeModifiers()->getGridRowModifier()->setOnBreakpointChange(nativeNode,
328 reinterpret_cast<void*>(&callback));
329
330 return panda::JSValueRef::Undefined(vm);
331 }
332
ResetOnBreakpointChange(ArkUIRuntimeCallInfo * runtimeCallInfo)333 ArkUINativeModuleValue GridRowBridge::ResetOnBreakpointChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
334 {
335 EcmaVM* vm = runtimeCallInfo->GetVM();
336 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
337 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
338 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
339 GetArkUINodeModifiers()->getGridRowModifier()->resetOnBreakpointChange(nativeNode);
340 return panda::JSValueRef::Undefined(vm);
341 }
342 }
343