Browse Source

Added a WheeledLeft and WheeledRight while pressing ButtonShift.

BDisp 4 years ago
parent
commit
ce1c63ed51

+ 70 - 6
Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs

@@ -213,14 +213,14 @@ namespace Terminal.Gui {
 				cev.ButtonState == Curses.Event.Button3Pressed) && LastMouseButtonPressed == null) ||
 				cev.ButtonState == Curses.Event.Button3Pressed) && LastMouseButtonPressed == null) ||
 				IsButtonPressed && cev.ButtonState == Curses.Event.ReportMousePosition) {
 				IsButtonPressed && cev.ButtonState == Curses.Event.ReportMousePosition) {
 
 
-				mouseFlag = (MouseFlags)cev.ButtonState;
+				mouseFlag = MapCursesButton (cev.ButtonState);
 				if (cev.ButtonState != Curses.Event.ReportMousePosition)
 				if (cev.ButtonState != Curses.Event.ReportMousePosition)
 					LastMouseButtonPressed = cev.ButtonState;
 					LastMouseButtonPressed = cev.ButtonState;
 				IsButtonPressed = true;
 				IsButtonPressed = true;
 				isReportMousePosition = false;
 				isReportMousePosition = false;
 
 
 				if (cev.ButtonState == Curses.Event.ReportMousePosition) {
 				if (cev.ButtonState == Curses.Event.ReportMousePosition) {
-					mouseFlag = (MouseFlags)LastMouseButtonPressed | MouseFlags.ReportMousePosition;
+					mouseFlag = MapCursesButton ((Curses.Event)LastMouseButtonPressed) | MouseFlags.ReportMousePosition;
 					point = new Point ();
 					point = new Point ();
 					//cancelButtonClicked = true;
 					//cancelButtonClicked = true;
 				} else {
 				} else {
@@ -266,15 +266,31 @@ namespace Terminal.Gui {
 
 
 				mouseFlag = MouseFlags.WheeledDown;
 				mouseFlag = MouseFlags.WheeledDown;
 
 
+			} else if ((cev.ButtonState & (Curses.Event.ButtonWheeledUp & Curses.Event.ButtonShift)) != 0) {
+
+				mouseFlag = MouseFlags.WheeledLeft;
+
+			} else if ((cev.ButtonState & (Curses.Event.ButtonWheeledDown & Curses.Event.ButtonShift)) != 0) {
+
+				mouseFlag = MouseFlags.WheeledRight;
+
 			} else if (cev.ButtonState == Curses.Event.ReportMousePosition) {
 			} else if (cev.ButtonState == Curses.Event.ReportMousePosition) {
 
 
 				mouseFlag = MouseFlags.ReportMousePosition;
 				mouseFlag = MouseFlags.ReportMousePosition;
 				isReportMousePosition = true;
 				isReportMousePosition = true;
 
 
 			} else {
 			} else {
-				mouseFlag = (MouseFlags)cev.ButtonState;
+				mouseFlag = 0;
+				var eFlags = cev.ButtonState;
+				foreach (Enum value in Enum.GetValues (eFlags.GetType ())) {
+					if (eFlags.HasFlag (value)) {
+						mouseFlag |= MapCursesButton ((Curses.Event)value);
+					}
+				}
 			}
 			}
 
 
+			mouseFlag = SetControlKeyStates (cev, mouseFlag);
+
 			point = new Point () {
 			point = new Point () {
 				X = cev.X,
 				X = cev.X,
 				Y = cev.Y
 				Y = cev.Y
@@ -283,7 +299,7 @@ namespace Terminal.Gui {
 			return new MouseEvent () {
 			return new MouseEvent () {
 				X = cev.X,
 				X = cev.X,
 				Y = cev.Y,
 				Y = cev.Y,
-				//Flags = (MouseFlags)cev.ButtonState
+				//Flags = MapCursesButton (cev.ButtonState)
 				Flags = mouseFlag
 				Flags = mouseFlag
 			};
 			};
 		}
 		}
@@ -297,7 +313,7 @@ namespace Terminal.Gui {
 				mf = GetButtonState (cev, false);
 				mf = GetButtonState (cev, false);
 				mouseHandler (ProcessButtonState (cev, mf));
 				mouseHandler (ProcessButtonState (cev, mf));
 				if (LastMouseButtonPressed != null && LastMouseButtonPressed == cev.ButtonState) {
 				if (LastMouseButtonPressed != null && LastMouseButtonPressed == cev.ButtonState) {
-					mf = (MouseFlags)cev.ButtonState;
+					mf = MapCursesButton (cev.ButtonState);
 				}
 				}
 			}
 			}
 			LastMouseButtonPressed = null;
 			LastMouseButtonPressed = null;
@@ -306,7 +322,7 @@ namespace Terminal.Gui {
 
 
 		private MouseFlags ProcessButtonReleasedEvent (Curses.MouseEvent cev)
 		private MouseFlags ProcessButtonReleasedEvent (Curses.MouseEvent cev)
 		{
 		{
-			var mf = (MouseFlags)cev.ButtonState;
+			var mf = MapCursesButton (cev.ButtonState);
 			if (!cancelButtonClicked && LastMouseButtonPressed == null && !isReportMousePosition) {
 			if (!cancelButtonClicked && LastMouseButtonPressed == null && !isReportMousePosition) {
 				mouseHandler (ProcessButtonState (cev, mf));
 				mouseHandler (ProcessButtonState (cev, mf));
 				mf = GetButtonState (cev);
 				mf = GetButtonState (cev);
@@ -368,6 +384,54 @@ namespace Terminal.Gui {
 			};
 			};
 		}
 		}
 
 
+		MouseFlags MapCursesButton (Curses.Event cursesButton)
+		{
+			switch (cursesButton) {
+			case Curses.Event.Button1Pressed: return MouseFlags.Button1Pressed;
+			case Curses.Event.Button1Released: return MouseFlags.Button1Released;
+			case Curses.Event.Button1Clicked: return MouseFlags.Button1Clicked;
+			case Curses.Event.Button1DoubleClicked: return MouseFlags.Button1DoubleClicked;
+			case Curses.Event.Button1TripleClicked: return MouseFlags.Button1TripleClicked;
+			case Curses.Event.Button2Pressed: return MouseFlags.Button2Pressed;
+			case Curses.Event.Button2Released: return MouseFlags.Button2Released;
+			case Curses.Event.Button2Clicked: return MouseFlags.Button2Clicked;
+			case Curses.Event.Button2DoubleClicked: return MouseFlags.Button2DoubleClicked;
+			case Curses.Event.Button2TrippleClicked: return MouseFlags.Button2TripleClicked;
+			case Curses.Event.Button3Pressed: return MouseFlags.Button3Pressed;
+			case Curses.Event.Button3Released: return MouseFlags.Button3Released;
+			case Curses.Event.Button3Clicked: return MouseFlags.Button3Clicked;
+			case Curses.Event.Button3DoubleClicked: return MouseFlags.Button3DoubleClicked;
+			case Curses.Event.Button3TripleClicked: return MouseFlags.Button3TripleClicked;
+			case Curses.Event.ButtonWheeledUp: return MouseFlags.WheeledUp;
+			case Curses.Event.ButtonWheeledDown: return MouseFlags.WheeledDown;
+			case Curses.Event.Button4Pressed: return MouseFlags.Button4Pressed;
+			case Curses.Event.Button4Released: return MouseFlags.Button4Released;
+			case Curses.Event.Button4Clicked: return MouseFlags.Button4Clicked;
+			case Curses.Event.Button4DoubleClicked: return MouseFlags.Button4DoubleClicked;
+			case Curses.Event.Button4TripleClicked: return MouseFlags.Button4TripleClicked;
+			case Curses.Event.ButtonShift: return MouseFlags.ButtonShift;
+			case Curses.Event.ButtonCtrl: return MouseFlags.ButtonCtrl;
+			case Curses.Event.ButtonAlt: return MouseFlags.ButtonAlt;
+			case Curses.Event.ReportMousePosition: return MouseFlags.ReportMousePosition;
+			case Curses.Event.AllEvents: return MouseFlags.AllEvents;
+			default: return 0;
+			}
+		}
+
+		static MouseFlags SetControlKeyStates (Curses.MouseEvent cev, MouseFlags mouseFlag)
+		{
+			if ((cev.ButtonState & Curses.Event.ButtonCtrl) != 0 && (mouseFlag & MouseFlags.ButtonCtrl) == 0)
+				mouseFlag |= MouseFlags.ButtonCtrl;
+
+			if ((cev.ButtonState & Curses.Event.ButtonShift) != 0 && (mouseFlag & MouseFlags.ButtonShift) == 0)
+				mouseFlag |= MouseFlags.ButtonShift;
+
+			if ((cev.ButtonState & Curses.Event.ButtonAlt) != 0 && (mouseFlag & MouseFlags.ButtonAlt) == 0)
+				mouseFlag |= MouseFlags.ButtonAlt;
+			return mouseFlag;
+		}
+
+
 		KeyModifiers keyModifiers;
 		KeyModifiers keyModifiers;
 
 
 		KeyModifiers MapKeyModifiers (Key key)
 		KeyModifiers MapKeyModifiers (Key key)

+ 1 - 1
Terminal.Gui/ConsoleDrivers/CursesDriver/constants.cs

@@ -75,7 +75,7 @@ namespace Unix.Terminal {
 			Button4Pressed = unchecked((int)0x80000),
 			Button4Pressed = unchecked((int)0x80000),
 			Button4Released = unchecked((int)0x40000),
 			Button4Released = unchecked((int)0x40000),
 			Button4Clicked = unchecked((int)0x100000),
 			Button4Clicked = unchecked((int)0x100000),
-			Button4DoubleClicked = unchecked((int)0x200000),
+			Button4DoubleClicked = unchecked((int)0x20000),
 			Button4TripleClicked = unchecked((int)0x400000),
 			Button4TripleClicked = unchecked((int)0x400000),
 			ButtonShift = unchecked((int)0x4000000),
 			ButtonShift = unchecked((int)0x4000000),
 			ButtonCtrl = unchecked((int)0x2000000),
 			ButtonCtrl = unchecked((int)0x2000000),

+ 12 - 0
Terminal.Gui/ConsoleDrivers/WindowsDriver.cs

@@ -933,6 +933,18 @@ namespace Terminal.Gui {
 					break;
 					break;
 				}
 				}
 
 
+			} else if (mouseEvent.EventFlags == WindowsConsole.EventFlags.MouseWheeled &&
+				mouseEvent.ControlKeyState == WindowsConsole.ControlKeyState.ShiftPressed) {
+				switch (mouseEvent.ButtonState) {
+				case WindowsConsole.ButtonState.WheeledUp:
+					mouseFlag = MouseFlags.WheeledLeft;
+					break;
+
+				case WindowsConsole.ButtonState.WheeledDown:
+					mouseFlag = MouseFlags.WheeledRight;
+					break;
+				}
+
 			} else if (mouseEvent.EventFlags == WindowsConsole.EventFlags.MouseMoved) {
 			} else if (mouseEvent.EventFlags == WindowsConsole.EventFlags.MouseMoved) {
 				if (mouseEvent.MousePosition.X != point.X || mouseEvent.MousePosition.Y != point.Y) {
 				if (mouseEvent.MousePosition.X != point.X || mouseEvent.MousePosition.Y != point.Y) {
 					mouseFlag = MouseFlags.ReportMousePosition;
 					mouseFlag = MouseFlags.ReportMousePosition;

+ 8 - 0
Terminal.Gui/Core/Event.cs

@@ -542,6 +542,14 @@ namespace Terminal.Gui {
 		/// </summary>
 		/// </summary>
 		WheeledDown = unchecked((int)0x20000000),
 		WheeledDown = unchecked((int)0x20000000),
 		/// <summary>
 		/// <summary>
+		/// Vertical button wheeled up while pressing ButtonShift.
+		/// </summary>
+		WheeledLeft = ButtonShift | WheeledUp,
+		/// <summary>
+		/// Vertical button wheeled down while pressing ButtonShift.
+		/// </summary>
+		WheeledRight = ButtonShift | WheeledDown,
+		/// <summary>
 		/// Mask that captures all the events.
 		/// Mask that captures all the events.
 		/// </summary>
 		/// </summary>
 		AllEvents = unchecked((int)0x7ffffff),
 		AllEvents = unchecked((int)0x7ffffff),

+ 12 - 6
Terminal.Gui/Views/ScrollView.cs

@@ -768,19 +768,25 @@ namespace Terminal.Gui {
 		public override bool MouseEvent (MouseEvent me)
 		public override bool MouseEvent (MouseEvent me)
 		{
 		{
 			if (me.Flags != MouseFlags.WheeledDown && me.Flags != MouseFlags.WheeledUp &&
 			if (me.Flags != MouseFlags.WheeledDown && me.Flags != MouseFlags.WheeledUp &&
+				me.Flags != MouseFlags.WheeledRight && me.Flags != MouseFlags.WheeledLeft &&
 				me.Flags != MouseFlags.Button1Pressed && me.Flags != MouseFlags.Button1Clicked &&
 				me.Flags != MouseFlags.Button1Pressed && me.Flags != MouseFlags.Button1Clicked &&
-				!me.Flags.HasFlag (MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition))
+				!me.Flags.HasFlag (MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition)) {
 				return false;
 				return false;
+			}
 
 
-			if (me.Flags == MouseFlags.WheeledDown && ShowVerticalScrollIndicator)
+			if (me.Flags == MouseFlags.WheeledDown && ShowVerticalScrollIndicator) {
 				ScrollDown (1);
 				ScrollDown (1);
-			else if (me.Flags == MouseFlags.WheeledUp && ShowVerticalScrollIndicator)
+			} else if (me.Flags == MouseFlags.WheeledUp && ShowVerticalScrollIndicator) {
 				ScrollUp (1);
 				ScrollUp (1);
-			else if (me.X == vertical.Frame.X && ShowVerticalScrollIndicator)
+			} else if (me.Flags == MouseFlags.WheeledRight && showHorizontalScrollIndicator) {
+				ScrollRight (1);
+			} else if (me.Flags == MouseFlags.WheeledLeft && ShowVerticalScrollIndicator) {
+				ScrollLeft (1);
+			} else if (me.X == vertical.Frame.X && ShowVerticalScrollIndicator) {
 				vertical.MouseEvent (me);
 				vertical.MouseEvent (me);
-			else if (me.Y == horizontal.Frame.Y && ShowHorizontalScrollIndicator)
+			} else if (me.Y == horizontal.Frame.Y && ShowHorizontalScrollIndicator) {
 				horizontal.MouseEvent (me);
 				horizontal.MouseEvent (me);
-			else if (IsOverridden (me.View)) {
+			} else if (IsOverridden (me.View)) {
 				Application.UngrabMouse ();
 				Application.UngrabMouse ();
 				return false;
 				return false;
 			}
 			}