/* 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){ // var delta = 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: null, down: null, move: null, drag: null, enter: null, up: null, rightclick: null, propagate: false, locked: false, use_offset: true, 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.enter && base.tube.on("enter", opt.enter) opt.leave && base.tube.on("leave", opt.leave) opt.up && base.tube.on("up", opt.up) opt.rightclick && base.tube.on("rightclick", opt.rightclick) var offset = (opt.use_offset && opt.el) ? opt.el.getBoundingClientRect() : null base.init = function (){ base.bind() } base.on = function(){ base.tube.on.apply(base.tube, arguments) } base.off = function(){ base.tube.off.apply(base.tube, arguments) } base.bind = function(){ if (opt.el) { opt.el.addEventListener("mousedown", base.mousedown) opt.el.addEventListener("contextmenu", base.contextmenu) } window.addEventListener("mousemove", base.mousemove) window.addEventListener("mouseup", base.mouseup) } base.bind_el = function(el){ el.addEventListener("mousedown", base.mousedown) el.addEventListener("mousemove", base.mousemove) } base.unbind_el = function(el){ el.removeEventListener("mousedown", base.mousedown) el.removeEventListener("mousemove", base.mousemove) } function positionFromMouse(e) { if (offset) { return new vec2(offset.left - e.pageX, e.pageY - offset.top) } else { return new vec2(e.pageX, e.pageY) } } base.mousedown = function(e){ if (opt.use_offset) { offset = this.getBoundingClientRect() } var pos = positionFromMouse(e) var x = pos.a, y = pos.b base.cursor = new Rect (x,y, x,y) base.down = true e.clickAccepted = true base.tube("down", e, base.cursor) if (e.clickAccepted) { e.stopPropagation() } else { base.down = false } } base.mousemove = function(e){ if (opt.use_offset && ! 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) e.stopPropagation() } 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.mouseenter = function(e, target, index){ if (! base.down) return if (opt.use_offset && ! offset) return base.tube("enter", e, target, base.cursor) } base.mouseleave = function(e, target){ if (! base.down) return if (opt.use_offset && ! offset) return base.tube("leave", e, target, base.cursor) } base.mouseup = function(e){ var pos, new_cursor if (base.down) { e.stopPropagation() 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() }