public void SetBoth(TangentMode mode, List <KeyIdentifier> keysToSet)
        {
            List <ChangedCurve> changedCurves = new List <ChangedCurve>();

            foreach (KeyIdentifier keyToSet in keysToSet)
            {
                AnimationCurve animationCurve = keyToSet.curve;
                Keyframe       key            = keyToSet.keyframe;
                AnimationUtility.SetKeyBroken(ref key, false);
                AnimationUtility.SetKeyRightTangentMode(ref key, mode);
                AnimationUtility.SetKeyLeftTangentMode(ref key, mode);

                // Smooth Tangents based on neighboring nodes
                // Note: not needed since the UpdateTangentsFromModeSurrounding call below will handle it
                //if (mode == TangentMode.ClampedAuto) animationCurve.SmoothTangents(keyToSet.key, 0.0F);
                // Smooth tangents based on existing tangents
                if (mode == TangentMode.Free)
                {
                    float slope = CurveUtility.CalculateSmoothTangent(key);
                    key.inTangent  = slope;
                    key.outTangent = slope;
                }
                animationCurve.MoveKey(keyToSet.key, key);
                AnimationUtility.UpdateTangentsFromModeSurrounding(animationCurve, keyToSet.key);

                ChangedCurve changedCurve = new ChangedCurve(animationCurve, keyToSet.curveId, keyToSet.binding);
                if (!changedCurves.Contains(changedCurve))
                {
                    changedCurves.Add(changedCurve);
                }
            }

            updater.UpdateCurves(changedCurves, "Set Tangents");
        }
        // (case 1029160) Modified version of EditorGUI.DoPopup to fit large data list query.
        private AnimationClip DoClipPopup(AnimationClip clip, GUIStyle style)
        {
            Rect position  = EditorGUILayout.GetControlRect(false, EditorGUI.kSingleLineHeight, style);
            int  controlID = GUIUtility.GetControlID(s_ClipPopupHash, FocusType.Keyboard, position);

            clip = ClipPopupCallbackInfo.GetSelectedClipForControl(controlID, clip);

            Event evt = Event.current;

            switch (evt.type)
            {
            case EventType.Repaint:
                Font originalFont = style.font;
                if (originalFont && EditorGUIUtility.GetBoldDefaultFont() && originalFont == EditorStyles.miniFont)
                {
                    style.font = EditorStyles.miniBoldFont;
                }

                GUIContent buttonContent = EditorGUIUtility.TempContent(CurveUtility.GetClipName(clip));
                buttonContent.tooltip = AssetDatabase.GetAssetPath(clip);

                style.Draw(position, buttonContent, controlID, false);

                style.font = originalFont;
                break;

            case EventType.MouseDown:
                if (evt.button == 0 && position.Contains(evt.mousePosition))
                {
                    DisplayClipMenu(position, controlID, clip);
                    GUIUtility.keyboardControl = controlID;
                    evt.Use();
                }
                break;

            case EventType.KeyDown:
                if (evt.MainActionKeyForControl(controlID))
                {
                    DisplayClipMenu(position, controlID, clip);
                    evt.Use();
                }
                break;
            }

            return(clip);
        }
        private AnimationClip[] GetOrderedClipList()
        {
            AnimationClip[] clips = new AnimationClip[0];
            if (state.activeRootGameObject != null)
            {
                clips = AnimationUtility.GetAnimationClips(state.activeRootGameObject);
            }

            if (!string.IsNullOrEmpty(animClipName))
            {
                if (clips != null && clips.Length > 0)
                {
                    List <AnimationClip> clipsByName = new List <AnimationClip>();
                    string nameInClip = animClipName;

                    for (int i = 0; i < clips.Length; i++)
                    {
                        if (clips[i].name.Contains(nameInClip))
                        {
                            clipsByName.Add(clips[i]);
                        }
                    }

                    if (clipsByName.Count > 0)
                    {
                        clips = clipsByName.ToArray();
                    }
                }
            }

                        #if UNITY_EDITOR_WIN
            // So we don't break in windows even though it worked before, only up to 999 because you need one more for New Clip
            System.Array.Resize(ref clips, 999);
                        #endif

            Array.Sort(clips, (AnimationClip clip1, AnimationClip clip2) => CurveUtility.GetClipName(clip1).CompareTo(CurveUtility.GetClipName(clip2)));

            return(clips);
        }
        private GUIContent[] GetClipMenuContent(AnimationClip[] clips)
        {
            int size = clips.Length;

            if (state.selection.canCreateClips)
            {
                size += 2;
            }

            GUIContent[] content = new GUIContent[size];
            for (int i = 0; i < clips.Length; i++)
            {
                content[i] = new GUIContent(CurveUtility.GetClipName(clips[i]));
            }

            if (state.selection.canCreateClips)
            {
                content[content.Length - 2] = GUIContent.none;
                content[content.Length - 1] = AnimationWindowStyles.createNewClip;
            }

            return(content);
        }
        public void OnGUI()
        {
            // Check for the animation clip name and create array of clips based on name
            animClipName = EditorGUILayout.TextField("Animation Clip Name:", animClipName, GUILayout.Width(300));

            if (state.selection.canChangeAnimationClip)
            {
                EditorGUI.BeginChangeCheck();

                var newClip = DoClipPopup(state.activeAnimationClip, AnimationWindowStyles.animClipToolbarPopup);
                if (EditorGUI.EndChangeCheck())
                {
                    state.activeAnimationClip = newClip;

                    //  Layout has changed, bail out now.
                    EditorGUIUtility.ExitGUI();
                }
            }
            else if (state.activeAnimationClip != null)
            {
                Rect r = EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight, AnimationWindowStyles.toolbarLabel);
                EditorGUI.LabelField(r, CurveUtility.GetClipName(state.activeAnimationClip), AnimationWindowStyles.toolbarLabel);
            }
        }