1 /*
2 * Copyright (c) 2022-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
16 #include "frameworks/bridge/declarative_frontend/jsview/js_grid_row.h"
17
18 #include "base/geometry/dimension.h"
19 #include "base/log/ace_scoring_log.h"
20 #include "base/log/ace_trace.h"
21 #include "base/memory/referenced.h"
22 #include "bridge/declarative_frontend/jsview/js_view_common_def.h"
23 #include "bridge/declarative_frontend/jsview/models/grid_row_model_impl.h"
24 #include "core/common/resource/resource_parse_utils.h"
25 #include "core/components_ng/base/view_stack_processor.h"
26 #include "core/components_ng/pattern/grid_row/grid_row_model_ng.h"
27 #include "core/components_v2/grid_layout/grid_container_util_class.h"
28
29 namespace OHOS::Ace {
GetInstance()30 GridRowModel* GridRowModel::GetInstance()
31 {
32 #ifdef NG_BUILD
33 static NG::GridRowModelNG instance;
34 return &instance;
35 #else
36 if (Container::IsCurrentUseNewPipeline()) {
37 static NG::GridRowModelNG instance;
38 return &instance;
39 } else {
40 static Framework::GridRowModelImpl instance;
41 return &instance;
42 }
43 #endif
44 }
45 } // namespace OHOS::Ace
46
47 namespace OHOS::Ace::Framework {
48 namespace {
49
50 constexpr size_t MAX_NUMBER_BREAKPOINT = 6;
51 constexpr size_t XS = 0;
52 constexpr size_t SM = 1;
53 constexpr size_t MD = 2;
54 constexpr size_t LG = 3;
55 constexpr size_t XL = 4;
56 constexpr size_t XXL = 5;
57 constexpr int32_t PARAMS_NUM_TOW = 2;
58 constexpr int32_t PARAMS_NUM_THREE = 3;
59 constexpr int32_t PARAMS_NUM_FOUR = 4;
60 constexpr int32_t PARAMS_NUM_FIVE = 5;
61
InheritGridRowOption(const RefPtr<V2::GridContainerSize> & gridContainerSize,std::optional<int32_t> (& containerSizeArray)[MAX_NUMBER_BREAKPOINT])62 void InheritGridRowOption(const RefPtr<V2::GridContainerSize>& gridContainerSize,
63 std::optional<int32_t> (&containerSizeArray)[MAX_NUMBER_BREAKPOINT])
64 {
65 if (!containerSizeArray[0].has_value()) {
66 containerSizeArray[0] = V2::DEFAULT_COLUMN_NUMBER;
67 }
68 for (size_t i = 1; i < MAX_NUMBER_BREAKPOINT; i++) {
69 if (!containerSizeArray[i].has_value()) {
70 containerSizeArray[i] = containerSizeArray[i - 1].value();
71 }
72 }
73 gridContainerSize->xs = containerSizeArray[0].value();
74 gridContainerSize->sm = containerSizeArray[1].value();
75 gridContainerSize->md = containerSizeArray[2].value();
76 gridContainerSize->lg = containerSizeArray[3].value();
77 gridContainerSize->xl = containerSizeArray[4].value();
78 gridContainerSize->xxl = containerSizeArray[5].value();
79 }
80
InheritGridColumns(const RefPtr<V2::GridContainerSize> & gridContainerSize,std::optional<int32_t> (& containerSizeArray)[MAX_NUMBER_BREAKPOINT])81 void InheritGridColumns(const RefPtr<V2::GridContainerSize>& gridContainerSize,
82 std::optional<int32_t> (&containerSizeArray)[MAX_NUMBER_BREAKPOINT])
83 {
84 for (size_t i = 0; i < MAX_NUMBER_BREAKPOINT; ++i) {
85 if (containerSizeArray[i].has_value()) {
86 containerSizeArray[0] = containerSizeArray[i].value();
87 break;
88 }
89 }
90 CHECK_NULL_VOID(containerSizeArray[0].has_value());
91 for (size_t i = 1; i < MAX_NUMBER_BREAKPOINT; ++i) {
92 if (!containerSizeArray[i].has_value()) {
93 containerSizeArray[i] = containerSizeArray[i - 1].value();
94 }
95 }
96 gridContainerSize->xs = containerSizeArray[XS].value();
97 gridContainerSize->sm = containerSizeArray[SM].value();
98 gridContainerSize->md = containerSizeArray[MD].value();
99 gridContainerSize->lg = containerSizeArray[LG].value();
100 gridContainerSize->xl = containerSizeArray[XL].value();
101 gridContainerSize->xxl = containerSizeArray[XXL].value();
102 }
103
SaveGridRowGutterOptionxResObjXsSmMd(const RefPtr<V2::Gutter> & gutter,RefPtr<ResourceObject> (& gutterSizeArrayResObj)[MAX_NUMBER_BREAKPOINT])104 void SaveGridRowGutterOptionxResObjXsSmMd(const RefPtr<V2::Gutter>& gutter,
105 RefPtr<ResourceObject> (&gutterSizeArrayResObj)[MAX_NUMBER_BREAKPOINT])
106 {
107 if (!SystemProperties::ConfigChangePerform()) {
108 return;
109 }
110 if (gutterSizeArrayResObj[0]) {
111 auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
112 CalcDimension result;
113 ResourceParseUtils::ParseResDimensionVp(resObj, result);
114 gutter->xXs = result;
115 };
116 gutter->AddResource("gridrow.gutter.xXs", gutterSizeArrayResObj[0], std::move(updateFunc));
117 }
118 if (gutterSizeArrayResObj[1]) {
119 auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
120 CalcDimension result;
121 ResourceParseUtils::ParseResDimensionVp(resObj, result);
122 gutter->xSm = result;
123 };
124 gutter->AddResource("gridrow.gutter.xSm", gutterSizeArrayResObj[1], std::move(updateFunc));
125 }
126 if (gutterSizeArrayResObj[PARAMS_NUM_TOW]) {
127 auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
128 CalcDimension result;
129 ResourceParseUtils::ParseResDimensionVp(resObj, result);
130 gutter->xMd = result;
131 };
132 gutter->AddResource("gridrow.gutter.xMd", gutterSizeArrayResObj[PARAMS_NUM_TOW], std::move(updateFunc));
133 }
134 }
135
SaveGridRowGutterOptionxResObjLgXlXXl(const RefPtr<V2::Gutter> & gutter,RefPtr<ResourceObject> (& gutterSizeArrayResObj)[MAX_NUMBER_BREAKPOINT])136 void SaveGridRowGutterOptionxResObjLgXlXXl(const RefPtr<V2::Gutter>& gutter,
137 RefPtr<ResourceObject> (&gutterSizeArrayResObj)[MAX_NUMBER_BREAKPOINT])
138 {
139 if (!SystemProperties::ConfigChangePerform()) {
140 return;
141 }
142 if (gutterSizeArrayResObj[PARAMS_NUM_THREE]) {
143 auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
144 CalcDimension result;
145 ResourceParseUtils::ParseResDimensionVp(resObj, result);
146 gutter->xLg = result;
147 };
148 gutter->AddResource("gridrow.gutter.xLg", gutterSizeArrayResObj[PARAMS_NUM_THREE], std::move(updateFunc));
149 }
150 if (gutterSizeArrayResObj[PARAMS_NUM_FOUR]) {
151 auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
152 CalcDimension result;
153 ResourceParseUtils::ParseResDimensionVp(resObj, result);
154 gutter->xXl = result;
155 };
156 gutter->AddResource("gridrow.gutter.xXl", gutterSizeArrayResObj[PARAMS_NUM_FOUR], std::move(updateFunc));
157 }
158 if (gutterSizeArrayResObj[PARAMS_NUM_FIVE]) {
159 auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
160 CalcDimension result;
161 ResourceParseUtils::ParseResDimensionVp(resObj, result);
162 gutter->xXXl = result;
163 };
164 gutter->AddResource("gridrow.gutter.xXXl", gutterSizeArrayResObj[PARAMS_NUM_FIVE], std::move(updateFunc));
165 }
166 }
167
SaveGridRowGutterOptionyResObjXsSmMd(const RefPtr<V2::Gutter> & gutter,RefPtr<ResourceObject> (& gutterSizeArrayResObj)[MAX_NUMBER_BREAKPOINT])168 void SaveGridRowGutterOptionyResObjXsSmMd(const RefPtr<V2::Gutter>& gutter,
169 RefPtr<ResourceObject> (&gutterSizeArrayResObj)[MAX_NUMBER_BREAKPOINT])
170 {
171 if (!SystemProperties::ConfigChangePerform()) {
172 return;
173 }
174 if (gutterSizeArrayResObj[0]) {
175 auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
176 CalcDimension result;
177 ResourceParseUtils::ParseResDimensionVp(resObj, result);
178 gutter->yXs = result;
179 };
180 gutter->AddResource("gridrow.gutter.yXs", gutterSizeArrayResObj[0], std::move(updateFunc));
181 }
182 if (gutterSizeArrayResObj[1]) {
183 auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
184 CalcDimension result;
185 ResourceParseUtils::ParseResDimensionVp(resObj, result);
186 gutter->ySm = result;
187 };
188 gutter->AddResource("gridrow.gutter.ySm", gutterSizeArrayResObj[1], std::move(updateFunc));
189 }
190 if (gutterSizeArrayResObj[PARAMS_NUM_TOW]) {
191 auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
192 CalcDimension result;
193 ResourceParseUtils::ParseResDimensionVp(resObj, result);
194 gutter->yMd = result;
195 };
196 gutter->AddResource("gridrow.gutter.yMd", gutterSizeArrayResObj[PARAMS_NUM_TOW], std::move(updateFunc));
197 }
198 }
199
SaveGridRowGutterOptionyResObjLgXlXXl(const RefPtr<V2::Gutter> & gutter,RefPtr<ResourceObject> (& gutterSizeArrayResObj)[MAX_NUMBER_BREAKPOINT])200 void SaveGridRowGutterOptionyResObjLgXlXXl(const RefPtr<V2::Gutter>& gutter,
201 RefPtr<ResourceObject> (&gutterSizeArrayResObj)[MAX_NUMBER_BREAKPOINT])
202 {
203 if (!SystemProperties::ConfigChangePerform()) {
204 return;
205 }
206 if (gutterSizeArrayResObj[PARAMS_NUM_THREE]) {
207 auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
208 CalcDimension result;
209 ResourceParseUtils::ParseResDimensionVp(resObj, result);
210 gutter->yLg = result;
211 };
212 gutter->AddResource("gridrow.gutter.yLg", gutterSizeArrayResObj[PARAMS_NUM_THREE], std::move(updateFunc));
213 }
214 if (gutterSizeArrayResObj[PARAMS_NUM_FOUR]) {
215 auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
216 CalcDimension result;
217 ResourceParseUtils::ParseResDimensionVp(resObj, result);
218 gutter->yXl = result;
219 };
220 gutter->AddResource("gridrow.gutter.yXl", gutterSizeArrayResObj[PARAMS_NUM_FOUR], std::move(updateFunc));
221 }
222 if (gutterSizeArrayResObj[PARAMS_NUM_FIVE]) {
223 auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
224 CalcDimension result;
225 ResourceParseUtils::ParseResDimensionVp(resObj, result);
226 gutter->yXXl = result;
227 };
228 gutter->AddResource("gridrow.gutter.yXXl", gutterSizeArrayResObj[PARAMS_NUM_FIVE], std::move(updateFunc));
229 }
230 }
231
InheritGridRowGutterOption(const RefPtr<V2::Gutter> & gutter,std::optional<CalcDimension> (& gutterSizeArray)[MAX_NUMBER_BREAKPOINT],RefPtr<ResourceObject> (& gutterSizeArrayResObj)[MAX_NUMBER_BREAKPOINT],bool isHorizontal)232 void InheritGridRowGutterOption(const RefPtr<V2::Gutter>& gutter,
233 std::optional<CalcDimension> (&gutterSizeArray)[MAX_NUMBER_BREAKPOINT],
234 RefPtr<ResourceObject> (&gutterSizeArrayResObj)[MAX_NUMBER_BREAKPOINT], bool isHorizontal)
235 {
236 if (!gutterSizeArray[0].has_value()) {
237 gutterSizeArray[0] = CalcDimension(0);
238 }
239 for (size_t i = 1; i < MAX_NUMBER_BREAKPOINT; i++) {
240 if (!gutterSizeArray[i].has_value()) {
241 gutterSizeArray[i] = gutterSizeArray[i - 1].value();
242 }
243 if (!gutterSizeArrayResObj[i]) {
244 gutterSizeArrayResObj[i] = gutterSizeArrayResObj[i - 1];
245 }
246 }
247 if (isHorizontal) {
248 gutter->xXs = gutterSizeArray[0].value();
249 gutter->xSm = gutterSizeArray[1].value();
250 gutter->xMd = gutterSizeArray[2].value();
251 gutter->xLg = gutterSizeArray[3].value();
252 gutter->xXl = gutterSizeArray[4].value();
253 gutter->xXXl = gutterSizeArray[5].value();
254 SaveGridRowGutterOptionxResObjXsSmMd(gutter, gutterSizeArrayResObj);
255 SaveGridRowGutterOptionxResObjLgXlXXl(gutter, gutterSizeArrayResObj);
256 return;
257 }
258 gutter->yXs = gutterSizeArray[0].value();
259 gutter->ySm = gutterSizeArray[1].value();
260 gutter->yMd = gutterSizeArray[2].value();
261 gutter->yLg = gutterSizeArray[3].value();
262 gutter->yXl = gutterSizeArray[4].value();
263 gutter->yXXl = gutterSizeArray[5].value();
264 SaveGridRowGutterOptionyResObjXsSmMd(gutter, gutterSizeArrayResObj);
265 SaveGridRowGutterOptionyResObjLgXlXXl(gutter, gutterSizeArrayResObj);
266 }
267
ParseGutterObjectSub(const JSRef<JSObject> & gutterParam,RefPtr<V2::Gutter> & gutter,bool isHorizontal)268 void ParseGutterObjectSub(const JSRef<JSObject>& gutterParam, RefPtr<V2::Gutter>& gutter, bool isHorizontal)
269 {
270 std::optional<CalcDimension> gutterOptions[MAX_NUMBER_BREAKPOINT];
271 RefPtr<ResourceObject> gutterOptionsResObj[MAX_NUMBER_BREAKPOINT];
272 auto xs = gutterParam->GetProperty("xs");
273 CalcDimension xsDimension;
274 RefPtr<ResourceObject> xsDimensionResObj;
275 if (JSContainerBase::ParseJsDimensionVp(xs, xsDimension, xsDimensionResObj)) {
276 gutterOptions[0] = xsDimension;
277 }
278 auto sm = gutterParam->GetProperty("sm");
279 CalcDimension smDimension;
280 RefPtr<ResourceObject> smDimensionnResObj;
281 if (JSContainerBase::ParseJsDimensionVp(sm, smDimension, smDimensionnResObj)) {
282 gutterOptions[1] = smDimension;
283 }
284 auto md = gutterParam->GetProperty("md");
285 CalcDimension mdDimension;
286 RefPtr<ResourceObject> mdDimensionResObj;
287 if (JSContainerBase::ParseJsDimensionVp(md, mdDimension, mdDimensionResObj)) {
288 gutterOptions[PARAMS_NUM_TOW] = mdDimension;
289 }
290 auto lg = gutterParam->GetProperty("lg");
291 CalcDimension lgDimension;
292 RefPtr<ResourceObject> lgDimensionResObj;
293 if (JSContainerBase::ParseJsDimensionVp(lg, lgDimension, lgDimensionResObj)) {
294 gutterOptions[PARAMS_NUM_THREE] = lgDimension;
295 }
296 auto xl = gutterParam->GetProperty("xl");
297 CalcDimension xlDimension;
298 RefPtr<ResourceObject> xlDimensionResObj;
299 if (JSContainerBase::ParseJsDimensionVp(xl, xlDimension, xlDimensionResObj)) {
300 gutterOptions[PARAMS_NUM_FOUR] = xlDimension;
301 }
302 auto xxl = gutterParam->GetProperty("xxl");
303 CalcDimension xxlDimension;
304 RefPtr<ResourceObject> xxlDimensionResObj;
305 if (JSContainerBase::ParseJsDimensionVp(xxl, xxlDimension, xxlDimensionResObj)) {
306 gutterOptions[PARAMS_NUM_FIVE] = xxlDimension;
307 }
308 if (SystemProperties::ConfigChangePerform()) {
309 gutterOptionsResObj[0] = xsDimensionResObj;
310 gutterOptionsResObj[1] = smDimensionnResObj;
311 gutterOptionsResObj[PARAMS_NUM_TOW] = mdDimensionResObj;
312 gutterOptionsResObj[PARAMS_NUM_THREE] = lgDimensionResObj;
313 gutterOptionsResObj[PARAMS_NUM_FOUR] = xlDimensionResObj;
314 gutterOptionsResObj[PARAMS_NUM_FIVE] = xxlDimensionResObj;
315 }
316
317 InheritGridRowGutterOption(gutter, gutterOptions, gutterOptionsResObj, isHorizontal);
318 }
319
SetXGutterResObj(RefPtr<ResourceObject> xDimension,RefPtr<V2::Gutter> & gutter)320 void SetXGutterResObj(RefPtr<ResourceObject> xDimension, RefPtr<V2::Gutter>& gutter)
321 {
322 auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
323 CalcDimension result;
324 ResourceParseUtils::ParseResDimensionVpNG(resObj, result);
325 gutter->xXs = result;
326 gutter->xSm = result;
327 gutter->xMd = result;
328 gutter->xLg = result;
329 gutter->xXl = result;
330 gutter->xXXl = result;
331 };
332 gutter->AddResource("gridrow.gutter.x", xDimension, std::move(updateFunc));
333 }
334
SetYGutterResObj(RefPtr<ResourceObject> yDimension,RefPtr<V2::Gutter> & gutter)335 void SetYGutterResObj(RefPtr<ResourceObject> yDimension, RefPtr<V2::Gutter>& gutter)
336 {
337 auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
338 CalcDimension result;
339 ResourceParseUtils::ParseResDimensionVpNG(resObj, result);
340 gutter->yXs = result;
341 gutter->ySm = result;
342 gutter->yMd = result;
343 gutter->yLg = result;
344 gutter->yXl = result;
345 gutter->yXXl = result;
346 };
347 gutter->AddResource("gridrow.gutter.y", yDimension, std::move(updateFunc));
348 }
349
ParseGutterObject(const JSRef<JSVal> & gutterObject,RefPtr<V2::Gutter> & gutter,bool isHorizontal)350 void ParseGutterObject(const JSRef<JSVal>& gutterObject, RefPtr<V2::Gutter>& gutter, bool isHorizontal)
351 {
352 CalcDimension dim;
353 RefPtr<ResourceObject> dimResObj;
354 if (JSContainerBase::ParseJsDimensionVp(gutterObject, dim, dimResObj)) {
355 if (SystemProperties::ConfigChangePerform() && dimResObj) {
356 isHorizontal ? SetXGutterResObj(dimResObj, gutter) : SetYGutterResObj(dimResObj, gutter);
357 }
358 isHorizontal ? gutter->SetXGutter(dim) : gutter->SetYGutter(dim);
359 return;
360 }
361 if (!gutterObject->IsObject()) {
362 return;
363 }
364 auto gutterParam = JSRef<JSObject>::Cast(gutterObject);
365 ParseGutterObjectSub(gutterParam, gutter, isHorizontal);
366 }
367
ParserGutter(const JSRef<JSVal> & jsValue)368 RefPtr<V2::Gutter> ParserGutter(const JSRef<JSVal>& jsValue)
369 {
370 CalcDimension result;
371 if (JSContainerBase::ParseJsDimensionVp(jsValue, result)) {
372 auto gutter = AceType::MakeRefPtr<V2::Gutter>(result);
373 return gutter;
374 } else {
375 if (!jsValue->IsObject()) {
376 return AceType::MakeRefPtr<V2::Gutter>();
377 }
378 auto paramGutter = JSRef<JSObject>::Cast(jsValue);
379 auto xObject = paramGutter->GetProperty("x");
380 auto yObject = paramGutter->GetProperty("y");
381 auto gutter = AceType::MakeRefPtr<V2::Gutter>();
382 ParseGutterObject(xObject, gutter, true);
383 ParseGutterObject(yObject, gutter, false);
384 return gutter;
385 }
386 }
387
ParserColumns(const JSRef<JSVal> & jsValue)388 RefPtr<V2::GridContainerSize> ParserColumns(const JSRef<JSVal>& jsValue)
389 {
390 if (jsValue->IsNumber()) {
391 auto columnNumber = jsValue->ToNumber<int32_t>();
392 return columnNumber > 0 ? AceType::MakeRefPtr<V2::GridContainerSize>(columnNumber)
393 : AceType::MakeRefPtr<V2::GridContainerSize>(NG::DEFAULT_COLUMN_NUMBER);
394 } else if (jsValue->IsObject()) {
395 auto gridContainerSize = AceType::MakeRefPtr<V2::GridContainerSize>(NG::DEFAULT_COLUMN_NUMBER);
396 auto gridParam = JSRef<JSObject>::Cast(jsValue);
397 std::optional<int32_t> containerSizeArray[MAX_NUMBER_BREAKPOINT];
398 auto xs = gridParam->GetProperty("xs");
399 if (xs->IsNumber() && xs->ToNumber<int32_t>() > 0) {
400 containerSizeArray[XS] = xs->ToNumber<int32_t>();
401 }
402 auto sm = gridParam->GetProperty("sm");
403 if (sm->IsNumber() && sm->ToNumber<int32_t>() > 0) {
404 containerSizeArray[SM] = sm->ToNumber<int32_t>();
405 }
406 auto md = gridParam->GetProperty("md");
407 if (md->IsNumber() && md->ToNumber<int32_t>() > 0) {
408 containerSizeArray[MD] = md->ToNumber<int32_t>();
409 }
410 auto lg = gridParam->GetProperty("lg");
411 if (lg->IsNumber() && lg->ToNumber<int32_t>() > 0) {
412 containerSizeArray[LG] = lg->ToNumber<int32_t>();
413 }
414 auto xl = gridParam->GetProperty("xl");
415 if (xl->IsNumber() && xl->ToNumber<int32_t>() > 0) {
416 containerSizeArray[XL] = xl->ToNumber<int32_t>();
417 }
418 auto xxl = gridParam->GetProperty("xxl");
419 if (xxl->IsNumber() && xxl->ToNumber<int32_t>() > 0) {
420 containerSizeArray[XXL] = xxl->ToNumber<int32_t>();
421 }
422 InheritGridRowOption(gridContainerSize, containerSizeArray);
423 return gridContainerSize;
424 } else {
425 return AceType::MakeRefPtr<V2::GridContainerSize>(NG::DEFAULT_COLUMN_NUMBER);
426 }
427 }
428
ParserColumnsNG(const JSRef<JSVal> & jsValue)429 RefPtr<V2::GridContainerSize> ParserColumnsNG(const JSRef<JSVal>& jsValue)
430 {
431 if (jsValue->IsNumber()) {
432 auto columnNumber = jsValue->ToNumber<int32_t>();
433 return columnNumber > 0 ? AceType::MakeRefPtr<V2::GridContainerSize>(columnNumber)
434 : AceType::MakeRefPtr<V2::GridContainerSize>();
435 }
436 if (jsValue->IsObject()) {
437 auto gridContainerSize = AceType::MakeRefPtr<V2::GridContainerSize>();
438 auto gridParam = JSRef<JSObject>::Cast(jsValue);
439 std::optional<int32_t> containerSizeArray[MAX_NUMBER_BREAKPOINT];
440 auto xs = gridParam->GetProperty("xs");
441 if (xs->IsNumber() && xs->ToNumber<int32_t>() > 0) {
442 containerSizeArray[XS] = xs->ToNumber<int32_t>();
443 }
444 auto sm = gridParam->GetProperty("sm");
445 if (sm->IsNumber() && sm->ToNumber<int32_t>() > 0) {
446 containerSizeArray[SM] = sm->ToNumber<int32_t>();
447 }
448 auto md = gridParam->GetProperty("md");
449 if (md->IsNumber() && md->ToNumber<int32_t>() > 0) {
450 containerSizeArray[MD] = md->ToNumber<int32_t>();
451 }
452 auto lg = gridParam->GetProperty("lg");
453 if (lg->IsNumber() && lg->ToNumber<int32_t>() > 0) {
454 containerSizeArray[LG] = lg->ToNumber<int32_t>();
455 }
456 auto xl = gridParam->GetProperty("xl");
457 if (xl->IsNumber() && xl->ToNumber<int32_t>() > 0) {
458 containerSizeArray[XL] = xl->ToNumber<int32_t>();
459 }
460 auto xxl = gridParam->GetProperty("xxl");
461 if (xxl->IsNumber() && xxl->ToNumber<int32_t>() > 0) {
462 containerSizeArray[XXL] = xxl->ToNumber<int32_t>();
463 }
464 InheritGridColumns(gridContainerSize, containerSizeArray);
465 return gridContainerSize;
466 }
467 return AceType::MakeRefPtr<V2::GridContainerSize>();
468 }
469
ParserBreakpoints(const JSRef<JSVal> & jsValue)470 RefPtr<V2::BreakPoints> ParserBreakpoints(const JSRef<JSVal>& jsValue)
471 {
472 if (!jsValue->IsObject()) {
473 return AceType::MakeRefPtr<V2::BreakPoints>();
474 }
475 auto breakpoints = JSRef<JSObject>::Cast(jsValue);
476 auto value = breakpoints->GetProperty("value");
477 auto reference = breakpoints->GetProperty("reference");
478 auto breakpoint = AceType::MakeRefPtr<V2::BreakPoints>();
479 if (reference->IsNumber()) {
480 breakpoint->reference = static_cast<V2::BreakPointsReference>(reference->ToNumber<int32_t>());
481 }
482 if (value->IsArray()) {
483 JSRef<JSArray> array = JSRef<JSArray>::Cast(value);
484 breakpoint->breakpoints.clear();
485 if (array->Length() > MAX_NUMBER_BREAKPOINT - 1) {
486 return breakpoint;
487 }
488 double width = -1.0;
489 for (size_t i = 0; i < array->Length(); i++) {
490 JSRef<JSVal> threshold = array->GetValueAt(i);
491 if (threshold->IsString() || threshold->IsNumber()) {
492 CalcDimension valueDimension;
493 JSContainerBase::ParseJsDimensionVp(threshold, valueDimension);
494 breakpoint->userDefine = true;
495 if (GreatNotEqual(width, valueDimension.Value())) {
496 return breakpoint;
497 }
498 width = valueDimension.Value();
499 breakpoint->breakpoints.push_back(threshold->ToString());
500 }
501 }
502 }
503 return breakpoint;
504 }
505
ParserDirection(const JSRef<JSVal> & jsValue)506 V2::GridRowDirection ParserDirection(const JSRef<JSVal>& jsValue)
507 {
508 V2::GridRowDirection direction(V2::GridRowDirection::Row);
509 if (jsValue->IsNumber()) {
510 direction = static_cast<V2::GridRowDirection>(jsValue->ToNumber<int32_t>());
511 }
512 return direction;
513 }
514
515 } // namespace
516
Create(const JSCallbackInfo & info)517 void JSGridRow::Create(const JSCallbackInfo& info)
518 {
519 if (info[0]->IsObject()) {
520 auto gridRow = JSRef<JSObject>::Cast(info[0]);
521 auto columns = gridRow->GetProperty("columns");
522 auto gutter = gridRow->GetProperty("gutter");
523 auto breakpoints = gridRow->GetProperty("breakpoints");
524 auto direction = gridRow->GetProperty("direction");
525
526 RefPtr<V2::GridContainerSize> parsedColumns;
527 if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWENTY)) {
528 parsedColumns = ParserColumns(columns);
529 } else {
530 parsedColumns = ParserColumnsNG(columns);
531 }
532 auto parsedGutter = ParserGutter(gutter);
533 auto parsedBreakpoints = ParserBreakpoints(breakpoints);
534 auto parsedDirection = ParserDirection(direction);
535 GridRowModel::GetInstance()->Create(parsedColumns, parsedGutter, parsedBreakpoints, parsedDirection);
536 } else {
537 GridRowModel::GetInstance()->Create();
538 }
539 }
540
JsBreakpointEvent(const JSCallbackInfo & info)541 void JSGridRow::JsBreakpointEvent(const JSCallbackInfo& info)
542 {
543 if (!info[0]->IsFunction()) {
544 return;
545 }
546 auto jsFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(info[0]));
547 WeakPtr<NG::FrameNode> targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
548 auto onBreakpointChange = [execCtx = info.GetExecutionContext(), func = std::move(jsFunc), node = targetNode](
549 const std::string& value) {
550 JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
551 ACE_SCORING_EVENT("GridRow.onBreakpointChange");
552 auto newJSVal = JSRef<JSVal>::Make(ToJSValue(value));
553 PipelineContext::SetCallBackNode(node);
554 func->ExecuteJS(1, &newJSVal);
555 };
556 GridRowModel::GetInstance()->SetOnBreakPointChange(onBreakpointChange);
557 }
558
Height(const JSCallbackInfo & info)559 void JSGridRow::Height(const JSCallbackInfo& info)
560 {
561 JSViewAbstract::JsHeight(info[0]);
562 GridRowModel::GetInstance()->SetHeight();
563 }
564
AlignItems(const JSCallbackInfo & info)565 void JSGridRow::AlignItems(const JSCallbackInfo& info)
566 {
567 if (info[0]->IsNumber()) {
568 auto value = info[0]->ToNumber<int32_t>();
569 ParseAlignItems(value);
570 } else if (info[0]->IsUndefined()) {
571 GridRowModel::GetInstance()->SetAlignItems(FlexAlign::FLEX_START);
572 }
573 }
574
ParseAlignItems(int32_t alignItem)575 void JSGridRow::ParseAlignItems(int32_t alignItem)
576 {
577 if (alignItem == static_cast<int32_t>(FlexAlign::FLEX_START) ||
578 alignItem == static_cast<int32_t>(FlexAlign::FLEX_END) ||
579 alignItem == static_cast<int32_t>(FlexAlign::CENTER) || alignItem == static_cast<int32_t>(FlexAlign::STRETCH)) {
580 GridRowModel::GetInstance()->SetAlignItems(static_cast<FlexAlign>(alignItem));
581 } else if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TEN)) {
582 GridRowModel::GetInstance()->SetAlignItems(FlexAlign::FLEX_START);
583 }
584 }
585
JSBind(BindingTarget globalObj)586 void JSGridRow::JSBind(BindingTarget globalObj)
587 {
588 JSClass<JSGridRow>::Declare("GridRow");
589 JSClass<JSGridRow>::StaticMethod("create", &JSGridRow::Create);
590 JSClass<JSGridRow>::StaticMethod("onBreakpointChange", &JSGridRow::JsBreakpointEvent);
591 JSClass<JSGridRow>::StaticMethod("height", &JSGridRow::Height);
592 JSClass<JSGridRow>::StaticMethod("alignItems", &JSGridRow::AlignItems);
593 JSClass<JSGridRow>::StaticMethod("onDetach", &JSInteractableView::JsOnDetach);
594 JSClass<JSGridRow>::StaticMethod("onDisAppear", &JSInteractableView::JsOnDisAppear);
595 JSClass<JSGridRow>::StaticMethod("onAttach", &JSInteractableView::JsOnAttach);
596 JSClass<JSGridRow>::StaticMethod("onAppear", &JSInteractableView::JsOnAppear);
597 JSClass<JSGridRow>::StaticMethod("onTouch", &JSInteractableView::JsOnTouch);
598 JSClass<JSGridRow>::InheritAndBind<JSContainerBase>(globalObj);
599 }
600
601 } // namespace OHOS::Ace::Framework
602