Skip to content

Commit 00bdcc8

Browse files
committed
Sln Explorer - replace RefCountedContainer with ConditionalWeakTable
1 parent 94e6dd5 commit 00bdcc8

File tree

3 files changed

+37
-33
lines changed

3 files changed

+37
-33
lines changed

src/SharpIDE.Godot/Features/SolutionExplorer/SolutionExplorerPanel.Clipboard.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ private void AddSelectedNodesToSlnExplorerClipboard(ClipboardOperation clipboard
1616
_itemsOnClipboard = (selectedItems
1717
.Select(item =>
1818
{
19-
var metadata = item.GetMetadata(0).As<RefCounted?>();
20-
IFileOrFolder? result = metadata switch
19+
var sharpIdeNode = item.SharpIdeNode;
20+
IFileOrFolder? result = sharpIdeNode switch
2121
{
22-
RefCountedContainer<SharpIdeFile> file => file.Item,
23-
RefCountedContainer<SharpIdeFolder> folder => folder.Item,
22+
SharpIdeFile file => file,
23+
SharpIdeFolder folder => folder,
2424
_ => null
2525
};
2626
return result;
@@ -65,11 +65,11 @@ private void CopyNodesFromClipboardToSelectedNode()
6565
{
6666
var selected = _tree.GetSelected();
6767
if (selected is null || _itemsOnClipboard is null) return;
68-
var genericMetadata = selected.GetMetadata(0).As<RefCounted?>();
69-
IFolderOrProject? destinationFolderOrProject = genericMetadata switch
68+
var sharpIdeNode = selected.SharpIdeNode;
69+
IFolderOrProject? destinationFolderOrProject = sharpIdeNode switch
7070
{
71-
RefCountedContainer<SharpIdeFolder> f => f.Item,
72-
RefCountedContainer<SharpIdeProjectModel> p => p.Item,
71+
SharpIdeFolder f => f,
72+
SharpIdeProjectModel p => p,
7373
_ => null
7474
};
7575
if (destinationFolderOrProject is null) return;

src/SharpIDE.Godot/Features/SolutionExplorer/SolutionExplorerPanel.cs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -85,16 +85,16 @@ private void TreeOnItemMouseSelected(Vector2 mousePosition, long mouseButtonInde
8585

8686
var mouseButtonMask = (MouseButtonMask)mouseButtonIndex;
8787

88-
var genericMetadata = selected.GetMetadata(0).As<RefCounted?>();
89-
switch (mouseButtonMask, genericMetadata)
88+
var sharpIdeNode = selected.SharpIdeNode;
89+
switch (mouseButtonMask, sharpIdeNode)
9090
{
91-
case (MouseButtonMask.Left, RefCountedContainer<SharpIdeFile> fileContainer): GodotGlobalEvents.Instance.FileSelected.InvokeParallelFireAndForget(fileContainer.Item, null); break;
92-
case (MouseButtonMask.Right, RefCountedContainer<SharpIdeFile> fileContainer): OpenContextMenuFile(fileContainer.Item); break;
93-
case (MouseButtonMask.Left, RefCountedContainer<SharpIdeProjectModel> { Item.IsInvalid: true }): GodotGlobalEvents.Instance.BottomPanelTabExternallySelected.InvokeParallelFireAndForget(BottomPanelType.Problems); break;
94-
case (MouseButtonMask.Right, RefCountedContainer<SharpIdeProjectModel> projectContainer): OpenContextMenuProject(projectContainer.Item); break;
95-
case (MouseButtonMask.Left, RefCountedContainer<SharpIdeFolder>): break;
96-
case (MouseButtonMask.Right, RefCountedContainer<SharpIdeFolder> folderContainer): OpenContextMenuFolder(folderContainer.Item, selected); break;
97-
case (MouseButtonMask.Left, RefCountedContainer<SharpIdeSolutionFolder>): break;
91+
case (MouseButtonMask.Left, SharpIdeFile file): GodotGlobalEvents.Instance.FileSelected.InvokeParallelFireAndForget(file, null); break;
92+
case (MouseButtonMask.Right, SharpIdeFile file): OpenContextMenuFile(file); break;
93+
case (MouseButtonMask.Left, SharpIdeProjectModel { IsInvalid: true }): GodotGlobalEvents.Instance.BottomPanelTabExternallySelected.InvokeParallelFireAndForget(BottomPanelType.Problems); break;
94+
case (MouseButtonMask.Right, SharpIdeProjectModel project): OpenContextMenuProject(project); break;
95+
case (MouseButtonMask.Left, SharpIdeFolder): break;
96+
case (MouseButtonMask.Right, SharpIdeFolder folder): OpenContextMenuFolder(folder, selected); break;
97+
case (MouseButtonMask.Left, SharpIdeSolutionFolder): break;
9898
default: break;
9999
}
100100
}
@@ -112,8 +112,8 @@ private async Task OnFileExternallySelected(SharpIdeFile file, SharpIdeFileLineP
112112
var selectedItem = _tree.GetSelected();
113113
if (selectedItem is not null)
114114
{
115-
var selectedFile = selectedItem.GetTypedMetadata<RefCountedContainer<SharpIdeFile>?>(0)?.Item;
116-
if (selectedFile == file)
115+
var selectedSharpIdeNode = selectedItem.SharpIdeNode;
116+
if (selectedSharpIdeNode == file)
117117
return;
118118
}
119119
var item = FindItemRecursive(_tree.GetRoot(), file);
@@ -132,7 +132,7 @@ await this.InvokeAsync(() =>
132132

133133
private static TreeItem? FindItemRecursive(TreeItem item, SharpIdeFile file)
134134
{
135-
if (item.GetTypedMetadata<RefCountedContainer<SharpIdeFile>?>(0)?.Item == file)
135+
if (item.SharpIdeNode == file)
136136
return item;
137137

138138
var child = item.GetFirstChild();
@@ -201,7 +201,7 @@ private TreeItem CreateSlnFolderTreeItem(Tree tree, TreeItem parent, SharpIdeSol
201201
var folderItem = tree.CreateItem(parent);
202202
folderItem.SetText(0, slnFolder.Name);
203203
folderItem.SetIcon(0, SlnFolderIcon);
204-
folderItem.SetMetadata(0, new RefCountedContainer<SharpIdeSolutionFolder>(slnFolder));
204+
folderItem.SharpIdeNode = slnFolder;
205205

206206
// Observe folder sub-collections
207207
var subFoldersView = slnFolder.Folders.CreateView(y => new TreeItemContainer());
@@ -245,7 +245,7 @@ private TreeItem CreateProjectTreeItem(Tree tree, TreeItem parent, SharpIdeProje
245245
var icon = projectModel.IsLoading ? LoadingProjectIcon : projectModel.IsInvalid ? UnloadedProjectIcon : CsprojIcon;
246246
projectItem.SetIcon(0, icon);
247247
if (projectModel.IsLoading is false && projectModel.IsInvalid) projectItem.SetSuffix(0, " · load failed");
248-
projectItem.SetMetadata(0, new RefCountedContainer<SharpIdeProjectModel>(projectModel));
248+
projectItem.SharpIdeNode = projectModel;
249249

250250
projectModel.MsBuildProjectLoadState.SubscribeOnThreadPool().ObserveOnThreadPool().SubscribeAwait(async (loadState, ct) =>
251251
{
@@ -298,7 +298,7 @@ private TreeItem CreateFolderTreeItem(Tree tree, TreeItem parent, SharpIdeFolder
298298
var folderItem = tree.CreateItem(parent, newStartingIndex);
299299
folderItem.SetText(0, sharpIdeFolder.Name.Value);
300300
folderItem.SetIcon(0, FolderIcon);
301-
folderItem.SetMetadata(0, new RefCountedContainer<SharpIdeFolder>(sharpIdeFolder));
301+
folderItem.SharpIdeNode = sharpIdeFolder;
302302

303303
Observable.EveryValueChanged(sharpIdeFolder, folder => folder.Name.Value)
304304
.Skip(1).SubscribeOnThreadPool().ObserveOnThreadPool().SubscribeAwait(async (s, ct) =>
@@ -350,7 +350,7 @@ private TreeItem CreateFileTreeItem(Tree tree, TreeItem parent, SharpIdeFile sha
350350
fileItem.SetIconsForFileExtension(sharpIdeFile);
351351
if (GitColours.GetColorForGitFileStatus(sharpIdeFile.GitStatus) is { } notnullColor) fileItem.SetCustomColor(0, notnullColor);
352352
else fileItem.ClearCustomColor(0);
353-
fileItem.SetMetadata(0, new RefCountedContainer<SharpIdeFile>(sharpIdeFile));
353+
fileItem.SharpIdeNode = sharpIdeFile;
354354

355355
Observable.EveryValueChanged(sharpIdeFile, file => file.Name.Value)
356356
.Skip(1).SubscribeOnThreadPool().ObserveOnThreadPool().SubscribeAwait(async (s, ct) =>

src/SharpIDE.Godot/NodeExtensions.cs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
using System.Collections.Specialized;
1+
using System.Runtime.CompilerServices;
22
using Godot;
3-
using ObservableCollections;
43
using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence;
5-
using SharpIDE.Godot.Features.Problems;
64

75
namespace SharpIDE.Godot;
86

@@ -124,17 +122,23 @@ public Vector2 GetStringsSize(
124122
}
125123
}
126124

125+
private static readonly ConditionalWeakTable<TreeItem, ISharpIdeNode> TreeItemSharpIdeNode = [];
127126
extension(TreeItem treeItem)
128127
{
129-
public T? GetTypedMetadata<T>(int column) where T : RefCounted?
128+
public ISharpIdeNode? SharpIdeNode
130129
{
131-
var metadata = treeItem.GetMetadata(column);
132-
var refCountedMetadata = metadata.As<RefCounted?>();
133-
if (refCountedMetadata is T correctTypeContainer)
130+
get => TreeItemSharpIdeNode.TryGetValue(treeItem, out var s) ? s : null;
131+
set
134132
{
135-
return correctTypeContainer;
133+
if (value is null)
134+
{
135+
TreeItemSharpIdeNode.Remove(treeItem);
136+
}
137+
else
138+
{
139+
TreeItemSharpIdeNode.AddOrUpdate(treeItem, value);
140+
}
136141
}
137-
return null;
138142
}
139143
public void MoveToIndexInParent(int currentIndex, int newIndex)
140144
{

0 commit comments

Comments
 (0)