Skip to content

Commit 4a1603f

Browse files
author
thyttan
committed
Merge branch 'messagegui' into app-loader
2 parents 0fef807 + 9c7add5 commit 4a1603f

File tree

3 files changed

+260
-32
lines changed

3 files changed

+260
-32
lines changed

apps/messagegui/ChangeLog

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,3 +113,4 @@
113113
0.82: Stop buzzing when a message is removed (e.g. call answered)
114114
0.83: Add option to not open the first unread message
115115
0.84: Fix: Assign show message entry to the settings menu and not the message itself.
116+
0.85: (WIP) refactor to display a scroller with three messages loaded. When scrolling to the top or end new/older messages are loaded in.

apps/messagegui/app.js

Lines changed: 258 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -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(/towards|toward/);
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+
277499
function 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);

apps/messagegui/metadata.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"id": "messagegui",
33
"name": "Message UI",
44
"shortName": "Messages",
5-
"version": "0.84",
5+
"version": "0.85",
66
"description": "Default app to display notifications from iOS and Gadgetbridge/Android",
77
"icon": "app.png",
88
"type": "app",

0 commit comments

Comments
 (0)