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