Net.Like.Xue.Tokyo/Assets/Plugins/SerializedCollections/Editor/Scripts/SerializedDictionaryDrawer.cs

65 lines
2.9 KiB
C#

using AYellowpaper.SerializedCollections.Editor.Data;
using AYellowpaper.SerializedCollections.Editor.States;
using AYellowpaper.SerializedCollections.KeysGenerators;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using UnityEditor;
using UnityEditor.IMGUI.Controls;
using UnityEditorInternal;
using UnityEngine;
namespace AYellowpaper.SerializedCollections.Editor
{
#if ODIN_INSPECTOR
[Sirenix.OdinInspector.Editor.DrawerPriority(Sirenix.OdinInspector.Editor.DrawerPriorityLevel.SuperPriority)]
#endif
[CustomPropertyDrawer(typeof(SerializedDictionary<,>), true)]
public class SerializedDictionaryDrawer : PropertyDrawer
{
public const string KeyName = nameof(SerializedKeyValuePair<int, int>.Key);
public const string ValueName = nameof(SerializedKeyValuePair<int, int>.Value);
public const string SerializedListName = nameof(SerializedDictionary<int, int>._serializedList);
public const string LookupTableName = nameof(SerializedDictionary<int, int>.LookupTable);
public const int TopHeaderClipHeight = 20;
public const int TopHeaderHeight = 19;
public const int SearchHeaderHeight = 20;
public const int KeyValueHeaderHeight = 18;
public const bool KeyFlag = true;
public const bool ValueFlag = false;
public static readonly Color BorderColor = new Color(36 / 255f, 36 / 255f, 36 / 255f);
public static readonly List<int> NoEntriesList = new List<int>();
internal static GUIContent DisplayTypeToggleContent
{
get
{
if (_displayTypeToggleContent == null)
{
var texture = AssetDatabase.LoadAssetAtPath<Texture>("Assets/Plugins/SerializedCollections/Editor/Assets/BurgerMenu@2x.png");
_displayTypeToggleContent = new GUIContent(texture, "Toggle to either draw existing editor or draw properties manually.");
}
return _displayTypeToggleContent;
}
}
private static GUIContent _displayTypeToggleContent;
private Dictionary<string, SerializedDictionaryInstanceDrawer> _arrayData = new();
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
if (!_arrayData.ContainsKey(property.propertyPath))
_arrayData.Add(property.propertyPath, new SerializedDictionaryInstanceDrawer(property, fieldInfo));
_arrayData[property.propertyPath].OnGUI(position, label);
}
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
if (!_arrayData.ContainsKey(property.propertyPath))
_arrayData.Add(property.propertyPath, new SerializedDictionaryInstanceDrawer(property, fieldInfo));
return _arrayData[property.propertyPath].GetPropertyHeight(label);
}
}
}