From e8f4303b0708093c3fd240f1e7a16ad2e5ee9505 Mon Sep 17 00:00:00 2001 From: Matt Parker <61717342+MattParkerDev@users.noreply.github.com> Date: Wed, 3 Dec 2025 18:44:16 +1000 Subject: [PATCH] refactor git colours --- .../SolutionDiscovery/SharpIdeFile.cs | 2 +- .../VsPersistence/VsPersistenceMapper.cs | 10 +++--- src/SharpIDE.Godot/Features/Git/GitColours.cs | 35 +++++++++++++++++++ .../Features/Git/GitColours.cs.uid | 1 + .../SolutionExplorer/SolutionExplorerPanel.cs | 15 ++------ 5 files changed, 44 insertions(+), 19 deletions(-) create mode 100644 src/SharpIDE.Godot/Features/Git/GitColours.cs create mode 100644 src/SharpIDE.Godot/Features/Git/GitColours.cs.uid diff --git a/src/SharpIDE.Application/Features/SolutionDiscovery/SharpIdeFile.cs b/src/SharpIDE.Application/Features/SolutionDiscovery/SharpIdeFile.cs index 60ad24b..625ebb1 100644 --- a/src/SharpIDE.Application/Features/SolutionDiscovery/SharpIdeFile.cs +++ b/src/SharpIDE.Application/Features/SolutionDiscovery/SharpIdeFile.cs @@ -18,7 +18,7 @@ public class SharpIdeFile : ISharpIdeNode, IChildSharpIdeNode, IFileOrFolder public bool IsCshtmlFile => Path.EndsWith(".cshtml", StringComparison.OrdinalIgnoreCase); public bool IsCsharpFile => Path.EndsWith(".cs", StringComparison.OrdinalIgnoreCase); public bool IsRoslynWorkspaceFile => IsCsharpFile || IsRazorFile || IsCshtmlFile; - public GitStatus GitStatus { get; set; } = GitStatus.Unaltered; + public GitFileStatus GitStatus { get; set; } = GitFileStatus.Unaltered; public required ReactiveProperty IsDirty { get; init; } public required bool SuppressDiskChangeEvents { get; set; } // probably has concurrency issues public required DateTimeOffset? LastIdeWriteTime { get; set; } diff --git a/src/SharpIDE.Application/Features/SolutionDiscovery/VsPersistence/VsPersistenceMapper.cs b/src/SharpIDE.Application/Features/SolutionDiscovery/VsPersistence/VsPersistenceMapper.cs index c5ddb6c..c55b2f0 100644 --- a/src/SharpIDE.Application/Features/SolutionDiscovery/VsPersistence/VsPersistenceMapper.cs +++ b/src/SharpIDE.Application/Features/SolutionDiscovery/VsPersistence/VsPersistenceMapper.cs @@ -27,10 +27,10 @@ public static class VsPersistenceMapper var mappedGitStatus = entry.State switch { - FileStatus.NewInIndex | FileStatus.ModifiedInWorkdir => GitStatus.Added, // I've seen these appear together - FileStatus.NewInIndex or FileStatus.NewInWorkdir => GitStatus.Added, - FileStatus.ModifiedInIndex or FileStatus.ModifiedInWorkdir => GitStatus.Modified, - _ => GitStatus.Unaltered // TODO: handle other kinds? + FileStatus.NewInIndex | FileStatus.ModifiedInWorkdir => GitFileStatus.Added, // I've seen these appear together + FileStatus.NewInIndex or FileStatus.NewInWorkdir => GitFileStatus.Added, + FileStatus.ModifiedInIndex or FileStatus.ModifiedInWorkdir => GitFileStatus.Modified, + _ => GitFileStatus.Unaltered // TODO: handle other kinds? }; fileInSolution.GitStatus = mappedGitStatus; @@ -40,7 +40,7 @@ public static class VsPersistenceMapper } } -public enum GitStatus +public enum GitFileStatus { Unaltered, Modified, diff --git a/src/SharpIDE.Godot/Features/Git/GitColours.cs b/src/SharpIDE.Godot/Features/Git/GitColours.cs new file mode 100644 index 0000000..5c0adfe --- /dev/null +++ b/src/SharpIDE.Godot/Features/Git/GitColours.cs @@ -0,0 +1,35 @@ +using Godot; +using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence; + +namespace SharpIDE.Godot.Features.Git; + +public static class GitColours +{ + private const string NewFileColourHexCode = "50964c"; + private const string EditedFileColourHexCode = "6496ba"; + private const string UnalteredFileColourHexCode = "d4d4d4"; + + public static readonly Color GitNewFileColour = new Color(NewFileColourHexCode); + public static readonly Color GitEditedFileColour = new Color(EditedFileColourHexCode); + public static readonly Color GitUnalteredFileColour = new Color(UnalteredFileColourHexCode); + + public static readonly Color GitNewFileTransparentColour = new Color(NewFileColourHexCode, 0.4f); + public static readonly Color GitEditedFileTransparentColour = new Color(EditedFileColourHexCode, 0.4f); + public static readonly Color GitUnalteredFileTransparentColour = new Color(UnalteredFileColourHexCode, 0.4f); + + public static Color GetColorForGitFileStatus(GitFileStatus fileStatus) => fileStatus switch + { + GitFileStatus.Added => GitNewFileColour, + GitFileStatus.Modified => GitEditedFileColour, + GitFileStatus.Unaltered => GitUnalteredFileColour, + _ => GitUnalteredFileColour + }; + + public static Color GetColorForGitLineStatus(GitFileStatus fileStatus) => fileStatus switch + { + GitFileStatus.Added => GitNewFileTransparentColour, + GitFileStatus.Modified => GitEditedFileTransparentColour, + GitFileStatus.Unaltered => GitUnalteredFileTransparentColour, + _ => GitUnalteredFileTransparentColour + }; +} \ No newline at end of file diff --git a/src/SharpIDE.Godot/Features/Git/GitColours.cs.uid b/src/SharpIDE.Godot/Features/Git/GitColours.cs.uid new file mode 100644 index 0000000..b4af2cd --- /dev/null +++ b/src/SharpIDE.Godot/Features/Git/GitColours.cs.uid @@ -0,0 +1 @@ +uid://ccdmpjeuj1lmy diff --git a/src/SharpIDE.Godot/Features/SolutionExplorer/SolutionExplorerPanel.cs b/src/SharpIDE.Godot/Features/SolutionExplorer/SolutionExplorerPanel.cs index e0db4f3..db78da9 100644 --- a/src/SharpIDE.Godot/Features/SolutionExplorer/SolutionExplorerPanel.cs +++ b/src/SharpIDE.Godot/Features/SolutionExplorer/SolutionExplorerPanel.cs @@ -8,6 +8,7 @@ using SharpIDE.Application.Features.NavigationHistory; using SharpIDE.Application.Features.SolutionDiscovery; using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence; using SharpIDE.Godot.Features.Common; +using SharpIDE.Godot.Features.Git; using SharpIDE.Godot.Features.Problems; namespace SharpIDE.Godot.Features.SolutionExplorer; @@ -24,10 +25,6 @@ public partial class SolutionExplorerPanel : MarginContainer public Texture2D CsprojIcon { get; set; } = null!; [Export] public Texture2D SlnIcon { get; set; } = null!; - - private readonly Color _gitNewFileColour = new Color("50964c"); - private readonly Color _gitEditedFileColour = new Color("6496ba"); - private readonly Color _gitUnalteredFileColour = new Color("d4d4d4"); public SharpIdeSolutionModel SolutionModel { get; set; } = null!; private Tree _tree = null!; @@ -300,7 +297,7 @@ public partial class SolutionExplorerPanel : MarginContainer var fileItem = tree.CreateItem(parent, newStartingIndex); fileItem.SetText(0, sharpIdeFile.Name); fileItem.SetIconsForFileExtension(sharpIdeFile); - fileItem.SetCustomColor(0, GetColorForGitStatus(sharpIdeFile.GitStatus)); + fileItem.SetCustomColor(0, GitColours.GetColorForGitFileStatus(sharpIdeFile.GitStatus)); fileItem.SetMetadata(0, new RefCountedContainer(sharpIdeFile)); Observable.EveryValueChanged(sharpIdeFile, file => file.Name) @@ -339,12 +336,4 @@ public partial class SolutionExplorerPanel : MarginContainer { await this.InvokeAsync(() => item?.Free()); } - - private Color GetColorForGitStatus(GitStatus status) => status switch - { - GitStatus.Added => _gitNewFileColour, - GitStatus.Modified => _gitEditedFileColour, - GitStatus.Unaltered => _gitUnalteredFileColour, - _ => _gitUnalteredFileColour - }; }