r2mods/ilspy_dump/ror2_csproj/RoR2/EditorUtil.cs

259 lines
6.5 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using JetBrains.Annotations;
using UnityEngine;
namespace RoR2;
public static class EditorUtil
{
private static int recursionLimit;
private static int recursionStep;
private static readonly char[] directorySeparators;
private static event Action _onNextUpdate;
public static event Action onNextUpdate
{
add
{
}
remove
{
}
}
static EditorUtil()
{
recursionLimit = 3;
recursionStep = 0;
directorySeparators = new char[2] { '/', '\\' };
}
private static void StaticUpdate()
{
Action action = EditorUtil._onNextUpdate;
EditorUtil._onNextUpdate = null;
action?.Invoke();
}
public static bool IsPrefabVariant(UnityEngine.Object obj)
{
return false;
}
public static void SetDirty(UnityEngine.Object obj)
{
}
public static void NonSerializedObjectGUI<T>(ref T obj)
{
}
[UsedImplicitly]
private static void SetFieldGeneric<T>(FieldInfo fieldInfo, object instance, T value)
{
if (fieldInfo.FieldType.IsAssignableFrom(typeof(T)))
{
fieldInfo.SetValue(instance, value);
return;
}
Debug.LogErrorFormat("Cannot assign value {0} of type {1} to field {2} of type {3}", value, value.GetType().Name, fieldInfo.Name, fieldInfo.FieldType.Name);
}
public static UnityEngine.Object PrefabUtilityGetNearestPrefabInstanceRoot(UnityEngine.Object obj)
{
throw new NotImplementedException();
}
public static UnityEngine.Object PrefabUtilityInstantiatePrefab(UnityEngine.Object prefab, Transform parent)
{
throw new NotImplementedException();
}
public static void CopyToScriptableObject<TSrc, TDest>(TSrc src, string folder) where TDest : ScriptableObject
{
TDest val = ScriptableObject.CreateInstance<TDest>();
Dictionary<string, (Type, Func<TSrc, object>)> dictionary = new Dictionary<string, (Type, Func<TSrc, object>)>();
Dictionary<string, (Type, Action<TDest, object>)> dictionary2 = new Dictionary<string, (Type, Action<TDest, object>)>();
FieldInfo[] fields = typeof(TSrc).GetFields();
foreach (FieldInfo srcField in fields)
{
dictionary[srcField.Name] = (srcField.FieldType, (TSrc s) => srcField.GetValue(s));
}
PropertyInfo[] properties = typeof(TSrc).GetProperties();
foreach (PropertyInfo srcProperty in properties)
{
if (!(srcProperty.GetMethod == null))
{
dictionary[srcProperty.Name] = (srcProperty.PropertyType, (TSrc s) => srcProperty.GetValue(s));
}
}
fields = typeof(TDest).GetFields();
foreach (FieldInfo destField in fields)
{
dictionary2[destField.Name] = (destField.FieldType, delegate(TDest d, object v)
{
destField.SetValue(d, v);
});
}
properties = typeof(TDest).GetProperties();
foreach (PropertyInfo destProperty in properties)
{
if (!(destProperty.SetMethod == null))
{
dictionary2[destProperty.Name] = (destProperty.PropertyType, delegate(TDest d, object v)
{
destProperty.SetValue(d, v);
});
}
}
foreach (KeyValuePair<string, (Type, Func<TSrc, object>)> item in dictionary)
{
string key = item.Key;
var (c, func) = item.Value;
if (dictionary2.TryGetValue(key, out var value))
{
var (type, action) = value;
if (type.IsAssignableFrom(c))
{
action(val, func(src));
}
}
}
CreateAsset(val, folder + val.name + ".asset");
}
private static void CreateAsset(UnityEngine.Object asset, string path)
{
}
private static void AssetDatabaseSaveAssets()
{
}
private static void AssetDatabaseRefresh()
{
}
private static void AssetDatabaseMoveAsset(string oldPath, string newPath)
{
}
private static void AssetDatabaseDeleteAsset(string path)
{
}
private static void AssetDatabaseCreateFolder(string parentFolder, string newFolderName)
{
}
public static void EnsureDirectoryExists(string directoryPath)
{
string[] array = directoryPath.Split(directorySeparators);
string text = array[0].ToString();
int i = 1;
for (int num = array.Length; i < num; i++)
{
string text2 = array[i].ToString();
string text3 = $"{text}{'/'}{text2}";
if (!Directory.Exists(text3))
{
AssetDatabaseCreateFolder(text, text2);
}
text = text3;
}
if (!Directory.Exists(directoryPath))
{
Debug.LogWarning("Failed to ensure path \"" + directoryPath + "\"");
}
}
public static void MoveAsset(string oldPath, string newPath, bool deleteEmpty = true)
{
string directoryName = System.IO.Path.GetDirectoryName(oldPath);
EnsureDirectoryExists(System.IO.Path.GetDirectoryName(newPath));
AssetDatabaseMoveAsset(oldPath, newPath);
if (deleteEmpty)
{
DeleteDirectoryEmptyChildren(directoryName);
}
}
public static void DeleteDirectoryIfEmpty(string directory)
{
DeleteDirectoryEmptyChildren(directory);
DeleteDirectoryEmptyParents(directory);
}
private static bool DeleteDirectoryEmptyChildren(string directory)
{
bool flag = true;
try
{
string[] directories = Directory.GetDirectories(directory);
for (int i = 0; i < directories.Length; i++)
{
string fileName = System.IO.Path.GetFileName(directories[i]);
if (!DeleteDirectoryEmptyChildren(directory + "/" + fileName))
{
flag = false;
}
}
flag &= Directory.GetFiles(directory).Length == 0;
if (flag)
{
AssetDatabaseDeleteAsset(directory);
}
}
catch (Exception ex)
{
throw new Exception($"DeleteDirectoryEmptyChildren(\"{directory}\") error: {ex}", ex);
}
return flag;
}
private static void DeleteDirectoryEmptyParents(string directory)
{
string directoryName = System.IO.Path.GetDirectoryName(directory);
bool flag = Directory.GetDirectories(directoryName).Length != 0;
bool flag2 = Directory.GetFiles(directoryName).Length != 0;
if (!flag && !flag2)
{
AssetDatabaseDeleteAsset(directory);
DeleteDirectoryEmptyParents(directoryName);
}
}
public static IEnumerable<string> GetAllAssetsInDirectory(string directory, bool includeSubdirectories)
{
DirectoryInfo directoryInfo = new DirectoryInfo(directory);
FileSystemInfo[] fileSystemInfos = directoryInfo.GetFileSystemInfos();
for (int i = 0; i < fileSystemInfos.Length; i++)
{
string name = fileSystemInfos[i].Name;
if (!name.EndsWith(".meta"))
{
yield return directory + "/" + name;
}
}
if (!includeSubdirectories)
{
yield break;
}
DirectoryInfo[] directories = directoryInfo.GetDirectories();
foreach (DirectoryInfo directoryInfo2 in directories)
{
string directory2 = directory + "/" + directoryInfo2.Name;
foreach (string item in GetAllAssetsInDirectory(directory2, includeSubdirectories))
{
yield return item;
}
}
}
}