diff --git a/src/Resources/Locales/en_US.axaml b/src/Resources/Locales/en_US.axaml index 15c1f341..68e57b4c 100644 --- a/src/Resources/Locales/en_US.axaml +++ b/src/Resources/Locales/en_US.axaml @@ -137,8 +137,9 @@ Previous Difference Side-By-Side Diff Syntax Highlighting - Open With Merge Tool + Open In Merge Tool SELECT FILE TO VIEW CHANGES + Open In Merge Tool Discard Changes All local changes in working copy. Changes : diff --git a/src/Resources/Locales/zh_CN.axaml b/src/Resources/Locales/zh_CN.axaml index f771b493..79cf9973 100644 --- a/src/Resources/Locales/zh_CN.axaml +++ b/src/Resources/Locales/zh_CN.axaml @@ -139,6 +139,7 @@ 语法高亮 使用外部合并工具查看 请选择需要对比的文件 + 使用外部比对工具查看 放弃更改确认 所有本地址未提交的修改。 需要放弃的变更 : diff --git a/src/ViewModels/CommitDetail.cs b/src/ViewModels/CommitDetail.cs index c0453cf0..79c29545 100644 --- a/src/ViewModels/CommitDetail.cs +++ b/src/ViewModels/CommitDetail.cs @@ -8,6 +8,7 @@ using Avalonia.Platform.Storage; using Avalonia.Threading; using CommunityToolkit.Mvvm.ComponentModel; +using Microsoft.VisualBasic.FileIO; namespace SourceGit.ViewModels { @@ -195,6 +196,28 @@ namespace SourceGit.ViewModels { var menu = new ContextMenu(); + var diffWithMerger = new MenuItem(); + diffWithMerger.Header = App.Text("DiffWithMerger"); + diffWithMerger.Icon = App.CreateMenuIcon("Icons.Diff"); + diffWithMerger.Click += (_, ev) => + { + var opt = new Models.DiffOption(_commit, change); + var type = Preference.Instance.ExternalMergeToolType; + var exec = Preference.Instance.ExternalMergeToolPath; + + var tool = Models.ExternalMergeTools.Supported.Find(x => x.Type == type); + if (tool == null || !File.Exists(exec)) + { + App.RaiseException(_repo, "Invalid merge tool in preference setting!"); + return; + } + + var args = tool.Type != 0 ? tool.DiffCmd : Preference.Instance.ExternalMergeToolDiffCmd; + Task.Run(() => Commands.MergeTool.OpenForDiff(_repo, exec, args, opt)); + ev.Handled = true; + }; + menu.Items.Add(diffWithMerger); + if (change.Index != Models.ChangeState.Deleted) { var history = new MenuItem(); @@ -228,10 +251,12 @@ namespace SourceGit.ViewModels ev.Handled = true; }; + menu.Items.Add(new MenuItem { Header = "-" }); menu.Items.Add(history); menu.Items.Add(blame); menu.Items.Add(explore); - } + menu.Items.Add(new MenuItem { Header = "-" }); + } var copyPath = new MenuItem(); copyPath.Header = App.Text("CopyPath"); @@ -241,8 +266,8 @@ namespace SourceGit.ViewModels App.CopyText(change.Path); ev.Handled = true; }; - menu.Items.Add(copyPath); + return menu; } diff --git a/src/ViewModels/DiffContext.cs b/src/ViewModels/DiffContext.cs index adb7c7c9..c5001fc8 100644 --- a/src/ViewModels/DiffContext.cs +++ b/src/ViewModels/DiffContext.cs @@ -147,7 +147,7 @@ namespace SourceGit.ViewModels }); } - public async void OpenExternalMergeTool() + public void OpenExternalMergeTool() { var type = Preference.Instance.ExternalMergeToolType; var exec = Preference.Instance.ExternalMergeToolPath; @@ -160,7 +160,7 @@ namespace SourceGit.ViewModels } var args = tool.Type != 0 ? tool.DiffCmd : Preference.Instance.ExternalMergeToolDiffCmd; - await Task.Run(() => Commands.MergeTool.OpenForDiff(_repo, exec, args, _option)); + Task.Run(() => Commands.MergeTool.OpenForDiff(_repo, exec, args, _option)); } private static readonly HashSet IMG_EXTS = new HashSet() diff --git a/src/ViewModels/RevisionCompare.cs b/src/ViewModels/RevisionCompare.cs index 92805dea..167f3a41 100644 --- a/src/ViewModels/RevisionCompare.cs +++ b/src/ViewModels/RevisionCompare.cs @@ -157,33 +157,46 @@ namespace SourceGit.ViewModels { var menu = new ContextMenu(); + var diffWithMerger = new MenuItem(); + diffWithMerger.Header = App.Text("DiffWithMerger"); + diffWithMerger.Icon = App.CreateMenuIcon("Icons.Diff"); + diffWithMerger.Click += (_, ev) => + { + var opt = new Models.DiffOption(StartPoint.SHA, EndPoint.SHA, change); + var type = Preference.Instance.ExternalMergeToolType; + var exec = Preference.Instance.ExternalMergeToolPath; + + var tool = Models.ExternalMergeTools.Supported.Find(x => x.Type == type); + if (tool == null || !File.Exists(exec)) + { + App.RaiseException(_repo, "Invalid merge tool in preference setting!"); + return; + } + + var args = tool.Type != 0 ? tool.DiffCmd : Preference.Instance.ExternalMergeToolDiffCmd; + Task.Run(() => Commands.MergeTool.OpenForDiff(_repo, exec, args, opt)); + ev.Handled = true; + }; + menu.Items.Add(diffWithMerger); + if (change.Index != Models.ChangeState.Deleted) { - var history = new MenuItem(); - history.Header = App.Text("FileHistory"); - history.Click += (_, ev) => - { - var window = new Views.FileHistories() { DataContext = new FileHistories(_repo, change.Path) }; - window.Show(); - ev.Handled = true; - }; - var full = Path.GetFullPath(Path.Combine(_repo, change.Path)); var explore = new MenuItem(); explore.Header = App.Text("RevealFile"); + explore.Icon = App.CreateMenuIcon("Icons.Folder.Open"); explore.IsEnabled = File.Exists(full); explore.Click += (_, ev) => { Native.OS.OpenInFileManager(full, true); ev.Handled = true; }; - - menu.Items.Add(history); menu.Items.Add(explore); } var copyPath = new MenuItem(); copyPath.Header = App.Text("CopyPath"); + copyPath.Icon = App.CreateMenuIcon("Icons.Copy"); copyPath.Click += (_, ev) => { App.CopyText(change.Path);