private static bool DoDisplayAnimationClipHeader(Uni2DAnimationClip a_rAnimationClip, Uni2DAnimationPlayer a_rAnimationPreviewPlayer, out AnimationGUIAction a_eAction, bool a_bCompactMode, bool a_bFolded, int iClipIndex = -1)
    {
        a_eAction = AnimationGUIAction.None;

        ///// Clip header /////
        EditorGUILayout.BeginVertical(EditorStyles.textField);
        {
            if (a_bCompactMode)
            {
                ///// Top toolbar /////
                EditorGUILayout.BeginHorizontal(EditorStyles.toolbar, GUILayout.ExpandWidth(true));
                {
                    // ^
                    if (GUILayout.Button("\u25B2" /*"\u2191"*/, EditorStyles.toolbarButton, GUILayout.ExpandWidth(false)))
                    {
                        a_eAction = AnimationGUIAction.MoveUp;
                    }

                    // v
                    if (GUILayout.Button("\u25BC" /*"\u2193"*/, EditorStyles.toolbarButton, GUILayout.ExpandWidth(false)))
                    {
                        a_eAction = AnimationGUIAction.MoveDown;
                    }

                    if (iClipIndex > -1)
                    {
                        if (GUILayout.Button("Clip #" + iClipIndex, EditorStyles.toolbarButton, GUILayout.ExpandWidth(true)))
                        {
                            EditorGUIUtility.PingObject(a_rAnimationClip.gameObject);
                        }
                    }
                    else
                    {
                        GUILayout.FlexibleSpace( );
                    }

                    // X
                    if (GUILayout.Button("X", EditorStyles.toolbarButton, GUILayout.ExpandWidth(false)))
                    {
                        a_eAction = AnimationGUIAction.Close;
                    }
                }
                EditorGUILayout.EndHorizontal( );
            }
            ///////////////

            EditorGUILayout.Space( );

            EditorGUILayout.BeginHorizontal( );
            {
                Rect oClipTextureRect = GUILayoutUtility.GetRect(64.0f, 64.0f, 64.0f, 64.0f, GUILayout.ExpandWidth(false));

                // Animation clip preview
                Uni2DEditorGUIUtils.DrawAnimationClipPreview(oClipTextureRect, a_rAnimationClip, a_rAnimationPreviewPlayer);

                // Clip settings
                EditorGUILayout.BeginVertical( );
                {
                    //string rName;
                    float fFrameRate;
                    Uni2DAnimationClip.WrapMode eWrapMode;

                    // Name
                    //rName = EditorGUILayout.TextField( "Clip Name", a_rAnimationClip.name );
                    EditorGUILayout.LabelField(a_rAnimationClip.name, EditorStyles.boldLabel);

                    EditorGUI.BeginChangeCheck( );
                    {
                        EditorGUI.BeginChangeCheck( );
                        {
                            // Frame rate
                            fFrameRate = EditorGUILayout.FloatField("Frame Rate", a_rAnimationClip.frameRate);
                            // Wrap mode
                            eWrapMode = (Uni2DAnimationClip.WrapMode)EditorGUILayout.EnumPopup("Wrap Mode", a_rAnimationClip.wrapMode);
                        }
                        if (EditorGUI.EndChangeCheck( ))
                        {
                            // Update animation players settings
                            a_rAnimationPreviewPlayer.FrameRate = fFrameRate;
                            a_rAnimationPreviewPlayer.WrapMode  = eWrapMode;
                        }
                    }
                    if (EditorGUI.EndChangeCheck( ))
                    {
                        //a_rAnimationClip.name      = rName;
                        a_rAnimationClip.frameRate = fFrameRate;
                        a_rAnimationClip.wrapMode  = eWrapMode;

                        if (a_bCompactMode)
                        {
                            a_rAnimationClip.ApplySettings(Uni2DAnimationClip.AnimationClipRegeneration.RegenerateNothing);
                        }

                        EditorUtility.SetDirty(a_rAnimationClip);
                    }

                    // Clip length infos
                    // TODO: refactor with AnimationPlayer
                    int iClipFrameCount    = a_rAnimationClip.FrameCount;
                    int iWrappedFrameCount = iClipFrameCount;
                    if (a_rAnimationClip.wrapMode == Uni2DAnimationClip.WrapMode.PingPong && iWrappedFrameCount > 2)
                    {
                        iWrappedFrameCount = (iWrappedFrameCount * 2 - 2);
                    }

                    float fClipLength = Mathf.Abs(iWrappedFrameCount / a_rAnimationClip.frameRate);

                    EditorGUILayout.BeginHorizontal( );
                    {
                        EditorGUILayout.LabelField(iClipFrameCount + " frame(s) = "
                                                   + (iClipFrameCount != iWrappedFrameCount
                                                                ? (iWrappedFrameCount + " wrapped frame(s) = ")
                                                                : null
                                                      )
                                                   + fClipLength + " sec. @ "
                                                   + a_rAnimationClip.frameRate + " FPS",
                                                   EditorStyles.miniLabel, GUILayout.ExpandWidth(false));

                        if (a_bCompactMode && GUILayout.Button("Edit", EditorStyles.miniButton, GUILayout.ExpandWidth(true)))
                        {
                            Selection.activeObject = a_rAnimationClip;
                        }
                    }
                    EditorGUILayout.EndHorizontal( );
                }
                EditorGUILayout.EndVertical( );
            }
            EditorGUILayout.EndHorizontal( );

            // Frame foldout
            if (!a_bCompactMode)
            {
                EditorGUILayout.BeginHorizontal( );
                {
                    a_bFolded = EditorGUILayout.Foldout(a_bFolded, GUIContent.none);
                }
                EditorGUILayout.EndHorizontal( );
            }
            else
            {
                EditorGUILayout.Space( );
            }
        }
        EditorGUILayout.EndVertical( );

        return(a_bFolded);
    }
    // Displays the animation frame GUI
    // Returns the performed user action
    public static AnimationGUIAction DisplayAnimationFrame(Uni2DAnimationFrame a_rAnimationFrame, Uni2DTextureAtlas a_rGlobalAtlas, ref bool a_bEventFoldout)
    {
        AnimationGUIAction eAction = AnimationGUIAction.None;

        // Box
        EditorGUILayout.BeginVertical(EditorStyles.textField);
        {
            ///// Top toolbar /////
            EditorGUILayout.BeginHorizontal(EditorStyles.toolbar, GUILayout.ExpandWidth(true));
            {
                // ^
                if (GUILayout.Button("\u25B2" /*"\u2191"*/, EditorStyles.toolbarButton, GUILayout.ExpandWidth(false)))
                {
                    eAction = AnimationGUIAction.MoveUp;
                }

                // v
                if (GUILayout.Button("\u25BC" /*"\u2193"*/, EditorStyles.toolbarButton, GUILayout.ExpandWidth(false)))
                {
                    eAction = AnimationGUIAction.MoveDown;
                }

                // + ^
                if (GUILayout.Button("+ \u25B2" /*"+ \u2191"*/, EditorStyles.toolbarButton, GUILayout.ExpandWidth(true)))
                {
                    eAction = AnimationGUIAction.AddUp;
                }

                // X
                if (GUILayout.Button("X", EditorStyles.toolbarButton, GUILayout.ExpandWidth(false)))
                {
                    eAction = AnimationGUIAction.Close;
                }
            }
            EditorGUILayout.EndHorizontal( );

            ///////////////

            EditorGUILayout.Space( );

            ///// Animation Frame box /////
            EditorGUILayout.BeginHorizontal( );
            {
                Texture2D rFrameTexture     = a_rAnimationFrame.textureContainer;
                string    rFrameTextureGUID = a_rAnimationFrame.textureContainer.GUID;
                bool      bHasFrameTextureChanged;

                // Display frame texture on the left
                Rect oClipTextureRect = GUILayoutUtility.GetRect(64.0f, 64.0f, 64.0f, 64.0f, GUILayout.ExpandWidth(false));

                EditorGUI.BeginChangeCheck( );
                {
                    rFrameTexture = (Texture2D)EditorGUI.ObjectField(oClipTextureRect, GUIContent.none, rFrameTexture, typeof(Texture2D), false);
                }
                bHasFrameTextureChanged = EditorGUI.EndChangeCheck( );


                EditorGUILayout.BeginVertical(GUILayout.ExpandWidth(true));
                {
                    // Frame texture name
                    GUILayout.Label(rFrameTexture != null ? rFrameTexture.name : "(No Texture)", EditorStyles.boldLabel, GUILayout.ExpandWidth(false));

                    // Frame Name
                    a_rAnimationFrame.name = EditorGUILayout.TextField("Frame Name", a_rAnimationFrame.name);

                    // Frame atlas
                    EditorGUILayout.BeginHorizontal( );
                    {
                        // Disable popup menu if global atlas is set
                        EditorGUI.BeginDisabledGroup(a_rGlobalAtlas != null);
                        {
                            // Atlas popup
                            string[] oTextureGUID = (rFrameTexture != null) ? new string[1] {
                                rFrameTextureGUID
                            } : new string[0];

                            EditorGUILayout.PrefixLabel("Use Atlas");
                            a_rAnimationFrame.atlas = Uni2DEditorGUIUtils.AtlasPopup(a_rAnimationFrame.atlas, oTextureGUID);
                        }
                        EditorGUI.EndDisabledGroup( );

                        // Atlas select button
                        EditorGUI.BeginDisabledGroup(a_rAnimationFrame.atlas == null);
                        {
                            if (GUILayout.Button("Select", GUILayout.Width(80.0f)))
                            {
                                EditorGUIUtility.PingObject(a_rAnimationFrame.atlas.gameObject);
                            }
                        }
                        EditorGUI.EndDisabledGroup( );
                    }
                    EditorGUILayout.EndHorizontal( );

                    // Trigger?
                    a_rAnimationFrame.triggerEvent = EditorGUILayout.Toggle("Trigger Event", a_rAnimationFrame.triggerEvent);

                    // Event param
                    a_bEventFoldout = EditorGUILayout.Foldout(a_bEventFoldout, "Frame Infos");
                    if (a_bEventFoldout)
                    {
                        Uni2DAnimationFrameInfos rFrameInfos = a_rAnimationFrame.frameInfos;

                        ++EditorGUI.indentLevel;
                        {
                            rFrameInfos.stringInfo = EditorGUILayout.TextField("String Info", rFrameInfos.stringInfo);
                            rFrameInfos.intInfo    = EditorGUILayout.IntField("Int Info", rFrameInfos.intInfo);
                            rFrameInfos.floatInfo  = EditorGUILayout.FloatField("Float Info", rFrameInfos.floatInfo);
                            rFrameInfos.objectInfo = EditorGUILayout.ObjectField("Object Info", rFrameInfos.objectInfo, typeof(Object), true);
                        }
                        --EditorGUI.indentLevel;
                    }
                    EditorGUILayout.Space( );
                }
                EditorGUILayout.EndVertical( );

                if (bHasFrameTextureChanged)
                {
                    // Save texture in texture container, keep reference to the asset if not using an atlas
                    a_rAnimationFrame.textureContainer = new Texture2DContainer(rFrameTexture, a_rGlobalAtlas == null);
                }
            }
            EditorGUILayout.EndHorizontal( );

            ///////////////

            EditorGUILayout.Space( );

            ///// Bottom toolbar /////
            EditorGUILayout.BeginHorizontal(EditorStyles.toolbar, GUILayout.ExpandWidth(true));
            {
                // + v
                if (GUILayout.Button("+ \u25BC" /*"+ \u2193"*/, EditorStyles.toolbarButton, GUILayout.ExpandWidth(true)))
                {
                    eAction = AnimationGUIAction.AddDown;
                }
            }
            EditorGUILayout.EndHorizontal( );
        }
        EditorGUILayout.EndVertical( );

        return(eAction);
    }