From c6eb57c5350cf2e236f6c3c8bc26297b24d70ef7 Mon Sep 17 00:00:00 2001 From: Deadpikle Date: Sun, 6 Jun 2021 13:19:46 -0400 Subject: [PATCH] Add TextBox UndoLimit --- src/Avalonia.Controls/TextBox.cs | 20 +++++++++++++++++++ src/Avalonia.Controls/Utils/UndoRedoHelper.cs | 11 ++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index e38531e540..ffe0d39cab 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -138,6 +138,13 @@ namespace Avalonia.Controls nameof(IsUndoEnabled), defaultValue: true); + public static readonly DirectProperty UndoLimitProperty = + AvaloniaProperty.RegisterDirect( + nameof(UndoLimit), + o => o._undoRedoHelper.Limit, + (o, v) => o._undoRedoHelper.Limit = v, + unsetValue: -1); + struct UndoRedoState : IEquatable { public string Text { get; } @@ -472,6 +479,19 @@ namespace Avalonia.Controls } } + public int UndoLimit + { + get { return GetValue(UndoLimitProperty); } + set + { + SetValue(UndoLimitProperty, value); + // from docs at + // https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.primitives.textboxbase.isundoenabled: + // "Setting UndoLimit clears the undo queue." + _undoRedoHelper.Clear(); + } + } + protected override void OnApplyTemplate(TemplateAppliedEventArgs e) { _presenter = e.NameScope.Get("PART_TextPresenter"); diff --git a/src/Avalonia.Controls/Utils/UndoRedoHelper.cs b/src/Avalonia.Controls/Utils/UndoRedoHelper.cs index 17cf681f15..7374f20a0c 100644 --- a/src/Avalonia.Controls/Utils/UndoRedoHelper.cs +++ b/src/Avalonia.Controls/Utils/UndoRedoHelper.cs @@ -22,6 +22,10 @@ namespace Avalonia.Controls.Utils private LinkedListNode _currentNode; + /// + /// Maximum number of states this helper can store for undo/redo. + /// If -1, no limit is imposed. + /// public int Limit { get; set; } = 10; public UndoRedoHelper(IUndoRedoHost host) @@ -54,7 +58,10 @@ namespace Avalonia.Controls.Utils public bool HasState => _currentNode != null; public void UpdateLastState(TState state) { - _states.Last.Value = state; + if (_states.Last != null) + { + _states.Last.Value = state; + } } public void UpdateLastState() @@ -86,7 +93,7 @@ namespace Avalonia.Controls.Utils DiscardRedo(); _states.AddLast(current); _currentNode = _states.Last; - if (_states.Count > Limit) + if (Limit != -1 && _states.Count > Limit) _states.RemoveFirst(); } }