1 /* 2 * Copyright (c) 2022-2023 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->propGridDirection_ = CloneGridDirection(); 43 value->propMaxCount_ = CloneMaxCount(); 44 value->propMinCount_ = CloneMinCount(); 45 value->propCellLength_ = CloneCellLength(); 46 value->propScrollEnabled_ = CloneScrollEnabled(); 47 value->propLayoutOptions_ = CloneLayoutOptions(); 48 return value; 49 } 50 Reset()51 void Reset() override 52 { 53 LayoutProperty::Reset(); 54 ResetColumnsTemplate(); 55 ResetRowsTemplate(); 56 ResetColumnsGap(); 57 ResetRowsGap(); 58 ResetCachedCount(); 59 ResetGridDirection(); 60 ResetMaxCount(); 61 ResetMinCount(); 62 ResetCellLength(); 63 ResetScrollEnabled(); 64 ResetLayoutOptions(); 65 } 66 67 void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const override; 68 IsVertical()69 bool IsVertical() const 70 { 71 bool columnsTemplateValid = propColumnsTemplate_.has_value() && !propColumnsTemplate_.value().empty(); 72 bool rowsTemplateValid = propRowsTemplate_.has_value() && !propRowsTemplate_.value().empty(); 73 return columnsTemplateValid || 74 (!columnsTemplateValid && !rowsTemplateValid); 75 } 76 IsConfiguredScrollable()77 bool IsConfiguredScrollable() const 78 { 79 bool columnsTemplateSet = !propColumnsTemplate_.value_or("").empty(); 80 bool rowsTemplateSet = !propRowsTemplate_.value_or("").empty(); 81 bool verticalScrollable = (columnsTemplateSet && !rowsTemplateSet); 82 bool horizontalScrollable = (!columnsTemplateSet && rowsTemplateSet); 83 return verticalScrollable || horizontalScrollable; 84 } 85 IsReverse()86 bool IsReverse() const 87 { 88 bool columnsTemplateSet = !propColumnsTemplate_.value_or("").empty(); 89 bool rowsTemplateSet = !propRowsTemplate_.value_or("").empty(); 90 auto isRtl = GetNonAutoLayoutDirection() == TextDirection::RTL; 91 return isRtl && !columnsTemplateSet && rowsTemplateSet; 92 } 93 94 ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(ColumnsTemplate, std::string); OnColumnsTemplateUpdate(const std::string &)95 void OnColumnsTemplateUpdate(const std::string& /* columnsTemplate */) const 96 { 97 ResetGridLayoutInfoAndMeasure(); 98 } 99 100 ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(RowsTemplate, std::string); OnRowsTemplateUpdate(const std::string &)101 void OnRowsTemplateUpdate(const std::string& /* rowsTemplate */) const 102 { 103 ResetGridLayoutInfoAndMeasure(); 104 } 105 106 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP_AND_USING_CALLBACK(ColumnsGap, Dimension, PROPERTY_UPDATE_MEASURE); 107 void OnColumnsGapUpdate(const Dimension& /* columnsGap */) const; 108 109 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP_AND_USING_CALLBACK(RowsGap, Dimension, PROPERTY_UPDATE_MEASURE); 110 void OnRowsGapUpdate(const Dimension& /* rowsGap */) const; 111 112 ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(CachedCount, int32_t); OnCachedCountUpdate(int32_t)113 void OnCachedCountUpdate(int32_t /* cachedCount */) const {} 114 115 ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(GridDirection, FlexDirection); OnGridDirectionUpdate(FlexDirection)116 void OnGridDirectionUpdate(FlexDirection /* gridDirection */) const 117 { 118 ResetGridLayoutInfoAndMeasure(); 119 } 120 121 ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(MaxCount, int32_t); OnMaxCountUpdate(int32_t)122 void OnMaxCountUpdate(int32_t /* maxCount */) const 123 { 124 ResetGridLayoutInfoAndMeasure(); 125 } 126 127 ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(MinCount, int32_t); OnMinCountUpdate(int32_t)128 void OnMinCountUpdate(int32_t /* minCount */) const 129 { 130 ResetGridLayoutInfoAndMeasure(); 131 } 132 133 ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(CellLength, int32_t); OnCellLengthUpdate(int32_t)134 void OnCellLengthUpdate(int32_t /* cellLength */) const 135 { 136 ResetGridLayoutInfoAndMeasure(); 137 } 138 139 ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(LayoutOptions, GridLayoutOptions); 140 void OnLayoutOptionsUpdate(const GridLayoutOptions& layoutOptions) const; 141 142 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(Editable, bool, PROPERTY_UPDATE_LAYOUT); 143 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ScrollEnabled, bool, PROPERTY_UPDATE_MEASURE); 144 145 ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(AlignItems, GridItemAlignment); OnAlignItemsUpdate(GridItemAlignment)146 void OnAlignItemsUpdate(GridItemAlignment /* alignItems */) const 147 { 148 ResetGridLayoutInfoAndMeasure(); 149 } 150 GetPercentSensitive()151 std::pair<bool, bool> GetPercentSensitive() override 152 { 153 return {true, true}; 154 } 155 156 private: 157 ACE_DISALLOW_COPY_AND_MOVE(GridLayoutProperty); 158 159 void ResetGridLayoutInfoAndMeasure() const; 160 void ResetPositionFlags() const; 161 std::string GetBarStateString() const; 162 std::string GetGridDirectionStr() const; 163 Color GetBarColor() const; 164 Dimension GetBarWidth() const; 165 166 void UpdateIrregularFlag(const GridLayoutOptions& layoutOptions) const; 167 }; 168 } // namespace OHOS::Ace::NG 169 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_GRID_GRID_LAYOUT_PROPERTY_H 170