2017-11-15 15:13:49 +01:00
|
|
|
import { Group, Utils } from 'cal';
|
|
|
|
import createListener from 'touch-events';
|
|
|
|
import bowser from 'bowser';
|
|
|
|
import { convertEvent, isMouseEvent } from '../utils/pointerUtils.js';
|
2018-01-10 14:19:57 +01:00
|
|
|
import normalizeWheel from 'normalize-wheel';
|
2017-11-15 15:13:49 +01:00
|
|
|
|
|
|
|
const events = [
|
|
|
|
'wheel', 'tap',
|
|
|
|
'dragstart', 'drag', 'dragend',
|
|
|
|
'seconddragstart', 'seconddrag', 'seconddragend',
|
|
|
|
'multitouchstart', 'multitouch', 'multitouchend',
|
|
|
|
'pointerdown', 'pointermove', 'pointerup', 'pointerout', 'pointerover', 'pointerleave', 'pointercancel'
|
|
|
|
];
|
|
|
|
|
|
|
|
export default class EventGroup extends Group {
|
|
|
|
_addEventsListeners() {
|
|
|
|
// need to add timeout because this.convert event is not defined for some reason
|
|
|
|
setTimeout(() => {
|
|
|
|
for (let i = 0; i < events.length; i ++) {
|
|
|
|
const eventType = events[i];
|
|
|
|
this._eventDispatcher.addEventListener(eventType, this.convertEvent);
|
|
|
|
}
|
|
|
|
this.image.addEventListener('contextmenu', this.contextMenu);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
_removeEventListeners() {
|
|
|
|
for (let i = 0; i < events.length; i ++) {
|
|
|
|
const eventType = events[i];
|
|
|
|
this._eventDispatcher.removeEventListener(eventType, this.convertEvent);
|
|
|
|
}
|
|
|
|
this.image.removeEventListener('contextmenu', this.contextMenu);
|
|
|
|
}
|
|
|
|
contextMenu(event) {
|
|
|
|
event.preventDefault();
|
|
|
|
}
|
|
|
|
convertEvent = (event) => {
|
|
|
|
if (bowser.ios && isMouseEvent(event)) return;
|
|
|
|
|
|
|
|
switch (event.type) {
|
|
|
|
case 'pointerdown':
|
|
|
|
case 'pointermove':
|
|
|
|
case 'pointerup':
|
|
|
|
case 'pointerover':
|
|
|
|
case 'pointerout':
|
|
|
|
case 'pointerleave':
|
|
|
|
case 'pointercancel':
|
|
|
|
this.onEvent(event);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'wheel':
|
|
|
|
case 'tap':
|
|
|
|
case 'dragstart':
|
|
|
|
case 'drag':
|
|
|
|
case 'dragend':
|
|
|
|
case 'seconddragstart':
|
|
|
|
case 'seconddrag':
|
|
|
|
case 'seconddragend':
|
|
|
|
case 'multitouchstart':
|
|
|
|
case 'multitouch':
|
|
|
|
case 'multitouchend': {
|
|
|
|
const gestureEvent = { type: event.type };
|
|
|
|
|
|
|
|
const _convertEvent = convertEvent.bind(null, this.image);
|
|
|
|
|
|
|
|
if (event.event) gestureEvent.position = _convertEvent(event.event);
|
|
|
|
if (event.events) gestureEvent.positions = event.events.map(_convertEvent);
|
|
|
|
if (event.preEvents) gestureEvent.preDrags = event.preEvents.map(_convertEvent);
|
2018-01-10 15:24:25 +01:00
|
|
|
if (event.event && event.event.deltaY !== undefined) {
|
|
|
|
gestureEvent.wheelDelta = normalizeWheel(event.event).pixelY;
|
|
|
|
}
|
2017-11-15 15:13:49 +01:00
|
|
|
|
|
|
|
this.onEvent(gestureEvent);
|
|
|
|
}
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
onEvent(event) {
|
|
|
|
const objects = Utils.cloneArray(this.objects);
|
|
|
|
|
|
|
|
for (let i = objects.length - 1; i >= 0; i --) {
|
|
|
|
const object = objects[i];
|
|
|
|
if (object.active && object.onEvent !== undefined) {
|
|
|
|
if (object.onEvent(event, this)) break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
setCanvas(canvas) {
|
|
|
|
if (this.useCanvas && this.image instanceof Node) {
|
|
|
|
this._removeEventListeners();
|
|
|
|
}
|
|
|
|
|
|
|
|
super.setCanvas(canvas);
|
|
|
|
|
|
|
|
this._eventDispatcher = createListener(canvas);
|
|
|
|
|
|
|
|
if (this.useCanvas) {
|
|
|
|
this._addEventsListeners();
|
|
|
|
}
|
|
|
|
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
}
|