private void ShowAnimationCell(SpriteInfoGroup group, SpriteInfo info)
        {
            EditorGUILayout.ObjectField("", info.sprite, typeof(Sprite), false, GUILayout.Width(80));

            GUILayout.BeginVertical();

            GUI.enabled = false;
            GUILayout.Label("Name:" + group.tag, GUILayout.Width(200));
            GUI.enabled = true;

            if (GUILayout.Button("Play", GUILayout.Width(80)))
            {
                animations[group] = (float)EditorApplication.timeSinceStartup;
            }

            if (GUILayout.Button("Stop", GUILayout.Width(80)))
            {
                animations.Remove(group);
            }
            GUILayout.EndVertical();
        }
        private void ShowCell(SpriteInfo info)
        {
            GUILayout.BeginVertical(info.sprite.name, "window");

            EditorGUILayout.ObjectField("", info.sprite, typeof(Sprite), false, GUILayout.Width(80));

            GUILayout.Space(1);

            GUI.enabled = false;

            EditorGUILayout.TextField("Name:", info.sprite.name);
            EditorGUILayout.Vector2Field("Pivot:", info.sprite.pivot);
            EditorGUILayout.RectField("Rect:", info.sprite.rect);

            for (int m = 0; m < info.uv.Length; m++)
            {
                EditorGUILayout.Vector2Field("UV" + m + ":", info.uv[m]);
            }

            GUI.enabled = true;

            GUILayout.EndVertical();
        }
        void PlayAnimation()
        {
            EmojiTools.BeginSample("Emoji_GroupAnimation");
            if (alltexts != null)
            {
                if (_time == null)
                {
                    _time = Time.timeSinceLevelLoad;
                }
                else
                {
                    float deltatime = Time.timeSinceLevelLoad - _time.Value;

                    int framecnt = Mathf.RoundToInt(deltatime * Speed);
                    if (framecnt > 0)
                    {
                        List <string> joblist = ListPool <string> .Get();

                        for (int i = 0; i < alltexts.Count; ++i)
                        {
                            InlineText       text      = alltexts[i];
                            List <IFillData> emojidata = text.PopEmojiData();
                            if (emojidata != null && emojidata.Count > 0 && allatlas != null && allatlas.Count > 0)
                            {
                                for (int j = 0; j < emojidata.Count; ++j)
                                {
                                    IFillData taginfo = emojidata[j];
                                    if (taginfo == null || taginfo.ignore)
                                    {
                                        continue;
                                    }
                                    SpriteAsset     asset     = null;
                                    SpriteInfoGroup groupinfo = manager.FindSpriteGroup(taginfo.Tag, out asset);
                                    if (groupinfo != null && groupinfo.spritegroups.Count > 1)
                                    {
                                        int        index   = framecnt % groupinfo.spritegroups.Count;
                                        SpriteInfo sprInfo = groupinfo.spritegroups[index];
                                        taginfo.uv = sprInfo.uv;

                                        //render next
                                        CanvasGraphicGroup group = FindGraphicGroup(text.canvas, asset.ID);

                                        if (group != null)
                                        {
                                            if (tempMesh == null)
                                            {
                                                tempMesh = UnitMeshInfoPool.Get();
                                            }

                                            RefreshSubUIMesh(text, group, asset, taginfo.pos, taginfo.uv, joblist);

                                            if (group.isDirty)
                                            {
                                                group.graphic.SetVerticesDirty();
                                            }
                                            joblist.Add(taginfo.Tag);
                                        }
                                    }
                                }
                            }
                        }
                        ListPool <string> .Release(joblist);
                    }
                }
            }

            EmojiTools.EndSample();
        }
        void PlayAnimation()
        {
            EmojiTools.BeginSample("Emoji_UnitAnimation");
            if (alltexts != null)
            {
                if (_time == null)
                {
                    _time = Time.timeSinceLevelLoad;
                }
                else
                {
                    float deltatime = Time.timeSinceLevelLoad - _time.Value;
                    //at least one frame
                    int framecnt = Mathf.RoundToInt(deltatime * Speed);
                    if (framecnt > 0)
                    {
                        for (int i = 0; i < alltexts.Count; ++i)
                        {
                            InlineText       text      = alltexts[i];
                            List <IFillData> emojidata = text.PopEmojiData();
                            if (emojidata != null && emojidata.Count > 0 && allatlas != null && allatlas.Count > 0)
                            {
                                for (int j = 0; j < emojidata.Count; ++j)
                                {
                                    IFillData taginfo = emojidata[j];
                                    if (taginfo == null || taginfo.ignore)
                                    {
                                        continue;
                                    }

                                    SpriteAsset     asset     = null;
                                    SpriteInfoGroup groupinfo = manager.FindSpriteGroup(taginfo.Tag, out asset);
                                    if (groupinfo != null && groupinfo.spritegroups.Count > 1)
                                    {
                                        int        index   = framecnt % groupinfo.spritegroups.Count;
                                        SpriteInfo sprInfo = groupinfo.spritegroups[index];
                                        taginfo.uv = sprInfo.uv;

                                        List <SpriteGraphic> list   = null;
                                        SpriteGraphic        target = FindGraphic(text, asset, out list);
                                        if (target)
                                        {
                                            if (tempMesh == null)
                                            {
                                                tempMesh = UnitMeshInfoPool.Get();
                                            }

                                            if (renderData == null)
                                            {
                                                renderData = new Dictionary <Graphic, UnitMeshInfo>(emojidata.Count);
                                            }

                                            RefreshSubUIMesh(text, target, asset, taginfo.pos, taginfo.uv);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            EmojiTools.EndSample();
        }
        private void ShowWillPackCells()
        {
            EditorGUILayout.BeginHorizontal("HelpBox");

            GUILayout.Label("Tag:", GUILayout.Width(50));
            if (GUILayout.Button(aniTagName, "MiniPopup", GUILayout.Width(100)))
            {
                GenericMenu gm = new GenericMenu();

                for (int i = 0; i < spriteAsset.listSpriteGroup.Count; i++)
                {
                    SpriteInfoGroup group = spriteAsset.listSpriteGroup[i];
                    gm.AddItem(new GUIContent(group.tag), false, () =>
                    {
                        aniTagName = group.tag;
                    });
                }
                gm.ShowAsContext();
            }

            if (GUILayout.Button("Select All", GUILayout.Width(100)))
            {
                for (int i = 0; i < spriteAsset.listSpriteGroup.Count; i++)
                {
                    SpriteInfoGroup group = spriteAsset.listSpriteGroup[i];
                    selections[group.tag] = group;
                }
            }

            if (GUILayout.Button("DisSelect All", GUILayout.Width(100)))
            {
                selections.Clear();
            }

            if (GUILayout.Button("Pack into Animation", GUILayout.Width(150)))
            {
                if (!string.IsNullOrEmpty(aniTagName))
                {
                    List <SpriteInfoGroup> removelist = new List <SpriteInfoGroup>();

                    SpriteInfoGroup firstGroup = null;
                    var             en         = selections.GetEnumerator();
                    while (en.MoveNext())
                    {
                        SpriteInfoGroup group = en.Current.Value;
                        if (firstGroup == null)
                        {
                            firstGroup = group;
                            group.tag  = aniTagName;
                        }
                        else
                        {
                            firstGroup.size = Mathf.Max(firstGroup.size, group.size);
                            firstGroup.spritegroups.AddRange(group.spritegroups);
                            removelist.Add(group);
                        }
                    }

                    for (int i = 0; i < removelist.Count; ++i)
                    {
                        SpriteInfoGroup group = removelist[i];
                        this.spriteAsset.listSpriteGroup.Remove(group);
                    }

                    selections.Clear();
                }
            }

            EditorGUILayout.EndHorizontal();

            GUILayout.Space(2);

            int t = 0;

            for (int i = 0; i < spriteAsset.listSpriteGroup.Count; i++)
            {
                SpriteInfoGroup group = spriteAsset.listSpriteGroup[i];

                EditorGUILayout.BeginHorizontal("HelpBox");

                bool exist     = selections.ContainsKey(group.tag);
                bool newselect = EditorGUILayout.Toggle(exist, GUILayout.Width(20));
                if (newselect != exist)
                {
                    if (newselect)
                    {
                        selections[group.tag] = group;
                    }
                    else
                    {
                        selections.Remove(group.tag);
                    }
                }

                GUILayout.Label(string.Format("[{0}] : {1}", i, group.tag), GUILayout.Width(100));

                AddFoldOutBtn("", group);
                EditorGUILayout.EndHorizontal();


                for (int j = 0; j < group.spritegroups.Count; j++)
                {
                    SpriteInfo info = group.spritegroups[j];

                    if (ReferenceEquals(showdata, group))
                    {
                        ShowCell(info);
                    }
                    ++t;
                }
            }
        }
        private void ShowBatchTools()
        {
            GUILayout.BeginVertical("HelpBox");

            spriteAsset.AssetName = EditorGUILayout.TextField("AssetName:", spriteAsset.AssetName);

            spriteAsset.ID = EditorGUILayout.IntField("ID:", spriteAsset.ID);

            GUILayout.BeginHorizontal();

            addTagName = EditorGUILayout.TextField("add Tag", addTagName);
            if (GUILayout.Button("Sure"))
            {
                ClickSurebtn();
            }

            GUILayout.EndHorizontal();

            EditorGUILayout.BeginHorizontal();
            this.batchsize = EditorGUILayout.Vector2Field("batch size", this.batchsize);

            if (GUILayout.Button("Sure"))
            {
                for (int i = 0; i < spriteAsset.listSpriteGroup.Count; i++)
                {
                    SpriteInfoGroup group = spriteAsset.listSpriteGroup[i];
                    group.size  = this.batchsize.x;
                    group.width = this.batchsize.y;
                }
            }

            EditorGUILayout.EndHorizontal();

            GUILayout.BeginHorizontal();

            if (GUILayout.Button("RestSize", GUILayout.Width(100)))
            {
                for (int i = 0; i < spriteAsset.listSpriteGroup.Count; i++)
                {
                    SpriteInfoGroup group = spriteAsset.listSpriteGroup[i];

                    for (int j = 0; j < group.spritegroups.Count; ++j)
                    {
                        SpriteInfo info  = group.spritegroups[j];
                        float      value = Mathf.Max(info.sprite.rect.width, info.sprite.rect.height);
                        group.size  = Mathf.Max(value, group.size);
                        group.width = 1;
                    }
                }
            }

            if (GUILayout.Button("Clear Tag", GUILayout.Width(100)))
            {
                ClearTag();
            }

            if (GUILayout.Button("batch pack Tags", GUILayout.Width(120)))
            {
                isPackingAnimation = !isPackingAnimation;
                this.animations.Clear();
                this.animationframes.Clear();
            }
            GUILayout.EndHorizontal();
            GUILayout.EndVertical();
        }