You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

167 lines
6.0 KiB

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>");
}
}
}
}
}
}