From ffa5b96de6eaf89db9f2a9e3b5238fadaa288b91 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 23 Feb 2022 10:44:48 +0000 Subject: [PATCH] messages +0.23: Change message colors to match current theme instead of using green + Now attempt to use Large/Big/Medium fonts, and allow minimum font size to be configured --- apps/messages/ChangeLog | 6 ++- apps/messages/README.md | 3 ++ apps/messages/app.js | 69 ++++++++++++++++++++--------------- apps/messages/metadata.json | 2 +- apps/messages/screenshot.png | Bin 2931 -> 4194 bytes apps/messages/settings.js | 6 +++ 6 files changed, 53 insertions(+), 33 deletions(-) diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 07da48198..1e6ac71d7 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -32,5 +32,7 @@ 0.20: Allow tapping on the body to show a scrollable view of the message and title in a bigger font (fix #1405, #1031) 0.21: Improve list readability on dark theme 0.22: Add Home Assistant icon -0.22: Allow repeat to be switched Off, so there is no buzzing repetition. - Also gave the widget a pixel more room to the right \ No newline at end of file + Allow repeat to be switched Off, so there is no buzzing repetition. + Also gave the widget a pixel more room to the right +0.23: Change message colors to match current theme instead of using green + Now attempt to use Large/Big/Medium fonts, and allow minimum font size to be configured diff --git a/apps/messages/README.md b/apps/messages/README.md index a355a58ac..cce4391e7 100644 --- a/apps/messages/README.md +++ b/apps/messages/README.md @@ -16,6 +16,9 @@ and `Messages`: * `Unread Timer` - when a new message is received we go into the Messages app. If there is no user input for this amount of time then the app will exit and return to the clock where a ringing bell will be shown in the Widget bar. +* `Min Font` - the minimum font size used when displaying messages on the screen. A bigger font +is chosen if there isn't much message text, but this specifies the smallest the font should get before +it starts getting clipped. ## New Messages diff --git a/apps/messages/app.js b/apps/messages/app.js index 96c48f02f..0cf13db2c 100644 --- a/apps/messages/app.js +++ b/apps/messages/app.js @@ -21,13 +21,11 @@ */ var Layout = require("Layout"); +var settings = require('Storage').readJSON("messages.settings.json", true) || {}; var fontSmall = "6x8"; var fontMedium = g.getFonts().includes("6x15")?"6x15":"6x8:2"; var fontBig = g.getFonts().includes("12x20")?"12x20":"6x8:2"; var fontLarge = g.getFonts().includes("6x15")?"6x15:2":"6x8:4"; -var colBg = g.theme.dark ? "#141":"#4f4"; -var colSBg1 = g.theme.dark ? "#121":"#cFc"; -var colSBg2 = g.theme.dark ? "#000":"#9F9"; // hack for 2v10 firmware's lack of ':size' font handling try { g.setFont("6x8:2"); @@ -143,8 +141,8 @@ function showMapMessage(msg) { eta = m[2]; } else target=msg.body; layout = new Layout({ type:"v", c: [ - {type:"txt", font:fontMedium, label:target, bgCol:colBg, fillx:1, pad:2 }, - {type:"h", bgCol:colBg, fillx:1, c: [ + {type:"txt", font:fontMedium, label:target, bgCol:g.theme.bgH, col: g.theme.fgH, fillx:1, pad:2 }, + {type:"h", bgCol:g.theme.bgH, col: g.theme.fgH, fillx:1, c: [ {type:"txt", font:"6x8", label:"Towards" }, {type:"txt", font:fontLarge, label:street } ]}, @@ -181,7 +179,7 @@ function showMusicMessage(msg) { checkMessages({clockIfNoMsg:1,clockIfAllRead:1,showMsgIfUnread:1}); } layout = new Layout({ type:"v", c: [ - {type:"h", fillx:1, bgCol:colBg, c: [ + {type:"h", fillx:1, bgCol:g.theme.bgH, col: g.theme.fgH, c: [ { type:"btn", src:getBackImage, cb:back }, { type:"v", fillx:1, c: [ { type:"txt", font:fontMedium, label:msg.artist, pad:2 }, @@ -214,7 +212,9 @@ function showMessageScroller(msg) { // a function to draw a menu item draw : function(idx, r) { // FIXME: in 2v13 onwards, clearRect(r) will work fine. There's a bug in 2v12 - g.setBgColor(idx=lines.length-2) @@ -270,13 +270,31 @@ function showMessage(msgid) { var title=msg.title, titleFont = fontLarge, lines; if (title) { var w = g.getWidth()-48; - if (g.setFont(titleFont).stringWidth(title) > w) - titleFont = fontMedium; + if (g.setFont(titleFont).stringWidth(title) > w) { + titleFont = fontBig; + if (settings.fontSize!=1 && g.setFont(titleFont).stringWidth(title) > w) + titleFont = fontMedium; + } if (g.setFont(titleFont).stringWidth(title) > w) { lines = g.wrapString(title, w); title = (lines.length>2) ? lines.slice(0,2).join("\n")+"..." : lines.join("\n"); } } + // If body of message is only two lines long w/ large font, use large font. + var body=msg.body, bodyFont = fontLarge; + if (body) { + var w = g.getWidth()-10; + if (g.setFont(bodyFont).stringWidth(body) > w * 2) { + bodyFont = fontBig; + if (settings.fontSize!=1 && g.setFont(bodyFont).stringWidth(body) > w * 3) + bodyFont = fontMedium; + } + if (g.setFont(bodyFont).stringWidth(body) > w) { + lines = g.setFont(bodyFont).wrapString(msg.body, w); + var maxLines = Math.floor((g.getHeight()-110) / g.getFontHeight()); + body = (lines.length>maxLines) ? lines.slice(0,maxLines).join("\n")+"..." : lines.join("\n"); + } + } function goBack() { msg.new = false; saveMessages(); // read mail cancelReloadTimeout(); // don't auto-reload to clock now @@ -303,27 +321,17 @@ function showMessage(msgid) { checkMessages({clockIfNoMsg:1,clockIfAllRead:1,showMsgIfUnread:1}); }}); } - // If body of message is only two lines long w/ large font, use large font. - var body=msg.body, bodyFont = fontLarge, lines; - if (body) { - var w = g.getWidth()-48; - if (g.setFont(bodyFont).stringWidth(body) > w * 2) - bodyFont = fontMedium; - if (g.setFont(bodyFont).stringWidth(body) > w) { - lines = g.setFont(bodyFont).wrapString(msg.body, g.getWidth()-10); - body = (lines.length>4) ? lines.slice(0,4).join("\n")+"..." : lines.join("\n"); - } - } + layout = new Layout({ type:"v", c: [ - {type:"h", fillx:1, bgCol:colBg, c: [ + {type:"h", fillx:1, bgCol:g.theme.bgH, col: g.theme.fgH, c: [ { type:"btn", src:getMessageImage(msg), col:getMessageImageCol(msg), pad: 3, cb:()=>{ cancelReloadTimeout(); // don't auto-reload to clock now showMessageSettings(msg); }}, { type:"v", fillx:1, c: [ - {type:"txt", font:fontSmall, label:msg.src||/*LANG*/"Message", bgCol:colBg, fillx:1, pad:2, halign:1 }, - title?{type:"txt", font:titleFont, label:title, bgCol:colBg, fillx:1, pad:2 }:{}, + {type:"txt", font:fontSmall, label:msg.src||/*LANG*/"Message", bgCol:g.theme.bgH, col: g.theme.fgH, fillx:1, pad:2, halign:1 }, + title?{type:"txt", font:titleFont, label:title, bgCol:g.theme.bgH, col: g.theme.fgH, fillx:1, pad:2 }:{}, ]}, ]}, {type:"txt", font:bodyFont, label:body, fillx:1, filly:1, pad:2, cb:()=>{ @@ -374,9 +382,8 @@ function checkMessages(options) { c : Math.max(MESSAGES.length+1,3), // workaround for 2v10.219 firmware (min 3 not needed for 2v11) draw : function(idx, r) {"ram" var msg = MESSAGES[idx-1]; - if (msg && msg.new) g.setBgColor(colBg); - else g.setBgColor((idx&1) ? colSBg1 : colSBg2); - g.clearRect(r.x,r.y,r.x+r.w-1,r.y+r.h-1).setColor(g.theme.fg); + if (msg && msg.new) g.setBgColor(g.theme.bgH).setColor(g.theme.fgH); + else g.setColor(g.theme.fg); if (idx==0) msg = {id:"back", title:"< Back"}; if (!msg) return; var x = r.x+2, title = msg.title, body = msg.body; @@ -391,18 +398,20 @@ function checkMessages(options) { .setColor(fg); // only color the icon x += 50; } - var m = msg.title+"\n"+msg.body; - if (msg.src) g.setFontAlign(1,1).setFont("6x8").drawString(msg.src, r.x+r.w-2, r.y+r.h-2); + var m = msg.title+"\n"+msg.body, longBody=false; if (title) g.setFontAlign(-1,-1).setFont(fontBig).drawString(title, x,r.y+2); if (body) { g.setFontAlign(-1,-1).setFont("6x8"); - var l = g.wrapString(body, r.w-14); + var l = g.wrapString(body, r.w-(x+14)); if (l.length>3) { l = l.slice(0,3); l[l.length-1]+="..."; } + longBody = l.length>2; g.drawString(l.join("\n"), x+10,r.y+20); } + if (!longBody && msg.src) g.setFontAlign(1,1).setFont("6x8").drawString(msg.src, r.x+r.w-2, r.y+r.h-2); + g.setColor("#888").fillRect(r.x,r.y+r.h-1,r.x+r.w-1,r.y+r.h-1); // dividing line between items }, select : idx => { if (idx==0) load(); @@ -422,7 +431,7 @@ g.clear(); Bangle.loadWidgets(); Bangle.drawWidgets(); setTimeout(() => { - var unreadTimeoutSecs = (require('Storage').readJSON("messages.settings.json", true) || {}).unreadTimeout; + var unreadTimeoutSecs = settings.unreadTimeout; if (unreadTimeoutSecs===undefined) unreadTimeoutSecs=60; if (unreadTimeoutSecs) unreadTimeout = setTimeout(function() { diff --git a/apps/messages/metadata.json b/apps/messages/metadata.json index 7488c792e..e8ed83099 100644 --- a/apps/messages/metadata.json +++ b/apps/messages/metadata.json @@ -1,7 +1,7 @@ { "id": "messages", "name": "Messages", - "version": "0.22", + "version": "0.23", "description": "App to display notifications from iOS and Gadgetbridge/Android", "icon": "app.png", "type": "app", diff --git a/apps/messages/screenshot.png b/apps/messages/screenshot.png index a95045400bf4ef49d1e3a6df99cca54b8cb73aff..a64416f7d47d1918e3f1d8928b80517b4bd33f32 100644 GIT binary patch delta 4185 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 h0=qG5Oh v?v+"s":/*LANG*/"Off", onchange: v => updateSetting("unreadTimeout", v) }, + /*LANG*/'Min Font': { + value: 0|settings().fontSize, + min: 0, max: 1, + format: v => [/*LANG*/"Small",/*LANG*/"Medium"][v], + onchange: v => updateSetting("fontSize", v) + }, }; E.showMenu(mainmenu); })