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 
16 #include "core/interfaces/native/node/grid_col_modifier.h"
17 #include <cstdint>
18 #include "core/pipeline/base/element_register.h"
19 #include "core/components_ng/base/frame_node.h"
20 #include "core/components_ng/base/view_abstract.h"
21 #include "core/components/common/layout/constants.h"
22 #include "core/components_ng/pattern/grid_col/grid_col_model_ng.h"
23 
24 namespace OHOS::Ace::NG {
25 constexpr int32_t SIZE_ARRAY = 6;
26 constexpr int COL_0 = 0;
27 constexpr int COL_1 = 1;
28 constexpr int COL_2 = 2;
29 constexpr int COL_3 = 3;
30 constexpr int COL_4 = 4;
31 constexpr int COL_5 = 5;
32 
InheritGridContainerSize(OHOS::Ace::V2::GridContainerSize & gridContainerSize,int32_t * containerSizeArray,int32_t size,int32_t defaultVal)33 void InheritGridContainerSize(OHOS::Ace::V2::GridContainerSize &gridContainerSize,
34     int32_t *containerSizeArray, int32_t size, int32_t defaultVal)
35 {
36     if (containerSizeArray[0] == -1) {
37         containerSizeArray[0] = defaultVal;
38     }
39     for (int32_t i = 1; i < size; i++) {
40         if (containerSizeArray[i] == -1) {
41             containerSizeArray[i] = containerSizeArray[i - 1];
42         }
43     }
44     gridContainerSize.xs = containerSizeArray[COL_0];
45     gridContainerSize.sm = containerSizeArray[COL_1];
46     gridContainerSize.md = containerSizeArray[COL_2];
47     gridContainerSize.lg = containerSizeArray[COL_3];
48     gridContainerSize.xl = containerSizeArray[COL_4];
49     gridContainerSize.xxl = containerSizeArray[COL_5];
50 }
51 
SetSpan(ArkUINodeHandle node,int32_t * containerSizeArray,int32_t size)52 void SetSpan(ArkUINodeHandle node, int32_t *containerSizeArray, int32_t size)
53 {
54     auto *frameNode = reinterpret_cast<FrameNode *>(node);
55     CHECK_NULL_VOID(frameNode);
56     auto span = OHOS::Ace::V2::GridContainerSize(1);
57     InheritGridContainerSize(span, containerSizeArray, size, 1);
58     GridColModelNG::SetSpan(frameNode, span);
59 }
60 
ResetSpan(ArkUINodeHandle node)61 void ResetSpan(ArkUINodeHandle node)
62 {
63     auto *frameNode = reinterpret_cast<FrameNode *>(node);
64     CHECK_NULL_VOID(frameNode);
65     auto span = OHOS::Ace::V2::GridContainerSize(1);
66     int32_t containerSizeArray[SIZE_ARRAY] = {1, 1, 1, 1, 1, 1};
67     InheritGridContainerSize(span, containerSizeArray, SIZE_ARRAY, 1);
68     GridColModelNG::SetSpan(frameNode, span);
69 }
70 
SetGridColOffset(ArkUINodeHandle node,int32_t * containerSizeArray,int32_t size)71 void SetGridColOffset(ArkUINodeHandle node, int32_t *containerSizeArray, int32_t size)
72 {
73     auto *frameNode = reinterpret_cast<FrameNode *>(node);
74     CHECK_NULL_VOID(frameNode);
75     auto offset = OHOS::Ace::V2::GridContainerSize(0);
76     InheritGridContainerSize(offset, containerSizeArray, size, 0);
77     GridColModelNG::SetOffset(frameNode, offset);
78 }
79 
ResetGridColOffset(ArkUINodeHandle node)80 void ResetGridColOffset(ArkUINodeHandle node)
81 {
82     auto *frameNode = reinterpret_cast<FrameNode *>(node);
83     CHECK_NULL_VOID(frameNode);
84     auto offset = OHOS::Ace::V2::GridContainerSize(0);
85     int32_t containerSizeArray[SIZE_ARRAY] = {0};
86     InheritGridContainerSize(offset, containerSizeArray, SIZE_ARRAY, 0);
87     GridColModelNG::SetOffset(frameNode, offset);
88 }
89 
SetOrder(ArkUINodeHandle node,int32_t * containerSizeArray,int32_t size)90 void SetOrder(ArkUINodeHandle node, int32_t *containerSizeArray, int32_t size)
91 {
92     auto *frameNode = reinterpret_cast<FrameNode *>(node);
93     CHECK_NULL_VOID(frameNode);
94     auto Order = OHOS::Ace::V2::GridContainerSize(0);
95     InheritGridContainerSize(Order, containerSizeArray, size, 0);
96     GridColModelNG::SetOrder(frameNode, Order);
97 }
98 
ResetOrder(ArkUINodeHandle node)99 void ResetOrder(ArkUINodeHandle node)
100 {
101     auto *frameNode = reinterpret_cast<FrameNode *>(node);
102     CHECK_NULL_VOID(frameNode);
103     auto Order = OHOS::Ace::V2::GridContainerSize(0);
104     int32_t containerSizeArray[SIZE_ARRAY] = {0};
105     InheritGridContainerSize(Order, containerSizeArray, SIZE_ARRAY, 0);
106     GridColModelNG::SetOrder(frameNode, Order);
107 }
108 
109 namespace NodeModifier {
GetGridColModifier()110 const ArkUIGridColModifier* GetGridColModifier()
111 {
112     static const ArkUIGridColModifier modifier = {
113         SetSpan, ResetSpan, SetGridColOffset, ResetGridColOffset, SetOrder, ResetOrder,
114     };
115     return &modifier;
116 }
117 
GetCJUIGridColModifier()118 const CJUIGridColModifier* GetCJUIGridColModifier()
119 {
120     static const CJUIGridColModifier modifier = {
121         SetSpan, ResetSpan, SetGridColOffset, ResetGridColOffset, SetOrder, ResetOrder,
122     };
123     return &modifier;
124 }
125 }
126 }