1 /*
2  * Copyright (c) 2022 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_TAB_BAR_LAYOUT_PROPERTY_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TABS_TAB_BAR_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_ng/base/inspector_filter.h"
24 #include "core/components_ng/layout/layout_property.h"
25 #include "core/components_ng/pattern/tabs/tabs_model.h"
26 #include "core/components_ng/property/property.h"
27 
28 namespace OHOS::Ace::NG {
29 
30 struct TabBarProperty {
31     ACE_DEFINE_PROPERTY_GROUP_ITEM(TabBarMode, TabBarMode);
32     ACE_DEFINE_PROPERTY_GROUP_ITEM(TabBarWidth, Dimension);
33     ACE_DEFINE_PROPERTY_GROUP_ITEM(TabBarHeight, Dimension);
34 };
35 
36 class ACE_EXPORT TabBarLayoutProperty : public LayoutProperty {
37     DECLARE_ACE_TYPE(TabBarLayoutProperty, LayoutProperty);
38 
39 public:
40     TabBarLayoutProperty() = default;
41     ~TabBarLayoutProperty() override = default;
42 
Clone()43     RefPtr<LayoutProperty> Clone() const override
44     {
45         auto value = MakeRefPtr<TabBarLayoutProperty>();
46         value->LayoutProperty::UpdateLayoutProperty(AceType::DynamicCast<LayoutProperty>(this));
47         value->propTabBarProperty_ = CloneTabBarProperty();
48         value->propAxis_ = CloneAxis();
49         value->propIndicator_ = CloneIndicator();
50         value->propSelectedMask_ = CloneSelectedMask();
51         value->propUnselectedMask_ = CloneUnselectedMask();
52         value->propScrollableBarModeOptions_ = CloneScrollableBarModeOptions();
53         value->propBarGridAlign_ = CloneBarGridAlign();
54         value->propBarAdaptiveHeight_ = CloneBarAdaptiveHeight();
55         return value;
56     }
57 
Reset()58     void Reset() override
59     {
60         LayoutProperty::Reset();
61         ResetTabBarProperty();
62         ResetAxis();
63         ResetIndicator();
64         ResetSelectedMask();
65         ResetUnselectedMask();
66         ResetScrollableBarModeOptions();
67         ResetBarGridAlign();
68         ResetBarAdaptiveHeight();
69     }
70 
71     RectF GetIndicatorRect(int32_t index);
72 
ToJsonValue(std::unique_ptr<JsonValue> & json,const InspectorFilter & filter)73     void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const override
74     {
75         LayoutProperty::ToJsonValue(json, filter);
76         /* no fixed attr below, just return */
77         if (filter.IsFastFilter()) {
78             return;
79         }
80         json->PutExtAttr("barHeight", GetTabBarHeight().value_or(0.0_vp).ToString().c_str(), filter);
81         json->PutExtAttr("currentIndex", propIndicator_.value_or(0), filter);
82     }
83 
FromJson(const std::unique_ptr<JsonValue> & json)84     void FromJson(const std::unique_ptr<JsonValue>& json) override
85     {
86         UpdateTabBarHeight(Dimension::FromString(json->GetString("barHeight")));
87         UpdateIndicator(json->GetInt("currentIndex"));
88         LayoutProperty::FromJson(json);
89     }
90 
91     ACE_DEFINE_PROPERTY_GROUP(TabBarProperty, TabBarProperty);
92     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TabBarProperty, TabBarMode, TabBarMode, PROPERTY_UPDATE_MEASURE);
93     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TabBarProperty, TabBarWidth, Dimension, PROPERTY_UPDATE_MEASURE);
94     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TabBarProperty, TabBarHeight, Dimension, PROPERTY_UPDATE_MEASURE);
95 
96     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(Axis, Axis, PROPERTY_UPDATE_MEASURE);
97     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(Indicator, int32_t, PROPERTY_UPDATE_NORMAL);
98 
99     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(SelectedMask, int32_t, PROPERTY_UPDATE_MEASURE);
100     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(UnselectedMask, int32_t, PROPERTY_UPDATE_MEASURE);
101 
102     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ScrollableBarModeOptions, ScrollableBarModeOptions, PROPERTY_UPDATE_MEASURE);
103     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(BarGridAlign, BarGridColumnOptions, PROPERTY_UPDATE_MEASURE);
104     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(BarAdaptiveHeight, bool, PROPERTY_UPDATE_MEASURE);
105 };
106 
107 } // namespace OHOS::Ace::NG
108 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TABS_TAB_BAR_LAYOUT_PROPERTY_H
109