From 7d82873f2c8239b789b0ece7a1b47b1d193a23dc Mon Sep 17 00:00:00 2001 From: Tig Date: Sat, 21 Sep 2024 17:28:34 -0600 Subject: [PATCH] Re enabled ViewDiagnostics.MouseEnter --- Terminal.Gui/Application/Application.Mouse.cs | 36 ++--- Terminal.Gui/View/Adornment/Adornment.cs | 29 ++++ Terminal.Gui/View/View.Drawing.cs | 8 + Terminal.Gui/View/View.Mouse.cs | 20 ++- UICatalog/Scenarios/Mouse.cs | 31 ++-- .../Mouse/ApplicationMouseEnterLeaveTests.cs | 139 +++--------------- 6 files changed, 106 insertions(+), 157 deletions(-) diff --git a/Terminal.Gui/Application/Application.Mouse.cs b/Terminal.Gui/Application/Application.Mouse.cs index 5bbef9dde..da024f842 100644 --- a/Terminal.Gui/Application/Application.Mouse.cs +++ b/Terminal.Gui/Application/Application.Mouse.cs @@ -215,7 +215,7 @@ public static partial class Application // Mouse handling return; } - RaiseMouseEnterLeaveEvents (me.ScreenPosition, currentViewsUnderMouse, me); + RaiseMouseEnterLeaveEvents (me.ScreenPosition, currentViewsUnderMouse); WantContinuousButtonPressedView = deepestViewUnderMouse.WantContinuousButtonPressed ? deepestViewUnderMouse : null; @@ -303,8 +303,7 @@ public static partial class Application // Mouse handling /// /// The position of the mouse. /// The most recent result from GetViewsUnderMouse(). - /// TODO: Remove once MouseEnter/Leave don't use MouseEvent anymore. - internal static void RaiseMouseEnterLeaveEvents (Point screenPosition, List currentViewsUnderMouse, MouseEvent me) + internal static void RaiseMouseEnterLeaveEvents (Point screenPosition, List currentViewsUnderMouse) { // Tell any views that are no longer under the mouse that the mouse has left List viewsToLeave = _cachedViewsUnderMouse.Where (v => v is { } && !currentViewsUnderMouse.Contains (v)).ToList (); @@ -315,26 +314,10 @@ public static partial class Application // Mouse handling continue; } - if (view is Adornment adornmentView) - { - Point frameLoc = adornmentView.ScreenToFrame (screenPosition); - if (adornmentView.Parent is { } && !adornmentView.Contains (frameLoc)) - { - view.NewMouseLeaveEvent (); - } - } - else - { - Point superViewLoc = view.SuperView?.ScreenToViewport (screenPosition) ?? screenPosition; - if (!view.Contains (superViewLoc)) - { - view.NewMouseLeaveEvent (); - } - } + view.NewMouseLeaveEvent (); + _cachedViewsUnderMouse.Remove (view); } - _cachedViewsUnderMouse.Clear (); - // Tell any views that are now under the mouse that the mouse has entered and add them to the list foreach (View? view in currentViewsUnderMouse) { @@ -343,17 +326,20 @@ public static partial class Application // Mouse handling continue; } - _cachedViewsUnderMouse.Add (view); + if (!_cachedViewsUnderMouse.Contains (view)) + { + _cachedViewsUnderMouse.Add (view); + } bool raise = false; if (view is Adornment { Parent: { } } adornmentView) { - Point frameLoc = view.ScreenToFrame (me.ScreenPosition); - raise = adornmentView.Contains (frameLoc); + Point superViewLoc = adornmentView.Parent.SuperView?.ScreenToViewport (screenPosition) ?? screenPosition; + raise = adornmentView.Contains (superViewLoc); } else { - Point superViewLoc = view.SuperView?.ScreenToViewport (me.ScreenPosition) ?? me.ScreenPosition; + Point superViewLoc = view.SuperView?.ScreenToViewport (screenPosition) ?? screenPosition; raise = view.Contains (superViewLoc); } diff --git a/Terminal.Gui/View/Adornment/Adornment.cs b/Terminal.Gui/View/Adornment/Adornment.cs index af16c1b94..bc852031b 100644 --- a/Terminal.Gui/View/Adornment/Adornment.cs +++ b/Terminal.Gui/View/Adornment/Adornment.cs @@ -228,5 +228,34 @@ public class Adornment : View return Thickness.Contains (frame, location); } + ///// + //protected override bool OnMouseEnter (CancelEventArgs mouseEvent) + //{ + // // Invert Normal + // if (Diagnostics.HasFlag (ViewDiagnosticFlags.MouseEnter) && ColorScheme != null) + // { + // var cs = new ColorScheme (ColorScheme) + // { + // Normal = new (ColorScheme.Normal.Background, ColorScheme.Normal.Foreground) + // }; + // ColorScheme = cs; + // } + + // return false; + //} + + ///// + //protected override void OnMouseLeave () + //{ + // // Invert Normal + // if (Diagnostics.FastHasFlags (ViewDiagnosticFlags.MouseEnter) && ColorScheme != null) + // { + // var cs = new ColorScheme (ColorScheme) + // { + // Normal = new (ColorScheme.Normal.Background, ColorScheme.Normal.Foreground) + // }; + // ColorScheme = cs; + // } + //} #endregion Mouse Support } diff --git a/Terminal.Gui/View/View.Drawing.cs b/Terminal.Gui/View/View.Drawing.cs index 9762ba98b..e0b4cd5da 100644 --- a/Terminal.Gui/View/View.Drawing.cs +++ b/Terminal.Gui/View/View.Drawing.cs @@ -377,6 +377,14 @@ public partial class View // Drawing APIs cs = new (); } + if (Diagnostics.HasFlag (ViewDiagnosticFlags.MouseEnter) && _mouseOver) + { + cs = new ColorScheme (cs) + { + Normal = new (ColorScheme.Normal.Foreground.GetDarkerColor (), ColorScheme.Normal.Background.GetDarkerColor()), + Disabled = new (ColorScheme.Disabled.Foreground.GetDarkerColor (), ColorScheme.Disabled.Background.GetDarkerColor ()) + }; + } return Enabled ? cs.Normal : cs.Disabled; } diff --git a/Terminal.Gui/View/View.Mouse.cs b/Terminal.Gui/View/View.Mouse.cs index 040185876..7bf595dc6 100644 --- a/Terminal.Gui/View/View.Mouse.cs +++ b/Terminal.Gui/View/View.Mouse.cs @@ -1,4 +1,5 @@ #nullable enable +using System; using System.ComponentModel; namespace Terminal.Gui; @@ -136,6 +137,8 @@ public partial class View // Mouse APIs #region MouseEnterLeave + private bool _mouseOver; + /// /// INTERNAL Called by when the mouse moves over the View's . /// will @@ -172,7 +175,20 @@ public partial class View // Mouse APIs } #endif - return eventArgs.Cancel; + _mouseOver = !eventArgs.Cancel; + + if (eventArgs.Cancel) + { + return true; + } + + // Invert Normal + if (Diagnostics.HasFlag (ViewDiagnosticFlags.MouseEnter) && ColorScheme != null) + { + SetNeedsDisplay (); + } + + return false; } /// @@ -253,6 +269,8 @@ public partial class View // Mouse APIs SetHighlight (HighlightStyle.None); } #endif + + _mouseOver = false; } /// diff --git a/UICatalog/Scenarios/Mouse.cs b/UICatalog/Scenarios/Mouse.cs index fa7254613..bb4eab850 100644 --- a/UICatalog/Scenarios/Mouse.cs +++ b/UICatalog/Scenarios/Mouse.cs @@ -117,29 +117,32 @@ public class Mouse : Scenario Y = 0, Width = Dim.Fill (), Height = Dim.Func (() => demo.Padding.Thickness.Top), - Title = "inPadding" + Title = "inPadding", + Id = "inPadding" }); demo.Padding.Thickness = demo.Padding.Thickness with { Top = 5 }; } - demo.Add ( - new MouseEventDemoView () - { - X = 0, - Y = 0, - Width = Dim.Percent(30), - Height = Dim.Fill(), - Title = "sub1", - }); + View sub1 = new MouseEventDemoView () + { + X = 0, + Y = 0, + Width = Dim.Percent (20), + Height = Dim.Fill (), + Title = "sub1", + Id = "sub1", + }; + demo.Add (sub1); demo.Add ( new MouseEventDemoView () { - X = Pos.AnchorEnd(), - Y = 0, - Width = Dim.Percent (30), - Height = Dim.Fill (), + X = Pos.Right (sub1) - 4, + Y = Pos.Top (sub1) + 1, + Width = Dim.Percent (20), + Height = Dim.Fill (1), Title = "sub2", + Id = "sub2", }); win.Add (demo); diff --git a/UnitTests/Application/Mouse/ApplicationMouseEnterLeaveTests.cs b/UnitTests/Application/Mouse/ApplicationMouseEnterLeaveTests.cs index 3f48a3512..a79a7c497 100644 --- a/UnitTests/Application/Mouse/ApplicationMouseEnterLeaveTests.cs +++ b/UnitTests/Application/Mouse/ApplicationMouseEnterLeaveTests.cs @@ -58,7 +58,7 @@ public class ApplicationMouseEnterLeaveTests try { // Act - Application.RaiseMouseEnterLeaveEvents (mousePosition, currentViewsUnderMouse, mouseEvent); + Application.RaiseMouseEnterLeaveEvents (mousePosition, currentViewsUnderMouse); // Assert Assert.Equal (1, view.OnMouseEnterCalled); @@ -88,7 +88,7 @@ public class ApplicationMouseEnterLeaveTests try { // Act - Application.RaiseMouseEnterLeaveEvents (mousePosition, currentViewsUnderMouse, mouseEvent); + Application.RaiseMouseEnterLeaveEvents (mousePosition, currentViewsUnderMouse); // Assert Assert.Equal (0, view.OnMouseEnterCalled); @@ -126,12 +126,7 @@ public class ApplicationMouseEnterLeaveTests Application.RaiseMouseEnterLeaveEvents ( mousePosition, - View.GetViewsUnderMouse (mousePosition), - new() - { - Position = mousePosition, - ScreenPosition = mousePosition - }); + View.GetViewsUnderMouse (mousePosition)); // Assert Assert.Equal (0, view1.OnMouseEnterCalled); @@ -144,12 +139,7 @@ public class ApplicationMouseEnterLeaveTests Application.RaiseMouseEnterLeaveEvents ( mousePosition, - View.GetViewsUnderMouse (mousePosition), - new() - { - Position = mousePosition, - ScreenPosition = mousePosition - }); + View.GetViewsUnderMouse (mousePosition)); // Assert Assert.Equal (1, view1.OnMouseEnterCalled); @@ -162,12 +152,7 @@ public class ApplicationMouseEnterLeaveTests Application.RaiseMouseEnterLeaveEvents ( mousePosition, - View.GetViewsUnderMouse (mousePosition), - new() - { - Position = mousePosition, - ScreenPosition = mousePosition - }); + View.GetViewsUnderMouse (mousePosition)); // Assert Assert.Equal (1, view1.OnMouseEnterCalled); @@ -180,12 +165,7 @@ public class ApplicationMouseEnterLeaveTests Application.RaiseMouseEnterLeaveEvents ( mousePosition, - View.GetViewsUnderMouse (mousePosition), - new() - { - Position = mousePosition, - ScreenPosition = mousePosition - }); + View.GetViewsUnderMouse (mousePosition)); // Assert Assert.Equal (1, view1.OnMouseEnterCalled); @@ -198,12 +178,7 @@ public class ApplicationMouseEnterLeaveTests Application.RaiseMouseEnterLeaveEvents ( mousePosition, - View.GetViewsUnderMouse (mousePosition), - new() - { - Position = mousePosition, - ScreenPosition = mousePosition - }); + View.GetViewsUnderMouse (mousePosition)); // Assert Assert.Equal (1, view1.OnMouseEnterCalled); @@ -235,7 +210,7 @@ public class ApplicationMouseEnterLeaveTests try { // Act - Application.RaiseMouseEnterLeaveEvents (mousePosition, currentViewsUnderMouse, mouseEvent); + Application.RaiseMouseEnterLeaveEvents (mousePosition, currentViewsUnderMouse); // Assert Assert.Equal (0, view.OnMouseEnterCalled); @@ -278,12 +253,7 @@ public class ApplicationMouseEnterLeaveTests Application.RaiseMouseEnterLeaveEvents ( mousePosition, - View.GetViewsUnderMouse (mousePosition), - new() - { - Position = mousePosition, - ScreenPosition = mousePosition - }); + View.GetViewsUnderMouse (mousePosition)); // Assert Assert.Equal (0, view1.OnMouseEnterCalled); @@ -296,12 +266,7 @@ public class ApplicationMouseEnterLeaveTests Application.RaiseMouseEnterLeaveEvents ( mousePosition, - View.GetViewsUnderMouse (mousePosition), - new() - { - Position = mousePosition, - ScreenPosition = mousePosition - }); + View.GetViewsUnderMouse (mousePosition)); // Assert Assert.Equal (1, view1.OnMouseEnterCalled); @@ -314,12 +279,7 @@ public class ApplicationMouseEnterLeaveTests Application.RaiseMouseEnterLeaveEvents ( mousePosition, - View.GetViewsUnderMouse (mousePosition), - new() - { - Position = mousePosition, - ScreenPosition = mousePosition - }); + View.GetViewsUnderMouse (mousePosition)); // Assert Assert.Equal (1, view1.OnMouseEnterCalled); @@ -332,12 +292,7 @@ public class ApplicationMouseEnterLeaveTests Application.RaiseMouseEnterLeaveEvents ( mousePosition, - View.GetViewsUnderMouse (mousePosition), - new() - { - Position = mousePosition, - ScreenPosition = mousePosition - }); + View.GetViewsUnderMouse (mousePosition)); // Assert Assert.Equal (1, view1.OnMouseEnterCalled); @@ -350,12 +305,7 @@ public class ApplicationMouseEnterLeaveTests Application.RaiseMouseEnterLeaveEvents ( mousePosition, - View.GetViewsUnderMouse (mousePosition), - new() - { - Position = mousePosition, - ScreenPosition = mousePosition - }); + View.GetViewsUnderMouse (mousePosition)); // Assert Assert.Equal (1, view1.OnMouseEnterCalled); @@ -368,12 +318,7 @@ public class ApplicationMouseEnterLeaveTests Application.RaiseMouseEnterLeaveEvents ( mousePosition, - View.GetViewsUnderMouse (mousePosition), - new() - { - Position = mousePosition, - ScreenPosition = mousePosition - }); + View.GetViewsUnderMouse (mousePosition)); // Assert Assert.Equal (1, view1.OnMouseEnterCalled); @@ -425,12 +370,7 @@ public class ApplicationMouseEnterLeaveTests Application.RaiseMouseEnterLeaveEvents ( mousePosition, - View.GetViewsUnderMouse (mousePosition), - new() - { - Position = mousePosition, - ScreenPosition = mousePosition - }); + View.GetViewsUnderMouse (mousePosition)); // Assert Assert.Equal (0, view1.OnMouseEnterCalled); @@ -443,12 +383,7 @@ public class ApplicationMouseEnterLeaveTests Application.RaiseMouseEnterLeaveEvents ( mousePosition, - View.GetViewsUnderMouse (mousePosition), - new() - { - Position = mousePosition, - ScreenPosition = mousePosition - }); + View.GetViewsUnderMouse (mousePosition)); // Assert Assert.Equal (1, view1.OnMouseEnterCalled); @@ -461,12 +396,7 @@ public class ApplicationMouseEnterLeaveTests Application.RaiseMouseEnterLeaveEvents ( mousePosition, - View.GetViewsUnderMouse (mousePosition), - new() - { - Position = mousePosition, - ScreenPosition = mousePosition - }); + View.GetViewsUnderMouse (mousePosition)); // Assert Assert.Equal (2, view1.OnMouseEnterCalled); @@ -479,12 +409,7 @@ public class ApplicationMouseEnterLeaveTests Application.RaiseMouseEnterLeaveEvents ( mousePosition, - View.GetViewsUnderMouse (mousePosition), - new() - { - Position = mousePosition, - ScreenPosition = mousePosition - }); + View.GetViewsUnderMouse (mousePosition)); // Assert Assert.Equal (2, view1.OnMouseEnterCalled); @@ -497,12 +422,7 @@ public class ApplicationMouseEnterLeaveTests Application.RaiseMouseEnterLeaveEvents ( mousePosition, - View.GetViewsUnderMouse (mousePosition), - new() - { - Position = mousePosition, - ScreenPosition = mousePosition - }); + View.GetViewsUnderMouse (mousePosition)); // Assert Assert.Equal (3, view1.OnMouseEnterCalled); @@ -515,12 +435,7 @@ public class ApplicationMouseEnterLeaveTests Application.RaiseMouseEnterLeaveEvents ( mousePosition, - View.GetViewsUnderMouse (mousePosition), - new() - { - Position = mousePosition, - ScreenPosition = mousePosition - }); + View.GetViewsUnderMouse (mousePosition)); // Assert Assert.Equal (3, view1.OnMouseEnterCalled); @@ -533,12 +448,7 @@ public class ApplicationMouseEnterLeaveTests Application.RaiseMouseEnterLeaveEvents ( mousePosition, - View.GetViewsUnderMouse (mousePosition), - new() - { - Position = mousePosition, - ScreenPosition = mousePosition - }); + View.GetViewsUnderMouse (mousePosition)); // Assert Assert.Equal (3, view1.OnMouseEnterCalled); @@ -551,12 +461,7 @@ public class ApplicationMouseEnterLeaveTests Application.RaiseMouseEnterLeaveEvents ( mousePosition, - View.GetViewsUnderMouse (mousePosition), - new() - { - Position = mousePosition, - ScreenPosition = mousePosition - }); + View.GetViewsUnderMouse (mousePosition)); // Assert Assert.Equal (4, view1.OnMouseEnterCalled);