From 8a6c2a9fc15cefee63a9a9e44ba3b16adc8ad669 Mon Sep 17 00:00:00 2001 From: BDisp Date: Mon, 20 Apr 2020 20:26:32 +0100 Subject: [PATCH] Mouse events menu (#401) * Fixes an issue in the sln file that despite not having been changed, git reports as changed. * Adding some settings for crlf and user specific. * Prevent button clicked event if the point of the pressed and released don't match. Also decreases the delay for the triple click. * Changes the menu button clicked event to button pressed to improve mouse clicks. * Removed the action that was running all the time after the first running. --- .editorconfig | 1 + .gitignore | 5 ++-- Terminal.Gui/Drivers/WindowsDriver.cs | 40 ++++++++++++++++++--------- Terminal.Gui/Views/Menu.cs | 26 ++++++++--------- 4 files changed, 44 insertions(+), 28 deletions(-) diff --git a/.editorconfig b/.editorconfig index 576839082..040e7abd9 100644 --- a/.editorconfig +++ b/.editorconfig @@ -6,6 +6,7 @@ csharp_new_line_before_open_brace = methods,local_functions csharp_new_line_before_else = false csharp_new_line_before_catch = false csharp_new_line_before_finally = false +end_of_line = crlf csharp_indent_case_contents = true csharp_indent_switch_labels = false diff --git a/.gitignore b/.gitignore index c4865c0ac..632d369b3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,9 @@ bin obj -*~ +~$* *.userprefs *~ packages .vs -*.csproj.user +# User-specific files +*.user diff --git a/Terminal.Gui/Drivers/WindowsDriver.cs b/Terminal.Gui/Drivers/WindowsDriver.cs index 1dcaf34fc..de779c614 100644 --- a/Terminal.Gui/Drivers/WindowsDriver.cs +++ b/Terminal.Gui/Drivers/WindowsDriver.cs @@ -610,6 +610,7 @@ namespace Terminal.Gui { WindowsConsole.ButtonState? LastMouseButtonPressed = null; bool IsButtonReleased = false; bool IsButtonDoubleClicked = false; + Point point; MouseEvent ToDriverMouse (WindowsConsole.MouseEventRecord mouseEvent) { @@ -617,8 +618,8 @@ namespace Terminal.Gui { if (IsButtonDoubleClicked) { Task.Run (async () => { - await Task.Delay (300); - _ = new Action (() => IsButtonDoubleClicked = false); + await Task.Delay (100); + IsButtonDoubleClicked = false; }); } @@ -649,8 +650,15 @@ namespace Terminal.Gui { break; } - if (mouseEvent.EventFlags == WindowsConsole.EventFlags.MouseMoved) + if (mouseEvent.EventFlags == WindowsConsole.EventFlags.MouseMoved) { mouseFlag |= MouseFlags.ReportMousePosition; + point = new Point (); + } else { + point = new Point () { + X = mouseEvent.MousePosition.X, + Y = mouseEvent.MousePosition.Y + }; + } LastMouseButtonPressed = mouseEvent.ButtonState; } else if (mouseEvent.EventFlags == 0 && LastMouseButtonPressed != null && !IsButtonReleased && !IsButtonDoubleClicked) { @@ -670,18 +678,24 @@ namespace Terminal.Gui { IsButtonReleased = true; } else if ((mouseEvent.EventFlags == 0 || mouseEvent.EventFlags == WindowsConsole.EventFlags.MouseMoved) && IsButtonReleased) { - switch (LastMouseButtonPressed) { - case WindowsConsole.ButtonState.Button1Pressed: - mouseFlag = MouseFlags.Button1Clicked; - break; + var p = new Point () { + X = mouseEvent.MousePosition.X, + Y = mouseEvent.MousePosition.Y + }; + if (p == point) { + switch (LastMouseButtonPressed) { + case WindowsConsole.ButtonState.Button1Pressed: + mouseFlag = MouseFlags.Button1Clicked; + break; - case WindowsConsole.ButtonState.Button2Pressed: - mouseFlag = MouseFlags.Button2Clicked; - break; + case WindowsConsole.ButtonState.Button2Pressed: + mouseFlag = MouseFlags.Button2Clicked; + break; - case WindowsConsole.ButtonState.RightmostButtonPressed: - mouseFlag = MouseFlags.Button4Clicked; - break; + case WindowsConsole.ButtonState.RightmostButtonPressed: + mouseFlag = MouseFlags.Button4Clicked; + break; + } } LastMouseButtonPressed = null; IsButtonReleased = false; diff --git a/Terminal.Gui/Views/Menu.cs b/Terminal.Gui/Views/Menu.cs index 2c118c237..3b6bc1ccd 100644 --- a/Terminal.Gui/Views/Menu.cs +++ b/Terminal.Gui/Views/Menu.cs @@ -432,7 +432,7 @@ namespace Terminal.Gui { } host.handled = false; bool disabled; - if (me.Flags == MouseFlags.Button1Clicked || me.Flags == MouseFlags.Button1Released) { + if (me.Flags == MouseFlags.Button1Pressed) { disabled = false; if (me.Y < 1) return true; @@ -525,7 +525,7 @@ namespace Terminal.Gui { Width = Dim.Fill (); Height = 1; Menus = menus; - CanFocus = true; + //CanFocus = true; selected = -1; selectedSub = -1; ColorScheme = Colors.Menu; @@ -984,13 +984,13 @@ namespace Terminal.Gui { } handled = false; - if (me.Flags == MouseFlags.Button1Clicked || + if (me.Flags == MouseFlags.Button1Pressed || (me.Flags == MouseFlags.ReportMousePosition && selected > -1)) { int pos = 1; int cx = me.X; for (int i = 0; i < Menus.Length; i++) { if (cx > pos && me.X < pos + 1 + Menus [i].TitleLength) { - if (selected == i && me.Flags == MouseFlags.Button1Clicked && !isMenuClosed) { + if (selected == i && me.Flags == MouseFlags.Button1Pressed && !isMenuClosed) { Application.UngrabMouse (); if (Menus [i].IsTopLevel) { var menu = new Menu (this, i, 0, Menus [i]); @@ -998,7 +998,7 @@ namespace Terminal.Gui { } else { CloseMenu (); } - } else if (me.Flags == MouseFlags.Button1Clicked && isMenuClosed) { + } else if (me.Flags == MouseFlags.Button1Pressed && isMenuClosed) { if (Menus [i].IsTopLevel) { var menu = new Menu (this, i, 0, Menus [i]); menu.Run (Menus [i].Action); @@ -1033,7 +1033,7 @@ namespace Terminal.Gui { Application.GrabMouse (me.View); me.View.MouseEvent (me); } - } else if (!(me.View is MenuBar || me.View is Menu) && me.Flags.HasFlag (MouseFlags.Button1Clicked)) { + } else if (!(me.View is MenuBar || me.View is Menu) && me.Flags.HasFlag (MouseFlags.Button1Pressed)) { Application.UngrabMouse (); CloseAllMenus (); handled = false; @@ -1042,22 +1042,22 @@ namespace Terminal.Gui { handled = false; return false; } - } else if (isMenuClosed && me.Flags.HasFlag (MouseFlags.Button1Clicked)) { + } else if (isMenuClosed && me.Flags.HasFlag (MouseFlags.Button1Pressed)) { Application.GrabMouse (current); } else { handled = false; return false; } - //if (me.View != this && me.Flags != MouseFlags.Button1Clicked) + //if (me.View != this && me.Flags != MouseFlags.Button1Pressed) // return true; - //else if (me.View != this && me.Flags == MouseFlags.Button1Clicked) { + //else if (me.View != this && me.Flags == MouseFlags.Button1Pressed) { // Application.UngrabMouse (); // host.CloseAllMenus (); // return true; //} - //if (!(me.View is MenuBar) && !(me.View is Menu) && me.Flags != MouseFlags.Button1Clicked) + //if (!(me.View is MenuBar) && !(me.View is Menu) && me.Flags != MouseFlags.Button1Pressed) // return false; //if (Application.mouseGrabView != null) { @@ -1066,11 +1066,11 @@ namespace Terminal.Gui { // me.Y -= me.OfY; // me.View.MouseEvent (me); // return true; - // } else if (!(me.View is MenuBar || me.View is Menu) && me.Flags == MouseFlags.Button1Clicked) { + // } else if (!(me.View is MenuBar || me.View is Menu) && me.Flags == MouseFlags.Button1Pressed) { // Application.UngrabMouse (); // CloseAllMenus (); // } - //} else if (!isMenuClosed && selected == -1 && me.Flags == MouseFlags.Button1Clicked) { + //} else if (!isMenuClosed && selected == -1 && me.Flags == MouseFlags.Button1Pressed) { // Application.GrabMouse (this); // return true; //} @@ -1082,7 +1082,7 @@ namespace Terminal.Gui { // } else if (me.View != current && me.View is MenuBar && me.View is Menu) { // Application.UngrabMouse (); // Application.GrabMouse (me.View); - // } else if (me.Flags == MouseFlags.Button1Clicked) { + // } else if (me.Flags == MouseFlags.Button1Pressed) { // Application.UngrabMouse (); // CloseMenu (); // }