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 SetAccessibilityHoverEvent(OnAccessibilityHoverFunc && onAccessibilityHoverEventFunc)99 void SetAccessibilityHoverEvent(OnAccessibilityHoverFunc&& onAccessibilityHoverEventFunc) 100 { 101 if (!accessibilityHoverEventActuator_) { 102 accessibilityHoverEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 103 } 104 accessibilityHoverEventActuator_->ReplaceInputEvent(std::move(onAccessibilityHoverEventFunc)); 105 } 106 SetJSFrameNodeOnHoverEvent(OnHoverFunc && onHoverEventFunc)107 void SetJSFrameNodeOnHoverEvent(OnHoverFunc&& onHoverEventFunc) 108 { 109 if (!hoverEventActuator_) { 110 hoverEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 111 } 112 hoverEventActuator_->ReplaceJSFrameNodeInputEvent(std::move(onHoverEventFunc)); 113 } 114 AddOnHoverEvent(const RefPtr<InputEvent> & onHoverEvent)115 void AddOnHoverEvent(const RefPtr<InputEvent>& onHoverEvent) 116 { 117 if (!hoverEventActuator_) { 118 hoverEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 119 } 120 hoverEventActuator_->AddInputEvent(onHoverEvent); 121 } 122 RemoveOnHoverEvent(const RefPtr<InputEvent> & onHoverEvent)123 void RemoveOnHoverEvent(const RefPtr<InputEvent>& onHoverEvent) 124 { 125 if (!hoverEventActuator_) { 126 return; 127 } 128 hoverEventActuator_->RemoveInputEvent(onHoverEvent); 129 } 130 AddOnAxisEvent(const RefPtr<InputEvent> & onAxisEvent)131 void AddOnAxisEvent(const RefPtr<InputEvent>& onAxisEvent) 132 { 133 if (!axisEventActuator_) { 134 axisEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 135 } 136 axisEventActuator_->AddInputEvent(onAxisEvent); 137 } 138 RemoveOnAxisEvent(const RefPtr<InputEvent> & onAxisEvent)139 void RemoveOnAxisEvent(const RefPtr<InputEvent>& onAxisEvent) 140 { 141 if (!axisEventActuator_) { 142 return; 143 } 144 axisEventActuator_->RemoveInputEvent(onAxisEvent); 145 } 146 147 // the return value means prevents event bubbling. 148 bool ProcessMouseTestHit(const OffsetF& coordinateOffset, TouchTestResult& result); 149 150 bool ProcessPenHoverTestHit(const OffsetF& coordinateOffset, TouchTestResult& result); 151 152 bool ProcessAxisTestHit(const OffsetF& coordinateOffset, AxisTestResult& onAxisResult); 153 154 RefPtr<FrameNode> GetFrameNode() const; 155 OnContextAttached()156 void OnContextAttached() {} 157 158 // register showMenu callback (always replace) 159 void BindContextMenu(OnMouseEventFunc&& showMenu); 160 ClearUserOnHover()161 void ClearUserOnHover() 162 { 163 if (hoverEventActuator_) { 164 hoverEventActuator_->ClearUserCallback(); 165 } 166 } 167 ClearUserOnAccessibilityHover()168 void ClearUserOnAccessibilityHover() 169 { 170 if (accessibilityHoverEventActuator_) { 171 accessibilityHoverEventActuator_->ClearUserCallback(); 172 } 173 } 174 ClearJSFrameNodeOnHover()175 void ClearJSFrameNodeOnHover() 176 { 177 if (hoverEventActuator_) { 178 hoverEventActuator_->ClearJSFrameNodeCallback(); 179 } 180 } 181 ClearUserOnMouse()182 void ClearUserOnMouse() 183 { 184 if (mouseEventActuator_) { 185 mouseEventActuator_->ClearUserCallback(); 186 } 187 } 188 ClearJSFrameNodeOnMouse()189 void ClearJSFrameNodeOnMouse() 190 { 191 if (mouseEventActuator_) { 192 mouseEventActuator_->ClearJSFrameNodeCallback(); 193 } 194 } 195 196 private: 197 WeakPtr<EventHub> eventHub_; 198 RefPtr<InputEventActuator> mouseEventActuator_; 199 RefPtr<InputEventActuator> hoverEventActuator_; 200 RefPtr<InputEventActuator> hoverEffectActuator_; 201 RefPtr<InputEventActuator> axisEventActuator_; 202 RefPtr<InputEventActuator> accessibilityHoverEventActuator_; 203 204 RefPtr<InputEvent> showMenu_; 205 206 HoverEffectType hoverEffectType_ = HoverEffectType::UNKNOWN; 207 HoverEffectType hoverEffectAuto_ = HoverEffectType::UNKNOWN; 208 }; 209 210 } // namespace OHOS::Ace::NG 211 212 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_EVENT_INPUT_EVENT_HUB_H 213