From 6797c26bf9e57bb0b0240f128c11e4de716e3f80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81d=C3=A1m=20Kov=C3=A1cs?= Date: Sun, 13 Aug 2023 13:38:30 +0200 Subject: [PATCH] TextBox improvements, CommandPalette --- .../ViewModels/CommandPaletteViewModel.cs | 1 + .../Controls/CommandPalette.cs | 35 ++++++++++++++++--- src/Library/TerminalUI/Controls/TextBox.cs | 35 ++++++++++++++++--- src/Library/TerminalUI/Controls/View.cs | 17 ++++++++- 4 files changed, 78 insertions(+), 10 deletions(-) diff --git a/src/AppCommon/FileTime.App.CommandPalette/ViewModels/CommandPaletteViewModel.cs b/src/AppCommon/FileTime.App.CommandPalette/ViewModels/CommandPaletteViewModel.cs index 3f121e2..3868c79 100644 --- a/src/AppCommon/FileTime.App.CommandPalette/ViewModels/CommandPaletteViewModel.cs +++ b/src/AppCommon/FileTime.App.CommandPalette/ViewModels/CommandPaletteViewModel.cs @@ -83,6 +83,7 @@ public class CommandPaletteViewModel : FuzzyPanelViewModel View() { var inputTextBox = new TextBox() - .WithKeyHandler(k => + .WithKeyHandler((sender, k) => { if (k.Key == Keys.Escape) { _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 @@ -79,14 +102,16 @@ public class CommandPalette item.Bind( item.Parent, - d => d.CommandPalette.SelectedItem == item ? _theme.ListViewItemTheme.SelectedBackgroundColor : null, - t => t.Background + d => d.CommandPalette.SelectedItem == item.DataContext ? _theme.ListViewItemTheme.SelectedBackgroundColor : null, + t => t.Background, + v => v ); item.Bind( item.Parent, - d => d.CommandPalette.SelectedItem == item ? _theme.ListViewItemTheme.SelectedForegroundColor : null, - t => t.Foreground + d => d.CommandPalette.SelectedItem == item.DataContext ? _theme.ListViewItemTheme.SelectedForegroundColor : null, + t => t.Foreground, + v => v ); return root; diff --git a/src/Library/TerminalUI/Controls/TextBox.cs b/src/Library/TerminalUI/Controls/TextBox.cs index 628fdaf..ca25909 100644 --- a/src/Library/TerminalUI/Controls/TextBox.cs +++ b/src/Library/TerminalUI/Controls/TextBox.cs @@ -1,4 +1,5 @@ -using System.Diagnostics; +using System.ComponentModel; +using System.Diagnostics; using GeneralInputKey; using PropertyChanged.SourceGenerator; using TerminalUI.Color; @@ -19,7 +20,8 @@ public partial class TextBox : View, IFocusable, IDisplayView IColor? BackgroundColor ); - private readonly List> _keyHandlers = new(); + private readonly List, GeneralKeyEventArgs>> _keyHandlers = new(); + private readonly List, string>> _textHandlers = new(); private RenderState? _lastRenderState; private string _text = string.Empty; @@ -53,6 +55,19 @@ public partial class TextBox : View, IFocusable, IDisplayView _textLines = _text.Split(Environment.NewLine).ToList(); RerenderProperties.Add(nameof(Text)); 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() @@ -283,16 +298,28 @@ public partial class TextBox : View, IFocusable, IDisplayView { foreach (var keyHandler in _keyHandlers) { - keyHandler(keyEventArgs); + keyHandler(this, keyEventArgs); if (keyEventArgs.Handled) return true; } return false; } - public TextBox WithKeyHandler(Action keyHandler) + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + _keyHandlers.Clear(); + } + + public TextBox WithKeyHandler(Action, GeneralKeyEventArgs> keyHandler) { _keyHandlers.Add(keyHandler); return this; } + + public TextBox WithTextHandler(Action, string> textChanged) + { + _textHandlers.Add(textChanged); + return this; + } } \ No newline at end of file diff --git a/src/Library/TerminalUI/Controls/View.cs b/src/Library/TerminalUI/Controls/View.cs index b1afbba..106a7fd 100644 --- a/src/Library/TerminalUI/Controls/View.cs +++ b/src/Library/TerminalUI/Controls/View.cs @@ -151,7 +151,22 @@ public abstract partial class View : IView ); } - 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) { renderContext.Statistics.RenderedViews++;