ParnassianStudios

LocalEditorPrefs.cs

Jan 22nd, 2018
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 24.91 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using UnityEngine;
  5. using UnityEditor;
  6. using ParnassianStudios.General;
  7. using ParnassianStudios.General.Collections;
  8. using ParnassianStudios.General.Project;
  9.  
  10. namespace ParnassianStudios.GeneralEditor
  11. {
  12.     /// <summary>
  13.     /// See LocalPrefs class for more information.
  14.     /// </summary>
  15.     /// <seealso cref="LocalPrefs"/>
  16.     [CreateAssetMenu(fileName = "LocalEditorPrefs", menuName = "Local Editor Prefs")]
  17.     public sealed class LocalEditorPrefs : ScriptableObject, ISerializationCallbackReceiver
  18.     {
  19.         /// <summary>
  20.         /// The short path to the default LocalPrefs database, from EditorDefaultResources
  21.         /// </summary>
  22.         public const string PATH_DEFAULT = "ParnassianStudios/LocalEditorPrefs.asset";
  23.  
  24.         /// <summary>
  25.         /// The full path to the default LocalPrefs database, from Assets
  26.         /// </summary>
  27.         public const string PATH_DEFAULT_FULL = @"Assets/Editor Default Resources/ParnassianStudios/LocalEditorPrefs.asset";
  28.  
  29.         // self-singleton reference
  30.         private static LocalEditorPrefs _instance;
  31.         private static LocalEditorPrefs instance
  32.         {
  33.             get
  34.             {
  35.                 if (_instance == null)
  36.                 {
  37.                     _instance = (LocalEditorPrefs)EditorGUIUtility.Load(PATH_DEFAULT);
  38.  
  39.                     if (_instance == null)
  40.                         _instance = Utilities.ScriptableObjectUtil.CreateAsset<LocalEditorPrefs>(PATH_DEFAULT_FULL, false, false);
  41.  
  42.                     _instance.InitializeAllLookups();
  43.                 }
  44.                 return _instance;
  45.             }
  46.         }
  47.  
  48.  
  49.         // string-keyed collections
  50.         [SerializeField, ReorderableArray(DisallowFoldout = true, HideElementLabel = true)]
  51.         private List<StringStringKVP> _stringKeyedStrings = new List<StringStringKVP>();
  52.  
  53.         [SerializeField, ReorderableArray(DisallowFoldout = true, HideElementLabel = true)]
  54.         private List<StringIntKVP> _stringKeyedInts = new List<StringIntKVP>();
  55.  
  56.         [SerializeField, ReorderableArray(DisallowFoldout = true, HideElementLabel = true)]
  57.         private List<StringFloatKVP> _stringKeyedFloats = new List<StringFloatKVP>();
  58.  
  59.         [SerializeField, ReorderableArray(DisallowFoldout = true, HideElementLabel = true)]
  60.         private List<StringBoolKVP> _stringKeyedBools = new List<StringBoolKVP>();
  61.  
  62.         // string-keyed lookups
  63.         [System.NonSerialized]
  64.         private Dictionary<string, string> _stringKeyedStringsLookup;
  65.  
  66.         [System.NonSerialized]
  67.         private Dictionary<string, int> _stringKeyedIntsLookup;
  68.  
  69.         [System.NonSerialized]
  70.         private Dictionary<string, float> _stringKeyedFloatsLookup;
  71.  
  72.         [System.NonSerialized]
  73.         private Dictionary<string, bool> _stringKeyedBoolsLookup;
  74.  
  75.  
  76.         // int-keyed collections
  77.         [SerializeField, ReorderableArray(DisallowFoldout = true, HideElementLabel = true)]
  78.         private List<IntStringKVP> _intKeyedStrings = new List<IntStringKVP>();
  79.  
  80.         [SerializeField, ReorderableArray(DisallowFoldout = true, HideElementLabel = true)]
  81.         private List<IntIntKVP> _intKeyedInts = new List<IntIntKVP>();
  82.  
  83.         [SerializeField, ReorderableArray(DisallowFoldout = true, HideElementLabel = true)]
  84.         private List<IntFloatKVP> _intKeyedFloats = new List<IntFloatKVP>();
  85.  
  86.         [SerializeField, ReorderableArray(DisallowFoldout = true, HideElementLabel = true)]
  87.         private List<IntBoolKVP> _intKeyedBools = new List<IntBoolKVP>();
  88.  
  89.         // int-keyed lookups
  90.         [System.NonSerialized]
  91.         private Dictionary<int, string> _intKeyedStringsLookup;
  92.  
  93.         [System.NonSerialized]
  94.         private Dictionary<int, int> _intKeyedIntsLookup;
  95.  
  96.         [System.NonSerialized]
  97.         private Dictionary<int, float> _intKeyedFloatsLookup;
  98.  
  99.         [System.NonSerialized]
  100.         private Dictionary<int, bool> _intKeyedBoolsLookup;
  101.  
  102.  
  103.         // gets called whenever the object is serialized in the editor
  104.         void ISerializationCallbackReceiver.OnBeforeSerialize() { }
  105.  
  106.         // gets called whenever the object is deserialized in the editor
  107.         void ISerializationCallbackReceiver.OnAfterDeserialize()
  108.         {
  109.             InitializeAllLookups();
  110.         }
  111.  
  112.  
  113.         /// <summary>
  114.         /// Will initialize all of the lookup tables in the class. Because these are not
  115.         /// serialized by the Unity serialization system, they need to be reconstructed
  116.         /// whenever the data arrays are changed- this is the reason for both the
  117.         /// serialization callback and runtime initialization method above.
  118.         /// </summary>
  119.         private void InitializeAllLookups()
  120.         {
  121.             InitializeLookup(ref _stringKeyedStringsLookup, _stringKeyedStrings.CastList<StringStringKVP, KVP<string, string>>());
  122.             InitializeLookup(ref _stringKeyedIntsLookup, _stringKeyedInts.CastList<StringIntKVP, KVP<string, int>>());
  123.             InitializeLookup(ref _stringKeyedFloatsLookup, _stringKeyedFloats.CastList<StringFloatKVP, KVP<string, float>>());
  124.             InitializeLookup(ref _stringKeyedBoolsLookup, _stringKeyedBools.CastList<StringBoolKVP, KVP<string, bool>>());
  125.  
  126.             InitializeLookup(ref _intKeyedStringsLookup, _intKeyedStrings.CastList<IntStringKVP, KVP<int, string>>());
  127.             InitializeLookup(ref _intKeyedIntsLookup, _intKeyedInts.CastList<IntIntKVP, KVP<int, int>>());
  128.             InitializeLookup(ref _intKeyedFloatsLookup, _intKeyedFloats.CastList<IntFloatKVP, KVP<int, float>>());
  129.             InitializeLookup(ref _intKeyedBoolsLookup, _intKeyedBools.CastList<IntBoolKVP, KVP<int, bool>>());
  130.         }
  131.  
  132.         /// <summary>
  133.         /// Initializes the String-keyed lookup table.
  134.         /// </summary>
  135.         private void InitializeLookup<T1, T2>(ref Dictionary<T1, T2> lookup, IList<KVP<T1, T2>> list)
  136.         {
  137.             if (lookup == null)
  138.                 lookup = new Dictionary<T1, T2>();
  139.             else
  140.                 lookup.Clear();
  141.  
  142.             for (int i = 0; i < list.Count; i++)
  143.                 lookup[list[i].Key] = list[i].Value;
  144.         }
  145.  
  146.  
  147.         /// <summary>
  148.         /// Returns a bool indicating that the key exists in the database.
  149.         /// </summary>
  150.         public static bool HasString(string key)
  151.         {
  152.             return instance._stringKeyedStringsLookup.ContainsKey(key);
  153.         }
  154.  
  155.         /// <summary>
  156.         /// Returns a bool indicating that the key exists in the database.
  157.         /// </summary>
  158.         public static bool HasString(int key)
  159.         {
  160.             return instance._intKeyedStringsLookup.ContainsKey(key);
  161.         }
  162.  
  163.         /// <summary>
  164.         /// Returns the string stored for the given key, if any.
  165.         /// </summary>
  166.         public static string GetString(string key, string defaultValue = null)
  167.         {
  168.             if (instance._stringKeyedStringsLookup.ContainsKey(key))
  169.                 return instance._stringKeyedStringsLookup[key];
  170.  
  171.             return defaultValue;
  172.         }
  173.  
  174.         /// <summary>
  175.         /// Returns the string stored for the given key, if any.
  176.         /// </summary>
  177.         public static string GetString(int key, string defaultValue = null)
  178.         {
  179.             if (instance._intKeyedStringsLookup.ContainsKey(key))
  180.                 return instance._intKeyedStringsLookup[key];
  181.  
  182.             return defaultValue;
  183.         }
  184.  
  185.         /// <summary>
  186.         /// Sets the string value to the given key.
  187.         /// </summary>
  188.         public static void SetString(string key, string value)
  189.         {
  190.             var kvp = instance._stringKeyedStrings.FirstOrDefault(t => t.Key.Equals(key));
  191.             if (kvp != null)
  192.                 kvp.Value = value;
  193.             else
  194.                 instance._stringKeyedStrings.Add(new StringStringKVP(key, value));
  195.  
  196.             instance._stringKeyedStringsLookup[key] = value;
  197.  
  198.             Save();
  199.         }
  200.  
  201.         /// <summary>
  202.         /// Sets the string value to the given key.
  203.         /// </summary>
  204.         public static void SetString(int key, string value)
  205.         {
  206.             var kvp = instance._intKeyedStrings.FirstOrDefault(t => t.Key.Equals(key));
  207.             if (kvp != null)
  208.                 kvp.Value = value;
  209.             else
  210.                 instance._intKeyedStrings.Add(new IntStringKVP(key, value));
  211.  
  212.             instance._intKeyedStringsLookup[key] = value;
  213.  
  214.             Save();
  215.         }
  216.  
  217.         /// <summary>
  218.         /// Returns a bool indicating that the key exists in the database.
  219.         /// </summary>
  220.         public static bool HasInt(string key)
  221.         {
  222.             return instance._stringKeyedIntsLookup.ContainsKey(key);
  223.         }
  224.  
  225.         /// <summary>
  226.         /// Returns a bool indicating that the key exists in the database.
  227.         /// </summary>
  228.         public static bool HasInt(int key)
  229.         {
  230.             return instance._intKeyedIntsLookup.ContainsKey(key);
  231.         }
  232.  
  233.         /// <summary>
  234.         /// Returns the int stored for the given key, if any.
  235.         /// </summary>
  236.         public static int GetInt(string key, int defaultValue = 0)
  237.         {
  238.             if (instance._stringKeyedIntsLookup.ContainsKey(key))
  239.                 return instance._stringKeyedIntsLookup[key];
  240.  
  241.             return defaultValue;
  242.         }
  243.  
  244.         /// <summary>
  245.         /// Returns the int stored for the given key, if any.
  246.         /// </summary>
  247.         public static int GetInt(int key, int defaultValue = 0)
  248.         {
  249.             if (instance._intKeyedIntsLookup.ContainsKey(key))
  250.                 return instance._intKeyedIntsLookup[key];
  251.  
  252.             return defaultValue;
  253.         }
  254.  
  255.         /// <summary>
  256.         /// Sets the int value to the given key.
  257.         /// </summary>
  258.         public static void SetInt(string key, int value)
  259.         {
  260.             var kvp = instance._stringKeyedInts.FirstOrDefault(t => t.Key.Equals(key));
  261.             if (kvp != null)
  262.                 kvp.Value = value;
  263.             else
  264.                 instance._stringKeyedInts.Add(new StringIntKVP(key, value));
  265.  
  266.             instance._stringKeyedIntsLookup[key] = value;
  267.  
  268.             Save();
  269.         }
  270.  
  271.         /// <summary>
  272.         /// Sets the int value to the given key.
  273.         /// </summary>
  274.         public static void SetInt(int key, int value)
  275.         {
  276.             var kvp = instance._intKeyedInts.FirstOrDefault(t => t.Key.Equals(key));
  277.             if (kvp != null)
  278.                 kvp.Value = value;
  279.             else
  280.                 instance._intKeyedInts.Add(new IntIntKVP(key, value));
  281.  
  282.             instance._intKeyedIntsLookup[key] = value;
  283.  
  284.             Save();
  285.         }
  286.  
  287.         /// <summary>
  288.         /// Returns a bool indicating that the key exists in the database.
  289.         /// </summary>
  290.         public static bool HasFloat(string key)
  291.         {
  292.             return instance._stringKeyedFloatsLookup.ContainsKey(key);
  293.         }
  294.  
  295.         /// <summary>
  296.         /// Returns a bool indicating that the key exists in the database.
  297.         /// </summary>
  298.         public static bool HasFloat(int key)
  299.         {
  300.             return instance._intKeyedFloatsLookup.ContainsKey(key);
  301.         }
  302.  
  303.         /// <summary>
  304.         /// Returns the float stored for the given key, if any.
  305.         /// </summary>
  306.         public static float GetFloat(string key, float defaultValue = 0f)
  307.         {
  308.             if (instance._stringKeyedFloatsLookup.ContainsKey(key))
  309.                 return instance._stringKeyedFloatsLookup[key];
  310.  
  311.             return defaultValue;
  312.         }
  313.  
  314.         /// <summary>
  315.         /// Returns the float stored for the given key, if any.
  316.         /// </summary>
  317.         public static float GetFloat(int key, float defaultValue = 0f)
  318.         {
  319.             if (instance._intKeyedFloatsLookup.ContainsKey(key))
  320.                 return instance._intKeyedFloatsLookup[key];
  321.  
  322.             return defaultValue;
  323.         }
  324.  
  325.         /// <summary>
  326.         /// Sets the float value to the given key.
  327.         /// </summary>
  328.         public static void SetFloat(string key, float value)
  329.         {
  330.             var kvp = instance._stringKeyedFloats.FirstOrDefault(t => t.Key.Equals(key));
  331.             if (kvp != null)
  332.                 kvp.Value = value;
  333.             else
  334.                 instance._stringKeyedFloats.Add(new StringFloatKVP(key, value));
  335.  
  336.             instance._stringKeyedFloatsLookup[key] = value;
  337.  
  338.             Save();
  339.         }
  340.  
  341.         /// <summary>
  342.         /// Sets the float value to the given key.
  343.         /// </summary>
  344.         public static void SetFloat(int key, float value)
  345.         {
  346.             var kvp = instance._intKeyedFloats.FirstOrDefault(t => t.Key.Equals(key));
  347.             if (kvp != null)
  348.                 kvp.Value = value;
  349.             else
  350.                 instance._intKeyedFloats.Add(new IntFloatKVP(key, value));
  351.  
  352.             instance._intKeyedFloatsLookup[key] = value;
  353.  
  354.             Save();
  355.         }
  356.  
  357.         /// <summary>
  358.         /// Returns a bool indicating that the key exists in the database.
  359.         /// </summary>
  360.         public static bool HasBool(string key)
  361.         {
  362.             return instance._stringKeyedBoolsLookup.ContainsKey(key);
  363.         }
  364.  
  365.         /// <summary>
  366.         /// Returns a bool indicating that the key exists in the database.
  367.         /// </summary>
  368.         public static bool HasBool(int key)
  369.         {
  370.             return instance._intKeyedBoolsLookup.ContainsKey(key);
  371.         }
  372.  
  373.         /// <summary>
  374.         /// Returns the bool stored for the given key, if any.
  375.         /// </summary>
  376.         public static bool GetBool(string key, bool defaultValue = false)
  377.         {
  378.             if (instance._stringKeyedBoolsLookup.ContainsKey(key))
  379.                 return instance._stringKeyedBoolsLookup[key];
  380.  
  381.             return defaultValue;
  382.         }
  383.  
  384.         /// <summary>
  385.         /// Returns the bool stored for the given key, if any.
  386.         /// </summary>
  387.         public static bool GetBool(int key, bool defaultValue = false)
  388.         {
  389.             if (instance._intKeyedBoolsLookup.ContainsKey(key))
  390.                 return instance._intKeyedBoolsLookup[key];
  391.  
  392.             return defaultValue;
  393.         }
  394.  
  395.         /// <summary>
  396.         /// Sets the bool value to the given key.
  397.         /// </summary>
  398.         public static void SetBool(string key, bool value)
  399.         {
  400.             var kvp = instance._stringKeyedBools.FirstOrDefault(t => t.Key.Equals(key));
  401.             if (kvp != null)
  402.                 kvp.Value = value;
  403.             else
  404.                 instance._stringKeyedBools.Add(new StringBoolKVP(key, value));
  405.  
  406.             instance._stringKeyedBoolsLookup[key] = value;
  407.  
  408.             Save();
  409.         }
  410.  
  411.         /// <summary>
  412.         /// Sets the bool value to the given key.
  413.         /// </summary>
  414.         public static void SetBool(int key, bool value)
  415.         {
  416.             var kvp = instance._intKeyedBools.FirstOrDefault(t => t.Key.Equals(key));
  417.             if (kvp != null)
  418.                 kvp.Value = value;
  419.             else
  420.                 instance._intKeyedBools.Add(new IntBoolKVP(key, value));
  421.  
  422.             instance._intKeyedBoolsLookup[key] = value;
  423.  
  424.             Save();
  425.         }
  426.  
  427.         /// <summary>
  428.         /// Deletes the value stored with the given key.
  429.         /// </summary>
  430.         public static void DeleteString(string key)
  431.         {
  432.             // if this even exists
  433.             var index = instance._stringKeyedStrings.FindIndex(t => t.Key.Equals(key));
  434.             if (index > -1)
  435.             {
  436.                 // update serialized collection
  437.                 instance._stringKeyedStrings.RemoveAt(index);
  438.  
  439.                 // update lookup so we don't need to rebuild the whole thing
  440.                 if (instance._stringKeyedStringsLookup.ContainsKey(key))
  441.                     instance._stringKeyedStringsLookup.Remove(key);
  442.  
  443.                 Save();
  444.             }
  445.         }
  446.  
  447.         /// <summary>
  448.         /// Deletes the value stored with the given key.
  449.         /// </summary>
  450.         public static void DeleteString(int key)
  451.         {
  452.             // if this even exists
  453.             var index = instance._intKeyedStrings.FindIndex(t => t.Key.Equals(key));
  454.             if (index > -1)
  455.             {
  456.                 // update serialized collection
  457.                 instance._intKeyedStrings.RemoveAt(index);
  458.  
  459.                 // update lookup so we don't need to rebuild the whole thing
  460.                 if (instance._intKeyedStringsLookup.ContainsKey(key))
  461.                     instance._intKeyedStringsLookup.Remove(key);
  462.  
  463.                 Save();
  464.             }
  465.         }
  466.  
  467.         /// <summary>
  468.         /// Deletes the value stored with the given key.
  469.         /// </summary>
  470.         public static void DeleteInt(string key)
  471.         {
  472.             // if this even exists
  473.             var index = instance._stringKeyedInts.FindIndex(t => t.Key.Equals(key));
  474.             if (index > -1)
  475.             {
  476.                 // update serialized collection
  477.                 instance._stringKeyedInts.RemoveAt(index);
  478.  
  479.                 // update lookup so we don't need to rebuild the whole thing
  480.                 if (instance._stringKeyedIntsLookup.ContainsKey(key))
  481.                     instance._stringKeyedIntsLookup.Remove(key);
  482.  
  483.                 Save();
  484.             }
  485.         }
  486.  
  487.         /// <summary>
  488.         /// Deletes the value stored with the given key.
  489.         /// </summary>
  490.         public static void DeleteInt(int key)
  491.         {
  492.             // if this even exists
  493.             var index = instance._intKeyedInts.FindIndex(t => t.Key.Equals(key));
  494.             if (index > -1)
  495.             {
  496.                 // update serialized collection
  497.                 instance._intKeyedInts.RemoveAt(index);
  498.  
  499.                 // update lookup so we don't need to rebuild the whole thing
  500.                 if (instance._intKeyedIntsLookup.ContainsKey(key))
  501.                     instance._intKeyedIntsLookup.Remove(key);
  502.  
  503.                 Save();
  504.             }
  505.         }
  506.  
  507.         /// <summary>
  508.         /// Deletes the value stored with the given key.
  509.         /// </summary>
  510.         public static void DeleteFloat(string key)
  511.         {
  512.             // if this even exists
  513.             var index = instance._stringKeyedFloats.FindIndex(t => t.Key.Equals(key));
  514.             if (index > -1)
  515.             {
  516.                 // update serialized collection
  517.                 instance._stringKeyedFloats.RemoveAt(index);
  518.  
  519.                 // update lookup so we don't need to rebuild the whole thing
  520.                 if (instance._stringKeyedFloatsLookup.ContainsKey(key))
  521.                     instance._stringKeyedFloatsLookup.Remove(key);
  522.  
  523.                 Save();
  524.             }
  525.         }
  526.  
  527.         /// <summary>
  528.         /// Deletes the value stored with the given key.
  529.         /// </summary>
  530.         public static void DeleteFloat(int key)
  531.         {
  532.             // if this even exists
  533.             var index = instance._intKeyedFloats.FindIndex(t => t.Key.Equals(key));
  534.             if (index > -1)
  535.             {
  536.                 // update serialized collection
  537.                 instance._intKeyedFloats.RemoveAt(index);
  538.  
  539.                 // update lookup so we don't need to rebuild the whole thing
  540.                 if (instance._intKeyedFloatsLookup.ContainsKey(key))
  541.                     instance._intKeyedFloatsLookup.Remove(key);
  542.  
  543.                 Save();
  544.             }
  545.         }
  546.  
  547.         /// <summary>
  548.         /// Deletes the value stored with the given key.
  549.         /// </summary>
  550.         public static void DeleteBool(string key)
  551.         {
  552.             // if this even exists
  553.             var index = instance._stringKeyedBools.FindIndex(t => t.Key.Equals(key));
  554.             if (index > -1)
  555.             {
  556.                 // update serialized collection
  557.                 instance._stringKeyedBools.RemoveAt(index);
  558.  
  559.                 // update lookup so we don't need to rebuild the whole thing
  560.                 if (instance._stringKeyedBoolsLookup.ContainsKey(key))
  561.                     instance._stringKeyedBoolsLookup.Remove(key);
  562.  
  563.                 Save();
  564.             }
  565.         }
  566.  
  567.         /// <summary>
  568.         /// Deletes the value stored with the given key.
  569.         /// </summary>
  570.         public static void DeleteBool(int key)
  571.         {
  572.             // if this even exists
  573.             var index = instance._intKeyedBools.FindIndex(t => t.Key.Equals(key));
  574.             if (index > -1)
  575.             {
  576.                 // update serialized collection
  577.                 instance._intKeyedBools.RemoveAt(index);
  578.  
  579.                 // update lookup so we don't need to rebuild the whole thing
  580.                 if (instance._intKeyedBoolsLookup.ContainsKey(key))
  581.                     instance._intKeyedBoolsLookup.Remove(key);
  582.  
  583.                 Save();
  584.             }
  585.         }
  586.  
  587.         /// <summary>
  588.         /// WARNING: EXTREMELY DESTRUCTIVE METHOD. Will reset the entire prefs database,
  589.         /// including all lookup tables.
  590.         /// </summary>
  591.         public static void DeleteAll()
  592.         {
  593.             if (EditorUtility.DisplayDialog("Are you absolutely sure?", "DeleteAll is an extremely destructive method, are you sure you'd like to proceed?", "DESTROY", "Cancel"))
  594.             {
  595.                 instance._stringKeyedStrings.Clear();
  596.                 instance._stringKeyedInts.Clear();
  597.                 instance._stringKeyedFloats.Clear();
  598.                 instance._stringKeyedBools.Clear();
  599.                 instance._intKeyedStrings.Clear();
  600.                 instance._intKeyedInts.Clear();
  601.                 instance._intKeyedFloats.Clear();
  602.                 instance._intKeyedBools.Clear();
  603.  
  604.                 instance._stringKeyedStringsLookup.Clear();
  605.                 instance._stringKeyedIntsLookup.Clear();
  606.                 instance._stringKeyedFloatsLookup.Clear();
  607.                 instance._stringKeyedBoolsLookup.Clear();
  608.                 instance._intKeyedStringsLookup.Clear();
  609.                 instance._intKeyedIntsLookup.Clear();
  610.                 instance._intKeyedFloatsLookup.Clear();
  611.                 instance._intKeyedBoolsLookup.Clear();
  612.  
  613.                 Save();
  614.             }
  615.         }
  616.  
  617.         public static void Save()
  618.         {
  619.             EditorUtility.SetDirty(instance);
  620.             AssetDatabase.SaveAssets();
  621.         }
  622.  
  623.  
  624.         // this garbage is required for serializing the lists properly, because reasons
  625.         [System.Serializable]
  626.         private class StringStringKVP : KVP<string, string>
  627.         {
  628.             public StringStringKVP(string key, string value)
  629.                 : base(key, value) { }
  630.         }
  631.         [System.Serializable]
  632.         private class StringIntKVP : KVP<string, int>
  633.         {
  634.             public StringIntKVP(string key, int value)
  635.                 : base(key, value) { }
  636.         }
  637.         [System.Serializable]
  638.         private class StringFloatKVP : KVP<string, float>
  639.         {
  640.             public StringFloatKVP(string key, float value)
  641.                 : base(key, value) { }
  642.         }
  643.         [System.Serializable]
  644.         private class StringBoolKVP : KVP<string, bool>
  645.         {
  646.             public StringBoolKVP(string key, bool value)
  647.                 : base(key, value) { }
  648.         }
  649.         [System.Serializable]
  650.         private class IntStringKVP : KVP<int, string>
  651.         {
  652.             public IntStringKVP(int key, string value)
  653.                 : base(key, value) { }
  654.         }
  655.         [System.Serializable]
  656.         private class IntIntKVP : KVP<int, int>
  657.         {
  658.             public IntIntKVP(int key, int value)
  659.                 : base(key, value) { }
  660.         }
  661.         [System.Serializable]
  662.         private class IntFloatKVP : KVP<int, float>
  663.         {
  664.             public IntFloatKVP(int key, float value)
  665.                 : base(key, value) { }
  666.         }
  667.         [System.Serializable]
  668.         private class IntBoolKVP : KVP<int, bool>
  669.         {
  670.             public IntBoolKVP(int key, bool value)
  671.                 : base(key, value) { }
  672.         }
  673.  
  674.         /// <summary>
  675.         /// Base "KeyValuePair" serializable class for prefs collections
  676.         /// </summary>
  677.         [System.Serializable]
  678.         private class KVP<T1, T2> : System.IEquatable<KVP<T1, T2>>
  679.         {
  680.             public T1 Key;
  681.             public T2 Value;
  682.  
  683.  
  684.             public KVP(T1 key, T2 value)
  685.             {
  686.                 this.Key = key;
  687.                 this.Value = value;
  688.             }
  689.  
  690.  
  691.             public override int GetHashCode()
  692.             {
  693.                 unchecked { return Key.GetHashCode() + Value.GetHashCode(); }
  694.             }
  695.  
  696.             public override bool Equals(object obj)
  697.             {
  698.                 if (typeof(KVP<T1, T2>).IsAssignableFrom(obj.GetType()))
  699.                     return this.Equals((KVP<T1, T2>)obj);
  700.  
  701.                 return false;
  702.             }
  703.  
  704.             public bool Equals(KVP<T1, T2> other)
  705.             {
  706.                 return Key.Equals(other.Key) && Value.Equals(other.Value);
  707.             }
  708.         }
  709.     }
  710. }
Advertisement
Add Comment
Please, Sign In to add comment