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 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_BASE_LAYOUT_GRID_COLUMN_INFO_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_BASE_LAYOUT_GRID_COLUMN_INFO_H
18 
19 #include "core/components/common/layout/grid_container_info.h"
20 #include "core/components/common/layout/screen_system_manager.h"
21 
22 namespace OHOS::Ace {
23 
24 constexpr uint32_t DEFAULT_GRID_COLUMN_SPAN = 0;
25 
26 class GridColumnInfo : public GridLayoutInfo {
27     DECLARE_ACE_TYPE(GridColumnInfo, GridLayoutInfo);
28 
29 public:
30     class Builder : public AceType {
DECLARE_ACE_TYPE(Builder,AceType)31         DECLARE_ACE_TYPE(Builder, AceType)
32     public:
33         Builder()
34         {
35             columnInfo_ = AceType::Claim(new GridColumnInfo());
36         }
37         void SetXsSizeColumn(uint32_t xsSizeColumn, const Dimension& offset = UNDEFINED_DIMENSION)
38         {
39             columnInfo_->columns_[ScreenSizeType::XS] = static_cast<int32_t>(xsSizeColumn);
40             columnInfo_->dimOffsets_[ScreenSizeType::XS] = offset;
41         }
42 
43         void SetSmSizeColumn(uint32_t smSizeColumn, const Dimension& offset = UNDEFINED_DIMENSION)
44         {
45             columnInfo_->columns_[ScreenSizeType::SM] = static_cast<int32_t>(smSizeColumn);
46             columnInfo_->dimOffsets_[ScreenSizeType::SM] = offset;
47         }
48 
49         void SetMdSizeColumn(uint32_t mdSizeColumn, const Dimension& offset = UNDEFINED_DIMENSION)
50         {
51             columnInfo_->columns_[ScreenSizeType::MD] = static_cast<int32_t>(mdSizeColumn);
52             columnInfo_->dimOffsets_[ScreenSizeType::MD] = offset;
53         }
54 
55         void SetLgSizeColumn(uint32_t lgSizeColumn, const Dimension& offset = UNDEFINED_DIMENSION)
56         {
57             columnInfo_->columns_[ScreenSizeType::LG] = static_cast<int32_t>(lgSizeColumn);
58             columnInfo_->dimOffsets_[ScreenSizeType::LG] = offset;
59         }
60 
61         void SetSizeColumn(GridSizeType type, uint32_t column, const Dimension& offset = UNDEFINED_DIMENSION)
62         {
63             columnInfo_->columns_[type] = static_cast<int32_t>(column);
64             columnInfo_->dimOffsets_[type] = offset;
65         }
66 
SetSmSizeMaxColumn(uint32_t smSizeMaxColumn)67         void SetSmSizeMaxColumn(uint32_t smSizeMaxColumn)
68         {
69             columnInfo_->maxColumns_[ScreenSizeType::SM]  = static_cast<int32_t>(smSizeMaxColumn);
70         }
SetMdSizeMaxColumn(uint32_t mdSizeMaxColumn)71         void SetMdSizeMaxColumn(uint32_t mdSizeMaxColumn)
72         {
73             columnInfo_->maxColumns_[ScreenSizeType::MD]  = static_cast<int32_t>(mdSizeMaxColumn);
74         }
SetLgSizeMaxColumn(uint32_t lgSizeMaxColumn)75         void SetLgSizeMaxColumn(uint32_t lgSizeMaxColumn)
76         {
77             columnInfo_->maxColumns_[ScreenSizeType::LG] = static_cast<int32_t>(lgSizeMaxColumn);
78         }
79 
SetColumns(uint32_t columns)80         void SetColumns(uint32_t columns)
81         {
82             columnInfo_->columns_[ScreenSizeType::UNDEFINED] = static_cast<int32_t>(columns);
83         }
84 
85         void ACE_EXPORT SetOffset(int32_t offset, GridSizeType type = GridSizeType::UNDEFINED);
86 
SetParent(const RefPtr<GridContainerInfo> & parent)87         void SetParent(const RefPtr<GridContainerInfo>& parent)
88         {
89             columnInfo_->parent_ = parent;
90         }
91 
Build()92         const RefPtr<GridColumnInfo>& Build() const
93         {
94             return columnInfo_;
95         }
96 
97     private:
98         RefPtr<GridColumnInfo> columnInfo_;
99     };
100 
101     ~GridColumnInfo() override = default;
102     double GetWidth() const;
103     double GetWidth(uint32_t columns) const;
104     double GetMaxWidth() const;
105     Dimension GetOffset() const;
GetParent()106     const RefPtr<GridContainerInfo>& GetParent() const
107     {
108         return parent_;
109     }
GetColumns()110     uint32_t GetColumns() const
111     {
112         return columns_[ScreenSizeType::UNDEFINED];
113     }
GetOffset(GridSizeType type)114     int32_t GetOffset(GridSizeType type) const
115     {
116         return offsets_[type];
117     }
GetColumns(GridSizeType type)118     uint32_t GetColumns(GridSizeType type) const
119     {
120         return IsValid(type) ? columns_[type] : DEFAULT_GRID_COLUMN_SPAN;
121     }
122 
123 private:
124     static constexpr int32_t INVALID_OFFSET = -1;
125 
GridColumnInfo()126     GridColumnInfo()
127     {
128         // default column and offset which no define column of the size
129         columns_[ScreenSizeType::UNDEFINED] = DEFAULT_GRID_COLUMN_SPAN;
130     }
131 
132     bool hasColumnOffset_ = false;
133     ArrayByScreenType<int32_t> columns_ {0};
134     ArrayByScreenType<int32_t> maxColumns_ {0};
135     ArrayByScreenType<Dimension> dimOffsets_ {UNDEFINED_DIMENSION};
136     ArrayByScreenType<int32_t> offsets_ {INVALID_OFFSET};
137     // parent container grid infos
138     RefPtr<GridContainerInfo> parent_;
139 };
140 
141 } // namespace OHOS::Ace
142 
143 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_BASE_LAYOUT_GRID_COLUMN_INFO_H
144