• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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