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 SetHoverEffect(HoverEffectType type)62 void SetHoverEffect(HoverEffectType type) 63 { 64 if (!hoverEffectActuator_) { 65 hoverEffectActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 66 } 67 hoverEffectType_ = type; 68 } 69 GetHoverEffect()70 HoverEffectType GetHoverEffect() 71 { 72 return hoverEffectType_; 73 } 74 std::string GetHoverEffectStr() const; 75 SetHoverEffectAuto(HoverEffectType type)76 void SetHoverEffectAuto(HoverEffectType type) 77 { 78 if (!hoverEffectActuator_) { 79 hoverEffectActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 80 } 81 hoverEffectAuto_ = type; 82 } 83 GetHoverEffectAuto()84 HoverEffectType GetHoverEffectAuto() 85 { 86 return hoverEffectAuto_; 87 } 88 89 // Set by user define, which will replace old one. SetHoverEvent(OnHoverFunc && onHoverEventFunc)90 void SetHoverEvent(OnHoverFunc&& onHoverEventFunc) 91 { 92 if (!hoverEventActuator_) { 93 hoverEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 94 } 95 hoverEventActuator_->ReplaceInputEvent(std::move(onHoverEventFunc)); 96 } 97 AddOnHoverEvent(const RefPtr<InputEvent> & onHoverEvent)98 void AddOnHoverEvent(const RefPtr<InputEvent>& onHoverEvent) 99 { 100 if (!hoverEventActuator_) { 101 hoverEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 102 } 103 hoverEventActuator_->AddInputEvent(onHoverEvent); 104 } 105 RemoveOnHoverEvent(const RefPtr<InputEvent> & onHoverEvent)106 void RemoveOnHoverEvent(const RefPtr<InputEvent>& onHoverEvent) 107 { 108 if (!hoverEventActuator_) { 109 return; 110 } 111 hoverEventActuator_->RemoveInputEvent(onHoverEvent); 112 } 113 AddOnAxisEvent(const RefPtr<InputEvent> & onAxisEvent)114 void AddOnAxisEvent(const RefPtr<InputEvent>& onAxisEvent) 115 { 116 if (!axisEventActuator_) { 117 axisEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this)); 118 } 119 axisEventActuator_->AddInputEvent(onAxisEvent); 120 } 121 RemoveOnAxisEvent(const RefPtr<InputEvent> & onAxisEvent)122 void RemoveOnAxisEvent(const RefPtr<InputEvent>& onAxisEvent) 123 { 124 if (!axisEventActuator_) { 125 return; 126 } 127 axisEventActuator_->RemoveInputEvent(onAxisEvent); 128 } 129 130 // the return value means prevents event bubbling. 131 bool ProcessMouseTestHit(const OffsetF& coordinateOffset, TouchTestResult& result); 132 133 bool ProcessAxisTestHit(const OffsetF& coordinateOffset, AxisTestResult& onAxisResult); 134 135 RefPtr<FrameNode> GetFrameNode() const; 136 OnContextAttached()137 void OnContextAttached() {} 138 139 // register showMenu callback (always replace) 140 void BindContextMenu(OnMouseEventFunc&& showMenu); 141 ClearUserOnHover()142 void ClearUserOnHover() 143 { 144 if (hoverEventActuator_) { 145 hoverEventActuator_->ClearUserCallback(); 146 } 147 } 148 ClearUserOnMouse()149 void ClearUserOnMouse() 150 { 151 if (mouseEventActuator_) { 152 mouseEventActuator_->ClearUserCallback(); 153 } 154 } 155 156 private: 157 WeakPtr<EventHub> eventHub_; 158 RefPtr<InputEventActuator> mouseEventActuator_; 159 RefPtr<InputEventActuator> hoverEventActuator_; 160 RefPtr<InputEventActuator> hoverEffectActuator_; 161 RefPtr<InputEventActuator> axisEventActuator_; 162 163 RefPtr<InputEvent> showMenu_; 164 165 HoverEffectType hoverEffectType_ = HoverEffectType::UNKNOWN; 166 HoverEffectType hoverEffectAuto_ = HoverEffectType::UNKNOWN; 167 }; 168 169 } // namespace OHOS::Ace::NG 170 171 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_EVENT_INPUT_EVENT_HUB_H 172