Skip to content

Commit c29e1e2

Browse files
committed
refactor: move context menu creation from ViewModels to Views (PART 2)
Signed-off-by: leo <longshuang@msn.cn>
1 parent b3087c3 commit c29e1e2

File tree

2 files changed

+68
-71
lines changed

2 files changed

+68
-71
lines changed

src/ViewModels/BranchCompare.cs

Lines changed: 5 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
using System;
22
using System.Collections.Generic;
3-
using System.IO;
43
using System.Threading.Tasks;
5-
6-
using Avalonia.Controls;
74
using Avalonia.Threading;
8-
95
using CommunityToolkit.Mvvm.ComponentModel;
106

117
namespace SourceGit.ViewModels
128
{
139
public class BranchCompare : ObservableObject
1410
{
11+
public string RepositoryPath
12+
{
13+
get => _repo;
14+
}
15+
1516
public bool IsLoading
1617
{
1718
get => _isLoading;
@@ -127,70 +128,6 @@ public string GetAbsPath(string path)
127128
return Native.OS.GetAbsPath(_repo, path);
128129
}
129130

130-
public ContextMenu CreateChangeContextMenu()
131-
{
132-
if (_selectedChanges is not { Count: 1 })
133-
return null;
134-
135-
var change = _selectedChanges[0];
136-
var menu = new ContextMenu();
137-
138-
var openWithMerger = new MenuItem();
139-
openWithMerger.Header = App.Text("OpenInExternalMergeTool");
140-
openWithMerger.Icon = App.CreateMenuIcon("Icons.OpenWith");
141-
openWithMerger.Tag = OperatingSystem.IsMacOS() ? "⌘+⇧+D" : "Ctrl+Shift+D";
142-
openWithMerger.Click += (_, ev) =>
143-
{
144-
var toolType = Preferences.Instance.ExternalMergeToolType;
145-
var toolPath = Preferences.Instance.ExternalMergeToolPath;
146-
var opt = new Models.DiffOption(_based.Head, _to.Head, change);
147-
148-
new Commands.DiffTool(_repo, toolType, toolPath, opt).Open();
149-
ev.Handled = true;
150-
};
151-
menu.Items.Add(openWithMerger);
152-
153-
if (change.Index != Models.ChangeState.Deleted)
154-
{
155-
var full = Path.GetFullPath(Path.Combine(_repo, change.Path));
156-
var explore = new MenuItem();
157-
explore.Header = App.Text("RevealFile");
158-
explore.Icon = App.CreateMenuIcon("Icons.Explore");
159-
explore.IsEnabled = File.Exists(full);
160-
explore.Click += (_, ev) =>
161-
{
162-
Native.OS.OpenInFileManager(full, true);
163-
ev.Handled = true;
164-
};
165-
menu.Items.Add(explore);
166-
}
167-
168-
var copyPath = new MenuItem();
169-
copyPath.Header = App.Text("CopyPath");
170-
copyPath.Icon = App.CreateMenuIcon("Icons.Copy");
171-
copyPath.Tag = OperatingSystem.IsMacOS() ? "⌘+C" : "Ctrl+C";
172-
copyPath.Click += async (_, ev) =>
173-
{
174-
await App.CopyTextAsync(change.Path);
175-
ev.Handled = true;
176-
};
177-
menu.Items.Add(new MenuItem() { Header = "-" });
178-
menu.Items.Add(copyPath);
179-
180-
var copyFullPath = new MenuItem();
181-
copyFullPath.Header = App.Text("CopyFullPath");
182-
copyFullPath.Icon = App.CreateMenuIcon("Icons.Copy");
183-
copyFullPath.Tag = OperatingSystem.IsMacOS() ? "⌘+⇧+C" : "Ctrl+Shift+C";
184-
copyFullPath.Click += async (_, e) =>
185-
{
186-
await App.CopyTextAsync(Native.OS.GetAbsPath(_repo, change.Path));
187-
e.Handled = true;
188-
};
189-
menu.Items.Add(copyFullPath);
190-
191-
return menu;
192-
}
193-
194131
private void Refresh()
195132
{
196133
IsLoading = true;

src/Views/BranchCompare.axaml.cs

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
using System;
2+
using System.IO;
3+
14
using Avalonia.Controls;
25
using Avalonia.Input;
36

@@ -12,10 +15,67 @@ public BranchCompare()
1215

1316
private void OnChangeContextRequested(object sender, ContextRequestedEventArgs e)
1417
{
15-
if (DataContext is ViewModels.BranchCompare vm && sender is ChangeCollectionView view)
18+
if (DataContext is ViewModels.BranchCompare { SelectedChanges: { Count: 1 } selected } vm &&
19+
sender is ChangeCollectionView view)
1620
{
17-
var menu = vm.CreateChangeContextMenu();
18-
menu?.Open(view);
21+
var repo = vm.RepositoryPath;
22+
var change = selected[0];
23+
var menu = new ContextMenu();
24+
25+
var openWithMerger = new MenuItem();
26+
openWithMerger.Header = App.Text("OpenInExternalMergeTool");
27+
openWithMerger.Icon = App.CreateMenuIcon("Icons.OpenWith");
28+
openWithMerger.Tag = OperatingSystem.IsMacOS() ? "⌘+⇧+D" : "Ctrl+Shift+D";
29+
openWithMerger.Click += (_, ev) =>
30+
{
31+
var pref = ViewModels.Preferences.Instance;
32+
var toolType = pref.ExternalMergeToolType;
33+
var toolPath = pref.ExternalMergeToolPath;
34+
var opt = new Models.DiffOption(vm.Base.Head, vm.To.Head, change);
35+
36+
new Commands.DiffTool(repo, toolType, toolPath, opt).Open();
37+
ev.Handled = true;
38+
};
39+
menu.Items.Add(openWithMerger);
40+
41+
if (change.Index != Models.ChangeState.Deleted)
42+
{
43+
var full = Path.GetFullPath(Path.Combine(repo, change.Path));
44+
var explore = new MenuItem();
45+
explore.Header = App.Text("RevealFile");
46+
explore.Icon = App.CreateMenuIcon("Icons.Explore");
47+
explore.IsEnabled = File.Exists(full);
48+
explore.Click += (_, ev) =>
49+
{
50+
Native.OS.OpenInFileManager(full, true);
51+
ev.Handled = true;
52+
};
53+
menu.Items.Add(explore);
54+
}
55+
56+
var copyPath = new MenuItem();
57+
copyPath.Header = App.Text("CopyPath");
58+
copyPath.Icon = App.CreateMenuIcon("Icons.Copy");
59+
copyPath.Tag = OperatingSystem.IsMacOS() ? "⌘+C" : "Ctrl+C";
60+
copyPath.Click += async (_, ev) =>
61+
{
62+
await App.CopyTextAsync(change.Path);
63+
ev.Handled = true;
64+
};
65+
menu.Items.Add(new MenuItem() { Header = "-" });
66+
menu.Items.Add(copyPath);
67+
68+
var copyFullPath = new MenuItem();
69+
copyFullPath.Header = App.Text("CopyFullPath");
70+
copyFullPath.Icon = App.CreateMenuIcon("Icons.Copy");
71+
copyFullPath.Tag = OperatingSystem.IsMacOS() ? "⌘+⇧+C" : "Ctrl+Shift+C";
72+
copyFullPath.Click += async (_, e) =>
73+
{
74+
await App.CopyTextAsync(Native.OS.GetAbsPath(repo, change.Path));
75+
e.Handled = true;
76+
};
77+
menu.Items.Add(copyFullPath);
78+
menu.Open(view);
1979
}
2080

2181
e.Handled = true;

0 commit comments

Comments
 (0)