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 HasAccessibilityHoverEvent()115 bool HasAccessibilityHoverEvent() 116 { 117 if (accessibilityHoverEventActuator_) { 118 return accessibilityHoverEventActuator_->HasUserCallback(); 119 } 120 return false; 121 } 122 SetJSFrameNodeOnHoverEvent(OnHoverFunc && onHoverEventFunc)123 void SetJSFrameNodeOnHoverEvent(OnHoverFunc&& onHoverEventFunc) 124 { 125 if (!hoverEventActuator_) { 126 hoverEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 127 } 128 hoverEventActuator_->ReplaceJSFrameNodeInputEvent(std::move(onHoverEventFunc)); 129 } 130 SetJSFrameNodeOnHoverMoveEvent(OnHoverMoveFunc && onHoverMoveEventFunc)131 void SetJSFrameNodeOnHoverMoveEvent(OnHoverMoveFunc&& onHoverMoveEventFunc) 132 { 133 if (!hoverMoveEventActuator_) { 134 hoverMoveEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 135 } 136 hoverMoveEventActuator_->ReplaceJSFrameNodeInputEvent(std::move(onHoverMoveEventFunc)); 137 } 138 AddOnHoverEvent(const RefPtr<InputEvent> & onHoverEvent)139 void AddOnHoverEvent(const RefPtr<InputEvent>& onHoverEvent) 140 { 141 if (!hoverEventActuator_) { 142 hoverEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 143 } 144 hoverEventActuator_->AddInputEvent(onHoverEvent); 145 } 146 RemoveOnHoverEvent(const RefPtr<InputEvent> & onHoverEvent)147 void RemoveOnHoverEvent(const RefPtr<InputEvent>& onHoverEvent) 148 { 149 if (!hoverEventActuator_) { 150 return; 151 } 152 hoverEventActuator_->RemoveInputEvent(onHoverEvent); 153 } 154 AddOnHoverMoveEvent(const RefPtr<InputEvent> & onHoverMoveEvent)155 void AddOnHoverMoveEvent(const RefPtr<InputEvent>& onHoverMoveEvent) 156 { 157 if (!hoverMoveEventActuator_) { 158 hoverMoveEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 159 } 160 hoverMoveEventActuator_->AddInputEvent(onHoverMoveEvent); 161 } 162 RemoveOnHoverMoveEvent(const RefPtr<InputEvent> & onHoverMoveEvent)163 void RemoveOnHoverMoveEvent(const RefPtr<InputEvent>& onHoverMoveEvent) 164 { 165 if (!hoverMoveEventActuator_) { 166 return; 167 } 168 hoverMoveEventActuator_->RemoveInputEvent(onHoverMoveEvent); 169 } 170 SetAxisEvent(OnAxisEventFunc && onAxisEventFunc)171 void SetAxisEvent(OnAxisEventFunc&& onAxisEventFunc) 172 { 173 if (!axisEventActuator_) { 174 axisEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 175 } 176 axisEventActuator_->ReplaceInputEvent(std::move(onAxisEventFunc)); 177 } 178 AddOnAxisEvent(const RefPtr<InputEvent> & onAxisEvent)179 void AddOnAxisEvent(const RefPtr<InputEvent>& onAxisEvent) 180 { 181 if (!axisEventActuator_) { 182 axisEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 183 } 184 axisEventActuator_->AddInputEvent(onAxisEvent); 185 } 186 RemoveOnAxisEvent(const RefPtr<InputEvent> & onAxisEvent)187 void RemoveOnAxisEvent(const RefPtr<InputEvent>& onAxisEvent) 188 { 189 if (!axisEventActuator_) { 190 return; 191 } 192 axisEventActuator_->RemoveInputEvent(onAxisEvent); 193 } 194 195 // the return value means prevents event bubbling. 196 bool ProcessMouseTestHit(const OffsetF& coordinateOffset, TouchTestResult& result); 197 198 bool ProcessPenHoverTestHit(const OffsetF& coordinateOffset, TouchTestResult& result); 199 200 bool ProcessAxisTestHit(const OffsetF& coordinateOffset, AxisTestResult& onAxisResult); 201 202 RefPtr<FrameNode> GetFrameNode() const; 203 OnContextAttached()204 void OnContextAttached() {} 205 206 // register showMenu callback (always replace) 207 void BindContextMenu(OnMouseEventFunc&& showMenu); 208 ClearUserOnHover()209 void ClearUserOnHover() 210 { 211 if (hoverEventActuator_) { 212 hoverEventActuator_->ClearUserCallback(); 213 } 214 } 215 ClearUserOnHoverMove()216 void ClearUserOnHoverMove() 217 { 218 if (hoverMoveEventActuator_) { 219 hoverMoveEventActuator_->ClearUserCallback(); 220 } 221 } 222 ClearUserOnAccessibilityHover()223 void ClearUserOnAccessibilityHover() 224 { 225 if (accessibilityHoverEventActuator_) { 226 accessibilityHoverEventActuator_->ClearUserCallback(); 227 } 228 } 229 ClearJSFrameNodeOnHover()230 void ClearJSFrameNodeOnHover() 231 { 232 if (hoverEventActuator_) { 233 hoverEventActuator_->ClearJSFrameNodeCallback(); 234 } 235 } 236 ClearJSFrameNodeOnHoverMove()237 void ClearJSFrameNodeOnHoverMove() 238 { 239 if (hoverMoveEventActuator_) { 240 hoverMoveEventActuator_->ClearJSFrameNodeCallback(); 241 } 242 } 243 ClearUserOnMouse()244 void ClearUserOnMouse() 245 { 246 if (mouseEventActuator_) { 247 mouseEventActuator_->ClearUserCallback(); 248 } 249 } 250 ClearJSFrameNodeOnMouse()251 void ClearJSFrameNodeOnMouse() 252 { 253 if (mouseEventActuator_) { 254 mouseEventActuator_->ClearJSFrameNodeCallback(); 255 } 256 } 257 ClearUserOnAxisEvent()258 void ClearUserOnAxisEvent() 259 { 260 if (axisEventActuator_) { 261 axisEventActuator_->ClearUserCallback(); 262 } 263 } 264 265 private: 266 WeakPtr<EventHub> eventHub_; 267 RefPtr<InputEventActuator> mouseEventActuator_; 268 RefPtr<InputEventActuator> hoverEventActuator_; 269 RefPtr<InputEventActuator> hoverMoveEventActuator_; 270 RefPtr<InputEventActuator> hoverEffectActuator_; 271 RefPtr<InputEventActuator> axisEventActuator_; 272 RefPtr<InputEventActuator> accessibilityHoverEventActuator_; 273 274 RefPtr<InputEvent> showMenu_; 275 276 HoverEffectType hoverEffectType_ = HoverEffectType::UNKNOWN; 277 HoverEffectType hoverEffectAuto_ = HoverEffectType::UNKNOWN; 278 }; 279 280 } // namespace OHOS::Ace::NG 281 282 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_EVENT_INPUT_EVENT_HUB_H 283