• 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_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 };
88 
89 } // namespace
90 
ToString() const91 std::string SystemGridInfo::ToString() const
92 {
93     auto json = JsonUtil::Create(true);
94     double dipScale = GridSystemManager::GetInstance().GetDipScale();
95     json->Put("columns", columns);
96     json->Put("gutter", gutter.ConvertToPx(dipScale));
97     json->Put("margin", margin.ConvertToPx(dipScale));
98     return json->ToString();
99 }
100 
101 GridSystemManager* GridSystemManager::instance_ = nullptr;
102 
103 std::mutex GridSystemManager::mutex_;
104 
GetInstance()105 GridSystemManager& GridSystemManager::GetInstance()
106 {
107     if (instance_ == nullptr) {
108         std::lock_guard<std::mutex> lock(mutex_);
109         if (instance_ == nullptr) {
110             instance_ = new GridSystemManager();
111         }
112     }
113     return *instance_;
114 }
115 
GetInfoByType(const GridColumnType & columnType)116 RefPtr<GridColumnInfo> GridSystemManager::GetInfoByType(const GridColumnType& columnType)
117 {
118     auto iter = SYSTEM_GRID_TYPES.find(columnType);
119     if (iter != SYSTEM_GRID_TYPES.end()) {
120         GridContainerInfo::Builder containerBuilder;
121         containerBuilder.SetGutterWidth(iter->second[COLUMN_SM].gutter);
122         containerBuilder.SetMarginLeft(iter->second[COLUMN_SM].margin);
123         containerBuilder.SetMarginRight(iter->second[COLUMN_SM].margin);
124         containerBuilder.SetColumnType(columnType);
125 
126         GridColumnInfo::Builder columnBuilder;
127         columnBuilder.SetParent(containerBuilder.Build());
128         columnBuilder.SetSmSizeColumn(iter->second[COLUMN_SM].columns);
129         columnBuilder.SetMdSizeColumn(iter->second[COLUMN_MD].columns);
130         columnBuilder.SetLgSizeColumn(iter->second[COLUMN_LG].columns);
131         columnBuilder.SetSmSizeMaxColumn(iter->second[COLUMN_SM].maxColumns);
132         columnBuilder.SetMdSizeMaxColumn(iter->second[COLUMN_MD].maxColumns);
133         columnBuilder.SetLgSizeMaxColumn(iter->second[COLUMN_LG].maxColumns);
134         return columnBuilder.Build();
135     }
136     LOGE("not find column type: %d", columnType);
137     return nullptr;
138 }
139 
GetSystemGridInfo(const GridSizeType & sizeType)140 SystemGridInfo GridSystemManager::GetSystemGridInfo(const GridSizeType& sizeType)
141 {
142     if (sizeType == GridSizeType::XS) {
143         return GRID_COLUMNS_2;
144     } else if (sizeType == GridSizeType::SM) {
145         return GRID_COLUMNS_4;
146     } else if (sizeType == GridSizeType::MD) {
147         return GRID_COLUMNS_8;
148     } else if (sizeType >= GridSizeType::LG) {
149         return GRID_COLUMNS_12;
150     }
151 
152     return SystemGridInfo();
153 }
154 
GetCurrentGridInfo()155 const SystemGridInfo& GridSystemManager::GetCurrentGridInfo()
156 {
157     GridSizeType sizeType = ScreenSystemManager::GetInstance().GetCurrentSize();
158     systemGridInfo_ = GetSystemGridInfo(sizeType);
159     LOGD("GetCurrentGridInfo: %{public}f: sizeType = %{public}d", GetScreenWidth(), systemGridInfo_.sizeType);
160     return systemGridInfo_;
161 }
162 
GetSystemGridInfo(const GridTemplateType & templateType,double width)163 SystemGridInfo GridSystemManager::GetSystemGridInfo(const GridTemplateType& templateType, double width)
164 {
165     GridSizeType sizeType = ScreenSystemManager::GetInstance().GetSize(width);
166     if (templateType == GridTemplateType::NORMAL) {
167         return GetSystemGridInfo(sizeType);
168     }
169     if (sizeType == GridSizeType::XS || sizeType == GridSizeType::SM) {
170         return GRID_TEMPLATE_COLUMNS_4;
171     } else if (sizeType == GridSizeType::MD) {
172         return GRID_TEMPLATE_COLUMNS_8;
173     } else {
174         return GRID_TEMPLATE_COLUMNS_12;
175     }
176 }
177 
178 } // namespace OHOS::Ace
179