From e5f79183b7f08f7b59128eef1d626b1377c8ec1a Mon Sep 17 00:00:00 2001 From: BDisp Date: Fri, 29 May 2020 22:55:50 +0100 Subject: [PATCH 1/2] Some mouse improvements on CursesDriver. --- .../CursesDriver/CursesDriver.cs | 55 +++++++++++-------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs b/Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs index bee2f0454..38a26b9fd 100644 --- a/Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs +++ b/Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs @@ -186,9 +186,11 @@ namespace Terminal.Gui { } } - Curses.Event? LastMouseButtonPressed = null; - bool IsButtonPressed = false; - bool cancelButtonClicked = false; + Curses.Event? LastMouseButtonPressed; + bool IsButtonPressed; + bool cancelButtonClicked; + bool canWheeledDown; + bool isReportMousePosition; Point point; MouseEvent ToDriverMouse (Curses.MouseEvent cev) @@ -206,7 +208,7 @@ namespace Terminal.Gui { LastMouseButtonPressed == null) { IsButtonPressed = false; - mouseFlag = ProcessButtonClickedEvent (cev, mouseFlag); + mouseFlag = ProcessButtonClickedEvent (cev); } else if (((cev.ButtonState == Curses.Event.Button1Pressed || cev.ButtonState == Curses.Event.Button2Pressed || cev.ButtonState == Curses.Event.Button3Pressed) && LastMouseButtonPressed == null) || @@ -216,6 +218,7 @@ namespace Terminal.Gui { if (cev.ButtonState != Curses.Event.ReportMousePosition) LastMouseButtonPressed = cev.ButtonState; IsButtonPressed = true; + isReportMousePosition = false; if (cev.ButtonState == Curses.Event.ReportMousePosition) { mouseFlag = (MouseFlags)LastMouseButtonPressed | MouseFlags.ReportMousePosition; @@ -231,7 +234,7 @@ namespace Terminal.Gui { if ((mouseFlag & MouseFlags.ReportMousePosition) == 0) { Task.Run (async () => { while (IsButtonPressed && LastMouseButtonPressed != null) { - await Task.Delay (200); + await Task.Delay (100); var me = new MouseEvent () { X = cev.X, Y = cev.Y, @@ -253,23 +256,32 @@ namespace Terminal.Gui { } else if ((cev.ButtonState == Curses.Event.Button1Released || cev.ButtonState == Curses.Event.Button2Released || cev.ButtonState == Curses.Event.Button3Released)) { - mouseFlag = ProcessButtonReleasedEvent (cev, mouseFlag); + mouseFlag = ProcessButtonReleasedEvent (cev); IsButtonPressed = false; + canWheeledDown = false; } else if (cev.ButtonState == Curses.Event.Button4Pressed) { mouseFlag = MouseFlags.WheeledUp; - } else if (cev.ButtonState == Curses.Event.ReportMousePosition && cev.X == point.X && cev.Y == point.Y) { + } else if (cev.ButtonState == Curses.Event.ReportMousePosition && cev.X == point.X && cev.Y == point.Y && + canWheeledDown) { mouseFlag = MouseFlags.WheeledDown; + canWheeledDown = true; } - else if (cev.ButtonState == Curses.Event.ReportMousePosition) { + else if (cev.ButtonState == Curses.Event.ReportMousePosition && !canWheeledDown) { mouseFlag = MouseFlags.ReportMousePosition; + canWheeledDown = true; + isReportMousePosition = true; + } else { mouseFlag = (MouseFlags)cev.ButtonState; + canWheeledDown = false; + if (cev.ButtonState == Curses.Event.ReportMousePosition) + isReportMousePosition = true; } point = new Point () { @@ -277,11 +289,6 @@ namespace Terminal.Gui { Y = cev.Y }; - - - if (cev.ID != 0) - mouseFlag = MouseFlags.WheeledDown; - return new MouseEvent () { X = cev.X, Y = cev.Y, @@ -290,10 +297,10 @@ namespace Terminal.Gui { }; } - private MouseFlags ProcessButtonClickedEvent (Curses.MouseEvent cev, MouseFlags mf) + private MouseFlags ProcessButtonClickedEvent (Curses.MouseEvent cev) { LastMouseButtonPressed = cev.ButtonState; - mf = GetButtonState (cev, true); + var mf = GetButtonState (cev, true); mouseHandler (ProcessButtonState (cev, mf)); if (LastMouseButtonPressed != null && LastMouseButtonPressed == cev.ButtonState) { mf = GetButtonState (cev, false); @@ -303,17 +310,21 @@ namespace Terminal.Gui { } } LastMouseButtonPressed = null; + canWheeledDown = false; return mf; } - private MouseFlags ProcessButtonReleasedEvent (Curses.MouseEvent cev, MouseFlags mf) - { - mf = (MouseFlags)cev.ButtonState; - mouseHandler (ProcessButtonState (cev, mf)); - if (!cancelButtonClicked && LastMouseButtonPressed == null) + private MouseFlags ProcessButtonReleasedEvent (Curses.MouseEvent cev) + { + var mf = (MouseFlags)cev.ButtonState; + if (!cancelButtonClicked && LastMouseButtonPressed == null && !isReportMousePosition) { + mouseHandler (ProcessButtonState (cev, mf)); mf = GetButtonState (cev); - else - cancelButtonClicked = false; + } else if (isReportMousePosition) { + mf = MouseFlags.ReportMousePosition; + } + cancelButtonClicked = false; + canWheeledDown = false; return mf; } From 4222c9f91ad1704203e45a73cc8d5f40930b20ee Mon Sep 17 00:00:00 2001 From: BDisp Date: Sat, 30 May 2020 16:04:27 +0100 Subject: [PATCH 2/2] Updates FSharp Example project. --- FSharpExample/Program.fs | 70 ++++++++++++++++++++++++++++------------ 1 file changed, 49 insertions(+), 21 deletions(-) diff --git a/FSharpExample/Program.fs b/FSharpExample/Program.fs index a2ec888c5..4824df648 100644 --- a/FSharpExample/Program.fs +++ b/FSharpExample/Program.fs @@ -2,7 +2,6 @@ open Terminal.Gui open System -open Mono.Terminal open System.Collections.Generic open System.Diagnostics open System.Globalization @@ -322,24 +321,53 @@ type Demo() = class end () MessageBox.Query (60, 10, "Selected Animals", (if result = "" then "No animals selected" else result), "Ok") |> ignore - let KeyUpDown(keyEvent : KeyEvent, kl : Label, updown : string) = - kl.TextColor <- Colors.TopLevel.Normal - if keyEvent.Key &&& Key.CtrlMask <> Key.Unknown - then kl.Text <- ustr (sprintf "Keyboard: Ctrl Key%O" updown) - else - if keyEvent.Key &&& Key.AltMask <> Key.Unknown - then kl.Text <- ustr (sprintf "Keyboard: Alt Key%O" updown) - else kl.Text <- ustr (sprintf "Keyboard: %O Key%O" (char keyEvent.KeyValue) updown) - - let OnKeyDownUpDemo() = - let mutable container = new Dialog(ustr "OnKeyDown & OnKeyUp demo", 50, 20, - new Button (ustr "Ok", true, Clicked = fun () -> Application.RequestStop ()), - new Button (ustr "Cancel", Clicked = fun () -> Application.RequestStop ()) + let OnKeyDownPressUpDemo() = + let mutable container = new Dialog (ustr "KeyDown & KeyPress & KeyUp demo", 80, 20, + new Button (ustr "Close", Clicked = fun () -> Application.RequestStop ()), + Width = Dim.Fill (), + Height = Dim.Fill () ) - let mutable kl = new Label(new Rect(3, 3, 40, 1), ustr "Keyboard: ") - container.OnKeyDown <- Action(fun (keyEvent : KeyEvent) -> KeyUpDown (keyEvent, kl, "Down")) - container.OnKeyUp <- Action(fun (keyEvent : KeyEvent) -> KeyUpDown (keyEvent, kl, "Up")) - container.Add (kl) + + let mutable list = new List () + let mutable listView = new ListView (list, + X = Pos.At(0), + Y = Pos.At(0), + Width = Dim.Fill () - Dim.op_Implicit(1), + Height = Dim.Fill () - Dim.op_Implicit(2) + ) + listView.ColorScheme <- Colors.TopLevel + container.Add (listView) + + let KeyDownPressUp(keyEvent : KeyEvent, updown : string) = + let ident : int = -5 + match updown with + | "Down" + | "Up" + | "Press" -> + let mutable (msg : string) = sprintf "Key %5s : " updown + if (keyEvent.Key &&& Key.ShiftMask) <> Key.Unknown + then msg <- msg + "Shift " + if (keyEvent.Key &&& Key.CtrlMask) <> Key.Unknown + then msg <- msg + "Ctrl " + if (keyEvent.Key &&& Key.AltMask) <> Key.Unknown + then msg <- msg + "Alt " + msg <- msg + if (keyEvent.KeyValue &&& (int)Key.CharMask) > 26 then (string)keyEvent.KeyValue else (string)keyEvent.Key + list.Add (msg) + | _ -> + if (keyEvent.Key &&& Key.ShiftMask) <> Key.Unknown + then list.Add (sprintf "Key %s : Shift " updown) + else if (keyEvent.Key &&& Key.CtrlMask) <> Key.Unknown + then list.Add (sprintf "Key %s : Ctrl " updown) + else if (keyEvent.Key &&& Key.AltMask) <> Key.Unknown + then list.Add (sprintf "Key %s : Alt " updown) + else if ((int)keyEvent.KeyValue &&& (int)Key.CharMask) > 26 + then list.Add (sprintf "Key %s : %s" updown (keyEvent.KeyValue.ToString())) + else list.Add (sprintf "Key %s : %s" updown (keyEvent.Key.ToString())) + listView.MoveDown (); + + container.KeyDown.Add(fun (e : View.KeyEventEventArgs) -> KeyDownPressUp (e.KeyEvent, "Down") |> ignore) + container.KeyPress.Add(fun (e : View.KeyEventEventArgs) -> KeyDownPressUp (e.KeyEvent, "Press") |> ignore) + container.KeyUp.Add(fun (e : View.KeyEventEventArgs) -> KeyDownPressUp (e.KeyEvent, "Up") |> ignore) Application.Run (container) let Main() = @@ -380,7 +408,7 @@ type Demo() = class end new MenuBarItem(ustr "_List Demos", [|new MenuItem(ustr "Select _Multiple Items", "", (fun () -> ListSelectionDemo (true))); new MenuItem(ustr "Select _Single Item", "", (fun () -> ListSelectionDemo (false)))|]); new MenuBarItem(ustr "A_ssorted", [|new MenuItem(ustr "_Show text alignments", "", (fun () -> ShowTextAlignments ())); - new MenuItem(ustr "_OnKeyDown/Up", "", (fun () -> OnKeyDownUpDemo ()))|]); + new MenuItem(ustr "_OnKeyDown/Press/Up", "", (fun () -> OnKeyDownPressUpDemo ()))|]); new MenuBarItem(ustr "_Test Menu and SubMenus", [|new MenuItem(ustr "SubMenu1Item_1", new MenuBarItem([|new MenuItem(ustr "SubMenu2Item_1", new MenuBarItem([|new MenuItem(ustr "SubMenu3Item_1", new MenuBarItem([|(menuItems.[2])|]))|]))|]))|]); @@ -423,8 +451,8 @@ type Demo() = class end win.Add (bottom) let mutable bottom2 = new Label(ustr "This should go on the bottom of another top-level!") top.Add (bottom2) - Application.OnLoad <- Action ( - fun () -> + Application.Loaded.Add ( + fun (_) -> bottom.X <- win.X bottom.Y <- Pos.Bottom (win) - Pos.Top (win) - Pos.At(margin) bottom2.X <- Pos.Left (win)