@@ -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 ) ;
@@ -246,44 +246,171 @@ function showMusicMessage(msg) {
246246 } , 400 ) ;
247247}
248248
249- function showMessageScroller ( msg ) {
250- cancelReloadTimeout ( ) ;
249+ function showMessageScroller2 ( msg , persist , alreadyProcessed ) {
250+ if ( persist === undefined ) { persist = true ; }
251+
252+ const WU = require ( "widget_utils" ) ;
253+ WU . hide ( ) ;
254+
255+ if ( replying ) { return ; }
256+ if ( persist ) {
257+ cancelReloadTimeout ( ) ;
258+ } else {
259+ resetReloadTimeout ( ) ;
260+ }
261+
262+ let msgIdx = MESSAGES . findIndex ( ( m ) => m . id == msg . id )
263+
264+ let updatedProcessed = { } ;
265+ let startIdx = 0 ;
266+ let stopIdx = 0 ;
267+ let initiatedFrom = alreadyProcessed === undefined ?
268+ "other function" :
269+ ( msgIdx <= alreadyProcessed . startIdx ?
270+ "scrolling up" :
271+ ( msgIdx >= alreadyProcessed . stopIdx - 1 ?
272+ "scrolling down" :
273+ undefined
274+ )
275+ )
276+
277+ if ( initiatedFrom === "other function" ) {
278+ startIdx = Math . max ( msgIdx - 1 , 0 ) ;
279+ stopIdx = Math . min ( msgIdx + 2 , MESSAGES . length ) ;
280+ Object . assign ( updatedProcessed , { startIdx :startIdx , stopIdx :stopIdx } )
281+ } else if ( initiatedFrom === "scrolling up" ) {
282+ startIdx = Math . max ( msgIdx , 0 ) ;
283+ stopIdx = alreadyProcessed . startIdx ;
284+ Object . assign ( updatedProcessed , { startIdx :startIdx , stopIdx :alreadyProcessed . stopIdx } )
285+ } else if ( initiatedFrom === "scrolling down" ) {
286+ startIdx = alreadyProcessed . stopIdx ;
287+ stopIdx = Math . min ( msgIdx + 1 , MESSAGES . length ) ;
288+ Object . assign ( updatedProcessed , { startIdx :alreadyProcessed . startIdx , stopIdx :stopIdx } )
289+ }
290+
251291 active = "scroller" ;
252292 var bodyFont = fontBig ;
253293 g . setFont ( bodyFont ) ;
254- var lines = [ ] ;
255- if ( msg . title ) lines = g . wrapString ( msg . title , g . getWidth ( ) - 10 ) ;
256- var titleCnt = lines . length ;
257- if ( titleCnt ) lines . push ( "" ) ; // add blank line after title
258- lines = lines . concat ( g . wrapString ( msg . body , g . getWidth ( ) - 10 ) , [ "" , /*LANG*/ "< Back" ] ) ;
294+ var allLines = [ ] ;
295+ var titleLines = [ ] ;
296+ var j = MESSAGES . length - 1 ;
297+ var messagesWrapped = [ ] ;
298+ for ( let j = startIdx ; j < stopIdx ; j ++ ) {
299+ let msgLocal = MESSAGES [ j ] ;
300+ msgLocal . new = false ;
301+
302+ if ( msgLocal . id == "music" || msgLocal . source == "maps" || msgLocal . id == "call" ) {
303+ stopIdx ++
304+ if ( stopIdx >= MESSAGES . length ) { break ; }
305+ continue ;
306+ }
307+
308+ var lines = [ ] ;
309+ if ( msgLocal . title ) {
310+ lines = g . wrapString ( msgLocal . title , g . getWidth ( ) - 10 ) ;
311+ for ( let i = 0 ; i < lines . length ; i ++ ) {
312+ titleLines . push ( i + ( messagesWrapped [ 0 ] ?messagesWrapped [ 0 ] . length :0 ) + ( messagesWrapped [ 1 ] ?messagesWrapped [ 1 ] . length :0 ) ) ;
313+ }
314+ }
315+ var titleCnt = lines . length ;
316+ if ( titleCnt ) { lines . push ( "" ) ; } // add blank line after title
317+ lines = lines . concat ( g . wrapString ( msgLocal . body , g . getWidth ( ) - 10 ) , [ "-" . repeat ( j + 1 ) ] ) ;
318+ messagesWrapped . push ( lines ) ;
319+ } ;
320+ let allLines2 = [ ] ;
321+ for ( let i = 0 ; i < messagesWrapped . length ; i ++ ) {
322+ allLines2 = allLines2 . concat ( messagesWrapped [ i ] ) ;
323+ }
324+
325+ var initScroll = messagesWrapped [ 0 ] . length ;
326+ if ( initiatedFrom === "other function" ) {
327+ if ( msgIdx == 0 ) initScroll = 0 ;
328+ } else if ( initiatedFrom === "scrolling up" ) {
329+ titleLines = titleLines . concat ( alreadyProcessed . titleLines . map ( ( x ) => x + allLines2 . length ) ) ;
330+ } else if ( initiatedFrom === "scrolling down" ) {
331+ initScroll = alreadyProcessed . lines . length - 9 ;
332+ titleLines = alreadyProcessed . titleLines . concat ( titleLines . map ( ( x ) => x + alreadyProcessed . lines . length ) ) ;
333+ }
334+
335+ if ( initiatedFrom === "other function" ) {
336+ // no-op
337+ } else if ( initiatedFrom === "scrolling up" ) {
338+ allLines2 = allLines2 . concat ( alreadyProcessed . lines ) ;
339+ } else if ( initiatedFrom === "scrolling down" ) {
340+ allLines2 = alreadyProcessed . lines . concat ( allLines2 ) ;
341+ }
342+
343+ if ( allLines2 . length == 0 && alreadyProcessed . lines . length == 0 ) {
344+ cancelReloadTimeout ( ) ;
345+ returnToClockIfEmpty ( ) ;
346+ }
347+
348+ Object . assign (
349+ updatedProcessed ,
350+ {
351+ lines : allLines2 ,
352+ titleLines : titleLines ,
353+ messagesWrappedLength : messagesWrapped . length
354+ }
355+ )
356+
357+ let prevScrollIdx ; // Used for stopping multiple triggers of next message by the scroller.
358+
259359 E . showScroller ( {
360+ scroll : initScroll * g . getFontHeight ( ) ,
260361 h : g . getFontHeight ( ) , // height of each menu item in pixels
261- c : lines . length , // number of menu items
362+ c : allLines2 . length , // number of menu items
262363 // a function to draw a menu item
263- draw : function ( idx , r ) {
264- // FIXME: in 2v13 onwards, clearRect(r) will work fine. There's a bug in 2v12
265- g . setBgColor ( idx < titleCnt ? g . theme . bg2 : g . theme . bg ) .
266- setColor ( idx < titleCnt ? g . theme . fg2 : g . theme . fg ) .
267- clearRect ( r . x , r . y , r . x + r . w , r . y + r . h ) ;
268- g . setFont ( bodyFont ) . setFontAlign ( 0 , - 1 ) . drawString ( lines [ idx ] , r . x + r . w / 2 , r . y ) ;
269- } , select : function ( idx ) {
270- if ( idx >= lines . length - 2 )
271- showMessage ( msg . id , true ) ;
364+ draw : function ( scrollIdx , r ) {
365+ "ram"
366+ g . setBgColor ( titleLines . find ( ( e ) => e == scrollIdx ) !== undefined ? g . theme . bg2 : g . theme . bg ) .
367+ setColor ( titleLines . find ( ( e ) => e == scrollIdx ) !== undefined ? g . theme . fg2 : g . theme . fg ) .
368+ clearRect ( r ) ;
369+ g . setFont ( bodyFont ) . setFontAlign ( 0 , - 1 ) . drawString ( allLines2 [ scrollIdx ] , r . x + r . w / 2 , r . y ) ;
370+ if ( scrollIdx >= allLines2 . length - 1 && scrollIdx != prevScrollIdx && updatedProcessed . stopIdx < MESSAGES . length ) {
371+ setTimeout ( ( ) => {
372+ E . showScroller ( ) ;
373+ showMessageScroller2 ( MESSAGES [ updatedProcessed . stopIdx ] , true , updatedProcessed ) ;
374+ } , 40 ) ;
375+ }
376+ if ( scrollIdx == 0 && scrollIdx != prevScrollIdx && updatedProcessed . startIdx > 0 ) {
377+ setTimeout ( ( ) => {
378+ E . showScroller ( ) ;
379+ showMessageScroller2 ( MESSAGES [ updatedProcessed . startIdx - 1 ] , true , updatedProcessed ) ;
380+ } , 40 ) ;
381+ }
382+ prevScrollIdx = scrollIdx ;
383+ } , select : function ( scrollIdx , touch ) {
384+ let msgSelectIdx ;
385+ for ( let i = titleLines . length - 1 ; i >= 0 ; i -- ) {
386+ if ( scrollIdx >= titleLines [ i ] ) {
387+ msgSelectIdx = i + updatedProcessed . startIdx ;
388+ break ;
389+ }
390+ }
391+ if ( touch . type == 0 ) {
392+ WU . show ( ) ;
393+ showMessage ( MESSAGES [ msgSelectIdx ] . id , true )
394+ }
395+ if ( touch . type == 2 ) {
396+ WU . show ( ) ;
397+ showMessageSettings ( MESSAGES [ msgSelectIdx ] )
398+ }
272399 } ,
273- back : ( ) => showMessage ( msg . id , true )
400+ // back : () => showMessage(messages[idx] .id, true)
274401 } ) ;
275402}
276403
277404function showMessageSettings ( msg ) {
278405 active = "settings" ;
279406 var menu = { "" :{
280- "title" :/*LANG*/ "Message" ,
281- back :( ) => showMessage ( msg . id , true )
282- } ,
407+ "title" :/*LANG*/ "Message" ,
408+ back :( ) => showMessage ( msg . id , true )
409+ } ,
283410 } ;
284411
285412 if ( msg . id != "music" )
286- menu [ /*LANG*/ "View Message" ] = ( ) => showMessageScroller ( msg ) ;
413+ menu [ /*LANG*/ "View Message" ] = ( ) => showMessageScroller2 ( msg ) ;
287414
288415 if ( msg . reply && reply ) {
289416 menu [ /*LANG*/ "Reply" ] = ( ) => {
@@ -392,7 +519,7 @@ function showMessage(msgid, persist) {
392519 var maxLines = Math . floor ( h / g . getFontHeight ( ) ) ;
393520 if ( lines . length > maxLines ) // if too long, wrap with a bit less spae so we have room for '...'
394521 body = g . setFont ( bodyFont ) . wrapString ( body , w - 10 ) . slice ( 0 , maxLines ) . join ( "\n" ) + "..." ;
395- else
522+ else
396523 body = lines . join ( "\n" ) ;
397524 }
398525 function goBack ( ) {
@@ -456,7 +583,7 @@ function showMessage(msgid, persist) {
456583 ] } ,
457584 { type :"txt" , font :bodyFont , label :body , fillx :1 , filly :1 , pad :2 , cb :( ) => {
458585 // allow tapping to show a larger version
459- showMessageScroller ( msg ) ;
586+ showMessageScroller2 ( msg ) ;
460587 } } ,
461588 { type :"h" , fillx :1 , c : footer }
462589 ] } , { back :goBack } ) ;
@@ -502,7 +629,8 @@ function checkMessages(options) {
502629 // If we have a new message, show it
503630 if ( ! options . ignoreUnread && newMessages . length ) {
504631 delete newMessages [ 0 ] . show ; // stop us getting stuck here if we're called a second time
505- showMessage ( newMessages [ 0 ] . id , false ) ;
632+ //showMessage(newMessages[0].id, false);
633+ showMessageScroller2 ( newMessages [ 0 ] , false ) ;
506634 // buzz after showMessage, so being busy during layout doesn't affect the buzz pattern
507635 if ( global . BUZZ_ON_NEW_MESSAGE ) {
508636 // this is set if we entered the messages app by loading `messagegui.new.js`
@@ -527,7 +655,7 @@ function checkMessages(options) {
527655 draw : function ( idx , r ) { "ram"
528656 var msg = MESSAGES [ idx ] ;
529657 if ( msg && msg . new ) g . setBgColor ( g . theme . bgH ) . setColor ( g . theme . fgH ) ;
530- else g . setBgColor ( g . theme . bg ) . setColor ( g . theme . fg ) ;
658+ else g . setBgColor ( g . theme . bg ) . setColor ( g . theme . fg ) ;
531659 g . clearRect ( r . x , r . y , r . x + r . w , r . y + r . h ) ;
532660 if ( ! msg ) return ;
533661 var x = r . x + 2 , title = msg . title , body = msg . body ;
@@ -538,9 +666,9 @@ function checkMessages(options) {
538666 }
539667 if ( img ) {
540668 var fg = g . getColor ( ) ,
541- col = require ( "messageicons" ) . getColor ( msg , { settings, default :fg } ) ;
669+ col = require ( "messageicons" ) . getColor ( msg , { settings, default :fg } ) ;
542670 g . setColor ( col ) . drawImage ( img , x + 24 , r . y + 24 , { rotate :0 } ) // force centering
543- . setColor ( fg ) ; // only color the icon
671+ . setColor ( fg ) ; // only color the icon
544672 x += 50 ;
545673 }
546674 if ( title ) g . setFontAlign ( - 1 , - 1 ) . setFont ( fontBig ) . drawString ( title , x , r . y + 2 ) ;
0 commit comments