@@ -1,27 +1,27 @@
6−(function() {
2+Elm.Native.Signal.Mouse = function(elm) {
7 'use strict';
3 'use strict';
4+ elm.Native = elm.Native || {};
5+ elm.Native.Signal = elm.Native.Signal || {};
6+ if (elm.Native.Signal.Mouse) return elm.Native.Signal.Mouse;
8+ var Signal = Elm.Signal(elm);
9− var Misc = Elm.Native.Misc;
9+ var Misc = Elm.Native.Misc(elm);
11− var position = Elm.Signal.constant(Misc.Tuple(0,0));
11+ var position = Signal.constant(Misc.Tuple(0,0));
12 position.defaultNumberOfKids = 2;
12 position.defaultNumberOfKids = 2;
14 // do not get rid of x and y. By setting their default number
14 // do not get rid of x and y. By setting their default number
15 // of kids, it is possible to detatch the mouse listeners if
15 // of kids, it is possible to detatch the mouse listeners if
16 // they are not needed.
16 // they are not needed.
17− var x = Elm.Signal.lift(function(p){return p._0})(position);
17+ var x = Signal.lift(function(p){return p._0})(position);
18 x.defaultNumberOfKids = 0;
18 x.defaultNumberOfKids = 0;
19− var y = Elm.Signal.lift(function(p){return p._1})(position);
19+ var y = Signal.lift(function(p){return p._1})(position);
20 y.defaultNumberOfKids = 0;
20 y.defaultNumberOfKids = 0;
22− var isDown = Elm.Signal.constant(false);
22+ var isDown = Signal.constant(false);
23− var isClicked = Elm.Signal.constant(false);
23+ var isClicked = Signal.constant(false);
24− var clicks = Elm.Signal.constant(Misc.Tuple());
24+ var clicks = Signal.constant(Misc.Tuple0);
26 function getXY(e) {
26 function getXY(e) {
27 var posx = 0;
27 var posx = 0;
@@ -36,46 +36,43 @@ import Native.Misc
36 posy = e.clientY + document.body.scrollTop +
36 posy = e.clientY + document.body.scrollTop +
37 document.documentElement.scrollTop;
37 document.documentElement.scrollTop;
39− return Misc.Tuple(posx, posy);
39+ return Misc.Tuple2(posx, posy);
42− Misc.addListener(document, 'click', function(e) {
42+ function click(e) {
43− var hasListener1 = Dispatcher.notify(isClicked.id, true);
43+ var hasListener1 = elm.notify(isClicked.id, true);
44− var hasListener2 = Dispatcher.notify(clicks.id, Misc.Tuple());
44+ var hasListener2 = elm.notify(clicks.id, Misc.Tuple0);
45− Dispatcher.notify(isClicked.id, false);
45+ elm.notify(isClicked.id, false);
46− if (!hasListener1 && !hasListener2)
46+ if (!hasListener1 && !hasListener2)
47− this.removeEventListener('click',arguments.callee,false);
47+ this.removeEventListener('click',arguments.callee,false);
49− Misc.addListener(document, 'mousedown', function(e) {
49+
50− var hasListener = Dispatcher.notify(isDown.id, true);
51+ var hasListener = elm.notify(isDown.id, true);
52− this.removeEventListener('mousedown',arguments.callee,false);
52+ if (!hasListener) this.removeEventListener('mousedown',arguments.callee,false);
54− Misc.addListener(document, 'mouseup', function(e) {
54+
55− var hasListener = Dispatcher.notify(isDown.id, false);
56+ var hasListener = elm.notify(isDown.id, false);
57− this.removeEventListener('mouseup',arguments.callee,false);
57+ if (!hasListener) this.removeEventListener('mouseup',arguments.callee,false);
59− Misc.addListener(document, 'mousemove', function(e) {
59+
60− var hasListener = Dispatcher.notify(position.id, getXY(e));
61+ var hasListener = elm.notify(position.id, getXY(e));
62− this.removeEventListener('mousemove',arguments.callee,false);
62+ if (!hasListener) this.removeEventListener('mousemove',arguments.callee,false);
65+ Misc.addListener(elm.node, 'click' , click);
66+ Misc.addListener(elm.node, 'mousedown', down);
67+ Misc.addListener(elm.node, 'mouseup' , up);
68+ Misc.addListener(elm.node, 'mousemove', move);
65− var clickedOn = function(elem) {
70+ return elm.Native.Signal.Mouse = {
66− var node = Render.render(elem);
71+ position: position,
67− var click = Elm.Signal.constant(false);
72+ x:x,
68− Misc.addListener(node, 'click', function(e) {
73+ y:y,
69− Dispatcher.notify(click.id, true);
74+ isClicked: isClicked,
70− Dispatcher.notify(click.id, false);
75+ isDown: isDown,
71− });
76+ clicks: clicks
72− return Misc.Tuple(Misc.wrap(node), click);
74− Elm.Native.Mouse = {position: position,
77− isClicked: isClicked,
80− isClickedOn: clickedOn};