code_review: PR #1412

- Use `ViewModels.StashesPage.SelectedStash` instead of `sender is not ListBox { SelectedValue: Models.Stash stash }`
- In tags view, `SelectedItem` can be `Models.Tag` or `ViewModels.TagTreeNode`
- In logs window, `vm.SelectedLog` may be null

Signed-off-by: leo <longshuang@msn.cn>
This commit is contained in:
leo 2025-06-11 16:13:47 +08:00
parent 196b454ae8
commit a128b67bd4
No known key found for this signature in database
10 changed files with 56 additions and 70 deletions

View file

@ -1365,12 +1365,6 @@ namespace SourceGit.ViewModels
ShowPopup(new DeleteBranch(this, branch)); 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) public void DeleteMultipleBranches(List<Models.Branch> branches, bool isLocal)
{ {
if (CanCreatePopup()) if (CanCreatePopup())
@ -1407,6 +1401,12 @@ namespace SourceGit.ViewModels
ShowPopup(new AddRemote(this)); ShowPopup(new AddRemote(this));
} }
public void DeleteRemote(Models.Remote remote)
{
if (CanCreatePopup())
ShowPopup(new DeleteRemote(this, remote));
}
public void AddSubmodule() public void AddSubmodule()
{ {
if (CanCreatePopup()) if (CanCreatePopup())

View file

@ -295,6 +295,12 @@ namespace SourceGit.ViewModels
SearchFilter = string.Empty; SearchFilter = string.Empty;
} }
public void Drop(Models.Stash stash)
{
if (stash != null && _repo.CanCreatePopup())
_repo.ShowPopup(new DropStash(_repo, stash));
}
private void RefreshVisible() private void RefreshVisible()
{ {
if (string.IsNullOrEmpty(_searchFilter)) if (string.IsNullOrEmpty(_searchFilter))
@ -314,12 +320,6 @@ namespace SourceGit.ViewModels
} }
} }
public void Drop(Models.Stash stash)
{
if (_repo.CanCreatePopup())
_repo.ShowPopup(new DropStash(_repo, stash));
}
private Repository _repo = null; private Repository _repo = null;
private List<Models.Stash> _stashes = []; private List<Models.Stash> _stashes = [];
private List<Models.Stash> _visibleStashes = []; private List<Models.Stash> _visibleStashes = [];

View file

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

View file

@ -450,7 +450,7 @@ namespace SourceGit.Views
} }
} }
private void OnListKeyDown(object _, KeyEventArgs e) private void OnTreeKeyDown(object _, KeyEventArgs e)
{ {
if (e.Key is not (Key.Delete or Key.Back)) if (e.Key is not (Key.Delete or Key.Back))
return; return;
@ -463,7 +463,7 @@ namespace SourceGit.Views
if (selected == null || selected.Count == 0) if (selected == null || selected.Count == 0)
return; return;
if (selected is [ViewModels.BranchTreeNode { Backend: Models.Remote remote }]) if (selected.Count == 1 && selected[0] is ViewModels.BranchTreeNode { Backend: Models.Remote remote })
{ {
repo.DeleteRemote(remote); repo.DeleteRemote(remote);
e.Handled = true; e.Handled = true;

View file

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

View file

@ -24,17 +24,7 @@ namespace SourceGit.Views
layout.StashesLeftWidth = new GridLength(maxLeft, GridUnitType.Pixel); layout.StashesLeftWidth = new GridLength(maxLeft, GridUnitType.Pixel);
} }
private void OnStashContextRequested(object sender, ContextRequestedEventArgs e) private void OnStashListKeyDown(object sender, KeyEventArgs e)
{
if (DataContext is ViewModels.StashesPage vm && sender is Border border)
{
var menu = vm.MakeContextMenu(border.DataContext as Models.Stash);
menu?.Open(border);
}
e.Handled = true;
}
private void OnStashKeyDown(object sender, KeyEventArgs e)
{ {
if (e.Key is not (Key.Delete or Key.Back)) if (e.Key is not (Key.Delete or Key.Back))
return; return;
@ -42,10 +32,17 @@ namespace SourceGit.Views
if (DataContext is not ViewModels.StashesPage vm) if (DataContext is not ViewModels.StashesPage vm)
return; return;
if (sender is not ListBox { SelectedValue: Models.Stash stash }) vm.Drop(vm.SelectedStash);
return; e.Handled = true;
}
vm.Drop(stash); private void OnStashContextRequested(object sender, ContextRequestedEventArgs e)
{
if (DataContext is ViewModels.StashesPage vm && sender is Border border)
{
var menu = vm.MakeContextMenu(border.DataContext as Models.Stash);
menu?.Open(border);
}
e.Handled = true; e.Handled = true;
} }

View file

@ -217,13 +217,15 @@ namespace SourceGit.Views
private void OnKeyDown(object sender, KeyEventArgs e) private void OnKeyDown(object sender, KeyEventArgs e)
{ {
if (sender is not ListBox { SelectedValue: Models.Tag tag })
return;
if (DataContext is not ViewModels.Repository repo) if (DataContext is not ViewModels.Repository repo)
return; return;
repo.DeleteTag(tag); var selected = (sender as ListBox)?.SelectedItem;
if (selected is ViewModels.TagTreeNode { Tag: { } tagInNode })
repo.DeleteTag(tagInNode);
else if (selected is Models.Tag tag)
repo.DeleteTag(tag);
e.Handled = true; e.Handled = true;
} }
} }

View file

@ -45,11 +45,10 @@ namespace SourceGit.Views
{ {
if (e.Key is not (Key.Delete or Key.Back)) if (e.Key is not (Key.Delete or Key.Back))
return; return;
if (DataContext is not ViewModels.ViewLogs vm)
return;
vm.Logs.Remove(vm.SelectedLog); if (DataContext is ViewModels.ViewLogs { SelectedLog: { } log } vm)
vm.Logs.Remove(log);
e.Handled = true; e.Handled = true;
} }
} }

View file

@ -61,8 +61,7 @@
ItemsSource="{Binding Rows}" ItemsSource="{Binding Rows}"
SelectionMode="Single" SelectionMode="Single"
Loaded="SetupTreeViewDragAndDrop" Loaded="SetupTreeViewDragAndDrop"
LostFocus="OnTreeViewLostFocus" LostFocus="OnTreeViewLostFocus">
KeyDown="OnTreeViewKeyDown">
<ListBox.Styles> <ListBox.Styles>
<Style Selector="ListBox"> <Style Selector="ListBox">
<Setter Property="FocusAdorner"> <Setter Property="FocusAdorner">

View file

@ -31,9 +31,25 @@ namespace SourceGit.Views
protected override void OnKeyDown(KeyEventArgs e) protected override void OnKeyDown(KeyEventArgs e)
{ {
if (SelectedItem is ViewModels.RepositoryNode { IsRepository: false } node && e.KeyModifiers == KeyModifiers.None) if (SelectedItem is ViewModels.RepositoryNode node && e.KeyModifiers == KeyModifiers.None)
{ {
if ((node.IsExpanded && e.Key == Key.Left) || (!node.IsExpanded && e.Key == Key.Right)) if (e.Key is Key.Delete or Key.Back)
{
node.Delete();
e.Handled = true;
}
else if (node.IsRepository)
{
if (e.Key == Key.Enter)
{
var parent = this.FindAncestorOfType<Launcher>();
if (parent is { DataContext: ViewModels.Launcher launcher })
launcher.OpenRepositoryInTab(node, null);
e.Handled = true;
}
}
else if ((node.IsExpanded && e.Key == Key.Left) || (!node.IsExpanded && e.Key == Key.Right) || e.Key == Key.Enter)
{ {
ViewModels.Welcome.Instance.ToggleNodeIsExpanded(node); ViewModels.Welcome.Instance.ToggleNodeIsExpanded(node);
e.Handled = true; e.Handled = true;
@ -92,33 +108,6 @@ namespace SourceGit.Views
} }
} }
private void OnTreeViewKeyDown(object _, KeyEventArgs e)
{
if (TreeContainer.SelectedItem is ViewModels.RepositoryNode node)
{
if (e.Key == Key.Enter)
{
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;
}
else if (e.Key is Key.Delete or Key.Back)
{
node.Delete();
e.Handled = true;
}
}
}
private void OnTreeNodeContextRequested(object sender, ContextRequestedEventArgs e) private void OnTreeNodeContextRequested(object sender, ContextRequestedEventArgs e)
{ {
if (sender is Grid { DataContext: ViewModels.RepositoryNode node } grid) if (sender is Grid { DataContext: ViewModels.RepositoryNode node } grid)