From 5c850520db4ffd09ae01f648c3279ea1ca0a73c9 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jean-Philippe=20Bruy=C3=A8re?= Date: Sat, 3 Aug 2019 00:19:35 +0200 Subject: [PATCH] mouse cursor handling with glfw3 --- Crow/src/Enums.cs | 9 ++++ Crow/src/GraphicObjects/Label.cs | 6 +-- Crow/src/GraphicObjects/Splitter.cs | 9 ++-- Crow/src/GraphicObjects/Window.cs | 64 ++++++++++++------------- Crow/src/Interface.cs | 20 +++++--- Crow/src/MouseCursorChangedEventArgs.cs | 16 +++---- Samples/ShowCase/main.cs | 30 ++++++++---- Samples/common/CrowWin.cs | 57 ++++++++++++++++------ 8 files changed, 135 insertions(+), 76 deletions(-) diff --git a/Crow/src/Enums.cs b/Crow/src/Enums.cs index 8b90d6ea..9f831ece 100644 --- a/Crow/src/Enums.cs +++ b/Crow/src/Enums.cs @@ -62,4 +62,13 @@ namespace Crow Bottom, Center, } + public enum MouseCursor + { + Arrow, + IBeam, + Crosshair, + Hand, + HResize, + VResize + } } diff --git a/Crow/src/GraphicObjects/Label.cs b/Crow/src/GraphicObjects/Label.cs index 0cd38688..3c9f3f89 100644 --- a/Crow/src/GraphicObjects/Label.cs +++ b/Crow/src/GraphicObjects/Label.cs @@ -689,13 +689,13 @@ namespace Crow public override void onMouseEnter (object sender, MouseMoveEventArgs e) { base.onMouseEnter (sender, e); - //if (Selectable) - //IFace.MouseCursor = MouseCursors.Text; + if (Selectable) + IFace.MouseCursor = MouseCursor.IBeam; } public override void onMouseLeave (object sender, MouseMoveEventArgs e) { base.onMouseLeave (sender, e); - //IFace.MouseCursor = MouseCursors.Default; + IFace.MouseCursor = MouseCursor.Arrow; } protected override void onFocused (object sender, EventArgs e) { diff --git a/Crow/src/GraphicObjects/Splitter.cs b/Crow/src/GraphicObjects/Splitter.cs index cc0ba323..58ba94fc 100644 --- a/Crow/src/GraphicObjects/Splitter.cs +++ b/Crow/src/GraphicObjects/Splitter.cs @@ -90,14 +90,15 @@ namespace Crow public override void onMouseEnter (object sender, MouseMoveEventArgs e) { base.onMouseEnter (sender, e); - //if ((Parent as GenericStack).Orientation == Orientation.Horizontal) - // IFace.MouseCursor = MouseCursors.H; - //else - //IFace.MouseCursor = MouseCursors.V; + if ((Parent as GenericStack).Orientation == Orientation.Horizontal) + IFace.MouseCursor = MouseCursor.HResize; + else + IFace.MouseCursor = MouseCursor.VResize; } public override void onMouseLeave (object sender, MouseMoveEventArgs e) { base.onMouseLeave (sender, e); + IFace.MouseCursor = MouseCursor.Arrow; } public override void onMouseDown (object sender, MouseButtonEventArgs e) { diff --git a/Crow/src/GraphicObjects/Window.cs b/Crow/src/GraphicObjects/Window.cs index 82080836..9f3785cf 100644 --- a/Crow/src/GraphicObjects/Window.cs +++ b/Crow/src/GraphicObjects/Window.cs @@ -296,7 +296,7 @@ namespace Crow if (!hoverBorder) { currentDirection = Direction.None; - //IFace.MouseCursor = MouseCursors.Default; + IFace.MouseCursor = MouseCursor.Arrow; return; } @@ -330,37 +330,37 @@ namespace Crow else currentDirection = Direction.None; - //if (currentDirection != lastDir) { - // switch (currentDirection) { - // case Direction.None: - // otkgw.MouseCursor = MouseCursors.Default; - // break; - // case Direction.N: - // otkgw.MouseCursor = MouseCursors.V; - // break; - // case Direction.S: - // otkgw.MouseCursor = MouseCursors.V; - // break; - // case Direction.E: - // otkgw.MouseCursor = MouseCursors.H; - // break; - // case Direction.W: - // otkgw.MouseCursor = MouseCursors.H; - // break; - // case Direction.NW: - // otkgw.MouseCursor = MouseCursors.NW; - // break; - // case Direction.NE: - // otkgw.MouseCursor = MouseCursors.NE; - // break; - // case Direction.SW: - // otkgw.MouseCursor = MouseCursors.SW; - // break; - // case Direction.SE: - // otkgw.MouseCursor = MouseCursors.SE; - // break; - // } - //} + if (currentDirection != lastDir) { + switch (currentDirection) { + case Direction.None: + otkgw.MouseCursor = MouseCursor.Arrow; + break; + case Direction.N: + otkgw.MouseCursor = MouseCursor.VResize; + break; + case Direction.S: + otkgw.MouseCursor = MouseCursor.VResize; + break; + case Direction.E: + otkgw.MouseCursor = MouseCursor.HResize; + break; + case Direction.W: + otkgw.MouseCursor = MouseCursor.HResize; + break; + /*case Direction.NW: + otkgw.MouseCursor = MouseCursor.NW; + break; + case Direction.NE: + otkgw.MouseCursor = MouseCursor.NE; + break; + case Direction.SW: + otkgw.MouseCursor = MouseCursor.SW; + break; + case Direction.SE: + otkgw.MouseCursor = MouseCursor.SE; + break;*/ + } + } } } public override void onMouseDown (object sender, MouseButtonEventArgs e) diff --git a/Crow/src/Interface.cs b/Crow/src/Interface.cs index cd3810b3..9073b0d5 100644 --- a/Crow/src/Interface.cs +++ b/Crow/src/Interface.cs @@ -920,17 +920,25 @@ namespace Crow } #region Mouse and Keyboard Handling - + /// + /// Connect to this event to receive mouse cursor change request from crom. + /// + public event EventHandler MouseCursorChanged; public MouseState Mouse; + Stopwatch lastMouseDown = new Stopwatch (), mouseRepeatTimer = new Stopwatch (); int mouseRepeatCount; MouseButtonEventArgs lastMouseDownEvent; + MouseCursor cursor = MouseCursor.Arrow; - //public MouseCursors MouseCursor { - // set { - // //backend.SetCursor (value); - // } - //} + public MouseCursor MouseCursor { + set { + if (value == cursor) + return; + cursor = value; + MouseCursorChanged.Raise (this, new MouseCursorChangedEventArgs (cursor)); + } + } /// Processes mouse move events from the root container, this function /// should be called by the host on mouse move event to forward events to crow interfaces /// true if mouse is in the interface diff --git a/Crow/src/MouseCursorChangedEventArgs.cs b/Crow/src/MouseCursorChangedEventArgs.cs index 850ee9c2..5e58b861 100644 --- a/Crow/src/MouseCursorChangedEventArgs.cs +++ b/Crow/src/MouseCursorChangedEventArgs.cs @@ -28,12 +28,12 @@ using System; namespace Crow { - //public class MouseCursorChangedEventArgs : EventArgs - //{ - // public XCursor NewCursor; - // public MouseCursorChangedEventArgs (XCursor newCursor) : base() - // { - // NewCursor = newCursor; - // } - //} + public class MouseCursorChangedEventArgs : EventArgs + { + public MouseCursor NewCursor; + public MouseCursorChangedEventArgs (MouseCursor newCursor) : base() + { + NewCursor = newCursor; + } + } } diff --git a/Samples/ShowCase/main.cs b/Samples/ShowCase/main.cs index 9c93758b..eb9e0260 100644 --- a/Samples/ShowCase/main.cs +++ b/Samples/ShowCase/main.cs @@ -1,5 +1,6 @@ using System.IO; using Crow; +using Glfw; namespace HelloWorld { @@ -8,6 +9,10 @@ namespace HelloWorld class Program : CrowVkWin { static void Main (string[] args) { + //CVKL.Instance.VALIDATION = true; + //CVKL.Instance.DEBUG_UTILS = true; + CVKL.SwapChain.IMAGES_USAGE = VK.VkImageUsageFlags.ColorAttachment | VK.VkImageUsageFlags.TransferDst; + //CVKL.Instance.RENDER_DOC_CAPTURE = true; using (Program vke = new Program ()) { vke.Run (); } @@ -23,6 +28,11 @@ namespace HelloWorld hideError (); } + protected override void onKeyDown (Glfw.Key key, int scanCode, Modifier modifiers) + { + base.onKeyDown (key, scanCode, modifiers); + } + void Dv_SelectedItemChanged (object sender, SelectionChangeEventArgs e) { FileSystemInfo fi = e.NewValue as FileSystemInfo; @@ -31,15 +41,6 @@ namespace HelloWorld if (fi is DirectoryInfo) return; hideError (); - lock (crow.UpdateMutex) { - try { - Widget g = crow.Load (fi.FullName); - crowContainer.SetChild (g); - g.DataSource = this; - } catch (Crow.IML.InstantiatorException ex) { - showError (ex); - } - } string source = ""; using (Stream s = new FileStream (fi.FullName, FileMode.Open)) { @@ -48,8 +49,19 @@ namespace HelloWorld } } NotifyValueChanged ("source", source); + + lock (crow.UpdateMutex) { + try { + Widget g = crow.CreateInstance (fi.FullName); + crowContainer.SetChild (g); + g.DataSource = this; + } catch (Crow.IML.InstantiatorException ex) { + showError (ex); + } + } } + void showError (Crow.IML.InstantiatorException ex) { NotifyValueChanged ("ErrorMessage", ex.Path + ": " + ex.InnerException.Message); diff --git a/Samples/common/CrowWin.cs b/Samples/common/CrowWin.cs index 666267e5..8fe1e025 100644 --- a/Samples/common/CrowWin.cs +++ b/Samples/common/CrowWin.cs @@ -23,6 +23,7 @@ namespace Crow protected CrowVkWin() : base() { + Thread crowThread = new Thread(crow_thread_func); crowThread.IsBackground = true; crowThread.Start(); @@ -60,6 +61,7 @@ namespace Crow vkvg.SampleCount.Sample_8, presentQueue.index); crow = new Crow.Interface (vkvgDev, 800, 600); + crow.MouseCursorChanged +=Crow_MouseCursorChanged;; isRunning = true; while (isRunning) { @@ -72,6 +74,33 @@ namespace Crow crow = null; } + void Crow_MouseCursorChanged (object sender, MouseCursorChangedEventArgs e) + { + switch (e.NewCursor) { + case MouseCursor.Arrow: + SetCursor (Glfw.CursorShape.Arrow); + break; + case MouseCursor.IBeam: + SetCursor (Glfw.CursorShape.IBeam); + break; + case MouseCursor.Crosshair: + SetCursor (Glfw.CursorShape.Crosshair); + break; + case MouseCursor.Hand: + SetCursor (Glfw.CursorShape.Hand); + break; + case MouseCursor.HResize: + SetCursor (Glfw.CursorShape.HResize); + break; + case MouseCursor.VResize: + SetCursor (Glfw.CursorShape.VResize); + break; + default: + SetCursor (Glfw.CursorShape.Crosshair); + break; + } + } + void initUISurface () { lock (crow.UpdateMutex) { uiImage?.Dispose (); @@ -99,8 +128,8 @@ namespace Crow VkImageLayout.Undefined, VkImageLayout.TransferDstOptimal, VkPipelineStageFlags.BottomOfPipe, VkPipelineStageFlags.Transfer); uiImage.SetLayout (cmd, VkImageAspectFlags.Color, - VkImageLayout.ColorAttachmentOptimal, VkImageLayout.TransferSrcOptimal, - VkPipelineStageFlags.ColorAttachmentOutput, VkPipelineStageFlags.Transfer); + VkImageLayout.Undefined, VkImageLayout.TransferSrcOptimal, + VkPipelineStageFlags.Transfer, VkPipelineStageFlags.Transfer); VkImageSubresourceLayers imgSubResLayer = new VkImageSubresourceLayers { aspectMask = VkImageAspectFlags.Color, @@ -151,13 +180,13 @@ namespace Crow } #region Mouse and keyboard - //protected override void onScroll (double xOffset, double yOffset) - //{ - // if (KeyModifiers.HasFlag (Glfw.Modifier.Shift)) - // crow.ProcessMouseWheelChanged ((float)xOffset); - // else - // crow.ProcessMouseWheelChanged ((float)yOffset); - //} + protected override void onScroll (double xOffset, double yOffset) + { + if (KeyModifiers.HasFlag (Glfw.Modifier.Shift)) + crow.ProcessMouseWheelChanged ((float)xOffset); + else + crow.ProcessMouseWheelChanged ((float)yOffset); + } protected override void onMouseMove (double xPos, double yPos) { if (crow.ProcessMouseMove ((int)xPos, (int)yPos)) @@ -185,11 +214,11 @@ namespace Crow if (crow.ProcessKeyUp ((Crow.Key)key)) return; } - //protected override void onChar (Glfw.CodePoint cp) - //{ - // if (crow.ProcessKeyPress (cp.ToChar ())) - // return; - //} + protected override void onChar (Glfw.CodePoint cp) + { + if (crow.ProcessKeyPress (cp.ToChar ())) + return; + } #endregion #region dispose -- 2.47.3