refactor: rewrite the way to create context menu for selected commits

- `DataGrid` always returns selected items in order. There's no need to sort commits
- Use callback instead of passing the `DataGrid` to ViewModels.

Signed-off-by: leo <longshuang@msn.cn>
This commit is contained in:
leo
2025-07-07 14:43:08 +08:00
parent 7c33470843
commit 2b3e94e1d1
2 changed files with 27 additions and 25 deletions

View File

@@ -299,39 +299,30 @@ namespace SourceGit.ViewModels
}
}
public ContextMenu MakeContextMenu(DataGrid list)
public ContextMenu CreateContextMenuForSelectedCommits(List<Models.Commit> selected, Action<Models.Commit> onAddSelected)
{
var current = _repo.CurrentBranch;
if (current == null || list.SelectedItems == null)
if (current == null)
return null;
if (list.SelectedItems.Count > 1)
if (selected.Count > 1)
{
var selected = new List<Models.Commit>();
var canCherryPick = true;
var canMerge = true;
foreach (var item in list.SelectedItems)
foreach (var c in selected)
{
if (item is Models.Commit c)
if (c.IsMerged)
{
selected.Add(c);
if (c.IsMerged)
{
canMerge = false;
canCherryPick = false;
}
else if (c.Parents.Count > 1)
{
canCherryPick = false;
}
canMerge = false;
canCherryPick = false;
}
else if (c.Parents.Count > 1)
{
canCherryPick = false;
}
}
// Sort selected commits in order.
selected.Sort((l, r) => _commits.IndexOf(r) - _commits.IndexOf(l));
var multipleMenu = new ContextMenu();
if (!_repo.IsBare)
@@ -449,7 +440,7 @@ namespace SourceGit.ViewModels
return multipleMenu;
}
var commit = (list.SelectedItem as Models.Commit)!;
var commit = selected[0];
var menu = new ContextMenu();
var tags = new List<Models.Tag>();
@@ -699,7 +690,7 @@ namespace SourceGit.ViewModels
}
else
{
list.SelectedItems.Add(head);
onAddSelected?.Invoke(head);
}
e.Handled = true;

View File

@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Text;
using Avalonia;
@@ -198,11 +199,21 @@ namespace SourceGit.Views
private void OnCommitListContextRequested(object sender, ContextRequestedEventArgs e)
{
if (DataContext is ViewModels.Histories histories &&
sender is DataGrid { SelectedItems.Count: > 0 } dataGrid &&
sender is DataGrid { SelectedItems: { } selected } dataGrid &&
e.Source is Control { DataContext: Models.Commit })
{
var menu = histories.MakeContextMenu(dataGrid);
menu?.Open(dataGrid);
var commits = new List<Models.Commit>();
for (var i = selected.Count - 1; i >= 0; i--)
{
if (selected[i] is Models.Commit c)
commits.Add(c);
}
if (selected.Count > 0)
{
var menu = histories.CreateContextMenuForSelectedCommits(commits, c => dataGrid.SelectedItems.Add(c));
menu?.Open(dataGrid);
}
}
e.Handled = true;