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