Guest User

GlobalDefinesWizard.cs

a guest
Oct 10th, 2016
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.69 KB | None | 0 0
  1. using UnityEngine;
  2. using UnityEditor;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.IO;
  6. using System.Runtime.Serialization;
  7. using System.Runtime.Serialization.Formatters.Binary;
  8.  
  9.  
  10. public class GlobalDefinesWizard : ScriptableWizard
  11. {
  12.     [System.Serializable]
  13.     public class GlobalDefine : ISerializable
  14.     {
  15.         public string define;
  16.         public bool enabled;
  17.  
  18.  
  19.         public GlobalDefine()
  20.         { }
  21.  
  22.  
  23.         protected GlobalDefine(SerializationInfo info, StreamingContext context)
  24.         {
  25.             define = info.GetString("define");
  26.             enabled = info.GetBoolean("enabled");
  27.         }
  28.  
  29.  
  30.         public void GetObjectData(SerializationInfo info, StreamingContext context)
  31.         {
  32.             info.AddValue("define", define);
  33.             info.AddValue("enabled", enabled);
  34.         }
  35.  
  36.     }
  37.  
  38.     private const string _prefsKey = "kGlobalDefines";
  39.     public List<GlobalDefine> _globalDefines = new List<GlobalDefine>();
  40.  
  41.  
  42.     [MenuItem("Global Defines/Edit Global Defines")]
  43.     static void createWizardFromMenu()
  44.     {
  45.         var helper = ScriptableWizard.DisplayWizard<GlobalDefinesWizard>("Global Defines Manager", "Save", "Cancel");
  46.         helper.minSize = new Vector2(500, 300);
  47.         helper.maxSize = new Vector2(500, 300);
  48.  
  49.         // load up the defines
  50.         if (EditorPrefs.HasKey(_prefsKey))
  51.         {
  52.             var data = EditorPrefs.GetString(_prefsKey);
  53.             var bytes = System.Convert.FromBase64String(data);
  54.             var stream = new MemoryStream(bytes);
  55.  
  56.             var formatter = new BinaryFormatter();
  57.             helper._globalDefines = (List<GlobalDefine>)formatter.Deserialize(stream);
  58.         }
  59.     }
  60.  
  61.  
  62.     void OnGUI()
  63.     {
  64.         var toRemove = new List<GlobalDefine>();
  65.  
  66.         foreach (var define in _globalDefines)
  67.         {
  68.             if (defineEditor(define))
  69.                 toRemove.Add(define);
  70.         }
  71.  
  72.         foreach (var define in toRemove)
  73.             _globalDefines.Remove(define);
  74.  
  75.         if (GUILayout.Button("Add Define"))
  76.         {
  77.             var d = new GlobalDefine();
  78.             d.define = "NEW_DEFINE";
  79.             d.enabled = false;
  80.             _globalDefines.Add(d);
  81.         }
  82.         GUILayout.Space(40);
  83.  
  84.         if (GUILayout.Button("Save"))
  85.         {
  86.             save();
  87.             Close();
  88.         }
  89.     }
  90.  
  91.  
  92.     private void save()
  93.     {
  94.         // nothing to save means delete everything
  95.         if (_globalDefines.Count == 0)
  96.         {
  97.             deleteFiles();
  98.  
  99.             EditorPrefs.DeleteKey(_prefsKey);
  100.             Close();
  101.             return;
  102.         }
  103.  
  104.         // save some stuff, first to prefs then to disk
  105.         var formatter = new BinaryFormatter();
  106.         using (var stream = new MemoryStream())
  107.         {
  108.             formatter.Serialize(stream, _globalDefines);
  109.             var data = System.Convert.ToBase64String(stream.ToArray());
  110.             stream.Close();
  111.  
  112.             EditorPrefs.SetString(_prefsKey, data);
  113.         }
  114.  
  115.         // what shall we write to disk?
  116.         var toDisk = _globalDefines.Where(d => d.enabled).Select(d => d.define).ToArray();
  117.         if (toDisk.Length > 0)
  118.         {
  119.             var builder = new System.Text.StringBuilder("-define:");
  120.             for (var i = 0; i < toDisk.Length; i++)
  121.             {
  122.                 if (i < toDisk.Length - 1)
  123.                     builder.AppendFormat("{0};", toDisk[i]);
  124.                 else
  125.                     builder.Append(toDisk[i]);
  126.             }
  127.  
  128.             writeFiles(builder.ToString());
  129.  
  130.             AssetDatabase.Refresh();
  131.             reimportSomethingToForceRecompile();
  132.         }
  133.         else
  134.         {
  135.             // nothing enabled to save, kill the files
  136.             deleteFiles();
  137.         }
  138.     }
  139.  
  140.  
  141.     private void reimportSomethingToForceRecompile()
  142.     {
  143.         var dataPathDir = new DirectoryInfo(Application.dataPath);
  144.         var dataPathUri = new System.Uri(Application.dataPath);
  145.         foreach (var file in dataPathDir.GetFiles("GlobalDefinesWizard.cs", SearchOption.AllDirectories))
  146.         {
  147.             var relativeUri = dataPathUri.MakeRelativeUri(new System.Uri(file.FullName));
  148.             var relativePath = System.Uri.UnescapeDataString(relativeUri.ToString());
  149.             AssetDatabase.ImportAsset(relativePath, ImportAssetOptions.ForceUpdate);
  150.         }
  151.     }
  152.  
  153.  
  154.     private void deleteFiles()
  155.     {
  156.         var smcsFile = Path.Combine(Application.dataPath, "smcs.rsp");
  157.         var gmcsFile = Path.Combine(Application.dataPath, "gmcs.rsp");
  158.  
  159.         if (File.Exists(smcsFile))
  160.             File.Delete(smcsFile);
  161.  
  162.         if (File.Exists(gmcsFile))
  163.             File.Delete(gmcsFile);
  164.     }
  165.  
  166.  
  167.     private void writeFiles(string data)
  168.     {
  169.         var smcsFile = Path.Combine(Application.dataPath, "smcs.rsp");
  170.         var gmcsFile = Path.Combine(Application.dataPath, "gmcs.rsp");
  171.  
  172.         // -define:debug;poop
  173.         File.WriteAllText(smcsFile, data);
  174.         File.WriteAllText(gmcsFile, data);
  175.     }
  176.  
  177.  
  178.     private bool defineEditor(GlobalDefine define)
  179.     {
  180.         EditorGUILayout.BeginHorizontal();
  181.  
  182.         define.define = EditorGUILayout.TextField(define.define);
  183.         define.enabled = EditorGUILayout.Toggle(define.enabled);
  184.  
  185.         var remove = false;
  186.         if (GUILayout.Button("Remove"))
  187.             remove = true;
  188.  
  189.         EditorGUILayout.EndHorizontal();
  190.  
  191.         return remove;
  192.     }
  193.  
  194.  
  195.     // Called when the 'save' button is pressed
  196.     void OnWizardCreate()
  197.     {
  198.         // .Net 2.0 Subset: smcs.rsp
  199.         // .Net 2.0: gmcs.rsp
  200.         // -define:debug;poop
  201.     }
  202.  
  203.  
  204.     void OnWizardOtherButton()
  205.     {
  206.         this.Close();
  207.     }
  208.  
  209. }
Add Comment
Please, Sign In to add comment