diff --git a/src/ViewModels/Histories.cs b/src/ViewModels/Histories.cs index e98c6f9f..ab554b9a 100644 --- a/src/ViewModels/Histories.cs +++ b/src/ViewModels/Histories.cs @@ -299,39 +299,30 @@ namespace SourceGit.ViewModels } } - public ContextMenu MakeContextMenu(DataGrid list) + public ContextMenu CreateContextMenuForSelectedCommits(List selected, Action 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(); 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(); @@ -699,7 +690,7 @@ namespace SourceGit.ViewModels } else { - list.SelectedItems.Add(head); + onAddSelected?.Invoke(head); } e.Handled = true; diff --git a/src/Views/Histories.axaml.cs b/src/Views/Histories.axaml.cs index db31ea09..587d0f9b 100644 --- a/src/Views/Histories.axaml.cs +++ b/src/Views/Histories.axaml.cs @@ -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(); + 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;