예제 #1
0
 /// <summary>
 /// 释放资源
 /// 并不释放源文件。可以在需要的时候重新加载
 /// </summary>
 public void Release()
 {
     foreach (var item in datas)
     {
         item.Release();
     }
     datas.Clear();
     stackData      = null;
     InFoldout      = false;
     CurrentFoldout = true;
 }
예제 #2
0
        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);
            }
        }
예제 #3
0
        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;
            }
        }
예제 #4
0
        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();
            }
        }
예제 #5
0
 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;
     }
 }
예제 #6
0
        /// <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;
                }
            }
        }