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_TABS_TABS_LAYOUT_PROPERTY_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TABS_TABS_LAYOUT_PROPERTY_H 18 19 #include "base/geometry/axis.h" 20 #include "base/geometry/dimension.h" 21 #include "base/utils/macros.h" 22 #include "core/components/common/layout/constants.h" 23 #include "core/components/common/properties/decoration.h" 24 #include "core/components_ng/base/inspector_filter.h" 25 #include "core/components_ng/layout/layout_property.h" 26 #include "core/components_ng/pattern/tabs/tabs_model.h" 27 #include "core/components_ng/property/property.h" 28 29 namespace OHOS::Ace::NG { 30 31 class ACE_EXPORT TabsLayoutProperty : public LayoutProperty { 32 DECLARE_ACE_TYPE(TabsLayoutProperty, LayoutProperty); 33 34 public: 35 TabsLayoutProperty() = default; 36 ~TabsLayoutProperty() override = default; 37 Clone()38 RefPtr<LayoutProperty> Clone() const override 39 { 40 auto value = MakeRefPtr<TabsLayoutProperty>(); 41 value->LayoutProperty::UpdateLayoutProperty(AceType::DynamicCast<LayoutProperty>(this)); 42 value->propTabBarPosition_ = CloneTabBarPosition(); 43 value->propAxis_ = CloneAxis(); 44 value->propTabBarMode_ = CloneTabBarMode(); 45 value->propDivider_ = CloneDivider(); 46 value->propBarWidth_ = CloneBarWidth(); 47 value->propBarHeight_ = CloneBarHeight(); 48 value->propIndex_ = CloneIndex(); 49 value->propBarOverlap_ = CloneBarOverlap(); 50 value->propWidthAuto_ = CloneWidthAuto(); 51 value->propHeightAuto_ = CloneHeightAuto(); 52 return value; 53 } 54 Reset()55 void Reset() override 56 { 57 LayoutProperty::Reset(); 58 ResetTabBarPosition(); 59 ResetAxis(); 60 ResetTabBarMode(); 61 ResetDivider(); 62 ResetBarWidth(); 63 ResetBarHeight(); 64 ResetIndex(); 65 ResetBarOverlap(); 66 } 67 ToJsonValue(std::unique_ptr<JsonValue> & json,const InspectorFilter & filter)68 void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const override 69 { 70 LayoutProperty::ToJsonValue(json, filter); 71 /* no fixed attr below, just return */ 72 if (filter.IsFastFilter()) { 73 return; 74 } 75 json->PutExtAttr("vertical", propAxis_.value_or(Axis::HORIZONTAL) == Axis::HORIZONTAL ? 76 "false" : "true", filter); 77 json->PutExtAttr("barPosition", propTabBarPosition_.value_or(BarPosition::START) == BarPosition::START 78 ? "BarPosition.Start" 79 : "BarPosition.End", filter); 80 if (propDivider_.has_value()) { 81 auto divider = JsonUtil::Create(true); 82 if (!propDivider_.value().isNull) { 83 divider->Put("strokeWidth", propDivider_.value().strokeWidth.ToString().c_str()); 84 divider->Put("startMargin", propDivider_.value().startMargin.ToString().c_str()); 85 divider->Put("endMargin", propDivider_.value().endMargin.ToString().c_str()); 86 divider->Put("color", propDivider_.value().color.ColorToString().c_str()); 87 } else { 88 TabsItemDivider emptyDivider; 89 emptyDivider.strokeWidth.Reset(); 90 emptyDivider.startMargin.Reset(); 91 emptyDivider.endMargin.Reset(); 92 divider->Put("strokeWidth", emptyDivider.strokeWidth.ToString().c_str()); 93 divider->Put("startMargin", emptyDivider.startMargin.ToString().c_str()); 94 divider->Put("endMargin", emptyDivider.endMargin.ToString().c_str()); 95 divider->Put("color", emptyDivider.color.ColorToString().c_str()); 96 } 97 json->PutExtAttr("divider", divider, filter); 98 } else { 99 auto divider = JsonUtil::Create(true); 100 json->PutExtAttr("divider", divider, filter); 101 } 102 json->PutExtAttr("barOverlap", propBarOverlap_.value_or(false) ? "true" : "false", filter); 103 } 104 FromJson(const std::unique_ptr<JsonValue> & json)105 void FromJson(const std::unique_ptr<JsonValue>& json) override 106 { 107 static const std::unordered_map<std::string, BarPosition> uMap { 108 { "BarPosition.Start", BarPosition::START }, 109 { "BarPosition.End", BarPosition::END }, 110 }; 111 112 UpdateAxis(json->GetBool("vertical") ? Axis::VERTICAL : Axis::HORIZONTAL); 113 auto barPosition = json->GetString("barPosition"); 114 BarPosition barPositionEnum = BarPosition::START; 115 auto iter = uMap.find(barPosition); 116 if (iter != uMap.end()) { 117 barPositionEnum = iter->second; 118 } 119 UpdateTabBarPosition(barPositionEnum); 120 LayoutProperty::FromJson(json); 121 } 122 123 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(TabBarPosition, BarPosition, PROPERTY_UPDATE_MEASURE_SELF); 124 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(Axis, Axis, PROPERTY_UPDATE_MEASURE); 125 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(TabBarMode, TabBarMode, PROPERTY_UPDATE_MEASURE); 126 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(Divider, TabsItemDivider, PROPERTY_UPDATE_MEASURE); 127 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(BarWidth, Dimension, PROPERTY_UPDATE_MEASURE); 128 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(BarHeight, Dimension, PROPERTY_UPDATE_MEASURE); 129 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(Index, int32_t, PROPERTY_UPDATE_NORMAL); 130 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(BarOverlap, bool, PROPERTY_UPDATE_MEASURE); 131 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(WidthAuto, bool, PROPERTY_UPDATE_MEASURE); 132 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(HeightAuto, bool, PROPERTY_UPDATE_MEASURE); 133 }; 134 135 } // namespace OHOS::Ace::NG 136 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TABS_TABS_LAYOUT_PROPERTY_H 137