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_PATTERNS_TABS_TAB_BAR_PATTERN_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_TABS_TAB_BAR_PATTERN_H
18 
19 #include <optional>
20 #include <unordered_map>
21 
22 #include "base/geometry/axis.h"
23 #include "base/memory/referenced.h"
24 #include "core/components/common/layout/constants.h"
25 #include "core/components/swiper/swiper_controller.h"
26 #include "core/components/tab_bar/tab_theme.h"
27 #include "core/components_ng/event/event_hub.h"
28 #include "core/components_ng/pattern/pattern.h"
29 #include "core/components_ng/pattern/swiper/swiper_model.h"
30 #include "core/components_ng/pattern/swiper/swiper_pattern.h"
31 #include "core/components_ng/pattern/tabs/tab_bar_accessibility_property.h"
32 #include "core/components_ng/pattern/tabs/tab_bar_layout_algorithm.h"
33 #include "core/components_ng/pattern/tabs/tab_bar_layout_property.h"
34 #include "core/components_ng/pattern/tabs/tab_bar_paint_method.h"
35 #include "core/components_ng/pattern/tabs/tab_bar_paint_property.h"
36 #include "core/components_ng/pattern/tabs/tab_content_model.h"
37 #include "core/event/mouse_event.h"
38 #include "core/components_ng/pattern/tabs/tab_content_transition_proxy.h"
39 #include "frameworks/core/components/focus_animation/focus_animation_theme.h"
40 #include "frameworks/core/components_ng/event/focus_hub.h"
41 
42 namespace OHOS::Ace::NG {
43 class InspectorFilter;
44 
45 const auto TabBarPhysicalCurve = AceType::MakeRefPtr<InterpolatingSpring>(-1.0f, 1.0f, 228.0f, 30.f);
46 
47 using TabBarBuilderFunc = std::function<void()>;
48 class TabBarParam : public virtual Referenced {
49 public:
TabBarParam(const std::string & textParam,const std::string & iconParam,TabBarBuilderFunc && builderParam)50     TabBarParam(const std::string& textParam, const std::string& iconParam, TabBarBuilderFunc&& builderParam)
51         : text_(textParam), icon_(iconParam), builder_(std::move(builderParam)) {};
52 
GetIcon()53     const std::string& GetIcon() const
54     {
55         return icon_;
56     }
57 
SetIcon(const std::string & icon)58     void SetIcon(const std::string& icon)
59     {
60         icon_ = icon;
61     }
62 
GetText()63     const std::string& GetText() const
64     {
65         return text_;
66     }
67 
SetText(const std::string & text)68     void SetText(const std::string& text)
69     {
70         text_ = text;
71     }
72 
GetSymbol()73     const std::optional<TabBarSymbol>& GetSymbol() const
74     {
75         return symbol_;
76     }
77 
SetSymbol(const std::optional<TabBarSymbol> & symbol)78     void SetSymbol(const std::optional<TabBarSymbol>& symbol)
79     {
80         symbol_ = symbol;
81     }
82 
HasBuilder()83     bool HasBuilder() const
84     {
85         return builder_ != nullptr;
86     }
87 
SetBuilder(TabBarBuilderFunc && builderParam)88     void SetBuilder(TabBarBuilderFunc&& builderParam)
89     {
90         builder_ = std::move(builderParam);
91     }
92 
ExecuteBuilder()93     void ExecuteBuilder() const
94     {
95         if (builder_ != nullptr) {
96             builder_();
97         }
98     }
99 
SetTabBarStyle(TabBarStyle tabBarStyle)100     void SetTabBarStyle(TabBarStyle tabBarStyle)
101     {
102         tabBarStyle_ = tabBarStyle;
103     }
104 
GetTabBarStyle()105     TabBarStyle GetTabBarStyle() const
106     {
107         return tabBarStyle_;
108     }
109 
SetCustomNode(FrameNode * node)110     void SetCustomNode(FrameNode* node)
111     {
112         node_ = node;
113     }
114 
115 private:
116     std::string text_;
117     std::string icon_;
118     std::optional<TabBarSymbol> symbol_;
119     TabBarBuilderFunc builder_;
120     TabBarStyle tabBarStyle_ = TabBarStyle::NOSTYLE;
121     FrameNode* node_ = nullptr;
122 };
123 
124 enum class AnimationType {
125     PRESS = 0,
126     HOVER,
127     HOVERTOPRESS,
128 };
129 
130 class TabBarPattern : public Pattern {
131     DECLARE_ACE_TYPE(TabBarPattern, Pattern);
132 
133 public:
134     explicit TabBarPattern(const RefPtr<SwiperController>& swiperController);
135     ~TabBarPattern() override = default;
136 
IsAtomicNode()137     bool IsAtomicNode() const override
138     {
139         return false;
140     }
141 
CreateLayoutProperty()142     RefPtr<LayoutProperty> CreateLayoutProperty() override
143     {
144         return MakeRefPtr<TabBarLayoutProperty>();
145     }
146 
CreateLayoutAlgorithm()147     RefPtr<LayoutAlgorithm> CreateLayoutAlgorithm() override
148     {
149         auto layoutAlgorithm = MakeRefPtr<TabBarLayoutAlgorithm>();
150         layoutAlgorithm->SetCurrentDelta(currentDelta_);
151         layoutAlgorithm->SetTabBarStyle(tabBarStyle_);
152         if (targetIndex_) {
153             layoutAlgorithm->SetTargetIndex(targetIndex_);
154         } else if (jumpIndex_) {
155             layoutAlgorithm->SetJumpIndex(jumpIndex_);
156         }
157         layoutAlgorithm->SetVisibleItemPosition(visibleItemPosition_);
158         layoutAlgorithm->SetCanOverScroll(canOverScroll_);
159         return layoutAlgorithm;
160     }
161 
CreatePaintProperty()162     RefPtr<PaintProperty> CreatePaintProperty() override
163     {
164         return MakeRefPtr<TabBarPaintProperty>();
165     }
166 
167     RefPtr<NodePaintMethod> CreateNodePaintMethod() override;
168 
CreateAccessibilityProperty()169     RefPtr<AccessibilityProperty> CreateAccessibilityProperty() override
170     {
171         return MakeRefPtr<TabBarAccessibilityProperty>();
172     }
173 
GetFocusPattern()174     FocusPattern GetFocusPattern() const override
175     {
176         FocusPaintParam focusPaintParams;
177         auto pipeline = PipelineBase::GetCurrentContext();
178         CHECK_NULL_RETURN(pipeline, FocusPattern());
179         auto focusTheme = pipeline->GetTheme<FocusAnimationTheme>();
180         CHECK_NULL_RETURN(focusTheme, FocusPattern());
181         auto tabTheme = pipeline->GetTheme<TabTheme>();
182         CHECK_NULL_RETURN(tabTheme, FocusPattern());
183         focusPaintParams.SetPaintWidth(tabTheme->GetActiveIndicatorWidth());
184         focusPaintParams.SetPaintColor(focusTheme->GetColor());
185         return { FocusType::NODE, true, FocusStyleType::CUSTOM_REGION, focusPaintParams };
186     }
187 
SetIndicator(int32_t indicator)188     void SetIndicator(int32_t indicator)
189     {
190         indicator_ = indicator;
191     }
192 
193     void OnTabBarIndexChange(int32_t index);
194 
195     void UpdateCurrentOffset(float offset);
196 
197     void UpdateIndicator(int32_t indicator);
198 
199     void UpdateTextColorAndFontWeight(int32_t indicator);
200 
201     void UpdateImageColor(int32_t indicator);
202 
203     void UpdateSymbolStats(int32_t index, int32_t preIndex);
204 
205     void UpdateSymbolEffect(int32_t index);
206 
207     void UpdateSubTabBoard(int32_t index);
208 
209     SelectedMode GetSelectedMode() const;
210 
AddTabBarItemType(int32_t tabBarItemId,bool isBuilder)211     void AddTabBarItemType(int32_t tabBarItemId, bool isBuilder)
212     {
213         tabBarType_.emplace(std::make_pair(tabBarItemId, isBuilder));
214     }
215 
216     bool IsContainsBuilder();
217 
SetAnimationDuration(int32_t animationDuration)218     void SetAnimationDuration(int32_t animationDuration)
219     {
220         animationDuration_ = animationDuration;
221     }
222 
SetTouching(bool isTouching)223     void SetTouching(bool isTouching)
224     {
225         touching_ = isTouching;
226     }
227 
IsTouching()228     bool IsTouching() const
229     {
230         return touching_;
231     }
232 
SetTabBarStyle(TabBarStyle tabBarStyle)233     void SetTabBarStyle(TabBarStyle tabBarStyle)
234     {
235         tabBarStyle_ = tabBarStyle;
236         InitLongPressAndDragEvent();
237     }
238 
GetTabBarStyle()239     TabBarStyle GetTabBarStyle() const
240     {
241         return tabBarStyle_;
242     }
243 
244     void TriggerTranslateAnimation(int32_t currentIndex, int32_t targetIndex);
245 
246     void HandleBottomTabBarChange(int32_t index);
247 
GetChangeByClick()248     bool GetChangeByClick() const
249     {
250         return changeByClick_;
251     }
252 
SetChangeByClick(bool changeByClick)253     void SetChangeByClick(bool changeByClick)
254     {
255         changeByClick_ = changeByClick;
256     }
257 
GetClickRepeat()258     bool GetClickRepeat() const
259     {
260         return clickRepeat_;
261     }
262 
SetClickRepeat(bool clickRepeat)263     void SetClickRepeat(bool clickRepeat)
264     {
265         clickRepeat_ = clickRepeat;
266     }
267 
SetSelectedMode(SelectedMode selectedMode,uint32_t position)268     void SetSelectedMode(SelectedMode selectedMode, uint32_t position)
269     {
270         if (selectedModes_.size() <= position) {
271             selectedModes_.emplace_back(selectedMode);
272         } else {
273             selectedModes_[position] = selectedMode;
274         }
275     }
276 
SetIndicatorStyle(const IndicatorStyle & indicatorStyle,uint32_t position)277     void SetIndicatorStyle(const IndicatorStyle& indicatorStyle, uint32_t position)
278     {
279         if (indicatorStyles_.size() <= position) {
280             indicatorStyles_.emplace_back(indicatorStyle);
281         } else {
282             indicatorStyles_[position] = indicatorStyle;
283         }
284     }
285 
SetTabBarStyle(TabBarStyle tabBarStyle,uint32_t position)286     void SetTabBarStyle(TabBarStyle tabBarStyle, uint32_t position)
287     {
288         if (tabBarStyles_.size() <= position) {
289             tabBarStyles_.emplace_back(tabBarStyle);
290         } else {
291             tabBarStyles_[position] = tabBarStyle;
292         }
293     }
294 
SetBottomTabBarStyle(const BottomTabBarStyle & bottomTabBarStyle,uint32_t position)295     void SetBottomTabBarStyle(const BottomTabBarStyle& bottomTabBarStyle, uint32_t position)
296     {
297         if (bottomTabBarStyles_.size() <= position) {
298             bottomTabBarStyles_.emplace_back(bottomTabBarStyle);
299         } else {
300             bottomTabBarStyles_[position] = bottomTabBarStyle;
301         }
302     }
303 
SetLabelStyle(int32_t tabBarItemId,const LabelStyle & labelStyle)304     void SetLabelStyle(int32_t tabBarItemId, const LabelStyle& labelStyle)
305     {
306         labelStyles_[tabBarItemId] = labelStyle;
307     }
308 
SetIconStyle(const IconStyle & iconStyle,uint32_t position)309     void SetIconStyle(const IconStyle& iconStyle, uint32_t position)
310     {
311         if (iconStyles_.size() <= position) {
312             iconStyles_.emplace_back(iconStyle);
313         } else {
314             iconStyles_[position] = iconStyle;
315         }
316     }
317 
GetIconStyle()318     std::vector<IconStyle> GetIconStyle()
319     {
320         return iconStyles_;
321     }
322 
SetSymbol(const TabBarSymbol & symbol,uint32_t position)323     void SetSymbol(const TabBarSymbol& symbol, uint32_t position)
324     {
325         if (symbolArray_.size() <= position) {
326             symbolArray_.emplace_back(symbol);
327         } else {
328             symbolArray_[position] = symbol;
329         }
330     }
331 
GetSymbol()332     std::vector<TabBarSymbol> GetSymbol()
333     {
334         return symbolArray_;
335     }
336 
IsMaskAnimationByCreate()337     bool IsMaskAnimationByCreate()
338     {
339         return isMaskAnimationByCreate_;
340     }
341 
SetMaskAnimationByCreate(bool isMaskAnimationByCreate)342     void SetMaskAnimationByCreate(bool isMaskAnimationByCreate)
343     {
344         isMaskAnimationByCreate_ = isMaskAnimationByCreate;
345     }
346 
IsMaskAnimationExecuted()347     bool IsMaskAnimationExecuted()
348     {
349         return isMaskAnimationExecuted_;
350     }
351 
SetMaskAnimationExecuted(bool isMaskAnimationExecuted)352     void SetMaskAnimationExecuted(bool isMaskAnimationExecuted)
353     {
354         isMaskAnimationExecuted_ = isMaskAnimationExecuted;
355     }
356 
SetImageColorOnIndex(int32_t index)357     void SetImageColorOnIndex(int32_t index)
358     {
359         imageColorOnIndex_ = index;
360     }
361 
GetImageColorOnIndex()362     std::optional<int32_t> GetImageColorOnIndex()
363     {
364         return imageColorOnIndex_;
365     }
366 
GetIndicator()367     int32_t GetIndicator()
368     {
369         return indicator_;
370     }
371 
372     bool IsAtTop() const;
373 
374     bool IsAtBottom() const;
375     std::string ProvideRestoreInfo() override;
376     void OnRestoreInfo(const std::string& restoreInfo) override;
377 
378     void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const override;
379     void FromJson(const std::unique_ptr<JsonValue>& json) override;
380 
SetFirstFocus(bool isFirstFocus)381     void SetFirstFocus(bool isFirstFocus)
382     {
383         isFirstFocus_ = isFirstFocus;
384     }
385 
ResetIndicatorAnimationState()386     void ResetIndicatorAnimationState()
387     {
388         isAnimating_ = false;
389         animationTargetIndex_.reset();
390     }
391 
GetTouchingSwiper()392     bool GetTouchingSwiper() const
393     {
394         return isTouchingSwiper_;
395     }
396 
GetTabBarStyle(uint32_t position)397     TabBarStyle GetTabBarStyle(uint32_t position) const
398     {
399         if (position < 0 || position >= tabBarStyles_.size()) {
400             return TabBarStyle::NOSTYLE;
401         }
402         return tabBarStyles_[position];
403     }
404 
GetBottomTabBarStyle(uint32_t position)405     const BottomTabBarStyle& GetBottomTabBarStyle(uint32_t position) const
406     {
407         if (position < 0 || position >= bottomTabBarStyles_.size()) {
408             return bottomTabBarStyle_;
409         }
410         return bottomTabBarStyles_[position];
411     }
412 
GetBottomTabLabelStyle(int32_t tabBarItemId)413     LabelStyle GetBottomTabLabelStyle(int32_t tabBarItemId) const
414     {
415         auto iter = labelStyles_.find(tabBarItemId);
416         if (iter == labelStyles_.end()) {
417             LabelStyle labelStyle{};
418             return labelStyle;
419         }
420         return iter->second;
421     }
422 
423     void DumpAdvanceInfo() override;
424 
GetAnimationDuration()425     std::optional<int32_t> GetAnimationDuration()
426     {
427         return animationDuration_;
428     }
429 
GetTabContentWillChangeFlag()430     bool GetTabContentWillChangeFlag()
431     {
432         return tabContentWillChangeFlag_;
433     }
434 
ResetTabContentWillChangeFlag()435     void ResetTabContentWillChangeFlag()
436     {
437         tabContentWillChangeFlag_ = false;
438     }
439 
440     void UpdateAnimationDuration();
441 
HasSurfaceChangedCallback()442     bool HasSurfaceChangedCallback()
443     {
444         return surfaceChangedCallbackId_.has_value();
445     }
446 
UpdateSurfaceChangedCallbackId(int32_t id)447     void UpdateSurfaceChangedCallbackId(int32_t id)
448     {
449         surfaceChangedCallbackId_ = id;
450     }
451 
452     bool ContentWillChange(int32_t comingIndex);
453     bool ContentWillChange(int32_t currentIndex, int32_t comingIndex);
454 
455     void AddTabBarItemClickEvent(const RefPtr<FrameNode>& tabBarItem);
456 
RemoveTabBarItemInfo(int32_t tabBarItemId)457     void RemoveTabBarItemInfo(int32_t tabBarItemId)
458     {
459         clickEvents_.erase(tabBarItemId);
460         labelStyles_.erase(tabBarItemId);
461     }
462 
SetIsExecuteBuilder(bool isExecuteBuilder)463     void SetIsExecuteBuilder(bool isExecuteBuilder)
464     {
465         isExecuteBuilder_ = isExecuteBuilder;
466     }
467 
468 private:
469     void OnModifyDone() override;
470     void OnAttachToFrameNode() override;
471     void OnDetachFromFrameNode(FrameNode* node) override;
472     void BeforeCreateLayoutWrapper() override;
473     void InitSurfaceChangedCallback();
474     bool OnDirtyLayoutWrapperSwap(const RefPtr<LayoutWrapper>& dirty, const DirtySwapConfig& config) override;
475     bool CustomizeExpandSafeArea() override;
476     void OnSyncGeometryNode(const DirtySwapConfig& config) override;
477 
478     void InitLongPressEvent(const RefPtr<GestureEventHub>& gestureHub);
479     void InitDragEvent(const RefPtr<GestureEventHub>& gestureHub);
480     void InitScrollableEvent(
481         const RefPtr<TabBarLayoutProperty>& layoutProperty, const RefPtr<GestureEventHub>& gestureHub);
482     void InitScrollable(const RefPtr<GestureEventHub>& gestureHub);
483     void InitTouch(const RefPtr<GestureEventHub>& gestureHub);
484     void InitHoverEvent();
485     void InitMouseEvent();
486     void SetSurfaceChangeCallback();
487 
488     void HandleMouseEvent(const MouseInfo& info);
489     void HandleHoverEvent(bool isHover);
490     void HandleHoverOnEvent(int32_t index);
491     void HandleMoveAway(int32_t index);
492     void InitOnKeyEvent(const RefPtr<FocusHub>& focusHub);
493     bool OnKeyEvent(const KeyEvent& event);
494     bool OnKeyEventWithoutClick(const KeyEvent& event);
495     bool OnKeyEventWithoutClick(const RefPtr<FrameNode>& host, const KeyEvent& event);
496     void HandleLongPressEvent(const GestureEvent& info);
497     void ShowDialogWithNode(int32_t index);
498     void CloseDialog();
499     void InitLongPressAndDragEvent();
500     void HandleClick(SourceType type, int32_t index);
501     void ClickTo(const RefPtr<FrameNode>& host, int32_t index);
502     void HandleTouchEvent(const TouchLocationInfo& info);
503     void HandleSubTabBarClick(const RefPtr<TabBarLayoutProperty>& layoutProperty, int32_t index);
504     void HandleBottomTabBarClick(int32_t selectedIndex, int32_t unselectedIndex);
505     void ChangeMask(int32_t index, float imageSize, const OffsetF& originalMaskOffset, float opacity,
506         float radiusRatio, bool isSelected);
507     void PlayMaskAnimation(float selectedImageSize, const OffsetF& originalSelectedMaskOffset, int32_t selectedIndex,
508         float unselectedImageSize, const OffsetF& originalUnselectedMaskOffset, int32_t unselectedIndex);
509     static void MaskAnimationFinish(const RefPtr<FrameNode>& host, int32_t selectedIndex, bool isSelected);
510     void GetBottomTabBarImageSizeAndOffset(const std::vector<int32_t>& selectedIndexes,
511         int32_t maskIndex, float& selectedImageSize, float& unselectedImageSize, OffsetF& originalSelectedMaskOffset,
512         OffsetF& originalUnselectedMaskOffset);
513     void UpdateBottomTabBarImageColor(const std::vector<int32_t>& selectedIndexes, int32_t maskIndex);
514     void UpdateSymbolApply(const RefPtr<NG::FrameNode>& symbolNode, RefPtr<TextLayoutProperty>& symbolProperty,
515         int32_t index, std::string type);
516     bool CheckSvg(int32_t index) const;
517 
518     void HandleTouchDown(int32_t index);
519     void HandleTouchUp(int32_t index);
520     int32_t CalculateSelectedIndex(const Offset& info);
521 
522     void PlayPressAnimation(int32_t index, const Color& pressColor, AnimationType animationType);
523     void PlayTabBarTranslateAnimation(AnimationOption option, float targetCurrentOffset);
524     void PlayIndicatorTranslateAnimation(AnimationOption option, RectF originalPaintRect, RectF targetPaintRect,
525         float targetOffset);
526     void StopTranslateAnimation();
527     float CalculateTargetOffset(int32_t targetIndex);
528     void UpdateIndicatorCurrentOffset(float offset);
529 
530     void GetInnerFocusPaintRect(RoundRect& paintRect);
531     void PaintFocusState(bool needMarkDirty = true);
532     void FocusIndexChange(int32_t index);
533     void UpdateGradientRegions(bool needMarkDirty = true);
534 
535     float GetSpace(int32_t indicator);
536     float CalculateFrontChildrenMainSize(int32_t indicator);
537     float CalculateBackChildrenMainSize(int32_t indicator);
538     void SetEdgeEffect(const RefPtr<GestureEventHub>& gestureHub);
539     void SetEdgeEffectCallback(const RefPtr<ScrollEdgeEffect>& scrollEffect);
540     bool IsOutOfBoundary();
541     void SetAccessibilityAction();
542     void TabBarClickEvent(int32_t index) const;
543     void OnCustomContentTransition(int32_t fromIndex, int32_t toIndex);
544     void ApplyTurnPageRateToIndicator(float turnPageRate);
545     bool CheckSwiperDisable() const;
546     void SetSwiperCurve(const RefPtr<Curve>& curve) const;
547     void InitTurnPageRateEvent();
548     void GetIndicatorStyle(IndicatorStyle& indicatorStyle, OffsetF& indicatorOffset);
549     void CalculateIndicatorStyle(
550         int32_t startIndex, int32_t nextIndex, IndicatorStyle& indicatorStyle, OffsetF& indicatorOffset);
551     Color GetTabBarBackgroundColor() const;
552     float GetLeftPadding() const;
553     void HandleBottomTabBarAnimation(int32_t index);
554     void UpdatePaintIndicator(int32_t indicator, bool needMarkDirty);
555     std::pair<float, float> GetOverScrollInfo(const SizeF& size);
556     void RemoveTabBarEventCallback();
557     void AddTabBarEventCallback();
558     void AddMaskItemClickEvent();
559     bool ParseTabsIsRtl();
560     bool IsValidIndex(int32_t index);
561     bool CanScroll() const;
562     int32_t GetLoopIndex(int32_t originalIndex) const;
563     RefPtr<SwiperPattern> GetSwiperPattern() const;
564 
565     void StartShowTabBar(int32_t delay = 0);
566     void StopShowTabBar();
567     void InitTabBarProperty();
568     void UpdateTabBarHiddenRatio(float ratio);
569     void SetTabBarTranslate(const TranslateOptions& options);
570     void SetTabBarOpacity(float opacity);
571 
572     RefPtr<NodeAnimatablePropertyFloat> showTabBarProperty_;
573     bool isTabBarShowing_ = false;
574 
575     std::map<int32_t, RefPtr<ClickEvent>> clickEvents_;
576     RefPtr<LongPressEvent> longPressEvent_;
577     RefPtr<TouchEventImpl> touchEvent_;
578     RefPtr<ScrollableEvent> scrollableEvent_;
579     RefPtr<InputEvent> mouseEvent_;
580     RefPtr<InputEvent> hoverEvent_;
581     RefPtr<SwiperController> swiperController_;
582     RefPtr<ScrollEdgeEffect> scrollEffect_;
583     RefPtr<FrameNode> dialogNode_;
584     RefPtr<DragEvent> dragEvent_;
585     AnimationStartEventPtr animationStartEvent_;
586     AnimationEndEventPtr animationEndEvent_;
587 
588     float bigScale_ = 0.0f;
589     float largeScale_ = 0.0f;
590     float maxScale_ = 0.0f;
591     int32_t indicator_ = 0;
592     int32_t focusIndicator_ = 0;
593     Axis axis_ = Axis::HORIZONTAL;
594     std::unordered_map<int32_t, bool> tabBarType_;
595     std::optional<int32_t> animationDuration_;
596 
597     std::shared_ptr<AnimationUtils::Animation> tabbarIndicatorAnimation_;
598     std::shared_ptr<AnimationUtils::Animation> translateAnimation_;
599     std::shared_ptr<AnimationUtils::Animation> maskAnimation_;
600 
601     bool indicatorAnimationIsRunning_ = false;
602     bool translateAnimationIsRunning_ = false;
603 
604     bool isRTL_ = false;
605 
606     bool touching_ = false; // whether the item is in touching
607     bool isHover_ = false;
608     bool isMaskAnimationByCreate_ = false;
609     bool isMaskAnimationExecuted_ = false;
610     bool tabContentWillChangeFlag_ = false;
611     std::optional<int32_t> imageColorOnIndex_;
612     std::optional<int32_t> touchingIndex_;
613     std::optional<int32_t> hoverIndex_;
614     std::optional<int32_t> moveIndex_;
615     TabBarStyle tabBarStyle_ = TabBarStyle::NOSTYLE;
616     float currentIndicatorOffset_ = 0.0f;
617     std::vector<SelectedMode> selectedModes_;
618     std::vector<IndicatorStyle> indicatorStyles_;
619     std::vector<TabBarStyle> tabBarStyles_;
620     std::unordered_map<int32_t, LabelStyle> labelStyles_;
621     std::vector<IconStyle> iconStyles_;
622     std::vector<TabBarSymbol> symbolArray_;
623     bool isFirstFocus_ = true;
624     bool isTouchingSwiper_ = false;
625     float indicatorStartPos_ = 0.0f;
626     float indicatorEndPos_ = 0.0f;
627     float turnPageRate_ = 0.0f;
628     int32_t swiperStartIndex_ = 0;
629     std::vector<BottomTabBarStyle> bottomTabBarStyles_;
630     BottomTabBarStyle bottomTabBarStyle_;
631 
632     RefPtr<TabBarModifier> tabBarModifier_;
633     std::vector<bool> gradientRegions_ = {false, false, false, false};
634     bool isAnimating_ = false;
635     bool changeByClick_ = false;
636     bool clickRepeat_ = false;
637     float scrollMargin_ = 0.0f;
638     bool isFirstLayout_ = true;
639     bool isExecuteBuilder_ = false;
640     std::optional<int32_t> animationTargetIndex_;
641     std::optional<int32_t> surfaceChangedCallbackId_;
642     std::optional<WindowSizeChangeReason> windowSizeChangeReason_;
643     std::pair<double, double> prevRootSize_;
644 
645     std::optional<int32_t> jumpIndex_;
646     std::optional<int32_t> targetIndex_;
647     float currentDelta_ = 0.0f;
648     float currentOffset_ = 0.0f;
649     std::map<int32_t, ItemInfo> visibleItemPosition_;
650     bool canOverScroll_ = false;
651     ACE_DISALLOW_COPY_AND_MOVE(TabBarPattern);
652 };
653 } // namespace OHOS::Ace::NG
654 
655 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_TABS_TAB_BAR_PATTERN_H
656