Re enabled ViewDiagnostics.MouseEnter

This commit is contained in:
Tig
2024-09-21 17:28:34 -06:00
parent f512cd49c3
commit 7d82873f2c
6 changed files with 106 additions and 157 deletions

View File

@@ -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
/// </summary>
/// <param name="screenPosition">The position of the mouse.</param>
/// <param name="currentViewsUnderMouse">The most recent result from GetViewsUnderMouse().</param>
/// <param name="me">TODO: Remove once MouseEnter/Leave don't use MouseEvent anymore.</param>
internal static void RaiseMouseEnterLeaveEvents (Point screenPosition, List<View?> currentViewsUnderMouse, MouseEvent me)
internal static void RaiseMouseEnterLeaveEvents (Point screenPosition, List<View?> currentViewsUnderMouse)
{
// Tell any views that are no longer under the mouse that the mouse has left
List<View?> 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);
}

View File

@@ -228,5 +228,34 @@ public class Adornment : View
return Thickness.Contains (frame, location);
}
///// <inheritdoc/>
//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;
//}
///// <inheritdoc/>
//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
}

View File

@@ -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;
}

View File

@@ -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;
/// <summary>
/// INTERNAL Called by <see cref="Application.OnMouseEvent"/> when the mouse moves over the View's <see cref="Frame"/>.
/// <see cref="MouseLeave"/> 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;
}
/// <summary>
@@ -253,6 +269,8 @@ public partial class View // Mouse APIs
SetHighlight (HighlightStyle.None);
}
#endif
_mouseOver = false;
}
/// <summary>

View File

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

View File

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