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