From 6a154e094d9f6d65efd6f91ffdb2eea4773e91fc Mon Sep 17 00:00:00 2001 From: Tissevert Date: Thu, 22 Nov 2018 23:11:36 +0100 Subject: [PATCH] Implement text to be split in enough screens it takes to display it all --- src/main.js | 2 +- src/ui.js | 45 ++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/main.js b/src/main.js index 5c6a535..a76e980 100644 --- a/src/main.js +++ b/src/main.js @@ -5,7 +5,7 @@ window.addEventListener('load', function() { screen = Screen(dom); session = Session(); buttons = Buttons(session); - ui = UI(buttons, screen); + ui = UI(async, buttons, screen); automaton = Automaton(async, dom, messaging, screen, session, ui); messaging.start(); diff --git a/src/ui.js b/src/ui.js index 8c2544c..1c03b21 100644 --- a/src/ui.js +++ b/src/ui.js @@ -1,4 +1,5 @@ -function UI(buttons, screen) { +function UI(async, buttons, screen) { + var lineWidth = 36; return { animation: animation, @@ -30,13 +31,16 @@ function UI(buttons, screen) { function cinematic(frames, controls) { var remote = animation(frames); var mapping = {}; - for(var key in controls) { - mapping[key] = function() { + var escaper = function(f) { + return function() { buttons.pop(); remote.pause(); - controls[key](); + f(); }; } + for(var key in controls) { + mapping[key] = escaper(controls[key]); + } return function(f) { buttons.push(mapping); remote.run(); @@ -92,6 +96,37 @@ function UI(buttons, screen) { } function text(message) { - return textScreen(message); + var words = message.split(' '); + var i = 0; + var line = ''; + var screen = null; + var screens = []; + var width = 0; + while (i < words.length) { + if(width == 0) { + line = words[i]; + width += line.length; + i++; + } else { + if(width + words[i].length + 1 <= lineWidth) { + line += ' ' + words[i]; + width += 1 + words[i].length; + i++; + } else { + if(screen === null) { + screen = line; + } else { + screens.push(screen + ' ' + line); + screen = null; + } + line = ''; + width = 0; + } + } + } + screens.push(screen === null ? line : screen + ' ' + line); + return async.sequence.apply(null, + screens.map(function(s) { return textScreen(s); }) + ); } }