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 }