1 /* 2 * Copyright (c) 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_INPUT_EVENT_HUB_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_EVENT_INPUT_EVENT_HUB_H 18 19 #include <list> 20 21 #include "base/memory/ace_type.h" 22 #include "core/components/common/layout/constants.h" 23 #include "core/components_ng/event/input_event.h" 24 #include "core/pipeline_ng/ui_task_scheduler.h" 25 26 namespace OHOS::Ace::NG { 27 28 class EventHub; 29 30 // The gesture event hub is mainly used to handle common gesture events. 31 class ACE_EXPORT InputEventHub : public virtual AceType { 32 DECLARE_ACE_TYPE(InputEventHub, AceType) 33 public: 34 explicit InputEventHub(const WeakPtr<EventHub>& eventHub); 35 ~InputEventHub() override = default; 36 37 // Set by user define, which will replace old one. SetMouseEvent(OnMouseEventFunc && onMouseEventFunc)38 void SetMouseEvent(OnMouseEventFunc&& onMouseEventFunc) 39 { 40 if (!mouseEventActuator_) { 41 mouseEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 42 } 43 mouseEventActuator_->ReplaceInputEvent(std::move(onMouseEventFunc)); 44 } 45 AddOnMouseEvent(const RefPtr<InputEvent> & onMouseEvent)46 void AddOnMouseEvent(const RefPtr<InputEvent>& onMouseEvent) 47 { 48 if (!mouseEventActuator_) { 49 mouseEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 50 } 51 mouseEventActuator_->AddInputEvent(onMouseEvent); 52 } 53 RemoveOnMouseEvent(const RefPtr<InputEvent> & onMouseEvent)54 void RemoveOnMouseEvent(const RefPtr<InputEvent>& onMouseEvent) 55 { 56 if (!mouseEventActuator_) { 57 return; 58 } 59 mouseEventActuator_->RemoveInputEvent(onMouseEvent); 60 } 61 62 void SetHoverEffect(HoverEffectType type); 63 GetHoverEffect()64 HoverEffectType GetHoverEffect() 65 { 66 return hoverEffectType_; 67 } 68 std::string GetHoverEffectStr() const; 69 SetHoverEffectAuto(HoverEffectType type)70 void SetHoverEffectAuto(HoverEffectType type) 71 { 72 if (!hoverEffectActuator_) { 73 hoverEffectActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 74 } 75 hoverEffectAuto_ = type; 76 } 77 GetHoverEffectAuto()78 HoverEffectType GetHoverEffectAuto() 79 { 80 return hoverEffectAuto_; 81 } 82 83 // Set by user define, which will replace old one. SetHoverEvent(OnHoverFunc && onHoverEventFunc)84 void SetHoverEvent(OnHoverFunc&& onHoverEventFunc) 85 { 86 if (!hoverEventActuator_) { 87 hoverEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 88 } 89 hoverEventActuator_->ReplaceInputEvent(std::move(onHoverEventFunc)); 90 } 91 AddOnHoverEvent(const RefPtr<InputEvent> & onHoverEvent)92 void AddOnHoverEvent(const RefPtr<InputEvent>& onHoverEvent) 93 { 94 if (!hoverEventActuator_) { 95 hoverEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 96 } 97 hoverEventActuator_->AddInputEvent(onHoverEvent); 98 } 99 RemoveOnHoverEvent(const RefPtr<InputEvent> & onHoverEvent)100 void RemoveOnHoverEvent(const RefPtr<InputEvent>& onHoverEvent) 101 { 102 if (!hoverEventActuator_) { 103 return; 104 } 105 hoverEventActuator_->RemoveInputEvent(onHoverEvent); 106 } 107 AddOnAxisEvent(const RefPtr<InputEvent> & onAxisEvent)108 void AddOnAxisEvent(const RefPtr<InputEvent>& onAxisEvent) 109 { 110 if (!axisEventActuator_) { 111 axisEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 112 } 113 axisEventActuator_->AddInputEvent(onAxisEvent); 114 } 115 RemoveOnAxisEvent(const RefPtr<InputEvent> & onAxisEvent)116 void RemoveOnAxisEvent(const RefPtr<InputEvent>& onAxisEvent) 117 { 118 if (!axisEventActuator_) { 119 return; 120 } 121 axisEventActuator_->RemoveInputEvent(onAxisEvent); 122 } 123 124 // the return value means prevents event bubbling. 125 bool ProcessMouseTestHit(const OffsetF& coordinateOffset, TouchTestResult& result); 126 127 bool ProcessAxisTestHit(const OffsetF& coordinateOffset, AxisTestResult& onAxisResult); 128 129 RefPtr<FrameNode> GetFrameNode() const; 130 OnContextAttached()131 void OnContextAttached() {} 132 133 // register showMenu callback (always replace) 134 void BindContextMenu(OnMouseEventFunc&& showMenu); 135 ClearUserOnHover()136 void ClearUserOnHover() 137 { 138 if (hoverEventActuator_) { 139 hoverEventActuator_->ClearUserCallback(); 140 } 141 } 142 ClearUserOnMouse()143 void ClearUserOnMouse() 144 { 145 if (mouseEventActuator_) { 146 mouseEventActuator_->ClearUserCallback(); 147 } 148 } 149 150 private: 151 WeakPtr<EventHub> eventHub_; 152 RefPtr<InputEventActuator> mouseEventActuator_; 153 RefPtr<InputEventActuator> hoverEventActuator_; 154 RefPtr<InputEventActuator> hoverEffectActuator_; 155 RefPtr<InputEventActuator> axisEventActuator_; 156 157 RefPtr<InputEvent> showMenu_; 158 159 HoverEffectType hoverEffectType_ = HoverEffectType::UNKNOWN; 160 HoverEffectType hoverEffectAuto_ = HoverEffectType::UNKNOWN; 161 }; 162 163 } // namespace OHOS::Ace::NG 164 165 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_EVENT_INPUT_EVENT_HUB_H 166