From 17fc7ab9945c9aee8e5e6a5c7ab9d4354c8a1ed7 Mon Sep 17 00:00:00 2001 From: leo Date: Tue, 9 Apr 2024 15:00:52 +0800 Subject: [PATCH] ux: add icons for external merge tools --- src/Models/ExternalMerger.cs | 56 +++++++++++------- src/Models/ExternalTool.cs | 20 +++++-- src/Native/Windows.cs | 2 +- .../ExternalToolIcons/beyond_compare.png | Bin 0 -> 8235 bytes .../ExternalToolIcons/custom_diff.png | Bin 0 -> 1836 bytes src/Resources/ExternalToolIcons/kdiff3.png | Bin 0 -> 2952 bytes .../ExternalToolIcons/tortoise_merge.png | Bin 0 -> 5598 bytes src/Resources/ExternalToolIcons/vs.png | Bin 0 -> 5132 bytes src/Resources/ExternalToolIcons/win_merge.png | Bin 0 -> 7010 bytes src/Resources/ExternalToolIcons/xcode.png | Bin 0 -> 7670 bytes src/Resources/Locales/en_US.axaml | 2 +- src/ViewModels/Repository.cs | 4 +- src/Views/Preference.axaml | 15 ++++- 13 files changed, 68 insertions(+), 31 deletions(-) create mode 100644 src/Resources/ExternalToolIcons/beyond_compare.png create mode 100644 src/Resources/ExternalToolIcons/custom_diff.png create mode 100644 src/Resources/ExternalToolIcons/kdiff3.png create mode 100644 src/Resources/ExternalToolIcons/tortoise_merge.png create mode 100644 src/Resources/ExternalToolIcons/vs.png create mode 100644 src/Resources/ExternalToolIcons/win_merge.png create mode 100644 src/Resources/ExternalToolIcons/xcode.png 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 0000000000000000000000000000000000000000..c7aaf18b9ffc5d2e71106e02eb57e4387a8109f8 GIT binary patch literal 8235 zcmV+`Ak^Q9P)F@ z5(N<2JU6KT000SaNLh0L03N{r03N{s!)a7g00004XF*Lt006O%3;baP001AlNklSwlN2v?7(zB2;!+vqg3x zJF_~!^Y?e(^EF=P`Ivd1?>&z9={U~ge=q;#I?wC;E!TCYq4A%;|NQ;uPyXi5pZ||z z-n@AlV@8b7>DQ)BgWgS=3~X1e`r>Xis)svkYo|DAYwx$$(n@WhrIqMmZN1&o#wMVZ zo!yK9J$rT=GGvI&*s)`^<@*1QaS8t01du_G8Zf}DpPk*vUi$h;<8*bOPd6~Y93vyl zH#Ww66BGClGx&OZ`SKWSXozn7zKy;w| z;~y7b#IiA)mCAlY=zY8uJzC)vFun@GeGTS#`Dt}c8? zen{!k@F-OZ4f(z{udU2`XliJn6hG_KsS~D7oeC1is8ORt1oZ3I?>NK5{!2sSZwWAb z_;8IOwQ6;ZGBz$c^7YrqC2}Z0wv`nQbKqGdeUOARNm!6Uq!asy6cXP>#1P>WU=0b+ zEg?XCzW;{88Sy(U3ZSK>g*I*4VA!x>3Z_h%0v{hA3?4if1N!&>wQt|POJ~oXt@F19 z@M_;)bF`bA4ORZM-KqA_{{2fYu(tL;SgqRcd3EaG)VJT_1e4ZLYinea{9(p*7RetZ z*@G$pgnY@_k0T;Ua1-$(2~VW}{b>K@6v2kD;^zi@UrJjW<>(#{4-X6&FaYKZD-IRk z@|okuk4Nv`z0tQ%A9U&5Is5zXzpwPS1fbdmL1oGm4zRaxIE@MI!waaoMt67ja_cRv z_MEh}#l;24C;I5^;9y?QvynK;eaKfwVVs2jg)NOHEO#;9#&fm+s9s9b>-=V$sPuSb-n1N1}$I!Q$Mm=gs0 zyhe`Anl(e0E?vMD8s6UCaHdNg92`#0m@z}|vjj-7uJraPW9cbHD5e09yLQF3mMw9= zeS6%c!iBD`C}8}H0GF5u&oeRQ)u@4!k_0J07UMKUVx6P|iDfFgca;oZ*%}_s4(Q#( z3u8z2$Fxa9F?-r5_{*IK~^@yLh5r-P$BvP7y&MMAc%HbcDE}Ivpqi z^kFqn-g81kj7H2=uCA`@C4@gi0PD9;I&{F(&Ye-rn>?l%MSTCDZCl)BTUzMiq6l!6 zA&^f2E-(q^ef5=61*HC`aF9`)?X|S!T%xlMiPyD(cfT%}HFYEw`AmY}4>PdVZ!R{j z_C?UTMF?8I7=b))TH}iV|M^(I(uc=+_;KM>bnrB0l5_` zB9-b#(c&vPfDxSarqwEA@PKYuFnc`wf1HJ265STQ646^%Au41k!Z*xEcz_R&^AJWv zh5Ufnh}FazM1}cbbI>wu4*U`8C`fbHCLeV}NvH)7XVk7;8};c@DV@Y+CUc!H65t7~ zU&PseK>OdL0JkZ?P3C}WwAW=Se4a|5q~$W1kYYJ7f6jh)CNp;z2h5#52CJ6MMmR~t zMXtftKwqp|Iu6U{4I;eZH-8XTE*Px9Z^0m};AhKyys_qoG1$Cu0e0HhNdqh>JCuks z#||iv*Ya67zgx3-7*_gH7~f%tplHeQLD(I$5xb%{UB-BEv#i&RpN{^r} zk>Y}{7@`#B9y?sUFB5Wm6^ABSTjpDUJk|kHgv}!>~Pg9*JMTZ@;`I z!MFJRx1UM&SCamX+<#XfujMoOPR@~Y@9~=L!Si{K;S8P86krn$>VQbjF?6SJmLR zWCpedFXsS*v2n!&&iV+X#IC{X=lAi;+h_Rorxyyb-#N>_|MtrtBK%+SzbN0yIdZOC zBiG730_dQCWn++*6pHlZEl5w=3@^`?N?R-1&8^NrLCM1w($q-+Z~E60kg1y_DzXdg*VUd;-^OZ@ZrkV){qx(qT0++Ys4&Kw}^ z@MQ{cfop<{s#Os=up9P7uTciNBV;a~KfcDn-@)6L_wmzfl?XpQC&5=GMELnV{viKK zIY%MSYvfwF#|z#oI>ZMXmW{%$sO8AXh{jH()f_{O=*8Q>(@y9GKpVgW<4(pA(p_ie5l|I zv7gCsQ~Ra}@*9hrmk#1p@pZg@dh-Jjid7=KRON&>?;*CAnODdc|B1ZZL+&N_4Dla} zz!hV0^k6iOX2vMtU}a^gG(An3o1_7f#zEg80SJ-fhy+Jw*NEvYs$S|KDvOtv3`oc$ua&om7Rc-hZE4Pb2~I-W7d{V zb>w&@_SMT~*-jIvg%EJb?D0_nG%3Iq1A`Y_5+j9V1j#BS@un09yJ@RkB$+_l#WT*{ z!w~VbSbRAH9?M}Hku_x`p4~soL0`hFCs#?NfP`-0?TdRP_yDh8JixOj_wc;PyRUpF=g7Ho&C4fO@Vw|Eo;^5=r}s|b%IQ4_T{R970n>2)coNR!?82($K1#js z%=TU4UBW?@N8fa<;m7`V4Q#E~_ERZFtF>j!TyfjK|o%ZkX)d4qMkQ#33fbqQawi{vZ!8iY{;lFP8|3+t`r^#ZeX3d(409-5ud{h9ojhf7+>*XZL zm}<+2l_aUCA@&kQyXKkbYy=xwyc|ogGm9ncl|K#7aYdJ8`*S0 z4xZdPieeGs-bo%$BQkO`Hf-2{5YBo;#8$+_#2_&-5eE+JM|%1JTsDR9xny^I6KBA0WmH7Sy zije+E0jiY{K-7~NR})r4K9`%Do0%dpb`!GGwj-Cb5fLy6hxZ0@_A?a++`XDbF%IED z!4W*XnXNeDM0N_TABwQBFhoT~AwE7HDJjXw$jCr$ZVvMD&fvz?Gq^;;7fAU0v0XTK zbSKW{CLk|I5Rd%{tNE_TvQddw!OctQD9q1L1i5o1OA%yeOc)Xp z5)`}d+O-S&_N5{#D+|YuAH%tGdAM-lJR-LQ;nd++oIVoIV;oK%ip7aTF+{Y2)Hr`W ziw#j~5N`9n_X>`pcdu^Bwz>RPAn`8yhUyTIgjg~Z{!#!Yh|mu$BeO0leh7ViJ!OG% z^k5859omL%8>b>|*BV^O+o#~_SthM>`*HpJ0VS5NJwZ!WESV%}jAV5v%VX&bB?tUv2-K)i!~Y{O^HBlh^VrC>$jyvq za@vFKo2DW$YB4UIO8FD=Pp9DAu|#DSg}`b*UuD*h9?exOpPzpT1qIiY9MG$~7Z%JM zhOI$MaA;p7vi3zNZLi?)zO8J7Bd~MJd_)IMMgEC+JZ64*bmt7(wsFVkQ6n*I=ny)< zl@2h6wkn5}o!)!M zDscLOAT;O_3A+yAsN)q1r#^9T9k2^7{ddFCWj$)RhoZV$2(0+pxbX^D2;?Vk(6jD706y+*8Xj@cqY?}U zqBJO{b9S;*i|0&kMONw-1qX?YH(W7*#rDqei!*sMYHPzUy}y zb_4U!VDLFK9(n-|!!M%Ah)Zx9bs4VXuEV%#@C}Z=>_-J)BB{=o?}Vf@6w+eKhJut8 zAun+y2}Rvze)Dy83a|s`PoyfDJDLvI6|oSfjwIj&6PQ>yorKep!W10X6H0`TP!Pg5 zE`l%ZzF^jH_|6`I#Xh64eBlJFUN#MZYv&;*Vil8Ykb;z*!HOVDeTJc-r!OjX%)vLk z&Jt(vP0!P)+3PfF_sc`wf#=Y0=p{IexD2P!*Wfa?0L>@dK#Pet(Q;BDT2HwR6X(#I zWxSMD`@itmb zxeJeJ_u)D7A==FXMGjtDPHivl4OT{9&bu zi4C2LxG*2=-yKARD0_Xfo0A;Bk)$_}PylvEuU9rb6WB-vulH3*uU|Qfu|EgF>lV=N zKPb6k=l1oA2)lQzLk#a56FNu9DH*A;XyYA>uX~(O$Tu2(4NXShAo*KpG5IdszJGu= zGm6lD_G5IITa1oA#XLUY`$wqY686^uI5;@;`;-6@8X|xYmu5rCjT|F4uSeeTG~6#d zi`=vb#8QB`%?miw8x`_0+les&B)yKL){^)d#7C`Bw!ove_#Apr{!zG(>} zLzg3Zt3Nx_15_(U36=JroqRssk$nOAKf__vG8M2)Hf}isH zLCn^b@5%FCsd20D^x+jQs%|PGbQrN2)*Z4@tIs*b1@H4pWBNly zfDWH4fD#547Ev0iUDdC@{`!x7HraiVFp$^MZOPA2vdWS~IbqyLTs)hNTi5gO`2H2n zRuJOp0vUXK#IiqTJto4R1bFiK0?57@ZGPxexjuPd_qBLA);OHk$x zG-BCYyJ|TXH0N;l)@3|>bQ`w|PO~ZmlFVY27z+`*c_CuL7x754M06Nmhc8sVlXDUx z7GvMe^(ef09B*Ge!cWB8mk+TcZZ8b#uRvMnM3{PHp=y^C__ptPMSzCG-X}s4pvB~S zN+N7KlZj9fp!o9yP+Z{U)#5`J$gJ0^S5FBA$pumgWYa+$AU(G%L}U>)clLB#&CkQ_ z!pnH{un;ewJ;0qCXK_3$4k>YKuru-p?2K4a0`K3;R#$Gu4u;Vw5`T=J-#k_J2w%M@ z!h)s2C|zqNN;Qf?xt0fD**+K5yPu{27nD-iVCc0!5}{NAcM9N10ldCc0C9ntnOU5g zyeuqayGe3@%({eu^aoM}BnQZEaM9#G6;e zBvy=Pk8k7d&GWc@{R|y)MiJ-fqeA@jS~g8zl)!Uj=Nv;*&q>hwdKxtAg+bRj1tx6{ z!@AQ6)aa3?IG~OqfK-A4IFBzxOA63t`U4U!LMNZc=sf>@BK#}?1pWK>ufngMeJljj z8xGPCi8vyPgn{hK(LLzUp#wZU+hWR;NytdshbNEj;pOwkc>DS}iOFW@Yh^23jbCMF zSap2+`UTQ54x{UUnb57?58B@@AoT{l@@Dl0|xdI0^ zLN4Rj@lCzU=H~%A%)XDV^B<#|Z!x+qc%KJ8O8|j$Q)ll_xK;*ihzK1$jnH?je=_^E`E&HuV3QztCx6GRD=r`FC%VODkjfd23yBo zFsRlUy0s>vR2_e4HHboK$0QiENQa5X5mnxbI$^JutYTdXN=&csuG8{)=XYYR#ttQ`unM>$B4Q+jI-Rgbg zMTB09pP|R1XE1B_nF6TR2xVCnj%buvCCX1x8mg@`=?T<7MoMCo@+dpCvOOg~Rf`J- z4H|-B!$)H1@Gm@2f^8WAnLmgM9n6{P^s|*m^PdTgGQ^NYrhpbjtS6h znvAlp`#JlWDDQTN0_4D={ZS51CV)7iQl(1DuQPI#L@7d;nVGXxR)eBY;WP!6oEE^`X(f!E0%7PB0R!ha=)3HJzH2JkHZwV%N-WEoD)&k?Q;EvXv(Yc~4JI%@0CY zEka!l(`E~K)c+y@O59L~3!x1kYnMxkBAufAY-R7@2pwHRXz7@uocVXqv*P=TZJ|@W zKXhwOg08JE%GO_lvW-Jgw#jzrJMSiOnf?7L0WuT^7`q>WMY|l%{!x4-J3u{-pj!Lg zyvO)U8l?>T@VS;uzM7vHvs#1-MCrdJzmvW_v(W2>v@!nT+8FV`|1MYlMZ*!#UJW!>?-Myc}S`Hb33xVjw2XN~(G6F}_- zc7Aq7Mn>`fRS1;;r3|1|)(WMJzC#(y=FqL$1A4W_z@V-V$~9#6ZxRG!mq?g2k3)r4 zi7<0ZhPit(EZh=d(JGd8Jp|?K7Q8D}(d&vv8S^E)w=-eNQmgf;{|5cH3BX220oMYW z>;`SvGpyn*AN*MWeQ1}pL}?=%=vXv`UX_k8_+}8weK!&1>-oUA(GM_jSP9c6Yf!;) zEwLIVjhDi(&J5;?zHhXQ8XRGq&*43r5f%B2(&NUB`{FVGZ2`Q!y*0QhWck<9;pK)> zcL~{5u1z!|S`w0RvotidiZrxze$y;t3~l`?C{^ADWlS4F$J`ORR?ShiVr!JOc89LD z2Xw4jql~%hJ8k0zuQc_lU!%rdZqN-6HMDe}vQ2%dp{@5yL%ZxN4J|@j?}dhDnJ4`I z4$r$pWC9`3Fu!5X5Tx^VD(bB%@vi(ZU-Kr9TVzfC`88xnEvRXGoir3I@;?d1@_?Mv?`CQFSXtq&@c%W7 z2uhrB{;w7ho=5*adi<|n*cD!Sr7_gSnqG8qi4(QL2KF}!4 zp|${4ICJJnE^qdMfyiF-6tqYxJ4eF^LkJx9YoeHdd)WO5{l&T=dppH|@nC;b*>HDw z*h3-+{&aQ~>n4^CbnedB$@qol_RJ%>%lNy?c)yk?4WcrX+&r58a^6+M_Z6*%k(;ae+n6gd@GgCq6(D9Pb zR$6_e?Q-77oJKZ4B-z#&GD*1)1u3rNSgGjRR>Px{Ix%z=iuFt8*GY&sB3F~WC{3&S zK$-^iKT>pFod0>6Ud3R$(|$`?2?~AUa+gP#kk&;O532CZQ6)!tw_d|T@)Yg-td!r3 z9@S(Yz-GT9=$(S{6}_cV5LOg~z`<@MERN}geQ^AFB;I}0!E!0h*CBb+FiztXv;`nq z*TT0nBXccvwh+6i8}#%dCw^W-9qla~q}J~Pxtf{jkm8hub{}Qpg8SI5Jv{|nq7U_U zs?$KEw5Cu&HnZ0nm>w$?^j%dtpDoj!Jm2@h#IFfrd;&;KGyn+*j`zK_$~wO7Tv zyzY);GdkNzt#Xk&&CVK`j^QoMX@7L;V1NvKOsnbNZRd_G7*F*wH&VzG?Zux6`BC&t z)ko_L-!$oN$}@L>0kV$`JyS{Ubpg|9QyyD_1Sq^Y7W(uwfUK8 zyV{Sq^nyeDzalBo7BD7TvOr7Kugh!gKuoD&y42x>&w<>KnVk)ls%gVFcjfjs6|CMx z28Kss$CwAXf#N2n7$&74{mgEU|A1M!%BtqyhD__=T@5O;i)6!w$Nu#EwYv)PY77ov zom|2!IDXu)#JbFZ@nJRXqel0i1c2Jg} zbq2^b%os2S__Ce91XSu`%5!SjR$+aB^)KR59beC@_>fWAs##@@La2b%B`gkIoOgmW zxg#x$v2maWoTOWTe1|Ufy_5TJz1I)hKUT2VKs|(&Hpi(p#|>?)hVBGpu$6ACarlnp z1=}yc8RPG}00V;HDgXA67Bz~2c?P(YL75Ued@>|l0tQdq`%vU*dEm;1=W&WQfG|v% z!i|DRPZGfPJS5VUG(v4RAY2#~Gj11e-P_{JZZx%L8!E!Bd)uyt~=1f&+ z-J1DpaCP9KCOCE{!NQJM03ZZQ4S=WE%6Yal*KhXuy3oF8R&jVe9&{?6ovDb9+*GHR zivtpSdM6DqRUST_%GCr+p=+ zyFWGD4NC6R0ys);K!E+Bjs3M0V?ffnB=f$8MBRc)iW=|xqmK}sY6Z2OoGP~2SrzKM zw8s-2<@yRX8;D7+$-AKp^89U&C#UthIr7%V)cc|*-u{7yU+ljV83GA9&bp3CVW*%3 zwp5Az-N44pDAIo%vgV2*-QlgLuKhruF3r*12N%TA_@|mr3q1W!e0>=q9F zmX7X8tt%zf$Ms`E3FQR=0#rm&{Wbm7-mfu-{xfNai>Md? literal 0 HcmV?d00001 diff --git a/src/Resources/ExternalToolIcons/kdiff3.png b/src/Resources/ExternalToolIcons/kdiff3.png new file mode 100644 index 0000000000000000000000000000000000000000..79c0e6e2adc3801a4fb6a691c0c245fa576d20f7 GIT binary patch literal 2952 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 literal 0 HcmV?d00001 diff --git a/src/Resources/ExternalToolIcons/tortoise_merge.png b/src/Resources/ExternalToolIcons/tortoise_merge.png new file mode 100644 index 0000000000000000000000000000000000000000..eb5b1a8a7ffb32765eb1ef3d32dfec10694dcee7 GIT binary patch literal 5598 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 BM(F?m literal 0 HcmV?d00001 diff --git a/src/Resources/ExternalToolIcons/win_merge.png b/src/Resources/ExternalToolIcons/win_merge.png new file mode 100644 index 0000000000000000000000000000000000000000..1bad3eaf0fcd0fffde731c1bd0d68d7b380b0b4a GIT binary patch literal 7010 zcmZ8mWl$83+dQN>;*Rd{KstYPcQ;7a(I6d?(%s#0AgO>7(%qdWpmc-eN%!mf^*{6M z?(FxSoq1+sHPsbxu*k6h0054XqOA5mwfKKvp#9_R93R1dg5;^KAPuOSraby*Q0%1C zqyT{WWZ)AN^`FOdQ#AAh0B{HXA4nsvRn`Ci`K^+yl&-JYsfj}Z<%oCCn%L6WUhnM+Mj~w}6$H}~ zxxpzmjaivkF0W%ZEltrqn=o7D%q=@$a&5`$AmF{}e~l{2^h0YU5tA*C6<^HW>+3Il zefaZU<5rW(8?L4Bzx3(~L*0rSxc#(qpKTU&(z*C}+PuG?lx993m{}<;Yu!l+w&=o` zaL+Xl^DWX~kQJQ)mPPPT*Qr7(cTM9S+g=?o^Jh*T?vQr^chPb9_H!8$qp z=@D4`u*_X|86J^GZgJkN|M8|~(RF2wGY*#vhNRU9Dy zx#vu2@k?E98KXk3`(Rd5gTVR7b-I$X+-!Q%?sW^2?|*}bjh!Ra=pyXs60#mTrGalnwxqlrRUZ=e#<4oEzRY9i8gW zo|nLlHSy(pPf{qI{cp7)HSXSr?q&`edK{=2lRWtwtr&Ug53N@3jRxBYeOgr~0>#C- z-bf2@g>i*grH6Cb3G>Dy*4OYW6Q7lW{XYf;`up$a@_W2KhoU!|r_^@%wPK>R?j4n^ zXVs-8lL1(^l2|z_4i%LokcO(7KuS_9>_<#6`bE?cLEOWbB^1&SJ7gWLxsS|X;N0SS zrFI+d`I-HBo%D1a3FgTuiN?$NXblv#PUco-G=q($-;tQGlAZ`8U&8p*$^VeBN)#5x z5f%}RisWeskGz2fT=`HrCldMI(vx<6B2ZC&D+&u;^M6KJ%|%$b`S5Y^%^_f9{>FOD!$a> z|8wKzj^t4sakJv8AP4!7kT)IjDFA9k$k7i49U=TL8r8U<|gF%WgVGuJC54rehvvKIm=G>QNG^3Su$?(EN_-}gy0um1DLS?n!^SZ>Y zSL5TM`wG$!=20#$oKI}k=rkB%t)&q61m4NFT4-O{rls*XV|U_8K^R@eEOe&*{U`II zzl6w(6m@urE0DZ`%vBN=y?M1YJSSC5^CZNCG9RG&+K(-d&CVj6mS3+)VK?ge(BSy zB=&F4=9Y)vETZe2pSw`3HaJ`hG$g%D9hmuhH#+T&BWHW1hb9e6Wo8pYAi>YikC}Y3FfHCC3WEh zEC`~khG0taJUlT8eRmLl`1CeWc`uK%^o2!ZIzBwg&$T#k zAj==;*m=hq90QUku1p@g8I3MccbDye;#W8%VC%ck>TssysU5%v<;@u-F3~c%6aIJH z?K_z=BSx9o45o>dR+y7eaCK6PAI3d>Ka;qa&K6u87Ad_FT_<_krPnvvQIoZ{Z7BgNLp#r#T|3U~H;j+X_Y0le_~SKVdfy<$%4xp{S;;R^wyR zhp)k(5WB^R2?ZzF?8as&*&RH~ul>Me4$+=l*C)OYMI%`Ex*iLQ3hn3u&u&#MwS{Y% z+}c{|kv}a4nEq5%faRp#CgG7OGcSP0O)7v9w^X@dauQ;0NiPKWiKJI!BJD?g*X$_# zrGX`iz}$jmsqlBq2UPwK|{?*!)5qU)cXS>4Cqy5 zx|G^|tQbGtzj!wtpS_1C;j9FL8%Gzb%SJ|r!o;FcUrwx*HD=Urqd(Vk7PpYUJlW0k zwAaM{C*U*Wb~sx?6{%BM^t;~kpooPG!|bDT(GfEd zqzgjBl1;L`xlWZ=@L<{rr4~N3*i(w-%?3Y&jEC{yZY)GOV6VYM1=-^bp@?UQ%DNUG zdl@%Sbz;zot6oIl>Fj1Vvd;IA@z^M_@_Z%eILB!#5h{n{hJvP;ocR3wspI3?d45HZ zgY{rxp)%Q58b5eUOLLq$QFvD5YuMuGmE}dqa1X{rM%h&j0UbryC2M;*Z~6TA;dTcK z+o<|?tLC9KT|dYSzWLu?j6h?G2RA|8ekajPvz+I%;=q@BnoZvtd4VXRa@rGVzV2D= zdc`8EBjvYRGVaY}|ELcmVtbG{aA5ihue zV=0G28=ACfj06Pk=JEg7Xvnk_JpN_gqX?{#DK?~*FRe@u*VIIlB@JPyill4LmI%Y} z5mbpqEj*NVGFLD~>tvuR{Mx58U%g4H3urlT#>p2<b2@=;NZ&Q*UPG!#4qB0i!Gi} zRAQS>{|;O|UyVmLifSrmgXB0Uyd@<#!vQ^a6VLWPZhHJY^J(96gN&3^F&24)vCa{| zODh}7pa%t~Z$H2_=tiA?J!19T0{RAgx#)YBqWawkctggj`yeXSo9k|ka; z&sY7AYgs>p5HPA^7x*IdH(Gx*-UF$+o{i|bLYg}TJP|+0NVyYJ-3FcQ?W4Yeyf51} zOWl?4@;W)b(}}W0{EBtQ@}AUrm0>4z-Y3G>9k6NhX6Yo>%{KL4y@um7W|Stp~#WQcE(>-E1bGEs)%!JQsmK^ZYV4#Grv^_`NY1 ztesnh;v)nD8#d%pnb4SvOOqRd^bQ)b#>d^eNx>=cI#uhe)?rLxg}6Flp!B8^dxLB9 z8(g_vxp+}YX2ApR`&ZLPX-C>n+qBXTJMha*Tr7bmEAFhl>{{OVNNJ5lkSRBA`_qlnhtKv?vJ_{gO3&$0t8bXA`1Q?IyiEk}Vh{*%;{RSM zl*y5V?>380b=-sEEI%~B16(0;6i`uu|H|7-DIy)ON~4hUmA?uqe5aWuU(y~vF5lW= zCbfVXV!NHXR2`()?T@wm-9_z3I3i9aF25NN??p^c(pirUsHuhD0tuZJQ-rcg;yG#P zSw-Yf^yfKkxG8u*xUQP599kQEWfKVO!!(BIUkQof%K*+~^x&WF47R;NlOa_=fE9ShCQ%lv;?OK|BX=7?uq=^DkJd0*3l(Q(N-parDA;ArkaJulrRw76 zhB63YUl^Ps(oR#Y%B$VORn}Il2r7IJ3AUniES|e2sWX> z3Tuo}w>pbjD$Pv!C`oeRB&u>^wuhVL)3B^4#Y?h9B>RUuQcDlZs}uRA6&D^^Si3*b zE~9lP8lyPo1UH;BuvZadDLwax*pv+Y%1!-YrV zRGqCrZ8z@l1Z2X)mS_2ni>h9K&zzT#D|_(s%~UuAr)_~9V>(&v##pFyhg096%jX;O!vxzd(>=kc3JhY^{= zrsftTc}pwz2}cZmY;$vCMw=D=g~K*$$2;DYr`p$6@ zCcos#5iZg4TUz4u%40W5C0QGWIWvspzoUMCRWBpn3|lCFFV?ivr*5itoC z>D#co_me;EJ{exsKL0pFhr^W}tw^S1|IhyRw(pZy5XwPSbO`&-|w2NkWN^z+fHv-_^ftKkYj7 zs&<4bqWM@XL6j7%?Kf6d;vHt_Tp;qli z-a#Y=M;(#{agoS5<;ydAWW))~Hlr`aOyhl~oXN^Z$A0T;8wBixWzjXwDB>jB|Es2& z5+rea@m7&k5dcr^Q*5i{#-D0Q1(vJQl% zqk0MQ5Gu*@S(B9UgJhYg{Hnm=eZXA|*-~}J?$u~1^nGsoCd>2KbGTfY&qpF&df0c1 zwmPrwIlaNAEhSYVC9hFJfz##>1p}9)HxylJk_mBX$ha!EUtPV$MIuS zd(9pX?H?%epp;a7kg#x3G?FbeWTvhY>24~uMFHmB0h<9`L(BzlU?5g-o%pEApPv+AkH_v_dWQrc{f@T zP?K9M;k|M*mpp%kNI6FsOSYzA>Nc8<%qEZ6 za~;*~6;4e9+31R57#hZMPGw`2Tg6<)eg$&W7bNq=+p!HNM<;tO1pR@N1<%;|h-(=m zn{Xyk3N?k>7JqV_xUs^s2aZVZDku(&avJ#w|5eVxRX;0h76~rat365+F=1M~YMko0Q44$@ypEN_UHuj(_cxbH~jd{wgcAOcVE(Kc;d$SG^0dFA^aBe5fF? zjCObGiua_>^c-K=ynZ?SZ1ggff@a=mAbD`UbhJ6B{-@*onD@JTjF$=3g1AJ5!5VZm z_KQ`dB;8-+E+&YyUjqJ<{vNYwCY`Lml4w;rgr&BO{8wOVQX#1d4h`Ab<=w#T`gf$d z?!0x{L3TPBMzLv)tY2PNKe$e5Hk2Z9%s;CJ;&gehmkCUh9GyChCMa2@AXMHJMiu1# zI4l&3pPp`9=H<3qpx;gh@|!BI@MeBw%5=9Ewp#F7tjMi_>}s!sr;TPR@B}SNF518``#(upn zDTM9yR(2*<9ee&M5N{+Bg^HDWTP`>bJup)D>M1bAKP(@IHi9!wBCGOMe-TiUvX$NR z-PIPGT#PiAT!N1VLHi|DCK7Cb}IR%qD#m`E9$XWamWnY`ZRqKK|_r*3` zj{)b8N>o(~v#gjJnm6P`S(59sFuAuQfu-gL;UpUw_N@KYGg?>JPwF3_lM8TERmDE&xa+hsPGRRq~Ypa45Jv2r7(AiwC>O?Xt1 zLQum?*7bc#-Q&SNrDl@MP9tuie8Jvi4RAbk@^ZqvE~821fcAinPv_qkMMX?Y0-8pwMrJb8mo5jL!ZUeNkM%G1Pv}X9NX5DgqzINxl3d z0_DGC)B$sCEiQsE6=RN?DkPJo`RRf@rDEZ=`-zGojVF6I`$OK&f|%0>a`UoIxBD+z zUmR`~2KHEr>aZ~S_uO45Z~}~l1h`Ua z^1HW5>sjYC6Jqoor4xxne3GqnA8lFoUUjBV0xQ}+3`FcWw4eH-y}nTvIJA~gh(Y_E zS5;f~SGK7E!(D-}Hakq!R-E=iH z!n+Yinx$>WyQn%lK7se!_e+g;Es#4k1#n#aw~P8i5LmA=Jn%iSzhN>9W1DFP=fPNe zIfr1;Wkgkzm;MlUN<)0SXb^anC;n=GtR6l(IwzJK{Pcp?Oc6I6uzD}09WsKaVON1F zD3!(|NfJk$<4JU@rxQ)+7q6%ZJeCs`M0+bnQ*GtAC8!gN{gpZTNUq!_fc{hxH0~ug zV~*@zK!));5l6(=o7r19Oz;hldOE8P!}%m(Hfoxyvjl|W?M51A5RUNxU7Eq_ zq}tmW1ql;wlQfi%K)PTJ2N3B!4rOxI012sfY2&m!-6B{mEjtrXxPnQ}C#+#sdwxtC7U>3&gj5VZLb2JO!1jl>f7LZ~5*! z?tp5>h@oz~3Go4u--rz}w@|fYv^7Dl zIXPkU?261fn3ZjxTV+5jMutZ6bCIQ_hRxb$gKeE(WXfzz=8^=}Gl74FYIesOIs@J< zm9~sz%>b&JZ#JtZulhRX-l+Uc%J8W~9lVV3GyvFDX}Zk%ejd(mp~c;r%6~eIp-pOM zh?D~9xo)D^pi&5?61QWSa?4=~zB9kToPp(4V4%* zKX3e&7|cEIyF1oONo6C^S@W%|+{L}Uz??5mC}Tu#k5jpE^qlU?_1_LmqHMebza+WJ zEO#{6!*5A4+LdO6183HWu=_gP7FgHHbY@?HGMBrTr1MrpaSnL=<)~bkeY~3IPIJVq z^^TNdsX^UI$BgY?)^_GW>96$uqDBzqIissCB&v)_19&y+KbqOeyobt8 zVzKf&#IBdq-2Wc4@p3VEEZkjWb(>TXt@Zc~;dL)`siYnh*T3jt64JaQv?Gn<6Bgnc2Z;YpEo(RF+?UEL(vb!0n_$$Vym_ zUqif5gX)VjEygz6kaQMSN+2~|#DEEI+SI(XutFnH$Y|8?>2kE)#!z52`1=Rv5HeWL z#hQnX`Sdr4t3_()gPP9>E*d@I`N3<)~SM@1YHBq(@U0~>ew5;`Mj5)fhaIf7X z8>&*4s?v7sJsTG;BO`yA2kzHL2XzKLKR9R|eky$sWyPHgxm)iF5GWGzv{mCJXQ%5b z@G>H}kn9I|2n!2yIIT20ceb<$&{%hI!r=gH6G>}J%eU)r`0muq4Ek?8bR%P9=0f#& x@%SN2bq$T=Si?{%ng3mq{%2jH(F8rysP+?68{F1R{oBO=N^Bm@^}SOgT1knRSh8+WN) z9{>04y$>_@oO{m9+%x%`a}#v6RY?fx2>}2A2~wRQ<~NVqIp#NC zV|IdF7caXCI&+S`kzN;Fj7pL^t`6U#kNry@9duYj)#V*)O_|v%K&3*<#e|7+7YaREWUmP3q{K^Tovj zl^gNb=i?3{#)F3Y{@d!lk7R>nwOd~ZU5?KgI$^xZ8qYp!6ce-RnVCszml{B_YNlUV zL%9mfD~}C6O&3sqzVN?^W&vo|On*rc*;8WWo}p<|XV;(p1VR#gPx@3Z=bzMRbkVL@ zX*unl583AN4Ogtj#9AI!PqPwcfekIo1#)-~h}l_jV${26X-nl;@#Cp^jpAwVsY2Y> zf2Ju%Feq+eM=37lxZuakd>3k9m!r<`PF2Y3e5J$G3>c|s{0Jw; zg1uJupGI4mnAszd;OTlaQ7zuiH`rC^;Q$VZ+r zZW6Don@^oa=mf~ZwsLKJ{1e)Sr-xWU?FybaF-9iJ5eL!R%ZjNPuMPF_3jC{x2?4J9 zF2YJxe+@VpC8&5-`~{zZ`8$#t?RGP3L?j8b{*tYR(8v+5UyM>@>XJWr>T9+O@xid< zt79Ro?VKV;6}cf{LiIt|>+-mMGwCY)4^HPPsp%FFwKfBrs}RytC8GV?H&!4rfnxwmI;Za`n3O*Muo z!2lJ-p$&qh@7Hj=w17~${ZgSuCN%6VYy=#?r5xw+es`n+^-%T9E)!16n z7DT8tF31VJpW=V|GkH%q>bzMbYGceN3OAwIevXq~ zM*TdCAgI;7gu+tVCX$nSh1_rsdtmWaVeSo<>ZcladJcT(Fdtu(MYU;zP`<2aCyk5( zCOjdVse8qe*DOmNO<#}n90PgX=d(;esKq%BK>39>=9=`QV~hPta|y-ZXFbmXw zU2v_Ovu3_|G&BJ>g)cUC=BZ3*5g?9;7u!=vS^vlQ0JYBs`CQxT{}%PX?SQD>*)11V zcQ`tgof-Bz_~qLM`^l!J%L`2aQW>pM?Lx@{7=L+_biV9{&(V-_fsU5G@=ZWOMRYX8 z3Ui-6Yig6qFKT4Sj2#3qe2H7wQwhN6(uP>Bl1MuRv3zNxrSC9j{3TG!W*{eK6EW95)q$ZRgo2{czDJ$$4SnNXgd7ixc8}h z)cj*;y>5Q154T~PCH}>}G%ow?U)w2fef?zXDchfAbk#p^mL`cmcHnT(9kpPWUuSNu zG+euo9l9UJ=+oYQ&{&^XezOM}UC`=ksBVXelmn_hN>G?8ee0VVT0TZ>CTFAox;56SdQ37OU_?Ad%oQL|U zz-Kw`9K;^eSmzdXxP7sItVmhBUCv}60Y+RJ{IjBTP*tQ)ZczcQ<&cHy*d_^9t}tY_ zgSP2MBOa2u><~06Dn)cj`1_f;$i?eu0w=w`p%RKw+53Tt9nxVOjMG$)NQ0^5rNxHU zAGT7#f;3BuazP?(VM3xgoIw6A^7{RVKUsEH8tDWW$Q1q?mHb_aNaYq1cF>WIV+yWr z^>hPIjC(&L-r0FyAA+~G+E5T{L{oG(4|sKD(qjC^{*q%?Zyf$1?zzr|E_jJ(R8zD! zS7L7YdfOIzIn$adIRvUE>jLqVxj*@0C7x8PE=`&N(h=^iDK!?v(#+X29KlP?6Y-xA zT5tAz*MMoFljA%1I7f;)-fEd`m7Ni#P5m?ft!mWAB(5j8^+%p=%G6Qj5JI4gna7E- zaKs*fgsmWD7TYNxU!;2fGhr|I*fN-{T5$IR=gLK3W!wH9S^& z+)_oi?nOITlIIj&X5=@hx4Mcq7i42Sn0w)R#7T;J{jx41ri0J~$StFXYaAoq(Cw~i zd+-{UqGy{59Yjgsq?lYkZECgB<4~NlraXWu9-|xI=4w?5%Zw^S)OOExDVJlPU$@?i z;`*NU|2`xEy{kJq?OCNk`X5gplRre=w&+V*{Ghva)ux9}V7`Z02m1>CmN^TE#2IKl z@A31H`akJ5JwuOM)O9WC>!csRFFWMj@||sJVan8`aHGJw0?Lo6m1<4}Ek<4{Q%oDl&z?X@ZK0jY&GhS_;;O2U?^{ovf_ z^^h?fsrfj98ee}Bjn>uxZ~L&Heu8fx2;X7&wFNVKN$Tx=+b1`{m5%56V%&f~*D5!~ zn^`JIRIHdE5jgyzDrvw^PpAsw$xgHSz^NH9`*wJV z!lCG)l2$I&eikfaoj&k*d#nA;9rMZdq5sVJ!G+Z9>cBCZUu1~fv3#uowoO4dBGBxX zHZtH*8vk*kyB!RsbfNQ5)fpoSe1wLUwgc09BwfduCw8}D^|akG3nX~-!PbUZbaoZ= zCimKjHfr3@fGH z6X|EAyB_jXJ}s}}HW=YNt!67Hd9@|qEx$i2y4xR@=NZw?eDKs8=lP0noP9WgX9qI) zI-_q_`X)0-6}jgt9=Ziv_^@47W0E2R9T|N@kyOZ38%N)ajc(j!!?Pa!NMHeo6F2Tg*Ia#>00NPI1t~XOLDq{e9$> zaCfk>yV9~aNjQ)sQ_Ha!#(aydDZ?1i_8a)ywkc>D4S7G)&=H31wJzVLReO-rOwNYY z4hHnP+!U&C6Ly&>km5Gd^%o&sjY)Q#vR2RHS4~F8kX@$z5Sf19EIJrJNhorqU4oJs zcI_JA`U50 z{SxmAWEA8UYkjb%JufNbvb9o9j1A9*sb+mHdn!Ju3;^-v$Pl4t{2#cT#+hLoq9zSj zcvqI~AnoG1m~BFHG{}}{{nkqgrPG@{4@Q1t`}UfMEqn;NU8dWWj_xTxxQdI+lrc?w zH#KG0YfPk-wzNDO|S!STnh zJNNj^=~e-<(TgCs+K`vk14N(u=RFV%N z=Xb_O6MgA4VQf8@d_$b&vZu2!rUxjkXeC^5R~Z=fuEbt?9(A@>mK3e_;X0WG*eZ6k ziDNGM4B9Uz1Ex=2R%Wfb*$bREu4>;SUBg4dEo5S|VDe6z_1CK3zH4>RCyN%$2|7GL#w7Xq)I+R}zLL+tLF4@VDa z6|6|rnrraBqz2-FUulJI>w4JVqS=k8dPh?@?s9ag@{9M2-qE)9%~7N{96>OQe~`44 zYAhR?s$|Jz?jK&r3!G1EPLdHb-BV`b_er z4e;!y1LV&BMk!0PZD4um?J6<5J@I{5!jR)RCpOZJS)Rh+Tfv4ugoF&OhCJ>#=}n2g zw0;Njze|%3*-}-LH3u!M5%u5%foDTiL&mGgo_?FoQxJA|ta93z?+ z$Ka9vi%D=JL_=8%Bax!5evA553qZ2P%Rl!;6m(DC zspQJTn;*nBV)(wvr*DP=jmuJt)n6z& zSs*4@yY&L|=64tIX1EKoRL7b3h!F54>a7(RqvE8U;2#=w~!(Ox(fSm`>Gu*%Lli<9o3h#=op7jtkcH zuF=8{8>3nec|is9WP@`@ciny$b;&WWX_24;xKaKgy5qx;*iqK_ro`PN;VT~Zt6|~^ zOP|dj28d!@^b>lU_;`X+)r?o`i4BjcK8G0`o zeTyw9`uHR3Rx3ZBR?6b_Av`XZ{VNFzj}7sm7v8pRT?x-}V4BXcI9ciS$JXLwp~3mq zhdpX7_8|{iFJSwQt#@#r+;7K%$!2y_IA1^aZ-|a(=lD?;yo^s*82phCNfVP6;+%by zdTnc?_Q%u=KD*C^MH?AH3sW9l>H8cs>pt*=nL)ClB5{Kni5kriTd3R9kVw{<`R#-V z{Nvuh9k3gJW!$oZq=n5EZFY{;EVyn*h&C`cerxPlj1GJ{Jx#UZ`FC%r)wKYpaEFNi zApTk+5}t%WxzMN~avb+G*P@G%9scHxjWRW1M#2A*3~T3Mj?-AJUaI^%-;OmLz?iW( zHM5_6W?~OH0(~0mV0R*Cx2RSC@#M{B$MSgRU{3=Jg5&;-4$5{R_V$qa#vq!iBnJ*Du3^iEB&v-Ml;V z$+%fv%8^aDa0WT1g*#fy@DCQjCP1~3rxho3RqXZ7#chMk9K5NI!<+-AB%kB3Bq9Rv z5;T`pekeH>M7;_rWTwf=--X`^(+BNMDW4)dx1Pea7+2(J-Tv;+{tI7e@IvU9-%tJS zX6YtSs-GN3C40(chcQ`X8ocXQ=DqOV9RDd0fdimSFtE4DxUO5)JgoE=WpHq=NG#_U zoaH+D@UKaBU1>KCIhxPX46vd6Zp$2GbOQ3~JizbM1%Fn3JKWE|wMhJ*;W>l`Te1Naq1V65x`@zV^8nVV>$;^?QZ#pBWE*d}750{v z)s-+eAKOCj{FVv8fh0QUXHI3bu$PJcI~L$+lDM2YTe8n7u>RD7x`&plovFJOT6gd# zxiaQ|RdDTKuzm{2EBW7HJh!k+9xuVJGJRe%dtwdyl2yDHnCNg zd$ZA8nYh9nD@xpJ&(BtBN%b^g$~iAOeX;KW>f9a|a;`xv$#f1Gyu3{ke=y4Z?71Qq zdLhRD(Q!H^j7s@?G7LRZkFmzU3i9Pnc5Ii%dyR|+x?->WSvzD$#-s9dkoL-Yi>eQ} zzNermE?sPG?D=Fs7y=F)bQ9@&P1gL_e{+>?j`-w{B+My}ycDFY=i#fs({bHrcQN2A z&G4bMZ3%M*A%3xu>A}EybGB4T^00nURtqFU>5-4p!d1JaUtn6fkE}S!T9oRftIMG% zu?@=DQOtPTIN4F-jwROF%kx#((n+^ya{|V-zn8S{6wV>jk=pdO^X(TFAi2iBq`ZD> zY;d(r%VEW1bVT~AR?b*-lpgu~B_~bmko-{@dD2cYb#hj*YNG; zg-s+X-l3jS36QZ8i^~CoO2@D{2M1)P$^)f6nS2jq@<(KyRM`G=y&Fac#~Sk+7kVn$ za*X$zz=rKo#B=xx_rHofY0Xr!nG8fap>-?&nOSfqpHj?;^)jzxv(tN%qk6%>B@| z05KT4<%mrPVBlq>?ddU1dAJ4UCNR(|$hb;6lb{M^)w2u9yj!5L-e7Du%)RPi<7vnKZV|-!n48%F+#9iVG6V?S+%1Jr`j~ zm@2W(NT`ZV54XQMV_jRV&mHjwKj#UfqK78d=4@n9AC=!^K7Ir zoHy47Zf`vvrQ~$a8V~6Al%mVjl}Sj7mTa@=98`USJRgQ!lKb~3e;iLO*ztCN!t#&i-z=w>8KB$0sY2ZZ+y1e{}$z}F!YBVX>ft)Ra$Cn{Wu|URx~k| zeaAy2MoaF2q3hW2tIWWP5$El#SZHZef$Lk$JL)HJqW!bq~|g<8tI_GHq#=68}5F`(Um&j=bXi!R43GK z@b?EdmIZqXV=_mrHTB*fntJ97MT)~C|M?YpvrT>0ja|ohDd+8-W?7dvY)flYN&uVc zV|;x8gb7R=b6PPn2 z@^FEqMCq|MW(*J7KpRh5nQ)vIEk5*vfIu6) zOagoA8kVgseugML|1*~$U>IN7PHdN9ugw#vn#8q?R5M0@VtxGAr+$LevqCKM+CwO2 z$X6su!!4M~0R0K;0)@K2P?Nva!x|cE=C6n|pRoIQa5X;|!Md7R{pvVJAaKB>=IAxz zOs}?J8zuK|T7NF}5)Pt%0zc^OU{~N-Qe?Q{*wAvVoe{&rU@)d`?e{htC6^9Aj)|T{ zvoC6A^bc*uArSXM;<7#BtHB=-3TnOdH=SF}1zD{JzJk!r(w4U`sj~Jy0>X9@Zm&ur zBsv?XmfV&yAGZ1!24Jh8{TQRX``Q+SFyr(iy?ckNj?M9M+cPv8-C;r1Q=Hy@qDSPZ zq%o`TYs%SeX{sl%(CaxsNA7w%GQAr$5%>Bf)*Aq?Q7ySX)wjN(HhCxqrG?le>NpDT zx!$w}l`{1ixx#j#q<5I7A}WHbIP7N6luDVulKXR7*{3nA$ph}hMPInput 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}"> + + + + + + + + +