• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2025 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_NG_PATTERN_GRID_GRID_LAYOUT_PROPERTY_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_GRID_GRID_LAYOUT_PROPERTY_H
18 
19 #include "core/components_ng/layout/layout_property.h"
20 #include "core/components_ng/pattern/grid/grid_constants.h"
21 #include "core/components_ng/pattern/grid/grid_layout_options.h"
22 
23 namespace OHOS::Ace::NG {
24 class InspectorFilter;
25 
26 class ACE_EXPORT GridLayoutProperty : public LayoutProperty {
27     DECLARE_ACE_TYPE(GridLayoutProperty, LayoutProperty);
28 
29 public:
30     GridLayoutProperty() = default;
31     ~GridLayoutProperty() override = default;
32 
Clone()33     RefPtr<LayoutProperty> Clone() const override
34     {
35         auto value = MakeRefPtr<GridLayoutProperty>();
36         value->LayoutProperty::UpdateLayoutProperty(DynamicCast<LayoutProperty>(this));
37         value->propRowsTemplate_ = CloneRowsTemplate();
38         value->propColumnsTemplate_ = CloneColumnsTemplate();
39         value->propRowsGap_ = CloneRowsGap();
40         value->propColumnsGap_ = CloneColumnsGap();
41         value->propCachedCount_ = CloneCachedCount();
42         value->propShowCachedItems_ = CloneShowCachedItems();
43         value->propGridDirection_ = CloneGridDirection();
44         value->propFocusWrapMode_ = CloneFocusWrapMode();
45         value->propMaxCount_ = CloneMaxCount();
46         value->propMinCount_ = CloneMinCount();
47         value->propCellLength_ = CloneCellLength();
48         value->propScrollEnabled_ = CloneScrollEnabled();
49         value->propLayoutOptions_ = CloneLayoutOptions();
50         value->propSyncLoad_ = CloneSyncLoad();
51         return value;
52     }
53 
Reset()54     void Reset() override
55     {
56         LayoutProperty::Reset();
57         ResetColumnsTemplate();
58         ResetRowsTemplate();
59         ResetColumnsGap();
60         ResetRowsGap();
61         ResetCachedCount();
62         ResetShowCachedItems();
63         ResetGridDirection();
64         ResetFocusWrapMode();
65         ResetMaxCount();
66         ResetMinCount();
67         ResetCellLength();
68         ResetScrollEnabled();
69         ResetLayoutOptions();
70         ResetSyncLoad();
71     }
72 
73     void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const override;
74 
IsVertical()75     bool IsVertical() const
76     {
77         bool columnsTemplateValid = propColumnsTemplate_.has_value() && !propColumnsTemplate_.value().empty();
78         bool rowsTemplateValid = propRowsTemplate_.has_value() && !propRowsTemplate_.value().empty();
79         return columnsTemplateValid ||
80                (!columnsTemplateValid && !rowsTemplateValid);
81     }
82 
IsConfiguredScrollable()83     bool IsConfiguredScrollable() const
84     {
85         bool columnsTemplateSet = !propColumnsTemplate_.value_or("").empty();
86         bool rowsTemplateSet = !propRowsTemplate_.value_or("").empty();
87         bool verticalScrollable = (columnsTemplateSet && !rowsTemplateSet);
88         bool horizontalScrollable = (!columnsTemplateSet && rowsTemplateSet);
89         return verticalScrollable || horizontalScrollable;
90     }
91 
IsReverse()92     bool IsReverse() const
93     {
94         bool columnsTemplateSet = !propColumnsTemplate_.value_or("").empty();
95         bool rowsTemplateSet = !propRowsTemplate_.value_or("").empty();
96         auto isRtl = GetNonAutoLayoutDirection() == TextDirection::RTL;
97         return isRtl && !columnsTemplateSet && rowsTemplateSet;
98     }
99 
100     ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(ColumnsTemplate, std::string);
OnColumnsTemplateUpdate(const std::string &)101     void OnColumnsTemplateUpdate(const std::string& /* columnsTemplate */) const
102     {
103         ResetGridLayoutInfoAndMeasure();
104     }
105 
106     ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(RowsTemplate, std::string);
OnRowsTemplateUpdate(const std::string &)107     void OnRowsTemplateUpdate(const std::string& /* rowsTemplate */) const
108     {
109         ResetGridLayoutInfoAndMeasure();
110     }
111 
112     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP_AND_USING_CALLBACK(ColumnsGap, Dimension, PROPERTY_UPDATE_MEASURE);
113     void OnColumnsGapUpdate(const Dimension& /* columnsGap */) const;
114 
115     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP_AND_USING_CALLBACK(RowsGap, Dimension, PROPERTY_UPDATE_MEASURE);
116     void OnRowsGapUpdate(const Dimension& /* rowsGap */) const;
117 
118     ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(CachedCount, int32_t);
119     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ShowCachedItems, bool, PROPERTY_UPDATE_MEASURE);
OnCachedCountUpdate(int32_t)120     void OnCachedCountUpdate(int32_t /* cachedCount */) const {}
121 
122     ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(GridDirection, FlexDirection);
OnGridDirectionUpdate(FlexDirection)123     void OnGridDirectionUpdate(FlexDirection /* gridDirection */) const
124     {
125         ResetGridLayoutInfoAndMeasure();
126     }
127 
128     ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(FocusWrapMode, FocusWrapMode);
OnFocusWrapModeUpdate(FocusWrapMode)129     void OnFocusWrapModeUpdate(FocusWrapMode /* focusWrapMode */) const {}
130 
131     ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(MaxCount, int32_t);
OnMaxCountUpdate(int32_t)132     void OnMaxCountUpdate(int32_t /* maxCount */) const
133     {
134         ResetGridLayoutInfoAndMeasure();
135     }
136 
137     ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(MinCount, int32_t);
OnMinCountUpdate(int32_t)138     void OnMinCountUpdate(int32_t /* minCount */) const
139     {
140         ResetGridLayoutInfoAndMeasure();
141     }
142 
143     ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(CellLength, int32_t);
OnCellLengthUpdate(int32_t)144     void OnCellLengthUpdate(int32_t /* cellLength */) const
145     {
146         ResetGridLayoutInfoAndMeasure();
147     }
148 
149     ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(LayoutOptions, GridLayoutOptions);
150     void OnLayoutOptionsUpdate(const GridLayoutOptions& layoutOptions) const;
151 
152     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(Editable, bool, PROPERTY_UPDATE_LAYOUT);
153     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ScrollEnabled, bool, PROPERTY_UPDATE_MEASURE);
154     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(SyncLoad, bool, PROPERTY_UPDATE_NORMAL);
155 
156     ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(AlignItems, GridItemAlignment);
OnAlignItemsUpdate(GridItemAlignment)157     void OnAlignItemsUpdate(GridItemAlignment /* alignItems */) const
158     {
159         ResetGridLayoutInfoAndMeasure();
160     }
161 
GetPercentSensitive()162     std::pair<bool, bool> GetPercentSensitive() override
163     {
164         return {true, true};
165     }
166 
167 private:
168     ACE_DISALLOW_COPY_AND_MOVE(GridLayoutProperty);
169 
170     void ResetGridLayoutInfoAndMeasure() const;
171     void ResetPositionFlags() const;
172     std::string GetBarStateString() const;
173     std::string GetGridDirectionStr() const;
174     std::string GetFocusWrapModeStr() const;
175     Color GetBarColor() const;
176     Dimension GetBarWidth() const;
177 
178     void UpdateIrregularFlag(const GridLayoutOptions& layoutOptions) const;
179 };
180 } // namespace OHOS::Ace::NG
181 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_GRID_GRID_LAYOUT_PROPERTY_H
182