diff --git a/src/Models/ExternalMerger.cs b/src/Models/ExternalMerger.cs index 6643bbbb..12655df1 100644 --- a/src/Models/ExternalMerger.cs +++ b/src/Models/ExternalMerger.cs @@ -2,16 +2,29 @@ using System.Collections.Generic; using System.IO; +using Avalonia.Media.Imaging; +using Avalonia.Platform; + namespace SourceGit.Models { public class ExternalMerger { public int Type { get; set; } + public string Icon { get; set; } public string Name { get; set; } public string Exec { get; set; } public string Cmd { get; set; } public string DiffCmd { get; set; } + public Bitmap IconImage + { + get + { + var icon = AssetLoader.Open(new Uri($"avares://SourceGit/Resources/ExternalToolIcons/{Icon}.png", UriKind.RelativeOrAbsolute)); + return new Bitmap(icon); + } + } + public static readonly List Supported; static ExternalMerger() @@ -19,48 +32,49 @@ namespace SourceGit.Models if (OperatingSystem.IsWindows()) { Supported = new List() { - new ExternalMerger(0, "Custom", "", "", ""), - new ExternalMerger(1, "Visual Studio Code", "Code.exe", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""), - new ExternalMerger(2, "Visual Studio Code - Insiders", "Code - Insiders.exe", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""), - new ExternalMerger(3, "Visual Studio 2017/2019/2022", "vsDiffMerge.exe", "\"$REMOTE\" \"$LOCAL\" \"$BASE\" \"$MERGED\" /m", "\"$LOCAL\" \"$REMOTE\""), - new ExternalMerger(4, "Tortoise Merge", "TortoiseMerge.exe;TortoiseGitMerge.exe", "-base:\"$BASE\" -theirs:\"$REMOTE\" -mine:\"$LOCAL\" -merged:\"$MERGED\"", "-base:\"$LOCAL\" -theirs:\"$REMOTE\""), - new ExternalMerger(5, "KDiff3", "kdiff3.exe", "\"$REMOTE\" -b \"$BASE\" \"$LOCAL\" -o \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""), - new ExternalMerger(6, "Beyond Compare", "BComp.exe", "\"$REMOTE\" \"$LOCAL\" \"$BASE\" \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""), - new ExternalMerger(7, "WinMerge", "WinMergeU.exe", "-u -e \"$REMOTE\" \"$LOCAL\" \"$MERGED\"", "-u -e \"$LOCAL\" \"$REMOTE\""), + new ExternalMerger(0, "custom_diff", "Custom", "", "", ""), + new ExternalMerger(1, "vscode", "Visual Studio Code", "Code.exe", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""), + new ExternalMerger(2, "vscode_insiders", "Visual Studio Code - Insiders", "Code - Insiders.exe", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""), + new ExternalMerger(3, "vs", "Visual Studio", "vsDiffMerge.exe", "\"$REMOTE\" \"$LOCAL\" \"$BASE\" \"$MERGED\" /m", "\"$LOCAL\" \"$REMOTE\""), + new ExternalMerger(4, "tortoise_merge", "Tortoise Merge", "TortoiseMerge.exe;TortoiseGitMerge.exe", "-base:\"$BASE\" -theirs:\"$REMOTE\" -mine:\"$LOCAL\" -merged:\"$MERGED\"", "-base:\"$LOCAL\" -theirs:\"$REMOTE\""), + new ExternalMerger(5, "kdiff3", "KDiff3", "kdiff3.exe", "\"$REMOTE\" -b \"$BASE\" \"$LOCAL\" -o \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""), + new ExternalMerger(6, "beyond_compare", "Beyond Compare", "BComp.exe", "\"$REMOTE\" \"$LOCAL\" \"$BASE\" \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""), + new ExternalMerger(7, "win_merge", "WinMerge", "WinMergeU.exe", "-u -e \"$REMOTE\" \"$LOCAL\" \"$MERGED\"", "-u -e \"$LOCAL\" \"$REMOTE\""), }; } else if (OperatingSystem.IsMacOS()) { Supported = new List() { - new ExternalMerger(0, "Custom", "", "", ""), - new ExternalMerger(1, "FileMerge", "/usr/bin/opendiff", "\"$BASE\" \"$LOCAL\" \"$REMOTE\" -ancestor \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""), - new ExternalMerger(2, "Visual Studio Code", "/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""), - new ExternalMerger(3, "Visual Studio Code - Insiders", "/Applications/Visual Studio Code - Insiders.app/Contents/Resources/app/bin/code", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""), - new ExternalMerger(4, "KDiff3", "/Applications/kdiff3.app/Contents/MacOS/kdiff3", "\"$REMOTE\" -b \"$BASE\" \"$LOCAL\" -o \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""), - new ExternalMerger(5, "Beyond Compare", "/Applications/Beyond Compare.app/Contents/MacOS/bcomp", "\"$REMOTE\" \"$LOCAL\" \"$BASE\" \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""), + new ExternalMerger(0, "custom_diff", "Custom", "", "", ""), + new ExternalMerger(1, "xcode", "FileMerge", "/usr/bin/opendiff", "\"$BASE\" \"$LOCAL\" \"$REMOTE\" -ancestor \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""), + new ExternalMerger(2, "vscode", "Visual Studio Code", "/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""), + new ExternalMerger(3, "vscode_insiders", "Visual Studio Code - Insiders", "/Applications/Visual Studio Code - Insiders.app/Contents/Resources/app/bin/code", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""), + new ExternalMerger(4, "kdiff3", "KDiff3", "/Applications/kdiff3.app/Contents/MacOS/kdiff3", "\"$REMOTE\" -b \"$BASE\" \"$LOCAL\" -o \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""), + new ExternalMerger(5, "beyond_compare", "Beyond Compare", "/Applications/Beyond Compare.app/Contents/MacOS/bcomp", "\"$REMOTE\" \"$LOCAL\" \"$BASE\" \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""), }; } else if (OperatingSystem.IsLinux()) { Supported = new List() { - new ExternalMerger(0, "Custom", "", "", ""), - new ExternalMerger(1, "Visual Studio Code", "/usr/share/code/code", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""), - new ExternalMerger(2, "Visual Studio Code - Insiders", "/usr/share/code-insiders/code-insiders", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""), - new ExternalMerger(3, "KDiff3", "/usr/bin/kdiff3", "\"$REMOTE\" -b \"$BASE\" \"$LOCAL\" -o \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""), - new ExternalMerger(4, "Beyond Compare", "/usr/bin/bcomp", "\"$REMOTE\" \"$LOCAL\" \"$BASE\" \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""), + new ExternalMerger(0, "custom_diff", "Custom", "", "", ""), + new ExternalMerger(1, "vscode", "Visual Studio Code", "/usr/share/code/code", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""), + new ExternalMerger(2, "vscode_insiders", "Visual Studio Code - Insiders", "/usr/share/code-insiders/code-insiders", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""), + new ExternalMerger(3, "kdiff3", "KDiff3", "/usr/bin/kdiff3", "\"$REMOTE\" -b \"$BASE\" \"$LOCAL\" -o \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""), + new ExternalMerger(4, "beyond_compare", "Beyond Compare", "/usr/bin/bcomp", "\"$REMOTE\" \"$LOCAL\" \"$BASE\" \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""), }; } else { Supported = new List() { - new ExternalMerger(0, "Custom", "", "", ""), + new ExternalMerger(0, "custom_diff", "Custom", "", "", ""), }; } } - public ExternalMerger(int type, string name, string exec, string cmd, string diffCmd) + public ExternalMerger(int type, string icon, string name, string exec, string cmd, string diffCmd) { Type = type; + Icon = icon; Name = name; Exec = exec; Cmd = cmd; diff --git a/src/Models/ExternalTool.cs b/src/Models/ExternalTool.cs index 5383a6bf..cb50df58 100644 --- a/src/Models/ExternalTool.cs +++ b/src/Models/ExternalTool.cs @@ -3,6 +3,9 @@ using System.Collections.Generic; using System.Diagnostics; using System.IO; +using Avalonia.Media.Imaging; +using Avalonia.Platform; + namespace SourceGit.Models { public class ExternalTool @@ -12,6 +15,15 @@ namespace SourceGit.Models public string Executable { get; set; } = string.Empty; public string OpenCmdArgs { get; set; } = string.Empty; + public Bitmap IconImage + { + get + { + var icon = AssetLoader.Open(new Uri($"avares://SourceGit/Resources/ExternalToolIcons/{Icon}.png", UriKind.RelativeOrAbsolute)); + return new Bitmap(icon); + } + } + public void Open(string repo) { Process.Start(new ProcessStartInfo() @@ -34,22 +46,22 @@ namespace SourceGit.Models public void VSCode(Func platform_finder) { - TryAdd("Visual Studio Code", "vscode.png", "\"{0}\"", "VSCODE_PATH", platform_finder); + TryAdd("Visual Studio Code", "vscode", "\"{0}\"", "VSCODE_PATH", platform_finder); } public void VSCodeInsiders(Func platform_finder) { - TryAdd("Visual Studio Code - Insiders", "vscode_insiders.png", "\"{0}\"", "VSCODE_INSIDERS_PATH", platform_finder); + TryAdd("Visual Studio Code - Insiders", "vscode_insiders", "\"{0}\"", "VSCODE_INSIDERS_PATH", platform_finder); } public void Fleet(Func platform_finder) { - TryAdd("JetBrains Fleet", "fleet.png", "\"{0}\"", "FLEET_PATH", platform_finder); + TryAdd("JetBrains Fleet", "fleet", "\"{0}\"", "FLEET_PATH", platform_finder); } public void SublimeText(Func platform_finder) { - TryAdd("Sublime Text", "sublime_text.png", "\"{0}\"", "SUBLIME_TEXT_PATH", platform_finder); + TryAdd("Sublime Text", "sublime_text", "\"{0}\"", "SUBLIME_TEXT_PATH", platform_finder); } public void TryAdd(string name, string icon, string args, string env, Func finder) diff --git a/src/Native/Windows.cs b/src/Native/Windows.cs index e2dbc5d2..b3027ac0 100644 --- a/src/Native/Windows.cs +++ b/src/Native/Windows.cs @@ -228,7 +228,7 @@ namespace SourceGit.Native // There are two versions of PowerShell : pwsh.exe (preferred) and powershell.exe (system default) private string ChoosePowerShell() { - if (!string.IsNullOrEmpty(_powershellPath)) + if (!string.IsNullOrEmpty(_powershellPath)) return _powershellPath; var localMachine = Microsoft.Win32.RegistryKey.OpenBaseKey( diff --git a/src/Resources/ExternalToolIcons/beyond_compare.png b/src/Resources/ExternalToolIcons/beyond_compare.png new file mode 100644 index 00000000..c7aaf18b Binary files /dev/null and b/src/Resources/ExternalToolIcons/beyond_compare.png differ diff --git a/src/Resources/ExternalToolIcons/custom_diff.png b/src/Resources/ExternalToolIcons/custom_diff.png new file mode 100644 index 00000000..13b68964 Binary files /dev/null and b/src/Resources/ExternalToolIcons/custom_diff.png differ diff --git a/src/Resources/ExternalToolIcons/kdiff3.png b/src/Resources/ExternalToolIcons/kdiff3.png new file mode 100644 index 00000000..79c0e6e2 Binary files /dev/null and b/src/Resources/ExternalToolIcons/kdiff3.png differ diff --git a/src/Resources/ExternalToolIcons/tortoise_merge.png b/src/Resources/ExternalToolIcons/tortoise_merge.png new file mode 100644 index 00000000..eb5b1a8a Binary files /dev/null and b/src/Resources/ExternalToolIcons/tortoise_merge.png differ diff --git a/src/Resources/ExternalToolIcons/vs.png b/src/Resources/ExternalToolIcons/vs.png new file mode 100644 index 00000000..55c078ef Binary files /dev/null and b/src/Resources/ExternalToolIcons/vs.png differ diff --git a/src/Resources/ExternalToolIcons/win_merge.png b/src/Resources/ExternalToolIcons/win_merge.png new file mode 100644 index 00000000..1bad3eaf Binary files /dev/null and b/src/Resources/ExternalToolIcons/win_merge.png differ diff --git a/src/Resources/ExternalToolIcons/xcode.png b/src/Resources/ExternalToolIcons/xcode.png new file mode 100644 index 00000000..fe9c3bae Binary files /dev/null and b/src/Resources/ExternalToolIcons/xcode.png differ diff --git a/src/Resources/Locales/en_US.axaml b/src/Resources/Locales/en_US.axaml index 8277d3c5..0ad2afe9 100644 --- a/src/Resources/Locales/en_US.axaml +++ b/src/Resources/Locales/en_US.axaml @@ -276,7 +276,7 @@ Input path for installed gpg program User Signing Key User's gpg signing key - MERGE + EXTERNAL MERGE TOOL Diff Command Merge Command Install Path diff --git a/src/ViewModels/Repository.cs b/src/ViewModels/Repository.cs index 89740d7d..43665925 100644 --- a/src/ViewModels/Repository.cs +++ b/src/ViewModels/Repository.cs @@ -303,10 +303,10 @@ namespace SourceGit.ViewModels foreach (var tool in tools) { var dupTool = tool; - var icon = AssetLoader.Open(new Uri($"avares://SourceGit/Resources/ExternalToolIcons/{dupTool.Icon}", UriKind.RelativeOrAbsolute)); + var item = new MenuItem(); item.Header = App.Text("Repository.OpenIn", dupTool.Name); - item.Icon = new Image { Width = 16, Height = 16, Source = new Bitmap(icon) }; + item.Icon = new Image { Width = 16, Height = 16, Source = dupTool.IconImage }; item.Click += (o, e) => { dupTool.Open(_fullpath); diff --git a/src/Views/Preference.axaml b/src/Views/Preference.axaml index a6918a1a..820b6dc9 100644 --- a/src/Views/Preference.axaml +++ b/src/Views/Preference.axaml @@ -409,9 +409,20 @@ MinHeight="28" Padding="8,0" HorizontalAlignment="Stretch" + HorizontalContentAlignment="Left" + RenderOptions.BitmapInterpolationMode="HighQuality" + FontSize="{Binding DefaultFontSize}" ItemsSource="{Binding Source={x:Static m:ExternalMerger.Supported}}" - DisplayMemberBinding="{Binding Name, x:DataType=m:ExternalMerger}" - SelectedIndex="{Binding ExternalMergeToolType, Mode=TwoWay}"/> + SelectedIndex="{Binding ExternalMergeToolType, Mode=TwoWay}"> + + + + + + + + +