search set line position of selected file

This commit is contained in:
Matt Parker
2025-09-25 01:01:45 +10:00
parent f8cd8d18d5
commit a5e6ece9f3
10 changed files with 49 additions and 16 deletions

View File

@@ -1,5 +1,6 @@
using Ardalis.GuardClauses;
using Godot;
using SharpIDE.Application.Features.Analysis;
using SharpIDE.Application.Features.Debugging;
using SharpIDE.Application.Features.Events;
using SharpIDE.Application.Features.SolutionDiscovery;
@@ -48,15 +49,18 @@ public partial class CodeEditorPanel : MarginContainer
tab.QueueFree();
}
public async Task SetSharpIdeFile(SharpIdeFile file)
public async Task SetSharpIdeFile(SharpIdeFile file, SharpIdeFileLinePosition? fileLinePosition)
{
await Task.CompletedTask.ConfigureAwait(ConfigureAwaitOptions.ForceYielding);
var existingTab = await this.InvokeAsync(() => _tabContainer.GetChildren().OfType<SharpIdeCodeEdit>().FirstOrDefault(t => t.SharpIdeFile == file));
if (existingTab is not null)
{
var existingTabIndex = existingTab.GetIndex();
if (existingTabIndex == _tabContainer.CurrentTab) return;
await this.InvokeAsync(() => _tabContainer.CurrentTab = existingTabIndex);
await this.InvokeAsync(() =>
{
_tabContainer.CurrentTab = existingTabIndex;
if (fileLinePosition is not null) existingTab.SetFileLinePosition(fileLinePosition.Value);
});
return;
}
var newTab = _sharpIdeCodeEditScene.Instantiate<SharpIdeCodeEdit>();
@@ -71,6 +75,7 @@ public partial class CodeEditorPanel : MarginContainer
_tabContainer.CurrentTab = newTabIndex;
});
await newTab.SetSharpIdeFile(file);
if (fileLinePosition is not null) await this.InvokeAsync(() => newTab.SetFileLinePosition(fileLinePosition.Value));
}
private async Task OnDebuggerExecutionStopped(ExecutionStopInfo executionStopInfo)

View File

@@ -140,6 +140,16 @@ public partial class SharpIdeCodeEdit : CodeEdit
}).CallDeferred();
});
}
public void SetFileLinePosition(SharpIdeFileLinePosition fileLinePosition)
{
var line = fileLinePosition.Line - 1;
var column = fileLinePosition.Column - 1;
SetCaretLine(line);
SetCaretColumn(column);
CenterViewportToCaret();
GrabFocus();
}
// TODO: Ensure not running on UI thread
public async Task SetSharpIdeFile(SharpIdeFile file)

View File

@@ -1,4 +1,5 @@
using Godot;
using SharpIDE.Application.Features.Analysis;
using SharpIDE.Application.Features.Search;
namespace SharpIDE.Godot.Features.Search;
@@ -25,7 +26,8 @@ public partial class SearchResultComponent : MarginContainer
private void OnButtonPressed()
{
GodotGlobalEvents.InvokeFileExternallySelected(Result.File);
var fileLinePosition = new SharpIdeFileLinePosition { Line = Result.Line, Column = Result.StartColumn };
GodotGlobalEvents.InvokeFileExternallySelected(Result.File, fileLinePosition);
ParentSearchWindow.Hide();
}
@@ -34,6 +36,6 @@ public partial class SearchResultComponent : MarginContainer
if (result is null) return;
_matchingLineLabel.Text = result.LineText;
_fileNameLabel.Text = result.File.Name;
_lineNumberLabel.Text = result.LineNumber.ToString();
_lineNumberLabel.Text = result.Line.ToString();
}
}

View File

@@ -1,5 +1,6 @@
using Ardalis.GuardClauses;
using Godot;
using SharpIDE.Application.Features.Analysis;
using SharpIDE.Application.Features.SolutionDiscovery;
using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence;
@@ -38,10 +39,10 @@ public partial class SolutionExplorerPanel : MarginContainer
GodotGlobalEvents.InvokeFileSelected(sharpIdeFile);
}
private async Task OnFileExternallySelected(SharpIdeFile file)
private async Task OnFileExternallySelected(SharpIdeFile file, SharpIdeFileLinePosition? fileLinePosition)
{
await Task.CompletedTask.ConfigureAwait(ConfigureAwaitOptions.ForceYielding);
var task = GodotGlobalEvents.InvokeFileSelectedAndWait(file);
var task = GodotGlobalEvents.InvokeFileSelectedAndWait(file, fileLinePosition);
var item = FindItemRecursive(_tree.GetRoot(), file);
if (item is not null)
{