diff --git a/src/Node.ts b/src/Node.ts index ebb5303f..680cea6a 100644 --- a/src/Node.ts +++ b/src/Node.ts @@ -163,21 +163,19 @@ const emptyChildren: Collection = new Collection(); let idCounter = 1; // create all the events here -interface NodeEventMap { +type NodeEventMap = GlobalEventHandlersEventMap & { [index: string]: any; - click: MouseEvent; - touchstart: TouchEvent; -} +}; -export interface KonvaEventObject { +export interface KonvaEventObject { target: Shape | Stage; - evt: NodeEventMap[EventType]; + evt: EventType; currentTarget: Node; cancelBubble: boolean; child?: Node; } -export type KonvaEventListener = ( +export type KonvaEventListener = ( this: This, ev: KonvaEventObject ) => void; diff --git a/src/PointerEvents.ts b/src/PointerEvents.ts index 931cf496..78d294c9 100644 --- a/src/PointerEvents.ts +++ b/src/PointerEvents.ts @@ -5,12 +5,10 @@ import { Stage } from './Stage'; const Captures = new Map(); -export interface KonvaPointerEvent extends KonvaEventObject<'touchstart'> { +export interface KonvaPointerEvent extends KonvaEventObject { pointerId: number; } -let implicitRelease = null; - export function getCapturedShape(pointerId: number) { return Captures.get(pointerId); } @@ -29,9 +27,8 @@ export function hasPointerCapture(pointerId: number, shape: Shape | Stage) { export function setPointerCapture(pointerId: number, shape: Shape | Stage) { releaseCapture(pointerId); - const { content } = shape.getStage(); - - content.setPointerCapture(pointerId); + const stage = shape.getStage(); + if (!stage) return; Captures.set(pointerId, shape); @@ -46,9 +43,11 @@ export function releaseCapture(pointerId: number, target?: Shape | Stage) { if (!shape) return; - const { content } = shape.getStage(); + const stage = shape.getStage(); - content.releasePointerCapture(pointerId); + if (stage && stage.content) { + stage.content.releasePointerCapture(pointerId); + } Captures.delete(pointerId); diff --git a/src/Stage.ts b/src/Stage.ts index 40ade0b7..8942cb74 100644 --- a/src/Stage.ts +++ b/src/Stage.ts @@ -376,6 +376,19 @@ export class Stage extends Container { getLayer() { return null; } + + hasPointerCapture(pointerId: number): boolean { + return PointerEvents.hasPointerCapture(pointerId, this); + } + + setPointerCapture(pointerId: number) { + PointerEvents.setPointerCapture(pointerId, this); + } + + releaseCapture(pointerId: number) { + PointerEvents.releaseCapture(pointerId, this); + } + /** * returns a {@link Konva.Collection} of layers * @method diff --git a/src/index-types.d.ts b/src/index-types.d.ts index 2efb1edc..c50d421e 100644 --- a/src/index-types.d.ts +++ b/src/index-types.d.ts @@ -46,6 +46,8 @@ declare namespace Konva { EventType >; + export type KonvaPointerEvent = import('./PointerEvents').KonvaPointerEvent; + export type KonvaEventListener< This, EventType