1 /*
2  * Copyright (c) 2024 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 "bridge/cj_frontend/interfaces/cj_ffi/cj_grid_col_ffi.h"
17 
18 #include "core/components_ng/base/view_abstract.h"
19 #include "core/components_ng/pattern/grid_col/grid_col_model_ng.h"
20 
21 using namespace OHOS::Ace;
22 
23 namespace {
24 constexpr size_t MAX_NUMBER_BREAKPOINT = 6;
25 
InheritGridContainerSize(V2::GridContainerSize & gridContainerSize,std::optional<int32_t> (& containerSizeArray)[MAX_NUMBER_BREAKPOINT],int32_t defaultVal)26 void InheritGridContainerSize(V2::GridContainerSize& gridContainerSize,
27     std::optional<int32_t> (&containerSizeArray)[MAX_NUMBER_BREAKPOINT], int32_t defaultVal)
28 {
29     if (!containerSizeArray[0].has_value()) {
30         containerSizeArray[0] = defaultVal;
31     }
32     for (size_t i = 1; i < MAX_NUMBER_BREAKPOINT; i++) {
33         if (!containerSizeArray[i].has_value()) {
34             containerSizeArray[i] = containerSizeArray[i - 1].value();
35         }
36     }
37     int32_t index = 0;
38     gridContainerSize.xs = containerSizeArray[index++].value();
39     gridContainerSize.sm = containerSizeArray[index++].value();
40     gridContainerSize.md = containerSizeArray[index++].value();
41     gridContainerSize.lg = containerSizeArray[index++].value();
42     gridContainerSize.xl = containerSizeArray[index++].value();
43     gridContainerSize.xxl = containerSizeArray[index].value();
44 }
45 
ParserGridContainerSize(int32_t columnNumber,int32_t defaultVal)46 V2::GridContainerSize ParserGridContainerSize(int32_t columnNumber, int32_t defaultVal)
47 {
48     auto gridContainerSize = columnNumber >= 0 ? V2::GridContainerSize(columnNumber)
49                                                : V2::GridContainerSize(defaultVal);
50     return gridContainerSize;
51 }
52 
ParserGridContainerSize(GridRowColumnOption columnNumber,int32_t defaultVal)53 V2::GridContainerSize ParserGridContainerSize(GridRowColumnOption columnNumber, int32_t defaultVal)
54 {
55     auto gridContainerSize = V2::GridContainerSize(defaultVal);
56     std::optional<int32_t> containerSizeArray[MAX_NUMBER_BREAKPOINT];
57     int32_t index = 0;
58     containerSizeArray[index++] = columnNumber.xs;
59     containerSizeArray[index++] = columnNumber.sm;
60     containerSizeArray[index++] = columnNumber.md;
61     containerSizeArray[index++] = columnNumber.lg;
62     containerSizeArray[index++] = columnNumber.xl;
63     containerSizeArray[index] = columnNumber.xxl;
64     InheritGridContainerSize(gridContainerSize, containerSizeArray, defaultVal);
65     return gridContainerSize;
66 }
67 } // namespace
68 
69 extern "C" {
FfiOHOSAceFrameworkGridColCreate()70 void FfiOHOSAceFrameworkGridColCreate()
71 {
72     GridColModel::GetInstance()->Create();
73 }
74 
FfiOHOSAceFrameworkGridColCreateWithInt32(int32_t span,int32_t offset,int32_t order)75 void FfiOHOSAceFrameworkGridColCreateWithInt32(int32_t span, int32_t offset, int32_t order)
76 {
77     auto spanSize = ParserGridContainerSize(span, 1);
78     auto offsetSize = ParserGridContainerSize(offset, 0);
79     auto orderSize = ParserGridContainerSize(order, 0);
80     GridColModel::GetInstance()->Create(spanSize, offsetSize, orderSize);
81 }
82 
FfiOHOSAceFrameworkGridColCreateWithOption(GridRowColumnOption span,GridRowColumnOption offset,GridRowColumnOption order)83 void FfiOHOSAceFrameworkGridColCreateWithOption(
84     GridRowColumnOption span, GridRowColumnOption offset, GridRowColumnOption order)
85 {
86     auto spanSize = ParserGridContainerSize(span, 1);
87     auto offsetSize = ParserGridContainerSize(offset, 0);
88     auto orderSize = ParserGridContainerSize(order, 0);
89     GridColModel::GetInstance()->Create(spanSize, offsetSize, orderSize);
90 }
91 
FfiOHOSAceFrameworkGridColSetSpan(int32_t span)92 void FfiOHOSAceFrameworkGridColSetSpan(int32_t span)
93 {
94     auto spanSize = ParserGridContainerSize(span, 1);
95     GridColModel::GetInstance()->SetSpan(spanSize);
96 }
97 
FfiOHOSAceFrameworkGridColSetSpanWithOption(GridRowColumnOption span)98 void FfiOHOSAceFrameworkGridColSetSpanWithOption(GridRowColumnOption span)
99 {
100     auto spanSize = ParserGridContainerSize(span, 1);
101     GridColModel::GetInstance()->SetSpan(spanSize);
102 }
103 
FfiOHOSAceFrameworkGridColSetOffset(int32_t offset)104 void FfiOHOSAceFrameworkGridColSetOffset(int32_t offset)
105 {
106     auto offsetSize = ParserGridContainerSize(offset, 0);
107     GridColModel::GetInstance()->SetOffset(offsetSize);
108 }
109 
FfiOHOSAceFrameworkGridColSetOffsetWithOption(GridRowColumnOption offset)110 void FfiOHOSAceFrameworkGridColSetOffsetWithOption(GridRowColumnOption offset)
111 {
112     auto offsetSize = ParserGridContainerSize(offset, 0);
113     GridColModel::GetInstance()->SetOffset(offsetSize);
114 }
115 
FfiOHOSAceFrameworkGridColSetOrder(int32_t order)116 void FfiOHOSAceFrameworkGridColSetOrder(int32_t order)
117 {
118     auto orderSize = ParserGridContainerSize(order, 0);
119     GridColModel::GetInstance()->SetOrder(orderSize);
120 }
121 
FfiOHOSAceFrameworkGridColSetOrderWithOption(GridRowColumnOption order)122 void FfiOHOSAceFrameworkGridColSetOrderWithOption(GridRowColumnOption order)
123 {
124     auto orderSize = ParserGridContainerSize(order, 0);
125     GridColModel::GetInstance()->SetOrder(orderSize);
126 }
127 }
128