private void OnSelectPressed(RaycastSource source)
        {
            Deselect();

            var eventData     = source.eventData;
            var hoveredObject = source.hoveredObject;

            eventData.pressPosition       = eventData.position;
            eventData.pointerPressRaycast = eventData.pointerCurrentRaycast;
            eventData.pointerPress        = hoveredObject;

            if (hoveredObject != null)             // Pressed when pointer is over something
            {
                var        draggedObject = hoveredObject;
                GameObject newPressed    = ExecuteEvents.ExecuteHierarchy(draggedObject, eventData, ExecuteEvents.pointerDownHandler);

                if (newPressed == null)                 // Gameobject does not have pointerDownHandler in hierarchy, but may still have click handler
                {
                    newPressed = ExecuteEvents.GetEventHandler <IPointerClickHandler>(draggedObject);
                }

                if (newPressed != null)
                {
                    draggedObject = newPressed;                     // Set current pressed to gameObject that handles the pointerDown event, not the root object
                    Select(draggedObject);
                    eventData.eligibleForClick = true;

                    // Track clicks for double-clicking, triple-clicking, etc.
                    float time = Time.realtimeSinceStartup;
                    if (newPressed == eventData.lastPress)
                    {
                        var diffTime = time - eventData.clickTime;
                        if (UIUtils.IsDoubleClick(diffTime))
                        {
                            ++eventData.clickCount;
                        }
                        else
                        {
                            eventData.clickCount = 1;
                        }
                    }
                    else
                    {
                        eventData.clickCount = 1;
                    }
                    eventData.clickTime = time;
                }

                ExecuteEvents.Execute(draggedObject, eventData, ExecuteEvents.beginDragHandler);
                ExecuteEvents.Execute(draggedObject, eventData, ExecuteRayEvents.beginDragHandler);
                eventData.dragging = true;
                if (dragStarted != null)
                {
                    dragStarted(draggedObject, eventData);
                }

                eventData.pointerDrag = draggedObject;
                source.draggedObject  = draggedObject;
            }
        }
        private void OnSelectPressed(RaycastSource source)
        {
            Deselect();

            var eventData     = source.eventData;
            var hoveredObject = source.hoveredObject;

            eventData.pressPosition       = eventData.position;
            eventData.pointerPressRaycast = eventData.pointerCurrentRaycast;
            eventData.pointerPress        = hoveredObject;

            if (hoveredObject != null)             // Pressed when pointer is over something
            {
                var        draggedObject = hoveredObject;
                GameObject newPressed    = ExecuteEvents.ExecuteHierarchy(draggedObject, eventData, ExecuteEvents.pointerDownHandler);

                if (newPressed == null)                 // Gameobject does not have pointerDownHandler in hierarchy, but may still have click handler
                {
                    newPressed = ExecuteEvents.GetEventHandler <IPointerClickHandler>(draggedObject);
                }

                if (newPressed != null)
                {
                    draggedObject = newPressed;                     // Set current pressed to gameObject that handles the pointerDown event, not the root object
                    Select(draggedObject);
                    eventData.eligibleForClick = true;
                }

                ExecuteEvents.Execute(draggedObject, eventData, ExecuteEvents.beginDragHandler);
                ExecuteEvents.Execute(draggedObject, eventData, ExecuteRayEvents.beginDragHandler);
                eventData.pointerDrag = draggedObject;
                source.selectedObject = draggedObject;
            }
        }
        public void AddRaycastSource(IProxy proxy, Node node, Transform rayOrigin, Func <RaycastSource, bool> validationCallback = null)
        {
            var source = new RaycastSource(proxy, rayOrigin, node, this, validationCallback);

            this.ConnectInterfaces(source, rayOrigin);
            m_RaycastSources.Add(rayOrigin, source);
        }
Exemple #4
0
        private GameObject GetRayIntersection(RaycastSource source)
        {
            // Move camera to position and rotation for the ray origin
            m_EventCamera.transform.position = source.rayOrigin.position;
            m_EventCamera.transform.rotation = source.rayOrigin.rotation;

            // World scaling also scales clipping planes
            var camera = CameraUtils.GetMainCamera();

            m_EventCamera.nearClipPlane = camera.nearClipPlane;
            m_EventCamera.farClipPlane  = camera.farClipPlane;

            var eventData = source.eventData;

            eventData.Reset();
            eventData.delta       = Vector2.zero;
            eventData.position    = m_EventCamera.pixelRect.center;
            eventData.scrollDelta = Vector2.zero;

            eventSystem.RaycastAll(eventData, m_RaycastResultCache);
            eventData.pointerCurrentRaycast = FindFirstRaycast(m_RaycastResultCache);
            var hit = eventData.pointerCurrentRaycast.gameObject;

            m_RaycastResultCache.Clear();
            return(hit);
        }
        private void OnSelectReleased(RaycastSource source)
        {
            var eventData     = source.eventData;
            var hoveredObject = source.hoveredObject;

            if (source.draggedObject)
            {
                ExecuteEvents.Execute(source.draggedObject, eventData, ExecuteEvents.pointerUpHandler);
            }

            if (source.draggedObject)
            {
                var draggedObject = source.draggedObject;
                if (dragEnded != null)
                {
                    dragEnded(draggedObject, eventData);
                }

                ExecuteEvents.Execute(draggedObject, eventData, ExecuteEvents.endDragHandler);
                ExecuteEvents.Execute(draggedObject, eventData, ExecuteRayEvents.endDragHandler);

                if (hoveredObject != null)
                {
                    ExecuteEvents.ExecuteHierarchy(hoveredObject, eventData, ExecuteEvents.dropHandler);
                }

                eventData.pointerDrag = null;
            }

            var clickHandler = ExecuteEvents.GetEventHandler <IPointerClickHandler>(hoveredObject);

            if (source.draggedObject == clickHandler && eventData.eligibleForClick)
            {
                ExecuteEvents.Execute(clickHandler, eventData, ExecuteEvents.pointerClickHandler);
            }

            eventData.dragging         = false;
            eventData.rawPointerPress  = null;
            eventData.pointerPress     = null;
            eventData.eligibleForClick = false;
            source.draggedObject       = null;
        }
        private GameObject GetRayIntersection(RaycastSource source)
        {
            // Move camera to position and rotation for the ray origin
            m_EventCamera.transform.position = source.rayOrigin.position;
            m_EventCamera.transform.rotation = source.rayOrigin.rotation;

            var eventData = source.eventData;

            eventData.Reset();
            eventData.delta       = Vector2.zero;
            eventData.position    = m_EventCamera.pixelRect.center;
            eventData.scrollDelta = Vector2.zero;

            eventSystem.RaycastAll(eventData, m_RaycastResultCache);
            eventData.pointerCurrentRaycast = FindFirstRaycast(m_RaycastResultCache);
            var hit = eventData.pointerCurrentRaycast.gameObject;

            m_RaycastResultCache.Clear();
            return(hit);
        }