Skip to content

Commit 2b3e94e

Browse files
committed
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 <[email protected]>
1 parent 7c33470 commit 2b3e94e

File tree

2 files changed

+27
-25
lines changed

2 files changed

+27
-25
lines changed

src/ViewModels/Histories.cs

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -299,39 +299,30 @@ public void CheckoutBranchByCommit(Models.Commit commit)
299299
}
300300
}
301301

302-
public ContextMenu MakeContextMenu(DataGrid list)
302+
public ContextMenu CreateContextMenuForSelectedCommits(List<Models.Commit> selected, Action<Models.Commit> onAddSelected)
303303
{
304304
var current = _repo.CurrentBranch;
305-
if (current == null || list.SelectedItems == null)
305+
if (current == null)
306306
return null;
307307

308-
if (list.SelectedItems.Count > 1)
308+
if (selected.Count > 1)
309309
{
310-
var selected = new List<Models.Commit>();
311310
var canCherryPick = true;
312311
var canMerge = true;
313312

314-
foreach (var item in list.SelectedItems)
313+
foreach (var c in selected)
315314
{
316-
if (item is Models.Commit c)
315+
if (c.IsMerged)
317316
{
318-
selected.Add(c);
319-
320-
if (c.IsMerged)
321-
{
322-
canMerge = false;
323-
canCherryPick = false;
324-
}
325-
else if (c.Parents.Count > 1)
326-
{
327-
canCherryPick = false;
328-
}
317+
canMerge = false;
318+
canCherryPick = false;
319+
}
320+
else if (c.Parents.Count > 1)
321+
{
322+
canCherryPick = false;
329323
}
330324
}
331325

332-
// Sort selected commits in order.
333-
selected.Sort((l, r) => _commits.IndexOf(r) - _commits.IndexOf(l));
334-
335326
var multipleMenu = new ContextMenu();
336327

337328
if (!_repo.IsBare)
@@ -449,7 +440,7 @@ public ContextMenu MakeContextMenu(DataGrid list)
449440
return multipleMenu;
450441
}
451442

452-
var commit = (list.SelectedItem as Models.Commit)!;
443+
var commit = selected[0];
453444
var menu = new ContextMenu();
454445
var tags = new List<Models.Tag>();
455446

@@ -699,7 +690,7 @@ public ContextMenu MakeContextMenu(DataGrid list)
699690
}
700691
else
701692
{
702-
list.SelectedItems.Add(head);
693+
onAddSelected?.Invoke(head);
703694
}
704695

705696
e.Handled = true;

src/Views/Histories.axaml.cs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Text;
34

45
using Avalonia;
@@ -198,11 +199,21 @@ private void OnCommitListSelectionChanged(object _, SelectionChangedEventArgs e)
198199
private void OnCommitListContextRequested(object sender, ContextRequestedEventArgs e)
199200
{
200201
if (DataContext is ViewModels.Histories histories &&
201-
sender is DataGrid { SelectedItems.Count: > 0 } dataGrid &&
202+
sender is DataGrid { SelectedItems: { } selected } dataGrid &&
202203
e.Source is Control { DataContext: Models.Commit })
203204
{
204-
var menu = histories.MakeContextMenu(dataGrid);
205-
menu?.Open(dataGrid);
205+
var commits = new List<Models.Commit>();
206+
for (var i = selected.Count - 1; i >= 0; i--)
207+
{
208+
if (selected[i] is Models.Commit c)
209+
commits.Add(c);
210+
}
211+
212+
if (selected.Count > 0)
213+
{
214+
var menu = histories.CreateContextMenuForSelectedCommits(commits, c => dataGrid.SelectedItems.Add(c));
215+
menu?.Open(dataGrid);
216+
}
206217
}
207218

208219
e.Handled = true;

0 commit comments

Comments
 (0)