#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
namespace ScriptableObjectArchitecture
{
///
/// An editor class for managing project and user preferences for the SOArchitecture library. This is kept
/// in the runtime assembly for the purpose of enabling editor-only additional features when playing such as
/// gizmos and debugging.
///
public static class SOArchitecturePreferences
{
///
/// Returns true if debug features should be enabled, otherwise false.
///
public static bool IsDebugEnabled
{
get { return GetBoolPref(ENABLE_DEBUG_PREF, ENABLE_DEBUG_DEFAULT); }
}
///
/// Returns true if Gizmos should be enabled, otherwise false.
///
public static bool AreGizmosEnabled
{
get { return GetBoolPref(DRAW_EVENT_GIZMOS_PREF, DRAW_EVENT_GIZMOS_DEFAULT); }
}
// UI
private const string PREFERENCES_TITLE_PATH = "Preferences/SOArchitecture";
private const string PROJECT_TITLE_PATH = "Project/SOArchitecture";
private const string USER_PREFERENCES_HEADER = "User Preferences";
private const string PROJECT_REFERENCES_HEADER = "Project Preferences";
private const string CODE_GEN_DIRECTORY_LABEL = "Code Generation Output Directory";
private const string CODE_GEN_DIRECTORY_DESCRIPTION
= "The directory where the output of code generation will write to.";
private const string ALLOW_OVERWRITE_LABEL = "Allow Code Generation to Overwrite";
private const string ALLOW_OVERWRITE_DESCRIPTION =
"Allow newly generated code files to overwrite existing ones.";
private const string ASSET_MENU_ORDER_LABEL = "Create Asset Menu Order";
private const string ASSET_MENU_ORDER_DESCRIPTION =
"This determines the order in which the CreateAsset Context Menu will be placed into.";
private static readonly GUILayoutOption MAX_WIDTH;
#if UNITY_2018_3_OR_NEWER
// Searchable Fields
private static readonly string[] KEYWORDS =
{
"Scriptable",
"Architecture"
};
#endif
// User Editor Preferences
private const string DRAW_EVENT_GIZMOS_PREF = "SOArchitecture.DrawEventGizmoos";
private const string ENABLE_DEBUG_PREF = "SOArchitecture.EnableDebug";
private const bool DRAW_EVENT_GIZMOS_DEFAULT = true;
private const bool ENABLE_DEBUG_DEFAULT = true;
static SOArchitecturePreferences()
{
MAX_WIDTH = GUILayout.MaxWidth(200f);
}
#if UNITY_2018_3_OR_NEWER
[SettingsProvider]
private static SettingsProvider CreateProjectPreferenceSettingsProvider()
{
return new SettingsProvider(PROJECT_TITLE_PATH, SettingsScope.Project)
{
guiHandler = DrawProjectGUI,
keywords = KEYWORDS
};
}
[SettingsProvider]
private static SettingsProvider CreatePersonalPreferenceSettingsProvider()
{
return new SettingsProvider(PREFERENCES_TITLE_PATH, SettingsScope.User)
{
guiHandler = DrawPersonalPrefsGUI,
keywords = KEYWORDS
};
}
#endif
private static void DrawAllGUI()
{
DrawProjectGUI();
DrawPersonalPrefsGUI();
}
private static void DrawProjectGUI(string value = "")
{
EditorGUILayout.LabelField(PROJECT_REFERENCES_HEADER, EditorStyles.boldLabel);
var settings = SOArchitecture_Settings.Instance;
GUI.changed = false;
// Code Generation Target Directory
EditorGUILayout.HelpBox(CODE_GEN_DIRECTORY_DESCRIPTION, MessageType.Info);
using (new EditorGUILayout.HorizontalScope())
{
EditorGUILayout.LabelField(new GUIContent(CODE_GEN_DIRECTORY_LABEL), MAX_WIDTH);
var directory = EditorGUILayout.TextField(settings.CodeGenerationTargetDirectory);
settings.CodeGenerationTargetDirectory = directory;
}
// Code Generation Allow Overwrite
EditorGUILayout.HelpBox(ALLOW_OVERWRITE_DESCRIPTION, MessageType.Info);
using (new EditorGUILayout.HorizontalScope())
{
EditorGUILayout.LabelField(new GUIContent(ALLOW_OVERWRITE_LABEL), MAX_WIDTH);
var newOverwrite = EditorGUILayout.Toggle(settings.CodeGenerationAllowOverwrite);
settings.CodeGenerationAllowOverwrite = newOverwrite;
}
// Default Create Asset Menu Order
EditorGUILayout.HelpBox(ASSET_MENU_ORDER_DESCRIPTION, MessageType.Info);
using (new EditorGUILayout.HorizontalScope())
{
EditorGUILayout.LabelField(ASSET_MENU_ORDER_LABEL, MAX_WIDTH);
var newMenuOrder = EditorGUILayout.IntField(settings.DefaultCreateAssetMenuOrder);
settings.DefaultCreateAssetMenuOrder = newMenuOrder;
}
if (GUI.changed)
{
EditorUtility.SetDirty(settings);
}
}
private static void DrawPersonalPrefsGUI(string value = "")
{
EditorGUILayout.LabelField(USER_PREFERENCES_HEADER, EditorStyles.boldLabel);
// Draw Event Gizmo
var drawEventPref = GetBoolPref(DRAW_EVENT_GIZMOS_PREF, DRAW_EVENT_GIZMOS_DEFAULT);
GUI.changed = false;
drawEventPref = EditorGUILayout.Toggle("Draw Event Gizmo", drawEventPref);
if (GUI.changed)
{
EditorPrefs.SetBool(DRAW_EVENT_GIZMOS_PREF, drawEventPref);
}
// Enable Debug
EditorGUILayout.HelpBox("This will enable debug features for troubleshooting purposes such as " +
"game events collecting stack traces. This will decrease performance " +
"in-editor.", MessageType.Info);
var enableDebugPref = GetBoolPref(ENABLE_DEBUG_PREF, ENABLE_DEBUG_DEFAULT);
GUI.changed = false;
enableDebugPref = EditorGUILayout.Toggle("Enable Debug", enableDebugPref);
if (GUI.changed)
{
EditorPrefs.SetBool(ENABLE_DEBUG_PREF, enableDebugPref);
}
}
///
/// Returns the current bool preference; if none exists, the default is set and returned.
///
///
///
///
private static bool GetBoolPref(string key, bool defaultValue)
{
if (!EditorPrefs.HasKey(key))
{
EditorPrefs.SetBool(key, defaultValue);
}
return EditorPrefs.GetBool(key);
}
}
}
#endif