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);