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