• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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