[NUI] Support adding multiple callback to gesture (#1215)
authorneostom432 <31119276+neostom432@users.noreply.github.com>
Thu, 19 Dec 2019 06:54:46 +0000 (15:54 +0900)
committerdongsug-song <35130733+dongsug-song@users.noreply.github.com>
Thu, 19 Dec 2019 06:54:46 +0000 (15:54 +0900)
src/Tizen.NUI/src/public/LongPressGestureDetector.cs
src/Tizen.NUI/src/public/PanGestureDetector.cs
src/Tizen.NUI/src/public/PinchGestureDetector.cs
src/Tizen.NUI/src/public/RotationGestureDetector.cs
src/Tizen.NUI/src/public/TapGestureDetector.cs

index 3ed1afb..df9645f 100755 (executable)
@@ -31,10 +31,6 @@ namespace Tizen.NUI
     [EditorBrowsable(EditorBrowsableState.Never)]
     public class LongPressGestureDetector : GestureDetector
     {
-
-        private DaliEventHandler<object, DetectedEventArgs> _longPressGestureEventHandler;
-        private DetectedCallbackDelegate _longPressGestureCallbackDelegate;
-
         /// <summary>
         /// Constructor.
         /// </summary>
@@ -85,8 +81,10 @@ namespace Tizen.NUI
         {
         }
 
+        private DaliEventHandler<object, DetectedEventArgs> _detectedEventHandler;
         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
-        private delegate void DetectedCallbackDelegate(IntPtr actor, IntPtr longPressGesture);
+        private delegate void DetectedCallbackType(IntPtr actor, IntPtr longPressGesture);
+        private DetectedCallbackType _detectedCallback;
 
         /// <summary>
         /// This signal is emitted when the specified long press is detected on the attached view.
@@ -97,29 +95,22 @@ namespace Tizen.NUI
         {
             add
             {
-                lock (this)
+                if (_detectedEventHandler == null)
                 {
-                    // Restricted to only one listener.
-                    if (_longPressGestureEventHandler == null)
-                    {
-                        _longPressGestureEventHandler += value;
-
-                        _longPressGestureCallbackDelegate = new DetectedCallbackDelegate(OnLongPressGestureDetected);
-                        this.DetectedSignal().Connect(_longPressGestureCallbackDelegate);
-                    }
+                    _detectedCallback = OnLongPressGestureDetected;
+                    DetectedSignal().Connect(_detectedCallback);
                 }
+
+                _detectedEventHandler += value;
             }
 
             remove
             {
-                lock (this)
-                {
-                    if (_longPressGestureEventHandler != null)
-                    {
-                        this.DetectedSignal().Disconnect(_longPressGestureCallbackDelegate);
-                    }
+                _detectedEventHandler -= value;
 
-                    _longPressGestureEventHandler -= value;
+                if (_detectedEventHandler == null && DetectedSignal().Empty() == false)
+                {
+                    DetectedSignal().Disconnect(_detectedCallback);
                 }
             }
         }
@@ -213,6 +204,10 @@ namespace Tizen.NUI
         [EditorBrowsable(EditorBrowsableState.Never)]
         protected override void ReleaseSwigCPtr(System.Runtime.InteropServices.HandleRef swigCPtr)
         {
+            if (_detectedEventHandler == null && DetectedSignal().Empty() == false)
+            {
+                DetectedSignal().Disconnect(_detectedCallback);
+            }
             Interop.LongPressGestureDetector.delete_LongPressGestureDetector(swigCPtr);
         }
 
@@ -229,10 +224,10 @@ namespace Tizen.NUI
 
             e.LongPressGesture = Tizen.NUI.LongPressGesture.GetLongPressGestureFromPtr(longPressGesture);
 
-            if (_longPressGestureEventHandler != null)
+            if (_detectedEventHandler != null)
             {
                 //Here we send all data to user event handlers.
-                _longPressGestureEventHandler(this, e);
+                _detectedEventHandler(this, e);
             }
         }
 
index d26c148..9d144f6 100755 (executable)
@@ -28,10 +28,6 @@ namespace Tizen.NUI
     [EditorBrowsable(EditorBrowsableState.Never)]
     public class PanGestureDetector : GestureDetector
     {
-
-        private DaliEventHandler<object, DetectedEventArgs> _panGestureEventHandler;
-        private DetectedCallbackDelegate _panGestureCallbackDelegate;
-
         /// <summary>
         /// Creates an initialized PanGestureDetector.
         /// </summary>
@@ -58,9 +54,10 @@ namespace Tizen.NUI
         {
         }
 
-
+        private DaliEventHandler<object, DetectedEventArgs> _detectedEventHandler;
         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
-        private delegate void DetectedCallbackDelegate(IntPtr actor, IntPtr panGesture);
+        private delegate void DetectedCallbackType(IntPtr actor, IntPtr panGesture);
+        private DetectedCallbackType _detectedCallback;
 
         /// <summary>
         /// This signal is emitted when the specified pan is detected on the attached view.
@@ -71,29 +68,22 @@ namespace Tizen.NUI
         {
             add
             {
-                lock (this)
+                if (_detectedEventHandler == null)
                 {
-                    // Restricted to only one listener
-                    if (_panGestureEventHandler == null)
-                    {
-                        _panGestureEventHandler += value;
-
-                        _panGestureCallbackDelegate = new DetectedCallbackDelegate(OnPanGestureDetected);
-                        this.DetectedSignal().Connect(_panGestureCallbackDelegate);
-                    }
+                    _detectedCallback = OnPanGestureDetected;
+                    DetectedSignal().Connect(_detectedCallback);
                 }
+
+                _detectedEventHandler += value;
             }
 
             remove
             {
-                lock (this)
-                {
-                    if (_panGestureEventHandler != null)
-                    {
-                        this.DetectedSignal().Disconnect(_panGestureCallbackDelegate);
-                    }
+                _detectedEventHandler -= value;
 
-                    _panGestureEventHandler -= value;
+                if (_detectedEventHandler == null && DetectedSignal().Empty() == false)
+                {
+                    DetectedSignal().Disconnect(_detectedCallback);
                 }
             }
         }
@@ -527,6 +517,11 @@ namespace Tizen.NUI
         [EditorBrowsable(EditorBrowsableState.Never)]
         protected override void ReleaseSwigCPtr(System.Runtime.InteropServices.HandleRef swigCPtr)
         {
+            if (_detectedCallback != null)
+            {
+                DetectedSignal().Disconnect(_detectedCallback);
+            }
+
             Interop.PanGestureDetector.delete_PanGestureDetector(swigCPtr);
         }
 
@@ -543,10 +538,9 @@ namespace Tizen.NUI
 
             e.PanGesture = Tizen.NUI.PanGesture.GetPanGestureFromPtr(panGesture);
 
-            if (_panGestureEventHandler != null)
+            if (_detectedEventHandler != null)
             {
-                //here we send all data to user event handlers
-                _panGestureEventHandler(this, e);
+                _detectedEventHandler(this, e);
             }
         }
 
index 4853d5f..b34ee58 100755 (executable)
@@ -28,10 +28,6 @@ namespace Tizen.NUI
     [EditorBrowsable(EditorBrowsableState.Never)]
     public class PinchGestureDetector : GestureDetector
     {
-
-        private DaliEventHandler<object, DetectedEventArgs> _pinchGestureEventHandler;
-        private DetectedCallbackDelegate _pinchGestureCallbackDelegate;
-
         /// <summary>
         /// Creates an initialized PinchGestureDetector.
         /// </summary>
@@ -58,8 +54,10 @@ namespace Tizen.NUI
         {
         }
 
+        private DaliEventHandler<object, DetectedEventArgs> _detectedEventHandler;
         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
-        private delegate void DetectedCallbackDelegate(IntPtr actor, IntPtr pinchGesture);
+        private delegate void DetectedCallbackType(IntPtr actor, IntPtr pinchGesture);
+        private DetectedCallbackType _detectedCallback;
 
         /// <summary>
         /// This signal is emitted when the specified pinch is detected on the attached view.
@@ -70,29 +68,22 @@ namespace Tizen.NUI
         {
             add
             {
-                lock (this)
+                if (_detectedEventHandler == null)
                 {
-                    // Restricted to only one listener
-                    if (_pinchGestureEventHandler == null)
-                    {
-                        _pinchGestureEventHandler += value;
-
-                        _pinchGestureCallbackDelegate = new DetectedCallbackDelegate(OnPinchGestureDetected);
-                        this.DetectedSignal().Connect(_pinchGestureCallbackDelegate);
-                    }
+                    _detectedCallback = OnPinchGestureDetected;
+                    DetectedSignal().Connect(_detectedCallback);
                 }
+
+                _detectedEventHandler += value;
             }
 
             remove
             {
-                lock (this)
-                {
-                    if (_pinchGestureEventHandler != null)
-                    {
-                        this.DetectedSignal().Disconnect(_pinchGestureCallbackDelegate);
-                    }
+                _detectedEventHandler -= value;
 
-                    _pinchGestureEventHandler -= value;
+                if (_detectedEventHandler == null && DetectedSignal().Empty() == false)
+                {
+                    DetectedSignal().Disconnect(_detectedCallback);
                 }
             }
         }
@@ -135,6 +126,11 @@ namespace Tizen.NUI
         [EditorBrowsable(EditorBrowsableState.Never)]
         protected override void ReleaseSwigCPtr(System.Runtime.InteropServices.HandleRef swigCPtr)
         {
+            if (_detectedCallback != null)
+            {
+                DetectedSignal().Disconnect(_detectedCallback);
+            }
+
             Interop.PinchGesture.delete_PinchGestureDetector(swigCPtr);
         }
 
@@ -151,10 +147,10 @@ namespace Tizen.NUI
 
             e.PinchGesture = Tizen.NUI.PinchGesture.GetPinchGestureFromPtr(pinchGesture);
 
-            if (_pinchGestureEventHandler != null)
+            if (_detectedEventHandler != null)
             {
                 //Here we send all data to user event handlers.
-                _pinchGestureEventHandler(this, e);
+                _detectedEventHandler(this, e);
             }
         }
 
index cd1741c..8ca4a4b 100755 (executable)
@@ -28,11 +28,6 @@ namespace Tizen.NUI
     [EditorBrowsable(EditorBrowsableState.Never)]
     public class RotationGestureDetector : GestureDetector
     {
-
-        private DaliEventHandler<object, DetectedEventArgs> _rotationGestureEventHandler;
-        private DetectedCallbackDelegate _rotationGestureCallbackDelegate;
-
-
         /// <summary>
         /// Creates an initialized RotationGestureDetector.
         /// </summary>
@@ -59,8 +54,10 @@ namespace Tizen.NUI
         {
         }
 
+        private DaliEventHandler<object, DetectedEventArgs> _detectedEventHandler;
         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
-        private delegate void DetectedCallbackDelegate(IntPtr actor, IntPtr rotationGesture);
+        private delegate void DetectedCallbackType(IntPtr actor, IntPtr rotationGesture);
+        private DetectedCallbackType _detectedCallback;
 
         /// <summary>
         /// This signal is emitted when the specified rotation is detected on the attached view.
@@ -71,29 +68,22 @@ namespace Tizen.NUI
         {
             add
             {
-                lock (this)
+                if (_detectedEventHandler == null)
                 {
-                    // Restricted to only one listener
-                    if (_rotationGestureEventHandler == null)
-                    {
-                        _rotationGestureEventHandler += value;
-
-                        _rotationGestureCallbackDelegate = new DetectedCallbackDelegate(OnRotationGestureDetected);
-                        this.DetectedSignal().Connect(_rotationGestureCallbackDelegate);
-                    }
+                    _detectedCallback = OnRotationGestureDetected;
+                    DetectedSignal().Connect(_detectedCallback);
                 }
+
+                _detectedEventHandler += value;
             }
 
             remove
             {
-                lock (this)
-                {
-                    if (_rotationGestureEventHandler != null)
-                    {
-                        this.DetectedSignal().Disconnect(_rotationGestureCallbackDelegate);
-                    }
+                _detectedEventHandler -= value;
 
-                    _rotationGestureEventHandler -= value;
+                if (_detectedEventHandler == null && DetectedSignal().Empty() == false)
+                {
+                    DetectedSignal().Disconnect(_detectedCallback);
                 }
             }
         }
@@ -136,6 +126,11 @@ namespace Tizen.NUI
         [EditorBrowsable(EditorBrowsableState.Never)]
         protected override void ReleaseSwigCPtr(System.Runtime.InteropServices.HandleRef swigCPtr)
         {
+            if (_detectedCallback != null)
+            {
+                DetectedSignal().Disconnect(_detectedCallback);
+            }
+
             Interop.RotationGesture.delete_RotationGestureDetector(swigCPtr);
         }
 
@@ -152,10 +147,10 @@ namespace Tizen.NUI
 
             e.RotationGesture = Tizen.NUI.RotationGesture.GetRotationGestureFromPtr(rotationGesture);
 
-            if (_rotationGestureEventHandler != null)
+            if (_detectedEventHandler != null)
             {
                 //Here we send all data to user event handlers.
-                _rotationGestureEventHandler(this, e);
+                _detectedEventHandler(this, e);
             }
         }
 
index 6c5b4a0..ae2e45b 100755 (executable)
@@ -30,9 +30,6 @@ namespace Tizen.NUI
     [EditorBrowsable(EditorBrowsableState.Never)]
     public class TapGestureDetector : GestureDetector
     {
-        private DaliEventHandler<object, DetectedEventArgs> _tapGestureEventHandler;
-        private DetectedCallbackDelegate _tapGestureCallbackDelegate;
-
         /// <summary>
         /// Creates an initialized TapGestureDetector.
         /// </summary>
@@ -59,8 +56,10 @@ namespace Tizen.NUI
         {
         }
 
+        private DaliEventHandler<object, DetectedEventArgs> _detectedEventHandler;
         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
-        private delegate void DetectedCallbackDelegate(IntPtr actor, IntPtr TapGesture);
+        private delegate void DetectedCallbackType(IntPtr actor, IntPtr TapGesture);
+        private DetectedCallbackType _detectedCallback;
 
         /// <summary>
         /// This signal is emitted when the specified tap is detected on the attached view.
@@ -71,29 +70,22 @@ namespace Tizen.NUI
         {
             add
             {
-                lock (this)
+                if (_detectedEventHandler == null)
                 {
-                    // Restricted to only one listener
-                    if (_tapGestureEventHandler == null)
-                    {
-                        _tapGestureEventHandler += value;
-
-                        _tapGestureCallbackDelegate = new DetectedCallbackDelegate(OnTapGestureDetected);
-                        this.DetectedSignal().Connect(_tapGestureCallbackDelegate);
-                    }
+                    _detectedCallback = OnTapGestureDetected;
+                    DetectedSignal().Connect(_detectedCallback);
                 }
+
+                _detectedEventHandler += value;
             }
 
             remove
             {
-                lock (this)
-                {
-                    if (_tapGestureEventHandler != null)
-                    {
-                        this.DetectedSignal().Disconnect(_tapGestureCallbackDelegate);
-                    }
+                _detectedEventHandler -= value;
 
-                    _tapGestureEventHandler -= value;
+                if (_detectedEventHandler == null && DetectedSignal().Empty() == false)
+                {
+                    DetectedSignal().Disconnect(_detectedCallback);
                 }
             }
         }
@@ -198,6 +190,11 @@ namespace Tizen.NUI
         [EditorBrowsable(EditorBrowsableState.Never)]
         protected override void ReleaseSwigCPtr(System.Runtime.InteropServices.HandleRef swigCPtr)
         {
+            if (_detectedCallback != null)
+            {
+                DetectedSignal().Disconnect(_detectedCallback);
+            }
+
             Interop.TapGestureDetector.delete_TapGestureDetector(swigCPtr);
         }
 
@@ -215,10 +212,10 @@ namespace Tizen.NUI
 
             e.TapGesture = Tizen.NUI.TapGesture.GetTapGestureFromPtr(tapGesture);
 
-            if (_tapGestureEventHandler != null)
+            if (_detectedEventHandler != null)
             {
                 //here we send all data to user event handlers
-                _tapGestureEventHandler(this, e);
+                _detectedEventHandler(this, e);
             }
         }