• 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 
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