diff --git a/src/AppCommon/FileTime.App.FrequencyNavigation.Abstractions/ViewModels/IFrequencyNavigationViewModel.cs b/src/AppCommon/FileTime.App.FrequencyNavigation.Abstractions/ViewModels/IFrequencyNavigationViewModel.cs index 657ee6e..468c1a0 100644 --- a/src/AppCommon/FileTime.App.FrequencyNavigation.Abstractions/ViewModels/IFrequencyNavigationViewModel.cs +++ b/src/AppCommon/FileTime.App.FrequencyNavigation.Abstractions/ViewModels/IFrequencyNavigationViewModel.cs @@ -1,5 +1,4 @@ using DeclarativeProperty; -using FileTime.App.Core.Models; using FileTime.App.Core.ViewModels; using FileTime.App.FuzzyPanel; using GeneralInputKey; diff --git a/src/ConsoleApp/FileTime.ConsoleUI.App.Abstractions/FileTime.ConsoleUI.App.Abstractions.csproj b/src/ConsoleApp/FileTime.ConsoleUI.App.Abstractions/FileTime.ConsoleUI.App.Abstractions.csproj index 8df2c70..1ed42e5 100644 --- a/src/ConsoleApp/FileTime.ConsoleUI.App.Abstractions/FileTime.ConsoleUI.App.Abstractions.csproj +++ b/src/ConsoleApp/FileTime.ConsoleUI.App.Abstractions/FileTime.ConsoleUI.App.Abstractions.csproj @@ -10,6 +10,7 @@ + diff --git a/src/ConsoleApp/FileTime.ConsoleUI.App.Abstractions/IRootViewModel.cs b/src/ConsoleApp/FileTime.ConsoleUI.App.Abstractions/IRootViewModel.cs index 79e77a4..4c19952 100644 --- a/src/ConsoleApp/FileTime.ConsoleUI.App.Abstractions/IRootViewModel.cs +++ b/src/ConsoleApp/FileTime.ConsoleUI.App.Abstractions/IRootViewModel.cs @@ -2,6 +2,7 @@ using FileTime.App.CommandPalette.ViewModels; using FileTime.App.Core.ViewModels; using FileTime.App.Core.ViewModels.Timeline; +using FileTime.App.FrequencyNavigation.ViewModels; using FileTime.ConsoleUI.App.Services; using FileTime.Core.Interactions; using FileTime.Core.Models; @@ -18,5 +19,6 @@ public interface IRootViewModel IDialogService DialogService { get; } ITimelineViewModel TimelineViewModel { get; } IDeclarativeProperty VolumeSizeInfo { get; } + IFrequencyNavigationViewModel FrequencyNavigation { get; } event Action? FocusReadInputElement; } \ No newline at end of file diff --git a/src/ConsoleApp/FileTime.ConsoleUI.App/Controls/CommandPalette.cs b/src/ConsoleApp/FileTime.ConsoleUI.App/Controls/CommandPalette.cs index ddaa60c..2a25486 100644 --- a/src/ConsoleApp/FileTime.ConsoleUI.App/Controls/CommandPalette.cs +++ b/src/ConsoleApp/FileTime.ConsoleUI.App/Controls/CommandPalette.cs @@ -28,6 +28,7 @@ public class CommandPalette if (k.Key == Keys.Escape) { _commandPaletteService.CloseCommandPalette(); + sender.Text = String.Empty; } if (!k.Handled) diff --git a/src/ConsoleApp/FileTime.ConsoleUI.App/Controls/FrequencyNavigation.cs b/src/ConsoleApp/FileTime.ConsoleUI.App/Controls/FrequencyNavigation.cs new file mode 100644 index 0000000..2e2affd --- /dev/null +++ b/src/ConsoleApp/FileTime.ConsoleUI.App/Controls/FrequencyNavigation.cs @@ -0,0 +1,140 @@ +using FileTime.App.FrequencyNavigation.Services; +using FileTime.ConsoleUI.App.Styling; +using GeneralInputKey; +using TerminalUI.Controls; +using TerminalUI.Extensions; +using TerminalUI.Models; +using TerminalUI.ViewExtensions; + +namespace FileTime.ConsoleUI.App.Controls; + +public class FrequencyNavigation +{ + private readonly ITheme _theme; + private readonly IFrequencyNavigationService _frequencyNavigationService; + + public FrequencyNavigation(ITheme theme, IFrequencyNavigationService frequencyNavigationService) + { + _theme = theme; + _frequencyNavigationService = frequencyNavigationService; + } + + public IView View() + { + var inputTextBox = new TextBox() + .WithKeyHandler((sender, k) => + { + if (k.Key == Keys.Escape) + { + _frequencyNavigationService.CloseNavigationWindow(); + sender.Text = String.Empty; + } + + if (!k.Handled) + { + sender.DataContext?.FrequencyNavigation.HandleKeyDown(k); + } + + if (!k.Handled) + { + sender.DataContext?.FrequencyNavigation.HandleKeyUp(k); + } + + if (k.Key == Keys.Enter) + { + sender.Text = String.Empty; + } + }) + .WithTextHandler((sender, text) => + { + if (sender.DataContext is not null) + { + sender.DataContext.FrequencyNavigation.SearchText = text; + } + });; + + var root = new Border + { + Margin = 5, + Padding = 1, + MaxWidth = 50, + Content = new Grid + { + RowDefinitionsObject = "Auto *", + ChildInitializer = + { + new Border + { + Margin = new Thickness(0, 0, 0, 1), + Content = inputTextBox + }, + new ListView + { + Extensions = + { + new GridPositionExtension(0, 1) + }, + ItemTemplate = item => + { + var root = new Grid + { + ChildInitializer = + { + new TextBlock() + .Setup(t => t.Bind( + t, + d => d, + t => t.Text)), + } + }; + + item.Bind( + item.Parent, + d => d.FrequencyNavigation.SelectedItem == item.DataContext ? _theme.ListViewItemTheme.SelectedBackgroundColor : null, + t => t.Background + ); + + item.Bind( + item.Parent, + d => d.FrequencyNavigation.SelectedItem == item.DataContext ? _theme.ListViewItemTheme.SelectedForegroundColor : null, + t => t.Foreground + ); + + return root; + } + }.Setup(t => t.Bind( + t, + d => d.FrequencyNavigation.FilteredMatches, + t => t.ItemsSource + )) + .Setup(t => t.Bind( + t, + d => d.FrequencyNavigation.SelectedItem, + t => t.SelectedItem + )) + } + } + }; + + root.WithPropertyChangedHandler(r => r.IsVisible, + (_, isVisible) => + { + if (isVisible) + { + inputTextBox.Focus(); + } + else + { + inputTextBox.UnFocus(); + } + }); + + root.Bind( + root, + d => d.FrequencyNavigation.ShowWindow.Value, + t => t.IsVisible, + r => r); + + return root; + } +} \ No newline at end of file diff --git a/src/ConsoleApp/FileTime.ConsoleUI.App/FileTime.ConsoleUI.App.csproj b/src/ConsoleApp/FileTime.ConsoleUI.App/FileTime.ConsoleUI.App.csproj index c03e862..cdb554c 100644 --- a/src/ConsoleApp/FileTime.ConsoleUI.App/FileTime.ConsoleUI.App.csproj +++ b/src/ConsoleApp/FileTime.ConsoleUI.App/FileTime.ConsoleUI.App.csproj @@ -21,6 +21,7 @@ + diff --git a/src/ConsoleApp/FileTime.ConsoleUI.App/MainWindow.cs b/src/ConsoleApp/FileTime.ConsoleUI.App/MainWindow.cs index 86ac62a..0443e2b 100644 --- a/src/ConsoleApp/FileTime.ConsoleUI.App/MainWindow.cs +++ b/src/ConsoleApp/FileTime.ConsoleUI.App/MainWindow.cs @@ -31,6 +31,7 @@ public class MainWindow private readonly IApplicationContext _applicationContext; private readonly ITheme _theme; private readonly CommandPalette _commandPalette; + private readonly FrequencyNavigation _frequencyNavigation; private readonly Dialogs _dialogs; private readonly Timeline _timeline; private readonly Lazy _root; @@ -41,6 +42,7 @@ public class MainWindow IApplicationContext applicationContext, ITheme theme, CommandPalette commandPalette, + FrequencyNavigation frequencyNavigation, Dialogs dialogs, Timeline timeline) { @@ -48,6 +50,7 @@ public class MainWindow _applicationContext = applicationContext; _theme = theme; _commandPalette = commandPalette; + _frequencyNavigation = frequencyNavigation; _dialogs = dialogs; _timeline = timeline; _root = new Lazy(Initialize); @@ -70,6 +73,7 @@ public class MainWindow { MainContent(), _commandPalette.View(), + _frequencyNavigation.View(), _dialogs.View(), } }; diff --git a/src/ConsoleApp/FileTime.ConsoleUI.App/RootViewModel.cs b/src/ConsoleApp/FileTime.ConsoleUI.App/RootViewModel.cs index c77ce9e..f8d75ab 100644 --- a/src/ConsoleApp/FileTime.ConsoleUI.App/RootViewModel.cs +++ b/src/ConsoleApp/FileTime.ConsoleUI.App/RootViewModel.cs @@ -2,6 +2,7 @@ using FileTime.App.CommandPalette.ViewModels; using FileTime.App.Core.ViewModels; using FileTime.App.Core.ViewModels.Timeline; +using FileTime.App.FrequencyNavigation.ViewModels; using FileTime.ConsoleUI.App.Services; using FileTime.Core.Interactions; using FileTime.Core.Models; @@ -15,6 +16,7 @@ public class RootViewModel : IRootViewModel public IPossibleCommandsViewModel PossibleCommands { get; } public IConsoleAppState AppState { get; } public ICommandPaletteViewModel CommandPalette { get; } + public IFrequencyNavigationViewModel FrequencyNavigation { get; } public IDialogService DialogService { get; } public ITimelineViewModel TimelineViewModel { get; } public IDeclarativeProperty VolumeSizeInfo { get;} @@ -26,13 +28,15 @@ public class RootViewModel : IRootViewModel IPossibleCommandsViewModel possibleCommands, ICommandPaletteViewModel commandPalette, IDialogService dialogService, - ITimelineViewModel timelineViewModel) + ITimelineViewModel timelineViewModel, + IFrequencyNavigationViewModel frequencyNavigation) { AppState = appState; PossibleCommands = possibleCommands; CommandPalette = commandPalette; DialogService = dialogService; TimelineViewModel = timelineViewModel; + FrequencyNavigation = frequencyNavigation; DialogService.ReadInput.PropertyChanged += (o, e) => { diff --git a/src/ConsoleApp/FileTime.ConsoleUI.App/Startup.cs b/src/ConsoleApp/FileTime.ConsoleUI.App/Startup.cs index 2ebf001..9a4db37 100644 --- a/src/ConsoleApp/FileTime.ConsoleUI.App/Startup.cs +++ b/src/ConsoleApp/FileTime.ConsoleUI.App/Startup.cs @@ -38,6 +38,7 @@ public static class Startup services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(); + services.TryAddSingleton(); return services; } } \ No newline at end of file diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp/FileTime.GuiApp.csproj b/src/GuiApp/Avalonia/FileTime.GuiApp/FileTime.GuiApp.csproj index 470f580..f54324a 100644 --- a/src/GuiApp/Avalonia/FileTime.GuiApp/FileTime.GuiApp.csproj +++ b/src/GuiApp/Avalonia/FileTime.GuiApp/FileTime.GuiApp.csproj @@ -7,7 +7,7 @@ copyused true filetime.ico - 0.2.1 + 0.2.2