@@ -7,10 +7,16 @@ var newElement = Utils.newElement, extract = Utils.extract,
7 addTransform = Utils.addTransform, removeTransform = Utils.removeTransform,
7 addTransform = Utils.addTransform, removeTransform = Utils.removeTransform,
8 fromList = Utils.fromList, eq = Utils.eq;
8 fromList = Utils.fromList, eq = Utils.eq;
10−function setProps(props, e) {
10+function setProps(elem, e) {
11+ var props = elem.props;
12+ var element = elem.element;
13+ var width = props.width - (element.adjustWidth || 0);
14+ var height = props.height - (element.adjustHeight || 0);
11− e.style.width = (props.width |0) + 'px';
15+ e.style.width = (width |0) + 'px';
12− e.style.height = (props.height|0) + 'px';
16+ e.style.height = (height|0) + 'px';
17+ if (props.opacity !== 1) {
13− if (props.opacity !== 1) { e.style.opacity = props.opacity; }
18+ e.style.opacity = props.opacity;
14 if (props.color.ctor === 'Just') {
20 if (props.color.ctor === 'Just') {
15 e.style.backgroundColor = extract(props.color._0);
21 e.style.backgroundColor = extract(props.color._0);
@@ -28,35 +34,59 @@ function setProps(props, e) {
28 e.appendChild(a);
34 e.appendChild(a);
30 if (props.hover.ctor !== '_Tuple0') {
36 if (props.hover.ctor !== '_Tuple0') {
31− e.style.pointerEvents = 'auto';
32− e.elm_hover_handler = props.hover;
37+ addHover(e, props.hover);
33− e.elm_hover_count = 0;
34− e.addEventListener('mouseover', function() {
35− if (e.elm_hover_count++ > 0) return;
36− var handler = e.elm_hover_handler;
37− if (handler !== null) {
41− e.addEventListener('mouseout', function(evt) {
42− if (e.contains(evt.toElement || evt.relatedTarget)) return;
43− e.elm_hover_count = 0;
44− var handler = e.elm_hover_handler;
45− if (handler !== null) {
50 if (props.click.ctor !== '_Tuple0') {
39 if (props.click.ctor !== '_Tuple0') {
51− e.style.pointerEvents = 'auto';
52− e.elm_click_handler = props.click;
40+ addClick(e, props.click);
53− e.addEventListener('click', function() {
54− e.elm_click_handler(Tuple0);
45+function addClick(e, handler) {
46+ e.style.pointerEvents = 'auto';
47+ e.elm_click_handler = handler;
49+ e.elm_click_handler(Utils.Tuple0);
51+ e.elm_click_trigger = trigger;
52+ e.addEventListener('click', trigger);
55+function removeClick(e, handler) {
56+ if (e.elm_click_trigger) {
57+ e.removeEventListener('click', e.elm_click_trigger);
61+function addHover(e, handler) {
62+ e.style.pointerEvents = 'auto';
63+ e.elm_hover_handler = handler;
64+ e.elm_hover_count = 0;
67+ if (e.elm_hover_count++ > 0) return;
68+ e.elm_hover_handler(true);
71+ if (e.contains(evt.toElement || evt.relatedTarget)) return;
72+ e.elm_hover_count = 0;
73+ e.elm_hover_handler(false);
75+ e.elm_hover_over = over;
76+ e.elm_hover_out = out;
77+ e.addEventListener('mouseover', over);
78+ e.addEventListener('mouseout', out);
81+function removeHover(e) {
82+ if (e.elm_hover_over) {
83+ e.removeEventListener('mouseover', e.elm_hover_over);
85+ if (e.elm_hover_out) {
86+ e.removeEventListener('mouseout', e.elm_hover_out);
60function image(props, img) {
90function image(props, img) {
61 switch (img._0.ctor) {
91 switch (img._0.ctor) {
62 case 'Plain': return plainImage(img._3);
92 case 'Plain': return plainImage(img._3);
@@ -143,7 +173,12 @@ function toPos(pos) {
144// must clear right, left, top, bottom, and transform
174// must clear right, left, top, bottom, and transform
145// before calling this function
175// before calling this function
146−function setPos(pos,w,h,e) {
176+function setPos(pos,elem,e) {
177+ var element = elem.element;
178+ var props = elem.props;
179+ var w = props.width + (element.adjustWidth ? element.adjustWidth : 0);
180+ var h = props.height + (element.adjustHeight ? element.adjustHeight : 0);
147 e.style.position = 'absolute';
182 e.style.position = 'absolute';
148 e.style.margin = 'auto';
183 e.style.margin = 'auto';
149 var transform = '';
184 var transform = '';
@@ -163,7 +198,7 @@ function setPos(pos,w,h,e) {
164function container(pos,elem) {
199function container(pos,elem) {
165 var e = render(elem);
200 var e = render(elem);
166− setPos(pos, elem.props.width, elem.props.height, e);
201+ setPos(pos, elem, e);
167 var div = newElement('div');
202 var div = newElement('div');
168 div.style.position = 'relative';
203 div.style.position = 'relative';
169 div.style.overflow = 'hidden';
204 div.style.overflow = 'hidden';
@@ -200,7 +235,7 @@ function rawHtml(elem) {
200 return div;
235 return div;
203−function render(elem) { return setProps(elem.props, makeElement(elem)); }
238+function render(elem) { return setProps(elem, makeElement(elem)); }
204function makeElement(e) {
239function makeElement(e) {
205 var elem = e.element;
240 var elem = e.element;
206 switch(elem.ctor) {
241 switch(elem.ctor) {
@@ -294,7 +329,7 @@ function update(node, curr, next) {
295 case "Container":
330 case "Container":
296 update(node.firstChild, currE._1, nextE._1);
331 update(node.firstChild, currE._1, nextE._1);
297− setPos(nextE._0, nextE._1.props.width, nextE._1.props.height, node.firstChild);
332+ setPos(nextE._0, nextE._1, node.firstChild);
299 case "Custom":
334 case "Custom":
300 if (currE.type === nextE.type) {
335 if (currE.type === nextE.type) {
@@ -308,10 +343,19 @@ function update(node, curr, next) {
310function updateProps(node, curr, next) {
345function updateProps(node, curr, next) {
311− var props = next.props, currP = curr.props, e = node;
346+ var props = next.props;
347+ var currP = curr.props;
349+ var element = next.element;
350+ var width = props.width - (element.adjustWidth || 0);
351+ var height = props.height - (element.adjustHeight || 0);
352+ if (width !== currP.width) {
312− if (props.width !== currP.width) e.style.width = (props.width |0) + 'px';
353+ e.style.width = (width|0) + 'px';
355+ if (height !== currP.height) {
313− if (props.height !== currP.height) e.style.height = (props.height|0) + 'px';
356+ e.style.height = (height|0) + 'px';
314− if (props.opacity !== 1 && props.opacity !== currP.opacity) {
358+ if (props.opacity !== currP.opacity) {
315 e.style.opacity = props.opacity;
359 e.style.opacity = props.opacity;
317 var nextColor = (props.color.ctor === 'Just' ?
361 var nextColor = (props.color.ctor === 'Just' ?
@@ -338,17 +382,21 @@ function updateProps(node, curr, next) {
340 // update hover handlers
384 // update hover handlers
341− if (props.hover.ctor !== '_Tuple0') {
385+ if (props.hover.ctor === '_Tuple0') {
342− e.elm_hover_handler = props.hover;
386+ removeHover(e);
343 } else if (e.elm_hover_handler) {
387 } else if (e.elm_hover_handler) {
344− e.elm_hover_handler = null;
388+ e.elm_hover_handler = props.hover;
390+ addHover(e, props.hover);
347 // update click handlers
393 // update click handlers
348− if (props.click.ctor !== '_Tuple0') {
394+ if (props.click.ctor === '_Tuple0') {
349− e.elm_click_handler = props.click;
395+ removeClick(e);
350 } else if (e.elm_click_handler) {
396 } else if (e.elm_click_handler) {
351− e.elm_click_handler = null;
397+ e.elm_click_handler = props.click;
399+ addClick(e, props.click);