From 71d36698f8bb5f901ca6ef41220235e34e52bc79 Mon Sep 17 00:00:00 2001 From: leo Date: Thu, 22 Aug 2024 15:45:50 +0800 Subject: [PATCH] feature: select and open repository by keyboard in Welcome page (#391) --- src/Views/Welcome.axaml | 10 +++++++++- src/Views/Welcome.axaml.cs | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/Views/Welcome.axaml b/src/Views/Welcome.axaml index ba127cfb..6e0e1d94 100644 --- a/src/Views/Welcome.axaml +++ b/src/Views/Welcome.axaml @@ -19,6 +19,7 @@ BorderThickness="1" Background="{DynamicResource Brush.Contents}" Watermark="{DynamicResource Text.Welcome.Search}" + KeyDown="OnSearchBoxKeyDown" VerticalContentAlignment="Center" Text="{Binding SearchFilter, Mode=TwoWay}" v:AutoFocusBehaviour.IsEnabled="True"> @@ -34,12 +35,14 @@ + LostFocus="OnTreeViewLostFocus" + KeyDown="OnTreeViewKeyDown"> @@ -55,6 +58,11 @@ + + + + + diff --git a/src/Views/Welcome.axaml.cs b/src/Views/Welcome.axaml.cs index 91c156e6..2cb08021 100644 --- a/src/Views/Welcome.axaml.cs +++ b/src/Views/Welcome.axaml.cs @@ -35,6 +35,40 @@ namespace SourceGit.Views } } + private void OnSearchBoxKeyDown(object sender, KeyEventArgs e) + { + if (e.Key == Key.Down || e.Key == Key.FnDownArrow) + { + var containers = ReposTree.GetRealizedContainers(); + if (containers == null) + return; + + foreach (var c in containers) + { + if (c is TreeViewItem { IsVisible: true } item) + { + ReposTree.SelectedItem = item.DataContext; + item.Focus(); + break; + } + } + + e.Handled = true; + } + } + + private void OnTreeViewKeyDown(object sender, KeyEventArgs e) + { + if (e.Key == Key.Space && ReposTree.SelectedItem is ViewModels.RepositoryNode { IsRepository: true } node) + { + var parent = this.FindAncestorOfType(); + if (parent?.DataContext is ViewModels.Launcher launcher) + launcher.OpenRepositoryInTab(node, null); + + e.Handled = true; + } + } + private void OnTreeNodeContextRequested(object sender, ContextRequestedEventArgs e) { if (sender is Grid grid)