mirror of
https://fastgit.cc/github.com/sourcegit-scm/sourcegit
synced 2026-04-24 10:50:52 +08:00
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:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user