Forráskód Böngészése

Some mouse improvements on CursesDriver.

BDisp 5 éve
szülő
commit
e5f79183b7
1 módosított fájl, 33 hozzáadás és 22 törlés
  1. 33 22
      Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs

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