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 "bridge/declarative_frontend/jsview/models/gesture_model_impl.h"
17
18 #include "core/gestures/gesture_group.h"
19 #include "core/gestures/gesture_processor.h"
20 #include "core/gestures/long_press_gesture.h"
21 #include "core/gestures/rotation_gesture.h"
22 #include "core/gestures/pan_gesture.h"
23 #include "core/gestures/pinch_gesture.h"
24 #include "core/gestures/slide_gesture.h"
25 #include "core/gestures/tap_gesture.h"
26 #include "frameworks/bridge/declarative_frontend/view_stack_processor.h"
27
28 namespace OHOS::Ace::Framework {
Create(int32_t priorityNum,int32_t gestureMaskNum)29 void GestureModelImpl::Create(int32_t priorityNum, int32_t gestureMaskNum)
30 {
31 RefPtr<GestureProcessor> gestureProcessor;
32 gestureProcessor = ViewStackProcessor::GetInstance()->GetGestureComponent();
33
34 GesturePriority priority = GesturePriority::Low;
35 if (priorityNum > static_cast<int32_t>(GesturePriority::Begin) &&
36 priorityNum < static_cast<int32_t>(GesturePriority::End)) {
37 priority = static_cast<GesturePriority>(priorityNum);
38 }
39 gestureProcessor->SetPriority(priority);
40
41 GestureMask gestureMask = GestureMask::Normal;
42 if (gestureMaskNum > static_cast<int32_t>(GestureMask::Begin) &&
43 gestureMaskNum < static_cast<int32_t>(GestureMask::End)) {
44 gestureMask = static_cast<GestureMask>(gestureMaskNum);
45 }
46 gestureProcessor->SetGestureMask(gestureMask);
47 }
48
Finish()49 void GestureModelImpl::Finish()
50 {
51 RefPtr<GestureProcessor> gestureProcessor;
52 gestureProcessor = ViewStackProcessor::GetInstance()->GetGestureComponent();
53 auto gesture = gestureProcessor->FinishGesture();
54 CHECK_NULL_VOID(gesture);
55 gesture->SetGestureMask(gestureProcessor->GetGestureMask());
56 gesture->SetPriority(gestureProcessor->GetPriority());
57 auto boxComponent = ViewStackProcessor::GetInstance()->GetBoxComponent();
58 boxComponent->AddGesture(gestureProcessor->GetPriority(), gesture);
59 }
60
Pop()61 void GestureModelImpl::Pop()
62 {
63 RefPtr<GestureProcessor> gestureProcessor;
64 gestureProcessor = ViewStackProcessor::GetInstance()->GetGestureComponent();
65 gestureProcessor->PopGesture();
66 }
67
Create(int32_t countNum,int32_t fingersNum,double distanceThreshold,bool isLimitFingerCount)68 void TapGestureModelImpl::Create(
69 int32_t countNum, int32_t fingersNum, double distanceThreshold, bool isLimitFingerCount)
70 {
71 RefPtr<GestureProcessor> gestureProcessor;
72 gestureProcessor = ViewStackProcessor::GetInstance()->GetGestureComponent();
73 auto gesture = AceType::MakeRefPtr<TapGesture>(countNum, fingersNum, distanceThreshold);
74 gestureProcessor->PushGesture(gesture);
75 }
76
Create(int32_t fingersNum,bool repeatResult,int32_t durationNum,bool isLimitFingerCount)77 void LongPressGestureModelImpl::Create(
78 int32_t fingersNum, bool repeatResult, int32_t durationNum, bool isLimitFingerCount)
79 {
80 RefPtr<GestureProcessor> gestureProcessor;
81 gestureProcessor = ViewStackProcessor::GetInstance()->GetGestureComponent();
82 auto gesture = AceType::MakeRefPtr<LongPressGesture>(fingersNum, repeatResult, durationNum);
83 gestureProcessor->PushGesture(gesture);
84 }
85
Create(int32_t fingersNum,const PanDirection & panDirection,double distanceNum,bool isLimitFingerCount)86 void PanGestureModelImpl::Create(
87 int32_t fingersNum, const PanDirection& panDirection, double distanceNum, bool isLimitFingerCount)
88 {
89 RefPtr<GestureProcessor> gestureProcessor;
90 gestureProcessor = ViewStackProcessor::GetInstance()->GetGestureComponent();
91 auto gesture = AceType::MakeRefPtr<PanGesture>(fingersNum, panDirection, distanceNum);
92 gestureProcessor->PushGesture(gesture);
93 }
94
SetPanGestureOption(const RefPtr<PanGestureOption> & panGestureOption)95 void PanGestureModelImpl::SetPanGestureOption(const RefPtr<PanGestureOption>& panGestureOption)
96 {
97 RefPtr<GestureProcessor> gestureProcessor;
98 gestureProcessor = ViewStackProcessor::GetInstance()->GetGestureComponent();
99 auto gesture = AceType::MakeRefPtr<PanGesture>(panGestureOption);
100 gestureProcessor->PushGesture(gesture);
101 }
102
Create(int32_t fingersNum,const SwipeDirection & slideDirection,double speedNum,bool isLimitFingerCount)103 void SwipeGestureModelImpl::Create(
104 int32_t fingersNum, const SwipeDirection& slideDirection, double speedNum, bool isLimitFingerCount)
105 {
106 RefPtr<GestureProcessor> gestureProcessor;
107 gestureProcessor = ViewStackProcessor::GetInstance()->GetGestureComponent();
108 auto gesture = AceType::MakeRefPtr<SwipeGesture>(fingersNum, slideDirection, speedNum);
109 gestureProcessor->PushGesture(gesture);
110 }
111
Create(int32_t fingersNum,double distanceNum,bool isLimitFingerCount)112 void PinchGestureModelImpl::Create(int32_t fingersNum, double distanceNum, bool isLimitFingerCount)
113 {
114 RefPtr<GestureProcessor> gestureProcessor;
115 gestureProcessor = ViewStackProcessor::GetInstance()->GetGestureComponent();
116 auto gesture = AceType::MakeRefPtr<PinchGesture>(fingersNum, distanceNum);
117 gestureProcessor->PushGesture(gesture);
118 }
119
Create(int32_t fingersNum,double angleNum,bool isLimitFingerCount)120 void RotationGestureModelImpl::Create(int32_t fingersNum, double angleNum, bool isLimitFingerCount)
121 {
122 RefPtr<GestureProcessor> gestureProcessor;
123 gestureProcessor = ViewStackProcessor::GetInstance()->GetGestureComponent();
124 auto gesture = AceType::MakeRefPtr<RotationGesture>(fingersNum, angleNum);
125 gestureProcessor->PushGesture(gesture);
126 }
127
Create(int32_t gestureMode)128 void GestureGroupModelImpl::Create(int32_t gestureMode)
129 {
130 RefPtr<GestureProcessor> gestureProcessor;
131 gestureProcessor = ViewStackProcessor::GetInstance()->GetGestureComponent();
132 auto gesture = AceType::MakeRefPtr<GestureGroup>(static_cast<GestureMode>(gestureMode));
133 gestureProcessor->PushGesture(gesture);
134 }
135
GetGestureProcessor()136 RefPtr<GestureProcessor> TimeoutGestureModelImpl::GetGestureProcessor()
137 {
138 RefPtr<GestureProcessor> gestureProcessor;
139 gestureProcessor = ViewStackProcessor::GetInstance()->GetGestureComponent();
140 return gestureProcessor;
141 }
142
SetOnGestureEvent(const GestureEventNoParameter & gestureEventNoParameter)143 void GestureModelImpl::SetOnGestureEvent(const GestureEventNoParameter& gestureEventNoParameter)
144 {
145 RefPtr<GestureProcessor> gestureProcessor;
146 gestureProcessor = ViewStackProcessor::GetInstance()->GetGestureComponent();
147 auto gesture = gestureProcessor->TopGesture();
148 CHECK_NULL_VOID(gesture);
149
150 RefPtr<V2::InspectorFunctionImpl> impl;
151 auto inspector = ViewStackProcessor::GetInstance()->GetInspectorComposedComponent();
152 CHECK_NULL_VOID(inspector);
153 impl = inspector->GetInspectorFunctionImpl();
154
155 gesture->SetOnActionCancelId([func = std::move(gestureEventNoParameter), impl]() {
156 auto info = GestureEvent();
157 if (impl) {
158 impl->UpdateEventInfo(info);
159 }
160 func();
161 });
162 }
163
SetOnActionFunc(const GestureEventFunc & gestureEventFunc,const Ace::GestureEventAction & action)164 void GestureModelImpl::SetOnActionFunc(const GestureEventFunc& gestureEventFunc,
165 const Ace::GestureEventAction& action)
166 {
167 RefPtr<GestureProcessor> gestureProcessor;
168 gestureProcessor = ViewStackProcessor::GetInstance()->GetGestureComponent();
169 auto gesture = gestureProcessor->TopGesture();
170 CHECK_NULL_VOID(gesture);
171
172 RefPtr<V2::InspectorFunctionImpl> impl;
173 auto inspector = ViewStackProcessor::GetInstance()->GetInspectorComposedComponent();
174 CHECK_NULL_VOID(inspector);
175 impl = inspector->GetInspectorFunctionImpl();
176
177 auto onActionFunc = [func = std::move(gestureEventFunc), impl](GestureEvent& info) {
178 if (impl) {
179 impl->UpdateEventInfo(info);
180 }
181 func(info);
182 };
183
184 switch (action) {
185 case Ace::GestureEventAction::ACTION:
186 gesture->SetOnActionId(onActionFunc);
187 break;
188 case Ace::GestureEventAction::START:
189 gesture->SetOnActionStartId(onActionFunc);
190 break;
191 case Ace::GestureEventAction::UPDATE:
192 gesture->SetOnActionUpdateId(onActionFunc);
193 break;
194 case Ace::GestureEventAction::END:
195 gesture->SetOnActionEndId(onActionFunc);
196 break;
197 default:
198 LOGW("Unknown gesture action %{public}d", action);
199 break;
200 }
201 }
202 } // namespace OHOS::Ace::Framework
203