diff --git a/src/App.JsonCodeGen.cs b/src/App.JsonCodeGen.cs index af73a68e..7269b252 100644 --- a/src/App.JsonCodeGen.cs +++ b/src/App.JsonCodeGen.cs @@ -4,6 +4,7 @@ namespace SourceGit { [JsonSourceGenerationOptions(WriteIndented = true, IgnoreReadOnlyFields = true, IgnoreReadOnlyProperties = true)] [JsonSerializable(typeof(Models.Version))] + [JsonSerializable(typeof(Models.JetBrainsState))] [JsonSerializable(typeof(ViewModels.Preference))] internal partial class JsonCodeGen : JsonSerializerContext { } } diff --git a/src/Models/ExternalTool.cs b/src/Models/ExternalTool.cs index bca67fc1..fe9c4e8e 100644 --- a/src/Models/ExternalTool.cs +++ b/src/Models/ExternalTool.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.Text.Json; using Avalonia.Media.Imaging; using Avalonia.Platform; @@ -19,8 +20,20 @@ namespace SourceGit.Models { get { - var icon = AssetLoader.Open(new Uri($"avares://SourceGit/Resources/ExternalToolIcons/{Icon}.png", UriKind.RelativeOrAbsolute)); - return new Bitmap(icon); + if (string.IsNullOrWhiteSpace(Icon)) + { + return null; + } + + try + { + var icon = AssetLoader.Open(new Uri($"avares://SourceGit/Resources/ExternalToolIcons/{Icon}.png", UriKind.RelativeOrAbsolute)); + return new Bitmap(icon); + } + catch (Exception) + { + return null; + } } } @@ -36,6 +49,26 @@ namespace SourceGit.Models } } + public class JetBrainsState + { + public int Version { get; set; } + public string AppVersion { get; set; } + public List Tools { get; set; } + } + + public class JetBrainsTool + { + public string ChannelId { get; set; } + public string ToolId { get; set; } + public string ProductCode { get; set; } + public string Tag { get; set; } + public string DisplayName { get; set; } + public string DisplayVersion { get; set; } + public string BuildNumber { get; set; } + public string InstallLocation { get; set; } + public string LaunchCommand { get; set; } + } + public class ExternalToolsFinder { public List Founded @@ -44,31 +77,6 @@ namespace SourceGit.Models private set; } = new List(); - public void VSCode(Func 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", "\"{0}\"", "VSCODE_INSIDERS_PATH", platform_finder); - } - - public void Fleet(Func platform_finder) - { - TryAdd("JetBrains Fleet", "fleet", "\"{0}\"", "FLEET_PATH", platform_finder); - } - - public void Rider(Func platform_finder) - { - TryAdd("JetBrains Rider", "rider", "\"{0}\"", "RIDER_PATH", platform_finder); - } - - public void SublimeText(Func 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) { var path = Environment.GetEnvironmentVariable(env); @@ -84,8 +92,52 @@ namespace SourceGit.Models Name = name, Icon = icon, OpenCmdArgs = args, - Executable = path, + Executable = path }); } + + public void VSCode(Func 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", "\"{0}\"", "VSCODE_INSIDERS_PATH", platform_finder); + } + + public void Fleet(Func platform_finder) + { + TryAdd("JetBrains Fleet", "fleet", "\"{0}\"", "FLEET_PATH", platform_finder); + } + + public void SublimeText(Func platform_finder) + { + TryAdd("Sublime Text", "sublime_text", "\"{0}\"", "SUBLIME_TEXT_PATH", platform_finder); + } + + public void FindJetBrainsFromToolbox(Func platform_finder) + { + var exclude = new List { "fleet", "dotmemory", "dottrace", "resharper-u", "androidstudio" }; + var supported_icons = new List { "CL", "DB", "DL", "DS", "GO", "IC", "IU", "JB", "PC", "PS", "PY", "QA", "QD", "RD", "RM", "RR", "WRS", "WS" }; + var state = Path.Combine(platform_finder(), "state.json"); + if (File.Exists(state)) + { + var stateData = JsonSerializer.Deserialize(File.ReadAllText(state), JsonCodeGen.Default.JetBrainsState); + foreach (var tool in stateData.Tools) + { + if (exclude.Contains(tool.ToolId.ToLowerInvariant())) + continue; + + Founded.Add(new ExternalTool + { + Name = $"JetBrains {tool.DisplayName} {tool.DisplayVersion}", + Icon = supported_icons.Contains(tool.ProductCode) ? $"JetBrains/{tool.ProductCode}" : $"JetBrains/JB", + OpenCmdArgs = "\"{0}\"", + Executable = Path.Combine(tool.InstallLocation, tool.LaunchCommand), + }); + } + } + } } } diff --git a/src/Native/Linux.cs b/src/Native/Linux.cs index 1d3f750b..338f91d4 100644 --- a/src/Native/Linux.cs +++ b/src/Native/Linux.cs @@ -57,8 +57,8 @@ namespace SourceGit.Native var finder = new Models.ExternalToolsFinder(); finder.VSCode(() => FindExecutable("code")); finder.VSCodeInsiders(() => FindExecutable("code-insiders")); - finder.Fleet(FindJetBrainFleet); - finder.Rider(() => string.Empty); + finder.Fleet(FindJetBrainsFleet); + finder.FindJetBrainsFromToolbox(() => $"{Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)}/JetBrains/Toolbox"); finder.SublimeText(() => FindExecutable("subl")); return finder.Founded; } @@ -175,7 +175,7 @@ namespace SourceGit.Native return null; } - private string FindJetBrainFleet() + private string FindJetBrainsFleet() { var path = $"{Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)}/JetBrains/Toolbox/apps/fleet/bin/Fleet"; return File.Exists(path) ? path : FindExecutable("fleet"); diff --git a/src/Native/MacOS.cs b/src/Native/MacOS.cs index 6d6e8759..450b87ba 100644 --- a/src/Native/MacOS.cs +++ b/src/Native/MacOS.cs @@ -33,7 +33,7 @@ namespace SourceGit.Native finder.VSCode(() => "/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code"); finder.VSCodeInsiders(() => "/Applications/Visual Studio Code - Insiders.app/Contents/Resources/app/bin/code"); finder.Fleet(() => $"{Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)}/Applications/Fleet.app/Contents/MacOS/Fleet"); - finder.Rider(() => string.Empty); + finder.FindJetBrainsFromToolbox(() => $"{Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)}/Library/Application Support/JetBrains/Toolbox"); finder.SublimeText(() => "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl"); return finder.Founded; } diff --git a/src/Native/Windows.cs b/src/Native/Windows.cs index 9325cea7..0dbb1eeb 100644 --- a/src/Native/Windows.cs +++ b/src/Native/Windows.cs @@ -111,7 +111,7 @@ namespace SourceGit.Native finder.VSCode(FindVSCode); finder.VSCodeInsiders(FindVSCodeInsiders); finder.Fleet(() => $"{Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)}\\Programs\\Fleet\\Fleet.exe"); - finder.Rider(FindRider); + finder.FindJetBrainsFromToolbox(() => $"{Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)}\\JetBrains\\Toolbox"); finder.SublimeText(FindSublimeText); return finder.Founded; } diff --git a/src/Resources/ExternalToolIcons/JetBrains/CL.png b/src/Resources/ExternalToolIcons/JetBrains/CL.png new file mode 100644 index 00000000..834a4120 Binary files /dev/null and b/src/Resources/ExternalToolIcons/JetBrains/CL.png differ diff --git a/src/Resources/ExternalToolIcons/JetBrains/DB.png b/src/Resources/ExternalToolIcons/JetBrains/DB.png new file mode 100644 index 00000000..44d4f73d Binary files /dev/null and b/src/Resources/ExternalToolIcons/JetBrains/DB.png differ diff --git a/src/Resources/ExternalToolIcons/JetBrains/DL.png b/src/Resources/ExternalToolIcons/JetBrains/DL.png new file mode 100644 index 00000000..3610740f Binary files /dev/null and b/src/Resources/ExternalToolIcons/JetBrains/DL.png differ diff --git a/src/Resources/ExternalToolIcons/JetBrains/DS.png b/src/Resources/ExternalToolIcons/JetBrains/DS.png new file mode 100644 index 00000000..f969b98b Binary files /dev/null and b/src/Resources/ExternalToolIcons/JetBrains/DS.png differ diff --git a/src/Resources/ExternalToolIcons/JetBrains/GO.png b/src/Resources/ExternalToolIcons/JetBrains/GO.png new file mode 100644 index 00000000..83cc84f7 Binary files /dev/null and b/src/Resources/ExternalToolIcons/JetBrains/GO.png differ diff --git a/src/Resources/ExternalToolIcons/JetBrains/IC.png b/src/Resources/ExternalToolIcons/JetBrains/IC.png new file mode 100644 index 00000000..243c4a38 Binary files /dev/null and b/src/Resources/ExternalToolIcons/JetBrains/IC.png differ diff --git a/src/Resources/ExternalToolIcons/JetBrains/IU.png b/src/Resources/ExternalToolIcons/JetBrains/IU.png new file mode 100644 index 00000000..243c4a38 Binary files /dev/null and b/src/Resources/ExternalToolIcons/JetBrains/IU.png differ diff --git a/src/Resources/ExternalToolIcons/JetBrains/JB.png b/src/Resources/ExternalToolIcons/JetBrains/JB.png new file mode 100644 index 00000000..85ead673 Binary files /dev/null and b/src/Resources/ExternalToolIcons/JetBrains/JB.png differ diff --git a/src/Resources/ExternalToolIcons/JetBrains/PC.png b/src/Resources/ExternalToolIcons/JetBrains/PC.png new file mode 100644 index 00000000..1755f7de Binary files /dev/null and b/src/Resources/ExternalToolIcons/JetBrains/PC.png differ diff --git a/src/Resources/ExternalToolIcons/JetBrains/PS.png b/src/Resources/ExternalToolIcons/JetBrains/PS.png new file mode 100644 index 00000000..b988ddde Binary files /dev/null and b/src/Resources/ExternalToolIcons/JetBrains/PS.png differ diff --git a/src/Resources/ExternalToolIcons/JetBrains/PY.png b/src/Resources/ExternalToolIcons/JetBrains/PY.png new file mode 100644 index 00000000..1755f7de Binary files /dev/null and b/src/Resources/ExternalToolIcons/JetBrains/PY.png differ diff --git a/src/Resources/ExternalToolIcons/JetBrains/QA.png b/src/Resources/ExternalToolIcons/JetBrains/QA.png new file mode 100644 index 00000000..9b45d085 Binary files /dev/null and b/src/Resources/ExternalToolIcons/JetBrains/QA.png differ diff --git a/src/Resources/ExternalToolIcons/JetBrains/QD.png b/src/Resources/ExternalToolIcons/JetBrains/QD.png new file mode 100644 index 00000000..109ac1ef Binary files /dev/null and b/src/Resources/ExternalToolIcons/JetBrains/QD.png differ diff --git a/src/Resources/ExternalToolIcons/JetBrains/RD.png b/src/Resources/ExternalToolIcons/JetBrains/RD.png new file mode 100644 index 00000000..0732f09e Binary files /dev/null and b/src/Resources/ExternalToolIcons/JetBrains/RD.png differ diff --git a/src/Resources/ExternalToolIcons/JetBrains/RM.png b/src/Resources/ExternalToolIcons/JetBrains/RM.png new file mode 100644 index 00000000..b4815546 Binary files /dev/null and b/src/Resources/ExternalToolIcons/JetBrains/RM.png differ diff --git a/src/Resources/ExternalToolIcons/JetBrains/RR.png b/src/Resources/ExternalToolIcons/JetBrains/RR.png new file mode 100644 index 00000000..16c57d15 Binary files /dev/null and b/src/Resources/ExternalToolIcons/JetBrains/RR.png differ diff --git a/src/Resources/ExternalToolIcons/JetBrains/WRS.png b/src/Resources/ExternalToolIcons/JetBrains/WRS.png new file mode 100644 index 00000000..09a299f9 Binary files /dev/null and b/src/Resources/ExternalToolIcons/JetBrains/WRS.png differ diff --git a/src/Resources/ExternalToolIcons/JetBrains/WS.png b/src/Resources/ExternalToolIcons/JetBrains/WS.png new file mode 100644 index 00000000..80b1a23b Binary files /dev/null and b/src/Resources/ExternalToolIcons/JetBrains/WS.png differ diff --git a/src/SourceGit.csproj b/src/SourceGit.csproj index 4a078c8b..657b49f3 100644 --- a/src/SourceGit.csproj +++ b/src/SourceGit.csproj @@ -23,6 +23,7 @@ +