2
0
Эх сурвалжийг харах

Merge branch 'master' into unknown

Charlie Kindel 5 жил өмнө
parent
commit
93d4fa333e

+ 49 - 21
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 list = new List<string> ()
+        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)
             )
-        let mutable kl = new Label(new Rect(3, 3, 40, 1), ustr "Keyboard: ")
-        container.OnKeyDown <- Action<KeyEvent>(fun (keyEvent : KeyEvent) -> KeyUpDown (keyEvent, kl, "Down"))
-        container.OnKeyUp <- Action<KeyEvent>(fun (keyEvent : KeyEvent) -> KeyUpDown (keyEvent, kl, "Up"))
-        container.Add (kl)
+        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)

+ 33 - 22
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;
 		}