From 21d8cea26bc0175b3a92399754e0587d3b736e91 Mon Sep 17 00:00:00 2001 From: Julien Lebosquain Date: Fri, 16 Aug 2024 23:45:11 +0200 Subject: [PATCH] Fix caret position after backspace (#16712) * Added failing test for caret position after backspace * Fix incorrect caret position after backspace --- src/Avalonia.Controls/TextBox.cs | 2 +- .../TextBoxTests.cs | 37 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index a627c15765..b12c23c597 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -1468,7 +1468,7 @@ namespace Avalonia.Controls SetCurrentValue(CaretIndexProperty, start); - _presenter.MoveCaretToTextPosition(start, true); + _presenter.MoveCaretToTextPosition(start); } } diff --git a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs index 1cd42a6c6a..42e42dd9f6 100644 --- a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs @@ -1492,6 +1492,43 @@ namespace Avalonia.Controls.UnitTests } } + [Fact] + public void Backspace_Should_Delete_Last_Character_In_Line_And_Keep_Caret_On_Same_Line() + { + using var _ = UnitTestApplication.Start(Services); + + var textBox = new TextBox + { + Template = CreateTemplate(), + Text = "a\nb", + CaretIndex = 3 + }; + textBox.ApplyTemplate(); + + var topLevel = new TestTopLevel(CreateMockTopLevelImpl().Object) + { + Template = CreateTopLevelTemplate(), + Content = textBox + }; + topLevel.ApplyTemplate(); + topLevel.LayoutManager.ExecuteInitialLayoutPass(); + + var textPresenter = textBox.FindDescendantOfType(); + Assert.NotNull(textPresenter); + + var oldCaretY = textPresenter.GetCursorRectangle().Top; + Assert.NotEqual(0, oldCaretY); + + RaiseKeyEvent(textBox, Key.Back, KeyModifiers.None); + + Assert.Equal("a\n", textBox.Text); + Assert.Equal(2, textBox.CaretIndex); + Assert.Equal(2, textPresenter.CaretIndex); + + var caretY = textPresenter.GetCursorRectangle().Top; + Assert.Equal(oldCaretY, caretY); + } + private static TestServices FocusServices => TestServices.MockThreadingInterface.With( focusManager: new FocusManager(), keyboardDevice: () => new KeyboardDevice(),