From dc7424596dabbb955ece50d94c2ab2453e569470 Mon Sep 17 00:00:00 2001 From: Jaehyun Cho Date: Tue, 18 Jul 2023 16:16:58 +0900 Subject: [PATCH] [NUI] Add VisibilityChanged event to Layer To notice the visibility changes of Layer, VisibilityChanged event is added to Layer. --- src/Tizen.NUI/src/public/Common/Layer.cs | 105 +++++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/src/Tizen.NUI/src/public/Common/Layer.cs b/src/Tizen.NUI/src/public/Common/Layer.cs index cc9629c4a58..3d18aaf7ab3 100755 --- a/src/Tizen.NUI/src/public/Common/Layer.cs +++ b/src/Tizen.NUI/src/public/Common/Layer.cs @@ -17,6 +17,7 @@ using System; using Tizen.NUI.BaseComponents; using System.ComponentModel; +using System.Runtime.InteropServices; namespace Tizen.NUI { @@ -28,6 +29,10 @@ public class Layer : Container { private Window window; private int layoutCount = 0; + private EventHandler visibilityChangedEventHandler; + private VisibilityChangedEventCallbackType visibilityChangedEventCallback; + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + private delegate void VisibilityChangedEventCallbackType(IntPtr data, bool visibility, VisibilityChangeType type); /// /// Creates a Layer object. @@ -611,6 +616,89 @@ public void SetHoverConsumed(bool consume) if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } + /// + /// An event for visibility change which can be used to subscribe or unsubscribe the event handler.
+ /// This signal is emitted when the visible property of this or a parent view is changed.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)] + public event EventHandler VisibilityChanged + { + add + { + if (visibilityChangedEventHandler == null) + { + visibilityChangedEventCallback = OnVisibilityChanged; + VisibilityChangedSignal(this).Connect(visibilityChangedEventCallback); + } + + visibilityChangedEventHandler += value; + } + + remove + { + visibilityChangedEventHandler -= value; + + if (visibilityChangedEventHandler == null && VisibilityChangedSignal(this).Empty() == false) + { + VisibilityChangedSignal(this).Disconnect(visibilityChangedEventCallback); + if (VisibilityChangedSignal(this).Empty() == true) + { + visibilityChangedEventCallback = null; + } + } + } + } + + /// + /// Event arguments of visibility changed. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public class VisibilityChangedEventArgs : EventArgs + { + private Layer _layer; + private bool _visibility; + + /// + /// The layer whose visibility has changed. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public Layer Layer + { + get + { + return _layer; + } + set + { + _layer = value; + } + } + + /// + /// Whether the layer is now visible or not. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public bool Visibility + { + get + { + return _visibility; + } + set + { + _visibility = value; + } + } + } + + // Since ViewVisibilityChangedSignal uses Actor's visibility, Layer uses it as well. + internal ViewVisibilityChangedSignal VisibilityChangedSignal(Layer layer) + { + ViewVisibilityChangedSignal ret = new ViewVisibilityChangedSignal(Interop.NDalic.VisibilityChangedSignal(Layer.getCPtr(layer)), false); + if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + internal uint GetDepth() { var parentChildren = window?.LayersChildren; @@ -799,5 +887,22 @@ internal class Property { internal static readonly int BEHAVIOR = Interop.Layer.BehaviorGet(); } + + // Callback for View visibility change signal + // type is not used because layer does not have parent so layer's visibility cannot be changed by its parent. + private void OnVisibilityChanged(IntPtr data, bool visibility, VisibilityChangeType type) + { + VisibilityChangedEventArgs e = new VisibilityChangedEventArgs(); + if (data != null) + { + e.Layer = Registry.GetManagedBaseHandleFromNativePtr(data) as Layer; + } + e.Visibility = visibility; + + if (visibilityChangedEventHandler != null) + { + visibilityChangedEventHandler(this, e); + } + } } }