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 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<ProjectPackageReference> projectPackageReferences)
public async Task SetProjects(HashSet<SharpIdeProjectModel> projects)
{
var scenes = projectPackageReferences.Select(s =>
var scenes = projects.Select(s =>
{
var scene = _packageDetailsProjectEntryScene.Instantiate<PackageDetailsProjectEntry>();
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<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)
{

View File

@@ -29,6 +29,7 @@ public partial class NugetPanel : Control
// we use this to access the project for the dropdown
private List<SharpIdeProjectModel?> _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();

View File

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