1 /* 2 * Copyright (c) 2024 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_PATTERNS_TABS_TAB_BAR_ITEM_PATTERN_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_TABS_TAB_BAR_ITEM_PATTERN_H 18 19 #include "core/components_ng/pattern/linear_layout/linear_layout_pattern.h" 20 #include "core/components_ng/pattern/tabs/tab_bar_item_accessibility_property.h" 21 22 namespace OHOS::Ace::NG { 23 const auto TWO = 2; 24 25 class TabBarItemPattern : public LinearLayoutPattern { 26 DECLARE_ACE_TYPE(TabBarItemPattern, Pattern); 27 28 public: TabBarItemPattern()29 TabBarItemPattern() : LinearLayoutPattern(true) {} 30 31 ~TabBarItemPattern() override = default; 32 CreateAccessibilityProperty()33 RefPtr<AccessibilityProperty> CreateAccessibilityProperty() override 34 { 35 return MakeRefPtr<TabBarItemAccessibilityProperty>(); 36 } 37 GetFocusPattern()38 FocusPattern GetFocusPattern() const override 39 { 40 auto host = GetHost(); 41 CHECK_NULL_RETURN(host, FocusPattern()); 42 auto pipeline = host->GetContext(); 43 CHECK_NULL_RETURN(pipeline, FocusPattern()); 44 auto focusTheme = pipeline->GetTheme<FocusAnimationTheme>(); 45 CHECK_NULL_RETURN(focusTheme, FocusPattern()); 46 auto tabTheme = pipeline->GetTheme<TabTheme>(); 47 CHECK_NULL_RETURN(tabTheme, FocusPattern()); 48 FocusPaintParam focusPaintParam; 49 focusPaintParam.SetPaintWidth(tabTheme->GetActiveIndicatorWidth()); 50 focusPaintParam.SetPaintColor(focusTheme->GetColor()); 51 return { FocusType::SCOPE, true, FocusStyleType::CUSTOM_REGION, focusPaintParam }; 52 } 53 OnAttachToMainTree()54 void OnAttachToMainTree() override 55 { 56 auto host = GetHost(); 57 CHECK_NULL_VOID(host); 58 auto focusHub = host->GetFocusHub(); 59 CHECK_NULL_VOID(focusHub); 60 focusHub->SetFocusable(true, false); 61 focusHub->SetInnerFocusPaintRectCallback([weak = WeakClaim(this)](RoundRect& paintRect) { 62 auto pattern = weak.Upgrade(); 63 CHECK_NULL_VOID(pattern); 64 pattern->GetInnerFocusPaintRect(paintRect); 65 66 auto host = pattern->GetHost(); 67 CHECK_NULL_VOID(host); 68 auto tabBar = host->GetAncestorNodeOfFrame(false); 69 CHECK_NULL_VOID(tabBar); 70 auto tabBarPattern = tabBar->GetPattern<TabBarPattern>(); 71 CHECK_NULL_VOID(tabBarPattern); 72 auto index = tabBar->GetChildFlatIndex(host->GetId()).second; 73 tabBarPattern->SetFocusIndicator(index); 74 }); 75 } 76 GetInnerFocusPaintRect(RoundRect & paintRect)77 void GetInnerFocusPaintRect(RoundRect& paintRect) 78 { 79 auto host = GetHost(); 80 CHECK_NULL_VOID(host); 81 auto focusHub = host->GetFocusHub(); 82 CHECK_NULL_VOID(focusHub); 83 auto tabBar = host->GetAncestorNodeOfFrame(false); 84 CHECK_NULL_VOID(tabBar); 85 auto tabBarFocusHub = tabBar->GetFocusHub(); 86 CHECK_NULL_VOID(tabBarFocusHub); 87 auto renderContext = host->GetRenderContext(); 88 CHECK_NULL_VOID(renderContext); 89 auto columnPaintRect = renderContext->GetPaintRectWithTransform(); 90 auto pipeline = GetContext(); 91 CHECK_NULL_VOID(pipeline); 92 auto tabTheme = pipeline->GetTheme<TabTheme>(); 93 CHECK_NULL_VOID(tabTheme); 94 auto radius = tabTheme->GetFocusIndicatorRadius(); 95 if (tabBarFocusHub->GetFocusBox().HasCustomStyle()) { 96 auto tabBarFocusBoxStyle = tabBarFocusHub->GetFocusBox().GetStyle().value(); 97 focusHub->GetFocusBox().SetStyle(tabBarFocusBoxStyle); 98 auto margin = tabBarFocusBoxStyle.margin.value_or(CalcDimension(0.0)); 99 columnPaintRect.SetOffset(OffsetF(-margin.ConvertToPx(), -margin.ConvertToPx())); 100 columnPaintRect.SetSize(SizeF((columnPaintRect.GetSize().Width() + margin.ConvertToPx() * TWO), 101 (columnPaintRect.GetSize().Height() + margin.ConvertToPx() * TWO))); 102 } else { 103 FocusBoxStyle tabBarFocusBoxStyle; 104 focusHub->GetFocusBox().SetStyle(tabBarFocusBoxStyle); 105 auto outLineWidth = tabTheme->GetActiveIndicatorWidth().ConvertToPx(); 106 columnPaintRect.SetOffset(OffsetF(outLineWidth / TWO, outLineWidth / TWO)); 107 columnPaintRect.SetSize(SizeF((columnPaintRect.GetSize().Width() - outLineWidth), 108 (columnPaintRect.GetSize().Height() - outLineWidth))); 109 } 110 111 paintRect.SetRect(columnPaintRect); 112 paintRect.SetCornerRadius(RoundRect::CornerPos::TOP_LEFT_POS, static_cast<RSScalar>(radius.ConvertToPx()), 113 static_cast<RSScalar>(radius.ConvertToPx())); 114 paintRect.SetCornerRadius(RoundRect::CornerPos::TOP_RIGHT_POS, static_cast<RSScalar>(radius.ConvertToPx()), 115 static_cast<RSScalar>(radius.ConvertToPx())); 116 paintRect.SetCornerRadius(RoundRect::CornerPos::BOTTOM_LEFT_POS, static_cast<RSScalar>(radius.ConvertToPx()), 117 static_cast<RSScalar>(radius.ConvertToPx())); 118 paintRect.SetCornerRadius(RoundRect::CornerPos::BOTTOM_RIGHT_POS, static_cast<RSScalar>(radius.ConvertToPx()), 119 static_cast<RSScalar>(radius.ConvertToPx())); 120 } 121 122 private: 123 ACE_DISALLOW_COPY_AND_MOVE(TabBarItemPattern); 124 }; 125 } // namespace OHOS::Ace::NG 126 127 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_TABS_TAB_BAR_ITEM_PATTERN_H 128