1 /*
2  * Copyright (c) 2023 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 #include "core/event/mouse_event.h"
17 
18 #include "core/pipeline/pipeline_base.h"
19 
20 namespace OHOS::Ace {
HandleHoverEvent(bool isHovered,const MouseEvent & event)21 bool HoverEventTarget::HandleHoverEvent(bool isHovered, const MouseEvent& event)
22 {
23     if (!onHoverEventCallback_) {
24         return false;
25     }
26     HoverInfo hoverInfo;
27     hoverInfo.SetTimeStamp(event.time);
28     hoverInfo.SetDeviceId(event.deviceId);
29     hoverInfo.SetSourceDevice(event.sourceType);
30     hoverInfo.SetSourceTool(event.sourceTool);
31     hoverInfo.SetPressedKeyCodes(event.pressedKeyCodes_);
32     // onHoverEventCallback_ may be overwritten in its invoke so we copy it first
33     auto onHoverEventCallback = onHoverEventCallback_;
34     onHoverEventCallback(isHovered, hoverInfo);
35     return !hoverInfo.IsStopPropagation();
36 }
37 
HandlePenHoverEvent(bool isHovered,const TouchEvent & event)38 bool HoverEventTarget::HandlePenHoverEvent(bool isHovered, const TouchEvent& event)
39 {
40     if (!onPenHoverEventCallback_) {
41         return false;
42     }
43     HoverInfo hoverInfo;
44     hoverInfo.SetTimeStamp(event.time);
45     hoverInfo.SetDeviceId(event.deviceId);
46     hoverInfo.SetSourceDevice(event.sourceType);
47     hoverInfo.SetSourceTool(event.sourceTool);
48     if (event.tiltX.has_value()) {
49         hoverInfo.SetTiltX(event.tiltX.value_or(0.0f));
50     }
51     if (event.tiltY.has_value()) {
52         hoverInfo.SetTiltY(event.tiltY.value_or(0.0f));
53     }
54     hoverInfo.SetTarget(GetEventTarget().value_or(EventTarget()));
55     // onPenHoverEventCallback_ may be overwritten in its invoke so we copy it first
56     auto onPenHoverEventCallback = onPenHoverEventCallback_;
57     onPenHoverEventCallback(isHovered, hoverInfo);
58     return !hoverInfo.IsStopPropagation();
59 }
60 
HandleAccessibilityHoverEvent(bool isHovered,const TouchEvent & event)61 void HoverEventTarget::HandleAccessibilityHoverEvent(bool isHovered, const TouchEvent& event)
62 {
63     if (!onAccessibilityHoverCallback_) {
64         return;
65     }
66     AccessibilityHoverInfo hoverInfo;
67     hoverInfo.SetTimeStamp(event.time);
68     hoverInfo.SetDeviceId(event.deviceId);
69     hoverInfo.SetSourceDevice(event.sourceType);
70     hoverInfo.SetSourceTool(event.sourceTool);
71     NG::PointF lastLocalPoint(event.x, event.y);
72     NG::NGGestureRecognizer::Transform(lastLocalPoint, GetAttachedNode(), false,
73         isPostEventResult_, event.postEventNodeId);
74     auto localX = static_cast<float>(lastLocalPoint.GetX());
75     auto localY = static_cast<float>(lastLocalPoint.GetY());
76     hoverInfo.SetLocalLocation(Offset(localX, localY));
77     hoverInfo.SetGlobalLocation(Offset(event.x, event.y));
78     hoverInfo.SetScreenLocation(Offset(event.screenX, event.screenY));
79     hoverInfo.SetActionType(ConvertAccessibilityHoverAction(event.type));
80     hoverInfo.SetTarget(GetEventTarget().value_or(EventTarget()));
81     // onAccessibilityHoverCallback_ may be overwritten in its invoke so we copy it first
82     auto onAccessibilityHoverCallback = onAccessibilityHoverCallback_;
83     onAccessibilityHoverCallback(isHovered, hoverInfo);
84 }
85 
ConvertAccessibilityHoverAction(TouchType type)86 AccessibilityHoverAction HoverEventTarget::ConvertAccessibilityHoverAction(TouchType type)
87 {
88     switch (type) {
89         case TouchType::HOVER_ENTER:
90             return AccessibilityHoverAction::HOVER_ENTER;
91         case TouchType::HOVER_MOVE:
92             return AccessibilityHoverAction::HOVER_MOVE;
93         case TouchType::HOVER_EXIT:
94             return AccessibilityHoverAction::HOVER_EXIT;
95         case TouchType::HOVER_CANCEL:
96             return AccessibilityHoverAction::HOVER_CANCEL;
97         case TouchType::DOWN:
98         case TouchType::UP:
99         case TouchType::MOVE:
100         case TouchType::CANCEL:
101         case TouchType::PULL_DOWN:
102         case TouchType::PULL_UP:
103         case TouchType::PULL_MOVE:
104         case TouchType::PULL_IN_WINDOW:
105         case TouchType::PULL_OUT_WINDOW:
106         case TouchType::PROXIMITY_IN:
107         case TouchType::PROXIMITY_OUT:
108         case TouchType::UNKNOWN:
109             return AccessibilityHoverAction::UNKNOWN;
110     }
111 }
112 
113 } // namespace OHOS::Ace
114