mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2025-12-28 16:58:01 +01:00
Recovering GrabbingMouse and UnGrabbingMouse implementation.
This commit is contained in:
@@ -162,7 +162,7 @@ namespace Terminal.Gui {
|
||||
if (alternateForwardKey != value) {
|
||||
var oldKey = alternateForwardKey;
|
||||
alternateForwardKey = value;
|
||||
OnAlternateForwardKeyChanged (new KeyChangedEventArgs(oldKey,value));
|
||||
OnAlternateForwardKeyChanged (new KeyChangedEventArgs (oldKey, value));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -186,7 +186,7 @@ namespace Terminal.Gui {
|
||||
if (alternateBackwardKey != value) {
|
||||
var oldKey = alternateBackwardKey;
|
||||
alternateBackwardKey = value;
|
||||
OnAlternateBackwardKeyChanged (new KeyChangedEventArgs(oldKey,value));
|
||||
OnAlternateBackwardKeyChanged (new KeyChangedEventArgs (oldKey, value));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -210,7 +210,7 @@ namespace Terminal.Gui {
|
||||
if (quitKey != value) {
|
||||
var oldKey = quitKey;
|
||||
quitKey = value;
|
||||
OnQuitKeyChanged (new KeyChangedEventArgs(oldKey,value));
|
||||
OnQuitKeyChanged (new KeyChangedEventArgs (oldKey, value));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -720,6 +720,16 @@ namespace Terminal.Gui {
|
||||
/// </summary>
|
||||
public static View MouseGrabView => mouseGrabView;
|
||||
|
||||
/// <summary>
|
||||
/// Event to be invoked when a view want grab the mouse which can be canceled.
|
||||
/// </summary>
|
||||
public static event EventHandler<GrabMouseEventArgs> GrabbingMouse;
|
||||
|
||||
/// <summary>
|
||||
/// Event to be invoked when a view want ungrab the mouse which can be canceled.
|
||||
/// </summary>
|
||||
public static event EventHandler<GrabMouseEventArgs> UnGrabbingMouse;
|
||||
|
||||
/// <summary>
|
||||
/// Event to be invoked when a view grab the mouse.
|
||||
/// </summary>
|
||||
@@ -739,9 +749,11 @@ namespace Terminal.Gui {
|
||||
{
|
||||
if (view == null)
|
||||
return;
|
||||
OnGrabbedMouse (view);
|
||||
mouseGrabView = view;
|
||||
Driver.UncookMouse ();
|
||||
if (!OnGrabbingMouse (view)) {
|
||||
OnGrabbedMouse (view);
|
||||
mouseGrabView = view;
|
||||
Driver.UncookMouse ();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -751,16 +763,36 @@ namespace Terminal.Gui {
|
||||
{
|
||||
if (mouseGrabView == null)
|
||||
return;
|
||||
OnUnGrabbedMouse (mouseGrabView);
|
||||
mouseGrabView = null;
|
||||
Driver.CookMouse ();
|
||||
if (!OnUnGrabbingMouse (mouseGrabView)) {
|
||||
OnUnGrabbedMouse (mouseGrabView);
|
||||
mouseGrabView = null;
|
||||
Driver.CookMouse ();
|
||||
}
|
||||
}
|
||||
|
||||
static bool OnGrabbingMouse (View view)
|
||||
{
|
||||
if (view == null)
|
||||
return false;
|
||||
var evArgs = new GrabMouseEventArgs (view);
|
||||
GrabbingMouse?.Invoke (view, evArgs);
|
||||
return evArgs.Cancel;
|
||||
}
|
||||
|
||||
static bool OnUnGrabbingMouse (View view)
|
||||
{
|
||||
if (view == null)
|
||||
return false;
|
||||
var evArgs = new GrabMouseEventArgs (view);
|
||||
UnGrabbingMouse?.Invoke (view, evArgs);
|
||||
return evArgs.Cancel;
|
||||
}
|
||||
|
||||
static void OnGrabbedMouse (View view)
|
||||
{
|
||||
if (view == null)
|
||||
return;
|
||||
GrabbedMouse?.Invoke (view, new ViewEventArgs(view));
|
||||
GrabbedMouse?.Invoke (view, new ViewEventArgs (view));
|
||||
}
|
||||
|
||||
static void OnUnGrabbedMouse (View view)
|
||||
@@ -1029,7 +1061,7 @@ namespace Terminal.Gui {
|
||||
Driver.Refresh ();
|
||||
}
|
||||
|
||||
NotifyNewRunState?.Invoke (toplevel, new RunStateEventArgs(rs));
|
||||
NotifyNewRunState?.Invoke (toplevel, new RunStateEventArgs (rs));
|
||||
return rs;
|
||||
}
|
||||
|
||||
@@ -1497,7 +1529,7 @@ namespace Terminal.Gui {
|
||||
static void OnNotifyStopRunState (Toplevel top)
|
||||
{
|
||||
if (ExitRunLoopAfterFirstIteration) {
|
||||
NotifyStopRunState?.Invoke (top, new ToplevelEventArgs(top));
|
||||
NotifyStopRunState?.Invoke (top, new ToplevelEventArgs (top));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1516,7 +1548,7 @@ namespace Terminal.Gui {
|
||||
t.SetRelativeLayout (full);
|
||||
t.LayoutSubviews ();
|
||||
t.PositionToplevels ();
|
||||
t.OnResized (new SizeChangedEventArgs(full.Size));
|
||||
t.OnResized (new SizeChangedEventArgs (full.Size));
|
||||
}
|
||||
Refresh ();
|
||||
}
|
||||
|
||||
@@ -120,7 +120,7 @@ namespace Terminal.Gui {
|
||||
|
||||
internal virtual void OnChildUnloaded (Toplevel top)
|
||||
{
|
||||
ChildUnloaded?.Invoke (this, new ToplevelEventArgs(top));
|
||||
ChildUnloaded?.Invoke (this, new ToplevelEventArgs (top));
|
||||
}
|
||||
|
||||
internal virtual void OnChildLoaded (Toplevel top)
|
||||
@@ -159,7 +159,7 @@ namespace Terminal.Gui {
|
||||
|
||||
internal virtual void OnActivate (Toplevel deactivated)
|
||||
{
|
||||
Activate?.Invoke (this, new ToplevelEventArgs(deactivated));
|
||||
Activate?.Invoke (this, new ToplevelEventArgs (deactivated));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -221,6 +221,9 @@ namespace Terminal.Gui {
|
||||
{
|
||||
ColorScheme = Colors.TopLevel;
|
||||
|
||||
Application.GrabbingMouse += Application_GrabbingMouse;
|
||||
Application.UnGrabbingMouse += Application_UnGrabbingMouse;
|
||||
|
||||
// Things this view knows how to do
|
||||
AddCommand (Command.QuitToplevel, () => { QuitToplevel (); return true; });
|
||||
AddCommand (Command.Suspend, () => { Driver.Suspend (); ; return true; });
|
||||
@@ -256,6 +259,20 @@ namespace Terminal.Gui {
|
||||
AddKeyBinding (Key.L | Key.CtrlMask, Command.Refresh);
|
||||
}
|
||||
|
||||
private void Application_UnGrabbingMouse (object sender, GrabMouseEventArgs e)
|
||||
{
|
||||
if (Application.MouseGrabView == this && dragPosition.HasValue) {
|
||||
e.Cancel = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void Application_GrabbingMouse (object sender, GrabMouseEventArgs e)
|
||||
{
|
||||
if (Application.MouseGrabView == this && dragPosition.HasValue) {
|
||||
e.Cancel = true;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Invoked when the <see cref="Application.AlternateForwardKey"/> is changed.
|
||||
/// </summary>
|
||||
@@ -824,8 +841,8 @@ namespace Terminal.Gui {
|
||||
}
|
||||
|
||||
if (mouseEvent.Flags.HasFlag (MouseFlags.Button1Released) && dragPosition.HasValue) {
|
||||
Application.UngrabMouse ();
|
||||
dragPosition = null;
|
||||
Application.UngrabMouse ();
|
||||
}
|
||||
|
||||
//System.Diagnostics.Debug.WriteLine ($"dragPosition after: {dragPosition.HasValue}");
|
||||
|
||||
Reference in New Issue
Block a user