/// <summary> /// 释放资源 /// 并不释放源文件。可以在需要的时候重新加载 /// </summary> public void Release() { foreach (var item in datas) { item.Release(); } datas.Clear(); stackData = null; InFoldout = false; CurrentFoldout = true; }
private void SearchNext() { var doc = Docs[CurrentDocName]; var found = searched; bool located = found == null; foreach (var data in doc.datas) { var cur = data; if (located) { if (Search.GeneralValid(cur.Data)) { found = cur; break; } foreach (var sub in cur.subdatas) { if (Search.GeneralValid(sub.Data)) { found = cur; goto BK; } } } else { located = cur == searched; if (!located) { foreach (var sub in cur.subdatas) { located = sub == searched; } } } } BK: searched = found == searched ? null : found; if (searched != null) { this.v = searched.drawRect.position.DeltaY(-position.height / 2); } }
private static void DrawData(MarkDownData data, Action <string> PageChange, Action <string> DocChange, Action Repaint) { var doc = data.doc; switch (data.type) { case KeyType.foldin: data.doc.InFoldout = true; data.doc.CurrentFoldout = OnGUIUtility.Foldout(data.keyValue, doc.Styles.Foldout, GUILayout.ExpandWidth(true), GUILayout.Height(EditorGUIUtility.singleLineHeight * 1.3f)); // OnGUIUtility.EditorPrefsFoldoutGroup(data.keyValue); OnGUIUtility.Layout.IndentBegin(2); break; case KeyType.foldout: data.doc.InFoldout = false; OnGUIUtility.Layout.IndentEnd(2); break; } if (data.doc.InFoldout && !data.doc.CurrentFoldout) { return; } switch (data.type) { case KeyType.text: Rect position = GUILayoutUtility.GetRect(EditorGUIUtility.TrTextContent(data.Data), doc.Styles.Font, GUILayout.ExpandHeight(true)); OnGUIUtility.Layout.IndentDisable(); EditorGUI.SelectableLabel(position, data.Data, doc.Styles.Font); OnGUIUtility.Layout.IndentEnable(); break; case KeyType.code: OnGUIUtility.Vision.BeginBackGroundColor(ColorPalette.Get(doc.ColorSetting, "Area_BackGround", EditorGUIUtility.isProSkin ? Color.white : Color.black)); EditorGUILayout.TextArea(data.Data, doc.Styles.Area); OnGUIUtility.Vision.EndBackGroundColor(); break; case KeyType.qa: OnGUIUtility.Vision.BeginBackGroundColor(ColorPalette.Get(doc.ColorSetting, "Area_BackGround", EditorGUIUtility.isProSkin ? Color.white : Color.black)); EditorGUILayout.SelectableLabel(RichTextHelper.Color(data.keyValue, Color.green), doc.Styles.Font, GUILayout.ExpandWidth(true), GUILayout.Height(EditorGUIUtility.singleLineHeight)); EditorGUILayout.TextArea(data.Data, doc.Styles.Area); OnGUIUtility.Vision.EndBackGroundColor(); break; case KeyType.font: GUIStyle fontstyle = data.keyValue == "B" ? doc.Styles.FontB : data.keyValue == "I" ? doc.Styles.FontI : data.keyValue == "BI" ? doc.Styles.FontBI : doc.Styles.Font; EditorGUILayout.SelectableLabel(data.Data, fontstyle, GUILayout.Height(EditorGUIUtility.singleLineHeight)); break; case KeyType.title: int size = int.Parse(data.keyValue); GUIStyle style = EditorStyles.boldLabel; switch (size) { case 1: style = doc.Styles.Title3; break; case 2: style = doc.Styles.Title2; break; case 3: style = doc.Styles.Title1; break; } EditorGUILayout.SelectableLabel(data.Data, style, GUILayout.Height(EditorGUIUtility.singleLineHeight * size * 1.3f), GUILayout.MinWidth(500)); if (size == 3) { OnGUIUtility.Layout.Line(); } break; case KeyType.link: if (GUILayout.Button(data.Data, doc.Styles.Link)) { EditorGUIUtility.systemCopyBuffer = data.Data; Application.OpenURL(data.Data); } if (Event.current.type == EventType.Repaint) { var last = GUILayoutUtility.GetLastRect(); EditorGUIUtility.AddCursorRect(last, MouseCursor.Link); } break; case KeyType.image: if (data.texture) { int w = data.texture.width; int h = data.texture.height; if (w > 1024) { h = (int)((float)h / w * 1024f); w = 1024; } if (h > 1024) { w = (int)((float)w / h * 1024f); h = 1024; } GUILayout.Box("", GUILayout.Width(w), GUILayout.Height(h)); if (Event.current.type == EventType.Repaint) { Rect rect = GUILayoutUtility.GetLastRect(); GUI.DrawTexture(rect, data.texture); } } else if (data.gifDrawer != null && Repaint != null) { data.gifDrawer.OnGUI(Repaint); } break; case KeyType.separator: OnGUIUtility.Layout.Line(); break; case KeyType.page: if (GUILayout.Button("▶" + data.Data, doc.Styles.Page, GUILayout.ExpandWidth(false), GUILayout.Height(EditorGUIUtility.singleLineHeight * 1.3f))) { PageChange?.Invoke(data.Data); } break; case KeyType.doc: if (GUILayout.Button("▶" + data.Data, doc.Styles.Doc, GUILayout.ExpandWidth(false), GUILayout.Height(EditorGUIUtility.singleLineHeight * 1.3f))) { DocChange?.Invoke(data.Data); } break; case KeyType.table: GUILayout.BeginHorizontal(); foreach (var item in data.subdatas) { //OnGUIUtility.Debug.ButtonTest(); DrawData(item, PageChange, DocChange, Repaint); //OnGUIUtility.Debug.DrawLastRect(Color.white); } GUILayout.EndHorizontal(); break; } }
public override void OnGUI() { base.OnGUI(); //CheckDoc MarkDownDoc doc = null; if (string.IsNullOrEmpty(CurrentDocName)) { if (Docs.TryGetValue("Index", out doc)) { CurrentDocName = "Index"; } } else { doc = Docs[CurrentDocName]; if (Event.current.type == EventType.Layout) { if (DocPages.Count > 0) { var oldDoc = Docs[DocPages.Peek()]; if (oldDoc.datas.Count > 0) { oldDoc.Release(); } } if (doc.datas.Count == 0) { doc.Load(); } else { if (AutoRefresh && doc.RawDoc.text != doc.rawDoc) { doc.Release(); doc.rawDoc = doc.RawDoc.text; doc.Load(); } } } } //DrawDoc if (doc != null) { //ToolBar ToolBar(); //DocContent EditorGUI.DrawRect(DrawRect, ColorPalette.Get(ColorSettings, "BackGround", Color.white)); v = GUILayout.BeginScrollView(v); { if (searched != null) { if (Event.current.type == EventType.Repaint) { EditorGUI.DrawRect(searched.drawRect, ColorPalette.Get(ColorSettings, "HightLight", Color.white)); } if (Search.Current.IsNullOrEmpty()) { searched = null; } } EditorMarkDownDrawer.DrawDoc(doc, changePage, changeDoc, window.Repaint); } GUILayout.EndScrollView(); if (Event.current.type == EventType.Repaint) { DrawRect = GUILayoutUtility.GetLastRect(); } } else { EditorGUILayout.SelectableLabel("Can't find Index.md Document at :" + PathTools.RelativeAssetPath(this.GetType(), RelativePath)); EditorGUILayout.SelectableLabel("First you should create default page"); if (GUILayout.Button("CreateReadMe")) { if (EditorUtility.DisplayDialog("CreateIndex.md", "After create .md file,you have to reopen this editorwindow.", "OK", "Cancel")) { //Template string[] assets = AssetDatabase.FindAssets("TMP_ReadMe"); TextAsset text = AssetDatabase.LoadAssetAtPath <TextAsset>(AssetDatabase.GUIDToAssetPath(assets[0])); // var DirRoot = PathTools.RelativeAssetPath(this.GetType(), RelativePath); var FileDirRoot = Directory.GetParent(DirRoot).FullName + @"\" + Path.GetFileName(DirRoot); if (!Directory.Exists(FileDirRoot)) { Directory.CreateDirectory(FileDirRoot); } FileTools.WriteAllText(FileDirRoot + "/Index.md", text.text); AssetDatabase.Refresh(); window.Close(); } } } //PingDocScript if (EditScript) { GUILayout.BeginHorizontal(); { AutoRefresh = GUILayout.Toggle(AutoRefresh, "自动刷新"); OnGUIUtility.ScriptField("Editor Script", this.GetType()); } GUILayout.EndHorizontal(); } }
public void Load(string RawString, MarkDownDoc doc) { this.doc = doc; if (RawString.IsNullOrEmpty()) { return; } if (RawString.Replace(Environment.NewLine, "") == "***") { this.type = KeyType.separator; } else if (RawString[0] == '*') { this.type = KeyType.font; if (RawString.IndexOf("***") == 0) { //斜体加粗 keyValue = "BI"; Data = RawString.Substring(3, RawString.Length - 6); } else if (RawString.IndexOf("**") == 0) { //加粗 keyValue = "B"; Data = RawString.Substring(2, RawString.Length - 4); } else if (RawString.IndexOf("*") == 0) { //斜体 keyValue = "I"; Data = RawString.Substring(1, RawString.Length - 2); } } else if (RawString[0] == '#') { this.type = KeyType.title; if (RawString.IndexOf("###") == 0) { //1号标题 keyValue = "1"; Data = RawString.Substring(3, RawString.Length - 3); } else if (RawString.IndexOf("##") == 0) { //3级标题 keyValue = "2"; Data = RawString.Substring(2, RawString.Length - 2); } else if (RawString.IndexOf("#") == 0) { //3级标题 keyValue = "3"; Data = RawString.Substring(1, RawString.Length - 1); } } else if (RawString[0] == '!') { this.type = KeyType.image; int start = RawString.IndexOf("(") + 1; int end = RawString.LastIndexOf(")"); Data = RawString.Substring(start, RawString.Length - start - (RawString.Length - end)); var ImgAssetPath = doc.AssetDir + "/" + Data; if (Path.GetExtension(ImgAssetPath) == ".gif") { gifDrawer = new GUIGifDrawer(); gifDrawer.LoadGIF(PathTools.Asset2File(ImgAssetPath)); if (EditorUserSettings.GetConfigValue("DocAutoPlayGif") != "true") { gifDrawer.Controller = true; } gifDrawer.Play(); } else { if (PathTools.IsAssetPath(ImgAssetPath)) { this.texture = AssetDatabase.LoadAssetAtPath(ImgAssetPath, typeof(Texture2D)) as Texture2D; } else if (File.Exists(ImgAssetPath)) { byte[] img = File.ReadAllBytes(ImgAssetPath); this.texture = new Texture2D(1024, 1024); texture.LoadImage(img); } } } else if (RawString[0] == '(') { this.type = KeyType.link; int start = RawString.IndexOf("(") + 1; int end = RawString.LastIndexOf(")"); Data = RawString.Substring(start, RawString.Length - start - (RawString.Length - end)); } else if (RawString.IndexOf(">>") == 0) { this.type = KeyType.doc; Data = RawString.Remove(0, 2); } else if (RawString[0] == '>') { this.type = KeyType.page; Data = RawString.Remove(0, 1); } else if (RawString[0] == '|') { this.type = KeyType.table; string[] datas = RawString.Split('|'); for (int i = 1; i < datas.Length; i++) { if (datas[i] == "--:") { this.type = KeyType.separator; break; } MarkDownData subdata = new MarkDownData(); subdata.Load(datas[i], this.doc); this.subdatas.Add(subdata); } } else if (RawString.IndexOf("```") == 0) { this.type = KeyType.code; keyValue = RawString.Substring(3, RawString.Length - 3); } else if (RawString.IndexOf("QA") == 0) { this.type = KeyType.qa; keyValue = RawString.Substring(2, RawString.Length - 2); } else if (RawString.IndexOf("/{") == 0) { this.type = KeyType.foldin; keyValue = RawString.Substring(2, RawString.Length - 2); } else if (RawString.IndexOf("/}") == 0) { this.type = KeyType.foldout; keyValue = RawString.Substring(2, RawString.Length - 2); } else { Data = RawString; } }
/// <summary> /// 加载并生成数据 /// </summary> public void Load() { if (datas.Count > 0) { Release(); } string[] lines = rawDoc.Split(Environment.NewLine.ToCharArray()); foreach (var line in lines) { if (string.IsNullOrEmpty(line)) { continue; } MarkDownData data = new MarkDownData() { doc = this }; KeyType stackKey = stackData == null ? KeyType.text : stackData.type; switch (stackKey) { case KeyType.code: { data.Load(line, this); if (data.type == KeyType.code) { stackData = null; } else { //补上换行符 stackData.Data += data.Data + Environment.NewLine; } } break; case KeyType.qa: { data.Load(line, this); if (data.type == KeyType.qa) { stackData = null; } else { //补上换行符 stackData.Data += data.Data + Environment.NewLine; } } break; default: data.Load(line, this); datas.Add(data); switch (data.type) { case KeyType.code: stackData = data; break; case KeyType.qa: stackData = data; break; } break; } } }