mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2025-12-30 09:47:58 +01:00
Merge branch 'master' into unknown
This commit is contained in:
@@ -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<KeyEvent>(fun (keyEvent : KeyEvent) -> KeyUpDown (keyEvent, kl, "Down"))
|
||||
container.OnKeyUp <- Action<KeyEvent>(fun (keyEvent : KeyEvent) -> KeyUpDown (keyEvent, kl, "Up"))
|
||||
container.Add (kl)
|
||||
|
||||
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)
|
||||
)
|
||||
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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user