From f2fa4076e2461dece299d847500f0dfef7b24e43 Mon Sep 17 00:00:00 2001 From: Matt Parker <61717342+MattParkerDev@users.noreply.github.com> Date: Fri, 10 Oct 2025 18:34:31 +1000 Subject: [PATCH] handle generic treeitem metadata better --- .../SolutionExplorer/SolutionExplorerPanel.cs | 11 ++++++++--- src/SharpIDE.Godot/NodeExtensions.cs | 13 +++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/SharpIDE.Godot/Features/SolutionExplorer/SolutionExplorerPanel.cs b/src/SharpIDE.Godot/Features/SolutionExplorer/SolutionExplorerPanel.cs index b218471..fb88cfa 100644 --- a/src/SharpIDE.Godot/Features/SolutionExplorer/SolutionExplorerPanel.cs +++ b/src/SharpIDE.Godot/Features/SolutionExplorer/SolutionExplorerPanel.cs @@ -33,7 +33,7 @@ public partial class SolutionExplorerPanel : MarginContainer { var selected = _tree.GetSelected(); if (selected is null) return; - var sharpIdeFileContainer = selected.GetMetadata(0).As?>(); + var sharpIdeFileContainer = selected.GetTypedMetadata?>(0); if (sharpIdeFileContainer is null) return; var sharpIdeFile = sharpIdeFileContainer.Item; Guard.Against.Null(sharpIdeFile, nameof(sharpIdeFile)); @@ -97,8 +97,7 @@ public partial class SolutionExplorerPanel : MarginContainer private static TreeItem? FindItemRecursive(TreeItem item, SharpIdeFile file) { - var metadata = item.GetMetadata(0); - if (metadata.As?>()?.Item == file) + if (item.GetTypedMetadata?>(0)?.Item == file) return item; var child = item.GetFirstChild(); @@ -142,6 +141,8 @@ public partial class SolutionExplorerPanel : MarginContainer var folderItem = _tree.CreateItem(parent); folderItem.SetText(0, folder.Name); folderItem.SetIcon(0, SlnFolderIcon); + var container = new RefCountedContainer(folder); + folderItem.SetMetadata(0, container); foreach (var project in folder.Projects) { @@ -164,6 +165,8 @@ public partial class SolutionExplorerPanel : MarginContainer var projectItem = _tree.CreateItem(parent); projectItem.SetText(0, project.Name); projectItem.SetIcon(0, CsprojIcon); + var container = new RefCountedContainer(project); + projectItem.SetMetadata(0, container); foreach (var sharpIdeFolder in project.Folders) { @@ -181,6 +184,8 @@ public partial class SolutionExplorerPanel : MarginContainer var folderItem = _tree.CreateItem(projectItem); folderItem.SetText(0, sharpIdeFolder.Name); folderItem.SetIcon(0, FolderIcon); + var container = new RefCountedContainer(sharpIdeFolder); + folderItem.SetMetadata(0, container); foreach (var subFolder in sharpIdeFolder.Folders) { diff --git a/src/SharpIDE.Godot/NodeExtensions.cs b/src/SharpIDE.Godot/NodeExtensions.cs index 59df6f1..9772d4f 100644 --- a/src/SharpIDE.Godot/NodeExtensions.cs +++ b/src/SharpIDE.Godot/NodeExtensions.cs @@ -34,6 +34,19 @@ public static class ControlExtensions public static class NodeExtensions { + extension(TreeItem treeItem) + { + public T? GetTypedMetadata(int column) where T : RefCounted? + { + var metadata = treeItem.GetMetadata(column); + var refCountedMetadata = metadata.As(); + if (refCountedMetadata is T correctTypeContainer) + { + return correctTypeContainer; + } + return null; + } + } extension(Node node) { public void QueueFreeChildren()