• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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/components/common/layout/grid_system_manager.h"
17 
18 #include <map>
19 #include <vector>
20 
21 #include "base/json/json_util.h"
22 #include "base/log/log.h"
23 
24 namespace OHOS::Ace {
25 namespace {
26 
27 constexpr Dimension COLUMN_2_AND_4_BREAKPOINT = 320.0_vp;
28 constexpr Dimension COLUMN_4_AND_8_BREAKPOINT = 600.0_vp;
29 constexpr Dimension COLUMN_8_AND_12_BREAKPOINT = 840.0_vp;
30 constexpr Dimension SMALL_GUTTER = 12.0_vp;
31 constexpr Dimension SMALL_MARGIN = 12.0_vp;
32 constexpr Dimension LARGE_GUTTER = 24.0_vp;
33 constexpr Dimension LARGE_MARGIN = 24.0_vp;
34 constexpr Dimension CAR_SMALL_GUTTER = 16.0_vp;
35 constexpr Dimension CAR_SMALL_MARGIN = 32.0_vp;
36 constexpr uint32_t COLUMN_SM = 0;
37 constexpr uint32_t COLUMN_MD = 1;
38 constexpr uint32_t COLUMN_LG = 2;
39 
40 const SystemGridInfo GRID_COLUMNS_2(GridSizeType::XS, SMALL_GUTTER, SMALL_MARGIN, 2);
41 const SystemGridInfo GRID_COLUMNS_4(GridSizeType::SM, LARGE_GUTTER, LARGE_MARGIN, 4);
42 const SystemGridInfo GRID_COLUMNS_8(GridSizeType::MD, LARGE_GUTTER, 32.0_vp, 8);
43 const SystemGridInfo GRID_COLUMNS_12(GridSizeType::LG, LARGE_GUTTER, 48.0_vp, 12);
44 
45 const SystemGridInfo GRID_TEMPLATE_COLUMNS_4(GridSizeType::SM, SMALL_GUTTER, LARGE_MARGIN, 4);
46 const SystemGridInfo GRID_TEMPLATE_COLUMNS_8(GridSizeType::MD, SMALL_GUTTER, 32.0_vp, 8);
47 const SystemGridInfo GRID_TEMPLATE_COLUMNS_12(GridSizeType::LG, SMALL_GUTTER, 48.0_vp, 12);
48 
49 const std::map<GridColumnType, std::vector<SystemGridInfo>> SYSTEM_GRID_TYPES = {
50     { GridColumnType::BUBBLE_TYPE, { SystemGridInfo(GridSizeType::SM, LARGE_GUTTER, LARGE_MARGIN, 4),
51                                        SystemGridInfo(GridSizeType::MD, LARGE_GUTTER, LARGE_MARGIN, 6),
52                                        SystemGridInfo(GridSizeType::LG, LARGE_GUTTER, LARGE_MARGIN, 6) } },
53     { GridColumnType::BUTTON_TYPE, { SystemGridInfo(GridSizeType::SM, LARGE_GUTTER, LARGE_MARGIN, 4),
54                                        SystemGridInfo(GridSizeType::MD, LARGE_GUTTER, LARGE_MARGIN, 6),
55                                        SystemGridInfo(GridSizeType::LG, LARGE_GUTTER, LARGE_MARGIN, 8) } },
56     { GridColumnType::CARD_TYPE, { SystemGridInfo(GridSizeType::SM, SMALL_GUTTER, SMALL_MARGIN, 4),
57                                      SystemGridInfo(GridSizeType::MD, SMALL_GUTTER, SMALL_MARGIN, 6),
58                                      SystemGridInfo(GridSizeType::LG, SMALL_GUTTER, SMALL_MARGIN, 8) } },
59     { GridColumnType::CONTENT_TYPE, { SystemGridInfo(GridSizeType::SM, LARGE_GUTTER, LARGE_MARGIN, 4),
60                                         SystemGridInfo(GridSizeType::MD, LARGE_GUTTER, LARGE_MARGIN, 6),
61                                         SystemGridInfo(GridSizeType::LG, LARGE_GUTTER, LARGE_MARGIN, 8) } },
62     { GridColumnType::MENU, { SystemGridInfo(GridSizeType::SM, LARGE_GUTTER, LARGE_MARGIN, 2, 4),
63                                 SystemGridInfo(GridSizeType::MD, LARGE_GUTTER, LARGE_MARGIN, 2, 6),
64                                 SystemGridInfo(GridSizeType::LG, LARGE_GUTTER, LARGE_MARGIN, 2, 8) } },
65     { GridColumnType::TOAST, { SystemGridInfo(GridSizeType::SM, LARGE_GUTTER, LARGE_MARGIN, 2, 4),
66                                  SystemGridInfo(GridSizeType::MD, LARGE_GUTTER, LARGE_MARGIN, 2, 6),
67                                  SystemGridInfo(GridSizeType::LG, LARGE_GUTTER, LARGE_MARGIN, 2, 6) } },
68     { GridColumnType::TOOL_BAR, { SystemGridInfo(GridSizeType::SM, LARGE_GUTTER, LARGE_MARGIN, 4),
69                                     SystemGridInfo(GridSizeType::MD, LARGE_GUTTER, LARGE_MARGIN, 8),
70                                     SystemGridInfo(GridSizeType::LG, LARGE_GUTTER, LARGE_MARGIN, 12) } },
71     { GridColumnType::PANEL, { SystemGridInfo(GridSizeType::SM, SMALL_GUTTER, SMALL_MARGIN, 4),
72                                  SystemGridInfo(GridSizeType::MD, SMALL_GUTTER, SMALL_MARGIN, 6),
73                                  SystemGridInfo(GridSizeType::LG, SMALL_GUTTER, SMALL_MARGIN, 6) } },
74     { GridColumnType::DIALOG, { SystemGridInfo(GridSizeType::SM, LARGE_GUTTER, LARGE_MARGIN, 3),
75                                   SystemGridInfo(GridSizeType::MD, LARGE_GUTTER, LARGE_MARGIN, 4),
76                                   SystemGridInfo(GridSizeType::LG, LARGE_GUTTER, LARGE_MARGIN, 5) } },
77     { GridColumnType::CAR_DIALOG, { SystemGridInfo(GridSizeType::SM, CAR_SMALL_GUTTER, CAR_SMALL_MARGIN, 4),
78                                       SystemGridInfo(GridSizeType::MD, CAR_SMALL_GUTTER, CAR_SMALL_MARGIN, 8),
79                                       SystemGridInfo(GridSizeType::LG, CAR_SMALL_GUTTER, CAR_SMALL_MARGIN, 12) } },
80 };
81 
82 } // namespace
83 
ToString() const84 std::string SystemGridInfo::ToString() const
85 {
86     auto json = JsonUtil::Create(true);
87     double dipScale = GridSystemManager::GetInstance().GetDipScale();
88     json->Put("columns", columns);
89     json->Put("gutter", gutter.ConvertToPx(dipScale));
90     json->Put("margin", margin.ConvertToPx(dipScale));
91     return json->ToString();
92 }
93 
94 GridSystemManager* GridSystemManager::instance_ = nullptr;
95 
96 std::mutex GridSystemManager::mutex_;
97 
GetInstance()98 GridSystemManager& GridSystemManager::GetInstance()
99 {
100     if (instance_ == nullptr) {
101         std::lock_guard<std::mutex> lock(mutex_);
102         if (instance_ == nullptr) {
103             instance_ = new GridSystemManager();
104         }
105     }
106     return *instance_;
107 }
108 
GetInfoByType(const GridColumnType & columnType)109 RefPtr<GridColumnInfo> GridSystemManager::GetInfoByType(const GridColumnType& columnType)
110 {
111     auto iter = SYSTEM_GRID_TYPES.find(columnType);
112     if (iter != SYSTEM_GRID_TYPES.end()) {
113         GridContainerInfo::Builder containerBuilder;
114         containerBuilder.SetGutterWidth(iter->second[COLUMN_SM].gutter);
115         containerBuilder.SetMarginLeft(iter->second[COLUMN_SM].margin);
116         containerBuilder.SetMarginRight(iter->second[COLUMN_SM].margin);
117         containerBuilder.SetColumnType(columnType);
118 
119         GridColumnInfo::Builder columnBuilder;
120         columnBuilder.SetParent(containerBuilder.Build());
121         columnBuilder.SetSmSizeColumn(iter->second[COLUMN_SM].columns);
122         columnBuilder.SetMdSizeColumn(iter->second[COLUMN_MD].columns);
123         columnBuilder.SetLgSizeColumn(iter->second[COLUMN_LG].columns);
124         columnBuilder.SetSmSizeMaxColumn(iter->second[COLUMN_SM].maxColumns);
125         columnBuilder.SetMdSizeMaxColumn(iter->second[COLUMN_MD].maxColumns);
126         columnBuilder.SetLgSizeMaxColumn(iter->second[COLUMN_LG].maxColumns);
127         return columnBuilder.Build();
128     }
129     LOGE("not find column type: %d", columnType);
130     return nullptr;
131 }
132 
GetSystemGridInfo(const GridSizeType & sizeType)133 SystemGridInfo GridSystemManager::GetSystemGridInfo(const GridSizeType& sizeType)
134 {
135     if (sizeType == GridSizeType::XS) {
136         return GRID_COLUMNS_2;
137     } else if (sizeType == GridSizeType::SM) {
138         return GRID_COLUMNS_4;
139     } else if (sizeType == GridSizeType::MD) {
140         return GRID_COLUMNS_8;
141     } else if (sizeType == GridSizeType::LG) {
142         return GRID_COLUMNS_12;
143     }
144 
145     return SystemGridInfo();
146 }
147 
OnSurfaceChanged(double width)148 void GridSystemManager::OnSurfaceChanged(double width)
149 {
150     screenWidth_ = width;
151     if (width < COLUMN_2_AND_4_BREAKPOINT.Value() * density_) {
152         currentSize_ = GridSizeType::XS;
153         systemGridInfo_ = GRID_COLUMNS_2;
154     } else if (width < COLUMN_4_AND_8_BREAKPOINT.Value() * density_) {
155         currentSize_ = GridSizeType::SM;
156         systemGridInfo_ = GRID_COLUMNS_4;
157     } else if (width < COLUMN_8_AND_12_BREAKPOINT.Value() * density_) {
158         currentSize_ = GridSizeType::MD;
159         systemGridInfo_ = GRID_COLUMNS_8;
160     } else {
161         currentSize_ = GridSizeType::LG;
162         systemGridInfo_ = GRID_COLUMNS_12;
163     }
164     currentSize_ = systemGridInfo_.sizeType;
165 
166     LOGD("OnSurfaceChanged: %{public}f: sizeType = %{public}d", width, systemGridInfo_.sizeType);
167 }
168 
GetSystemGridInfo(const GridTemplateType & templateType,double width)169 SystemGridInfo GridSystemManager::GetSystemGridInfo(const GridTemplateType& templateType, double width)
170 {
171     // Input width is normalized in px.
172     if (templateType == GridTemplateType::NORMAL) {
173         if (width < COLUMN_2_AND_4_BREAKPOINT.Value() * dipScale_) {
174             return GRID_COLUMNS_2;
175         } else if (width < COLUMN_4_AND_8_BREAKPOINT.Value() * dipScale_) {
176             return GRID_COLUMNS_4;
177         } else if (width < COLUMN_8_AND_12_BREAKPOINT.Value() * dipScale_) {
178             return GRID_COLUMNS_8;
179         } else {
180             return GRID_COLUMNS_12;
181         }
182     }
183     if (width < COLUMN_4_AND_8_BREAKPOINT.Value() * dipScale_) {
184         return GRID_TEMPLATE_COLUMNS_4;
185     } else if (width < COLUMN_8_AND_12_BREAKPOINT.Value() * dipScale_) {
186         return GRID_TEMPLATE_COLUMNS_8;
187     } else {
188         return GRID_TEMPLATE_COLUMNS_12;
189     }
190 }
191 
192 } // namespace OHOS::Ace
193