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