• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2025 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     std::vector<std::string> calcStrings;
130     for (uint32_t index = 0; index < length; index++) {
131         CalcDimension calvalue;
132         auto item = panda::ArrayRef::GetValueAt(vm, arrayVal, index);
133         calcStrings.emplace_back(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         size++;
139     }
140     for (auto &calStr : calcStrings) {
141         pointStr.push_back(calStr.c_str());
142     }
143     GetArkUINodeModifiers()->getGridRowModifier()->setBreakpoints(nativeNode, reference, pointValues.data(),
144         pointStr.data(), size);
145     return panda::JSValueRef::Undefined(vm);
146 }
ResetBreakpoints(ArkUIRuntimeCallInfo * runtimeCallInfo)147 ArkUINativeModuleValue GridRowBridge::ResetBreakpoints(ArkUIRuntimeCallInfo* runtimeCallInfo)
148 {
149     EcmaVM* vm = runtimeCallInfo->GetVM();
150     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
151     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
152     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
153     GetArkUINodeModifiers()->getGridRowModifier()->resetBreakpoints(nativeNode);
154     return panda::JSValueRef::Undefined(vm);
155 }
156 
SetColumns(ArkUIRuntimeCallInfo * runtimeCallInfo)157 ArkUINativeModuleValue GridRowBridge::SetColumns(ArkUIRuntimeCallInfo* runtimeCallInfo)
158 {
159     EcmaVM* vm = runtimeCallInfo->GetVM();
160     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
161     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
162     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
163     Local<JSValueRef> xs = runtimeCallInfo->GetCallArgRef(XS + 1);
164     Local<JSValueRef> sm = runtimeCallInfo->GetCallArgRef(SM + 1);
165     Local<JSValueRef> md = runtimeCallInfo->GetCallArgRef(MD + 1);
166     Local<JSValueRef> lg = runtimeCallInfo->GetCallArgRef(LG + 1);
167     Local<JSValueRef> xl = runtimeCallInfo->GetCallArgRef(XL + 1);
168     Local<JSValueRef> xxl = runtimeCallInfo->GetCallArgRef(XXL + 1);
169     int32_t containerSizeArray[MAX_NUMBER_BREAKPOINT];
170     if (xs->IsNumber() && xs->Int32Value(vm) >= 0) {
171         containerSizeArray[XS] = xs->Int32Value(vm);
172     } else {
173         containerSizeArray[XS] = -1;
174     }
175     if (sm->IsNumber() && sm->Int32Value(vm) >= 0) {
176         containerSizeArray[SM] = sm->Int32Value(vm);
177     } else {
178         containerSizeArray[SM] = -1;
179     }
180     if (md->IsNumber() && md->Int32Value(vm) >= 0) {
181         containerSizeArray[MD] = md->Int32Value(vm);
182     } else {
183         containerSizeArray[MD] = -1;
184     }
185     if (lg->IsNumber() && lg->Int32Value(vm) >= 0) {
186         containerSizeArray[LG] = lg->Int32Value(vm);
187     } else {
188         containerSizeArray[LG] = -1;
189     }
190     if (xl->IsNumber() && xl->Int32Value(vm) >= 0) {
191         containerSizeArray[XL] = xl->Int32Value(vm);
192     } else {
193         containerSizeArray[XL] = -1;
194     }
195     if (xxl->IsNumber() && xxl->Int32Value(vm) >= 0) {
196         containerSizeArray[XXL] = xxl->Int32Value(vm);
197     } else {
198         containerSizeArray[XXL] = -1;
199     }
200     GetArkUINodeModifiers()->getGridRowModifier()->setColumns(nativeNode, containerSizeArray, MAX_NUMBER_BREAKPOINT);
201     return panda::JSValueRef::Undefined(vm);
202 }
ResetColumns(ArkUIRuntimeCallInfo * runtimeCallInfo)203 ArkUINativeModuleValue GridRowBridge::ResetColumns(ArkUIRuntimeCallInfo* runtimeCallInfo)
204 {
205     EcmaVM* vm = runtimeCallInfo->GetVM();
206     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
207     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
208     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
209     GetArkUINodeModifiers()->getGridRowModifier()->resetColumns(nativeNode);
210     return panda::JSValueRef::Undefined(vm);
211 }
212 
SetGutter(ArkUIRuntimeCallInfo * runtimeCallInfo)213 ArkUINativeModuleValue GridRowBridge::SetGutter(ArkUIRuntimeCallInfo* runtimeCallInfo)
214 {
215     EcmaVM* vm = runtimeCallInfo->GetVM();
216     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
217     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
218     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
219     Local<JSValueRef> xXs = runtimeCallInfo->GetCallArgRef(X_XS + 1);
220     Local<JSValueRef> xSm = runtimeCallInfo->GetCallArgRef(X_SM + 1);
221     Local<JSValueRef> xMd = runtimeCallInfo->GetCallArgRef(X_MD + 1);
222     Local<JSValueRef> xLg = runtimeCallInfo->GetCallArgRef(X_LG + 1);
223     Local<JSValueRef> xXl = runtimeCallInfo->GetCallArgRef(X_XL + 1);
224     Local<JSValueRef> xXxl = runtimeCallInfo->GetCallArgRef(X_XXL + 1);
225     Local<JSValueRef> yXs = runtimeCallInfo->GetCallArgRef(Y_XS + 1);
226     Local<JSValueRef> ySm = runtimeCallInfo->GetCallArgRef(Y_SM + 1);
227     Local<JSValueRef> yMd = runtimeCallInfo->GetCallArgRef(Y_MD + 1);
228     Local<JSValueRef> yLg = runtimeCallInfo->GetCallArgRef(Y_LG + 1);
229     Local<JSValueRef> yXl = runtimeCallInfo->GetCallArgRef(Y_XL + 1);
230     Local<JSValueRef> yXxl = runtimeCallInfo->GetCallArgRef(Y_XXL + 1);
231     int32_t containerSizeArray[MAX_NUMBER_GUTTER];
232     if (xXs->IsNumber()) {
233         containerSizeArray[X_XS] = xXs->Int32Value(vm);
234     } else {
235         containerSizeArray[X_XS] = 0;
236     }
237     if (xSm->IsNumber()) {
238         containerSizeArray[X_SM] = xSm->Int32Value(vm);
239     } else {
240         containerSizeArray[X_SM] = containerSizeArray[X_XS];
241     }
242     if (xMd->IsNumber()) {
243         containerSizeArray[X_MD] = xMd->Int32Value(vm);
244     } else {
245         containerSizeArray[X_MD] = containerSizeArray[X_SM];
246     }
247     if (xLg->IsNumber()) {
248         containerSizeArray[X_LG] = xLg->Int32Value(vm);
249     } else {
250         containerSizeArray[X_LG] = containerSizeArray[X_MD];
251     }
252     if (xXl->IsNumber()) {
253         containerSizeArray[X_XL] = xXl->Int32Value(vm);
254     } else {
255         containerSizeArray[X_XL] = containerSizeArray[X_LG];
256     }
257     if (xXxl->IsNumber()) {
258         containerSizeArray[X_XXL] = xXxl->Int32Value(vm);
259     } else {
260         containerSizeArray[X_XXL] = containerSizeArray[X_XL];
261     }
262 
263     if (yXs->IsNumber()) {
264         containerSizeArray[Y_XS] = yXs->Int32Value(vm);
265     } else {
266         containerSizeArray[Y_XS] = 0;
267     }
268     if (ySm->IsNumber()) {
269         containerSizeArray[Y_SM] = ySm->Int32Value(vm);
270     } else {
271         containerSizeArray[Y_SM] = containerSizeArray[Y_XS];
272     }
273     if (yMd->IsNumber()) {
274         containerSizeArray[Y_MD] = yMd->Int32Value(vm);
275     } else {
276         containerSizeArray[Y_MD] = containerSizeArray[Y_SM];
277     }
278     if (yLg->IsNumber()) {
279         containerSizeArray[Y_LG] = yLg->Int32Value(vm);
280     } else {
281         containerSizeArray[Y_LG] = containerSizeArray[Y_MD];
282     }
283     if (yXl->IsNumber()) {
284         containerSizeArray[Y_XL] = yXl->Int32Value(vm);
285     } else {
286         containerSizeArray[Y_XL] = containerSizeArray[Y_LG];
287     }
288     if (yXxl->IsNumber()) {
289         containerSizeArray[Y_XXL] = yXxl->Int32Value(vm);
290     } else {
291         containerSizeArray[Y_XXL] = containerSizeArray[Y_XL];
292     }
293     GetArkUINodeModifiers()->getGridRowModifier()->setGutter(nativeNode, containerSizeArray, MAX_NUMBER_GUTTER);
294     return panda::JSValueRef::Undefined(vm);
295 }
ResetGutter(ArkUIRuntimeCallInfo * runtimeCallInfo)296 ArkUINativeModuleValue GridRowBridge::ResetGutter(ArkUIRuntimeCallInfo* runtimeCallInfo)
297 {
298     EcmaVM* vm = runtimeCallInfo->GetVM();
299     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
300     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
301     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
302     GetArkUINodeModifiers()->getGridRowModifier()->resetGutter(nativeNode);
303     return panda::JSValueRef::Undefined(vm);
304 }
305 
SetOnBreakpointChange(ArkUIRuntimeCallInfo * runtimeCallInfo)306 ArkUINativeModuleValue GridRowBridge::SetOnBreakpointChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
307 {
308     EcmaVM *vm = runtimeCallInfo->GetVM();
309     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
310     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
311     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
312     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
313     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
314     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
315     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
316         GetArkUINodeModifiers()->getGridRowModifier()->resetOnBreakpointChange(nativeNode);
317         return panda::JSValueRef::Undefined(vm);
318     }
319     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
320     std::function<void(const std::string&)> callback = [vm, frameNode,
321         func = panda::CopyableGlobal(vm, func)](const std::string& changeStr) {
322         panda::LocalScope pandaScope(vm);
323         panda::TryCatch trycatch(vm);
324         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
325         panda::Local<panda::JSValueRef> params[1] = {
326             panda::StringRef::NewFromUtf8(vm, changeStr.c_str()) };
327         func->Call(vm, func.ToLocal(), params, 1);
328     };
329     GetArkUINodeModifiers()->getGridRowModifier()->setOnBreakpointChange(nativeNode,
330         reinterpret_cast<void*>(&callback));
331 
332     return panda::JSValueRef::Undefined(vm);
333 }
334 
ResetOnBreakpointChange(ArkUIRuntimeCallInfo * runtimeCallInfo)335 ArkUINativeModuleValue GridRowBridge::ResetOnBreakpointChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
336 {
337     EcmaVM* vm = runtimeCallInfo->GetVM();
338     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
339     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
340     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
341     GetArkUINodeModifiers()->getGridRowModifier()->resetOnBreakpointChange(nativeNode);
342     return panda::JSValueRef::Undefined(vm);
343 }
344 }
345