[NUI] Modify to pass userData object to GestureDetectorManager (#1932)
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / public / Events / GestureDetectorManager.cs
1 /*
2  * Copyright (c) 2020 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17 using System.ComponentModel;
18 using Tizen.NUI;
19 using Tizen.NUI.BaseComponents;
20
21 namespace Tizen.NUI.Events
22 {
23   /// <summary>
24   /// This is a class for detects various gestures.
25   /// </summary>
26   [EditorBrowsable(EditorBrowsableState.Never)]
27   public class GestureDetectorManager : Disposable
28   {
29     /// <summary>
30     ///  This class is used to create a subset of the gestures you only want.
31     ///  You can inherit this class and implement the callback for gestures what you want to use.
32     /// </summary>
33     [EditorBrowsable(EditorBrowsableState.Never)]
34     public class GestureListener
35     {
36       /// <summary>
37       ///  TapGestureDetector event callback.
38       /// </summary>
39       [EditorBrowsable(EditorBrowsableState.Never)]
40       public virtual void OnTap(object sender, TapGestureDetector.DetectedEventArgs e, object userData)
41       {
42       }
43
44       /// <summary>
45       ///  LongPressGestureDetector event callback.
46       /// </summary>
47       [EditorBrowsable(EditorBrowsableState.Never)]
48       public virtual void OnLongPress(object sender, LongPressGestureDetector.DetectedEventArgs e, object userData)
49       {
50       }
51
52       /// <summary>
53       ///  PanGestureDetector event callback.
54       /// </summary>
55       [EditorBrowsable(EditorBrowsableState.Never)]
56       public virtual void OnPan(object sender, PanGestureDetector.DetectedEventArgs e, object userData)
57       {
58       }
59
60       /// <summary>
61       ///  PinchGestureDetector event callback.
62       /// </summary>
63       [EditorBrowsable(EditorBrowsableState.Never)]
64       public virtual void OnPinch(object sender, PinchGestureDetector.DetectedEventArgs e, object userData)
65       {
66       }
67     }
68
69     private GestureListener mListener;
70     private TapGestureDetector mTapGestureDetector;
71     private LongPressGestureDetector mLongGestureDetector;
72     private PinchGestureDetector mPinchGestureDetector;
73     private PanGestureDetector mPanGestureDetector;
74     private object mUserData;
75
76     /// <summary>
77     ///  Creates a GestureDetectorManager with the user listener.
78     /// </summary>
79     [EditorBrowsable(EditorBrowsableState.Never)]
80     public GestureDetectorManager(View view, GestureListener listener)
81     {
82       if(view == null)
83       {
84         throw new global::System.ArgumentNullException(nameof(view));
85       }
86       if(listener == null)
87       {
88         throw new global::System.ArgumentNullException(nameof(listener));
89       }
90
91       mListener = listener;
92       view.GrabTouchAfterLeave = true;
93       init(view);
94     }
95
96     private void init(View view)
97     {
98       mTapGestureDetector = new TapGestureDetector();
99       mLongGestureDetector = new LongPressGestureDetector();
100       mPanGestureDetector = new PanGestureDetector();
101       mPinchGestureDetector = new PinchGestureDetector();
102
103       mTapGestureDetector.Attach(view);
104       mLongGestureDetector.Attach(view);
105       mPanGestureDetector.Attach(view);
106       mPinchGestureDetector.Attach(view);
107     }
108
109     private void InternalOnTap(object sender, TapGestureDetector.DetectedEventArgs e)
110     {
111       mListener.OnTap(sender, e, mUserData);
112       mTapGestureDetector.Detected -= InternalOnTap;
113     }
114
115     private void InternalOnLongPress(object sender, LongPressGestureDetector.DetectedEventArgs e)
116     {
117       mListener.OnLongPress(sender, e, mUserData);
118       mLongGestureDetector.Detected -= InternalOnLongPress;
119     }
120
121     private void InternalOnPan(object sender, PanGestureDetector.DetectedEventArgs e)
122     {
123       mListener.OnPan(sender, e, mUserData);
124       mPanGestureDetector.Detected -= InternalOnPan;
125     }
126
127     private void InternalOnPinch(object sender, PinchGestureDetector.DetectedEventArgs e)
128     {
129       mListener.OnPinch(sender, e, mUserData);
130       mPinchGestureDetector.Detected -= InternalOnPinch;
131     }
132
133     /// <summary>
134     /// Gestures also work only when there is a touch event.
135     /// </summary>
136     /// <param name="sender">The actor who delivered the touch event.</param>
137     /// <param name="e">The TouchEventArgs</param>
138     [EditorBrowsable(EditorBrowsableState.Never)]
139     public void FeedTouchEvent(object sender, View.TouchEventArgs e)
140     {
141       FeedTouchEvent(sender, e, null);
142     }
143
144     /// <summary>
145     /// Gestures also work only when there is a touch event.
146     /// </summary>
147     /// <param name="sender">The actor who delivered the touch event.</param>
148     /// <param name="e">The TouchEventArgs</param>
149     /// <param name="userData">The user data object</param>
150     [EditorBrowsable(EditorBrowsableState.Never)]
151     public void FeedTouchEvent(object sender, View.TouchEventArgs e, object userData)
152     {
153       mUserData = userData;
154       mTapGestureDetector.Detected -= InternalOnTap;
155       mLongGestureDetector.Detected -= InternalOnLongPress;
156       mPanGestureDetector.Detected -= InternalOnPan;
157       mPinchGestureDetector.Detected -= InternalOnPinch;
158
159       if(e != null &&
160           (e.Touch.GetState(0) != PointStateType.Finished ||
161            e.Touch.GetState(0) != PointStateType.Up       ||
162            e.Touch.GetState(0) != PointStateType.Interrupted))
163       {
164         mTapGestureDetector.Detected += InternalOnTap;
165         mLongGestureDetector.Detected += InternalOnLongPress;
166         mPanGestureDetector.Detected += InternalOnPan;
167         mPinchGestureDetector.Detected += InternalOnPinch;
168       }
169     }
170   }
171 }