|
|
- using CustomUI.Utilities;
- using IPA.Loader;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Reflection;
- using UnityEngine;
- using System.Runtime.CompilerServices;
- using IPA.Utilities;
-
- namespace BSIPA_ModList
- {
- internal static class Utilities
- {
- private static Sprite _defaultBsipaIcon;
- public static Sprite DefaultBSIPAIcon
- {
- get
- {
- if (_defaultBsipaIcon == null)
- _defaultBsipaIcon = UIUtilities.LoadSpriteFromResources("BSIPA_ModList.Icons.mod_bsipa.png");
- return _defaultBsipaIcon;
- }
- }
-
- private static Sprite _defaultLibraryIcon;
- public static Sprite DefaultLibraryIcon
- {
- get
- {
- if (_defaultLibraryIcon == null)
- _defaultLibraryIcon = UIUtilities.LoadSpriteFromResources("BSIPA_ModList.Icons.library.png");
- return _defaultLibraryIcon;
- }
- }
-
- private static Sprite _defaultIpaIcon;
- public static Sprite DefaultIPAIcon
- {
- get
- {
- if (_defaultIpaIcon == null)
- _defaultIpaIcon = UIUtilities.LoadSpriteFromResources("BSIPA_ModList.Icons.mod_ipa.png");
- return _defaultIpaIcon;
- }
- }
-
- public static Sprite GetIcon(this PluginLoader.PluginMetadata meta)
- {
- if (meta == null) return DefaultBSIPAIcon;
- if (meta.IsBare) return DefaultLibraryIcon;
- else return GetEmbeddedIcon(meta) ?? DefaultBSIPAIcon;
- }
-
- private static Dictionary<PluginLoader.PluginMetadata, Sprite> embeddedIcons = new Dictionary<PluginLoader.PluginMetadata, Sprite>();
- public static Sprite GetEmbeddedIcon(this PluginLoader.PluginMetadata meta)
- {
- if (embeddedIcons.TryGetValue(meta, out var sprite)) return sprite;
- var icon = GetEmbeddedIconNoCache(meta);
- embeddedIcons.Add(meta, icon);
- return icon;
- }
- private static Sprite GetEmbeddedIconNoCache(PluginLoader.PluginMetadata meta)
- {
- if (meta.Assembly == null) return null;
- if (meta.Manifest.IconPath == null) return null;
-
- try
- {
- return UIUtilities.LoadSpriteRaw(UIUtilities.GetResource(meta.Assembly, meta.Manifest.IconPath));
- }
- catch (Exception e)
- {
- Logger.log.Error($"Error loading icon for {meta.Name}");
- Logger.log.Error(e);
- return null;
- }
- }
-
- public static void DebugPrintTo<T>(this T obj, Action<string> log, int maxDepth = -1) =>
- DebugPrintTo(obj?.GetType() ?? typeof(T), obj, log, "", new ConditionalWeakTable<object, Ref<bool>>(), maxDepth);
-
- private static void DebugPrintTo(Type type, object obj, Action<string> log, string indent, ConditionalWeakTable<object, Ref<bool>> table, int maxDepth)
- {
- if (maxDepth == 0)
- {
- log(indent + "<Max depth reached>");
- return;
- }
-
- if (obj == null)
- {
- log(indent + "null");
- return;
- }
-
- table.Add(obj, true);
-
- if (type.IsPrimitive)
- {
- log(indent + obj.ToString());
- return;
- }
- if (type.IsEnum)
- {
- log(indent + obj.ToString());
- return;
- }
- if (type == typeof(string))
- {
- log(indent + $"\"{obj.ToString()}\"");
- return;
- }
- if (type.IsArray)
- {
- log(indent + $"{type.GetElementType()} [");
- foreach (var o in obj as Array)
- {
- if (type.GetElementType().IsPrimitive)
- log(indent + "- " + o?.ToString() ?? "null");
- else if (type.GetElementType().IsEnum)
- log(indent + "- " + o?.ToString() ?? "null");
- else if (type.GetElementType() == typeof(string))
- log(indent + "- " + $"\"{o?.ToString()}\"");
- else
- {
- log(indent + $"- {o?.GetType()?.ToString() ?? "null"}");
- if (o != null)
- {
- if (!table.TryGetValue(o, out _))
- DebugPrintTo(o.GetType(), o, log, indent + " ", table, maxDepth - 1);
- else
- log(indent + " <Already printed>");
- }
- }
- }
- log(indent + "]");
- return;
- }
-
- var fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
- foreach (var field in fields)
- {
- var value = field.GetValue(obj);
-
- if (field.FieldType.IsPrimitive)
- log(indent + field.Name + ": " + value?.ToString() ?? "null");
- else if (field.FieldType.IsEnum)
- log(indent + field.Name + ": " + value?.ToString() ?? "null");
- else if (field.FieldType == typeof(string))
- log(indent + field.Name + ": " + $"\"{value?.ToString()}\"");
- else
- {
- log(indent + field.Name + ": " + value?.GetType()?.ToString() ?? "null");
- if (value != null)
- {
- if (!table.TryGetValue(value, out _))
- DebugPrintTo(value?.GetType() ?? field.FieldType, value, log, indent + " ", table, maxDepth - 1);
- else
- log(indent + " <Already printed>");
- }
- }
- }
- }
- }
- }
|