From 2b3e94e1d1d73aa628de00bf62eddf2672227135 Mon Sep 17 00:00:00 2001 From: leo Date: Mon, 7 Jul 2025 14:43:08 +0800 Subject: [PATCH] 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 --- src/ViewModels/Histories.cs | 35 +++++++++++++---------------------- src/Views/Histories.axaml.cs | 17 ++++++++++++++--- 2 files changed, 27 insertions(+), 25 deletions(-) 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;