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_TAB_CONTENT_MODEL_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TABS_TAB_CONTENT_MODEL_H
18 
19 #include <mutex>
20 
21 #include "base/geometry/axis.h"
22 #include "base/geometry/dimension.h"
23 #include "base/image/pixel_map.h"
24 #include "base/memory/referenced.h"
25 #include "core/components/common/layout/constants.h"
26 #include "core/components/common/properties/color.h"
27 #include "core/components/tab_bar/tab_theme.h"
28 #include "core/components_ng/property/measure_property.h"
29 #include "core/event/ace_events.h"
30 #include "core/pipeline/pipeline_context.h"
31 
32 namespace OHOS::Ace {
33 enum class SelectedMode {
34     INDICATOR,
35     BOARD,
36 };
37 
38 enum class LayoutMode {
39     AUTO,
40     VERTICAL,
41     HORIZONTAL,
42 };
43 
44 struct BottomTabBarStyle {
45     bool symmetricExtensible = false;
46     LayoutMode layoutMode = LayoutMode::VERTICAL;
47     FlexAlign verticalAlign = FlexAlign::CENTER;
48 };
49 
50 struct IndicatorStyle final {
51     Color color = Color::WHITE;
52     Dimension height = 0.0_vp;
53     Dimension width = 0.0_vp;
54     Dimension borderRadius = 0.0_vp;
55     Dimension marginTop = 0.0_vp;
IndicatorStylefinal56     IndicatorStyle()
57     {
58         auto pipelineContext = PipelineContext::GetCurrentContext();
59         if (!pipelineContext) {
60             return;
61         }
62         auto tabTheme = pipelineContext->GetTheme<TabTheme>();
63         if (!tabTheme) {
64             return;
65         }
66         color = tabTheme->GetActiveIndicatorColor();
67         height = tabTheme->GetSubTabIndicatorHeight();
68         marginTop = tabTheme->GetSubTabIndicatorGap();
69     }
70     bool operator==(const IndicatorStyle& indicator) const
71     {
72         return (color == indicator.color) && (height == indicator.height) &&
73                (width == indicator.width) && (borderRadius == indicator.borderRadius)
74                && (marginTop == indicator.marginTop);
75     }
76 };
77 
78 struct BoardStyle final {
79     Dimension borderRadius = 0.0_vp;
BoardStylefinal80     BoardStyle()
81     {
82         auto pipelineContext = PipelineContext::GetCurrentContext();
83         if (!pipelineContext) {
84             return;
85         }
86         auto tabTheme = pipelineContext->GetTheme<TabTheme>();
87         if (!tabTheme) {
88             return;
89         }
90         borderRadius = tabTheme->GetFocusIndicatorRadius();
91     }
92     bool operator==(const BoardStyle& board) const
93     {
94         return borderRadius == board.borderRadius;
95     }
96 };
97 
98 struct LabelStyle {
99     std::optional<Ace::TextOverflow> textOverflow;
100     std::optional<uint32_t> maxLines;
101     std::optional<Dimension> minFontSize;
102     std::optional<Dimension> maxFontSize;
103     std::optional<Ace::TextHeightAdaptivePolicy> heightAdaptivePolicy;
104     std::optional<Dimension> fontSize;
105     std::optional<Ace::FontWeight> fontWeight;
106     std::optional<std::vector<std::string>> fontFamily;
107     std::optional<Ace::FontStyle> fontStyle;
108     std::optional<Color> unselectedColor;
109     std::optional<Color> selectedColor;
110 };
111 
112 struct IconStyle {
113     std::optional<Color> unselectedColor;
114     std::optional<Color> selectedColor;
115 };
116 
117 struct TabBarSymbol {
118     std::function<void(WeakPtr<NG::FrameNode>, std::string)> onApply = nullptr;
119     bool selectedFlag = false;
120 };
121 
122 class ACE_FORCE_EXPORT TabContentModel {
123 public:
124     static TabContentModel* GetInstance();
125     virtual ~TabContentModel() = default;
126 
127     virtual void Create() = 0;
128     virtual void Create(std::function<void()>&& deepRenderFunc) = 0;
129     virtual void Pop() = 0;
130     virtual void SetTabBar(const std::optional<std::string>& text, const std::optional<std::string>& icon,
131         const std::optional<TabBarSymbol>& tabBarSymbol, std::function<void()>&& builder, bool useContentOnly) = 0;
132     virtual void SetTabBarStyle(TabBarStyle tabBarStyle) = 0;
133     virtual void SetIndicator(const IndicatorStyle& indicator) = 0;
134     virtual void SetBoard(const BoardStyle& board) = 0;
135     virtual void SetSelectedMode(SelectedMode selectedMode) = 0;
136     virtual void SetLabelStyle(const LabelStyle& labelStyle) = 0;
SetIconStyle(const IconStyle & iconStyle)137     virtual void SetIconStyle(const IconStyle& iconStyle)  {}
138     virtual void SetPadding(const NG::PaddingProperty& padding) = 0;
139     virtual void SetUseLocalizedPadding(bool useLocalizedPadding) = 0;
140     virtual void SetLayoutMode(LayoutMode layoutMode) = 0;
141     virtual void SetVerticalAlign(FlexAlign verticalAlign) = 0;
142     virtual void SetSymmetricExtensible(bool isExtensible) = 0;
143     virtual void SetId(const std::string& id) = 0;
SetOnWillShow(std::function<void ()> && onWillShow)144     virtual void SetOnWillShow(std::function<void()>&& onWillShow) {}
SetOnWillHide(std::function<void ()> && onWillHide)145     virtual void SetOnWillHide(std::function<void()>&& onWillHide) {}
SetCustomStyleNode(const RefPtr<NG::FrameNode> & customStyleNode)146     virtual void SetCustomStyleNode(const RefPtr<NG::FrameNode>& customStyleNode) {}
147 
148 private:
149     static std::unique_ptr<TabContentModel> instance_;
150     static std::mutex mutex_;
151 };
152 
153 } // namespace OHOS::Ace
154 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TABS_TAB_CONTENT_MODEL_H
155