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