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