@@ -81,7 +81,7 @@ var onMessagesModified = function(type,msg) {
8181 require ( "messages" ) . apply ( msg , MESSAGES ) ;
8282 // TODO: if new, show this new one
8383 if ( msg && msg . id !== "music" && msg . id !== "nav" && msg . new &&
84- ! ( ( require ( 'Storage' ) . readJSON ( 'setting.json' , 1 ) || { } ) . quiet ) ) {
84+ ! ( ( require ( 'Storage' ) . readJSON ( 'setting.json' , 1 ) || { } ) . quiet ) ) {
8585 require ( "messages" ) . buzz ( msg . src ) ;
8686 }
8787 if ( msg && msg . id == "music" ) {
@@ -105,35 +105,35 @@ function showMapMessage(msg) {
105105 var m , distance , street , target , img ;
106106 if ( "string" == typeof msg . distance ) // new gadgetbridge
107107 distance = msg . distance ;
108- else if ( "number" == typeof msg . distance ) // 0.74 gadgetbridge
109- distance = require ( "locale" ) . distance ( msg . distance ) ;
108+ else if ( "number" == typeof msg . distance ) // 0.74 gadgetbridge
109+ distance = require ( "locale" ) . distance ( msg . distance ) ;
110110 if ( msg . instr ) {
111111 var instr = msg . instr . replace ( / \s * \/ \s * / g, " \/\n" ) ; // convert slashes to newlines
112112 if ( instr . includes ( "towards" ) || instr . includes ( "toward" ) ) {
113113 m = instr . split ( / t o w a r d s | t o w a r d / ) ;
114114 target = m [ 0 ] . trim ( ) ;
115115 street = m [ 1 ] . trim ( ) ;
116116 } else
117- target = instr ;
117+ target = instr ;
118118 }
119119 var carIsRHD = ! ! settings . carIsRHD ;
120120 switch ( msg . action ) {
121- case "continue" : img = "EBgBAIABwAPgD/Af+D/8f/773/PPY8cDwAPAA8ADwAPAA8AAAAPAA8ADwAAAA8ADwAPA" ; break ;
122- case "left" : img = "GhcBAYAAAPAAAHwAAD4AAB8AAA+AAAf//8P///x///+PAAPx4AA8fAAHD4ABwfAAcDwAHAIABwAAAcAAAHAAABwAAAcAAAHAAABwAAAc" ; break ;
123- case "right" : img = "GhcBAABgAAA8AAAPgAAB8AAAPgAAB8D///j///9///+/AAPPAAHjgAD44AB8OAA+DgAPA4ABAOAAADgAAA4AAAOAAADgAAA4AAAOAAAA" ; break ;
124- case "left_slight" : img = "ERgB//B/+D/8H4AP4Af4A74Bz4Dj4HD4OD4cD4AD4ADwADwADgAHgAPAAOAAcAA4ABwADgAH" ; break ;
125- case "right_slight" : img = "ERgBB/+D/8H/4APwA/gD/APuA+cD44Phw+Dj4HPgAeAB4ADgAPAAeAA4ABwADgAHAAOAAcAA" ; break ;
126- case "left_sharp" : img = "GBaBAAAA+AAB/AAH/gAPjgAeBwA8BwB4B+DwB+HgB+PAB+eAB+8AB+4AB/wAB/gAB//gB//gB//gBwAABwAABwAABwAABw==" ; break ;
127- case "right_sharp" : img = "GBaBAB8AAD+AAH/gAHHwAOB4AOA8AOAeAOAPB+AHh+ADx+AB5+AA9+AAd+AAP+AAH+AH/+AH/+AH/+AAAOAAAOAAAOAAAA==" ; break ;
128- case "keep_left" : img = "ERmBAACAAOAB+AD+AP+B/+H3+PO+8c8w4wBwADgAHgAPAAfAAfAAfAAfAAeAAeAAcAA8AA4ABwADgA==" ; break ;
129- case "keep_right" : img = "ERmBAACAAOAA/AD+AP+A//D/fPueeceY4YBwADgAPAAeAB8AHwAfAB8ADwAPAAcAB4ADgAHAAOAAAA==" ; break ;
130- case "uturn_left" : img = "GRiBAAAH4AAP/AAP/wAPj8APAfAPAHgHgB4DgA8BwAOA4AHAcADsOMB/HPA7zvgd9/gOf/gHH/gDh/gBwfgA4DgAcBgAOAAAHAAADgAABw==" ; break ;
131- case "uturn_right" : img = "GRiBAAPwAAf+AAf/gAfj4AfAeAPAHgPADwHgA4DgAcBwAOA4AHAcBjhuB5x/A+57gP99wD/84A/8cAP8OAD8HAA4DgAMBwAAA4AAAcAAAA==" ; break ;
132- case "finish" : img = "HhsBAcAAAD/AAAH/wAAPB4AAeA4AAcAcAAYIcAA4cMAA48MAA4cMAAYAcAAcAcAAcA4AAOA4AAOBxjwHBzjwHjj/4Dnn/4B3P/4B+Pj4A8fj8Acfj8AI//8AA//+AA/j+AB/j+AB/j/A" ; break ;
133- case "roundabout_left" : img = carIsRHD ? "HBaCAAADwAAAAAAAD/AAAVUAAD/wABVVUAD/wABVVVQD/wAAVABUD/wAAVAAFT/////wABX/////8AAF//////AABT/////wABUP/AAD/AAVA/8AA/8AVAD/wAD//VQAP/AAP/1QAA/wAA/9AAADwAAD/AAAAAAAA/wAAAAAAAP8AAAAAAAD/AAAAAAAA/wAAAAAAAP8AAAAAAAD/AA=" : "HRYCAAPAAAAAAAAD/AAD//AAA/8AD///AAP/AA////AD/wAD/wP/A/8AA/wAP8P/////AAP//////8AA///////AAD/P////8AAP8P/AABUAD/AP/AAFUA/8AP/AAFX//AAP/AAFf/wAAP8AAB/8AAAPAAAD8AAAAAAAAPwAAAAAAAA/AAAAAAAAD8AAAAAAAAPwAAAAAAAA/AAAAAAAAD8AAA==" ; break ;
134- case "roundabout_right" : img = carIsRHD ? "HRaCAAAAAAAA8AAAP/8AAP8AAD///AA/8AA////AA/8AP/A/8AA/8A/wAP8AA/8P8AA/////8/wAD///////AAD//////8AAP////8P8ABUAAP/A/8AVQAD/wA//1UAA/8AA//VAAP/AAA/9AAA/wAAAPwAAA8AAAA/AAAAAAAAD8AAAAAAAAPwAAAAAAAA/AAAAAAAAD8AAAAAAAAPwAAAAAAA=" : "HBYCAAAAAAPAAABVQAAP8AAFVVQAD/wAFVVVAAP/ABUAFQAA/8BUAAVAAD/wVAAP/////FAAD/////9QAA//////VAAP/////FQAP8AAP/AVAP/AAP/AFX//AAP/AAV//AAP/AAAf/AAD/AAAD/AAAPAAAA/wAAAAAAAP8AAAAAAAD/AAAAAAAA/wAAAAAAAP8AAAAAAAD/AAAAAAA==" ; break ;
135- case "roundabout_straight" : img = carIsRHD ? "EBuCAAADwAAAD/AAAD/8AAD//wAD///AD///8D/P8/z/D/D//A/wPzAP8AwA//UAA//1QA//9VA/8AFUP8AAVD8AAFQ/AABUPwAAVD8AAFQ/wABUP/ABVA//9VAD//VAAP/1AAAP8AAAD/AAAA/wAA==" : "EBsCAAPAAAAP8AAAP/wAAP//AAP//8AP///wP8/z/P8P8P/8D/A/MA/wDABf/wABX//ABV//8BVAD/wVAAP8FQAA/BUAAPwVAAD8FQAA/BUAA/wVQA/8BV//8AFf/8AAX/8AAA/wAAAP8AAAD/AA" ; break ;
136- case "roundabout_uturn" : img = carIsRHD ? "ICCBAAAAAAAAAAAAAAAAAAAP4AAAH/AAAD/4AAB4fAAA8DwAAPAcAADgHgAA4B4AAPAcAADwPAAAeHwAADz4AAAc8AAABPAAAADwAAAY8YAAPPPAAD73gAAf/4AAD/8AABf8AAAb+AAAHfAAABzwAAAcYAAAAAAAAAAAAAAAAAAAAAAA" : "ICABAAAAAAAAAAAAAAAAAAfwAAAP+AAAH/wAAD4eAAA8DwAAOA8AAHgHAAB4BwAAOA8AADwPAAA+HgAAHzwAAA84AAAPIAAADwAAAY8YAAPPPAAB73wAAf/4AAD/8AAAP+gAAB/YAAAPuAAADzgAAAY4AAAAAAAAAAAAAAAAAAAAAAA=" ; break ;
121+ case "continue" : img = "EBgBAIABwAPgD/Af+D/8f/773/PPY8cDwAPAA8ADwAPAA8AAAAPAA8ADwAAAA8ADwAPA" ; break ;
122+ case "left" : img = "GhcBAYAAAPAAAHwAAD4AAB8AAA+AAAf//8P///x///+PAAPx4AA8fAAHD4ABwfAAcDwAHAIABwAAAcAAAHAAABwAAAcAAAHAAABwAAAc" ; break ;
123+ case "right" : img = "GhcBAABgAAA8AAAPgAAB8AAAPgAAB8D///j///9///+/AAPPAAHjgAD44AB8OAA+DgAPA4ABAOAAADgAAA4AAAOAAADgAAA4AAAOAAAA" ; break ;
124+ case "left_slight" : img = "ERgB//B/+D/8H4AP4Af4A74Bz4Dj4HD4OD4cD4AD4ADwADwADgAHgAPAAOAAcAA4ABwADgAH" ; break ;
125+ case "right_slight" : img = "ERgBB/+D/8H/4APwA/gD/APuA+cD44Phw+Dj4HPgAeAB4ADgAPAAeAA4ABwADgAHAAOAAcAA" ; break ;
126+ case "left_sharp" : img = "GBaBAAAA+AAB/AAH/gAPjgAeBwA8BwB4B+DwB+HgB+PAB+eAB+8AB+4AB/wAB/gAB//gB//gB//gBwAABwAABwAABwAABw==" ; break ;
127+ case "right_sharp" : img = "GBaBAB8AAD+AAH/gAHHwAOB4AOA8AOAeAOAPB+AHh+ADx+AB5+AA9+AAd+AAP+AAH+AH/+AH/+AH/+AAAOAAAOAAAOAAAA==" ; break ;
128+ case "keep_left" : img = "ERmBAACAAOAB+AD+AP+B/+H3+PO+8c8w4wBwADgAHgAPAAfAAfAAfAAfAAeAAeAAcAA8AA4ABwADgA==" ; break ;
129+ case "keep_right" : img = "ERmBAACAAOAA/AD+AP+A//D/fPueeceY4YBwADgAPAAeAB8AHwAfAB8ADwAPAAcAB4ADgAHAAOAAAA==" ; break ;
130+ case "uturn_left" : img = "GRiBAAAH4AAP/AAP/wAPj8APAfAPAHgHgB4DgA8BwAOA4AHAcADsOMB/HPA7zvgd9/gOf/gHH/gDh/gBwfgA4DgAcBgAOAAAHAAADgAABw==" ; break ;
131+ case "uturn_right" : img = "GRiBAAPwAAf+AAf/gAfj4AfAeAPAHgPADwHgA4DgAcBwAOA4AHAcBjhuB5x/A+57gP99wD/84A/8cAP8OAD8HAA4DgAMBwAAA4AAAcAAAA==" ; break ;
132+ case "finish" : img = "HhsBAcAAAD/AAAH/wAAPB4AAeA4AAcAcAAYIcAA4cMAA48MAA4cMAAYAcAAcAcAAcA4AAOA4AAOBxjwHBzjwHjj/4Dnn/4B3P/4B+Pj4A8fj8Acfj8AI//8AA//+AA/j+AB/j+AB/j/A" ; break ;
133+ case "roundabout_left" : img = carIsRHD ? "HBaCAAADwAAAAAAAD/AAAVUAAD/wABVVUAD/wABVVVQD/wAAVABUD/wAAVAAFT/////wABX/////8AAF//////AABT/////wABUP/AAD/AAVA/8AA/8AVAD/wAD//VQAP/AAP/1QAA/wAA/9AAADwAAD/AAAAAAAA/wAAAAAAAP8AAAAAAAD/AAAAAAAA/wAAAAAAAP8AAAAAAAD/AA=" : "HRYCAAPAAAAAAAAD/AAD//AAA/8AD///AAP/AA////AD/wAD/wP/A/8AA/wAP8P/////AAP//////8AA///////AAD/P////8AAP8P/AABUAD/AP/AAFUA/8AP/AAFX//AAP/AAFf/wAAP8AAB/8AAAPAAAD8AAAAAAAAPwAAAAAAAA/AAAAAAAAD8AAAAAAAAPwAAAAAAAA/AAAAAAAAD8AAA==" ; break ;
134+ case "roundabout_right" : img = carIsRHD ? "HRaCAAAAAAAA8AAAP/8AAP8AAD///AA/8AA////AA/8AP/A/8AA/8A/wAP8AA/8P8AA/////8/wAD///////AAD//////8AAP////8P8ABUAAP/A/8AVQAD/wA//1UAA/8AA//VAAP/AAA/9AAA/wAAAPwAAA8AAAA/AAAAAAAAD8AAAAAAAAPwAAAAAAAA/AAAAAAAAD8AAAAAAAAPwAAAAAAA=" : "HBYCAAAAAAPAAABVQAAP8AAFVVQAD/wAFVVVAAP/ABUAFQAA/8BUAAVAAD/wVAAP/////FAAD/////9QAA//////VAAP/////FQAP8AAP/AVAP/AAP/AFX//AAP/AAV//AAP/AAAf/AAD/AAAD/AAAPAAAA/wAAAAAAAP8AAAAAAAD/AAAAAAAA/wAAAAAAAP8AAAAAAAD/AAAAAAA==" ; break ;
135+ case "roundabout_straight" : img = carIsRHD ? "EBuCAAADwAAAD/AAAD/8AAD//wAD///AD///8D/P8/z/D/D//A/wPzAP8AwA//UAA//1QA//9VA/8AFUP8AAVD8AAFQ/AABUPwAAVD8AAFQ/wABUP/ABVA//9VAD//VAAP/1AAAP8AAAD/AAAA/wAA==" : "EBsCAAPAAAAP8AAAP/wAAP//AAP//8AP///wP8/z/P8P8P/8D/A/MA/wDABf/wABX//ABV//8BVAD/wVAAP8FQAA/BUAAPwVAAD8FQAA/BUAA/wVQA/8BV//8AFf/8AAX/8AAA/wAAAP8AAAD/AA" ; break ;
136+ case "roundabout_uturn" : img = carIsRHD ? "ICCBAAAAAAAAAAAAAAAAAAAP4AAAH/AAAD/4AAB4fAAA8DwAAPAcAADgHgAA4B4AAPAcAADwPAAAeHwAADz4AAAc8AAABPAAAADwAAAY8YAAPPPAAD73gAAf/4AAD/8AABf8AAAb+AAAHfAAABzwAAAcYAAAAAAAAAAAAAAAAAAAAAAA" : "ICABAAAAAAAAAAAAAAAAAAfwAAAP+AAAH/wAAD4eAAA8DwAAOA8AAHgHAAB4BwAAOA8AADwPAAA+HgAAHzwAAA84AAAPIAAADwAAAY8YAAPPPAAB73wAAf/4AAD/8AAAP+gAAB/YAAAPuAAADzgAAAY4AAAAAAAAAAAAAAAAAAAAAAA=" ; break ;
137137 }
138138
139139 layout = new Layout ( { type :"v" , c : [
@@ -196,7 +196,7 @@ function showMusicMessage(msg) {
196196 msg . new = false ;
197197 layout = undefined ;
198198 if ( wasNew ) checkMessages ( { clockIfNoMsg :1 , clockIfAllRead :1 , ignoreUnread :1 , openMusic :0 } ) ;
199- else returnToMain ( ) ;
199+ else returnToMain ( ) ;
200200 }
201201 function updateLabels ( ) {
202202 trackName = reduceStringAndPad ( msg . track , trackScrollOffset , 13 ) ;
@@ -274,16 +274,238 @@ function showMessageScroller(msg) {
274274 } ) ;
275275}
276276
277+ function showMessageScroller2 ( msg , persist , initAtEndOfMsg , alreadyProcessed ) { "ram"
278+ if ( initAtEndOfMsg === undefined ) { initAtEndOfMsg = false ; }
279+ if ( persist === undefined ) { persist = true ; }
280+ //if (!!alreadyProcessed) {
281+ // alreadyProcessed = { lines : [], startIdx : undefined, stopIdx : undefined };
282+ //}
283+
284+ //msg.new = false;
285+ require ( "widget_utils" ) . hide ( ) ;
286+
287+ if ( alreadyProcessed ) print ( "alreadyPeocessed start and stop idx: " , alreadyProcessed . startIdx , alreadyProcessed . stopIdx ) ;
288+
289+ if ( replying ) { return ; }
290+ if ( persist ) {
291+ cancelReloadTimeout ( ) ;
292+ } else {
293+ resetReloadTimeout ( ) ;
294+ }
295+
296+ let msgIdx = MESSAGES . findIndex ( ( m ) => m . id == msg . id )
297+ print ( "msgIdx" , msgIdx ) ;
298+ print ( msg ) ;
299+
300+ let cacheObj = { } ;
301+
302+ let startIdx = 0 ;
303+ let stopIdx = 0 ;
304+
305+ if ( alreadyProcessed === undefined ) {
306+ startIdx = Math . max ( msgIdx - 1 , 0 ) ;
307+ stopIdx = Math . min ( msgIdx + 2 , MESSAGES . length ) ;
308+ Object . assign ( cacheObj , { startIdx :startIdx , stopIdx :stopIdx } )
309+ } else if ( msgIdx <= alreadyProcessed . startIdx ) {
310+ startIdx = Math . max ( msgIdx , 0 ) ;
311+ stopIdx = alreadyProcessed . startIdx ;
312+ Object . assign ( cacheObj , { startIdx :startIdx , stopIdx :alreadyProcessed . stopIdx } )
313+ } else if ( msgIdx >= alreadyProcessed . stopIdx - 1 ) {
314+ startIdx = alreadyProcessed . stopIdx ;
315+ stopIdx = Math . min ( msgIdx + 1 , MESSAGES . length ) ;
316+ Object . assign ( cacheObj , { startIdx :alreadyProcessed . startIdx , stopIdx :stopIdx } )
317+ }
318+ print ( startIdx , stopIdx ) ;
319+
320+ active = "scroller" ;
321+ var bodyFont = fontBig ;
322+ g . setFont ( bodyFont ) ;
323+ var allLines = [ ] ;
324+ var titleLines = [ ] ;
325+ var j = MESSAGES . length - 1 ;
326+ var messagesWrapped = [ ] ;
327+ for ( let j = startIdx ; j < stopIdx ; j ++ ) {
328+ let msgLocal = MESSAGES [ j ] ;
329+ msgLocal . new = false ;
330+
331+ if ( msgLocal . id == "music" || msgLocal . source == "maps" || msgLocal . id == "call" ) {
332+ stopIdx ++
333+ if ( stopIdx >= MESSAGES . length ) break ;
334+ continue ;
335+ }
336+
337+ var lines = [ ] ;
338+ if ( msgLocal . title ) {
339+ lines = g . wrapString ( msgLocal . title , g . getWidth ( ) - 10 ) ;
340+ for ( let i = 0 ; i < lines . length ; i ++ ) {
341+ titleLines . push ( i + ( messagesWrapped [ 0 ] ?messagesWrapped [ 0 ] . length :0 ) + ( messagesWrapped [ 1 ] ?messagesWrapped [ 1 ] . length :0 ) ) ;
342+ }
343+ }
344+ var titleCnt = lines . length ;
345+ if ( titleCnt ) lines . push ( "" ) ; // add blank line after title
346+ lines = lines . concat ( g . wrapString ( msgLocal . body , g . getWidth ( ) - 10 ) , [ "---------" ] ) ;
347+ messagesWrapped . push ( lines ) ;
348+ //print(lines);
349+ // allLines = allLines.concat(lines);
350+ } ;
351+ //allLines.push("");
352+ //allLines.push("");
353+ let allLines2 = [ ] ;
354+ for ( let i = 0 ; i < messagesWrapped . length ; i ++ ) {
355+ allLines2 = allLines2 . concat ( messagesWrapped [ i ] ) ;
356+ }
357+
358+ // var initScroll = messagesWrapped[0].length;
359+ // if (msgIdx==0) initScroll = 0;
360+ // if (!!initAtEndOfMsg) {
361+ // let i = msgIdx==0?0:1;
362+ // initScroll += messagesWrapped[i].length>8?messagesWrapped[i].length-8:0;
363+ // }
364+
365+ print ( "titlelines" , titleLines )
366+ var initScroll = messagesWrapped [ 0 ] . length ;
367+ if ( alreadyProcessed === undefined ) {
368+ if ( msgIdx == 0 ) initScroll = 0 ;
369+ } else if ( msgIdx <= alreadyProcessed . startIdx ) {
370+ titleLines = titleLines . concat ( alreadyProcessed . titleLines . map ( ( x ) => x + allLines2 . length ) ) ;
371+ } else if ( msgIdx >= alreadyProcessed . stopIdx - 1 ) {
372+ initScroll = alreadyProcessed . lines . length - 9 ;
373+ titleLines = alreadyProcessed . titleLines . concat ( titleLines . map ( ( x ) => x + alreadyProcessed . lines . length ) ) ;
374+ }
375+
376+ if ( alreadyProcessed === undefined ) {
377+ // no-op
378+ } else if ( msgIdx <= alreadyProcessed . startIdx ) {
379+ allLines2 = allLines2 . concat ( alreadyProcessed . lines ) ;
380+ } else if ( msgIdx >= alreadyProcessed . stopIdx - 1 ) {
381+ allLines2 = alreadyProcessed . lines . concat ( allLines2 ) ;
382+ }
383+
384+ print ( "titlelines" , titleLines )
385+
386+ if ( allLines2 . length == 0 && alreadyProcessed . lines . length == 0 ) {
387+ cancelReloadTimeout ( ) ;
388+ returnToClockIfEmpty ( ) ;
389+ }
390+
391+ //print(allLines);
392+ //print("titleLines:\n", titleLines);
393+ //print("allLines2:\n",allLines2);
394+ //print("messagesWrapped:\n",messagesWrapped);
395+
396+ Object . assign (
397+ cacheObj ,
398+ {
399+ lines : allLines2 ,
400+ titleLines : titleLines ,
401+ messagesWrappedLength : messagesWrapped . length
402+ }
403+ )
404+
405+ let prevScrollIdx ;
406+
407+ E . showScroller ( {
408+ scroll : initScroll * g . getFontHeight ( ) ,
409+ h : g . getFontHeight ( ) , // height of each menu item in pixels
410+ c : allLines2 . length , // number of menu items
411+ // a function to draw a menu item
412+ draw : function ( scrollIdx , r ) {
413+ print ( scrollIdx , allLines2 . length ) ; // FIXME: Remove this print.
414+ // FIXME: in 2v13 onwards, clearRect(r) will work fine. There's a bug in 2v12
415+ g . setBgColor ( titleLines . find ( ( e ) => e == scrollIdx ) !== undefined ? g . theme . bg2 : g . theme . bg ) .
416+ setColor ( titleLines . find ( ( e ) => e == scrollIdx ) !== undefined ? g . theme . fg2 : g . theme . fg ) .
417+ clearRect ( r . x , r . y , r . x + r . w , r . y + r . h ) ;
418+ g . setFont ( bodyFont ) . setFontAlign ( 0 , - 1 ) . drawString ( allLines2 [ scrollIdx ] , r . x + r . w / 2 , r . y ) ;
419+ if ( scrollIdx >= allLines2 . length - 1 && scrollIdx != prevScrollIdx && Math . max ( msgIdx , ( alreadyProcessed && alreadyProcessed . stopIdx ) || 0 ) < MESSAGES . length - 1 ) {
420+ setTimeout ( ( ) => {
421+ E . showScroller ( ) ;
422+ showMessageScroller2 ( MESSAGES [ Math . max ( stopIdx , ( alreadyProcessed && alreadyProcessed . stopIdx ) || 0 ) ] , true , true , cacheObj ) ;
423+ } , 1 ) ;
424+ }
425+ if ( scrollIdx == 0 && scrollIdx != prevScrollIdx && Math . min ( msgIdx , ( alreadyProcessed && alreadyProcessed . startIdx ) === undefined ?MESSAGES . length :alreadyProcessed . startIdx ) > 0 ) {
426+ setTimeout ( ( ) => {
427+ E . showScroller ( ) ;
428+ showMessageScroller2 ( MESSAGES [ Math . min ( startIdx - 1 ,
429+ ( ( alreadyProcessed && alreadyProcessed . startIdx ) === undefined
430+ ?MESSAGES . length
431+ :alreadyProcessed . startIdx - 1 )
432+ ) ]
433+ , true , false , cacheObj ) ;
434+ } , 1 ) ;
435+ }
436+ prevScrollIdx = scrollIdx ;
437+ } , select : function ( scrollIdx , touch ) {
438+ if ( touch . type == 0 ) {
439+ require ( "widget_utils" ) . show ( ) ;
440+ showMessage ( msg . id , true )
441+ }
442+ if ( touch . type == 2 ) {
443+ require ( "widget_utils" ) . show ( ) ;
444+ showMessageSettings ( msg )
445+ }
446+ //showMessage(msg.id, true);
447+ } ,
448+ //back : () => showMessage(messages[idx].id, true)
449+ } ) ;
450+ }
451+
452+ function showMessagesScroller ( messages , offsetToMessageNumber ) {
453+ print ( messages ) ;
454+ cancelReloadTimeout ( ) ;
455+ active = "scroller" ;
456+ var bodyFont = fontBig ;
457+ g . setFont ( bodyFont ) ;
458+ var allLines = [ ] ;
459+ var titleLines = [ ] ;
460+ var j = messages . length - 1 ;
461+ var initScroll = 0 ;
462+ messages . forEach ( msg => {
463+ if ( j == offsetToMessageNumber ) initScroll = allLines . length ;
464+ var lines = [ ] ;
465+ if ( msg . title ) {
466+ lines = g . wrapString ( msg . title , g . getWidth ( ) - 10 ) ;
467+ for ( let i = 0 ; i < lines . length ; i ++ ) {
468+ titleLines = titleLines . concat ( allLines . length + i )
469+ }
470+ }
471+ var titleCnt = lines . length ;
472+ if ( titleCnt ) lines . push ( "" ) ; // add blank line after title
473+ lines = lines . concat ( g . wrapString ( msg . body , g . getWidth ( ) - 10 ) , [ "------" ] ) ;
474+ print ( lines ) ;
475+ allLines = allLines . concat ( lines ) ;
476+ print ( allLines ) ;
477+ j -- ;
478+ } ) ;
479+ E . showScroller ( {
480+ scroll : initScroll * g . getFontHeight ( ) ,
481+ h : g . getFontHeight ( ) , // height of each menu item in pixels
482+ c : allLines . length , // number of menu items
483+ // a function to draw a menu item
484+ draw : function ( idx , r ) {
485+ print ( idx ) ; // FIXME: Remove this print.
486+ // FIXME: in 2v13 onwards, clearRect(r) will work fine. There's a bug in 2v12
487+ g . setBgColor ( titleLines . find ( ( e ) => e == idx ) !== undefined ? g . theme . bg2 : g . theme . bg ) .
488+ setColor ( titleLines . find ( ( e ) => e == idx ) !== undefined ? g . theme . fg2 : g . theme . fg ) .
489+ clearRect ( r . x , r . y , r . x + r . w , r . y + r . h ) ;
490+ g . setFont ( bodyFont ) . setFontAlign ( 0 , - 1 ) . drawString ( allLines [ idx ] , r . x + r . w / 2 , r . y ) ;
491+ } , select : function ( idx ) {
492+ if ( idx >= allLines . length - 2 )
493+ showMessage ( msg . id , true ) ;
494+ } ,
495+ back : ( ) => showMessage ( msg . id , true )
496+ } ) ;
497+ }
498+
277499function showMessageSettings ( msg ) {
278500 active = "settings" ;
279501 var menu = { "" :{
280- "title" :/*LANG*/ "Message" ,
281- back :( ) => showMessage ( msg . id , true )
282- } ,
502+ "title" :/*LANG*/ "Message" ,
503+ back :( ) => showMessage ( msg . id , true )
504+ } ,
283505 } ;
284506
285507 if ( msg . id != "music" )
286- menu [ /*LANG*/ "View Message" ] = ( ) => showMessageScroller ( msg ) ;
508+ menu [ /*LANG*/ "View Message" ] = ( ) => showMessageScroller2 ( msg ) ;
287509
288510 if ( msg . reply && reply ) {
289511 menu [ /*LANG*/ "Reply" ] = ( ) => {
@@ -392,7 +614,7 @@ function showMessage(msgid, persist) {
392614 var maxLines = Math . floor ( h / g . getFontHeight ( ) ) ;
393615 if ( lines . length > maxLines ) // if too long, wrap with a bit less spae so we have room for '...'
394616 body = g . setFont ( bodyFont ) . wrapString ( body , w - 10 ) . slice ( 0 , maxLines ) . join ( "\n" ) + "..." ;
395- else
617+ else
396618 body = lines . join ( "\n" ) ;
397619 }
398620 function goBack ( ) {
@@ -456,7 +678,7 @@ function showMessage(msgid, persist) {
456678 ] } ,
457679 { type :"txt" , font :bodyFont , label :body , fillx :1 , filly :1 , pad :2 , cb :( ) => {
458680 // allow tapping to show a larger version
459- showMessageScroller ( msg ) ;
681+ showMessageScroller2 ( msg ) ;
460682 } } ,
461683 { type :"h" , fillx :1 , c : footer }
462684 ] } , { back :goBack } ) ;
@@ -502,7 +724,8 @@ function checkMessages(options) {
502724 // If we have a new message, show it
503725 if ( ! options . ignoreUnread && newMessages . length ) {
504726 delete newMessages [ 0 ] . show ; // stop us getting stuck here if we're called a second time
505- showMessage ( newMessages [ 0 ] . id , false ) ;
727+ //showMessage(newMessages[0].id, false);
728+ showMessageScroller2 ( newMessages [ 0 ] , false , false ) ;
506729 // buzz after showMessage, so being busy during layout doesn't affect the buzz pattern
507730 if ( global . BUZZ_ON_NEW_MESSAGE ) {
508731 // this is set if we entered the messages app by loading `messagegui.new.js`
@@ -527,7 +750,7 @@ function checkMessages(options) {
527750 draw : function ( idx , r ) { "ram"
528751 var msg = MESSAGES [ idx ] ;
529752 if ( msg && msg . new ) g . setBgColor ( g . theme . bgH ) . setColor ( g . theme . fgH ) ;
530- else g . setBgColor ( g . theme . bg ) . setColor ( g . theme . fg ) ;
753+ else g . setBgColor ( g . theme . bg ) . setColor ( g . theme . fg ) ;
531754 g . clearRect ( r . x , r . y , r . x + r . w , r . y + r . h ) ;
532755 if ( ! msg ) return ;
533756 var x = r . x + 2 , title = msg . title , body = msg . body ;
@@ -538,9 +761,9 @@ function checkMessages(options) {
538761 }
539762 if ( img ) {
540763 var fg = g . getColor ( ) ,
541- col = require ( "messageicons" ) . getColor ( msg , { settings, default :fg } ) ;
764+ col = require ( "messageicons" ) . getColor ( msg , { settings, default :fg } ) ;
542765 g . setColor ( col ) . drawImage ( img , x + 24 , r . y + 24 , { rotate :0 } ) // force centering
543- . setColor ( fg ) ; // only color the icon
766+ . setColor ( fg ) ; // only color the icon
544767 x += 50 ;
545768 }
546769 if ( title ) g . setFontAlign ( - 1 , - 1 ) . setFont ( fontBig ) . drawString ( title , x , r . y + 2 ) ;
@@ -616,3 +839,7 @@ Bangle.on('lock',locked => {
616839 if ( ! locked )
617840 require ( "messages" ) . stopBuzz ( ) ;
618841} ) ;
842+
843+ //setTimeout(() => {
844+ // showMessageScroller2(MESSAGES[2], false);
845+ //}, 11);
0 commit comments