2012-10-16 06:03:14 +00:00
|
|
|
|
|
|
|
Elm.Mouse = function() {
|
|
|
|
var position = Elm.Signal.constant(Value.Tuple(0,0));
|
|
|
|
position.defaultNumberOfKids = 2;
|
|
|
|
|
|
|
|
var x = Elm.Signal.lift(function(p){return p[1];})(position);
|
|
|
|
x.defaultNumberOfKids = 0;
|
|
|
|
var y = Elm.Signal.lift(function(p){return p[2];})(position);
|
|
|
|
y.defaultNumberOfKids = 0;
|
|
|
|
|
|
|
|
var isDown = Elm.Signal.constant(false);
|
|
|
|
var isClicked = Elm.Signal.constant(false);
|
|
|
|
var clicks = Elm.Signal.constant(Value.Tuple());
|
|
|
|
|
|
|
|
function getXY(e) {
|
|
|
|
var posx = 0;
|
|
|
|
var posy = 0;
|
2012-11-14 08:30:06 +00:00
|
|
|
if (!e) e = window.event;
|
2012-10-16 06:03:14 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
return Value.Tuple(posx, posy);
|
|
|
|
}
|
|
|
|
|
2012-10-17 05:02:35 +00:00
|
|
|
Value.addListener(document, 'click', function(e) {
|
2012-10-16 06:03:14 +00:00
|
|
|
var hasListener1 = Dispatcher.notify(isClicked.id, true);
|
|
|
|
var hasListener2 = Dispatcher.notify(clicks.id, Value.Tuple());
|
|
|
|
Dispatcher.notify(isClicked.id, false);
|
|
|
|
if (!hasListener1 && !hasListener2)
|
|
|
|
this.removeEventListener('click',arguments.callee,false);
|
|
|
|
});
|
2012-10-17 05:02:35 +00:00
|
|
|
Value.addListener(document, 'mousedown', function(e) {
|
2012-10-16 06:03:14 +00:00
|
|
|
var hasListener = Dispatcher.notify(isDown.id, true);
|
|
|
|
if (!hasListener)
|
|
|
|
this.removeEventListener('mousedown',arguments.callee,false);
|
|
|
|
});
|
2012-10-17 05:02:35 +00:00
|
|
|
Value.addListener(document, 'mouseup', function(e) {
|
2012-10-16 06:03:14 +00:00
|
|
|
var hasListener = Dispatcher.notify(isDown.id, false);
|
|
|
|
if (!hasListener)
|
|
|
|
this.removeEventListener('mouseup',arguments.callee,false);
|
|
|
|
});
|
2012-10-17 05:02:35 +00:00
|
|
|
Value.addListener(document, 'mousemove', function(e) {
|
2012-10-16 06:03:14 +00:00
|
|
|
var hasListener = Dispatcher.notify(position.id, getXY(e));
|
|
|
|
if (!hasListener)
|
|
|
|
this.removeEventListener('mousemove',arguments.callee,false);
|
|
|
|
});
|
|
|
|
var clickedOn = function(elem) {
|
|
|
|
var node = Render.render(elem);
|
|
|
|
var click = Elm.Signal.constant(false);
|
2012-10-17 05:02:35 +00:00
|
|
|
Value.addListener(node, 'click', function(e) {
|
2012-10-16 06:03:14 +00:00
|
|
|
Dispatcher.notify(click.id, true);
|
|
|
|
Dispatcher.notify(click.id, false);
|
|
|
|
});
|
2012-10-17 05:02:35 +00:00
|
|
|
return Value.Tuple(Value.wrap(node), click);
|
2012-10-16 06:03:14 +00:00
|
|
|
};
|
|
|
|
return {position: position,
|
|
|
|
x:x,
|
|
|
|
y:y,
|
|
|
|
isClicked: isClicked,
|
|
|
|
isDown: isDown,
|
|
|
|
clicks: clicks,
|
|
|
|
isClickedOn: clickedOn
|
|
|
|
};
|
|
|
|
}();
|