public UnityEditorRenderPointerListener( PointerDragFromEditorEnterEventListener onPointerDragFromEditorEnter = null, PointerDragFromEditorHoverEventListener onPointerDragFromEditorHover = null, PointerDragFromEditorExitEventListener onPointerDragFromEditorExit = null, PointerDragFromEditorReleaseEventListener onPointerDragFromEditorRelease = null, HitTestBehavior behavior = HitTestBehavior.deferToChild, RenderBox child = null ) : base(behavior: behavior, child: child) { _onPointerDragFromEditorEnter = onPointerDragFromEditorEnter; _onPointerDragFromEditorHover = onPointerDragFromEditorHover; _onPointerDragFromEditorExit = onPointerDragFromEditorExit; _onPointerDragFromEditorRelease = onPointerDragFromEditorRelease; if (_onPointerDragFromEditorEnter != null || _onPointerDragFromEditorHover != null || _onPointerDragFromEditorExit != null || _onPointerDragFromEditorRelease != null ) { _hoverAnnotation = new EditorMouseTrackerAnnotation( onDragFromEditorEnter: _onPointerDragFromEditorEnter, onDragFromEditorHover: _onPointerDragFromEditorHover, onDragFromEditorExit: _onPointerDragFromEditorExit, onDragFromEditorRelease: _onPointerDragFromEditorRelease ); } }
void _scheduleDragFromEditorReleaseCheck() { DragAndDrop.AcceptDrag(); var lastMouseEvent = new List <PointerEvent>(); foreach (int deviceId in _lastMouseEvent.Keys) { var _deviceId = deviceId; var deviceEvent = _lastMouseEvent[_deviceId]; //only process PointerEditorDragEvents if (!(deviceEvent is PointerDragFromEditorEnterEvent || deviceEvent is PointerDragFromEditorHoverEvent || deviceEvent is PointerDragFromEditorExitEvent)) { continue; } lastMouseEvent.Add(_lastMouseEvent[_deviceId]); SchedulerBinding.instance.addPostFrameCallback(_ => { foreach (var lastEvent in lastMouseEvent) { EditorMouseTrackerAnnotation hit = annotationFinder(lastEvent.position); if (hit == null) { foreach (_EditorTrackedAnnotation trackedAnnotation in _trackedAnnotations.Values) { if (trackedAnnotation.activeDevices.Contains(_deviceId)) { trackedAnnotation.activeDevices.Remove(_deviceId); } } return; } _EditorTrackedAnnotation hitAnnotation = _findAnnotation(hit); // release if (hitAnnotation.activeDevices.Contains(_deviceId)) { if (hitAnnotation.annotation?.onDragFromEditorRelease != null) { hitAnnotation.annotation.onDragFromEditorRelease( PointerDragFromEditorReleaseEvent .fromDragFromEditorEvent( lastEvent, DragAndDrop.objectReferences, DragAndDrop.paths)); } hitAnnotation.activeDevices.Remove(_deviceId); } } }); } SchedulerBinding.instance.scheduleFrame(); }
_EditorTrackedAnnotation _findAnnotation(EditorMouseTrackerAnnotation annotation) { if (!_trackedAnnotations.TryGetValue(annotation, out var trackedAnnotation)) { D.assert(false, () => $"Unable to find annotation {annotation} in tracked annotations."); } return(trackedAnnotation); }
public void detachDragFromEditorAnnotation(EditorMouseTrackerAnnotation annotation) { var trackedAnnotation = _findAnnotation(annotation); foreach (var deviceId in trackedAnnotation.activeDevices) { annotation.onDragFromEditorExit(PointerDragFromEditorExitEvent.fromDragFromEditorEvent( _lastMouseEvent[deviceId] )); } _trackedAnnotations.Remove(annotation); }
void _updateAnnotations() { D.assert(_onPointerDragFromEditorEnter != _hoverAnnotation.onDragFromEditorEnter || _onPointerDragFromEditorHover != _hoverAnnotation.onDragFromEditorHover || _onPointerDragFromEditorExit != _hoverAnnotation.onDragFromEditorExit || _onPointerDragFromEditorRelease != _hoverAnnotation.onDragFromEditorRelease , () => "Shouldn't call _updateAnnotations if nothing has changed."); if (_hoverAnnotation != null && attached) { UiWidgetsEditorBinding.instance.editorMouseTracker.detachDragFromEditorAnnotation(_hoverAnnotation); } if (_onPointerDragFromEditorEnter != null || _onPointerDragFromEditorHover != null || _onPointerDragFromEditorExit != null || _onPointerDragFromEditorRelease != null ) { _hoverAnnotation = new EditorMouseTrackerAnnotation( onDragFromEditorEnter: _onPointerDragFromEditorEnter , onDragFromEditorHover: _onPointerDragFromEditorHover , onDragFromEditorExit: _onPointerDragFromEditorExit , onDragFromEditorRelease: _onPointerDragFromEditorRelease ); if (attached) { UiWidgetsEditorBinding.instance.editorMouseTracker.attachDragFromEditorAnnotation(_hoverAnnotation); } } else { _hoverAnnotation = null; } markNeedsPaint(); }
public void attachDragFromEditorAnnotation(EditorMouseTrackerAnnotation annotation) { _trackedAnnotations[annotation] = new _EditorTrackedAnnotation(annotation); _scheduleDragFromEditorMousePositionCheck(); }
public _EditorTrackedAnnotation(EditorMouseTrackerAnnotation annotation) { this.annotation = annotation; }
public void collectDragFromEditorMousePositions() { void exitAnnotation(_EditorTrackedAnnotation trackedAnnotation, int deviceId) { if (trackedAnnotation.activeDevices.Contains(deviceId)) { if (trackedAnnotation.annotation?.onDragFromEditorExit != null) { trackedAnnotation.annotation.onDragFromEditorExit( PointerDragFromEditorExitEvent.fromDragFromEditorEvent( _lastMouseEvent[deviceId])); } trackedAnnotation.activeDevices.Remove(deviceId); } } void exitAllDevices(_EditorTrackedAnnotation trackedAnnotation) { if (trackedAnnotation.activeDevices.isNotEmpty()) { HashSet <int> deviceIds = new HashSet <int>(trackedAnnotation.activeDevices); foreach (int deviceId in deviceIds) { exitAnnotation(trackedAnnotation, deviceId); } } } if (!mouseIsConnected) { foreach (var annotation in _trackedAnnotations.Values) { exitAllDevices(annotation); } return; } foreach (int deviceId in _lastMouseEvent.Keys) { PointerEvent lastEvent = _lastMouseEvent[deviceId]; EditorMouseTrackerAnnotation hit = annotationFinder(lastEvent.position); if (hit == null) { foreach (_EditorTrackedAnnotation trackedAnnotation in _trackedAnnotations.Values) { exitAnnotation(trackedAnnotation, deviceId); } return; } _EditorTrackedAnnotation hitAnnotation = _findAnnotation(hit); // While acrossing two areas, set the flag to true to prevent setting the Pointer Copy VisualMode to None // enter if (!hitAnnotation.activeDevices.Contains(deviceId)) { hitAnnotation.activeDevices.Add(deviceId); // Both onRelease or onEnter event will enable Copy VisualMode if (hitAnnotation.annotation?.onDragFromEditorRelease != null || hitAnnotation.annotation?.onDragFromEditorEnter != null) { if (hitAnnotation.annotation?.onDragFromEditorEnter != null) { hitAnnotation.annotation.onDragFromEditorEnter( PointerDragFromEditorEnterEvent .fromDragFromEditorEvent(lastEvent, DragAndDrop.objectReferences, DragAndDrop.paths)); } } } // hover if (hitAnnotation.annotation?.onDragFromEditorHover != null) { hitAnnotation.annotation.onDragFromEditorHover( PointerDragFromEditorHoverEvent.fromDragFromEditorEvent(lastEvent)); } // leave foreach (_EditorTrackedAnnotation trackedAnnotation in _trackedAnnotations.Values) { if (hitAnnotation == trackedAnnotation) { continue; } if (trackedAnnotation.activeDevices.Contains(deviceId)) { if (trackedAnnotation.annotation?.onDragFromEditorExit != null) { trackedAnnotation.annotation.onDragFromEditorExit( PointerDragFromEditorExitEvent .fromDragFromEditorEvent(lastEvent)); } trackedAnnotation.activeDevices.Remove(deviceId); } } } }