TextBox improvements, CommandPalette

This commit is contained in:
2023-08-13 13:38:30 +02:00
parent a594e1b989
commit 6797c26bf9
4 changed files with 78 additions and 10 deletions

View File

@@ -83,6 +83,7 @@ public class CommandPaletteViewModel : FuzzyPanelViewModel<ICommandPaletteEntryV
keyEventArgs.Handled = true; keyEventArgs.Handled = true;
Close(); Close();
SearchText = string.Empty;
try try
{ {

View File

@@ -19,15 +19,38 @@ public class CommandPalette
_theme = theme; _theme = theme;
_commandPaletteService = commandPaletteService; _commandPaletteService = commandPaletteService;
} }
public Border<IRootViewModel> View() public Border<IRootViewModel> View()
{ {
var inputTextBox = new TextBox<IRootViewModel>() var inputTextBox = new TextBox<IRootViewModel>()
.WithKeyHandler(k => .WithKeyHandler((sender, k) =>
{ {
if (k.Key == Keys.Escape) if (k.Key == Keys.Escape)
{ {
_commandPaletteService.CloseCommandPalette(); _commandPaletteService.CloseCommandPalette();
} }
if (!k.Handled)
{
sender.DataContext?.CommandPalette.HandleKeyDown(k);
}
if (!k.Handled)
{
sender.DataContext?.CommandPalette.HandleKeyUp(k);
}
if (k.Key == Keys.Enter)
{
sender.Text = String.Empty;
}
})
.WithTextHandler((sender, text) =>
{
if (sender.DataContext is not null)
{
sender.DataContext.CommandPalette.SearchText = text;
}
}); });
var root = new Border<IRootViewModel> var root = new Border<IRootViewModel>
@@ -79,14 +102,16 @@ public class CommandPalette
item.Bind( item.Bind(
item.Parent, item.Parent,
d => d.CommandPalette.SelectedItem == item ? _theme.ListViewItemTheme.SelectedBackgroundColor : null, d => d.CommandPalette.SelectedItem == item.DataContext ? _theme.ListViewItemTheme.SelectedBackgroundColor : null,
t => t.Background t => t.Background,
v => v
); );
item.Bind( item.Bind(
item.Parent, item.Parent,
d => d.CommandPalette.SelectedItem == item ? _theme.ListViewItemTheme.SelectedForegroundColor : null, d => d.CommandPalette.SelectedItem == item.DataContext ? _theme.ListViewItemTheme.SelectedForegroundColor : null,
t => t.Foreground t => t.Foreground,
v => v
); );
return root; return root;

View File

@@ -1,4 +1,5 @@
using System.Diagnostics; using System.ComponentModel;
using System.Diagnostics;
using GeneralInputKey; using GeneralInputKey;
using PropertyChanged.SourceGenerator; using PropertyChanged.SourceGenerator;
using TerminalUI.Color; using TerminalUI.Color;
@@ -19,7 +20,8 @@ public partial class TextBox<T> : View<T>, IFocusable, IDisplayView
IColor? BackgroundColor IColor? BackgroundColor
); );
private readonly List<Action<GeneralKeyEventArgs>> _keyHandlers = new(); private readonly List<Action<TextBox<T>, GeneralKeyEventArgs>> _keyHandlers = new();
private readonly List<Action<TextBox<T>, string>> _textHandlers = new();
private RenderState? _lastRenderState; private RenderState? _lastRenderState;
private string _text = string.Empty; private string _text = string.Empty;
@@ -53,6 +55,19 @@ public partial class TextBox<T> : View<T>, IFocusable, IDisplayView
_textLines = _text.Split(Environment.NewLine).ToList(); _textLines = _text.Split(Environment.NewLine).ToList();
RerenderProperties.Add(nameof(Text)); RerenderProperties.Add(nameof(Text));
RerenderProperties.Add(nameof(MultiLine)); RerenderProperties.Add(nameof(MultiLine));
((INotifyPropertyChanged) this).PropertyChanged += OnPropertyChangedEventHandler;
}
private void OnPropertyChangedEventHandler(object sender, PropertyChangedEventArgs args)
{
if (args.PropertyName == nameof(Text))
{
foreach (var textHandler in _textHandlers)
{
textHandler(this, Text);
}
}
} }
private void UpdateTextField() private void UpdateTextField()
@@ -283,16 +298,28 @@ public partial class TextBox<T> : View<T>, IFocusable, IDisplayView
{ {
foreach (var keyHandler in _keyHandlers) foreach (var keyHandler in _keyHandlers)
{ {
keyHandler(keyEventArgs); keyHandler(this, keyEventArgs);
if (keyEventArgs.Handled) return true; if (keyEventArgs.Handled) return true;
} }
return false; return false;
} }
public TextBox<T> WithKeyHandler(Action<GeneralKeyEventArgs> keyHandler) protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
_keyHandlers.Clear();
}
public TextBox<T> WithKeyHandler(Action<TextBox<T>, GeneralKeyEventArgs> keyHandler)
{ {
_keyHandlers.Add(keyHandler); _keyHandlers.Add(keyHandler);
return this; return this;
} }
public TextBox<T> WithTextHandler(Action<TextBox<T>, string> textChanged)
{
_textHandlers.Add(textChanged);
return this;
}
} }

View File

@@ -151,7 +151,22 @@ public abstract partial class View<T> : IView<T>
); );
} }
var renderResult = RenderMethod(renderContext, position, size); bool renderResult;
if (Background != null || Foreground != null)
{
var newRenderContext = new RenderContext(
renderContext.ConsoleDriver,
renderContext.ForceRerender,
Foreground ?? renderContext.Foreground,
Background ?? renderContext.Background,
renderContext.Statistics);
renderResult = RenderMethod(newRenderContext, position, size);
}
else
{
renderResult = RenderMethod(renderContext, position, size);
}
if (renderResult) if (renderResult)
{ {
renderContext.Statistics.RenderedViews++; renderContext.Statistics.RenderedViews++;