From 8175405b50b6df259313c944a3f55bafad399043 Mon Sep 17 00:00:00 2001 From: Matt Parker <61717342+MattParkerDev@users.noreply.github.com> Date: Wed, 3 Dec 2025 19:06:14 +1000 Subject: [PATCH] Add Git Gutter WIP --- .../Features/CodeEditor/SharpIdeCodeEdit.cs | 1 + .../CodeEditor/SharpIdeCodeEdit_GitGutter.cs | 42 +++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit_GitGutter.cs diff --git a/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs b/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs index 785738c..767590e 100644 --- a/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs +++ b/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs @@ -94,6 +94,7 @@ public partial class SharpIdeCodeEdit : CodeEdit LinesEditedFrom += OnLinesEditedFrom; GlobalEvents.Instance.SolutionAltered.Subscribe(OnSolutionAltered); SetCodeRegionTags("#region", "#endregion"); + //AddGitGutter(); } private readonly CancellationSeries _solutionAlteredCancellationTokenSeries = new(); diff --git a/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit_GitGutter.cs b/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit_GitGutter.cs new file mode 100644 index 0000000..87b269b --- /dev/null +++ b/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit_GitGutter.cs @@ -0,0 +1,42 @@ +using Godot; +using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence; +using SharpIDE.Godot.Features.Git; + +namespace SharpIDE.Godot.Features.CodeEditor; + +public partial class SharpIdeCodeEdit +{ + private int _gitGutterId; + + private void AddGitGutter() + { + AddGutter(-1); + var gutterId = GetGutterCount() - 1; + SetGutterType(gutterId, GutterType.Custom); + SetGutterCustomDraw(gutterId, new Callable(this, MethodName.GitGutterCustomDraw)); + SetGutterDraw(gutterId, true); + SetGutterWidth(gutterId, 9); + SetGutterClickable(gutterId, true); + GutterClicked += OnGutterClicked; + _gitGutterId = gutterId; + } + + private void OnGutterClicked(long line, long gutterId) + { + if (gutterId != _gitGutterId) return; + GD.Print($"Git gutter clicked at line {line}"); + } + + private void GitGutterCustomDraw(int lineIndex, int gutterIndex, Rect2 rect) + { + var gitChangeType = GitLineStatus.Added; + var color = GitColours.GetColorForGitLineStatus(gitChangeType); + + var mousePos = GetLocalMousePosition(); + var isHovered = rect.HasPoint(mousePos); + var width = isHovered ? 9 : 6; + var drawRect = new Rect2(new Vector2(rect.End.X - width, rect.Position.Y), new Vector2(width, rect.Size.Y) + ); + DrawRect(drawRect, color); + } +} \ No newline at end of file