function bindEvents()

in sim/visuals/util.ts [22:94]


    function bindEvents(e: SVGElement, move?: TouchCallback, down?: TouchCallback, up?: TouchCallback) {

        const moveEvent = move ? (ev: MouseEvent) => {
            move.call(this, ev);
            ev.preventDefault();
            ev.stopPropagation();
        } : undefined;

        const enterEvent = move ? (ev: MouseEvent) => {
            if (ev.buttons != 1) {
                // cancel all events when we re-enter without a button down
                upEvent(ev);
            }
        } : undefined;

        const upEvent = up ? (ev: MouseEvent) => {
            up.call(this, ev);
            ev.preventDefault();
            ev.stopPropagation();

            // Unregister document up and move events
            if ((window as any).PointerEvent) {
                if (moveEvent) document.removeEventListener("pointermove", moveEvent);
                if (upEvent) document.removeEventListener("pointerup", upEvent);
                if (upEvent) document.removeEventListener("pointercancel", upEvent);
                if (moveEvent) document.removeEventListener("pointerenter", enterEvent);
            } else {
                if (moveEvent) document.removeEventListener("mousemove", moveEvent);
                if (upEvent) document.removeEventListener("mouseup", upEvent);
                if (moveEvent) document.removeEventListener("mouseenter", enterEvent);
                if (pxsim.svg.isTouchEnabled()) {
                    if (moveEvent) document.removeEventListener("touchmove", moveEvent);
                    if (upEvent) document.removeEventListener("touchend", upEvent);
                    if (upEvent) document.removeEventListener("touchcancel", upEvent);
                }
            }
        } : undefined;

        const downEvent = down ? (ev: MouseEvent) => {
            down.call(this, ev);
            ev.preventDefault();
            ev.stopPropagation();

            // Register document up and move events
            if ((window as any).PointerEvent) {
                if (moveEvent) document.addEventListener("pointermove", moveEvent);
                if (upEvent) document.addEventListener("pointerup", upEvent);
                if (upEvent) document.addEventListener("pointercancel", upEvent);
                if (moveEvent) document.addEventListener("pointerenter", enterEvent);
            } else {
                if (moveEvent) document.addEventListener("mousemove", moveEvent);
                if (upEvent) document.addEventListener("mouseup", upEvent);
                if (moveEvent) document.addEventListener("mouseenter", enterEvent);

                if (pxsim.svg.isTouchEnabled()) {
                    if (moveEvent) document.addEventListener("touchmove", moveEvent);
                    if (upEvent) document.addEventListener("touchend", upEvent);
                    if (upEvent) document.addEventListener("touchcancel", upEvent);
                }
            }
        } : undefined;

        if ((window as any).PointerEvent) {
            if (downEvent) e.addEventListener("pointerdown", downEvent);
        }
        else {
            if (downEvent) e.addEventListener("mousedown", downEvent);

            if (pxsim.svg.isTouchEnabled()) {
                if (downEvent) e.addEventListener("touchstart", downEvent);
            }
        }
    }