on c136ea7 help sign in
elk/core/Native/Mouse.js
81 lines 2.5 kB history raw
1/*
2import Signal
3import Native.Misc
4*/
6(function() {
7 'use strict';
9 var Misc = Elm.Native.Misc;
11 var position = Elm.Signal.constant(Misc.Tuple(0,0));
12 position.defaultNumberOfKids = 2;
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
16 // they are not needed.
17 var x = Elm.Signal.lift(function(p){return p._0})(position);
18 x.defaultNumberOfKids = 0;
19 var y = Elm.Signal.lift(function(p){return p._1})(position);
20 y.defaultNumberOfKids = 0;
22 var isDown = Elm.Signal.constant(false);
23 var isClicked = Elm.Signal.constant(false);
24 var clicks = Elm.Signal.constant(Misc.Tuple());
26 function getXY(e) {
27 var posx = 0;
28 var posy = 0;
29 if (!e) e = window.event;
30 if (e.pageX || e.pageY) {
31 posx = e.pageX;
32 posy = e.pageY;
33 } else if (e.clientX || e.clientY) {
34 posx = e.clientX + document.body.scrollLeft +
35 document.documentElement.scrollLeft;
36 posy = e.clientY + document.body.scrollTop +
37 document.documentElement.scrollTop;
38 }
39 return Misc.Tuple(posx, posy);
40 }
42 Misc.addListener(document, 'click', function(e) {
43 var hasListener1 = Dispatcher.notify(isClicked.id, true);
44 var hasListener2 = Dispatcher.notify(clicks.id, Misc.Tuple());
45 Dispatcher.notify(isClicked.id, false);
46 if (!hasListener1 && !hasListener2)
47 this.removeEventListener('click',arguments.callee,false);
48 });
49 Misc.addListener(document, 'mousedown', function(e) {
50 var hasListener = Dispatcher.notify(isDown.id, true);
51 if (!hasListener)
52 this.removeEventListener('mousedown',arguments.callee,false);
53 });
54 Misc.addListener(document, 'mouseup', function(e) {
55 var hasListener = Dispatcher.notify(isDown.id, false);
56 if (!hasListener)
57 this.removeEventListener('mouseup',arguments.callee,false);
58 });
59 Misc.addListener(document, 'mousemove', function(e) {
60 var hasListener = Dispatcher.notify(position.id, getXY(e));
61 if (!hasListener)
62 this.removeEventListener('mousemove',arguments.callee,false);
63 });
65 var clickedOn = function(elem) {
66 var node = Render.render(elem);
67 var click = Elm.Signal.constant(false);
68 Misc.addListener(node, 'click', function(e) {
69 Dispatcher.notify(click.id, true);
70 Dispatcher.notify(click.id, false);
71 });
72 return Misc.Tuple(Misc.wrap(node), click);
73 };
74 Elm.Native.Mouse = {position: position,
75 x:x,
76 y:y,
77 isClicked: isClicked,
78 isDown: isDown,
79 clicks: clicks,
80 isClickedOn: clickedOn};
81}());