Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes #3950. Revisit v2 Cancelable Event Pattern - was KeyDown and MouseEvent no longer fires for Listbox #3955

Draft
wants to merge 2 commits into
base: v2_develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 18 additions & 16 deletions Terminal.Gui/View/View.Keyboard.cs
Original file line number Diff line number Diff line change
Expand Up @@ -319,28 +319,30 @@ public bool NewKeyDownEvent (Key key)

bool RaiseKeyDown (Key k)
{
// Before (fire the cancellable event)
if (OnKeyDown (k) || k.Handled)
// First fire event
KeyDown?.Invoke (this, k);

if (k.Handled)
{
return true;
}

// fire event
KeyDown?.Invoke (this, k);

return k.Handled;
// After (fire the cancellable event)
return OnKeyDown (k);
}

bool RaiseKeyDownNotHandled (Key k)
{
if (OnKeyDownNotHandled (k) || k.Handled)
// First fire event
KeyDownNotHandled?.Invoke (this, k);

if (k.Handled)
{
return true;
}

KeyDownNotHandled?.Invoke (this, k);

return false;
// After (fire the cancellable event)
return OnKeyDownNotHandled (k);
}
}

Expand Down Expand Up @@ -453,16 +455,16 @@ public bool NewKeyUpEvent (Key key)

bool RaiseKeyUp (Key k)
{
// Before (fire the cancellable event)
if (OnKeyUp (k) || k.Handled)
// First fire event
KeyUp?.Invoke (this, k);

if (k.Handled)
{
return true;
}

// fire event
KeyUp?.Invoke (this, k);

return k.Handled;
// After (fire the cancellable event)
return OnKeyUp (k);
}
}

Expand Down
10 changes: 6 additions & 4 deletions Terminal.Gui/View/View.Mouse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -335,14 +335,16 @@ protected virtual void OnMouseLeave () { }
/// <returns><see langword="true"/>, if the event was handled, <see langword="false"/> otherwise.</returns>
public bool RaiseMouseEvent (MouseEventArgs mouseEvent)
{
if (OnMouseEvent (mouseEvent) || mouseEvent.Handled)
// First fire event
MouseEvent?.Invoke (this, mouseEvent);

if (mouseEvent.Handled)
{
return true;
}

MouseEvent?.Invoke (this, mouseEvent);

return mouseEvent.Handled;
// After (fire the cancellable event)
return OnMouseEvent (mouseEvent);
}

/// <summary>Called when a mouse event occurs within the view's <see cref="Viewport"/>.</summary>
Expand Down
4 changes: 4 additions & 0 deletions Terminal.Gui/Views/MessageBox.cs
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,10 @@ params string [] buttons
{
Clicked = (int)btn.Data!;
}
else
{
Clicked = defaultButton;
}

e.Cancel = true;
Application.RequestStop ();
Expand Down
14 changes: 14 additions & 0 deletions UnitTests/Dialogs/MessageBoxTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -502,5 +502,19 @@ public void UICatalog_AboutBox ()
Application.Run (top);
top.Dispose ();
}

[Fact]
[SetupFakeDriver]
public void Button_IsDefault_True_Return_His_Index_On_Accepting ()
{
Application.Init ();

Application.Iteration += (_, _) => Assert.True (Application.RaiseKeyDownEvent (Key.Enter));
var res = MessageBox.Query ("hey", "IsDefault", "Yes", "No");

Assert.Equal (0, res);

Application.Shutdown ();
}
}

48 changes: 38 additions & 10 deletions UnitTests/View/Keyboard/KeyboardEventTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ public void NewKeyDownUpEvents_Events_Are_Raised_With_Only_Key_Modifiers (bool s
Assert.Equal (alt, e.IsAlt);
Assert.Equal (control, e.IsCtrl);
Assert.False (keyDown);
Assert.True (view.OnKeyDownCalled);
Assert.False (view.OnKeyDownCalled);
keyDown = true;
};
view.KeyDownNotHandled += (s, e) => { keyDownNotHandled = true; };
Expand All @@ -114,7 +114,7 @@ public void NewKeyDownUpEvents_Events_Are_Raised_With_Only_Key_Modifiers (bool s
Assert.Equal (alt, e.IsAlt);
Assert.Equal (control, e.IsCtrl);
Assert.False (keyUp);
Assert.True (view.OnKeyUpCalled);
Assert.False (view.OnKeyUpCalled);
keyUp = true;
};

Expand Down Expand Up @@ -147,6 +147,7 @@ public void NewKeyDownEvent_Handled_True_Stops_Processing ()
{
var keyDown = false;
var keyDownNotHandled = false;
var keyHandled = false;

var view = new OnNewKeyTestView ();
Assert.True (view.CanFocus);
Expand All @@ -156,8 +157,8 @@ public void NewKeyDownEvent_Handled_True_Stops_Processing ()
{
Assert.Equal (KeyCode.A, e.KeyCode);
Assert.False (keyDown);
Assert.True (view.OnKeyDownCalled);
e.Handled = true;
Assert.False (view.OnKeyDownCalled);
e.Handled = keyHandled;
keyDown = true;
};

Expand All @@ -167,15 +168,29 @@ public void NewKeyDownEvent_Handled_True_Stops_Processing ()
Assert.Equal (KeyCode.A, e.KeyCode);
Assert.False (keyDownNotHandled);
Assert.False (view.OnProcessKeyDownCalled);
e.Handled = true;
e.Handled = keyHandled;
keyDownNotHandled = true;
};

view.NewKeyDownEvent (Key.A);
Assert.True (keyDown);
Assert.False (keyDownNotHandled);
Assert.True (keyDownNotHandled);

Assert.True (view.OnKeyDownCalled);
Assert.True (view.OnProcessKeyDownCalled);

keyDown = false;
keyDownNotHandled = false;
keyHandled = true;
view.CancelVirtualMethods = true;
view.OnKeyDownCalled = false;
view.OnProcessKeyDownCalled = false;

view.NewKeyDownEvent (Key.A);
Assert.True (keyDown);
Assert.False (keyDownNotHandled);

Assert.False (view.OnKeyDownCalled);
Assert.False (view.OnProcessKeyDownCalled);
}

Expand Down Expand Up @@ -223,7 +238,7 @@ public void NewKeyDownEvent_ProcessKeyDown_Handled_Stops_Processing ()
{
Assert.Equal (KeyCode.A, e.KeyCode);
Assert.False (keyDown);
Assert.True (view.OnKeyDownCalled);
Assert.False (view.OnKeyDownCalled);
e.Handled = false;
keyDown = true;
};
Expand All @@ -232,7 +247,7 @@ public void NewKeyDownEvent_ProcessKeyDown_Handled_Stops_Processing ()
{
Assert.Equal (KeyCode.A, e.KeyCode);
Assert.False (keyDownNotHandled);
Assert.True (view.OnProcessKeyDownCalled);
Assert.False (view.OnProcessKeyDownCalled);
e.Handled = true;
keyDownNotHandled = true;
};
Expand All @@ -242,13 +257,14 @@ public void NewKeyDownEvent_ProcessKeyDown_Handled_Stops_Processing ()
Assert.True (keyDownNotHandled);

Assert.True (view.OnKeyDownCalled);
Assert.True (view.OnProcessKeyDownCalled);
Assert.False (view.OnProcessKeyDownCalled);
}

[Fact]
public void NewKeyUpEvent_KeyUp_Handled_True_Stops_Processing ()
{
var keyUp = false;
var keyHandled = false;

var view = new OnNewKeyTestView ();
Assert.True (view.CanFocus);
Expand All @@ -259,7 +275,7 @@ public void NewKeyUpEvent_KeyUp_Handled_True_Stops_Processing ()
Assert.Equal (KeyCode.A, e.KeyCode);
Assert.False (keyUp);
Assert.False (view.OnProcessKeyDownCalled);
e.Handled = true;
e.Handled = keyHandled;
keyUp = true;
};

Expand All @@ -269,6 +285,18 @@ public void NewKeyUpEvent_KeyUp_Handled_True_Stops_Processing ()
Assert.True (view.OnKeyUpCalled);
Assert.False (view.OnKeyDownCalled);
Assert.False (view.OnProcessKeyDownCalled);

keyUp = false;
keyHandled = true;
view.CancelVirtualMethods = true;
view.OnKeyUpCalled = false;

view.NewKeyUpEvent (Key.A);
Assert.True (keyUp);

Assert.False (view.OnKeyUpCalled);
Assert.False (view.OnKeyDownCalled);
Assert.False (view.OnProcessKeyDownCalled);
}

[Theory]
Expand Down
Loading