/* usage: base.mouse = new mouse({ el: document.querySelector("#map"), down: function(e, cursor){ // do something with val // cursor.x.a // cursor.y.a }, move: function(e, cursor, delta){ // delta.a (x) // delta.b (y) }, up: function(e, cursor, new_cursor){ // cursor.x.a // cursor.y.a }, }) */ function mouse (opt) { var base = this opt = defaults(opt, { el: document, down: null, move: null, drag: null, up: null, rightclick: null, propagate: false, locked: false, val: 0, }) base.down = false base.creating = false base.dragging = false base.cursor = new Rect(0,0,0,0) base.tube = new Tube () opt.down && base.tube.on("down", opt.down) opt.move && base.tube.on("move", opt.move) opt.drag && base.tube.on("drag", opt.drag) opt.up && base.tube.on("up", opt.up) opt.rightclick && base.tube.on("rightclick", opt.rightclick) var offset = opt.el.getBoundingClientRect() base.init = function (){ base.bind() } base.bind = function(){ opt.el.addEventListener("mousedown", base.mousedown) window.addEventListener("mousemove", base.mousemove) window.addEventListener("mouseup", base.mouseup) opt.el.addEventListener("contextmenu", base.contextmenu) } function positionFromMouse(e) { var mx = offset.left - e.pageX var my = e.pageY - offset.top return new vec2(mx, my) } base.mousedown = function(e){ e.stopPropagation() offset = opt.el.getBoundingClientRect() var pos = positionFromMouse(e) var x = pos.a, y = pos.b base.cursor = new Rect (x,y, x,y) base.down = true base.tube("down", e, base.cursor) } base.mousemove = function(e){ e.stopPropagation() if (! offset) return; var pos = positionFromMouse(e) if (e.shiftKey) { pos.quantize(10) } var x = pos.a, y = pos.b if (base.down) { base.cursor.x.b = x base.cursor.y.b = y base.tube("drag", e, base.cursor) } else { base.cursor.x.a = base.cursor.x.b = x base.cursor.y.a = base.cursor.y.b = y base.tube("move", e, base.cursor) } } base.mouseup = function(e){ e.stopPropagation() var pos, new_cursor if (base.down) { base.down = false pos = positionFromMouse(e) new_cursor = new Rect (pos.a, pos.b) base.tube("up", e, base.cursor, new_cursor) base.cursor = new_cursor } } base.contextmenu = function(e){ e.preventDefault() base.tube("rightclick", e, base.cursor) } base.init() }