2013-02-20 22:36:16 +00:00
|
|
|
|
2013-03-09 06:50:46 +00:00
|
|
|
Elm.Native.Mouse = function(elm) {
|
2013-02-22 23:19:40 +00:00
|
|
|
'use strict';
|
2013-03-09 04:17:01 +00:00
|
|
|
elm.Native = elm.Native || {};
|
2013-03-09 06:50:46 +00:00
|
|
|
if (elm.Native.Mouse) return elm.Native.Mouse;
|
2013-02-22 23:19:40 +00:00
|
|
|
|
2013-03-09 04:17:01 +00:00
|
|
|
var Signal = Elm.Signal(elm);
|
2013-03-10 03:02:07 +00:00
|
|
|
var Utils = Elm.Native.Utils(elm);
|
2013-02-22 23:19:40 +00:00
|
|
|
|
2013-03-10 03:02:07 +00:00
|
|
|
var position = Signal.constant(Utils.Tuple2(0,0));
|
2013-02-20 22:36:16 +00:00
|
|
|
position.defaultNumberOfKids = 2;
|
|
|
|
|
2013-03-10 03:02:07 +00:00
|
|
|
// do not move x and y into Elm. By setting their default number
|
2013-02-21 22:43:32 +00:00
|
|
|
// of kids, it is possible to detatch the mouse listeners if
|
|
|
|
// they are not needed.
|
2013-03-09 06:50:46 +00:00
|
|
|
var x = A2( Signal.lift, function(p){return p._0}, position);
|
2013-02-20 22:36:16 +00:00
|
|
|
x.defaultNumberOfKids = 0;
|
2013-03-09 06:50:46 +00:00
|
|
|
var y = A2( Signal.lift, function(p){return p._1}, position);
|
2013-02-20 22:36:16 +00:00
|
|
|
y.defaultNumberOfKids = 0;
|
|
|
|
|
2013-03-09 04:17:01 +00:00
|
|
|
var isDown = Signal.constant(false);
|
|
|
|
var isClicked = Signal.constant(false);
|
2013-03-10 03:02:07 +00:00
|
|
|
var clicks = Signal.constant(Utils.Tuple0);
|
2013-05-14 14:29:06 +00:00
|
|
|
|
2013-02-20 22:36:16 +00:00
|
|
|
function getXY(e) {
|
|
|
|
var posx = 0;
|
|
|
|
var posy = 0;
|
|
|
|
if (!e) e = window.event;
|
|
|
|
if (e.pageX || e.pageY) {
|
|
|
|
posx = e.pageX;
|
|
|
|
posy = e.pageY;
|
|
|
|
} else if (e.clientX || e.clientY) {
|
|
|
|
posx = e.clientX + document.body.scrollLeft +
|
|
|
|
document.documentElement.scrollLeft;
|
|
|
|
posy = e.clientY + document.body.scrollTop +
|
|
|
|
document.documentElement.scrollTop;
|
|
|
|
}
|
2013-05-14 14:29:06 +00:00
|
|
|
return Utils.Tuple2(posx-elm.node.offsetX, posy-elm.node.offsetY);
|
2013-02-20 22:36:16 +00:00
|
|
|
}
|
|
|
|
|
2013-05-14 14:29:06 +00:00
|
|
|
var node = elm.display === ElmRuntime.Display.FULLSCREEN ? document : elm.node;
|
2013-05-06 00:51:04 +00:00
|
|
|
|
2013-03-09 04:17:01 +00:00
|
|
|
function click(e) {
|
|
|
|
var hasListener1 = elm.notify(isClicked.id, true);
|
2013-03-10 03:02:07 +00:00
|
|
|
var hasListener2 = elm.notify(clicks.id, Utils.Tuple0);
|
2013-03-09 04:17:01 +00:00
|
|
|
elm.notify(isClicked.id, false);
|
|
|
|
if (!hasListener1 && !hasListener2)
|
2013-05-06 00:51:04 +00:00
|
|
|
node.removeEventListener('click', click);
|
2013-03-09 04:17:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function down(e) {
|
|
|
|
var hasListener = elm.notify(isDown.id, true);
|
2013-05-06 00:51:04 +00:00
|
|
|
if (!hasListener) node.removeEventListener('mousedown', down);
|
2013-03-09 04:17:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function up(e) {
|
|
|
|
var hasListener = elm.notify(isDown.id, false);
|
2013-05-06 00:51:04 +00:00
|
|
|
if (!hasListener) node.removeEventListener('mouseup', up);
|
2013-03-09 04:17:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function move(e) {
|
|
|
|
var hasListener = elm.notify(position.id, getXY(e));
|
2013-05-06 00:51:04 +00:00
|
|
|
if (!hasListener) node.removeEventListener('mousemove', move);
|
2013-03-09 04:17:01 +00:00
|
|
|
}
|
|
|
|
|
2013-05-06 00:51:04 +00:00
|
|
|
node.addEventListener('click' , click);
|
|
|
|
node.addEventListener('mousedown', down);
|
|
|
|
node.addEventListener('mouseup' , up);
|
|
|
|
node.addEventListener('mousemove', move);
|
2013-02-20 22:36:16 +00:00
|
|
|
|
2013-03-09 06:50:46 +00:00
|
|
|
return elm.Native.Mouse = {
|
2013-03-09 04:17:01 +00:00
|
|
|
position: position,
|
|
|
|
x:x,
|
|
|
|
y:y,
|
|
|
|
isClicked: isClicked,
|
|
|
|
isDown: isDown,
|
|
|
|
clicks: clicks
|
2013-02-20 22:36:16 +00:00
|
|
|
};
|
2013-03-09 04:17:01 +00:00
|
|
|
};
|