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 "core/interfaces/native/node/grid_row_modifier.h"
16
17 #include "core/pipeline/base/element_register.h"
18 #include "core/components_ng/base/frame_node.h"
19 #include "core/components_ng/base/view_abstract.h"
20 #include "core/components/common/layout/constants.h"
21 #include "core/components/common/properties/alignment.h"
22 #include "core/components_ng/pattern/grid_row/grid_row_model_ng.h"
23
24 namespace OHOS::Ace::NG {
25 constexpr int XS = 0;
26 constexpr int SM = 1;
27 constexpr int MD = 2;
28 constexpr int LG = 3;
29 constexpr int XL = 4;
30 constexpr int XXL = 5;
31 constexpr int X_XS = 0;
32 constexpr int X_SM = 1;
33 constexpr int X_MD = 2;
34 constexpr int X_LG = 3;
35 constexpr int X_XL = 4;
36 constexpr int X_XXL = 5;
37 constexpr int Y_XS = 6;
38 constexpr int Y_SM = 7;
39 constexpr int Y_MD = 8;
40 constexpr int Y_LG = 9;
41 constexpr int Y_XL = 10;
42 constexpr int Y_XXL = 11;
SetAlignItems(ArkUINodeHandle node,int32_t alignItems)43 void SetAlignItems(ArkUINodeHandle node, int32_t alignItems)
44 {
45 auto* frameNode = reinterpret_cast<FrameNode*>(node);
46 CHECK_NULL_VOID(frameNode);
47 FlexAlign alignItemsValue = static_cast<FlexAlign>(alignItems);
48 GridRowModelNG::SetAlignItems(frameNode, alignItemsValue);
49 }
50
ResetAlignItems(ArkUINodeHandle node)51 void ResetAlignItems(ArkUINodeHandle node)
52 {
53 auto* frameNode = reinterpret_cast<FrameNode*>(node);
54 CHECK_NULL_VOID(frameNode);
55 FlexAlign resetValue = FlexAlign::FLEX_START;
56 GridRowModelNG::SetAlignItems(frameNode, resetValue);
57 }
58
InheritGridRowGutterOption(const RefPtr<V2::Gutter> & gutter,int32_t * gutterSizeArray)59 void InheritGridRowGutterOption(const RefPtr<V2::Gutter>& gutter,
60 int32_t *gutterSizeArray)
61 {
62 gutter->xXs = Dimension(gutterSizeArray[X_XS], DimensionUnit::VP);
63 gutter->xSm = Dimension(gutterSizeArray[X_SM], DimensionUnit::VP);
64 gutter->xMd = Dimension(gutterSizeArray[X_MD], DimensionUnit::VP);
65 gutter->xLg = Dimension(gutterSizeArray[X_LG], DimensionUnit::VP);
66 gutter->xXl = Dimension(gutterSizeArray[X_XL], DimensionUnit::VP);
67 gutter->xXXl = Dimension(gutterSizeArray[X_XXL], DimensionUnit::VP);
68 gutter->yXs = Dimension(gutterSizeArray[Y_XS], DimensionUnit::VP);
69 gutter->ySm = Dimension(gutterSizeArray[Y_SM], DimensionUnit::VP);
70 gutter->yMd = Dimension(gutterSizeArray[Y_MD], DimensionUnit::VP);
71 gutter->yLg = Dimension(gutterSizeArray[Y_LG], DimensionUnit::VP);
72 gutter->yXl = Dimension(gutterSizeArray[Y_XL], DimensionUnit::VP);
73 gutter->yXXl = Dimension(gutterSizeArray[Y_XXL], DimensionUnit::VP);
74 }
75
InheritGridRowOption(const RefPtr<OHOS::Ace::V2::GridContainerSize> & gridContainerSize,int32_t * containerSizeArray,int32_t size,int32_t defaultVal)76 void InheritGridRowOption(const RefPtr<OHOS::Ace::V2::GridContainerSize> &gridContainerSize,
77 int32_t *containerSizeArray, int32_t size, int32_t defaultVal)
78 {
79 if (containerSizeArray[0] == -1) {
80 containerSizeArray[0] = defaultVal;
81 }
82 for (int32_t i = 1; i < size; i++) {
83 if (containerSizeArray[i] == -1) {
84 containerSizeArray[i] = containerSizeArray[i - 1];
85 }
86 }
87 gridContainerSize->xs = containerSizeArray[XS];
88 gridContainerSize->sm = containerSizeArray[SM];
89 gridContainerSize->md = containerSizeArray[MD];
90 gridContainerSize->lg = containerSizeArray[LG];
91 gridContainerSize->xl = containerSizeArray[XL];
92 gridContainerSize->xxl = containerSizeArray[XXL];
93 }
94
SetDirection(ArkUINodeHandle node,int32_t direction)95 void SetDirection(ArkUINodeHandle node, int32_t direction)
96 {
97 auto* frameNode = reinterpret_cast<FrameNode*>(node);
98 CHECK_NULL_VOID(frameNode);
99
100 auto parsedDirection = static_cast<V2::GridRowDirection>(direction);
101 GridRowModelNG::SetDirection(frameNode, parsedDirection);
102 }
103
ResetDirection(ArkUINodeHandle node)104 void ResetDirection(ArkUINodeHandle node)
105 {
106 auto* frameNode = reinterpret_cast<FrameNode*>(node);
107 CHECK_NULL_VOID(frameNode);
108 auto direction = V2::GridRowDirection::Row;
109 GridRowModelNG::SetDirection(frameNode, direction);
110 }
111
SetBreakpoints(ArkUINodeHandle node,int32_t reference,const ArkUI_Float32 * pointValues,const char * pointStr[],int32_t size)112 void SetBreakpoints(ArkUINodeHandle node, int32_t reference, const ArkUI_Float32* pointValues,
113 const char* pointStr[], int32_t size)
114 {
115 auto* frameNode = reinterpret_cast<FrameNode*>(node);
116 CHECK_NULL_VOID(frameNode);
117
118 auto parsedBreakpoints = Referenced::MakeRefPtr<V2::BreakPoints>();
119 parsedBreakpoints->reference = static_cast<V2::BreakPointsReference>(reference);
120 parsedBreakpoints->breakpoints.clear();
121 if (size > 0) {
122 double width = -1.0;
123 for (int32_t i = 0; i < size; i++) {
124 CalcDimension valueDimension = Dimension(pointValues[i], DimensionUnit::VP);
125 if (GreatNotEqual(width, valueDimension.Value())) {
126 break;
127 }
128 width = valueDimension.Value();
129 parsedBreakpoints->breakpoints.push_back(pointStr[i]);
130 }
131 }
132 GridRowModelNG::SetBreakpoints(frameNode, parsedBreakpoints);
133 }
134
ResetBreakpoints(ArkUINodeHandle node)135 void ResetBreakpoints(ArkUINodeHandle node)
136 {
137 auto* frameNode = reinterpret_cast<FrameNode*>(node);
138 CHECK_NULL_VOID(frameNode);
139 auto parsedBreakpoints = Referenced::MakeRefPtr<V2::BreakPoints>();
140 GridRowModelNG::SetBreakpoints(frameNode, parsedBreakpoints);
141 }
142
SetColumns(ArkUINodeHandle node,int32_t * containerSizeArray,int32_t size)143 void SetColumns(ArkUINodeHandle node, int32_t *containerSizeArray, int32_t size)
144 {
145 auto* frameNode = reinterpret_cast<FrameNode*>(node);
146 CHECK_NULL_VOID(frameNode);
147 auto parsedColumns = Referenced::MakeRefPtr<V2::GridContainerSize>(12);
148 InheritGridRowOption(parsedColumns, containerSizeArray, size, 0);
149 GridRowModelNG::SetColumns(frameNode, parsedColumns);
150 }
151
ResetColumns(ArkUINodeHandle node)152 void ResetColumns(ArkUINodeHandle node)
153 {
154 auto* frameNode = reinterpret_cast<FrameNode*>(node);
155 CHECK_NULL_VOID(frameNode);
156 auto parsedColumns = Referenced::MakeRefPtr<V2::GridContainerSize>(12);
157 GridRowModelNG::SetColumns(frameNode, parsedColumns);
158 }
159
SetGutter(ArkUINodeHandle node,int32_t * containerSizeArray,int32_t size)160 void SetGutter(ArkUINodeHandle node, int32_t *containerSizeArray, int32_t size)
161 {
162 auto* frameNode = reinterpret_cast<FrameNode*>(node);
163 CHECK_NULL_VOID(frameNode);
164
165 auto parsedGutter = Referenced::MakeRefPtr<V2::Gutter>();
166 InheritGridRowGutterOption(parsedGutter, containerSizeArray);
167 GridRowModelNG::SetGutter(frameNode, parsedGutter);
168 }
169
ResetGutter(ArkUINodeHandle node)170 void ResetGutter(ArkUINodeHandle node)
171 {
172 auto* frameNode = reinterpret_cast<FrameNode*>(node);
173 CHECK_NULL_VOID(frameNode);
174 auto parsedGutter = Referenced::MakeRefPtr<V2::Gutter>();
175 GridRowModelNG::SetGutter(frameNode, parsedGutter);
176 }
177
SetOnBreakpointChange(ArkUINodeHandle node,void * callback)178 void SetOnBreakpointChange(ArkUINodeHandle node, void* callback)
179 {
180 auto* frameNode = reinterpret_cast<FrameNode*>(node);
181 CHECK_NULL_VOID(frameNode);
182 if (callback) {
183 auto onBreakpointChange = reinterpret_cast<std::function<void(const std::string&)>*>(callback);
184 GridRowModelNG::SetOnBreakPointChange(frameNode, std::move(*onBreakpointChange));
185 } else {
186 GridRowModelNG::SetOnBreakPointChange(frameNode, nullptr);
187 }
188 }
189
ResetOnBreakpointChange(ArkUINodeHandle node)190 void ResetOnBreakpointChange(ArkUINodeHandle node)
191 {
192 auto *frameNode = reinterpret_cast<FrameNode *>(node);
193 CHECK_NULL_VOID(frameNode);
194 GridRowModelNG::SetOnBreakPointChange(frameNode, nullptr);
195 }
196
197 namespace NodeModifier {
GetGridRowModifier()198 const ArkUIGridRowModifier* GetGridRowModifier()
199 {
200 static const ArkUIGridRowModifier modifier = { SetAlignItems, ResetAlignItems, SetDirection, ResetDirection,
201 SetBreakpoints, ResetBreakpoints, SetColumns, ResetColumns, SetGutter, ResetGutter,
202 SetOnBreakpointChange, ResetOnBreakpointChange };
203 return &modifier;
204 }
205
GetCJUIGridRowModifier()206 const CJUIGridRowModifier* GetCJUIGridRowModifier()
207 {
208 static const CJUIGridRowModifier modifier = { SetAlignItems, ResetAlignItems, SetDirection, ResetDirection,
209 SetBreakpoints, ResetBreakpoints, SetColumns, ResetColumns, SetGutter, ResetGutter };
210 return &modifier;
211 }
212 }
213 }