diff --git a/Terminal.Gui/Core/Application.cs b/Terminal.Gui/Core/Application.cs index 9229934a0..aeefe0aa6 100644 --- a/Terminal.Gui/Core/Application.cs +++ b/Terminal.Gui/Core/Application.cs @@ -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 { /// public static View MouseGrabView => mouseGrabView; + /// + /// Event to be invoked when a view want grab the mouse which can be canceled. + /// + public static event EventHandler GrabbingMouse; + + /// + /// Event to be invoked when a view want ungrab the mouse which can be canceled. + /// + public static event EventHandler UnGrabbingMouse; + /// /// Event to be invoked when a view grab the mouse. /// @@ -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 (); + } } /// @@ -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 (); } diff --git a/Terminal.Gui/Core/Toplevel.cs b/Terminal.Gui/Core/Toplevel.cs index 02727aa39..7995337ba 100644 --- a/Terminal.Gui/Core/Toplevel.cs +++ b/Terminal.Gui/Core/Toplevel.cs @@ -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)); } /// @@ -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; + } + } + /// /// Invoked when the is changed. /// @@ -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}");