protected override bool MouseDown(Event evt, WindowState state)
        {
            if (state.IsCurrentEditingASequencerTextField())
            {
                return(false);
            }

            m_ActiveRect = TimelineWindow.instance.sequenceContentRect;

            if (!m_ActiveRect.Contains(evt.mousePosition))
            {
                return(false);
            }

            if (!CanStartRectangle(evt))
            {
                return(false);
            }

            if (enableAutoPan)
            {
                m_TimeAreaAutoPanner = new TimeAreaAutoPanner(state);
            }

            m_StartPoint = new TimelinePoint(state, evt.mousePosition);
            m_EndPixel   = evt.mousePosition;

            state.AddCaptured(this);

            return(true);
        }
 protected override bool KeyDown(Event evt, WindowState state)
 {
     if (evt.keyCode == KeyCode.Escape)
     {
         m_TimeAreaAutoPanner  = null;
         GUIUtility.hotControl = 0;
         state.RemoveCaptured(this);
         return(true);
     }
     return(false);
 }
        protected override bool MouseUp(Event evt, WindowState state)
        {
            m_TimeAreaAutoPanner = null;

            Rect rect = CurrentRectangle();

            if (IsValidRect(rect))
            {
                OnFinish(evt, state, rect);
            }

            state.RemoveCaptured(this);

            return(true);
        }
        protected override bool MouseUp(Event evt, WindowState state)
        {
            if (!m_Dragged)
            {
                var item = PickerUtils.TopmostPickedItem() as ISelectable;

                if (item == null)
                {
                    return(false);
                }

                if (!item.IsSelected())
                {
                    return(false);
                }

                // Re-selecting an item part of a multi-selection should only keep this item selected.
                if (SelectionManager.Count() > 1 && ItemSelection.CanClearSelection(evt))
                {
                    SelectionManager.Clear();
                    item.Select();
                    return(true);
                }

                if (m_CycleMarkersPending)
                {
                    m_CycleMarkersPending = false;
                    TimelineMarkerClusterGUI.CycleMarkers();
                    return(true);
                }

                return(false);
            }

            m_TimeAreaAutoPanner = null;

            DropItems();

            m_SnapEngine      = null;
            m_MoveItemHandler = null;

            state.Evaluate();
            state.RemoveCaptured(this);
            m_Dragged = false;
            TimelineCursors.ClearCursor();

            return(true);
        }
        protected override bool MouseDrag(Event evt, WindowState state)
        {
            if (state.editSequence.isReadOnly)
            {
                return(false);
            }

            // case 1099285 - ctrl-click can cause no clips to be selected
            var selectedItemsGUI = SelectionManager.SelectedItems();

            if (!selectedItemsGUI.Any())
            {
                m_Dragged = false;
                return(false);
            }

            const float hDeadZone = 5.0f;
            const float vDeadZone = 5.0f;

            bool vDone = m_VerticalMovementDone || Math.Abs(evt.mousePosition.y - m_MouseDownPosition.y) > vDeadZone;
            bool hDone = m_HorizontalMovementDone || Math.Abs(evt.mousePosition.x - m_MouseDownPosition.x) > hDeadZone;

            m_CycleMarkersPending = false;

            if (!m_Dragged)
            {
                var canStartMove = vDone || hDone;

                if (canStartMove)
                {
                    state.AddCaptured(this);
                    m_Dragged = true;

                    var referenceTrack = GetTrackDropTargetAt(state, m_MouseDownPosition);

                    foreach (var item in selectedItemsGUI)
                    {
                        item.gui.StartDrag();
                    }

                    m_MoveItemHandler = new MoveItemHandler(state);

                    m_MoveItemHandler.Grab(selectedItemsGUI, referenceTrack, m_MouseDownPosition);

                    m_SnapEngine = new SnapEngine(m_MoveItemHandler, m_MoveItemHandler, ManipulateEdges.Both,
                                                  state, m_MouseDownPosition);

                    m_TimeAreaAutoPanner = new TimeAreaAutoPanner(state);
                }
            }

            if (!m_VerticalMovementDone)
            {
                m_VerticalMovementDone = vDone;

                if (m_VerticalMovementDone)
                {
                    m_MoveItemHandler.OnTrackDetach();
                }
            }

            if (!m_HorizontalMovementDone)
            {
                m_HorizontalMovementDone = hDone;
            }

            if (m_Dragged)
            {
                if (m_HorizontalMovementDone)
                {
                    m_SnapEngine.Snap(evt.mousePosition, evt.modifiers);
                }

                if (m_VerticalMovementDone)
                {
                    var track = GetTrackDropTargetAt(state, evt.mousePosition);
                    m_MoveItemHandler.UpdateTrackTarget(track);
                }

                state.Evaluate();
            }

            return(true);
        }
Exemple #6
0
        public void OnGUI(WindowState state, EventType rawType, Vector2 mousePosition)
        {
            if (m_Id == 0)
            {
                m_Id = GUIUtility.GetPermanentControlID();
            }

            if (state == null || state.GetWindow().treeView == null)
            {
                return;
            }

            var evt = Event.current;

            if (rawType == EventType.MouseDown || evt.type == EventType.MouseDown)
            {
                if (state.IsCurrentEditingASequencerTextField())
                {
                    return;
                }

                m_ActiveRect = TimelineWindow.instance.sequenceContentRect;

                //remove the track header splitter overlap
                m_ActiveRect.x     += k_HeaderSplitterOverlap;
                m_ActiveRect.width -= k_HeaderSplitterOverlap;

                if (!m_ActiveRect.Contains(mousePosition))
                {
                    return;
                }

                if (!CanStartRectangle(evt))
                {
                    return;
                }

                if (enableAutoPan)
                {
                    m_TimeAreaAutoPanner = new TimeAreaAutoPanner(state);
                }

                m_StartPoint = new TimelinePoint(state, mousePosition);
                m_EndPixel   = mousePosition;

                GUIUtility.hotControl = m_Id; //HACK: Because the treeView eats all the events, steal the hotControl if necessary...
                evt.Use();

                return;
            }

            switch (evt.GetTypeForControl(m_Id))
            {
            case EventType.KeyDown:
            {
                if (GUIUtility.hotControl == m_Id)
                {
                    if (evt.keyCode == KeyCode.Escape)
                    {
                        m_TimeAreaAutoPanner = null;

                        GUIUtility.hotControl = 0;
                        evt.Use();
                    }
                }

                return;
            }

            case EventType.MouseDrag:
            {
                if (GUIUtility.hotControl != m_Id)
                {
                    return;
                }

                m_EndPixel = mousePosition;
                evt.Use();

                return;
            }

            case EventType.MouseUp:
            {
                if (GUIUtility.hotControl != m_Id)
                {
                    return;
                }

                m_TimeAreaAutoPanner = null;

                var rect = CurrentRectangle();

                if (IsValidRect(rect))
                {
                    OnFinish(evt, state, rect);
                }

                GUIUtility.hotControl = 0;
                evt.Use();

                return;
            }
            }

            if (GUIUtility.hotControl == m_Id)
            {
                if (evt.type == EventType.Repaint)
                {
                    var r = CurrentRectangle();

                    if (IsValidRect(r))
                    {
                        using (new GUIViewportScope(m_ActiveRect))
                        {
                            DrawRectangle(r);
                        }
                    }
                }

                if (m_TimeAreaAutoPanner != null)
                {
                    m_TimeAreaAutoPanner.OnGUI(evt);
                }
            }
        }