}
private DaliEventHandler<object, DetectedEventArgs> detectedEventHandler;
- [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void DetectedCallbackType(IntPtr actor, IntPtr panGesture);
private DetectedCallbackType detectedCallback;
if (detectedEventHandler == null)
{
detectedCallback = OnPanGestureDetected;
- DetectedSignal().Connect(detectedCallback);
+ using PanGestureDetectedSignal signal = new PanGestureDetectedSignal(Interop.PanGestureDetector.DetectedSignal(SwigCPtr), false);
+ signal?.Connect(detectedCallback);
}
-
detectedEventHandler += value;
}
-
remove
{
detectedEventHandler -= value;
-
- if (detectedEventHandler == null && DetectedSignal().Empty() == false)
+ if (detectedEventHandler == null)
{
- DetectedSignal().Disconnect(detectedCallback);
+ using PanGestureDetectedSignal signal = new PanGestureDetectedSignal(Interop.PanGestureDetector.DetectedSignal(SwigCPtr), false);
+ if (signal?.Empty() == false)
+ {
+ signal?.Disconnect(detectedCallback);
+ if (signal?.Empty() == true)
+ {
+ detectedCallback = null;
+ }
+ }
}
}
}
}
/// <summary>
+ /// Set a maximum duration of motion event that is able to live on the pan gesture event queue.
+ /// If duration exceed it, the motion event is discarded.
+ /// </summary>
+ /// <param name="maximumAgeMilliSecond">Maximum age of motion events as milliseconds</param>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void SetMaximumMotionEventAge(uint maximumAgeMilliSecond)
+ {
+ Interop.PanGestureDetector.SetMaximumMotionEventAge(SwigCPtr, maximumAgeMilliSecond);
+ if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+ }
+
+ /// <summary>
/// Retrieves the minimum number of touches required for the pan gesture to be detected.
/// </summary>
/// <returns>The minimum touches required</returns>
}
/// <summary>
+ /// Retrieves the maximum age for the pan gesture motion as milliseconds.
+ /// </summary>
+ /// <returns>The maximum age of motion events as milliseconds</returns>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public uint GetMaximumMotionEventAge()
+ {
+ uint ret = Interop.PanGestureDetector.GetMaximumMotionEventAge(SwigCPtr);
+ if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+ return ret;
+ }
+
+ /// <summary>
/// The pan gesture is only emitted if the pan occurs in the direction specified by this method with a +/- threshold allowance.<br />
/// If an angle of 0.0 degrees is specified and the threshold is 45 degrees then the acceptable direction range is from -45 to 45 degrees.<br />
/// The angle added using this API is only checked when the gesture first starts, after that, this detector will emit the gesture regardless of what angle the pan is moving.
return ret;
}
- internal PanGestureDetectedSignal DetectedSignal()
+ /// <summary>
+ /// override it to clean-up your own resources.
+ /// </summary>
+ /// <param name="type"></param>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ protected override void Dispose(DisposeTypes type)
{
- PanGestureDetectedSignal ret = new PanGestureDetectedSignal(Interop.PanGestureDetector.DetectedSignal(SwigCPtr), false);
- if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
- return ret;
+ if (disposed)
+ {
+ return;
+ }
+
+ if (type == DisposeTypes.Explicit)
+ {
+ //Called by User
+ //Release your own managed resources here.
+ //You should release all of your own disposable objects here.
+ }
+
+ //Release your own unmanaged resources here.
+ //You should not access any managed member here except static instance.
+ //because the execution order of Finalizes is non-deterministic.
+
+ if (HasBody())
+ {
+ if (detectedCallback != null)
+ {
+ using PanGestureDetectedSignal signal = new PanGestureDetectedSignal(Interop.PanGestureDetector.DetectedSignal(GetBaseHandleCPtrHandleRef), false);
+ signal?.Disconnect(detectedCallback);
+ detectedCallback = null;
+ }
+ }
+ base.Dispose(type);
}
/// This will not be public opened.
[EditorBrowsable(EditorBrowsableState.Never)]
protected override void ReleaseSwigCPtr(System.Runtime.InteropServices.HandleRef swigCPtr)
{
- if (detectedCallback != null)
- {
- DetectedSignal().Disconnect(detectedCallback);
- }
-
Interop.PanGestureDetector.DeletePanGestureDetector(swigCPtr);
}
private void OnPanGestureDetected(IntPtr actor, IntPtr panGesture)
{
+ if (IsNativeHandleInvalid())
+ {
+ if (this.Disposed)
+ {
+ if (detectedEventHandler != null)
+ {
+ var process = global::System.Diagnostics.Process.GetCurrentProcess();
+ var processId = process?.Id ?? -1;
+ var thread = global::System.Threading.Thread.CurrentThread.ManagedThreadId;
+ var me = this.GetType().FullName;
+
+ Tizen.Log.Error("NUI", $"Error! NUI's native dali object is already disposed. " +
+ $"OR the native dali object handle of NUI becomes null! \n" +
+ $" process:{processId} thread:{thread}, isDisposed:{this.Disposed}, isDisposeQueued:{this.IsDisposeQueued}, me:{me}\n");
+
+ process?.Dispose();
+ }
+ }
+ else
+ {
+ if (this.IsDisposeQueued)
+ {
+ var process = global::System.Diagnostics.Process.GetCurrentProcess();
+ var processId = process?.Id ?? -1;
+ var thread = global::System.Threading.Thread.CurrentThread.ManagedThreadId;
+ var me = this.GetType().FullName;
+
+ //in this case, this object is ready to be disposed waiting on DisposeQueue, so event callback should not be invoked!
+ Tizen.Log.Error("NUI", "in this case, the View object is ready to be disposed waiting on DisposeQueue, so event callback should not be invoked! just return here! \n" +
+ $"process:{processId} thread:{thread}, isDisposed:{this.Disposed}, isDisposeQueued:{this.IsDisposeQueued}, me:{me}\n");
+
+ process?.Dispose();
+ return;
+ }
+ }
+ }
+
if (detectedEventHandler != null)
{
DetectedEventArgs e = new DetectedEventArgs();
e.View = Registry.GetManagedBaseHandleFromRefObject(actor) as View;
}
+ // If DispatchGestureEvents is false, no gesture events are dispatched.
+ if (e.View != null && e.View.DispatchGestureEvents == false)
+ {
+ return;
+ }
+
e.PanGesture = Tizen.NUI.PanGesture.GetPanGestureFromPtr(panGesture);
detectedEventHandler(this, e);
}