An easy to use Unity 3D library for creating illustrated Interactive Fiction games and more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

153 lines
6.2 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
namespace Fungus.EditorUtils
{
/// <summary>
/// Adds window that generates the require scripts to create a new FungusVariable that wraps an existing type.
///
/// These can then be used in the fungus flowcharts. It also generates a *Property command to allow Gets and Sets
/// on all the elements of that variable that Fungus Understands. The Quaternion and Matrix4x4 have been auto
/// generated and then auto formatted in visual studio and set to preview only as examples of it's use.
///
/// It can be used to help building variable wrappers for builtin Unity types or your own components or classes.
///
/// To add new types see the VariableScriptGenerator constructor.
/// </summary>
public class GenerateVariableWindow : EditorWindow
{
private VariableScriptGenerator generator = new VariableScriptGenerator();
private string userInputClassName = "";
private List<Type> typeList = new List<Type>();
public void OnGUI()
{
DrawMenuPanel();
}
private void DrawMenuPanel()
{
EditorGUI.BeginChangeCheck();
if(GUILayout.Button("Generate All from List"))
{
foreach (var item in VariableScriptGenerator.AllGeneratedVariableTypeClassNames)
{
generator.TargetType = generator.types.Where(x => string.Compare(x.Name, item, StringComparison.InvariantCultureIgnoreCase) == 0).First();
generator.Generate();
generator = new VariableScriptGenerator();
}
}
userInputClassName = EditorGUILayout.TextField("ClassName", userInputClassName);
if (EditorGUI.EndChangeCheck())
{
generator.TargetType = null;
try
{
typeList = generator.types.Where(x => string.Compare(x.Name,userInputClassName,StringComparison.InvariantCultureIgnoreCase) == 0).ToList();
}
catch (Exception)
{
}
}
try
{
int index = typeList.IndexOf(generator.TargetType);
EditorGUI.BeginChangeCheck();
index = GUILayout.SelectionGrid(index, typeList.Select(x => x.FullName).ToArray(), 1);
if (index < 0 || index > typeList.Count)
index = 0;
if (EditorGUI.EndChangeCheck() || generator.TargetType == null)
generator.TargetType = typeList[index];
}
catch (Exception)
{
generator.TargetType = null;
}
EditorGUILayout.Space();
if (generator.TargetType == null)
{
EditorGUILayout.HelpBox("Must select a type first", MessageType.Info);
}
else
{
generator.generateVariableClass = EditorGUILayout.Toggle("Generate Variable", generator.generateVariableClass);
generator.generateVariableDataClass = EditorGUILayout.Toggle("Generate Variable Data", generator.generateVariableDataClass);
generator.PreviewOnly = EditorGUILayout.Toggle("Variable List preview only", generator.PreviewOnly);
if (generator.TargetType.IsAbstract)
{
EditorGUILayout.HelpBox(generator.TargetType.FullName + " is abstract. No Variable will be generated", MessageType.Error);
generator.generateVariableClass = false;
}
if (generator.generateVariableClass)
{
if (generator.ExistingGeneratedClass != null)
{
EditorGUILayout.HelpBox("Variable Appears to already exist. Overwriting or errors may occur.", MessageType.Warning);
}
if (generator.ExistingGeneratedDrawerClass != null)
{
EditorGUILayout.HelpBox("Variable Drawer Appears to already exist. Overwriting or errors may occur.", MessageType.Warning);
}
generator.Category = EditorGUILayout.TextField("Category", generator.Category);
generator.NamespaceUsingDeclare = EditorGUILayout.TextField("NamespaceUsingDeclare", generator.NamespaceUsingDeclare);
}
EditorGUILayout.Space();
generator.generatePropertyCommand = EditorGUILayout.Toggle("Generate Property Command", generator.generatePropertyCommand);
if (generator.generatePropertyCommand)
{
generator.generateOnlyDeclaredMembers = EditorGUILayout.Toggle("Only declared members", generator.generateOnlyDeclaredMembers);
if (generator.ExistingGeneratedPropCommandClass != null)
{
EditorGUILayout.HelpBox("Property Appears to already exist. Overwriting or errors may occur.", MessageType.Warning);
}
}
EditorGUILayout.Space();
if (GUILayout.Button("Generate Now"))
{
try
{
generator.Generate();
EditorUtility.DisplayProgressBar("Generating " + userInputClassName, "Importing Scripts", 0);
AssetDatabase.Refresh();
}
catch (Exception e)
{
Debug.LogWarning(e.Message);
//throw e;
}
generator = new VariableScriptGenerator();
EditorUtility.ClearProgressBar();
userInputClassName = "";
}
}
}
[MenuItem("Tools/Fungus/Utilities/Generate Fungus Varaible")]
public static GenerateVariableWindow ShowWindow()
{
var w = GetWindow(typeof(GenerateVariableWindow), true, "Generate Fungus Varaible", true);
w.Show();
return w as GenerateVariableWindow;
}
}
}