Skip to content

Commit 24b6e39

Browse files
committed
feature: add context menu for changes in Views.CommitDetail and Views.RevisionCompare to diff with external merge tool (#53)
1 parent b5b1f0c commit 24b6e39

File tree

5 files changed

+55
-15
lines changed

5 files changed

+55
-15
lines changed

src/Resources/Locales/en_US.axaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,9 @@
137137
<x:String x:Key="Text.Diff.Prev" xml:space="preserve">Previous Difference</x:String>
138138
<x:String x:Key="Text.Diff.SideBySide" xml:space="preserve">Side-By-Side Diff</x:String>
139139
<x:String x:Key="Text.Diff.SyntaxHighlight" xml:space="preserve">Syntax Highlighting</x:String>
140-
<x:String x:Key="Text.Diff.UseMerger" xml:space="preserve">Open With Merge Tool</x:String>
140+
<x:String x:Key="Text.Diff.UseMerger" xml:space="preserve">Open In Merge Tool</x:String>
141141
<x:String x:Key="Text.Diff.Welcome" xml:space="preserve">SELECT FILE TO VIEW CHANGES</x:String>
142+
<x:String x:Key="Text.DiffWithMerger" xml:space="preserve">Open In Merge Tool</x:String>
142143
<x:String x:Key="Text.Discard" xml:space="preserve">Discard Changes</x:String>
143144
<x:String x:Key="Text.Discard.All" xml:space="preserve">All local changes in working copy.</x:String>
144145
<x:String x:Key="Text.Discard.Changes" xml:space="preserve">Changes :</x:String>

src/Resources/Locales/zh_CN.axaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@
139139
<x:String x:Key="Text.Diff.SyntaxHighlight" xml:space="preserve">语法高亮</x:String>
140140
<x:String x:Key="Text.Diff.UseMerger" xml:space="preserve">使用外部合并工具查看</x:String>
141141
<x:String x:Key="Text.Diff.Welcome" xml:space="preserve">请选择需要对比的文件</x:String>
142+
<x:String x:Key="Text.DiffWithMerger" xml:space="preserve">使用外部比对工具查看</x:String>
142143
<x:String x:Key="Text.Discard" xml:space="preserve">放弃更改确认</x:String>
143144
<x:String x:Key="Text.Discard.All" xml:space="preserve">所有本地址未提交的修改。</x:String>
144145
<x:String x:Key="Text.Discard.Changes" xml:space="preserve">需要放弃的变更 :</x:String>

src/ViewModels/CommitDetail.cs

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using Avalonia.Threading;
99

1010
using CommunityToolkit.Mvvm.ComponentModel;
11+
using Microsoft.VisualBasic.FileIO;
1112

1213
namespace SourceGit.ViewModels
1314
{
@@ -195,6 +196,28 @@ public ContextMenu CreateChangeContextMenu(Models.Change change)
195196
{
196197
var menu = new ContextMenu();
197198

199+
var diffWithMerger = new MenuItem();
200+
diffWithMerger.Header = App.Text("DiffWithMerger");
201+
diffWithMerger.Icon = App.CreateMenuIcon("Icons.Diff");
202+
diffWithMerger.Click += (_, ev) =>
203+
{
204+
var opt = new Models.DiffOption(_commit, change);
205+
var type = Preference.Instance.ExternalMergeToolType;
206+
var exec = Preference.Instance.ExternalMergeToolPath;
207+
208+
var tool = Models.ExternalMergeTools.Supported.Find(x => x.Type == type);
209+
if (tool == null || !File.Exists(exec))
210+
{
211+
App.RaiseException(_repo, "Invalid merge tool in preference setting!");
212+
return;
213+
}
214+
215+
var args = tool.Type != 0 ? tool.DiffCmd : Preference.Instance.ExternalMergeToolDiffCmd;
216+
Task.Run(() => Commands.MergeTool.OpenForDiff(_repo, exec, args, opt));
217+
ev.Handled = true;
218+
};
219+
menu.Items.Add(diffWithMerger);
220+
198221
if (change.Index != Models.ChangeState.Deleted)
199222
{
200223
var history = new MenuItem();
@@ -228,10 +251,12 @@ public ContextMenu CreateChangeContextMenu(Models.Change change)
228251
ev.Handled = true;
229252
};
230253

254+
menu.Items.Add(new MenuItem { Header = "-" });
231255
menu.Items.Add(history);
232256
menu.Items.Add(blame);
233257
menu.Items.Add(explore);
234-
}
258+
menu.Items.Add(new MenuItem { Header = "-" });
259+
}
235260

236261
var copyPath = new MenuItem();
237262
copyPath.Header = App.Text("CopyPath");
@@ -241,8 +266,8 @@ public ContextMenu CreateChangeContextMenu(Models.Change change)
241266
App.CopyText(change.Path);
242267
ev.Handled = true;
243268
};
244-
245269
menu.Items.Add(copyPath);
270+
246271
return menu;
247272
}
248273

src/ViewModels/DiffContext.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ public DiffContext(string repo, Models.DiffOption option, DiffContext previous =
147147
});
148148
}
149149

150-
public async void OpenExternalMergeTool()
150+
public void OpenExternalMergeTool()
151151
{
152152
var type = Preference.Instance.ExternalMergeToolType;
153153
var exec = Preference.Instance.ExternalMergeToolPath;
@@ -160,7 +160,7 @@ public async void OpenExternalMergeTool()
160160
}
161161

162162
var args = tool.Type != 0 ? tool.DiffCmd : Preference.Instance.ExternalMergeToolDiffCmd;
163-
await Task.Run(() => Commands.MergeTool.OpenForDiff(_repo, exec, args, _option));
163+
Task.Run(() => Commands.MergeTool.OpenForDiff(_repo, exec, args, _option));
164164
}
165165

166166
private static readonly HashSet<string> IMG_EXTS = new HashSet<string>()

src/ViewModels/RevisionCompare.cs

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -157,33 +157,46 @@ public ContextMenu CreateChangeContextMenu(Models.Change change)
157157
{
158158
var menu = new ContextMenu();
159159

160-
if (change.Index != Models.ChangeState.Deleted)
160+
var diffWithMerger = new MenuItem();
161+
diffWithMerger.Header = App.Text("DiffWithMerger");
162+
diffWithMerger.Icon = App.CreateMenuIcon("Icons.Diff");
163+
diffWithMerger.Click += (_, ev) =>
161164
{
162-
var history = new MenuItem();
163-
history.Header = App.Text("FileHistory");
164-
history.Click += (_, ev) =>
165+
var opt = new Models.DiffOption(StartPoint.SHA, EndPoint.SHA, change);
166+
var type = Preference.Instance.ExternalMergeToolType;
167+
var exec = Preference.Instance.ExternalMergeToolPath;
168+
169+
var tool = Models.ExternalMergeTools.Supported.Find(x => x.Type == type);
170+
if (tool == null || !File.Exists(exec))
165171
{
166-
var window = new Views.FileHistories() { DataContext = new FileHistories(_repo, change.Path) };
167-
window.Show();
168-
ev.Handled = true;
169-
};
172+
App.RaiseException(_repo, "Invalid merge tool in preference setting!");
173+
return;
174+
}
170175

176+
var args = tool.Type != 0 ? tool.DiffCmd : Preference.Instance.ExternalMergeToolDiffCmd;
177+
Task.Run(() => Commands.MergeTool.OpenForDiff(_repo, exec, args, opt));
178+
ev.Handled = true;
179+
};
180+
menu.Items.Add(diffWithMerger);
181+
182+
if (change.Index != Models.ChangeState.Deleted)
183+
{
171184
var full = Path.GetFullPath(Path.Combine(_repo, change.Path));
172185
var explore = new MenuItem();
173186
explore.Header = App.Text("RevealFile");
187+
explore.Icon = App.CreateMenuIcon("Icons.Folder.Open");
174188
explore.IsEnabled = File.Exists(full);
175189
explore.Click += (_, ev) =>
176190
{
177191
Native.OS.OpenInFileManager(full, true);
178192
ev.Handled = true;
179193
};
180-
181-
menu.Items.Add(history);
182194
menu.Items.Add(explore);
183195
}
184196

185197
var copyPath = new MenuItem();
186198
copyPath.Header = App.Text("CopyPath");
199+
copyPath.Icon = App.CreateMenuIcon("Icons.Copy");
187200
copyPath.Click += (_, ev) =>
188201
{
189202
App.CopyText(change.Path);

0 commit comments

Comments
 (0)