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