[NUI] Add HoverEvent in Window
authorjoogab.yun <joogab.yun@samsung.com>
Mon, 28 Aug 2023 06:10:16 +0000 (15:10 +0900)
committerJiyun Yang <ji.yang@samsung.com>
Mon, 25 Sep 2023 06:47:45 +0000 (15:47 +0900)
Window window = NUIApplication.GetDefaultWindow();
window.HoverEvent += OnHover;

private void OnHover(object source, Window.HoverEventArgs e)
{
  // e.Hover.GetState(0); // PointStateType.Motion;
}

src/Tizen.NUI/src/public/Window/WindowEvent.cs

index 9036e53..72d091f 100755 (executable)
@@ -57,6 +57,7 @@ namespace Tizen.NUI
         private ResizeCompletedEventCallbackType resizeCompletedEventCallback;
         private InsetsChangedEventCallbackType insetsChangedEventCallback;
         private WindowPointerConstraintsEventCallback windowPointerConstraintsEventCallback;
+        private RootLayerHoverDataCallbackType rootLayerHoverDataCallback;
         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
         private delegate void WindowFocusChangedEventCallbackType(IntPtr window, bool focusGained);
         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
@@ -91,6 +92,8 @@ namespace Tizen.NUI
         private delegate void InsetsChangedEventCallbackType(int partType, int partState, IntPtr extents);
         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
         private delegate void WindowPointerConstraintsEventCallback(IntPtr window, IntPtr constraintsEvent);
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        private delegate bool RootLayerHoverDataCallbackType(IntPtr view, IntPtr hoverData);
 
 
         /// <summary>
@@ -152,6 +155,7 @@ namespace Tizen.NUI
             }
         }
 
+
         /// <summary>
         /// An event for the touched signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
         /// The touched signal is emitted when the touch input is received.<br />
@@ -345,6 +349,35 @@ namespace Tizen.NUI
         }
 
         /// <summary>
+        /// An event for the hovered signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
+        /// The hovered signal is emitted when the hover input is received.<br />
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public event EventHandler<HoverEventArgs> HoverEvent
+        {
+            add
+            {
+                if (rootLayerHoverDataEventHandler == null)
+                {
+                    rootLayerHoverDataCallback = OnWindowHover;
+                    Interop.ActorSignal.HoveredConnect(Layer.getCPtr(GetRootLayer()), rootLayerHoverDataCallback.ToHandleRef(this));
+                    NDalicPINVOKE.ThrowExceptionIfExists();
+                }
+                rootLayerHoverDataEventHandler += value;
+            }
+            remove
+            {
+                rootLayerHoverDataEventHandler -= value;
+                if (rootLayerHoverDataEventHandler == null && rootLayerHoverDataCallback != null)
+                {
+                    Interop.ActorSignal.HoveredDisconnect(Layer.getCPtr(GetRootLayer()), rootLayerHoverDataCallback.ToHandleRef(this));
+                    NDalicPINVOKE.ThrowExceptionIfExists();
+                    rootLayerHoverDataCallback = null;
+                }
+            }
+        }
+
+        /// <summary>
         /// Do not use this, that will be deprecated. Use 'FocusChanged' event instead.
         /// </summary>
         /// <since_tizen> 3 </since_tizen>
@@ -657,6 +690,7 @@ namespace Tizen.NUI
         private event EventHandler<WindowResizeCompletedEventArgs> resizeCompletedHandler;
         private event EventHandler<InsetsChangedEventArgs> insetsChangedEventHandler;
         private event EventHandler<PointerConstraintsEventArgs> windowPointerConstraintsEventHandler;
+        private event EventHandler<HoverEventArgs> rootLayerHoverDataEventHandler;
 
 
         internal event EventHandler EventProcessingFinished
@@ -955,6 +989,13 @@ namespace Tizen.NUI
                 signal?.Disconnect(windowPointerConstraintsEventCallback);
                 windowPointerConstraintsEventCallback = null;
             }
+
+            if (rootLayerHoverDataCallback != null)
+            {
+                Interop.ActorSignal.HoveredDisconnect(Layer.getCPtr(GetRootLayer()), rootLayerHoverDataCallback.ToHandleRef(this));
+                NDalicPINVOKE.ThrowExceptionIfExists();
+                rootLayerHoverDataCallback = null;
+            }
         }
 
         private void OnWindowFocusedChanged(IntPtr window, bool focusGained)
@@ -1265,6 +1306,23 @@ namespace Tizen.NUI
             }
         }
 
+        private bool OnWindowHover(IntPtr view, IntPtr hoverData)
+        {
+            if (hoverData == global::System.IntPtr.Zero)
+            {
+                NUILog.Error("hoverData should not be null!");
+                return false;
+            }
+
+            if (rootLayerHoverDataEventHandler != null)
+            {
+                HoverEventArgs e = new HoverEventArgs();
+                e.Hover = Tizen.NUI.Hover.GetHoverFromPtr(hoverData);
+                rootLayerHoverDataEventHandler(this, e);
+            }
+            return false;
+        }
+
         /// <summary>
         /// The focus changed event argument.
         /// </summary>
@@ -1460,6 +1518,31 @@ namespace Tizen.NUI
         }
 
         /// <summary>
+        /// Event arguments that passed via the hover signal.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public class HoverEventArgs : EventArgs
+        {
+            private Hover hover;
+
+            /// <summary>
+            /// Hover - contains touch points that represent the points that are currently being hovered or the points where a hover has stopped.
+            /// </summary>
+            [EditorBrowsable(EditorBrowsableState.Never)]
+            public Hover Hover
+            {
+                get
+                {
+                    return hover;
+                }
+                set
+                {
+                    hover = value;
+                }
+            }
+        }
+
+        /// <summary>
         /// Do not use this, that will be deprecated.
         /// </summary>
         /// <since_tizen> 3 </since_tizen>