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_SIDE_BAR_SIDE_BAR_CONTAINER_PATTERN_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_SIDE_BAR_SIDE_BAR_CONTAINER_PATTERN_H 18 19 #include "core/components/common/layout/constants.h" 20 #include "core/components_ng/pattern/pattern.h" 21 #include "core/components_ng/pattern/side_bar/side_bar_container_event_hub.h" 22 #include "core/components_ng/pattern/side_bar/side_bar_container_layout_algorithm.h" 23 #include "core/components_ng/pattern/side_bar/side_bar_container_layout_property.h" 24 #include "core/components_ng/pattern/side_bar/side_bar_theme.h" 25 26 namespace OHOS::Ace::NG { 27 28 enum class SideBarAnimationDirection { 29 LTR, 30 RTL, 31 }; 32 class SideBarContainerPattern : public Pattern { 33 DECLARE_ACE_TYPE(SideBarContainerPattern, Pattern); 34 35 public: 36 SideBarContainerPattern() = default; 37 ~SideBarContainerPattern() override = default; 38 IsAtomicNode()39 bool IsAtomicNode() const override 40 { 41 return false; 42 } 43 CreateLayoutProperty()44 RefPtr<LayoutProperty> CreateLayoutProperty() override 45 { 46 return MakeRefPtr<SideBarContainerLayoutProperty>(); 47 } 48 CreateLayoutAlgorithm()49 RefPtr<LayoutAlgorithm> CreateLayoutAlgorithm() override 50 { 51 auto layoutAlgorithm = MakeRefPtr<SideBarContainerLayoutAlgorithm>(); 52 layoutAlgorithm->SetCurrentOffset(currentOffset_); 53 layoutAlgorithm->SetSideBarStatus(sideBarStatus_); 54 layoutAlgorithm->SetNeedInitRealSideBarWidth(needInitRealSideBarWidth_); 55 layoutAlgorithm->SetRealSideBarWidth(realSideBarWidth_); 56 layoutAlgorithm->SetPreSideBarWidth(preSidebarWidth_); 57 layoutAlgorithm->SetRealSideBarHeight(realSideBarHeight_); 58 layoutAlgorithm->SetRealDividerWidth(realDividerWidth_); 59 layoutAlgorithm->SetControlButtonClick(isControlButtonClick_); 60 auto layoutProperty = GetLayoutProperty<SideBarContainerLayoutProperty>(); 61 if (layoutProperty) { 62 layoutAlgorithm->SetSideBarContainerType(type_); 63 } 64 layoutAlgorithm->SetMinSideBarWidth(minSideBarWidth_); 65 layoutAlgorithm->SetMaxSideBarWidth(maxSideBarWidth_); 66 layoutAlgorithm->SetMinContentWidth(minContentWidth_); 67 layoutAlgorithm->SetTypeUpdateWidth(typeUpdateWidth_); 68 layoutAlgorithm->SetControlImageWidth(controlImageWidth_); 69 layoutAlgorithm->SetControlImageHeight(controlImageHeight_); 70 auto host = GetHost(); 71 auto sideBarContainerPattern = host->GetPattern<SideBarContainerPattern>(); 72 layoutAlgorithm->SetPattern(AceType::WeakClaim(AceType::RawPtr(sideBarContainerPattern))); 73 return layoutAlgorithm; 74 } 75 CreateEventHub()76 RefPtr<EventHub> CreateEventHub() override 77 { 78 return MakeRefPtr<SideBarContainerEventHub>(); 79 } 80 SetSideBarStatus(SideBarStatus sideBarStatus)81 void SetSideBarStatus(SideBarStatus sideBarStatus) 82 { 83 sideBarStatus_ = sideBarStatus; 84 showSideBar_ = sideBarStatus_ == SideBarStatus::SHOW; 85 SetAccessibilityEvent(); 86 } 87 SetHasControlButton(bool hasControlButton)88 void SetHasControlButton(bool hasControlButton) 89 { 90 hasControlButton_ = hasControlButton; 91 } 92 HasControlButton()93 bool HasControlButton() const 94 { 95 return hasControlButton_; 96 } 97 MarkNeedInitRealSideBarWidth(bool value)98 void MarkNeedInitRealSideBarWidth(bool value) 99 { 100 needInitRealSideBarWidth_ = value; 101 } 102 SetControlButtonClick(bool value)103 void SetControlButtonClick(bool value) 104 { 105 isControlButtonClick_ = value; 106 } 107 SetRightToLeftMode(bool value)108 void SetRightToLeftMode(bool value) 109 { 110 isRightToLeft_ = value; 111 } 112 GetFocusPattern()113 FocusPattern GetFocusPattern() const override 114 { 115 return { FocusType::SCOPE, true }; 116 } 117 GetScopeFocusAlgorithm()118 ScopeFocusAlgorithm GetScopeFocusAlgorithm() override 119 { 120 return { false, true, ScopeType::OTHERS }; 121 } 122 123 RefPtr<NodePaintMethod> CreateNodePaintMethod() override; 124 void InitControlButtonTouchEvent(const RefPtr<GestureEventHub>& gestureHub); 125 void InitDividerMouseEvent(const RefPtr<InputEventHub>& inputHub); 126 void UpdateSideBarPosition(float value); SetMinSideBarWidth(float minSideBarWidth)127 void SetMinSideBarWidth(float minSideBarWidth) 128 { 129 minSideBarWidth_ = minSideBarWidth; 130 } SetMaxSideBarWidth(float maxSideBarWidth)131 void SetMaxSideBarWidth(float maxSideBarWidth) 132 { 133 maxSideBarWidth_ = maxSideBarWidth; 134 } SetMinContentWidth(float minContentWidth)135 void SetMinContentWidth(float minContentWidth) 136 { 137 minContentWidth_ = minContentWidth; 138 } SetTypeUpdateWidth(float typeUpdateWidth)139 void SetTypeUpdateWidth(float typeUpdateWidth) 140 { 141 typeUpdateWidth_ = typeUpdateWidth; 142 } 143 void GetControlImageSize(Dimension& width, Dimension& height); OnWindowFocused()144 void OnWindowFocused() override 145 { 146 WindowFocus(true); 147 } 148 OnWindowUnfocused()149 void OnWindowUnfocused() override 150 { 151 WindowFocus(false); 152 } 153 GetShowSideBar()154 bool GetShowSideBar() const 155 { 156 return showSideBar_; 157 } 158 SetImageInfo(ImageSourceInfo imageInfo)159 void SetImageInfo(ImageSourceInfo imageInfo) 160 { 161 imageInfo_ = imageInfo; 162 } 163 164 private: 165 void WindowFocus(bool isFocus); 166 bool OnDirtyLayoutWrapperSwap(const RefPtr<LayoutWrapper>& dirty, const DirtySwapConfig& config) override; 167 void OnAttachToFrameNode() override; 168 void OnDetachFromFrameNode(FrameNode* frameNode) override; 169 void OnModifyDone() override; 170 void OnColorConfigurationUpdate() override; 171 void UpdateAnimDir(); 172 void DoAnimation(); 173 void CreateAnimation(); 174 void FireChangeEvent(bool isShow); 175 void UpdateControlButtonIcon(); 176 void CreateAndMountNodes(); 177 void CreateAndMountDivider(const RefPtr<NG::FrameNode>& parentNode); 178 void CreateAndMountControlButton(const RefPtr<NG::FrameNode>& parentNode); 179 RefPtr<FrameNode> CreateControlButton(const RefPtr<SideBarTheme>& sideBarTheme); 180 RefPtr<FrameNode> CreateControlImage(const RefPtr<SideBarTheme>& sideBarTheme, 181 const RefPtr<FrameNode>& parentNode); 182 void InitPanEvent(const RefPtr<GestureEventHub>& gestureHub); 183 void HandleDragStart(); 184 void HandleDragUpdate(float xOffset); 185 void HandleDragEnd(); 186 void HandlePanEventEnd(); 187 void OnUpdateShowSideBar(const RefPtr<SideBarContainerLayoutProperty>& layoutProperty); 188 void OnUpdateShowControlButton( 189 const RefPtr<SideBarContainerLayoutProperty>& layoutProperty, const RefPtr<FrameNode>& host); 190 void OnUpdateShowDivider( 191 const RefPtr<SideBarContainerLayoutProperty>& layoutProperty, const RefPtr<FrameNode>& host); 192 void OnUpdateSideBarAndContent(const RefPtr<FrameNode>& host); 193 void OnDividerMouseEvent(MouseInfo& info); 194 void OnHover(bool isHover); 195 void AddDividerHotZoneRect(const RefPtr<SideBarContainerLayoutAlgorithm>& layoutAlgorithm); 196 SideBarPosition GetSideBarPositionWithRtl(const RefPtr<SideBarContainerLayoutProperty>& layoutProperty); 197 RefPtr<FrameNode> GetSideBarNode(const RefPtr<FrameNode>& host) const; 198 RefPtr<FrameNode> GetFirstFrameNode(const RefPtr<UINode>& host) const; 199 RefPtr<FrameNode> GetSideBarNodeOrFirstChild() const; 200 RefPtr<FrameNode> GetControlButtonNode() const; 201 RefPtr<FrameNode> GetContentNode(const RefPtr<FrameNode>& host) const; 202 RefPtr<FrameNode> GetControlImageNode() const; 203 RefPtr<FrameNode> GetDividerNode() const; 204 std::optional<float> DimensionConvertToPx(const Dimension& value) const; 205 Dimension ConvertPxToPercent(float value) const; 206 void UpdateDividerShadow() const; 207 void SetSideBarActive(bool isActive, bool onlyJsActive) const; 208 void OnLanguageConfigurationUpdate() override; 209 void SetSideBarMask(bool isWindowFocus) const; 210 void OnWindowSizeChanged(int32_t width, int32_t height, WindowSizeChangeReason type) override; 211 void RegisterElementInfoCallBack(const RefPtr<FrameNode>& buttonNode); 212 void SetAccessibilityEvent(); 213 void InitImageErrorCallback(const RefPtr<SideBarTheme>& sideBarTheme, const RefPtr<FrameNode>& imgNode); 214 215 RefPtr<InputEvent> hoverEvent_; 216 RefPtr<InputEvent> dividerMouseEvent_; 217 RefPtr<ClickEvent> controlButtonClickEvent_; 218 RefPtr<InputEvent> controlButtonHoverEvent_; 219 RefPtr<PanEvent> panEvent_; 220 RefPtr<Animator> controller_; 221 RefPtr<CurveAnimation<float>> rightToLeftAnimation_; 222 RefPtr<CurveAnimation<float>> leftToRightAnimation_; 223 RefPtr<PanEvent> dragEvent_; 224 225 float currentOffset_ = 0.0f; 226 float realDividerWidth_ = 0.0f; 227 SideBarStatus sideBarStatus_ = SideBarStatus::SHOW; 228 bool showSideBar_ = true; 229 bool needInitRealSideBarWidth_ = true; 230 RectF dragRect_; 231 bool hasControlButton_ = false; 232 SideBarAnimationDirection animDir_ = SideBarAnimationDirection::LTR; 233 bool isControlButtonClick_ = false; 234 bool hasInit_ = false; 235 bool autoHide_ = false; 236 bool inAnimation_ = false; 237 bool isRightToLeft_ = false; 238 bool isInDividerDrag_ = false; 239 bool isDividerDraggable_ = true; 240 bool isWindowFocus_ = true; 241 bool userSetShowSideBar_ = true; 242 243 Dimension realSideBarWidth_ = -1.0_vp; 244 Dimension preSidebarWidth_; 245 Dimension userSetSidebarWidth_; 246 Dimension adjustMaxSideBarWidth_; 247 Dimension adjustMinSideBarWidth_; 248 SideBarContainerType type_ = SideBarContainerType::EMBED; 249 float minContentWidth_ = -1.0f; 250 float minSideBarWidth_ = -1.0f; 251 float maxSideBarWidth_ = -1.0f; 252 float typeUpdateWidth_ = 0.0f; 253 float realSideBarHeight_ = 0.0f; 254 Dimension controlImageWidth_; 255 Dimension controlImageHeight_; 256 257 ACE_DISALLOW_COPY_AND_MOVE(SideBarContainerPattern); 258 259 RefPtr<LongPressEvent> longPressEvent_; 260 GestureEventFunc longPressActionEnd_; 261 RefPtr<FrameNode> dialogNode_; 262 ImageSourceInfo imageInfo_; 263 void InitLongPressEvent(const RefPtr<FrameNode>& buttonNode); 264 void HandleLongPressEvent(); 265 void HandleLongPressActionEnd(); 266 void ShowDialogWithNode(); 267 bool isDialogShow_ = false; 268 }; 269 270 } // namespace OHOS::Ace::NG 271 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_SIDE_BAR_SIDE_BAR_CONTAINER_PATTERN_H 272