feature: support delete key everywhere (#1412)

This commit is contained in:
Nathan Baulch 2025-06-11 17:35:43 +10:00 committed by GitHub
parent 5494093261
commit 196b454ae8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 127 additions and 11 deletions

View file

@ -1359,6 +1359,18 @@ namespace SourceGit.ViewModels
}
}
public void DeleteBranch(Models.Branch branch)
{
if (CanCreatePopup())
ShowPopup(new DeleteBranch(this, branch));
}
public void DeleteRemote(Models.Remote remote)
{
if (CanCreatePopup())
ShowPopup(new DeleteRemote(this, remote));
}
public void DeleteMultipleBranches(List<Models.Branch> branches, bool isLocal)
{
if (CanCreatePopup())
@ -1383,6 +1395,12 @@ namespace SourceGit.ViewModels
ShowPopup(new CreateTag(this, _currentBranch));
}
public void DeleteTag(Models.Tag tag)
{
if (CanCreatePopup())
ShowPopup(new DeleteTag(this, tag));
}
public void AddRemote()
{
if (CanCreatePopup())

View file

@ -314,6 +314,12 @@ namespace SourceGit.ViewModels
}
}
public void Drop(Models.Stash stash)
{
if (_repo.CanCreatePopup())
_repo.ShowPopup(new DropStash(_repo, stash));
}
private Repository _repo = null;
private List<Models.Stash> _stashes = [];
private List<Models.Stash> _visibleStashes = [];

View file

@ -13,6 +13,7 @@
ItemsSource="{Binding #ThisControl.Rows}"
SelectionMode="Multiple"
SelectionChanged="OnNodesSelectionChanged"
KeyDown="OnListKeyDown"
ContextRequested="OnTreeContextRequested">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>

View file

@ -450,6 +450,44 @@ namespace SourceGit.Views
}
}
private void OnListKeyDown(object _, KeyEventArgs e)
{
if (e.Key is not (Key.Delete or Key.Back))
return;
var repo = DataContext as ViewModels.Repository;
if (repo?.Settings == null)
return;
var selected = BranchesPresenter.SelectedItems;
if (selected == null || selected.Count == 0)
return;
if (selected is [ViewModels.BranchTreeNode { Backend: Models.Remote remote }])
{
repo.DeleteRemote(remote);
e.Handled = true;
return;
}
var branches = new List<Models.Branch>();
foreach (var item in selected)
{
if (item is ViewModels.BranchTreeNode node)
CollectBranchesInNode(branches, node);
}
if (branches.Find(x => x.IsCurrent) != null)
return;
if (branches.Count == 1)
repo.DeleteBranch(branches[0]);
else
repo.DeleteMultipleBranches(branches, branches[0].IsLocal);
e.Handled = true;
}
private void OnDoubleTappedBranchNode(object sender, TappedEventArgs _)
{
if (sender is Grid { DataContext: ViewModels.BranchTreeNode node })

View file

@ -65,6 +65,7 @@
ItemsSource="{Binding VisibleStashes}"
SelectedItem="{Binding SelectedStash, Mode=TwoWay}"
SelectionMode="Single"
KeyDown="OnStashKeyDown"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
ScrollViewer.VerticalScrollBarVisibility="Auto">
<ListBox.Styles>

View file

@ -1,4 +1,5 @@
using Avalonia.Controls;
using Avalonia.Input;
namespace SourceGit.Views
{
@ -33,6 +34,21 @@ namespace SourceGit.Views
e.Handled = true;
}
private void OnStashKeyDown(object sender, KeyEventArgs e)
{
if (e.Key is not (Key.Delete or Key.Back))
return;
if (DataContext is not ViewModels.StashesPage vm)
return;
if (sender is not ListBox { SelectedValue: Models.Stash stash })
return;
vm.Drop(stash);
e.Handled = true;
}
private void OnChangeContextRequested(object sender, ContextRequestedEventArgs e)
{
if (DataContext is ViewModels.StashesPage vm && sender is Grid grid)

View file

@ -23,6 +23,7 @@
<ListBox Classes="repo_left_content_list"
ItemsSource="{Binding Rows}"
SelectionMode="Single"
KeyDown="OnKeyDown"
SelectionChanged="OnSelectionChanged">
<ListBox.DataTemplates>
@ -88,6 +89,7 @@
Margin="8,0,0,0"
ItemsSource="{Binding Tags}"
SelectionMode="Single"
KeyDown="OnKeyDown"
SelectionChanged="OnSelectionChanged">
<ListBox.ItemTemplate>
<DataTemplate DataType="m:Tag">

View file

@ -214,6 +214,18 @@ namespace SourceGit.Views
if (selectedTag != null)
RaiseEvent(new RoutedEventArgs(SelectionChangedEvent));
}
private void OnKeyDown(object sender, KeyEventArgs e)
{
if (sender is not ListBox { SelectedValue: Models.Tag tag })
return;
if (DataContext is not ViewModels.Repository repo)
return;
repo.DeleteTag(tag);
e.Handled = true;
}
}
}

View file

@ -53,6 +53,7 @@
ItemsSource="{Binding Logs}"
SelectedItem="{Binding SelectedLog, Mode=TwoWay}"
SelectionMode="Single"
KeyDown="OnLogKeyDown"
Grid.IsSharedSizeScope="True"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
ScrollViewer.VerticalScrollBarVisibility="Auto">

View file

@ -1,4 +1,5 @@
using Avalonia.Controls;
using Avalonia.Input;
namespace SourceGit.Views
{
@ -39,5 +40,17 @@ namespace SourceGit.Views
e.Handled = true;
}
private void OnLogKeyDown(object _, KeyEventArgs e)
{
if (e.Key is not (Key.Delete or Key.Back))
return;
if (DataContext is not ViewModels.ViewLogs vm)
return;
vm.Logs.Remove(vm.SelectedLog);
e.Handled = true;
}
}
}

View file

@ -94,20 +94,28 @@ namespace SourceGit.Views
private void OnTreeViewKeyDown(object _, KeyEventArgs e)
{
if (TreeContainer.SelectedItem is ViewModels.RepositoryNode node && e.Key == Key.Enter)
if (TreeContainer.SelectedItem is ViewModels.RepositoryNode node)
{
if (node.IsRepository)
if (e.Key == Key.Enter)
{
var parent = this.FindAncestorOfType<Launcher>();
if (parent is { DataContext: ViewModels.Launcher launcher })
launcher.OpenRepositoryInTab(node, null);
}
else
{
ViewModels.Welcome.Instance.ToggleNodeIsExpanded(node);
}
if (node.IsRepository)
{
var parent = this.FindAncestorOfType<Launcher>();
if (parent is { DataContext: ViewModels.Launcher launcher })
launcher.OpenRepositoryInTab(node, null);
}
else
{
ViewModels.Welcome.Instance.ToggleNodeIsExpanded(node);
}
e.Handled = true;
e.Handled = true;
}
else if (e.Key is Key.Delete or Key.Back)
{
node.Delete();
e.Handled = true;
}
}
}