Browse Source

Merge branch 'master' into feature/TextAlignmentJutify

pull/8347/head
Benedikt Stebner 4 years ago
committed by GitHub
parent
commit
66fced01db
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      .editorconfig
  2. 74
      src/Avalonia.Controls/TextBox.cs
  3. 28
      tests/Avalonia.Controls.UnitTests/MaskedTextBoxTests.cs
  4. 28
      tests/Avalonia.Controls.UnitTests/TextBoxTests.cs

1
.editorconfig

@ -21,6 +21,7 @@ csharp_new_line_before_finally = true
csharp_new_line_before_members_in_object_initializers = true csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_members_in_anonymous_types = true csharp_new_line_before_members_in_anonymous_types = true
csharp_new_line_between_query_expression_clauses = true csharp_new_line_between_query_expression_clauses = true
trim_trailing_whitespace = true
# Indentation preferences # Indentation preferences
csharp_indent_block_contents = true csharp_indent_block_contents = true

74
src/Avalonia.Controls/TextBox.cs

@ -53,7 +53,7 @@ namespace Avalonia.Controls
public static readonly StyledProperty<char> PasswordCharProperty = public static readonly StyledProperty<char> PasswordCharProperty =
AvaloniaProperty.Register<TextBox, char>(nameof(PasswordChar)); AvaloniaProperty.Register<TextBox, char>(nameof(PasswordChar));
public static readonly StyledProperty<IBrush?> SelectionBrushProperty = public static readonly StyledProperty<IBrush?> SelectionBrushProperty =
AvaloniaProperty.Register<TextBox, IBrush?>(nameof(SelectionBrush)); AvaloniaProperty.Register<TextBox, IBrush?>(nameof(SelectionBrush));
@ -196,7 +196,6 @@ namespace Avalonia.Controls
private TextBoxTextInputMethodClient _imClient = new TextBoxTextInputMethodClient(); private TextBoxTextInputMethodClient _imClient = new TextBoxTextInputMethodClient();
private UndoRedoHelper<UndoRedoState> _undoRedoHelper; private UndoRedoHelper<UndoRedoState> _undoRedoHelper;
private bool _isUndoingRedoing; private bool _isUndoingRedoing;
private bool _ignoreTextChanges;
private bool _canCut; private bool _canCut;
private bool _canCopy; private bool _canCopy;
private bool _canPaste; private bool _canPaste;
@ -276,7 +275,7 @@ namespace Avalonia.Controls
get => GetValue(IsReadOnlyProperty); get => GetValue(IsReadOnlyProperty);
set => SetValue(IsReadOnlyProperty, value); set => SetValue(IsReadOnlyProperty, value);
} }
public char PasswordChar public char PasswordChar
{ {
get => GetValue(PasswordCharProperty); get => GetValue(PasswordCharProperty);
@ -368,21 +367,17 @@ namespace Avalonia.Controls
get => _text; get => _text;
set set
{ {
if (!_ignoreTextChanges) var caretIndex = CaretIndex;
{ var selectionStart = SelectionStart;
var caretIndex = CaretIndex; var selectionEnd = SelectionEnd;
var selectionStart = SelectionStart;
var selectionEnd = SelectionEnd;
CaretIndex = CoerceCaretIndex(caretIndex, value); CaretIndex = CoerceCaretIndex(caretIndex, value);
SelectionStart = CoerceCaretIndex(selectionStart, value); SelectionStart = CoerceCaretIndex(selectionStart, value);
SelectionEnd = CoerceCaretIndex(selectionEnd, value); SelectionEnd = CoerceCaretIndex(selectionEnd, value);
if (SetAndRaise(TextProperty, ref _text, value) && IsUndoEnabled && !_isUndoingRedoing)
if (SetAndRaise(TextProperty, ref _text, value) && IsUndoEnabled && !_isUndoingRedoing) {
{ _undoRedoHelper.Clear();
_undoRedoHelper.Clear(); SnapshotUndoRedo(); // so we always have an initial state
SnapshotUndoRedo(); // so we always have an initial state
}
} }
} }
} }
@ -736,32 +731,23 @@ namespace Avalonia.Controls
{ {
var oldText = _text; var oldText = _text;
_ignoreTextChanges = true; DeleteSelection(false);
var caretIndex = CaretIndex;
try text = Text ?? string.Empty;
{ SetTextInternal(text.Substring(0, caretIndex) + input + text.Substring(caretIndex));
DeleteSelection(false); ClearSelection();
var caretIndex = CaretIndex;
text = Text ?? string.Empty;
SetTextInternal(text.Substring(0, caretIndex) + input + text.Substring(caretIndex));
ClearSelection();
if (IsUndoEnabled)
{
_undoRedoHelper.DiscardRedo();
}
if (_text != oldText)
{
RaisePropertyChanged(TextProperty, oldText, _text);
}
CaretIndex = caretIndex + input.Length; if (IsUndoEnabled)
{
_undoRedoHelper.DiscardRedo();
} }
finally
if (_text != oldText)
{ {
_ignoreTextChanges = false; RaisePropertyChanged(TextProperty, oldText, _text);
} }
CaretIndex = caretIndex + input.Length;
} }
} }
@ -1499,15 +1485,7 @@ namespace Avalonia.Controls
{ {
if (raiseTextChanged) if (raiseTextChanged)
{ {
try SetAndRaise(TextProperty, ref _text, value);
{
_ignoreTextChanges = true;
SetAndRaise(TextProperty, ref _text, value);
}
finally
{
_ignoreTextChanges = false;
}
} }
else else
{ {

28
tests/Avalonia.Controls.UnitTests/MaskedTextBoxTests.cs

@ -179,34 +179,6 @@ namespace Avalonia.Controls.UnitTests
} }
} }
[Fact]
public void Typing_Beginning_With_0_Should_Not_Modify_Text_When_Bound_To_Int()
{
using (Start())
{
var source = new Class1();
var target = new MaskedTextBox
{
DataContext = source,
Template = CreateTemplate(),
};
target.ApplyTemplate();
target.Bind(TextBox.TextProperty, new Binding(nameof(Class1.Foo), BindingMode.TwoWay));
Assert.Equal("0", target.Text);
target.CaretIndex = 1;
target.RaiseEvent(new TextInputEventArgs
{
RoutedEvent = InputElement.TextInputEvent,
Text = "2",
});
Assert.Equal("02", target.Text);
}
}
[Fact] [Fact]
public void Control_Backspace_Should_Remove_The_Word_Before_The_Caret_If_There_Is_No_Selection() public void Control_Backspace_Should_Remove_The_Word_Before_The_Caret_If_There_Is_No_Selection()
{ {

28
tests/Avalonia.Controls.UnitTests/TextBoxTests.cs

@ -180,34 +180,6 @@ namespace Avalonia.Controls.UnitTests
} }
} }
[Fact]
public void Typing_Beginning_With_0_Should_Not_Modify_Text_When_Bound_To_Int()
{
using (UnitTestApplication.Start(Services))
{
var source = new Class1();
var target = new TextBox
{
DataContext = source,
Template = CreateTemplate(),
};
target.ApplyTemplate();
target.Bind(TextBox.TextProperty, new Binding(nameof(Class1.Foo), BindingMode.TwoWay));
Assert.Equal("0", target.Text);
target.CaretIndex = 1;
target.RaiseEvent(new TextInputEventArgs
{
RoutedEvent = InputElement.TextInputEvent,
Text = "2",
});
Assert.Equal("02", target.Text);
}
}
[Fact] [Fact]
public void Control_Backspace_Should_Remove_The_Word_Before_The_Caret_If_There_Is_No_Selection() public void Control_Backspace_Should_Remove_The_Word_Before_The_Caret_If_There_Is_No_Selection()
{ {

Loading…
Cancel
Save