void ToolbarGUI()
 {
     using (hGUI.Enabled(Events != null && Characters.Selected != null && Characters.Selected.Prefab.Load())) {
         if (ToolbarButton("Animation.PrevKey"))
         {
             HitboxKeyframe nextKeyframe = Events.PrevKeyframe(SeekTime);
             SeekTime = nextKeyframe != null ? nextKeyframe.Time : 1.0f;
         }
         play = ToolbarToggle("Animation.Play", play);
         if (ToolbarButton("Animation.NextKey"))
         {
             HitboxKeyframe prevKeyframe = Events.NextKeyframe(SeekTime);
             SeekTime = prevKeyframe != null ? prevKeyframe.Time : 0.0f;
         }
         if (ToolbarButton("Animation.AddKeyframe"))
         {
             HitboxKeyframe keyframe = Events.AddKeyframe(SeekTime);
             if (keyframe != null && Keyframes[0] == keyframe)
             {
                 Assert.IsTrue(Check.Range(keyframe.States.Count, IDs));
                 for (var i = 0; i < keyframe.States.Count; i++)
                 {
                     keyframe.States[i] = GetType(IDs[i]);
                 }
             }
         }
         if (hGUI.ToolbarButton(hGUI.BuiltinContent("Animation.AddEvent")))
         {
         }
         ToggleSpawn(hGUI.ToolbarToggle("Spawn", Spawn, GUILayout.Width(40)));
     }
     hGUI.Space();
     Characters.Draw(GUIContent.none, EditorStyles.toolbarPopup, GUILayout.Width(100));
 }
 void SeekAreaGUI()
 {
     using (
         EditorGUILayout.HorizontalScope seekScope = hGUI.Horizontal("AnimationEventBackground",
                                                                     GUILayout.Height(18))) {
         seekArea = seekScope.rect;
         SeekListener.EventCheck(seekArea);
         if (Events != null)
         {
             for (keyframeIndex = 0; keyframeIndex < Keyframes.Count; keyframeIndex++)
             {
                 HitboxKeyframe keyframe = Keyframes[keyframeIndex];
                 float          time     = Keyframes[keyframeIndex].Time;
                 using (hGUI.Color(keyframe == selectedKeyframe ? Color.red : GUI.color)) {
                     EditorGUI.LabelField(GetSlicedRect(seekArea, time, 0), GUIContent.none, "TL Playhead");
                 }
                 Rect checkRect = GetSlicedRect(seekArea, time, 12);
                 KeyframeListener.EventCheck(checkRect);
             }
             foreach (AnimationEvent evt in OtherEvents)
             {
                 GUI.DrawTexture(GetSlicedRect(seekArea, evt.time, 5),
                                 EditorGUIUtility.FindTexture("Animation.EventMarker"));
             }
         }
         hGUI.Space();
     }
 }
        void SetKeyframeTime(Event evt, HitboxKeyframe keyframe)
        {
            Assert.IsNotNull(Events);
            Assert.IsNotNull(keyframe);
            Vector2 pos = evt.mousePosition;

            keyframe.Time = Mathf.Clamp01((pos.x - seekArea.x) / seekArea.width);
            Events.Sortkeyframes();
            Repaint();
        }
        public void UpdateSpawn()
        {
            if (Spawn == null)
            {
                return;
            }
            HitboxKeyframe frame = Keyframes.FindLast(h => h.Time < SeekTime);

            for (var i = 0; i < IDs.Count; i++)
            {
                Hitbox hitbox = GetHitbox(IDs[i]);
                if (hitbox == null)
                {
                    continue;
                }
                hitbox.CurrentType = frame != null ? frame.States[i] : hitbox.DefaultType;
            }
            SceneView.RepaintAll();
        }
        public bool AddKeyframe(int frame)
        {
            var index = GetKeyframeIndex(frame);

            if (index >= 0 && _keyframes[index].Frame == frame)
            {
                return(false);
            }

            var keyframe = new HitboxKeyframe
            {
                Frame    = frame,
                Hitboxes = index >= 0
                    ? _keyframes[index].Hitboxes.ToArray()
                    : new Hitbox[] {}
            };

            ArrayUtility.Insert(ref _keyframes, index + 1, keyframe);
            return(true);
        }
        public void AddHitboxes(int startFrame, Hitbox[] hitboxes)
        {
            var index          = GetKeyframeIndex(startFrame);
            var hitboxKeyframe = new HitboxKeyframe
            {
                Frame    = startFrame,
                Hitboxes = hitboxes
            };

            if (_keyframes == null)
            {
                _keyframes = new[] { hitboxKeyframe };
            }
            else if (_keyframes[index].Frame == startFrame)
            {
                _keyframes[index].Hitboxes = hitboxKeyframe.Hitboxes;
            }
            else
            {
                ArrayUtility.Insert(ref _keyframes, index + 1, hitboxKeyframe);
            }
        }
        /// <summary> Unity callback. Called when the EditorWindow is created. </summary>
        void OnEnable()
        {
            changes      = new List <Edit>();
            DragListener =
                new EventListener().AddListener(EventType.DragUpdated,
                                                delegate {
                DragAndDrop.visualMode = Behaviour && GetObjectHitboxes(DragAndDrop.objectReferences).Any()
                            ? DragAndDropVisualMode.Generic
                            : DragAndDropVisualMode.None;
            })
                .AddListeners(new[] { EventType.DragExited, EventType.DragPerform },
                              delegate {
                if (Events == null)
                {
                    return;
                }
                DragAndDrop.AcceptDrag();
                foreach (Hitbox hb in GetObjectHitboxes(DragAndDrop.objectReferences))
                {
                    Events.AddHitbox(hb);
                }
            });

            GeneralEventListener = new EventListener().AddListener(EventType.MouseDrag,
                                                                   delegate(Event evt) {
                if (dragStart == DragStart.SeekBar)
                {
                    SetSeekTime(evt);
                }
                if (dragStart == DragStart.Keyframe)
                {
                    SetKeyframeTime(evt, selectedKeyframe);
                }
            })
                                   .AddListener(EventType.MouseUp, delegate { dragStart = DragStart.None; })
                                   .AddListener(EventType.KeyDown,
                                                delegate(Event evt) {
                if (evt.keyCode == KeyCode.Delete && selectedKeyframe != null)
                {
                    Events.DeleteKeyframe(selectedKeyframe);
                    Repaint();
                }
            });

            SeekListener = new EventListener().AddListeners(new[] { EventType.MouseDown, EventType.MouseDrag },
                                                            delegate(Event evt) {
                if (evt.type == EventType.MouseDown)
                {
                    dragStart = DragStart.SeekBar;
                }
                if (evt.type == EventType.MouseDrag && dragStart != DragStart.SeekBar)
                {
                    return;
                }
                SetSeekTime(evt);
            });

            SetListener = new EventListener().AddListeners(new[] { EventType.MouseDown, EventType.MouseDrag },
                                                           delegate(Event evt) {
                if (evt.type == EventType.MouseDown)
                {
                    dragStart = DragStart.EditArea;
                }
                if (evt.type == EventType.MouseDrag && dragStart != DragStart.EditArea)
                {
                    return;
                }
                Hitbox.Type type = evt.button == 0 ? state : GetTypeOrDefault(hitboxIndex);
                if (Events == null || Events.GetState(hitboxIndex, keyframeIndex) == type)
                {
                    return;
                }
                changes.Add(new Edit {
                    index = hitboxIndex, keyframe = keyframeIndex, type = type
                });
            });

            KeyframeListener = new EventListener().AddListener(EventType.MouseDown,
                                                               delegate {
                dragStart        = DragStart.Keyframe;
                selectedKeyframe = Keyframes[keyframeIndex];
            });

            HitboxListener = new EventListener().AddListener(EventType.MouseDown,
                                                             delegate {
                Hitbox hitbox = GetHitbox(IDs[hitboxIndex]);
                if (hitbox != null)
                {
                    Selection.activeGameObject = hitbox.gameObject;
                }
            });

            OnAssetEdit += Repaint;

            Characters = new ObjectSelector <CharacterData>(c => c.name, c => c != null);

            Characters.SelectionChanged += UpdateCharacter;
            Refresh();
        }