diff --git a/lib/src/display/stage.dart b/lib/src/display/stage.dart index 953bdc7f..39790070 100644 --- a/lib/src/display/stage.dart +++ b/lib/src/display/stage.dart @@ -138,6 +138,28 @@ class Stage extends DisplayObjectContainer { EventStream get onMouseLeave => Stage.mouseLeaveEvent.forTarget(this); + /// Dispatched when an external HTML element was dragged entering the stage + /// canvas. + EventStream get onDragEnter => + const EventStreamProvider(MouseEvent.DRAG_ENTER) + .forTarget(this); + + /// Dispatched when an external HTML element was dragged leaving the stage + /// canvas. + EventStream get onDragLeave => + const EventStreamProvider(MouseEvent.DRAG_LEAVE) + .forTarget(this); + + /// Dispatched when an external HTML element was dragged over the stage + /// canvas. + EventStream get onDragOver => + const EventStreamProvider(MouseEvent.DRAG_OVER) + .forTarget(this); + + /// Dispatched when an external HTML element was dropped on stage canvas. + EventStream get onDrop => + const EventStreamProvider(MouseEvent.DROP).forTarget(this); + //---------------------------------------------------------------------------- Stage(CanvasElement canvas, @@ -183,6 +205,10 @@ class Stage extends DisplayObjectContainer { canvas.onMouseOut.listen(_onMouseEvent); canvas.onContextMenu.listen(_onMouseEvent); canvas.onMouseWheel.listen(_onMouseWheelEvent); + canvas.onDragEnter.listen(_onMouseEvent); + canvas.onDragLeave.listen(_onMouseEvent); + canvas.onDragOver.listen(_onMouseEvent); + canvas.onDrop.listen(_onMouseEvent); } final listenToTouchEvents = _inputEventMode == InputEventMode.TouchOnly || @@ -759,23 +785,25 @@ class Stage extends DisplayObjectContainer { mouseButton.target = target; mouseButton.clickTime = time; mouseButton.clickCount++; - } - - if (event.type == 'mouseup') { + } else if (event.type == 'mouseup') { mouseEventType = mouseButton.mouseUpEventType; mouseButton.buttonDown = false; isClick = mouseButton.target == target; isDoubleClick = isClick && mouseButton.clickCount.isEven && (time < mouseButton.clickTime + 500); - } - - if (event.type == 'mousemove') { + } else if (event.type == 'mousemove') { mouseEventType = MouseEvent.MOUSE_MOVE; - } - - if (event.type == 'contextmenu') { + } else if (event.type == 'contextmenu') { mouseEventType = MouseEvent.CONTEXT_MENU; + } else if (event.type == 'dragenter') { + mouseEventType = MouseEvent.DRAG_ENTER; + } else if (event.type == 'dragleave') { + mouseEventType = MouseEvent.DRAG_LEAVE; + } else if (event.type == 'dragover') { + mouseEventType = MouseEvent.DRAG_OVER; + } else if (event.type == 'drop') { + mouseEventType = MouseEvent.DROP; } //----------------------------------------------------------------- diff --git a/lib/src/events/mouse_event.dart b/lib/src/events/mouse_event.dart index d1f1c2e6..b69110d7 100644 --- a/lib/src/events/mouse_event.dart +++ b/lib/src/events/mouse_event.dart @@ -34,6 +34,11 @@ class MouseEvent extends InputEvent { static const String ROLL_OUT = 'rollOut'; static const String ROLL_OVER = 'rollOver'; + static const String DRAG_ENTER = 'dragEnter'; + static const String DRAG_LEAVE = 'dragLeave'; + static const String DRAG_OVER = 'dragOver'; + static const String DROP = 'drop'; + //--------------------------------------------------------------------------- /// The amount that is expected to scroll horizontally.