private unsafe void DrawResourceMap(ResourceCategory category, uint ext, StdMap <uint, Pointer <ResourceHandle> > *map) { if (map == null) { return; } var label = GetNodeLabel(( uint )category, ext, map->Count); using var tree = ImRaii.TreeNode(label); if (!tree || map->Count == 0) { return; } using var table = ImRaii.Table("##table", 4, ImGuiTableFlags.SizingFixedFit | ImGuiTableFlags.RowBg); if (!table) { return; } ImGui.TableSetupColumn("Hash", ImGuiTableColumnFlags.WidthFixed, _hashColumnWidth); ImGui.TableSetupColumn("Ptr", ImGuiTableColumnFlags.WidthFixed, _hashColumnWidth); ImGui.TableSetupColumn("Path", ImGuiTableColumnFlags.WidthFixed, _pathColumnWidth); ImGui.TableSetupColumn("Refs", ImGuiTableColumnFlags.WidthFixed, _refsColumnWidth); ImGui.TableHeadersRow(); ResourceLoader.IterateResourceMap(map, (hash, r) => { // Filter unwanted names. if (_resourceManagerFilter.Length != 0 && !r->FileName.ToString().Contains(_resourceManagerFilter, StringComparison.InvariantCultureIgnoreCase)) { return; } var address = $"0x{( ulong )r:X}"; ImGuiUtil.TextNextColumn($"0x{hash:X8}"); ImGui.TableNextColumn(); ImGuiUtil.CopyOnClickSelectable(address); var resource = (Interop.Structs.ResourceHandle *)r; ImGui.TableNextColumn(); Text(resource); if (ImGui.IsItemClicked()) { var data = Interop.Structs.ResourceHandle.GetData(resource); if (data != null) { var length = ( int )Interop.Structs.ResourceHandle.GetLength(resource); ImGui.SetClipboardText(string.Join(" ", new ReadOnlySpan <byte>(data, length).ToArray().Select(b => b.ToString("X2")))); } } ImGuiUtil.HoverTooltip("Click to copy byte-wise file data to clipboard, if any."); ImGuiUtil.TextNextColumn(r->RefCount.ToString()); }); }
// Draw a full category for the resource manager. private unsafe void DrawCategoryContainer(ResourceCategory category, StdMap <uint, Pointer <StdMap <uint, Pointer <ResourceHandle> > > > *map) { if (map == null) { return; } using var tree = ImRaii.TreeNode($"({( uint )category:D2}) {category} - {map->Count}###{( uint )category}"); if (tree) { SetTableWidths(); ResourceLoader.IterateExtMap(map, (ext, m) => DrawResourceMap(category, ext, m)); } }
private unsafe void DrawResourceMap(string label, StdMap <uint, Pointer <ResourceHandle> > *typeMap) { if (typeMap == null || !ImGui.TreeNodeEx(label)) { return; } using var raii = ImGuiRaii.DeferredEnd(ImGui.TreePop); if (typeMap->Count == 0 || !ImGui.BeginTable($"##{label}_table", 4, ImGuiTableFlags.SizingFixedFit | ImGuiTableFlags.RowBg)) { return; } raii.Push(ImGui.EndTable); ImGui.TableSetupColumn("Hash", ImGuiTableColumnFlags.WidthFixed, 100 * ImGuiHelpers.GlobalScale); ImGui.TableSetupColumn("Ptr", ImGuiTableColumnFlags.WidthFixed, 100 * ImGuiHelpers.GlobalScale); ImGui.TableSetupColumn("Path", ImGuiTableColumnFlags.WidthFixed, ImGui.GetWindowContentRegionWidth() - 300 * ImGuiHelpers.GlobalScale); ImGui.TableSetupColumn("Refs", ImGuiTableColumnFlags.WidthFixed, 30 * ImGuiHelpers.GlobalScale); ImGui.TableHeadersRow(); var node = typeMap->SmallestValue; while (!node->IsNil) { ImGui.TableNextRow(); ImGui.TableNextColumn(); ImGui.Text($"0x{node->KeyValuePair.Item1:X8}"); ImGui.TableNextColumn(); var address = $"0x{( ulong )node->KeyValuePair.Item2.Value:X}"; ImGui.Text(address); if (ImGui.IsItemClicked()) { ImGui.SetClipboardText(address); } ImGui.TableNextColumn(); ImGui.Text(node->KeyValuePair.Item2.Value->FileName.ToString()); ImGui.TableNextColumn(); ImGui.Text(node->KeyValuePair.Item2.Value->RefCount.ToString()); node = node->Next(); } }