diff --git a/Intersect.Client.Core/Interface/Debugging/TexturesSearchableTreeDataProvider.cs b/Intersect.Client.Core/Interface/Debugging/TexturesSearchableTreeDataProvider.cs index a31030ad3..4f32458b5 100644 --- a/Intersect.Client.Core/Interface/Debugging/TexturesSearchableTreeDataProvider.cs +++ b/Intersect.Client.Core/Interface/Debugging/TexturesSearchableTreeDataProvider.cs @@ -5,6 +5,9 @@ using Intersect.Client.Framework.Gwen.Control; using Intersect.Client.Framework.Gwen.Control.Utility; using Intersect.Client.Localization; +using Intersect.Core; +using Intersect.Framework.Reflection; +using Microsoft.Extensions.Logging; namespace Intersect.Client.Interface.Debugging; @@ -12,6 +15,7 @@ public sealed class TexturesSearchableTreeDataProvider : ISearchableTreeDataProv { private readonly GameContentManager _contentManager; private readonly Dictionary _entries; + private readonly Dictionary _contentTypeByAsset; private readonly Dictionary> _entriesByParent; private readonly Base _parent; @@ -20,6 +24,22 @@ public TexturesSearchableTreeDataProvider(GameContentManager contentManager, Bas _contentManager = contentManager; _parent = parent; + var allContent = _contentManager.Content.ToArray(); + _contentTypeByAsset = allContent.SelectMany( + pair => + { + var (contentType, contentTypeAssets) = pair; + return contentTypeAssets.Select(asset => new KeyValuePair(asset, contentType)); + } + ).ToDictionary(); + + foreach (var (asset, _) in _contentTypeByAsset) + { + asset.Disposed += OnAssetStateChanged; + asset.Loaded += OnAssetStateChanged; + asset.Unloaded += OnAssetStateChanged; + } + _entries = _contentManager.Content.SelectMany( contentTypeEntry => { @@ -30,6 +50,7 @@ public TexturesSearchableTreeDataProvider(GameContentManager contentManager, Bas contentTypeName = contentType.ToString(); } + var assets = contentTypeEntry.Value.ToArray(); SearchableTreeDataEntry[] entriesForTextureType = [ new( @@ -37,8 +58,7 @@ public TexturesSearchableTreeDataProvider(GameContentManager contentManager, Bas DisplayText: contentTypeName, DisplayColor: parent.Skin.Colors.Label.Default ), - ..contentTypeEntry.Value.OfType() - .Select(texture => EntryForAsset(contentTypeId, texture)), + ..assets.Select(asset => EntryForAsset(contentTypeId, asset)), ]; return entriesForTextureType; @@ -54,6 +74,43 @@ public TexturesSearchableTreeDataProvider(GameContentManager contentManager, Bas ); } + private void OnAssetStateChanged(IAsset changedAsset) + { + if (!_contentTypeByAsset.TryGetValue(changedAsset, out var contentType)) + { + ApplicationContext.Context.Value?.Logger.LogWarning( + "Asset {AssetType} '{AssetId}' not indexed, unable to get content type", + changedAsset.GetType().GetName(qualified: true), + changedAsset.Id + ); + return; + } + + var contentTypeId = $"{nameof(ContentType)}:{contentType}"; + var updatedEntry = EntryForAsset(contentTypeId, changedAsset); + _entries[updatedEntry.Id] = updatedEntry; + var ancestorIds = GetAncestorIds(updatedEntry.ParentId); + + foreach (var ancestorId in ancestorIds) + { + if (!_entriesByParent.TryGetValue(ancestorId, out var entriesForAncestor)) + { + entriesForAncestor = []; + _entriesByParent[ancestorId] = entriesForAncestor; + } + + entriesForAncestor[updatedEntry.Id] = updatedEntry; + } + + EntriesChanged?.Invoke( + _parent, + new SearchableTreeDataEntriesEventArgs + { + Entries = [updatedEntry], + } + ); + } + private string[] GetAncestorIds(string? firstAncestorId) { if (string.IsNullOrWhiteSpace(firstAncestorId)) @@ -80,7 +137,7 @@ private string[] GetAncestorIds(string? firstAncestorId) return ancestorIds.ToArray(); } - private SearchableTreeDataEntry EntryForAsset(string parentId, IAsset asset) + private static SearchableTreeDataEntry EntryForAsset(string parentId, IAsset asset) { Color displayColor = Color.Green; if (asset.IsDisposed) @@ -92,10 +149,6 @@ private SearchableTreeDataEntry EntryForAsset(string parentId, IAsset asset) displayColor = Color.White; } - asset.Disposed += OnAssetStateChanged; - asset.Loaded += OnAssetStateChanged; - asset.Unloaded += OnAssetStateChanged; - var assetName = asset.Name ?? asset.Id; var displayText = assetName; @@ -112,32 +165,6 @@ private SearchableTreeDataEntry EntryForAsset(string parentId, IAsset asset) ParentId: parentId, UserData: asset ); - - void OnAssetStateChanged(IAsset changedAsset) - { - var updatedEntry = EntryForAsset(parentId, changedAsset); - _entries[updatedEntry.Id] = updatedEntry; - var ancestorIds = GetAncestorIds(updatedEntry.ParentId); - - foreach (var ancestorId in ancestorIds) - { - if (!_entriesByParent.TryGetValue(ancestorId, out var entriesForAncestor)) - { - entriesForAncestor = []; - _entriesByParent[ancestorId] = entriesForAncestor; - } - - entriesForAncestor[updatedEntry.Id] = updatedEntry; - } - - EntriesChanged?.Invoke( - _parent, - new SearchableTreeDataEntriesEventArgs - { - Entries = [updatedEntry], - } - ); - } } public event Base.GwenEventHandler? EntriesAdded;