1 /* 2 * Copyright (c) 2021-2022 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_EVENT_FOCUS_HUB_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_EVENT_FOCUS_HUB_H 18 19 #include "base/memory/ace_type.h" 20 #include "core/components_ng/base/geometry_node.h" 21 #include "core/components_ng/event/touch_event.h" 22 #include "core/event/key_event.h" 23 #include "core/gestures/gesture_info.h" 24 25 namespace OHOS::Ace::NG { 26 27 class FrameNode; 28 class FocusHub; 29 class EventHub; 30 31 using TabIndexNodeList = std::list<std::pair<int32_t, WeakPtr<FocusHub>>>; 32 constexpr int32_t DEFAULT_TAB_FOCUSED_INDEX = -2; 33 constexpr int32_t NONE_TAB_FOCUSED_INDEX = -1; 34 constexpr int32_t MASK_FOCUS_STEP_FORWARD = 0x10; 35 constexpr int32_t MASK_FOCUS_STEP_TAB = 0x5; 36 37 enum class FocusType : int32_t { 38 DISABLE = 0, 39 NODE = 1, 40 SCOPE = 2, 41 }; 42 enum class FocusNodeType : int32_t { 43 DEFAULT = 0, 44 GROUP_DEFAULT = 1, 45 }; 46 enum class ScopeType : int32_t { 47 OTHERS = 0, 48 FLEX = 1, 49 PROJECT_AREA = 2, 50 }; 51 enum class FocusStep : int32_t { 52 NONE = 0x0, 53 LEFT = 0x1, 54 UP = 0x2, 55 RIGHT = 0x11, 56 DOWN = 0x12, 57 LEFT_END = 0x3, 58 UP_END = 0x4, 59 RIGHT_END = 0X13, 60 DOWN_END = 0x14, 61 SHIFT_TAB = 0x5, 62 TAB = 0x15, 63 }; 64 65 using GetNextFocusNodeFunc = std::function<void(FocusStep, const WeakPtr<FocusHub>&, WeakPtr<FocusHub>&)>; 66 67 enum class FocusStyleType : int32_t { 68 NONE = -1, 69 INNER_BORDER = 0, 70 OUTER_BORDER = 1, 71 CUSTOM_BORDER = 2, 72 CUSTOM_REGION = 3, 73 }; 74 75 enum class OnKeyEventType : int32_t { 76 DEFAULT = 0, 77 CONTEXT_MENU = 1, 78 }; 79 80 class ACE_EXPORT FocusPaintParam : public virtual AceType { 81 DECLARE_ACE_TYPE(FocusPaintParam, AceType) 82 83 public: 84 FocusPaintParam() = default; 85 ~FocusPaintParam() override = default; 86 HasPaintRect()87 bool HasPaintRect() const 88 { 89 return paintRect.has_value(); 90 } GetPaintRect()91 const RoundRect& GetPaintRect() const 92 { 93 return paintRect.value(); 94 } 95 HasPaintColor()96 bool HasPaintColor() const 97 { 98 return paintColor.has_value(); 99 } GetPaintColor()100 const Color& GetPaintColor() const 101 { 102 return paintColor.value(); 103 } 104 HasPaintWidth()105 bool HasPaintWidth() const 106 { 107 return paintWidth.has_value(); 108 } GetPaintWidth()109 const Dimension& GetPaintWidth() const 110 { 111 return paintWidth.value(); 112 } 113 HasFocusPadding()114 bool HasFocusPadding() const 115 { 116 return focusPadding.has_value(); 117 } GetFocusPadding()118 const Dimension& GetFocusPadding() const 119 { 120 return focusPadding.value(); 121 } SetPaintRect(const RoundRect & rect)122 void SetPaintRect(const RoundRect& rect) 123 { 124 paintRect = rect; 125 } SetPaintColor(const Color & color)126 void SetPaintColor(const Color& color) 127 { 128 paintColor = color; 129 } SetPaintWidth(const Dimension & width)130 void SetPaintWidth(const Dimension& width) 131 { 132 paintWidth = width; 133 } SetFocusPadding(const Dimension & padding)134 void SetFocusPadding(const Dimension& padding) 135 { 136 focusPadding = padding; 137 } 138 139 private: 140 std::optional<RoundRect> paintRect; 141 std::optional<Color> paintColor; 142 std::optional<Dimension> paintWidth; 143 std::optional<Dimension> focusPadding; 144 }; 145 146 class ACE_EXPORT FocusPattern : public virtual AceType { 147 DECLARE_ACE_TYPE(FocusPattern, AceType) 148 149 public: 150 FocusPattern() = default; FocusPattern(FocusType focusType,bool focusable)151 FocusPattern(FocusType focusType, bool focusable) : focusType_(focusType), focusable_(focusable) {} FocusPattern(FocusType focusType,bool focusable,FocusStyleType styleType)152 FocusPattern(FocusType focusType, bool focusable, FocusStyleType styleType) 153 : focusType_(focusType), focusable_(focusable), styleType_(styleType) 154 {} FocusPattern(FocusType focusType,bool focusable,FocusStyleType styleType,const FocusPaintParam & paintParams)155 FocusPattern(FocusType focusType, bool focusable, FocusStyleType styleType, const FocusPaintParam& paintParams) 156 : focusType_(focusType), focusable_(focusable), styleType_(styleType) 157 { 158 if (!paintParams_) { 159 paintParams_ = std::make_unique<FocusPaintParam>(); 160 } 161 if (paintParams.HasPaintRect()) { 162 paintParams_->SetPaintRect(paintParams.GetPaintRect()); 163 } 164 if (paintParams.HasPaintColor()) { 165 paintParams_->SetPaintColor(paintParams.GetPaintColor()); 166 } 167 if (paintParams.HasPaintWidth()) { 168 paintParams_->SetPaintWidth(paintParams.GetPaintWidth()); 169 } 170 if (paintParams.HasFocusPadding()) { 171 paintParams_->SetFocusPadding(paintParams.GetFocusPadding()); 172 } 173 } 174 ~FocusPattern() override = default; 175 GetFocusType()176 FocusType GetFocusType() const 177 { 178 return focusType_; 179 } SetFocusType(FocusType type)180 void SetFocusType(FocusType type) 181 { 182 focusType_ = type; 183 } 184 GetFocusable()185 bool GetFocusable() const 186 { 187 return focusable_; 188 } SetFocusable(bool focusable)189 void SetFocusable(bool focusable) 190 { 191 focusable_ = focusable; 192 } 193 GetStyleType()194 FocusStyleType GetStyleType() const 195 { 196 return styleType_; 197 } SetStyleType(FocusStyleType styleType)198 void SetStyleType(FocusStyleType styleType) 199 { 200 styleType_ = styleType; 201 } 202 GetFocusPaintParams()203 const std::unique_ptr<FocusPaintParam>& GetFocusPaintParams() const 204 { 205 return paintParams_; 206 } SetFocusPaintParams(const FocusPaintParam & paintParams)207 void SetFocusPaintParams(const FocusPaintParam& paintParams) 208 { 209 if (!paintParams_) { 210 paintParams_ = std::make_unique<FocusPaintParam>(); 211 } 212 if (paintParams.HasPaintRect()) { 213 paintParams_->SetPaintRect(paintParams.GetPaintRect()); 214 } 215 if (paintParams.HasPaintColor()) { 216 paintParams_->SetPaintColor(paintParams.GetPaintColor()); 217 } 218 if (paintParams.HasPaintWidth()) { 219 paintParams_->SetPaintWidth(paintParams.GetPaintWidth()); 220 } 221 if (paintParams.HasFocusPadding()) { 222 paintParams_->SetFocusPadding(paintParams.GetFocusPadding()); 223 } 224 } 225 226 private: 227 FocusType focusType_ = FocusType::DISABLE; 228 bool focusable_ = false; 229 FocusStyleType styleType_ = FocusStyleType::NONE; 230 std::unique_ptr<FocusPaintParam> paintParams_ = nullptr; 231 }; 232 233 struct ScopeFocusAlgorithm final { 234 ScopeFocusAlgorithm() = default; ScopeFocusAlgorithmfinal235 ScopeFocusAlgorithm(bool isVertical, bool isLeftToRight, ScopeType scopeType) 236 : isVertical(isVertical), isLeftToRight(isLeftToRight), scopeType(scopeType) 237 {} ScopeFocusAlgorithmfinal238 ScopeFocusAlgorithm(bool isVertical, bool isLeftToRight, ScopeType scopeType, GetNextFocusNodeFunc&& function) 239 : isVertical(isVertical), isLeftToRight(isLeftToRight), scopeType(scopeType), 240 getNextFocusNode(std::move(function)) 241 {} 242 ~ScopeFocusAlgorithm() = default; 243 244 bool isVertical { true }; 245 bool isLeftToRight { true }; 246 ScopeType scopeType { ScopeType::OTHERS }; 247 GetNextFocusNodeFunc getNextFocusNode; 248 }; 249 250 class ACE_EXPORT FocusCallbackEvents : public virtual AceType { 251 DECLARE_ACE_TYPE(FocusCallbackEvents, AceType) 252 public: 253 FocusCallbackEvents() = default; 254 ~FocusCallbackEvents() override = default; 255 ClearOnFocusCallback()256 void ClearOnFocusCallback() 257 { 258 if (onFocusCallback_) { 259 onFocusCallback_ = nullptr; 260 } 261 } 262 SetOnFocusCallback(OnFocusFunc && onFocusCallback)263 void SetOnFocusCallback(OnFocusFunc&& onFocusCallback) 264 { 265 onFocusCallback_ = std::move(onFocusCallback); 266 } 267 GetOnFocusCallback()268 const OnFocusFunc& GetOnFocusCallback() 269 { 270 return onFocusCallback_; 271 } 272 ClearOnBlurCallback()273 void ClearOnBlurCallback() 274 { 275 if (onBlurCallback_) { 276 onBlurCallback_ = nullptr; 277 } 278 } 279 SetOnBlurCallback(OnBlurFunc && onBlurCallback)280 void SetOnBlurCallback(OnBlurFunc&& onBlurCallback) 281 { 282 onBlurCallback_ = std::move(onBlurCallback); 283 } 284 GetOnBlurCallback()285 const OnBlurFunc& GetOnBlurCallback() 286 { 287 return onBlurCallback_; 288 } 289 SetOnKeyEventCallback(OnKeyCallbackFunc && onKeyEventCallback)290 void SetOnKeyEventCallback(OnKeyCallbackFunc&& onKeyEventCallback) 291 { 292 onKeyEventCallback_ = std::move(onKeyEventCallback); 293 } 294 ClearOnKeyEventCallback()295 void ClearOnKeyEventCallback() 296 { 297 if (onKeyEventCallback_) { 298 onKeyEventCallback_ = nullptr; 299 } 300 } 301 GetOnKeyEventCallback()302 const OnKeyCallbackFunc& GetOnKeyEventCallback() 303 { 304 return onKeyEventCallback_; 305 } 306 SetOnClickCallback(GestureEventFunc && onClickEventCallback)307 void SetOnClickCallback(GestureEventFunc&& onClickEventCallback) 308 { 309 onClickEventCallback_ = std::move(onClickEventCallback); 310 } 311 GetOnClickCallback()312 const GestureEventFunc& GetOnClickCallback() 313 { 314 return onClickEventCallback_; 315 } 316 GetTabIndex()317 int32_t GetTabIndex() const 318 { 319 return tabIndex_; 320 } 321 SetTabIndex(int32_t tabIndex)322 void SetTabIndex(int32_t tabIndex) 323 { 324 tabIndex_ = tabIndex; 325 } 326 IsDefaultFocus()327 bool IsDefaultFocus() const 328 { 329 return isDefaultFocus_; 330 } 331 SetIsDefaultFocus(bool isDefaultFocus)332 void SetIsDefaultFocus(bool isDefaultFocus) 333 { 334 isDefaultFocus_ = isDefaultFocus; 335 } 336 IsDefaultGroupFocus()337 bool IsDefaultGroupFocus() const 338 { 339 return isDefaultGroupFocus_; 340 } 341 SetIsDefaultGroupFocus(bool isDefaultGroupFocus)342 void SetIsDefaultGroupFocus(bool isDefaultGroupFocus) 343 { 344 isDefaultGroupFocus_ = isDefaultGroupFocus; 345 } 346 GetDefaultFocusNode()347 WeakPtr<FocusHub> GetDefaultFocusNode() const 348 { 349 return defaultFocusNode_; 350 } 351 SetDefaultFocusNode(const WeakPtr<FocusHub> & node)352 void SetDefaultFocusNode(const WeakPtr<FocusHub>& node) 353 { 354 defaultFocusNode_ = node; 355 } 356 IsFocusOnTouch()357 std::optional<bool> IsFocusOnTouch() const 358 { 359 return isFocusOnTouch_; 360 } 361 SetIsFocusOnTouch(bool isFocusOnTouch)362 void SetIsFocusOnTouch(bool isFocusOnTouch) 363 { 364 isFocusOnTouch_ = isFocusOnTouch; 365 } 366 SetIsDefaultHasFocused(bool isDefaultHasFocused)367 void SetIsDefaultHasFocused(bool isDefaultHasFocused) 368 { 369 isDefaultHasFocused_ = isDefaultHasFocused; 370 } 371 IsDefaultHasFocused()372 bool IsDefaultHasFocused() const 373 { 374 return isDefaultHasFocused_; 375 } 376 SetIsDefaultGroupHasFocused(bool isDefaultGroupHasFocused)377 void SetIsDefaultGroupHasFocused(bool isDefaultGroupHasFocused) 378 { 379 isDefaultGroupHasFocused_ = isDefaultGroupHasFocused; 380 } 381 IsDefaultGroupHasFocused()382 bool IsDefaultGroupHasFocused() const 383 { 384 return isDefaultGroupHasFocused_; 385 } 386 387 private: 388 OnFocusFunc onFocusCallback_; 389 OnBlurFunc onBlurCallback_; 390 OnKeyCallbackFunc onKeyEventCallback_; 391 GestureEventFunc onClickEventCallback_; 392 393 WeakPtr<FocusHub> defaultFocusNode_; 394 395 std::optional<bool> isFocusOnTouch_; 396 bool isDefaultFocus_ = { false }; 397 bool isDefaultHasFocused_ = { false }; 398 bool isDefaultGroupFocus_ = { false }; 399 bool isDefaultGroupHasFocused_ { false }; 400 401 int32_t tabIndex_ = 0; 402 }; 403 404 class ACE_EXPORT FocusHub : public virtual AceType { DECLARE_ACE_TYPE(FocusHub,AceType)405 DECLARE_ACE_TYPE(FocusHub, AceType) 406 public: 407 explicit FocusHub(const WeakPtr<EventHub>& eventHub, FocusType type = FocusType::DISABLE, bool focusable = false) 408 : eventHub_(eventHub), focusable_(focusable), focusType_(type) 409 { 410 MarkRootFocusNeedUpdate(); 411 } 412 ~FocusHub() override = default; 413 SetFocusStyleType(FocusStyleType type)414 void SetFocusStyleType(FocusStyleType type) 415 { 416 focusStyleType_ = type; 417 } SetFocusPaintParamsPtr(const std::unique_ptr<FocusPaintParam> & paramsPtr)418 void SetFocusPaintParamsPtr(const std::unique_ptr<FocusPaintParam>& paramsPtr) 419 { 420 CHECK_NULL_VOID(paramsPtr); 421 if (!focusPaintParamsPtr_) { 422 focusPaintParamsPtr_ = std::make_unique<FocusPaintParam>(); 423 } 424 if (paramsPtr->HasPaintRect()) { 425 focusPaintParamsPtr_->SetPaintRect(paramsPtr->GetPaintRect()); 426 } 427 if (paramsPtr->HasPaintColor()) { 428 focusPaintParamsPtr_->SetPaintColor(paramsPtr->GetPaintColor()); 429 } 430 if (paramsPtr->HasPaintWidth()) { 431 focusPaintParamsPtr_->SetPaintWidth(paramsPtr->GetPaintWidth()); 432 } 433 if (paramsPtr->HasFocusPadding()) { 434 focusPaintParamsPtr_->SetFocusPadding(paramsPtr->GetFocusPadding()); 435 } 436 } 437 HasPaintRect()438 bool HasPaintRect() const 439 { 440 return focusPaintParamsPtr_ ? focusPaintParamsPtr_->HasPaintRect() : false; 441 } GetPaintRect()442 RoundRect GetPaintRect() const 443 { 444 CHECK_NULL_RETURN(focusPaintParamsPtr_, RoundRect()); 445 return focusPaintParamsPtr_->GetPaintRect(); 446 } 447 HasPaintColor()448 bool HasPaintColor() const 449 { 450 return focusPaintParamsPtr_ ? focusPaintParamsPtr_->HasPaintColor() : false; 451 } GetPaintColor()452 const Color& GetPaintColor() const 453 { 454 CHECK_NULL_RETURN(focusPaintParamsPtr_, Color::TRANSPARENT); 455 return focusPaintParamsPtr_->GetPaintColor(); 456 } 457 HasPaintWidth()458 bool HasPaintWidth() const 459 { 460 return focusPaintParamsPtr_ ? focusPaintParamsPtr_->HasPaintWidth() : false; 461 } GetPaintWidth()462 Dimension GetPaintWidth() const 463 { 464 CHECK_NULL_RETURN(focusPaintParamsPtr_, Dimension()); 465 return focusPaintParamsPtr_->GetPaintWidth(); 466 } 467 HasFocusPadding()468 bool HasFocusPadding() const 469 { 470 return focusPaintParamsPtr_ ? focusPaintParamsPtr_->HasFocusPadding() : false; 471 } GetFocusPadding()472 Dimension GetFocusPadding() const 473 { 474 CHECK_NULL_RETURN(focusPaintParamsPtr_, Dimension()); 475 return focusPaintParamsPtr_->GetFocusPadding(); 476 } SetPaintRect(const RoundRect & rect)477 void SetPaintRect(const RoundRect& rect) 478 { 479 if (!focusPaintParamsPtr_) { 480 focusPaintParamsPtr_ = std::unique_ptr<FocusPaintParam>(); 481 } 482 focusPaintParamsPtr_->SetPaintRect(rect); 483 } SetPaintColor(const Color & color)484 void SetPaintColor(const Color& color) 485 { 486 if (!focusPaintParamsPtr_) { 487 focusPaintParamsPtr_ = std::unique_ptr<FocusPaintParam>(); 488 } 489 focusPaintParamsPtr_->SetPaintColor(color); 490 } SetPaintWidth(const Dimension & width)491 void SetPaintWidth(const Dimension& width) 492 { 493 if (!focusPaintParamsPtr_) { 494 focusPaintParamsPtr_ = std::unique_ptr<FocusPaintParam>(); 495 } 496 focusPaintParamsPtr_->SetPaintWidth(width); 497 } SetFocusPadding(const Dimension & padding)498 void SetFocusPadding(const Dimension& padding) 499 { 500 if (!focusPaintParamsPtr_) { 501 focusPaintParamsPtr_ = std::unique_ptr<FocusPaintParam>(); 502 } 503 focusPaintParamsPtr_->SetFocusPadding(padding); 504 } 505 506 RefPtr<FrameNode> GetFrameNode() const; 507 RefPtr<GeometryNode> GetGeometryNode() const; 508 RefPtr<FocusHub> GetParentFocusHub() const; 509 std::string GetFrameName() const; 510 int32_t GetFrameId() const; 511 512 bool HandleKeyEvent(const KeyEvent& keyEvent); 513 bool RequestFocusImmediately(bool isWholePathFocusable = false); 514 void RequestFocus() const; 515 void RequestFocusWithDefaultFocusFirstly() const; 516 void UpdateAccessibilityFocusInfo(); 517 void SwitchFocus(const RefPtr<FocusHub>& focusNode); 518 519 void LostFocus(BlurReason reason = BlurReason::FOCUS_SWITCH); 520 void LostSelfFocus(); 521 void RemoveSelf(); 522 void RemoveChild(const RefPtr<FocusHub>& focusNode); 523 bool GoToNextFocusLinear(FocusStep step, const RectF& rect = RectF()); 524 bool TryRequestFocus(const RefPtr<FocusHub>& focusNode, const RectF& rect, FocusStep step = FocusStep::NONE); 525 526 void CollectTabIndexNodes(TabIndexNodeList& tabIndexNodes); 527 bool GoToFocusByTabNodeIdx(TabIndexNodeList& tabIndexNodes, int32_t tabNodeIdx); 528 bool HandleFocusByTabIndex(const KeyEvent& event, const RefPtr<FocusHub>& mainFocusHub); 529 RefPtr<FocusHub> GetChildFocusNodeByType(FocusNodeType nodeType = FocusNodeType::DEFAULT); 530 RefPtr<FocusHub> GetChildFocusNodeById(const std::string& id); 531 void HandleParentScroll() const; 532 int32_t GetFocusingTabNodeIdx(TabIndexNodeList& tabIndexNodes); 533 bool RequestFocusImmediatelyById(const std::string& id); 534 535 bool IsFocusableByTab(); 536 bool IsFocusableNodeByTab(); 537 bool IsFocusableScopeByTab(); 538 539 bool IsFocusableWholePath(); 540 541 bool IsFocusable(); 542 bool IsFocusableNode(); 543 bool IsFocusableScope(); 544 IsParentFocusable()545 bool IsParentFocusable() const 546 { 547 return parentFocusable_; 548 } SetParentFocusable(bool parentFocusable)549 void SetParentFocusable(bool parentFocusable) 550 { 551 LOGD("Set node: %{public}s/%{public}d parentFocusable from %{public}d to %{public}d", GetFrameName().c_str(), 552 GetFrameId(), parentFocusable_, parentFocusable); 553 parentFocusable_ = parentFocusable; 554 } 555 556 void RefreshParentFocusable(bool focusable); 557 558 void RefreshFocus(); 559 560 void SetFocusable(bool focusable); 561 void SetShow(bool show); 562 void SetShowNode(bool show); 563 void SetShowScope(bool show); 564 void SetEnabled(bool enabled); 565 void SetEnabledNode(bool enabled); 566 void SetEnabledScope(bool enabled); 567 568 bool IsShow() const; 569 570 bool IsEnabled() const; 571 IsCurrentFocus()572 bool IsCurrentFocus() const 573 { 574 return currentFocus_; 575 } 576 bool IsCurrentFocusWholePath(); 577 578 void MarkRootFocusNeedUpdate(); 579 ClearUserOnFocus()580 void ClearUserOnFocus() 581 { 582 if (focusCallbackEvents_) { 583 focusCallbackEvents_->ClearOnFocusCallback(); 584 } 585 } 586 SetOnFocusCallback(OnFocusFunc && onFocusCallback)587 void SetOnFocusCallback(OnFocusFunc&& onFocusCallback) 588 { 589 if (!focusCallbackEvents_) { 590 focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>(); 591 } 592 focusCallbackEvents_->SetOnFocusCallback(std::move(onFocusCallback)); 593 } GetOnFocusCallback()594 OnFocusFunc GetOnFocusCallback() 595 { 596 return focusCallbackEvents_ ? focusCallbackEvents_->GetOnFocusCallback() : nullptr; 597 } 598 ClearUserOnBlur()599 void ClearUserOnBlur() 600 { 601 if (focusCallbackEvents_) { 602 focusCallbackEvents_->ClearOnBlurCallback(); 603 } 604 } 605 SetOnBlurCallback(OnBlurFunc && onBlurCallback)606 void SetOnBlurCallback(OnBlurFunc&& onBlurCallback) 607 { 608 if (!focusCallbackEvents_) { 609 focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>(); 610 } 611 focusCallbackEvents_->SetOnBlurCallback(std::move(onBlurCallback)); 612 } 613 GetOnBlurCallback()614 OnBlurFunc GetOnBlurCallback() 615 { 616 return focusCallbackEvents_ ? focusCallbackEvents_->GetOnBlurCallback() : nullptr; 617 } 618 SetOnKeyCallback(OnKeyCallbackFunc && onKeyCallback)619 void SetOnKeyCallback(OnKeyCallbackFunc&& onKeyCallback) 620 { 621 if (!focusCallbackEvents_) { 622 focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>(); 623 } 624 focusCallbackEvents_->SetOnKeyEventCallback(std::move(onKeyCallback)); 625 } 626 ClearUserOnKey()627 void ClearUserOnKey() 628 { 629 if (focusCallbackEvents_) { 630 focusCallbackEvents_->ClearOnKeyEventCallback(); 631 } 632 } 633 GetOnKeyCallback()634 OnKeyCallbackFunc GetOnKeyCallback() 635 { 636 return focusCallbackEvents_ ? focusCallbackEvents_->GetOnKeyEventCallback() : nullptr; 637 } 638 SetOnClickCallback(GestureEventFunc && onClickCallback)639 void SetOnClickCallback(GestureEventFunc&& onClickCallback) 640 { 641 if (!focusCallbackEvents_) { 642 focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>(); 643 } 644 focusCallbackEvents_->SetOnClickCallback(std::move(onClickCallback)); 645 } GetOnClickCallback()646 GestureEventFunc GetOnClickCallback() 647 { 648 return focusCallbackEvents_ ? focusCallbackEvents_->GetOnClickCallback() : nullptr; 649 } 650 SetOnFocusInternal(OnFocusFunc && onFocusInternal)651 void SetOnFocusInternal(OnFocusFunc&& onFocusInternal) 652 { 653 onFocusInternal_ = std::move(onFocusInternal); 654 } SetOnBlurInternal(OnBlurFunc && onBlurInternal)655 void SetOnBlurInternal(OnBlurFunc&& onBlurInternal) 656 { 657 onBlurInternal_ = std::move(onBlurInternal); 658 } SetOnBlurReasonInternal(OnBlurReasonFunc && onBlurReasonInternal)659 void SetOnBlurReasonInternal(OnBlurReasonFunc&& onBlurReasonInternal) 660 { 661 onBlurReasonInternal_ = std::move(onBlurReasonInternal); 662 } SetOnPreFocusCallback(OnPreFocusFunc && onPreFocusCallback)663 void SetOnPreFocusCallback(OnPreFocusFunc&& onPreFocusCallback) 664 { 665 onPreFocusCallback_ = std::move(onPreFocusCallback); 666 } 667 SetOnClearFocusStateInternal(OnClearFocusStateFunc && onClearFocusCallback)668 void SetOnClearFocusStateInternal(OnClearFocusStateFunc&& onClearFocusCallback) 669 { 670 onClearFocusStateCallback_ = std::move(onClearFocusCallback); 671 } 672 SetOnPaintFocusStateInternal(OnPaintFocusStateFunc && onPaintFocusCallback)673 void SetOnPaintFocusStateInternal(OnPaintFocusStateFunc&& onPaintFocusCallback) 674 { 675 onPaintFocusStateCallback_ = std::move(onPaintFocusCallback); 676 } 677 678 void SetOnKeyEventInternal(OnKeyEventFunc&& onKeyEvent, OnKeyEventType type = OnKeyEventType::DEFAULT) 679 { 680 onKeyEventsInternal_[type] = std::move(onKeyEvent); 681 } ProcessOnKeyEventInternal(const KeyEvent & event)682 bool ProcessOnKeyEventInternal(const KeyEvent& event) 683 { 684 bool result = false; 685 for (const auto& onKeyEvent : onKeyEventsInternal_) { 686 auto callback = onKeyEvent.second; 687 if (callback && callback(event)) { 688 result = true; 689 } 690 } 691 return result; 692 } 693 694 std::list<RefPtr<FocusHub>>::iterator FlushChildrenFocusHub(std::list<RefPtr<FocusHub>>& focusNodes); 695 GetChildren()696 std::list<RefPtr<FocusHub>> GetChildren() 697 { 698 std::list<RefPtr<FocusHub>> focusNodes; 699 FlushChildrenFocusHub(focusNodes); 700 return focusNodes; 701 } 702 IsChild()703 bool IsChild() const 704 { 705 return focusType_ == FocusType::NODE; 706 } 707 SetRect(const RectF & rect)708 void SetRect(const RectF& rect) 709 { 710 rectFromOrigin_ = rect; 711 } GetRect()712 const RectF& GetRect() const 713 { 714 return rectFromOrigin_; 715 } 716 717 void DumpFocusTree(int32_t depth); 718 void DumpFocusNodeTree(int32_t depth); 719 void DumpFocusScopeTree(int32_t depth); 720 721 bool OnClick(const KeyEvent& event); 722 SetFocusType(FocusType type)723 void SetFocusType(FocusType type) 724 { 725 focusType_ = type; 726 } GetFocusType()727 FocusType GetFocusType() const 728 { 729 return focusType_; 730 } 731 GetTabIndex()732 int32_t GetTabIndex() const 733 { 734 return focusCallbackEvents_ ? focusCallbackEvents_->GetTabIndex() : 0; 735 } SetTabIndex(int32_t tabIndex)736 void SetTabIndex(int32_t tabIndex) 737 { 738 if (!focusCallbackEvents_) { 739 focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>(); 740 } 741 focusCallbackEvents_->SetTabIndex(tabIndex); 742 } 743 IsDefaultFocus()744 bool IsDefaultFocus() const 745 { 746 return focusCallbackEvents_ ? focusCallbackEvents_->IsDefaultFocus() : false; 747 } 748 void SetIsDefaultFocus(bool isDefaultFocus); 749 IsDefaultGroupFocus()750 bool IsDefaultGroupFocus() const 751 { 752 return focusCallbackEvents_ ? focusCallbackEvents_->IsDefaultGroupFocus() : false; 753 } 754 void SetIsDefaultGroupFocus(bool isDefaultGroupFocus); 755 GetDefaultFocusNode()756 WeakPtr<FocusHub> GetDefaultFocusNode() const 757 { 758 return focusCallbackEvents_ ? focusCallbackEvents_->GetDefaultFocusNode() : nullptr; 759 } SetDefaultFocusNode(const WeakPtr<FocusHub> & node)760 void SetDefaultFocusNode(const WeakPtr<FocusHub>& node) 761 { 762 if (!focusCallbackEvents_) { 763 focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>(); 764 } 765 focusCallbackEvents_->SetDefaultFocusNode(node); 766 } 767 IsFocusOnTouch()768 std::optional<bool> IsFocusOnTouch() const 769 { 770 return focusCallbackEvents_ ? focusCallbackEvents_->IsFocusOnTouch() : std::nullopt; 771 } 772 void SetIsFocusOnTouch(bool isFocusOnTouch); 773 SetIsDefaultHasFocused(bool isDefaultHasFocused)774 void SetIsDefaultHasFocused(bool isDefaultHasFocused) 775 { 776 if (!focusCallbackEvents_) { 777 focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>(); 778 } 779 focusCallbackEvents_->SetIsDefaultHasFocused(isDefaultHasFocused); 780 } IsDefaultHasFocused()781 bool IsDefaultHasFocused() const 782 { 783 return focusCallbackEvents_ ? focusCallbackEvents_->IsDefaultHasFocused() : false; 784 } 785 SetIsDefaultGroupHasFocused(bool isDefaultGroupHasFocused)786 void SetIsDefaultGroupHasFocused(bool isDefaultGroupHasFocused) 787 { 788 if (!focusCallbackEvents_) { 789 focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>(); 790 } 791 focusCallbackEvents_->SetIsDefaultGroupHasFocused(isDefaultGroupHasFocused); 792 } IsDefaultGroupHasFocused()793 bool IsDefaultGroupHasFocused() const 794 { 795 return focusCallbackEvents_ ? focusCallbackEvents_->IsDefaultGroupHasFocused() : false; 796 } 797 798 std::optional<std::string> GetInspectorKey() const; 799 800 bool PaintFocusState(bool isNeedStateStyles = true); 801 bool PaintAllFocusState(); 802 bool PaintInnerFocusState(const RoundRect& paintRect); 803 void ClearFocusState(bool isNeedStateStyles = true); 804 void ClearAllFocusState(); 805 SetInnerFocusPaintRectCallback(const std::function<void (RoundRect &)> & callback)806 void SetInnerFocusPaintRectCallback(const std::function<void(RoundRect&)>& callback) 807 { 808 getInnerFocusRectFunc_ = callback; 809 } 810 SetLastWeakFocusNode(const WeakPtr<FocusHub> & focusHub)811 void SetLastWeakFocusNode(const WeakPtr<FocusHub>& focusHub) 812 { 813 lastWeakFocusNode_ = focusHub; 814 } GetLastWeakFocusNode()815 WeakPtr<FocusHub> GetLastWeakFocusNode() const 816 { 817 return lastWeakFocusNode_; 818 } 819 SetIsFocusUnit(bool isFocusUnit)820 void SetIsFocusUnit(bool isFocusUnit) 821 { 822 isFocusUnit_ = isFocusUnit; 823 } 824 IsFocusStepVertical(FocusStep step)825 static inline bool IsFocusStepVertical(FocusStep step) 826 { 827 return (static_cast<uint32_t>(step) & 0x1) == 0; 828 } 829 IsFocusStepForward(FocusStep step)830 static inline bool IsFocusStepForward(FocusStep step) 831 { 832 return (static_cast<uint32_t>(step) & MASK_FOCUS_STEP_FORWARD) != 0; 833 } 834 IsFocusStepTab(FocusStep step)835 static inline bool IsFocusStepTab(FocusStep step) 836 { 837 return (static_cast<uint32_t>(step) & MASK_FOCUS_STEP_TAB) == MASK_FOCUS_STEP_TAB; 838 } 839 840 static double GetProjectAreaOnRect(const RectF& rect, const RectF& projectRect, FocusStep step); 841 842 protected: 843 bool OnKeyEvent(const KeyEvent& keyEvent); 844 bool OnKeyEventNode(const KeyEvent& keyEvent); 845 bool OnKeyEventScope(const KeyEvent& keyEvent); 846 847 bool AcceptFocusOfSpecifyChild(FocusStep step); 848 bool AcceptFocusOfLastFocus(); 849 bool AcceptFocusByRectOfLastFocus(const RectF& rect); 850 bool AcceptFocusByRectOfLastFocusNode(const RectF& rect); 851 bool AcceptFocusByRectOfLastFocusScope(const RectF& rect); 852 bool AcceptFocusByRectOfLastFocusFlex(const RectF& rect); 853 854 bool CalculateRect(const RefPtr<FocusHub>& childNode, RectF& rect) const; 855 bool RequestNextFocus(FocusStep moveStep, const RectF& rect); 856 bool FocusToHeadOrTailChild(bool isHead); 857 858 void OnFocus(); 859 void OnFocusNode(); 860 void OnFocusScope(); 861 void OnBlur(); 862 void OnBlurNode(); 863 void OnBlurScope(); 864 HandleFocus()865 void HandleFocus() 866 { 867 // Need update: void RenderNode::MoveWhenOutOfViewPort(bool hasEffect) 868 OnFocus(); 869 } 870 871 private: 872 bool CalculatePosition(); 873 874 void SetScopeFocusAlgorithm(); 875 876 void SetLastFocusNodeIndex(const RefPtr<FocusHub>& focusNode); 877 878 void ScrollToLastFocusIndex() const; 879 880 void CheckFocusStateStyle(bool onFocus); 881 bool HasFocusStateStyle(); 882 883 bool IsNeedPaintFocusState(); 884 885 RefPtr<FocusHub> GetNearestNodeByProjectArea(const std::list<RefPtr<FocusHub>>& allNodes, FocusStep step); 886 887 OnFocusFunc onFocusInternal_; 888 OnBlurFunc onBlurInternal_; 889 OnBlurReasonFunc onBlurReasonInternal_; 890 std::unordered_map<OnKeyEventType, OnKeyEventFunc> onKeyEventsInternal_; 891 OnPreFocusFunc onPreFocusCallback_; 892 OnClearFocusStateFunc onClearFocusStateCallback_; 893 OnPaintFocusStateFunc onPaintFocusStateCallback_; 894 895 RefPtr<FocusCallbackEvents> focusCallbackEvents_; 896 897 RefPtr<TouchEventImpl> focusOnTouchListener_; 898 899 WeakPtr<EventHub> eventHub_; 900 901 WeakPtr<FocusHub> lastWeakFocusNode_ { nullptr }; 902 int32_t lastFocusNodeIndex_ { -1 }; 903 904 bool focusable_ { true }; 905 bool parentFocusable_ { true }; 906 bool currentFocus_ { false }; 907 bool isFirstFocusInPage_ { true }; 908 bool isFocusUnit_ { false }; 909 910 FocusType focusType_ = FocusType::DISABLE; 911 FocusStyleType focusStyleType_ = FocusStyleType::NONE; 912 std::unique_ptr<FocusPaintParam> focusPaintParamsPtr_; 913 std::function<void(RoundRect&)> getInnerFocusRectFunc_; 914 915 RectF rectFromOrigin_; 916 ScopeFocusAlgorithm focusAlgorithm_; 917 BlurReason blurReason_ = BlurReason::FOCUS_SWITCH; 918 }; 919 } // namespace OHOS::Ace::NG 920 921 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_EVENT_FOCUS_HUB_H 922