handle generic treeitem metadata better

This commit is contained in:
Matt Parker
2025-10-10 18:34:31 +10:00
parent 5f2680f33e
commit f2fa4076e2
2 changed files with 21 additions and 3 deletions

View File

@@ -33,7 +33,7 @@ public partial class SolutionExplorerPanel : MarginContainer
{ {
var selected = _tree.GetSelected(); var selected = _tree.GetSelected();
if (selected is null) return; if (selected is null) return;
var sharpIdeFileContainer = selected.GetMetadata(0).As<RefCountedContainer<SharpIdeFile>?>(); var sharpIdeFileContainer = selected.GetTypedMetadata<RefCountedContainer<SharpIdeFile>?>(0);
if (sharpIdeFileContainer is null) return; if (sharpIdeFileContainer is null) return;
var sharpIdeFile = sharpIdeFileContainer.Item; var sharpIdeFile = sharpIdeFileContainer.Item;
Guard.Against.Null(sharpIdeFile, nameof(sharpIdeFile)); Guard.Against.Null(sharpIdeFile, nameof(sharpIdeFile));
@@ -97,8 +97,7 @@ public partial class SolutionExplorerPanel : MarginContainer
private static TreeItem? FindItemRecursive(TreeItem item, SharpIdeFile file) private static TreeItem? FindItemRecursive(TreeItem item, SharpIdeFile file)
{ {
var metadata = item.GetMetadata(0); if (item.GetTypedMetadata<RefCountedContainer<SharpIdeFile>?>(0)?.Item == file)
if (metadata.As<RefCountedContainer<SharpIdeFile>?>()?.Item == file)
return item; return item;
var child = item.GetFirstChild(); var child = item.GetFirstChild();
@@ -142,6 +141,8 @@ public partial class SolutionExplorerPanel : MarginContainer
var folderItem = _tree.CreateItem(parent); var folderItem = _tree.CreateItem(parent);
folderItem.SetText(0, folder.Name); folderItem.SetText(0, folder.Name);
folderItem.SetIcon(0, SlnFolderIcon); folderItem.SetIcon(0, SlnFolderIcon);
var container = new RefCountedContainer<SharpIdeSolutionFolder>(folder);
folderItem.SetMetadata(0, container);
foreach (var project in folder.Projects) foreach (var project in folder.Projects)
{ {
@@ -164,6 +165,8 @@ public partial class SolutionExplorerPanel : MarginContainer
var projectItem = _tree.CreateItem(parent); var projectItem = _tree.CreateItem(parent);
projectItem.SetText(0, project.Name); projectItem.SetText(0, project.Name);
projectItem.SetIcon(0, CsprojIcon); projectItem.SetIcon(0, CsprojIcon);
var container = new RefCountedContainer<SharpIdeProjectModel>(project);
projectItem.SetMetadata(0, container);
foreach (var sharpIdeFolder in project.Folders) foreach (var sharpIdeFolder in project.Folders)
{ {
@@ -181,6 +184,8 @@ public partial class SolutionExplorerPanel : MarginContainer
var folderItem = _tree.CreateItem(projectItem); var folderItem = _tree.CreateItem(projectItem);
folderItem.SetText(0, sharpIdeFolder.Name); folderItem.SetText(0, sharpIdeFolder.Name);
folderItem.SetIcon(0, FolderIcon); folderItem.SetIcon(0, FolderIcon);
var container = new RefCountedContainer<SharpIdeFolder>(sharpIdeFolder);
folderItem.SetMetadata(0, container);
foreach (var subFolder in sharpIdeFolder.Folders) foreach (var subFolder in sharpIdeFolder.Folders)
{ {

View File

@@ -34,6 +34,19 @@ public static class ControlExtensions
public static class NodeExtensions public static class NodeExtensions
{ {
extension(TreeItem treeItem)
{
public T? GetTypedMetadata<T>(int column) where T : RefCounted?
{
var metadata = treeItem.GetMetadata(column);
var refCountedMetadata = metadata.As<RefCounted?>();
if (refCountedMetadata is T correctTypeContainer)
{
return correctTypeContainer;
}
return null;
}
}
extension(Node node) extension(Node node)
{ {
public void QueueFreeChildren() public void QueueFreeChildren()