using System; using System.Collections.Generic; using UnityEditor; using UnityEngine; namespace XNodeEditor { public static class NodeEditorPreferences { /// Have we loaded the prefs yet private static bool prefsLoaded = false; private static Dictionary typeColors; private static Dictionary generatedTypeColors; private static bool gridSnap; public static Color gridLineColor { get { VerifyLoaded(); return _gridLineColor; } } private static Color _gridLineColor; public static Color gridBgColor { get { VerifyLoaded(); return _gridBgColor; } } private static Color _gridBgColor; [PreferenceItem("Node Editor")] private static void PreferencesGUI() { if (!prefsLoaded) LoadPrefs(); GridSettingsGUI(); TypeColorsGUI(); if (GUILayout.Button("Set Default", GUILayout.Width(120))) { ResetPrefs(); } } private static void GridSettingsGUI() { //Label EditorGUILayout.LabelField("Grid", EditorStyles.boldLabel); gridSnap = EditorGUILayout.Toggle("Snap", gridSnap); //EditorGUIUtility.labelWidth = 30; _gridLineColor = EditorGUILayout.ColorField("Color", _gridLineColor); _gridBgColor = EditorGUILayout.ColorField(" ", _gridBgColor); if (GUI.changed) { SavePrefs(); } EditorGUILayout.Space(); } private static void TypeColorsGUI() { //Label EditorGUILayout.LabelField("Type colors", EditorStyles.boldLabel); //Get saved type keys string[] typeKeys = new string[typeColors.Count]; typeColors.Keys.CopyTo(typeKeys, 0); //Display saved type colors foreach (var key in typeKeys) { EditorGUILayout.BeginHorizontal(); if (!EditorGUILayout.Toggle(key, true)) { typeColors.Remove(key); SavePrefs(); } Color col = typeColors[key]; col = EditorGUILayout.ColorField(col); typeColors[key] = col; EditorGUILayout.EndHorizontal(); } if (GUI.changed) { SavePrefs(); } //Get generated type keys string[] generatedTypeKeys = new string[generatedTypeColors.Count]; generatedTypeColors.Keys.CopyTo(generatedTypeKeys, 0); //Display generated type colors foreach (var key in generatedTypeKeys) { EditorGUILayout.BeginHorizontal(); if (EditorGUILayout.Toggle(key, false)) { typeColors.Add(key, generatedTypeColors[key]); generatedTypeColors.Remove(key); SavePrefs(); } Color col = generatedTypeColors[key]; EditorGUI.BeginDisabledGroup(true); col = EditorGUILayout.ColorField(col); EditorGUI.EndDisabledGroup(); EditorGUILayout.EndHorizontal(); } } private static void LoadPrefs() { //Load type colors generatedTypeColors = new Dictionary(); typeColors = GetTypeColors(); //Load grid colors if (EditorPrefs.HasKey("unec_gridcolor0")) { Color color; if (ColorUtility.TryParseHtmlString(EditorPrefs.GetString("unec_gridcolor0"), out color)) { _gridLineColor = color; } } if (EditorPrefs.HasKey("unec_gridcolor1")) { Color color; if (ColorUtility.TryParseHtmlString(EditorPrefs.GetString("unec_gridcolor1"), out color)) { _gridBgColor = color; } } //Load snap option if (EditorPrefs.HasKey("unec_gridsnap")) gridSnap = EditorPrefs.GetBool("unec_gridsnap"); prefsLoaded = true; } private static void ResetPrefs() { EditorPrefs.SetString("unec_typecolors", "int,2568CA,string,CE743A,bool,00FF00"); EditorPrefs.SetString("unec_gridcolor0", ColorUtility.ToHtmlStringRGB(new Color(0.45f, 0.45f, 0.45f))); EditorPrefs.SetString("unec_gridcolor1", ColorUtility.ToHtmlStringRGB(new Color(0.18f, 0.18f, 0.18f))); LoadPrefs(); } private static void SavePrefs() { if (!prefsLoaded) return; string s = ""; foreach (var item in typeColors) { s += item.Key + "," + ColorUtility.ToHtmlStringRGB(item.Value) + ","; } EditorPrefs.SetString("unec_typecolors", s); EditorPrefs.SetString("unec_gridcolor0", ColorUtility.ToHtmlStringRGB(_gridLineColor)); EditorPrefs.SetString("unec_gridcolor1", ColorUtility.ToHtmlStringRGB(_gridBgColor)); EditorPrefs.SetBool("unec_gridsnap", gridSnap); } private static void VerifyLoaded() { if (!prefsLoaded) LoadPrefs(); } public static Dictionary GetTypeColors() { if (prefsLoaded) return typeColors; string[] data = EditorPrefs.GetString("unec_typecolors").Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); Dictionary dict = new Dictionary(); for (int i = 0; i < data.Length; i += 2) { Color col; if (ColorUtility.TryParseHtmlString("#" + data[i + 1], out col)) { dict.Add(data[i], col); } } return dict; } /// Return color based on type public static Color GetTypeColor(System.Type type) { if (!prefsLoaded) LoadPrefs(); if (type == null) return Color.gray; if (typeColors.ContainsKey(type.Name)) return typeColors[type.Name]; if (generatedTypeColors.ContainsKey(type.Name)) return generatedTypeColors[type.Name]; UnityEngine.Random.InitState(type.Name.GetHashCode()); generatedTypeColors.Add(type.Name, new Color(UnityEngine.Random.value, UnityEngine.Random.value, UnityEngine.Random.value)); return generatedTypeColors[type.Name]; } } }