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_MODEL_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TABS_TABS_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/decoration.h"
27 #include "core/components/swiper/swiper_controller.h"
28 #include "core/components/tab_bar/tab_controller.h"
29 #include "core/components/tab_bar/tab_theme.h"
30 #include "core/components/tab_bar/tabs_event.h"
31 #include "core/components_ng/pattern/swiper/swiper_model.h"
32 #include "core/components_ng/pattern/tabs/tab_content_transition_proxy.h"
33 #include "core/event/ace_events.h"
34 #include "core/pipeline/pipeline_context.h"
35 
36 namespace OHOS::Ace {
37 enum class LayoutStyle {
38     ALWAYS_CENTER,
39     ALWAYS_AVERAGE_SPLIT,
40     SPACE_BETWEEN_OR_CENTER,
41 };
42 
43 struct TabsItemDivider final {
44     Dimension strokeWidth = 0.0_vp;
45     Dimension startMargin = 0.0_vp;
46     Dimension endMargin = 0.0_vp;
47     Color color = Color::BLACK;
48     bool isNull = false;
TabsItemDividerfinal49     TabsItemDivider()
50     {
51         auto pipelineContext = PipelineContext::GetCurrentContext();
52         if (!pipelineContext) {
53             return;
54         }
55         auto tabTheme = pipelineContext->GetTheme<TabTheme>();
56         if (!tabTheme) {
57             return;
58         }
59         color = tabTheme->GetDividerColor();
60     }
61     bool operator==(const TabsItemDivider& itemDivider) const
62     {
63         return (strokeWidth == itemDivider.strokeWidth) && (startMargin == itemDivider.startMargin) &&
64                (endMargin == itemDivider.endMargin) && (color == itemDivider.color) && (isNull == itemDivider.isNull);
65     }
66 };
67 
68 struct BarGridColumnOptions final {
69     int32_t sm = -1;
70     int32_t md = -1;
71     int32_t lg = -1;
72     Dimension gutter = 0.0_vp;
73     Dimension margin = 0.0_vp;
74 
BarGridColumnOptionsfinal75     BarGridColumnOptions()
76     {
77         auto pipelineContext = PipelineContext::GetCurrentContext();
78         if (!pipelineContext) {
79             return;
80         }
81         auto tabTheme = pipelineContext->GetTheme<TabTheme>();
82         if (!tabTheme) {
83             return;
84         }
85         gutter = tabTheme->GetTabBarColumnGutter();
86         margin = tabTheme->GetTabBarColumnMargin();
87     }
88 
89     bool operator==(const BarGridColumnOptions& option) const
90     {
91         return (sm == option.sm) && (md == option.md) && (lg == option.lg) && (margin == option.margin) &&
92                (gutter == option.gutter);
93     }
94 };
95 
96 struct ScrollableBarModeOptions final {
97     Dimension margin = 0.0_vp;
98     LayoutStyle nonScrollableLayoutStyle = LayoutStyle::ALWAYS_CENTER;
99 
100     bool operator==(const ScrollableBarModeOptions& option) const
101     {
102         return (margin == option.margin) && (nonScrollableLayoutStyle == option.nonScrollableLayoutStyle);
103     }
104 };
105 
106 using TabsCustomAnimationEvent = std::function<TabContentAnimatedTransition(int32_t from, int32_t to)>;
107 
108 class ACE_FORCE_EXPORT TabsModel {
109 public:
110     static TabsModel* GetInstance();
111     virtual ~TabsModel() = default;
112 
113     virtual void Create(BarPosition barPosition, int32_t index, const RefPtr<TabController>& tabController,
114         const RefPtr<SwiperController>& swiperController) = 0;
115     virtual void Pop() = 0;
116     virtual void SetIndex(int32_t index) = 0;
117     virtual void SetTabBarPosition(BarPosition tabBarPosition) = 0;
SetBarBackgroundBlurStyle(BlurStyle tabBarBlurStyle)118     virtual void SetBarBackgroundBlurStyle(BlurStyle tabBarBlurStyle) {}
119     virtual void SetTabBarMode(TabBarMode tabBarMode) = 0;
120     virtual void SetTabBarWidth(const Dimension& tabBarWidth) = 0;
121     virtual void SetTabBarHeight(const Dimension& tabBarHeight) = 0;
122     virtual void SetWidthAuto(bool isAuto) = 0;
123     virtual void SetHeightAuto(bool isAuto) = 0;
124     virtual void SetBarAdaptiveHeight(bool barAdaptiveHeight) = 0;
125     virtual void SetIsVertical(bool isVertical) = 0;
126     virtual void SetScrollable(bool scrollable) = 0;
127     virtual void SetAnimationDuration(float duration) = 0;
128     virtual void SetOnChange(std::function<void(const BaseEventInfo*)>&& onChange) = 0;
129     virtual void SetOnTabBarClick(std::function<void(const BaseEventInfo*)>&& onTabBarClick) = 0;
SetOnAnimationStart(AnimationStartEvent && onAnimationStart)130     virtual void SetOnAnimationStart(AnimationStartEvent&& onAnimationStart) {}
SetOnAnimationEnd(AnimationEndEvent && onAnimationEnd)131     virtual void SetOnAnimationEnd(AnimationEndEvent&& onAnimationEnd) {}
SetOnGestureSwipe(GestureSwipeEvent && gestureSwipe)132     virtual void SetOnGestureSwipe(GestureSwipeEvent&& gestureSwipe) {}
133     virtual void SetDivider(const TabsItemDivider& divider) = 0;
134     virtual void SetFadingEdge(bool fadingEdge) = 0;
135     virtual void SetBarOverlap(bool barOverlap) = 0;
136     virtual void SetOnChangeEvent(std::function<void(const BaseEventInfo*)>&& onChangeEvent) = 0;
137     virtual void SetBarBackgroundColor(const Color& backgroundColor) = 0;
138     virtual void SetClipEdge(bool clipEdge) = 0;
139     virtual void SetScrollableBarModeOptions(const ScrollableBarModeOptions& option) = 0;
140     virtual void SetBarGridAlign(const BarGridColumnOptions& BarGridColumnOptions) = 0;
SetIsCustomAnimation(bool isCustom)141     virtual void SetIsCustomAnimation(bool isCustom) {}
SetOnCustomAnimation(TabsCustomAnimationEvent && onCustomAnimation)142     virtual void SetOnCustomAnimation(TabsCustomAnimationEvent&& onCustomAnimation) {}
SetOnContentWillChange(std::function<bool (int32_t,int32_t)> && callback)143     virtual void SetOnContentWillChange(std::function<bool(int32_t, int32_t)>&& callback) {}
SetAnimateMode(TabAnimateMode mode)144     virtual void SetAnimateMode(TabAnimateMode mode) {}
SetEdgeEffect(EdgeEffect edgeEffect)145     virtual void SetEdgeEffect(EdgeEffect edgeEffect) {}
146 
147 private:
148     static std::unique_ptr<TabsModel> instance_;
149     static std::mutex mutex_;
150 };
151 
152 } // namespace OHOS::Ace
153 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TABS_TABS_MODEL_H
154