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 } SetJSFrameNodeOnMouseEvent(OnMouseEventFunc && onMouseEventFunc)45 void SetJSFrameNodeOnMouseEvent(OnMouseEventFunc&& onMouseEventFunc) 46 { 47 if (!mouseEventActuator_) { 48 mouseEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 49 } 50 mouseEventActuator_->ReplaceJSFrameNodeInputEvent(std::move(onMouseEventFunc)); 51 } 52 AddOnMouseEvent(const RefPtr<InputEvent> & onMouseEvent)53 void AddOnMouseEvent(const RefPtr<InputEvent>& onMouseEvent) 54 { 55 if (!mouseEventActuator_) { 56 mouseEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 57 } 58 mouseEventActuator_->AddInputEvent(onMouseEvent); 59 } 60 RemoveOnMouseEvent(const RefPtr<InputEvent> & onMouseEvent)61 void RemoveOnMouseEvent(const RefPtr<InputEvent>& onMouseEvent) 62 { 63 if (!mouseEventActuator_) { 64 return; 65 } 66 mouseEventActuator_->RemoveInputEvent(onMouseEvent); 67 } 68 69 void SetHoverEffect(HoverEffectType type); 70 GetHoverEffect()71 HoverEffectType GetHoverEffect() 72 { 73 return hoverEffectType_; 74 } 75 std::string GetHoverEffectStr() const; 76 SetHoverEffectAuto(HoverEffectType type)77 void SetHoverEffectAuto(HoverEffectType type) 78 { 79 if (!hoverEffectActuator_) { 80 hoverEffectActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 81 } 82 hoverEffectAuto_ = type; 83 } 84 GetHoverEffectAuto()85 HoverEffectType GetHoverEffectAuto() 86 { 87 return hoverEffectAuto_; 88 } 89 90 // Set by user define, which will replace old one. SetHoverEvent(OnHoverFunc && onHoverEventFunc)91 void SetHoverEvent(OnHoverFunc&& onHoverEventFunc) 92 { 93 if (!hoverEventActuator_) { 94 hoverEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 95 } 96 hoverEventActuator_->ReplaceInputEvent(std::move(onHoverEventFunc)); 97 } 98 SetHoverMoveEvent(OnHoverMoveFunc && onHoverMoveEventFunc)99 void SetHoverMoveEvent(OnHoverMoveFunc&& onHoverMoveEventFunc) 100 { 101 if (!hoverMoveEventActuator_) { 102 hoverMoveEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 103 } 104 hoverMoveEventActuator_->ReplaceInputEvent(std::move(onHoverMoveEventFunc)); 105 } 106 SetAccessibilityHoverEvent(OnAccessibilityHoverFunc && onAccessibilityHoverEventFunc)107 void SetAccessibilityHoverEvent(OnAccessibilityHoverFunc&& onAccessibilityHoverEventFunc) 108 { 109 if (!accessibilityHoverEventActuator_) { 110 accessibilityHoverEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 111 } 112 accessibilityHoverEventActuator_->ReplaceInputEvent(std::move(onAccessibilityHoverEventFunc)); 113 } 114 SetJSFrameNodeOnHoverEvent(OnHoverFunc && onHoverEventFunc)115 void SetJSFrameNodeOnHoverEvent(OnHoverFunc&& onHoverEventFunc) 116 { 117 if (!hoverEventActuator_) { 118 hoverEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 119 } 120 hoverEventActuator_->ReplaceJSFrameNodeInputEvent(std::move(onHoverEventFunc)); 121 } 122 SetJSFrameNodeOnHoverMoveEvent(OnHoverMoveFunc && onHoverMoveEventFunc)123 void SetJSFrameNodeOnHoverMoveEvent(OnHoverMoveFunc&& onHoverMoveEventFunc) 124 { 125 if (!hoverMoveEventActuator_) { 126 hoverMoveEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 127 } 128 hoverMoveEventActuator_->ReplaceJSFrameNodeInputEvent(std::move(onHoverMoveEventFunc)); 129 } 130 AddOnHoverEvent(const RefPtr<InputEvent> & onHoverEvent)131 void AddOnHoverEvent(const RefPtr<InputEvent>& onHoverEvent) 132 { 133 if (!hoverEventActuator_) { 134 hoverEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 135 } 136 hoverEventActuator_->AddInputEvent(onHoverEvent); 137 } 138 RemoveOnHoverEvent(const RefPtr<InputEvent> & onHoverEvent)139 void RemoveOnHoverEvent(const RefPtr<InputEvent>& onHoverEvent) 140 { 141 if (!hoverEventActuator_) { 142 return; 143 } 144 hoverEventActuator_->RemoveInputEvent(onHoverEvent); 145 } 146 AddOnHoverMoveEvent(const RefPtr<InputEvent> & onHoverMoveEvent)147 void AddOnHoverMoveEvent(const RefPtr<InputEvent>& onHoverMoveEvent) 148 { 149 if (!hoverMoveEventActuator_) { 150 hoverMoveEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 151 } 152 hoverMoveEventActuator_->AddInputEvent(onHoverMoveEvent); 153 } 154 RemoveOnHoverMoveEvent(const RefPtr<InputEvent> & onHoverMoveEvent)155 void RemoveOnHoverMoveEvent(const RefPtr<InputEvent>& onHoverMoveEvent) 156 { 157 if (!hoverMoveEventActuator_) { 158 return; 159 } 160 hoverMoveEventActuator_->RemoveInputEvent(onHoverMoveEvent); 161 } 162 AddOnAxisEvent(const RefPtr<InputEvent> & onAxisEvent)163 void AddOnAxisEvent(const RefPtr<InputEvent>& onAxisEvent) 164 { 165 if (!axisEventActuator_) { 166 axisEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 167 } 168 axisEventActuator_->AddInputEvent(onAxisEvent); 169 } 170 RemoveOnAxisEvent(const RefPtr<InputEvent> & onAxisEvent)171 void RemoveOnAxisEvent(const RefPtr<InputEvent>& onAxisEvent) 172 { 173 if (!axisEventActuator_) { 174 return; 175 } 176 axisEventActuator_->RemoveInputEvent(onAxisEvent); 177 } 178 179 // the return value means prevents event bubbling. 180 bool ProcessMouseTestHit(const OffsetF& coordinateOffset, TouchTestResult& result); 181 182 bool ProcessPenHoverTestHit(const OffsetF& coordinateOffset, TouchTestResult& result); 183 184 bool ProcessAxisTestHit(const OffsetF& coordinateOffset, AxisTestResult& onAxisResult); 185 186 RefPtr<FrameNode> GetFrameNode() const; 187 OnContextAttached()188 void OnContextAttached() {} 189 190 // register showMenu callback (always replace) 191 void BindContextMenu(OnMouseEventFunc&& showMenu); 192 ClearUserOnHover()193 void ClearUserOnHover() 194 { 195 if (hoverEventActuator_) { 196 hoverEventActuator_->ClearUserCallback(); 197 } 198 } 199 ClearUserOnHoverMove()200 void ClearUserOnHoverMove() 201 { 202 if (hoverMoveEventActuator_) { 203 hoverMoveEventActuator_->ClearUserCallback(); 204 } 205 } 206 ClearUserOnAccessibilityHover()207 void ClearUserOnAccessibilityHover() 208 { 209 if (accessibilityHoverEventActuator_) { 210 accessibilityHoverEventActuator_->ClearUserCallback(); 211 } 212 } 213 ClearJSFrameNodeOnHover()214 void ClearJSFrameNodeOnHover() 215 { 216 if (hoverEventActuator_) { 217 hoverEventActuator_->ClearJSFrameNodeCallback(); 218 } 219 } 220 ClearJSFrameNodeOnHoverMove()221 void ClearJSFrameNodeOnHoverMove() 222 { 223 if (hoverMoveEventActuator_) { 224 hoverMoveEventActuator_->ClearJSFrameNodeCallback(); 225 } 226 } 227 ClearUserOnMouse()228 void ClearUserOnMouse() 229 { 230 if (mouseEventActuator_) { 231 mouseEventActuator_->ClearUserCallback(); 232 } 233 } 234 ClearJSFrameNodeOnMouse()235 void ClearJSFrameNodeOnMouse() 236 { 237 if (mouseEventActuator_) { 238 mouseEventActuator_->ClearJSFrameNodeCallback(); 239 } 240 } 241 242 private: 243 WeakPtr<EventHub> eventHub_; 244 RefPtr<InputEventActuator> mouseEventActuator_; 245 RefPtr<InputEventActuator> hoverEventActuator_; 246 RefPtr<InputEventActuator> hoverMoveEventActuator_; 247 RefPtr<InputEventActuator> hoverEffectActuator_; 248 RefPtr<InputEventActuator> axisEventActuator_; 249 RefPtr<InputEventActuator> accessibilityHoverEventActuator_; 250 251 RefPtr<InputEvent> showMenu_; 252 253 HoverEffectType hoverEffectType_ = HoverEffectType::UNKNOWN; 254 HoverEffectType hoverEffectAuto_ = HoverEffectType::UNKNOWN; 255 }; 256 257 } // namespace OHOS::Ace::NG 258 259 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_EVENT_INPUT_EVENT_HUB_H 260