private void DeselectEvent(FEventEditor eventEditor)
        {
            if (eventEditor == null || !eventEditor.IsSelected())
            {
                return;
            }

            Undo.RegisterCompleteObjectUndo(new Object[] { eventEditor, this }, "deselect Event");

            _selectedEvents.Remove(eventEditor);
            FInspectorWindow.SetEvents(_selectedEvents);

            eventEditor.OnDeselect();
        }
        private void SelectEvent(FEventEditor eventEditor)
        {
            if (eventEditor == null || eventEditor.IsSelected())
            {
                return;
            }

            SelectTrack(eventEditor._trackEditor);
            Undo.RegisterCompleteObjectUndo(new Object[] { eventEditor, this }, "select Event");

            _selectedEvents.Add(eventEditor);
            FInspectorWindow.SetEvents(_selectedEvents);

            eventEditor.OnSelect();
        }
        public void MoveEvents(int deltaFrames)
        {
            bool movingLeft = deltaFrames < 0;

            int howMuchCanMove = int.MaxValue;

            for (int i = 0; i != _selectedTracks.Count; ++i)
            {
                if (movingLeft)
                {
                    for (int j = 0; j != _selectedTracks[i]._eventEditors.Count; ++j)
                    {
                        FEventEditor evtEditor = _selectedTracks[i]._eventEditors[j];
                        if (evtEditor.IsSelected())
                        {
                            if (j == 0)
                            {
                                howMuchCanMove = Mathf.Min(howMuchCanMove, evtEditor._evt.Start);
                            }
                            else if (!_selectedTracks[i]._eventEditors[j - 1].IsSelected())
                            {
                                howMuchCanMove = Mathf.Min(howMuchCanMove, evtEditor._evt.Start - _selectedTracks[i]._eventEditors[j - 1]._evt.End);
                            }
                        }
                    }
                }
                else
                {
                    int lastElementIndex = _selectedTracks[i]._eventEditors.Count - 1;
                    for (int j = lastElementIndex; j != -1; --j)
                    {
                        FEventEditor evtEditor = _selectedTracks[i]._eventEditors[j];
                        if (evtEditor.IsSelected())
                        {
                            if (j == lastElementIndex)
                            {
                                howMuchCanMove = Mathf.Min(howMuchCanMove, _sequence.Length - evtEditor._evt.End);
                            }
                            else if (!_selectedTracks[i]._eventEditors[j + 1].IsSelected())
                            {
                                howMuchCanMove = Mathf.Min(howMuchCanMove, _selectedTracks[i]._eventEditors[j + 1]._evt.Start - evtEditor._evt.End);
                            }
                        }
                    }
                }
            }

            if (movingLeft)
            {
                howMuchCanMove = -howMuchCanMove;
                deltaFrames    = Mathf.Clamp(deltaFrames, howMuchCanMove, 0);
            }
            else
            {
                deltaFrames = Mathf.Clamp(deltaFrames, 0, howMuchCanMove);
            }

            if (deltaFrames != 0)
            {
                for (int i = 0; i != _selectedEvents.Count; ++i)
                {
                    Undo.RecordObject(_selectedEvents[i]._evt, "move Event");
                    _selectedEvents[i]._evt.Start += deltaFrames;
                    _selectedEvents[i]._evt.End   += deltaFrames;
                    EditorUtility.SetDirty(_selectedEvents[i]._evt);
                }
            }
        }