OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #if !defined(__has_feature) || !__has_feature(objc_arc) | |
6 #error "This file requires ARC support." | |
7 #endif | |
8 | |
9 #import "remoting/client/ios/client_gestures.h" | |
10 | |
11 @implementation ClientGestures | |
12 | |
13 - (id)initWithView:(UIView*)view { | |
14 _inputScheme = HostInputSchemeTouch; | |
15 | |
16 _longPressRecognizer = [[UILongPressGestureRecognizer alloc] | |
17 initWithTarget:self | |
18 action:@selector(longPressGestureTriggered:)]; | |
19 _longPressRecognizer.delegate = self; | |
20 [view addGestureRecognizer:_longPressRecognizer]; | |
21 | |
22 _panRecognizer = [[UIPanGestureRecognizer alloc] | |
23 initWithTarget:self | |
24 action:@selector(panGestureTriggered:)]; | |
25 _panRecognizer.minimumNumberOfTouches = 1; | |
26 _panRecognizer.maximumNumberOfTouches = 2; | |
27 _panRecognizer.delegate = self; | |
28 [view addGestureRecognizer:_panRecognizer]; | |
29 | |
30 _threeFingerPanRecognizer = [[UIPanGestureRecognizer alloc] | |
31 initWithTarget:self | |
32 action:@selector(threeFingerPanGestureTriggered:)]; | |
33 _threeFingerPanRecognizer.minimumNumberOfTouches = 3; | |
34 _threeFingerPanRecognizer.maximumNumberOfTouches = 3; | |
35 _threeFingerPanRecognizer.delegate = self; | |
36 [view addGestureRecognizer:_threeFingerPanRecognizer]; | |
37 | |
38 _pinchRecognizer = [[UIPinchGestureRecognizer alloc] | |
39 initWithTarget:self | |
40 action:@selector(pinchGestureTriggered:)]; | |
41 _pinchRecognizer.delegate = self; | |
42 [view addGestureRecognizer:_pinchRecognizer]; | |
43 | |
44 _singleTapRecognizer = [[UITapGestureRecognizer alloc] | |
45 initWithTarget:self | |
46 action:@selector(tapGestureTriggered:)]; | |
47 _singleTapRecognizer.delegate = self; | |
48 [view addGestureRecognizer:_singleTapRecognizer]; | |
49 | |
50 _twoFingerTapRecognizer = [[UITapGestureRecognizer alloc] | |
51 initWithTarget:self | |
52 action:@selector(twoFingerTapGestureTriggered:)]; | |
53 _twoFingerTapRecognizer.numberOfTouchesRequired = 2; | |
54 _twoFingerTapRecognizer.delegate = self; | |
55 [view addGestureRecognizer:_twoFingerTapRecognizer]; | |
56 | |
57 _threeFingerTapRecognizer = [[UITapGestureRecognizer alloc] | |
58 initWithTarget:self | |
59 action:@selector(threeFingerTapGestureTriggered:)]; | |
60 _threeFingerTapRecognizer.numberOfTouchesRequired = 3; | |
61 _threeFingerPanRecognizer.delegate = self; | |
62 [view addGestureRecognizer:_threeFingerTapRecognizer]; | |
63 | |
64 _inputScheme = HostInputSchemeTouch; | |
65 | |
66 [_singleTapRecognizer requireGestureRecognizerToFail:_twoFingerTapRecognizer]; | |
67 [_twoFingerTapRecognizer | |
68 requireGestureRecognizerToFail:_threeFingerTapRecognizer]; | |
69 [_pinchRecognizer requireGestureRecognizerToFail:_singleTapRecognizer]; | |
70 [_panRecognizer requireGestureRecognizerToFail:_singleTapRecognizer]; | |
71 [_threeFingerPanRecognizer | |
72 requireGestureRecognizerToFail:_threeFingerTapRecognizer]; | |
73 | |
74 _edgeGesture = [[UIScreenEdgePanGestureRecognizer alloc] | |
75 initWithTarget:self | |
76 action:@selector(edgeGestureTriggered:)]; | |
77 //_edgeGesture.edges = UIRectEdgeLeft; | |
78 _edgeGesture.delegate = self; | |
79 [view addGestureRecognizer:_edgeGesture]; | |
80 | |
81 _swipeGesture = [[UISwipeGestureRecognizer alloc] | |
82 initWithTarget:self | |
83 action:@selector(swipeGestureTriggered:)]; | |
84 _swipeGesture.numberOfTouchesRequired = 2; | |
85 _swipeGesture.delegate = self; | |
86 [view addGestureRecognizer:_swipeGesture]; | |
87 | |
88 return self; | |
89 } | |
90 | |
91 // Resize the view of the desktop - Zoom in/out. This can occur during a Pan. | |
92 - (IBAction)pinchGestureTriggered:(UIPinchGestureRecognizer*)sender { | |
93 // LOG_TRACE(INFO) << "pinchGestureTriggered"; | |
94 // if ([sender state] == UIGestureRecognizerStateChanged) { | |
95 // [self applySceneChange:CGPointMake(0.0, 0.0) scaleBy:sender.scale]; | |
96 // | |
97 // sender.scale = 1.0; // reset scale so next iteration is a relative ratio | |
98 // } | |
99 } | |
100 | |
101 - (IBAction)tapGestureTriggered:(UITapGestureRecognizer*)sender { | |
102 // LOG_TRACE(INFO) << "tapGestureTriggered"; | |
103 // CGPoint touchPoint = [sender locationInView:self.view]; | |
104 // if ([_scene containsTouchPoint:touchPoint]) { | |
105 // if (_inputScheme == HostInputSchemeTouch) { | |
106 // [_scene setMouseLocationFromLocationInView:touchPoint]; | |
107 // _circle.expandedRadius = 11.0f; | |
108 // [_circle doExpandingAnimationAtLocation:[_scene mouseLocationInView]]; | |
109 // } | |
110 // [Utility leftClickOn:_clientToHostProxy at:_scene.mousePosition]; | |
111 // } | |
112 } | |
113 | |
114 // Change position of scene. This can occur during a pinch or long press. | |
115 // Or perform a Mouse Wheel Scroll. | |
116 - (IBAction)panGestureTriggered:(UIPanGestureRecognizer*)sender { | |
117 // LOG_TRACE(INFO) << "panGestureTriggered"; | |
118 // CGPoint translation = [sender translationInView:self.view]; | |
119 // // If we start with 2 touches, and the pinch gesture is not in progress | |
120 // yet, | |
121 // // then disable it, so mouse scrolling and zoom do not occur at the same | |
122 // // time. | |
123 // if ([sender numberOfTouches] == 2 && | |
124 // [sender state] == UIGestureRecognizerStateBegan && | |
125 // !(_pinchRecognizer.state == UIGestureRecognizerStateBegan || | |
126 // _pinchRecognizer.state == UIGestureRecognizerStateChanged)) { | |
127 // _pinchRecognizer.enabled = NO; | |
128 // } | |
129 // | |
130 // if (!_pinchRecognizer.enabled) { | |
131 // // Began with 2 touches, so this is a scroll event. | |
132 // translation.x *= kMouseWheelSensitivity; | |
133 // translation.y *= kMouseWheelSensitivity; | |
134 // // [Utility mouseScroll:_clientToHostProxy | |
135 // // at:_scene.mousePosition | |
136 // // delta:webrtc::DesktopVector(translation.x, | |
137 // translation.y)]; | |
138 // } else { | |
139 // // Did not begin with 2 touches, doing a pan event. | |
140 // if ([sender state] == UIGestureRecognizerStateChanged) { | |
141 // CGPoint translation = [sender translationInView:self.view]; | |
142 // BOOL shouldApplyPanAndTapBounding = | |
143 // _inputScheme == HostInputSchemeTouch && | |
144 // [_longPressRecognizer state] != UIGestureRecognizerStateChanged; | |
145 // | |
146 // if (shouldApplyPanAndTapBounding) { | |
147 // // Reverse the orientation on both axes. | |
148 // translation = CGPointMake(-translation.x, -translation.y); | |
149 // } | |
150 // | |
151 // // if (shouldApplyPanAndTapBounding) { | |
152 // // // Stop the translation as soon as the view becomes anchored. | |
153 // // if ([SceneView | |
154 // // couldMouseMoveTowardAnchorWithTranslation:translation.x | |
155 // // isAnchoredLow:_scene.anchored.left | |
156 // // isAnchoredHigh:_scene.anchored | |
157 // // .right]) { | |
158 // // translation = CGPointMake(0, translation.y); | |
159 // // } | |
160 // // | |
161 // // if ([SceneView | |
162 // // couldMouseMoveTowardAnchorWithTranslation:translation.y | |
163 // // isAnchoredLow:_scene.anchored.top | |
164 // // isAnchoredHigh:_scene.anchored | |
165 // // .bottom]) | |
166 // { | |
167 // // translation = CGPointMake(translation.x, 0); | |
168 // // } | |
169 // // } | |
joedow
2016/12/19 23:56:26
Why is this code commented out?
| |
170 // | |
171 // [self applySceneChange:translation scaleBy:1.0]; | |
172 // | |
173 // if (_inputScheme == HostInputSchemeTouch && | |
174 // [_longPressRecognizer state] == UIGestureRecognizerStateChanged | |
175 // && | |
176 // [sender numberOfTouches] == 1) { | |
177 // // [_scene | |
178 // // setMouseLocationFromLocationInView:[sender | |
179 // // locationInView:self.view]]; | |
180 // | |
181 // // [Utility moveMouse:_clientToHostProxy at:_scene.mousePosition]; | |
182 // } | |
183 // | |
184 // } else if ([sender state] == UIGestureRecognizerStateEnded) { | |
185 // // After user removes their fingers from the screen | |
186 // // apply an acceleration effect. | |
187 // CGPoint velocity = [sender velocityInView:self.view]; | |
188 // | |
189 // if (_inputScheme == HostInputSchemeTouch) { | |
190 // // Reverse the orientation on both axes. | |
191 // velocity = CGPointMake(-velocity.x, -velocity.y); | |
192 // } | |
193 // // [_scene setPanVelocity:velocity]; | |
194 // } | |
195 // } | |
196 // | |
197 // // Finished the event chain. | |
198 // if (!([sender state] == UIGestureRecognizerStateBegan || | |
199 // [sender state] == UIGestureRecognizerStateChanged)) { | |
200 // _pinchRecognizer.enabled = YES; | |
201 // } | |
202 // | |
203 // // Reset translation so next iteration is relative. Wait until a changed | |
204 // // event in order to also capture the portion of the translation that | |
205 // occurred | |
206 // // between the Began and Changed States. | |
207 // if ([sender state] == UIGestureRecognizerStateChanged) { | |
208 // [sender setTranslation:CGPointZero inView:self.view]; | |
209 // } | |
210 } | |
211 | |
212 // Click-Drag mouse operation. This can occur during a Pan. | |
213 - (IBAction)longPressGestureTriggered:(UILongPressGestureRecognizer*)sender { | |
214 // LOG_TRACE(INFO) << "longPressGestureTriggered"; | |
215 // if ([sender state] == UIGestureRecognizerStateBegan) { | |
216 // if (_inputScheme == HostInputSchemeTouch) { | |
217 // CGPoint touchPoint = [sender locationInView:self.view]; | |
218 // [_scene setMouseLocationFromLocationInView:touchPoint]; | |
219 // } | |
220 // [_clientToHostProxy mouseAction:_scene.mousePosition | |
221 // wheelDelta:webrtc::DesktopVector(0, 0) | |
222 // whichButton:1 | |
223 // buttonDown:YES]; | |
224 // if (_inputScheme == HostInputSchemeTouch) { | |
225 // // location is going to be under the user's finger | |
226 // // create a bigger bubble. | |
227 // _circle.expandedRadius = 110.0f; | |
228 // } else { | |
229 // _circle.expandedRadius = 11.0f; | |
230 // } | |
231 // | |
232 // [_circle doExpandingAnimationAtLocation:[_scene mouseLocationInView]]; | |
233 // } else if (!([sender state] == UIGestureRecognizerStateBegan || | |
234 // [sender state] == UIGestureRecognizerStateChanged)) { | |
235 // [_clientToHostProxy mouseAction:_scene.mousePosition | |
236 // wheelDelta:webrtc::DesktopVector(0, 0) | |
237 // whichButton:1 | |
238 // buttonDown:NO]; | |
239 // if (_inputScheme == HostInputSchemeTouch) { | |
240 // // Return to the center. | |
241 // [_scene centerMouseInView]; | |
242 // } | |
243 // } | |
244 } | |
245 | |
246 - (IBAction)twoFingerTapGestureTriggered:(UITapGestureRecognizer*)sender { | |
247 // LOG_TRACE(INFO) << "twoFingerTapGestureTriggered"; | |
248 if (_inputScheme == HostInputSchemeTouch) { | |
249 // disabled | |
250 return; | |
251 } | |
252 // if ([_scene containsTouchPoint:[sender locationInView:self.view]]) { | |
253 // [Utility rightClickOn:_clientToHostProxy at:_scene.mousePosition]; | |
254 // } | |
255 } | |
256 | |
257 - (IBAction)threeFingerTapGestureTriggered:(UITapGestureRecognizer*)sender { | |
258 // LOG_TRACE(INFO) << "threeFingerTapGestureTriggered"; | |
259 if (_inputScheme == HostInputSchemeTouch) { | |
260 // disabled | |
261 return; | |
262 } | |
263 | |
264 // if ([_scene containsTouchPoint:[sender locationInView:self.view]]) { | |
265 // [Utility middleClickOn:_clientToHostProxy at:_scene.mousePosition]; | |
266 // } | |
267 } | |
268 | |
269 - (IBAction)threeFingerPanGestureTriggered:(UIPanGestureRecognizer*)sender { | |
270 // LOG_TRACE(INFO) << "threeFingerPanGestureTriggered"; | |
271 // if ([sender state] == UIGestureRecognizerStateChanged) { | |
272 // CGPoint translation = [sender translationInView:self.view]; | |
273 // if (translation.y > 0) { | |
274 // // Swiped down - do nothing | |
275 // } else if (translation.y < 0) { | |
276 // // Swiped up | |
277 // [_keyEntryView becomeFirstResponder]; | |
278 // } | |
279 // [sender setTranslation:CGPointZero inView:self.view]; | |
280 // } | |
281 } | |
282 | |
283 - (IBAction)edgeGestureTriggered:(UIScreenEdgePanGestureRecognizer*)sender { | |
284 // LOG_TRACE(INFO) << "edgeGestureTriggered"; | |
285 } | |
286 | |
287 - (IBAction)swipeGestureTriggered:(UISwipeGestureRecognizer*)sender { | |
288 // LOG_TRACE(INFO) << "swipeGestureTriggered"; | |
289 } | |
290 | |
291 #pragma mark - UIGestureRecognizerDelegate | |
292 | |
293 // Allow panning and zooming to occur simultaneously. | |
294 // Allow panning and long press to occur simultaneously. | |
295 // Pinch requires 2 touches, and long press requires a single touch, so they are | |
296 // mutually exclusive regardless of if panning is the initiating gesture. | |
297 - (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer | |
298 shouldRecognizeSimultaneouslyWithGestureRecognizer: | |
299 (UIGestureRecognizer*)otherGestureRecognizer { | |
300 if (gestureRecognizer == _pinchRecognizer || | |
301 (gestureRecognizer == _panRecognizer)) { | |
302 if (otherGestureRecognizer == _pinchRecognizer || | |
303 otherGestureRecognizer == _panRecognizer) { | |
304 return YES; | |
305 } | |
306 } | |
307 | |
308 if (gestureRecognizer == _longPressRecognizer || | |
309 gestureRecognizer == _panRecognizer) { | |
310 if (otherGestureRecognizer == _longPressRecognizer || | |
311 otherGestureRecognizer == _panRecognizer) { | |
312 return YES; | |
313 } | |
314 } | |
315 | |
316 if (gestureRecognizer == _twoFingerTapRecognizer && | |
317 otherGestureRecognizer == _longPressRecognizer) { | |
318 return YES; | |
319 } | |
320 | |
321 if (gestureRecognizer == _panRecognizer && | |
322 otherGestureRecognizer == _edgeGesture) { | |
323 return YES; | |
324 } | |
325 return YES; | |
326 // return NO; | |
327 } | |
328 | |
329 @end | |
OLD | NEW |