keep selected package across sln/project changes

This commit is contained in:
Matt Parker
2025-11-03 20:15:28 +10:00
parent 785080389e
commit 28c31efd1b
3 changed files with 37 additions and 12 deletions

View File

@@ -44,7 +44,7 @@ public partial class NugetPackageDetails : VBoxContainer
}); });
var (iconBytes, iconFormat) = await iconTask; var (iconBytes, iconFormat) = await iconTask;
var imageTexture = ImageTextureHelper.GetImageTextureFromBytes(iconBytes, iconFormat) ?? _defaultIconTextureRect; var imageTexture = ImageTextureHelper.GetImageTextureFromBytes(iconBytes, iconFormat) ?? _defaultIconTextureRect;
await SetProjects(package.InstalledNugetPackageInfo!.ProjectPackageReferences); await SetProjectPackageReferences(package.InstalledNugetPackageInfo?.ProjectPackageReferences ?? []);
await this.InvokeAsync(() => await this.InvokeAsync(() =>
{ {
_packageIconTextureRect.Texture = imageTexture; _packageIconTextureRect.Texture = imageTexture;
@@ -59,15 +59,13 @@ public partial class NugetPackageDetails : VBoxContainer
OnNugetSourceSelected(0); OnNugetSourceSelected(0);
}); });
} }
public async Task SetProjects(List<ProjectPackageReference> projectPackageReferences) public async Task SetProjects(HashSet<SharpIdeProjectModel> projects)
{ {
var scenes = projectPackageReferences.Select(s => var scenes = projects.Select(s =>
{ {
var scene = _packageDetailsProjectEntryScene.Instantiate<PackageDetailsProjectEntry>(); var scene = _packageDetailsProjectEntryScene.Instantiate<PackageDetailsProjectEntry>();
scene.ProjectModel = s.Project; scene.ProjectModel = s;
scene.InstalledVersion = s.InstalledVersion;
scene.IsTransitive = s.IsTransitive;
return scene; return scene;
}).ToList(); }).ToList();
await this.InvokeAsync(() => await this.InvokeAsync(() =>
@@ -79,6 +77,21 @@ public partial class NugetPackageDetails : VBoxContainer
} }
}); });
} }
public async Task SetProjectPackageReferences(List<ProjectPackageReference> projectPackageReferences)
{
await this.InvokeAsync(() =>
{
var scenes = _projectsVBoxContainer.GetChildren().OfType<PackageDetailsProjectEntry>().ToList();
foreach (var projectPackageReference in projectPackageReferences)
{
var scene = scenes.Single(s => s.ProjectModel == projectPackageReference.Project);
scene.InstalledVersion = projectPackageReference.InstalledVersion;
scene.IsTransitive = projectPackageReference.IsTransitive;
scene.SetValues();
}
});
}
private async void OnNugetSourceSelected(long sourceIndex) private async void OnNugetSourceSelected(long sourceIndex)
{ {

View File

@@ -29,6 +29,7 @@ public partial class NugetPanel : Control
// we use this to access the project for the dropdown // we use this to access the project for the dropdown
private List<SharpIdeProjectModel?> _projects = null!; private List<SharpIdeProjectModel?> _projects = null!;
private IdePackageResult? _selectedPackageResult = null!;
public override void _Ready() public override void _Ready()
{ {
@@ -72,7 +73,6 @@ public partial class NugetPanel : Control
{ {
if (_solution is null) throw new InvalidOperationException("Solution is null but should not be"); if (_solution is null) throw new InvalidOperationException("Solution is null but should not be");
_ = Task.GodotRun(() => SetSolutionOrProjectNameLabels(slnOrProject)); _ = Task.GodotRun(() => SetSolutionOrProjectNameLabels(slnOrProject));
//_ = Task.GodotRun(() => SetDetailsProjects(slnOrProject));
_ = Task.GodotRun(() => PopulateInstalledPackages(slnOrProject)); _ = Task.GodotRun(() => PopulateInstalledPackages(slnOrProject));
_ = Task.GodotRun(PopulateSearchResults); _ = Task.GodotRun(PopulateSearchResults);
}); });
@@ -80,6 +80,7 @@ public partial class NugetPanel : Control
private async Task OnPackageSelected(IdePackageResult packageResult) private async Task OnPackageSelected(IdePackageResult packageResult)
{ {
_selectedPackageResult = packageResult;
await _nugetPackageDetails.SetPackage(packageResult); await _nugetPackageDetails.SetPackage(packageResult);
} }
@@ -87,11 +88,11 @@ public partial class NugetPanel : Control
{ {
var projects = slnOrProject switch var projects = slnOrProject switch
{ {
SharpIdeSolutionModel solutionModel => _projects.Skip(1).ToHashSet(), SharpIdeSolutionModel => _projects.Skip(1).ToHashSet(),
SharpIdeProjectModel projectModel => [projectModel], SharpIdeProjectModel projectModel => [projectModel],
_ => throw new InvalidOperationException("Unknown solution or project type") _ => throw new InvalidOperationException("Unknown solution or project type")
}; };
//await _nugetPackageDetails.SetProjects(projects); await _nugetPackageDetails.SetProjects(projects!);
} }
private async Task SetSolutionOrProjectNameLabels(ISolutionOrProject slnOrProject) private async Task SetSolutionOrProjectNameLabels(ISolutionOrProject slnOrProject)
@@ -132,6 +133,7 @@ public partial class NugetPanel : Control
private async Task PopulateInstalledPackages(ISolutionOrProject slnOrProject) private async Task PopulateInstalledPackages(ISolutionOrProject slnOrProject)
{ {
var setDetailsProjectsTask = SetDetailsProjects(slnOrProject);
var msbuildEvalTask = slnOrProject switch var msbuildEvalTask = slnOrProject switch
{ {
SharpIdeSolutionModel solutionModel => (Task)Task.WhenAll(solutionModel.AllProjects.Select(s => s.MsBuildEvaluationProjectTask)), SharpIdeSolutionModel solutionModel => (Task)Task.WhenAll(solutionModel.AllProjects.Select(s => s.MsBuildEvaluationProjectTask)),
@@ -156,6 +158,16 @@ public partial class NugetPanel : Control
}).ToList(); }).ToList();
var transitiveScenes = scenes.Where(s => s.PackageResult.InstalledNugetPackageInfo!.IsPrimarilyTransitive).ToList(); var transitiveScenes = scenes.Where(s => s.PackageResult.InstalledNugetPackageInfo!.IsPrimarilyTransitive).ToList();
var directScenes = scenes.Except(transitiveScenes).ToList(); var directScenes = scenes.Except(transitiveScenes).ToList();
await setDetailsProjectsTask;
if (_selectedPackageResult is not null)
{
var updatedPackageResult = idePackageResult.SingleOrDefault(p => p.PackageId.Equals(_selectedPackageResult.PackageId, StringComparison.OrdinalIgnoreCase));
if (updatedPackageResult is not null)
{
_selectedPackageResult = updatedPackageResult;
await OnPackageSelected(_selectedPackageResult);
}
}
await this.InvokeAsync(() => await this.InvokeAsync(() =>
{ {
_installedPackagesVboxContainer.QueueFreeChildren(); _installedPackagesVboxContainer.QueueFreeChildren();

View File

@@ -18,8 +18,8 @@ public partial class PackageDetailsProjectEntry : MarginContainer
_installedVersionLabel = GetNode<Label>("%InstalledVersionLabel"); _installedVersionLabel = GetNode<Label>("%InstalledVersionLabel");
SetValues(); SetValues();
} }
private void SetValues() public void SetValues()
{ {
if (ProjectModel == null) return; if (ProjectModel == null) return;
_projectNameLabel.Text = ProjectModel.Name; _projectNameLabel.Text = ProjectModel.Name;