using UnityEngine;
using UnityEditor;
using System.IO;
using UnityEngine.UIElements;
[CustomEditor(typeof(Readme))]
[InitializeOnLoad]
sealed class ReadmeEditor : Editor
{
const string k_ShowedReadmeSessionStateName = "ReadmeEditor.showedReadme";
const string k_ReadmeSourceDirectory = "Assets/TutorialInfo";
static ReadmeEditor()
=> EditorApplication.delayCall += SelectReadmeAutomatically;
static void SelectReadmeAutomatically()
{
if (!SessionState.GetBool(k_ShowedReadmeSessionStateName, false))
{
var readme = SelectReadme();
SessionState.SetBool(k_ShowedReadmeSessionStateName, true);
if (readme && !readme.loadedLayout)
{
EditorUtility.LoadWindowLayout(Path.Combine(Application.dataPath, "TutorialInfo/Layout.wlt"));
readme.loadedLayout = true;
}
}
}
static Readme SelectReadme()
{
var ids = AssetDatabase.FindAssets("Readme t:Readme");
if (ids.Length != 1)
{
Debug.Log("Couldn't find a readme");
return null;
}
var readmeObject = AssetDatabase.LoadMainAssetAtPath(AssetDatabase.GUIDToAssetPath(ids[0]));
Selection.objects = new UnityEngine.Object[] { readmeObject };
return (Readme)readmeObject;
}
void RemoveTutorial()
{
if (EditorUtility.DisplayDialog("Remove Readme Assets",
$"All contents under {k_ReadmeSourceDirectory} will be removed, are you sure you want to proceed?",
"Proceed",
"Cancel"))
{
if (Directory.Exists(k_ReadmeSourceDirectory))
{
FileUtil.DeleteFileOrDirectory(k_ReadmeSourceDirectory);
FileUtil.DeleteFileOrDirectory(k_ReadmeSourceDirectory + ".meta");
}
else
{
Debug.Log($"Could not find the Readme folder at {k_ReadmeSourceDirectory}");
}
var readmeAsset = SelectReadme();
if (readmeAsset != null)
{
var path = AssetDatabase.GetAssetPath(readmeAsset);
FileUtil.DeleteFileOrDirectory(path + ".meta");
FileUtil.DeleteFileOrDirectory(path);
}
AssetDatabase.Refresh();
}
}
//Remove ImGUI
protected sealed override void OnHeaderGUI() { }
public sealed override void OnInspectorGUI() { }
public override VisualElement CreateInspectorGUI()
{
var readme = (Readme)target;
VisualElement root = new();
root.styleSheets.Add(readme.commonStyle);
root.styleSheets.Add(EditorGUIUtility.isProSkin ? readme.darkStyle : readme.lightStyle);
VisualElement ChainWithClass(VisualElement created, string className)
{
created.AddToClassList(className);
return created;
}
//Header
VisualElement title = new();
title.AddToClassList("title");
title.Add(ChainWithClass(new Image() { image = readme.icon }, "title__icon"));
title.Add(ChainWithClass(new Label(readme.title), "title__text"));
root.Add(title);
//Content
foreach (var section in readme.sections)
{
VisualElement part = new();
part.AddToClassList("section");
if (!string.IsNullOrEmpty(section.heading))
part.Add(ChainWithClass(new Label(section.heading), "section__header"));
if (!string.IsNullOrEmpty(section.text))
part.Add(ChainWithClass(new Label(section.text), "section__body"));
if (!string.IsNullOrEmpty(section.linkText))
{
var link = ChainWithClass(new Label(section.linkText), "section__link");
link.RegisterCallback(evt => Application.OpenURL(section.url));
part.Add(link);
}
root.Add(part);
}
var button = new Button(RemoveTutorial) { text = "Remove Readme Assets" };
button.AddToClassList("remove-readme-button");
root.Add(button);
return root;
}
}