From e912a93ba8b985f1fccdc3fd9e58aa5faf28fdac Mon Sep 17 00:00:00 2001 From: Matt Parker <61717342+MattParkerDev@users.noreply.github.com> Date: Sat, 29 Nov 2025 13:34:33 +1000 Subject: [PATCH] refactor --- .../SolutionExplorer/FileIconHelper.cs | 63 +++++++++++++++++++ .../SolutionExplorerPanel.FileIcons.cs | 60 +++--------------- .../SolutionExplorer/SolutionExplorerPanel.cs | 10 +-- 3 files changed, 79 insertions(+), 54 deletions(-) create mode 100644 src/SharpIDE.Godot/Features/SolutionExplorer/FileIconHelper.cs diff --git a/src/SharpIDE.Godot/Features/SolutionExplorer/FileIconHelper.cs b/src/SharpIDE.Godot/Features/SolutionExplorer/FileIconHelper.cs new file mode 100644 index 0000000..7adb8bf --- /dev/null +++ b/src/SharpIDE.Godot/Features/SolutionExplorer/FileIconHelper.cs @@ -0,0 +1,63 @@ +using Godot; + +namespace SharpIDE.Godot.Features.SolutionExplorer; + +public static class FileIconHelper +{ + private static readonly Texture2D _csIcon = ResourceLoader.Load("uid://do0edciarrnp0"); + private static readonly Texture2D _razorIcon = ResourceLoader.Load("uid://cff7jlvj2tlg2"); + private static readonly Texture2D _jsonIcon = ResourceLoader.Load("uid://csrwpjk77r731"); + private static readonly Texture2D _jsIcon = ResourceLoader.Load("uid://cpdobpjrm2suc"); + private static readonly Texture2D _htmlIcon = ResourceLoader.Load("uid://q0cktiwdkt1e"); + private static readonly Texture2D _cssIcon = ResourceLoader.Load("uid://b6m4rm5u8hd1c"); + private static readonly Texture2D _txtIcon = ResourceLoader.Load("uid://b6bpjhs2o1j2l"); + private static readonly Texture2D _genericFileIcon = ResourceLoader.Load("uid://bile1h6sq0l08"); + private static readonly Texture2D _mdFileIcon = ResourceLoader.Load("uid://8i2y6xjdjno3"); + private static readonly Texture2D _editorConfigFileIcon = ResourceLoader.Load("uid://5t83l7c7f3g6"); + private static readonly Texture2D _gitignoreFileIcon = ResourceLoader.Load("uid://qhtsnkua67ds"); + private static readonly Texture2D _imageFileIcon = ResourceLoader.Load("uid://73nvtvnx1tie"); + private static readonly Texture2D _fSharpIcon = ResourceLoader.Load("uid://xa0ntrn7vvbr"); + private static readonly Texture2D _xmlIcon = ResourceLoader.Load("uid://p5jl3uv51irw"); + private static readonly Texture2D _csprojIcon = ResourceLoader.Load("uid://cqt30ma6xgder"); + + private static readonly Texture2D _propsFileOverlayIcon = ResourceLoader.Load("uid://fa7tdmldi206"); + private static readonly Texture2D _configFileOverlayIcon = ResourceLoader.Load("uid://brsdisqgeah5n"); + private static readonly Texture2D _targetsFileOverlayIcon = ResourceLoader.Load("uid://xy5ad1lc24lv"); + private static readonly Texture2D _unknownFileOverlayIcon = ResourceLoader.Load("uid://7rqmyeiy4y82"); + + public static (Texture2D Icon, Texture2D? OverlayIcon) GetIconForFileExtension(string fileExtension) + { + var texture = fileExtension switch + { + ".cs" => _csIcon, + ".razor" or ".cshtml" => _razorIcon, + ".json" => _jsonIcon, + ".js" => _jsIcon, + ".html" or ".htm" => _htmlIcon, + ".css" => _cssIcon, + ".txt" => _txtIcon, + ".props" or ".config" or ".targets" or ".resx" => _genericFileIcon, + ".md" => _mdFileIcon, + ".editorconfig" => _editorConfigFileIcon, + ".gitignore" => _gitignoreFileIcon, + ".png" or ".jpg" or ".jpeg" or ".gif" or ".bmp" or ".svg" or ".ico" or ".avif" or ".webp" => _imageFileIcon, + ".fs" => _fSharpIcon, + ".xml" or ".nuspec" => _xmlIcon, + ".csproj" => _csprojIcon, + _ => _genericFileIcon + }; + var overlayTexture = fileExtension switch + { + ".props" => _propsFileOverlayIcon, + ".config" or ".resx" => _configFileOverlayIcon, + ".targets" => _targetsFileOverlayIcon, + _ => null + }; + if (overlayTexture is null && texture == _genericFileIcon) + { + overlayTexture = _unknownFileOverlayIcon; + } + + return (texture, overlayTexture); + } +} \ No newline at end of file diff --git a/src/SharpIDE.Godot/Features/SolutionExplorer/SolutionExplorerPanel.FileIcons.cs b/src/SharpIDE.Godot/Features/SolutionExplorer/SolutionExplorerPanel.FileIcons.cs index e93ffc3..98166e7 100644 --- a/src/SharpIDE.Godot/Features/SolutionExplorer/SolutionExplorerPanel.FileIcons.cs +++ b/src/SharpIDE.Godot/Features/SolutionExplorer/SolutionExplorerPanel.FileIcons.cs @@ -1,63 +1,23 @@ using Godot; +using SharpIDE.Application.Features.SolutionDiscovery; namespace SharpIDE.Godot.Features.SolutionExplorer; public partial class SolutionExplorerPanel { - private readonly Texture2D _csIcon = ResourceLoader.Load("uid://do0edciarrnp0"); - private readonly Texture2D _razorIcon = ResourceLoader.Load("uid://cff7jlvj2tlg2"); - private readonly Texture2D _jsonIcon = ResourceLoader.Load("uid://csrwpjk77r731"); - private readonly Texture2D _jsIcon = ResourceLoader.Load("uid://cpdobpjrm2suc"); - private readonly Texture2D _htmlIcon = ResourceLoader.Load("uid://q0cktiwdkt1e"); - private readonly Texture2D _cssIcon = ResourceLoader.Load("uid://b6m4rm5u8hd1c"); - private readonly Texture2D _txtIcon = ResourceLoader.Load("uid://b6bpjhs2o1j2l"); - private readonly Texture2D _genericFileIcon = ResourceLoader.Load("uid://bile1h6sq0l08"); - private readonly Texture2D _mdFileIcon = ResourceLoader.Load("uid://8i2y6xjdjno3"); - private readonly Texture2D _editorConfigFileIcon = ResourceLoader.Load("uid://5t83l7c7f3g6"); - private readonly Texture2D _gitignoreFileIcon = ResourceLoader.Load("uid://qhtsnkua67ds"); - private readonly Texture2D _imageFileIcon = ResourceLoader.Load("uid://73nvtvnx1tie"); - private readonly Texture2D _fSharpIcon = ResourceLoader.Load("uid://xa0ntrn7vvbr"); - private readonly Texture2D _xmlIcon = ResourceLoader.Load("uid://p5jl3uv51irw"); - private readonly Texture2D _csprojIcon = ResourceLoader.Load("uid://cqt30ma6xgder"); - private readonly Texture2D _propsFileOverlayIcon = ResourceLoader.Load("uid://fa7tdmldi206"); - private readonly Texture2D _configFileOverlayIcon = ResourceLoader.Load("uid://brsdisqgeah5n"); - private readonly Texture2D _targetsFileOverlayIcon = ResourceLoader.Load("uid://xy5ad1lc24lv"); - private readonly Texture2D _unknownFileOverlayIcon = ResourceLoader.Load("uid://7rqmyeiy4y82"); +} - private (Texture2D Icon, Texture2D? OverlayIcon) GetIconForFileExtension(string fileExtension) +public static class SolutionExplorerExtensions +{ + extension(TreeItem fileItem) { - var texture = fileExtension switch + public void SetIconsForFileExtension(SharpIdeFile file) { - ".cs" => _csIcon, - ".razor" or ".cshtml" => _razorIcon, - ".json" => _jsonIcon, - ".js" => _jsIcon, - ".html" or ".htm" => _htmlIcon, - ".css" => _cssIcon, - ".txt" => _txtIcon, - ".props" or ".config" or ".targets" or ".resx" => _genericFileIcon, - ".md" => _mdFileIcon, - ".editorconfig" => _editorConfigFileIcon, - ".gitignore" => _gitignoreFileIcon, - ".png" or ".jpg" or ".jpeg" or ".gif" or ".bmp" or ".svg" or ".ico" or ".avif" or ".webp" => _imageFileIcon, - ".fs" => _fSharpIcon, - ".xml" or ".nuspec" => _xmlIcon, - ".csproj" => _csprojIcon, - _ => _genericFileIcon - }; - var overlayTexture = fileExtension switch - { - ".props" => _propsFileOverlayIcon, - ".config" or ".resx" => _configFileOverlayIcon, - ".targets" => _targetsFileOverlayIcon, - _ => null - }; - if (overlayTexture is null && texture == _genericFileIcon) - { - overlayTexture = _unknownFileOverlayIcon; + var (icon, overlayIcon) = FileIconHelper.GetIconForFileExtension(file.Extension); + fileItem.SetIcon(0, icon); + // Set even if null, to support renaming files + fileItem.SetIconOverlay(0, overlayIcon); } - - return (texture, overlayTexture); } } \ No newline at end of file diff --git a/src/SharpIDE.Godot/Features/SolutionExplorer/SolutionExplorerPanel.cs b/src/SharpIDE.Godot/Features/SolutionExplorer/SolutionExplorerPanel.cs index a9aaf5a..e0db4f3 100644 --- a/src/SharpIDE.Godot/Features/SolutionExplorer/SolutionExplorerPanel.cs +++ b/src/SharpIDE.Godot/Features/SolutionExplorer/SolutionExplorerPanel.cs @@ -299,16 +299,18 @@ public partial class SolutionExplorerPanel : MarginContainer } var fileItem = tree.CreateItem(parent, newStartingIndex); fileItem.SetText(0, sharpIdeFile.Name); - var (icon, overlayIcon) = GetIconForFileExtension(sharpIdeFile.Extension); - fileItem.SetIcon(0, icon); - if (overlayIcon is not null) fileItem.SetIconOverlay(0, overlayIcon); + fileItem.SetIconsForFileExtension(sharpIdeFile); fileItem.SetCustomColor(0, GetColorForGitStatus(sharpIdeFile.GitStatus)); fileItem.SetMetadata(0, new RefCountedContainer(sharpIdeFile)); Observable.EveryValueChanged(sharpIdeFile, file => file.Name) .Skip(1).SubscribeAwait(async (s, ct) => { - await this.InvokeAsync(() => fileItem.SetText(0, s)); + await this.InvokeAsync(() => + { + fileItem.SetText(0, s); + fileItem.SetIconsForFileExtension(sharpIdeFile); + }); }).AddTo(this); return fileItem;