diff --git a/src/SharpIDE.Godot/Features/Nuget/NugetPackageDetails.cs b/src/SharpIDE.Godot/Features/Nuget/NugetPackageDetails.cs index 66178f3..3428b7b 100644 --- a/src/SharpIDE.Godot/Features/Nuget/NugetPackageDetails.cs +++ b/src/SharpIDE.Godot/Features/Nuget/NugetPackageDetails.cs @@ -44,7 +44,7 @@ public partial class NugetPackageDetails : VBoxContainer }); var (iconBytes, iconFormat) = await iconTask; var imageTexture = ImageTextureHelper.GetImageTextureFromBytes(iconBytes, iconFormat) ?? _defaultIconTextureRect; - await SetProjects(package.InstalledNugetPackageInfo!.ProjectPackageReferences); + await SetProjectPackageReferences(package.InstalledNugetPackageInfo?.ProjectPackageReferences ?? []); await this.InvokeAsync(() => { _packageIconTextureRect.Texture = imageTexture; @@ -59,15 +59,13 @@ public partial class NugetPackageDetails : VBoxContainer OnNugetSourceSelected(0); }); } - - public async Task SetProjects(List projectPackageReferences) + + public async Task SetProjects(HashSet projects) { - var scenes = projectPackageReferences.Select(s => + var scenes = projects.Select(s => { var scene = _packageDetailsProjectEntryScene.Instantiate(); - scene.ProjectModel = s.Project; - scene.InstalledVersion = s.InstalledVersion; - scene.IsTransitive = s.IsTransitive; + scene.ProjectModel = s; return scene; }).ToList(); await this.InvokeAsync(() => @@ -79,6 +77,21 @@ public partial class NugetPackageDetails : VBoxContainer } }); } + + public async Task SetProjectPackageReferences(List projectPackageReferences) + { + await this.InvokeAsync(() => + { + var scenes = _projectsVBoxContainer.GetChildren().OfType().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) { diff --git a/src/SharpIDE.Godot/Features/Nuget/NugetPanel.cs b/src/SharpIDE.Godot/Features/Nuget/NugetPanel.cs index 65d1780..5d75387 100644 --- a/src/SharpIDE.Godot/Features/Nuget/NugetPanel.cs +++ b/src/SharpIDE.Godot/Features/Nuget/NugetPanel.cs @@ -29,6 +29,7 @@ public partial class NugetPanel : Control // we use this to access the project for the dropdown private List _projects = null!; + private IdePackageResult? _selectedPackageResult = null!; 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"); _ = Task.GodotRun(() => SetSolutionOrProjectNameLabels(slnOrProject)); - //_ = Task.GodotRun(() => SetDetailsProjects(slnOrProject)); _ = Task.GodotRun(() => PopulateInstalledPackages(slnOrProject)); _ = Task.GodotRun(PopulateSearchResults); }); @@ -80,6 +80,7 @@ public partial class NugetPanel : Control private async Task OnPackageSelected(IdePackageResult packageResult) { + _selectedPackageResult = packageResult; await _nugetPackageDetails.SetPackage(packageResult); } @@ -87,11 +88,11 @@ public partial class NugetPanel : Control { var projects = slnOrProject switch { - SharpIdeSolutionModel solutionModel => _projects.Skip(1).ToHashSet(), + SharpIdeSolutionModel => _projects.Skip(1).ToHashSet(), SharpIdeProjectModel projectModel => [projectModel], _ => throw new InvalidOperationException("Unknown solution or project type") }; - //await _nugetPackageDetails.SetProjects(projects); + await _nugetPackageDetails.SetProjects(projects!); } private async Task SetSolutionOrProjectNameLabels(ISolutionOrProject slnOrProject) @@ -132,6 +133,7 @@ public partial class NugetPanel : Control private async Task PopulateInstalledPackages(ISolutionOrProject slnOrProject) { + var setDetailsProjectsTask = SetDetailsProjects(slnOrProject); var msbuildEvalTask = slnOrProject switch { SharpIdeSolutionModel solutionModel => (Task)Task.WhenAll(solutionModel.AllProjects.Select(s => s.MsBuildEvaluationProjectTask)), @@ -156,6 +158,16 @@ public partial class NugetPanel : Control }).ToList(); var transitiveScenes = scenes.Where(s => s.PackageResult.InstalledNugetPackageInfo!.IsPrimarilyTransitive).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(() => { _installedPackagesVboxContainer.QueueFreeChildren(); diff --git a/src/SharpIDE.Godot/Features/Nuget/PackageDetailsProjectEntry.cs b/src/SharpIDE.Godot/Features/Nuget/PackageDetailsProjectEntry.cs index deed7aa..2fb43d4 100644 --- a/src/SharpIDE.Godot/Features/Nuget/PackageDetailsProjectEntry.cs +++ b/src/SharpIDE.Godot/Features/Nuget/PackageDetailsProjectEntry.cs @@ -18,8 +18,8 @@ public partial class PackageDetailsProjectEntry : MarginContainer _installedVersionLabel = GetNode