private void UndoRedoCallback()
 {
     if (ObserverTimeline)
     {
         ObserverTimeline.OnEditorUndo();
     }
 }
        private void SetCamera(USObserverKeyframe keyframe, float time, Shared.TypeOfTransition transitionType, float transitionDuration, Camera camera)
        {
            if (AnimationHelper.IsInAnimationMode)
            {
                ObserverTimeline.StopTimeline();
                ObserverTimeline.StartTimeline();
            }

            if (keyframe != null)
            {
                USUndoManager.PropertyChange(keyframe, "Set Camera");
                keyframe.KeyframeCamera = camera;
            }
            else
            {
                USUndoManager.RegisterCompleteObjectUndo(this, "Set Camera");

                var newKeyframe = CreateInstance <USObserverKeyframe>();
                newKeyframe.FireTime           = time;
                newKeyframe.KeyframeCamera     = camera;
                newKeyframe.TransitionType     = transitionType;
                newKeyframe.TransitionDuration = transitionDuration;
                USUndoManager.RegisterCreatedObjectUndo(newKeyframe, "Set Camera");

                USUndoManager.RegisterCompleteObjectUndo(ObserverTimeline, "Set Camera");
                ObserverTimeline.AddKeyframe(newKeyframe);

                var cachedData = CreateInstance <ObserverRenderData>();
                cachedData.Keyframe = newKeyframe;
                cachedObserverRenderData.Add(cachedData);
            }

            ObserverTimeline.Process(ObserverTimeline.Sequence.RunningTime, ObserverTimeline.Sequence.PlaybackRate);
        }
        public void ProcessDraggingObjects(Vector2 mouseDelta, bool snap, float snapValue)
        {
            if (!ObserverTimeline)
            {
                return;
            }

            USUndoManager.PropertyChange(this, "Drag Selection");
            foreach (var selectedObject in SelectedObjects)
            {
                var keyframe = selectedObject as USObserverKeyframe;
                USUndoManager.PropertyChange(keyframe, "Drag Selection");

                Vector3 newPosition = SourcePositions[keyframe] + mouseDelta;
                newPosition.x = newPosition.x + XScroll - DisplayArea.x;
                if (snap)
                {
                    newPosition.x = Mathf.Round(newPosition.x / snapValue) * snapValue;
                }
                var newTime = ((newPosition.x / DisplayArea.width) * Duration) / XScale;

                newTime = Mathf.Clamp(newTime, 0.0f, Duration);

                keyframe.FireTime = newTime;
            }

            if (AnimationHelper.IsInAnimationMode)
            {
                ObserverTimeline.Process(ObserverTimeline.Sequence.RunningTime, ObserverTimeline.Sequence.PlaybackRate);
            }
        }
        private void RemoveKeyframe(USObserverKeyframe keyframe)
        {
            USUndoManager.RegisterCompleteObjectUndo(this, "Remove Keyframe");

            var data = cachedObserverRenderData.Where(element => element.Keyframe == keyframe).First();

            cachedObserverRenderData.Remove(data);

            USUndoManager.PropertyChange(ObserverTimeline, "Remove Keyframe");
            ObserverTimeline.RemoveKeyframe(keyframe);

            ObserverTimeline.Process(ObserverTimeline.Sequence.RunningTime, ObserverTimeline.Sequence.PlaybackRate);

            USUndoManager.DestroyImmediate(data);
            USUndoManager.DestroyImmediate(keyframe);
        }
        private void HandleEvent()
        {
            var isContext = Event.current.type == EventType.MouseDown && Event.current.button == 1;

            if (!isContext)
            {
                return;
            }

            var contextMenu = new GenericMenu();

            var newTime = (((Event.current.mousePosition.x + XScroll - DisplayArea.x) / DisplayArea.width) * Duration) / XScale;
            USObserverKeyframe overKeyframe = null;

            foreach (var data in cachedObserverRenderData)
            {
                if (data.RenderRect.Contains(Event.current.mousePosition))
                {
                    contextMenu.AddItem(new GUIContent("Remove Observer Keyframe"), false, () => { RemoveKeyframe(data.Keyframe); });
                    contextMenu.AddSeparator("");
                    overKeyframe = data.Keyframe;
                    break;
                }
            }

            var cameras = Resources.FindObjectsOfTypeAll(typeof(Camera)) as Camera[];

            cameras = cameras.OrderBy(camera => camera.name).ToArray();
            foreach (var camera in cameras)
            {
                if (!ObserverTimeline.IsValidCamera(camera))
                {
                    continue;
                }

                var assetPath = AssetDatabase.GetAssetPath(camera.gameObject.transform.root.gameObject);
                if (!string.IsNullOrEmpty(assetPath))
                {
                    continue;
                }

                var cutTransition = Shared.TypeOfTransition.Cut;
                var cutDuration   = Shared.TransitionHelper.DefaultTransitionTimeFor(cutTransition);
                contextMenu.AddItem(new GUIContent(String.Format("Set Camera/Cut/{0}", camera.name)), false, (settingCamera) => SetCamera(overKeyframe, newTime, cutTransition, cutDuration, (Camera)settingCamera), camera);

                var transitions = Enum.GetValues(typeof(Shared.TypeOfTransition)).Cast <Shared.TypeOfTransition>();
                foreach (var transition in transitions)
                {
                    if (transition == Shared.TypeOfTransition.Cut)
                    {
                        continue;
                    }

                    var transitionType     = transition;                 // Keep a local copy of this, so it's safed for our delegate.
                    var transitionDuration = Shared.TransitionHelper.DefaultTransitionTimeFor(transitionType);
                    contextMenu.AddItem(new GUIContent(String.Format("Set Camera/Transition/{0}/{1}", camera.name, transitionType)), false, (settingCamera) => SetCamera(overKeyframe, newTime, transitionType, transitionDuration, (Camera)settingCamera), camera);
                }
            }

            if (DisplayArea.Contains(Event.current.mousePosition))
            {
                Event.current.Use();
                contextMenu.ShowAsContext();
            }
        }
        public void OnGUI()
        {
            if (ObserverTimeline != null && ObserverTimeline.Sequence != null && ObserverTimeline.Sequence.HasSequenceBeenStarted)
            {
                Shared.TransitionHelper.ForceGameViewRepaint();
            }

            GUILayout.Box("", TimelineBackground, GUILayout.MaxHeight(17.0f), GUILayout.ExpandWidth(true));
            if (Event.current.type == EventType.Repaint)
            {
                DisplayArea = GUILayoutUtility.GetLastRect();
            }

            var helperRect = DisplayArea;

            helperRect.y -= 17.0f;

            var validCamerasMessage = string.Empty;

            if (ObserverTimeline.Sequence.RunningTime > 0.0f && Camera.allCameras.Count(camera => ObserverTimeline.IsValidCamera(camera)) > 1)
            {
                validCamerasMessage = " -  You have more than one active camera in your scene, is this intentional?.";
            }

            GUI.Label(helperRect, string.Format("Current Keyframe : {0} {1}", ObserverTimeline.CurrentlyActiveKeyframe != null ? ObserverTimeline.CurrentlyActiveKeyframe.KeyframeCamera.name : "null", validCamerasMessage));

            var sortedKeyframes = cachedObserverRenderData.OrderBy(element => element.Keyframe.FireTime).ToList();

            for (var index = 0; index < sortedKeyframes.Count(); index++)
            {
                var data = sortedKeyframes[index];

                var xPos    = DisplayArea.width * (data.Keyframe.FireTime / Duration);
                var xMaxPos = DisplayArea.width * (data.Keyframe.TransitionDuration / Duration);
                xMaxPos = Mathf.Clamp(xMaxPos, 4.0f, float.MaxValue);

                data.RenderPosition = new Vector2(DisplayArea.x + ((xPos * XScale) - XScroll), DisplayArea.y);
                data.RenderRect     = new Rect((DisplayArea.x + ((xPos * XScale) - XScroll)) - 3.0f, DisplayArea.y, xMaxPos, DisplayArea.height - 1.0f);

                using (new Shared.GUIChangeColor(SelectedObjects.Contains(data.Keyframe) ? Color.yellow : GUI.color))
                {
                    GUI.Box(data.RenderRect, "");

                    var labelRect = data.RenderRect;
                    labelRect.x    += 4.0f;
                    labelRect.width = 1000.0f;
                    GUI.Label(labelRect, data.Keyframe.KeyframeCamera ? data.Keyframe.KeyframeCamera.name : "Null");
                }
            }

            HandleEvent();
        }