on master help sign in
Resolve #608
fe87712Evan Czaplicki
runtime/Render/Element.js+30−24
@@ -143,29 +143,37 @@ function croppedImage(elem, w, h, src) {
143 return e;
143 return e;
144}
144}
145
145
146−function goIn(e) { e.style.position = 'absolute'; return e; }
146+function goOut(e) { e.style.position = 'absolute'; return e; }
147function goDown(e) { return e }
147function goDown(e) { return e }
148function goRight(e) { e.style.styleFloat = e.style.cssFloat = "left"; return e; }
148function goRight(e) { e.style.styleFloat = e.style.cssFloat = "left"; return e; }
149−function flowWith(f, array) {
150− var container = newElement('div');
151− if (f == goIn) container.style.pointerEvents = 'none';
152
149
153− for (var i = array.length; i--; ) {
150+var directionTable = {
154− container.appendChild(f(render(array[i])));
151+ DUp : goDown,
152+ DDown : goDown,
153+ DLeft : goRight,
154+ DRight : goRight,
155+ DIn : goOut,
156+ DOut : goOut
155− }
157+};
156− return container;
158+function needsReversal(dir) {
159+ return dir == 'DUp' || dir == 'DLeft' || dir == 'DIn';
157}
160}
158
161
159function flow(dir,elist) {
162function flow(dir,elist) {
160 var array = fromList(elist);
163 var array = fromList(elist);
161− switch(dir.ctor) {
164+ var container = newElement('div');
162− case "DDown": array.reverse();
165+ var goDir = directionTable[dir];
163− case "DUp": return flowWith(goDown,array);
166+ if (goDir == goOut) {
164− case "DRight": array.reverse();
167+ container.style.pointerEvents = 'none';
165− case "DLeft": return flowWith(goRight,array);
166− case "DOut": array.reverse();
167− case "DIn": return flowWith(goIn,array);
168 }
168 }
169+ if (needsReversal(dir)) {
170+ array.reverse();
171+ }
172+ var len = array.length;
173+ for (var i = 0; i < len; ++i) {
174+ container.appendChild(goDir(render(array[i])));
175+ }
176+ return container;
169}
177}
170
178
171function toPos(pos) {
179function toPos(pos) {
@@ -245,7 +253,7 @@ function makeElement(e) {
245 var elem = e.element;
253 var elem = e.element;
246 switch(elem.ctor) {
254 switch(elem.ctor) {
247 case 'Image': return image(e.props, elem);
255 case 'Image': return image(e.props, elem);
248− case 'Flow': return flow(elem._0, elem._1);
256+ case 'Flow': return flow(elem._0.ctor, elem._1);
249 case 'Container': return container(elem._0, elem._1);
257 case 'Container': return container(elem._0, elem._1);
250 case 'Spacer': return newElement('div');
258 case 'Spacer': return newElement('div');
251 case 'RawHtml': return rawHtml(elem);
259 case 'RawHtml': return rawHtml(elem);
@@ -321,14 +329,12 @@ function update(node, curr, next) {
321 return true;
329 return true;
322 }
330 }
323 var currs = fromList(currE._1);
331 var currs = fromList(currE._1);
324− var goDir = function(x) { return x; };
325− switch(nextE._0.ctor) {
332+ var dir = nextE._0.ctor;
326− case "DDown": case "DUp": goDir = goDown; break;
333+ var goDir = directionTable[dir];
327− case "DRight": case "DLeft": goDir = goRight; break;
334+ var toReverse = needsReversal(dir);
328− case "DOut": case "DIn": goDir = goIn; break;
335+ var len = kids.length;
329− }
330− for (var i = kids.length; i-- ;) {
336+ for (var i = len; i-- ;) {
331− update(kids[i],currs[i],nexts[i]);
337+ update(kids[toReverse ? len - i - 1 : i],currs[i],nexts[i]);
332 goDir(kids[i]);
338 goDir(kids[i]);
333 }
339 }
334 break;
340 break;