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