input/MouseHandler.tstypescript
export type MouseEventExt = MouseEvent & { wheelDelta?: number; deltaY?: number; isTouchPad?: boolean };
export interface MouseHandlerEvent {
button?: number;
clientX: number;
clientY: number;
}
type MouseHandlerEventCallback = (sys: MouseEvent, event?: MouseHandlerEvent) => void;
function _checkTouchPad(e: MouseEventExt): boolean {
//@ts-ignore
if (e.deltaMode !== 0) {
return false;
}
//@ts-ignore
return Math.abs(e.deltaY) < 50;
//@ts-ignore
//return e.wheelDeltaY ? e.wheelDeltaY === -3 * e.deltaY : e.deltaMode === 0
}
class MouseHandler {
protected _htmlObject: HTMLElement;
constructor(htmlObject: HTMLElement) {
this._htmlObject = htmlObject;
}
public setEvent(event: string, sender: any, callback: MouseHandlerEventCallback) {
switch (event) {
case "mousewheel":
// this._htmlObject.addEventListener('mousewheel', function (event: WheelEventExt) {
// let delta = event.deltaY || event.detail || event.wheelDelta || 0;
// if (event.wheelDelta == undefined) {
// event.wheelDelta = delta * (-120);
// }
// callback.call(sender, event);
// event.preventDefault();
// }, false);
this._htmlObject.addEventListener(
"wheel",
(event: MouseEventExt) => {
let delta = event.deltaY || event.detail || event.wheelDelta || 0;
if (event.wheelDelta == undefined) {
event.wheelDelta = delta * -120;
}
event.isTouchPad = _checkTouchPad(event);
callback.call(sender, event);
event.preventDefault();
},
false
);
break;
case "mousedown":
this._htmlObject.addEventListener("mousedown", function (event: MouseEventExt) {
let rect = this.getBoundingClientRect();
callback.call(sender, event, {
button: event.button,
clientX: event.clientX - rect.left,
clientY: event.clientY - rect.top
});
});
this._htmlObject.addEventListener("contextmenu", function (event: MouseEventExt) {
event.preventDefault();
return false;
});
break;
case "mouseup":
this._htmlObject.addEventListener("mouseup", function (event: MouseEventExt) {
let rect = this.getBoundingClientRect();
callback.call(sender, event, {
button: event.button,
clientX: event.clientX - rect.left,
clientY: event.clientY - rect.top
});
});
break;
case "mousemove":
this._htmlObject.addEventListener("mousemove", function (event: MouseEventExt) {
let rect = this.getBoundingClientRect();
callback.call(sender, event, {
clientX: event.clientX - rect.left,
clientY: event.clientY - rect.top
});
});
break;
case "mouseleave":
this._htmlObject.addEventListener("mouseleave", function (event: MouseEventExt) {
callback.call(sender, event);
});
break;
case "mouseout":
this._htmlObject.addEventListener("mouseout", function (event: MouseEventExt) {
callback.call(sender, event);
});
break;
case "mouseover":
this._htmlObject.addEventListener("mouseover", function (event: MouseEventExt) {
callback.call(sender, event);
});
break;
case "mouseenter":
this._htmlObject.addEventListener("mouseenter", function (event: MouseEventExt) {
callback.call(sender, event);
});
break;
}
}
}
export { MouseHandler };