From f98ee717f50c125176212f85b01d89c7fdf7c7fc Mon Sep 17 00:00:00 2001 From: Deadpikle Date: Thu, 12 Mar 2020 10:32:45 -0400 Subject: [PATCH 1/3] Adjusted TextBox right-click behavior WPF does not allow dragging to change selection for right clicks Furthermore, it only changes the selection on mouse up of right click, not mouse down, and only if the user clicked outside the current selection. This commit adjusts TextBox selection behavior to work like WPF --- src/Avalonia.Controls/TextBox.cs | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index a438d7380b..f9dd98634c 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -684,11 +684,12 @@ namespace Avalonia.Controls protected override void OnPointerPressed(PointerPressedEventArgs e) { var point = e.GetPosition(_presenter); - var index = CaretIndex = _presenter.GetCaretIndex(point); + var index = _presenter.GetCaretIndex(point); var text = Text; - if (text != null && e.MouseButton == MouseButton.Left) + if (text != null && e.GetCurrentPoint(this).Properties.IsLeftButtonPressed) { + CaretIndex = index; switch (e.ClickCount) { case 1: @@ -714,7 +715,8 @@ namespace Avalonia.Controls protected override void OnPointerMoved(PointerEventArgs e) { - if (_presenter != null && e.Pointer.Captured == _presenter) + // selection should not change during pointer move if the user right clicks + if (_presenter != null && e.Pointer.Captured == _presenter && !e.GetCurrentPoint(this).Properties.IsRightButtonPressed) { var point = e.GetPosition(_presenter); @@ -727,6 +729,22 @@ namespace Avalonia.Controls { if (_presenter != null && e.Pointer.Captured == _presenter) { + if (e.InitialPressMouseButton == MouseButton.Right) + { + var point = e.GetPosition(_presenter); + var caretIndex = _presenter.GetCaretIndex(point); + + // see if mouse clicked inside current selection + // if it did not, we change the selection to where the user clicked + var firstSelection = Math.Min(SelectionStart, SelectionEnd); + var lastSelection = Math.Max(SelectionStart, SelectionEnd); + var didClickInSelection = SelectionStart != SelectionEnd && + caretIndex >= firstSelection && caretIndex <= lastSelection; + if (!didClickInSelection) + { + CaretIndex = SelectionEnd = SelectionStart = caretIndex; + } + } e.Pointer.Capture(null); } } From 1f18bd3e66e79f55fdaa9bc04479843e75d0cee7 Mon Sep 17 00:00:00 2001 From: Deadpikle Date: Thu, 12 Mar 2020 10:41:33 -0400 Subject: [PATCH 2/3] Only calculate caret index on pointer pressed if left mouse down --- src/Avalonia.Controls/TextBox.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index f9dd98634c..c4bfb5f1b1 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -683,13 +683,12 @@ namespace Avalonia.Controls protected override void OnPointerPressed(PointerPressedEventArgs e) { - var point = e.GetPosition(_presenter); - var index = _presenter.GetCaretIndex(point); var text = Text; if (text != null && e.GetCurrentPoint(this).Properties.IsLeftButtonPressed) { - CaretIndex = index; + var point = e.GetPosition(_presenter); + var index = CaretIndex = _presenter.GetCaretIndex(point); switch (e.ClickCount) { case 1: From a8663cd1f349cb3525e464e4fb6e51ef4973604e Mon Sep 17 00:00:00 2001 From: Deadpikle Date: Tue, 17 Mar 2020 12:27:05 -0400 Subject: [PATCH 3/3] Fix middle click being able to change selection --- src/Avalonia.Controls/TextBox.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index c4bfb5f1b1..cd5dff2c9a 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -715,7 +715,7 @@ namespace Avalonia.Controls protected override void OnPointerMoved(PointerEventArgs e) { // selection should not change during pointer move if the user right clicks - if (_presenter != null && e.Pointer.Captured == _presenter && !e.GetCurrentPoint(this).Properties.IsRightButtonPressed) + if (_presenter != null && e.Pointer.Captured == _presenter && e.GetCurrentPoint(this).Properties.IsLeftButtonPressed) { var point = e.GetPosition(_presenter);