internal void CommitElementUnderPointers(EventDispatcher dispatcher) { for (var i = 0; i < m_TopElementUnderPointer.Length; i++) { if (m_TopElementUnderPointer[i] == m_PendingTopElementUnderPointer[i]) { continue; } if (m_TriggerPointerEvent[i] == null && m_TriggerMouseEvent[i] == null) { using (new EventDispatcherGate(dispatcher)) { Vector2 position = PointerDeviceState.GetPointerPosition(i); PointerEventsHelper.SendOverOut(m_TopElementUnderPointer[i], m_PendingTopElementUnderPointer[i], null, position, i); PointerEventsHelper.SendEnterLeave <PointerLeaveEvent, PointerEnterEvent>( m_TopElementUnderPointer[i], m_PendingTopElementUnderPointer[i], null, position, i); if (i == PointerId.mousePointerId) { MouseEventsHelper.SendMouseOverMouseOut(m_TopElementUnderPointer[i], m_PendingTopElementUnderPointer[i], null, position); MouseEventsHelper.SendEnterLeave <MouseLeaveEvent, MouseEnterEvent>( m_TopElementUnderPointer[i], m_PendingTopElementUnderPointer[i], null, position); } } } if (m_TriggerPointerEvent[i] != null) { if ((m_TriggerPointerEvent[i] as EventBase)?.eventTypeId == PointerMoveEvent.TypeId() || (m_TriggerPointerEvent[i] as EventBase)?.eventTypeId == PointerDownEvent.TypeId() || (m_TriggerPointerEvent[i] as EventBase)?.eventTypeId == PointerUpEvent.TypeId() || (m_TriggerPointerEvent[i] as EventBase)?.eventTypeId == PointerCancelEvent.TypeId()) { using (new EventDispatcherGate(dispatcher)) { PointerEventsHelper.SendOverOut(m_TopElementUnderPointer[i], m_PendingTopElementUnderPointer[i], m_TriggerPointerEvent[i], m_TriggerPointerEvent[i].position, i); PointerEventsHelper.SendEnterLeave <PointerLeaveEvent, PointerEnterEvent>( m_TopElementUnderPointer[i], m_PendingTopElementUnderPointer[i], m_TriggerPointerEvent[i], m_TriggerPointerEvent[i].position, i); } } m_TriggerPointerEvent[i] = null; } if (m_TriggerMouseEvent[i] != null) { if ((m_TriggerMouseEvent[i] as EventBase)?.eventTypeId == MouseMoveEvent.TypeId() || (m_TriggerMouseEvent[i] as EventBase)?.eventTypeId == MouseDownEvent.TypeId() || (m_TriggerMouseEvent[i] as EventBase)?.eventTypeId == MouseUpEvent.TypeId() || (m_TriggerMouseEvent[i] as EventBase)?.eventTypeId == WheelEvent.TypeId()) { using (new EventDispatcherGate(dispatcher)) { MouseEventsHelper.SendMouseOverMouseOut(m_TopElementUnderPointer[i], m_PendingTopElementUnderPointer[i], m_TriggerMouseEvent[i], m_TriggerMouseEvent[i].mousePosition); MouseEventsHelper.SendEnterLeave <MouseLeaveEvent, MouseEnterEvent>( m_TopElementUnderPointer[i], m_PendingTopElementUnderPointer[i], m_TriggerMouseEvent[i], m_TriggerMouseEvent[i].mousePosition); } } else if ((m_TriggerMouseEvent[i] as EventBase)?.eventTypeId == MouseEnterWindowEvent.TypeId() || (m_TriggerMouseEvent[i] as EventBase)?.eventTypeId == MouseLeaveWindowEvent.TypeId() ) { using (new EventDispatcherGate(dispatcher)) { PointerEventsHelper.SendOverOut(m_TopElementUnderPointer[i], m_PendingTopElementUnderPointer[i], null, m_TriggerMouseEvent[i].mousePosition, i); PointerEventsHelper.SendEnterLeave <PointerLeaveEvent, PointerEnterEvent>( m_TopElementUnderPointer[i], m_PendingTopElementUnderPointer[i], null, m_TriggerMouseEvent[i].mousePosition, i); if (i == PointerId.mousePointerId) { MouseEventsHelper.SendMouseOverMouseOut(m_TopElementUnderPointer[i], m_PendingTopElementUnderPointer[i], m_TriggerMouseEvent[i], m_TriggerMouseEvent[i].mousePosition); MouseEventsHelper.SendEnterLeave <MouseLeaveEvent, MouseEnterEvent>( m_TopElementUnderPointer[i], m_PendingTopElementUnderPointer[i], m_TriggerMouseEvent[i], m_TriggerMouseEvent[i].mousePosition); } } } else if ((m_TriggerMouseEvent[i] as EventBase)?.eventTypeId == DragUpdatedEvent.TypeId() || (m_TriggerMouseEvent[i] as EventBase)?.eventTypeId == DragExitedEvent.TypeId()) { using (new EventDispatcherGate(dispatcher)) { PointerEventsHelper.SendOverOut(m_TopElementUnderPointer[i], m_PendingTopElementUnderPointer[i], null, m_TriggerMouseEvent[i].mousePosition, i); PointerEventsHelper.SendEnterLeave <PointerLeaveEvent, PointerEnterEvent>( m_TopElementUnderPointer[i], m_PendingTopElementUnderPointer[i], null, m_TriggerMouseEvent[i].mousePosition, i); MouseEventsHelper.SendMouseOverMouseOut(m_TopElementUnderPointer[i], m_PendingTopElementUnderPointer[i], m_TriggerMouseEvent[i], m_TriggerMouseEvent[i].mousePosition); MouseEventsHelper.SendEnterLeave <MouseLeaveEvent, MouseEnterEvent>( m_TopElementUnderPointer[i], m_PendingTopElementUnderPointer[i], m_TriggerMouseEvent[i], m_TriggerMouseEvent[i].mousePosition); MouseEventsHelper.SendEnterLeave <DragLeaveEvent, DragEnterEvent>( m_TopElementUnderPointer[i], m_PendingTopElementUnderPointer[i], m_TriggerMouseEvent[i], m_TriggerMouseEvent[i].mousePosition); } } m_TriggerMouseEvent[i] = null; } m_TopElementUnderPointer[i] = m_PendingTopElementUnderPointer[i]; } }
public void DispatchEvent(EventBase evt, IPanel panel) { IMouseEvent mouseEvent = evt as IMouseEvent; if (mouseEvent == null) { return; } BaseVisualElementPanel basePanel = panel as BaseVisualElementPanel; // update element under mouse and fire necessary events bool shouldRecomputeTopElementUnderMouse = true; if ((IMouseEventInternal)mouseEvent != null) { shouldRecomputeTopElementUnderMouse = ((IMouseEventInternal)mouseEvent).recomputeTopElementUnderMouse; } VisualElement elementUnderMouse = shouldRecomputeTopElementUnderMouse ? basePanel?.Pick(mouseEvent.mousePosition) : basePanel?.GetTopElementUnderPointer(PointerId.mousePointerId); if (evt.target == null && elementUnderMouse != null) { evt.propagateToIMGUI = false; evt.target = elementUnderMouse; } else if (evt.target == null && elementUnderMouse == null) { // Don't modify evt.propagateToIMGUI. evt.target = panel?.visualTree; } else if (evt.target != null) { evt.propagateToIMGUI = false; } if (basePanel != null) { // If mouse leaves the window, make sure element under mouse is null. // However, if pressed button != 0, we are getting a MouseLeaveWindowEvent as part of // of a drag and drop operation, at the very beginning of the drag. Since // we are not really exiting the window, we do not want to set the element // under mouse to null in this case. if (evt.eventTypeId == MouseLeaveWindowEvent.TypeId() && (evt as MouseLeaveWindowEvent).pressedButtons == 0) { basePanel.SetElementUnderPointer(null, evt); } else if (shouldRecomputeTopElementUnderMouse) { basePanel.SetElementUnderPointer(elementUnderMouse, evt); } } if (evt.target != null) { EventDispatchUtilities.PropagateEvent(evt); } if (!evt.isPropagationStopped && panel != null) { if (evt.propagateToIMGUI || evt.eventTypeId == MouseEnterWindowEvent.TypeId() || evt.eventTypeId == MouseLeaveWindowEvent.TypeId() ) { EventDispatchUtilities.PropagateToIMGUIContainer(panel.visualTree, evt); } } evt.stopDispatch = true; }
internal void CommitElementUnderPointers(EventDispatcher dispatcher) { for (var i = 0; i < m_TopElementUnderPointer.Length; i++) { var triggerPointerEvent = m_TriggerPointerEvent[i]; var previous = m_TopElementUnderPointer[i]; var current = m_PendingTopElementUnderPointer[i]; if (current == previous) { if (triggerPointerEvent != null) { var pos3d = triggerPointerEvent.position; m_PickingPointerPositions[i] = new Vector2(pos3d.x, pos3d.y); } else if (m_TriggerMouseEvent[i] != null) { m_PickingPointerPositions[i] = m_TriggerMouseEvent[i].mousePosition; } continue; } m_TopElementUnderPointer[i] = current; if (triggerPointerEvent == null && m_TriggerMouseEvent[i] == null) { using (new EventDispatcherGate(dispatcher)) { Vector2 position = PointerDeviceState.GetPointerPosition(i); PointerEventsHelper.SendOverOut(previous, current, null, position, i); PointerEventsHelper.SendEnterLeave <PointerLeaveEvent, PointerEnterEvent>( previous, current, null, position, i); m_PickingPointerPositions[i] = position; if (i == PointerId.mousePointerId) { MouseEventsHelper.SendMouseOverMouseOut(previous, current, null, position); MouseEventsHelper.SendEnterLeave <MouseLeaveEvent, MouseEnterEvent>( previous, current, null, position); } } } if (triggerPointerEvent != null) { var pos3d = triggerPointerEvent.position; m_PickingPointerPositions[i] = new Vector2(pos3d.x, pos3d.y); var baseEvent = triggerPointerEvent as EventBase; if (baseEvent != null && ( baseEvent.eventTypeId == PointerMoveEvent.TypeId() || baseEvent.eventTypeId == PointerDownEvent.TypeId() || baseEvent.eventTypeId == PointerUpEvent.TypeId() || baseEvent.eventTypeId == PointerCancelEvent.TypeId())) { using (new EventDispatcherGate(dispatcher)) { PointerEventsHelper.SendOverOut(previous, current, triggerPointerEvent, pos3d, i); PointerEventsHelper.SendEnterLeave <PointerLeaveEvent, PointerEnterEvent>( previous, current, triggerPointerEvent, pos3d, i); } } } m_TriggerPointerEvent[i] = null; var triggerMouseEvent = m_TriggerMouseEvent[i]; if (triggerMouseEvent != null) { Vector2 mousePos = triggerMouseEvent.mousePosition; m_PickingPointerPositions[i] = mousePos; var baseEvent = triggerMouseEvent as EventBase; if (baseEvent != null) { if (baseEvent.eventTypeId == MouseMoveEvent.TypeId() || baseEvent.eventTypeId == MouseDownEvent.TypeId() || baseEvent.eventTypeId == MouseUpEvent.TypeId() || baseEvent.eventTypeId == WheelEvent.TypeId()) { using (new EventDispatcherGate(dispatcher)) { MouseEventsHelper.SendMouseOverMouseOut(previous, current, triggerMouseEvent, mousePos); MouseEventsHelper.SendEnterLeave <MouseLeaveEvent, MouseEnterEvent>( previous, current, triggerMouseEvent, mousePos); } } else if (baseEvent.eventTypeId == MouseEnterWindowEvent.TypeId() || baseEvent.eventTypeId == MouseLeaveWindowEvent.TypeId() ) { using (new EventDispatcherGate(dispatcher)) { PointerEventsHelper.SendOverOut(previous, current, null, mousePos, i); PointerEventsHelper.SendEnterLeave <PointerLeaveEvent, PointerEnterEvent>( previous, current, null, mousePos, i); if (i == PointerId.mousePointerId) { MouseEventsHelper.SendMouseOverMouseOut(previous, current, triggerMouseEvent, mousePos); MouseEventsHelper.SendEnterLeave <MouseLeaveEvent, MouseEnterEvent>( previous, current, triggerMouseEvent, mousePos); } } } else if (baseEvent.eventTypeId == DragUpdatedEvent.TypeId() || baseEvent.eventTypeId == DragExitedEvent.TypeId()) { using (new EventDispatcherGate(dispatcher)) { PointerEventsHelper.SendOverOut(previous, current, null, mousePos, i); PointerEventsHelper.SendEnterLeave <PointerLeaveEvent, PointerEnterEvent>( previous, current, null, mousePos, i); MouseEventsHelper.SendMouseOverMouseOut(previous, current, triggerMouseEvent, mousePos); MouseEventsHelper.SendEnterLeave <MouseLeaveEvent, MouseEnterEvent>( previous, current, triggerMouseEvent, mousePos); MouseEventsHelper.SendEnterLeave <DragLeaveEvent, DragEnterEvent>( previous, current, triggerMouseEvent, mousePos); } } } m_TriggerMouseEvent[i] = null; } } }
public void DispatchEvent(EventBase evt, IPanel panel) { IMouseEvent mouseEvent = evt as IMouseEvent; if (mouseEvent == null) { return; } BaseVisualElementPanel basePanel = panel as BaseVisualElementPanel; // update element under mouse and fire necessary events bool shouldRecomputeTopElementUnderMouse = true; if ((IMouseEventInternal)mouseEvent != null) { shouldRecomputeTopElementUnderMouse = ((IMouseEventInternal)mouseEvent).recomputeTopElementUnderMouse; } VisualElement elementUnderMouse = shouldRecomputeTopElementUnderMouse ? basePanel?.Pick(mouseEvent.mousePosition) : basePanel?.GetTopElementUnderPointer(PointerId.mousePointerId); if (evt.target == null && elementUnderMouse != null) { evt.propagateToIMGUI = false; evt.target = elementUnderMouse; } else if (evt.target == null && elementUnderMouse == null) { // Event occured outside the window. // Send event to visual tree root and // don't modify evt.propagateToIMGUI. evt.target = panel?.visualTree; } else if (evt.target != null) { evt.propagateToIMGUI = false; } if (basePanel != null) { // If mouse leaves the window, make sure element under mouse is null. // However, if pressed button != 0, we are getting a MouseLeaveWindowEvent as part of // of a drag and drop operation, at the very beginning of the drag. Since // we are not really exiting the window, we do not want to set the element // under mouse to null in this case. if (evt.eventTypeId == MouseLeaveWindowEvent.TypeId() && (evt as MouseLeaveWindowEvent).pressedButtons == 0) { basePanel.SetElementUnderPointer(null, evt); } else if (shouldRecomputeTopElementUnderMouse) { basePanel.SetElementUnderPointer(elementUnderMouse, evt); } } if (evt.target != null) { EventDispatchUtilities.PropagateEvent(evt); if (evt.target is IMGUIContainer) { evt.propagateToIMGUI = true; evt.skipElements.Add(evt.target); } } if (!evt.isPropagationStopped && panel != null) { if (evt.propagateToIMGUI || evt.eventTypeId == MouseEnterWindowEvent.TypeId() || evt.eventTypeId == MouseLeaveWindowEvent.TypeId() ) { EventDispatchUtilities.PropagateToIMGUIContainer(panel.visualTree, evt); } else if (panel.visualTree.childCount > 0 && panel.visualTree[0] is IMGUIContainer) { // Send the events to the GUIView container so that it can process them. // This avoid elements near the edge of the window preventing the dock area splitter to work. // See case : https://fogbugz.unity3d.com/f/cases/1197851/ var topLevelIMGUI = (IMGUIContainer)panel.visualTree[0]; if (!evt.Skip(topLevelIMGUI) && evt.imguiEvent != null) { topLevelIMGUI.SendEventToIMGUI(evt, false); if (evt.imguiEvent.rawType == EventType.Used) { evt.StopPropagation(); } } } } evt.stopDispatch = true; }