From bdb681d8486b18e18f2599ba30919fc9f0af0954 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Tue, 3 Sep 2024 00:41:50 +0200 Subject: [PATCH 01/25] Add dutchclock app --- apps/dutchclock/app-icon.js | 1 + apps/dutchclock/app.js | 228 ++++++++++++++++++++++++++++++++++ apps/dutchclock/app.png | Bin 0 -> 1436 bytes apps/dutchclock/metadata.json | 19 +++ apps/dutchclock/settings.js | 61 +++++++++ 5 files changed, 309 insertions(+) create mode 100644 apps/dutchclock/app-icon.js create mode 100644 apps/dutchclock/app.js create mode 100644 apps/dutchclock/app.png create mode 100644 apps/dutchclock/metadata.json create mode 100644 apps/dutchclock/settings.js diff --git a/apps/dutchclock/app-icon.js b/apps/dutchclock/app-icon.js new file mode 100644 index 000000000..7d6e655e8 --- /dev/null +++ b/apps/dutchclock/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgP/AE0/Ao/4sccAoX79NtAofttIFD8dsAof3t1/GZ397oGE/YLE6IFDloFE1vbAoeNAondAon/z4FE356U/nNxhZC/drlpLDscNAoX4ue9C4f3L4oAKt4FEQ4qxE/0skIGDtg7DAoNtAocsAogAX94POA")) \ No newline at end of file diff --git a/apps/dutchclock/app.js b/apps/dutchclock/app.js new file mode 100644 index 000000000..a25d349fa --- /dev/null +++ b/apps/dutchclock/app.js @@ -0,0 +1,228 @@ +const SCREEN_WIDTH = g.getWidth(); +const SCREEN_HEIGHT = g.getHeight(); +const MINS_IN_HOUR = 60; + +const VARIANT_EXACT = 'exact'; +const VARIANT_APPROXIMATE = 'approximate'; +const VARIANT_HYBRID = 'hybrid'; + +const SETTINGS_FILE = "dutchclock.json"; + +let date, mins; + +var settings = Object.assign({ + // default values + variant: VARIANT_APPROXIMATE, + showWidgets: true +}, require('Storage').readJSON(SETTINGS_FILE, true) || {}); + +const maxFontSize = SCREEN_HEIGHT + - 20 // For the date + - (settings.showWidgets ? 25 : 0); + +const X = SCREEN_WIDTH / 2; +const Y = SCREEN_HEIGHT / 2 + + (settings.showWidgets ? 5 : -5); + + +function initialize() { + // draw immediately at first + tick(); + +// for (let mm = 0; mm < 60; mm++) { +// console.log(23, mm); +// console.log(getTimeLines(23 * 60 + mm)); +// } + + // now check every second + let secondInterval = setInterval(tick, 1000); + // Stop updates when LCD is off, restart when on + + Bangle.on('lcdPower',on=>{ + if (secondInterval) clearInterval(secondInterval); + secondInterval = undefined; + if (on) { + secondInterval = setInterval(tick, 1000); + draw(); // draw immediately + } + }); +} + +function tick() { + date = new Date(); + const m = date.getHours() * MINS_IN_HOUR + date.getMinutes(); + + if (m !== mins) { + mins = m; + draw(); + } +} + +function draw() { + // work out how to display the current time + const timeLines = getTimeLines(mins); + + // Reset the state of the graphics library + g.clear(true); + // draw the current time (4x size 7 segment) + setFont(timeLines); + + g.setFontAlign(0,0); // align center top + g.drawString(timeLines.join("\n"), X, Y, true /*clear background*/); + + // draw the date, in a normal font + g.setFont("6x8"); + g.setFontAlign(0,1); // align center bottom + // pad the date - this clears the background if the date were to change length + var dateStr = " "+require("locale").date(date)+" "; + g.drawString(dateStr, SCREEN_WIDTH/2, SCREEN_HEIGHT - 5, true /*clear background*/); + + /* Show launcher when middle button pressed + This should be done *before* Bangle.loadWidgets so that + widgets know if they're being loaded into a clock app or not */ + Bangle.setUI("clock"); + + if (settings.showWidgets) { + // Load widgets + Bangle.loadWidgets(); + Bangle.drawWidgets(); + } +} + +function setFont(timeLines) { + const size = maxFontSize / timeLines.length; + + g.setFont("Vector", size); + + let width = g.stringWidth(timeLines.join('\n')); + + if (width > SCREEN_WIDTH) { + g.setFont("Vector", Math.floor(size * (SCREEN_WIDTH / width))); + } +} + +function getTimeLines(m) { + switch (settings.variant) { + case VARIANT_EXACT: + return getExactTimeLines(m); + case VARIANT_APPROXIMATE: + return getApproximateTimeLines(m); + case VARIANT_HYBRID: + return distanceFromNearest(15)(m) < 3 + ? getApproximateTimeLines(m) + : getExactTimeLines(m); + default: + console.warn(`Error in settings: unknown variant "${settings.variant}"`); + return getExactTimeLines(m); + } +} + +function getExactTimeLines(m) { + const hour = getHour(m); + const minutes = getMinutes(hour.offset); + + const lines = minutes.concat(hour.lines); + if (lines.length === 1) { + lines.push('uur'); + } + + return lines; +} + +function getApproximateTimeLines(m) { + const roundMinutes = getRoundMinutes(m); + const hour = getHour(roundMinutes.minutes); + + const minutes = getMinutes(hour.offset); + + const lines = minutes.concat(hour.lines); + + if (lines.length === 1) { + lines.push('uur'); + } + + return addApproximateDescription(lines, roundMinutes.offset); +} + +function getHour(minutes) { + const hours = ['twaalf', 'een', 'twee', 'drie', 'vier', 'vijf', 'zes', 'zeven', 'acht', 'negen', 'tien', 'elf']; + + const h = Math.floor(minutes / MINS_IN_HOUR), m = minutes % MINS_IN_HOUR; + + if (m <= 15) { + return {lines: [hours[h % 12]], offset: m}; + } + + if (m > 15 && m < 45) { + return { + lines: ['half', hours[(h + 1) % 12]], + offset: m - (MINS_IN_HOUR / 2) + }; + } + + return {lines: [hours[(h + 1) % 12]], offset: m - MINS_IN_HOUR}; +} + +function getMinutes(m) { + const minutes = ['', 'een', 'twee', 'drie', 'vier', 'vijf', 'zes', 'zeven', 'acht', 'negen', 'tien', 'elf', 'twaalf', 'dertien', 'veertien', 'kwart']; + + if (m === 0) { + return []; + } + + return [minutes[Math.abs(m)], m > 0 ? 'over' : 'voor']; +} + +function getRoundMinutes(m) { + const nearest = roundTo(5)(m); + + return { + minutes: nearest, + offset: m - nearest + }; +} + +function addApproximateDescription(lines, offset) { + if (offset === 0) { + return lines; + } + + if (lines[1] === 'uur') { + const plural = getPlural(lines[0]); + return { + '-2': ['tegen', plural], + '-1': ['iets voor', plural], + '1': ['iets na', plural], + '2': ['even na', plural] + }[`${offset}`]; + } + + return { + '-2': ['bijna'].concat(lines), + '-1': ['rond'].concat(lines), + '1': ['iets na'].concat(lines), + '2': lines.concat(['geweest']) + }[`${offset}`]; +} + +function getPlural(h) { + return { + een: 'enen', + twee: 'tweeën', + drie: 'drieën', + vijf: 'vijven', + zes: 'zessen', + elf: 'elven', + twaalf: 'twaalven' + }[h] || `${h}en`; +} + +function distanceFromNearest(x) { + return n => Math.abs(n - roundTo(x)(n)); +} + +function roundTo(x) { + return n => Math.round(n / x) * x; +} + +initialize(); diff --git a/apps/dutchclock/app.png b/apps/dutchclock/app.png new file mode 100644 index 0000000000000000000000000000000000000000..faacb7eaf13b86d8144a49f9afa9f0d9a49958ce GIT binary patch literal 1436 zcmV;N1!MY&P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1u;oPK~!i%?U`99 zbzc;~m*HMhd_)! zl(CD(UB&boW;HSA-?IPi@z7p~uy9|KIyj{$NS z92}&NR7`Hb#KZ)Bq$0_HU3RptiP_R;Qz*1Du?kXl`g|s4z%ae=`W$0cwHzFc} z3`94>vB1DUnj0J(EXmG_ke03OKCDLQ$`E#xujIsje=H^tG8DeE+MH{-Utqph>r7Obs%U^Tl@KZ{dn*XN( zO-)Ty>v(y2Q3;KdmzP6&dOFFSot+RK9!~Ps))qA_xF3p(iz)kJ#>R3S_k*vmFRZMr z&|FF29{32nKx1}xc5HTbmU>+5Z4q8N=o1;w4f_5!FE5XALs?Bt4J9yMcCg{$Va8iZ z#xpeIg`K`mlEQ}#z|8CF>iUq$GN9@q-VG2B49~;KMG2 zZi9VoK|ui&78btirn0iKpr@yYdSFLKN7CWAr>7@0G&E3wmy?r2dShYnn(kTI;Njr`RaI4V!hoPZ9~>Nzao*nEq>GM@rn4WcMzMv&{eY(tSg9r^Cej=^{Nw>s zBg+8vX$+@(dwX=BpPx^Cz*i#60Q5erLPamk$jG20ldnXU0psK2bZu{M2j0ApEP`z$ z9zWu-qG%w>nB=fKJ3KrjoosLuOQo!=jAA>FN|eZWh-5rmvZtpf=I7_fA|oRi51~x0 zR?~dU3BP{*V#&$L%-PwQ4us_*YXvawBhAgtbWSRQJ@ESaIvuOv(Yi*X5k`RW!O+kU zo#gfR_X}F-$T9%ydaQBqAq^4rxF2w1t5hmshH(=q0ucPoD_2PH_d`Tz;SuVtz7nqxy1D#F>cXxMGTHuDo3KTmve5J%= zKWuDlkOAlC=kz@+uP-kzVS9TUDk>^SCly&MfTwV1e_C1^ { + writeOption(setting, value); + } + }; + } + + // Show the menu + function showMainMenu() { + const mainMenu = [ + getOption('Exact', 'variant', VARIANT_EXACT), + getOption('Approximate', 'variant', VARIANT_APPROXIMATE), + getOption('Hybrid', 'variant', VARIANT_HYBRID), + { + title: 'Show widgets?', + value: settings.showWidgets ?? true, + onchange: v => writeSetting('showWidgets', v) + } + ]; + + mainMenu[""] = { + title : "Dutch Clock", + back: back + }; + + E.showMenu(mainMenu); + } + + showMainMenu(); + }) \ No newline at end of file From 45cc0dc60f0e4f56f113128066b6306f2bc11b45 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Tue, 3 Sep 2024 00:55:10 +0200 Subject: [PATCH 02/25] Allow emulator --- apps/dutchclock/metadata.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/dutchclock/metadata.json b/apps/dutchclock/metadata.json index 49873c18f..a7f863849 100644 --- a/apps/dutchclock/metadata.json +++ b/apps/dutchclock/metadata.json @@ -8,6 +8,7 @@ "type": "clock", "tags": "clock,dutch,text", "supports": ["BANGLEJS", "BANGLEJS2"], + "allow_emulator": true, "storage": [ {"name":"dutchclock.app.js","url":"app.js"}, {"name":"dutchclock.settings.js","url":"settings.js"}, @@ -16,4 +17,5 @@ "data": [ {"name":"dutchclock.json"} ] -} \ No newline at end of file +} + \ No newline at end of file From 9753795231c188983e35d74ff80e851adc58b353 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Tue, 3 Sep 2024 23:05:45 +0200 Subject: [PATCH 03/25] Add settings for time and date lines Add separate defaults file --- apps/dutchclock/app.js | 43 +++++++++++++++++++++++------------ apps/dutchclock/default.json | 6 +++++ apps/dutchclock/metadata.json | 1 + apps/dutchclock/settings.js | 10 ++++---- 4 files changed, 40 insertions(+), 20 deletions(-) create mode 100644 apps/dutchclock/default.json diff --git a/apps/dutchclock/app.js b/apps/dutchclock/app.js index a25d349fa..7317d3d64 100644 --- a/apps/dutchclock/app.js +++ b/apps/dutchclock/app.js @@ -1,29 +1,42 @@ const SCREEN_WIDTH = g.getWidth(); const SCREEN_HEIGHT = g.getHeight(); + +const WIDGETS_HEIGHT = 25; +const DATETIME_SPACING_HEIGHT = 10; +const DATE_HEIGHT = 10; +const TIME_HEIGHT = 10; + +const TEXT_WIDTH = SCREEN_WIDTH - 2; + const MINS_IN_HOUR = 60; const VARIANT_EXACT = 'exact'; const VARIANT_APPROXIMATE = 'approximate'; const VARIANT_HYBRID = 'hybrid'; +const DEFAULTS_FILE = "dutchclock.default.json"; const SETTINGS_FILE = "dutchclock.json"; -let date, mins; - -var settings = Object.assign({ - // default values - variant: VARIANT_APPROXIMATE, - showWidgets: true -}, require('Storage').readJSON(SETTINGS_FILE, true) || {}); +// Load settings +const settings = Object.assign( + storage.readJSON(DEFAULTS_FILE, true)?.settings || {}, + storage.readJSON(SETTINGS_FILE, true) || {} +); const maxFontSize = SCREEN_HEIGHT - - 20 // For the date - - (settings.showWidgets ? 25 : 0); + - (settings.showWidgets ? WIDGETS_HEIGHT : 0) + - (settings.showDate || settings.showTime ? DATETIME_SPACING_HEIGHT : 0) + - (settings.showDate ? DATE_HEIGHT : 0) + - (settings.showTime ? TIME_HEIGHT : 0); const X = SCREEN_WIDTH / 2; const Y = SCREEN_HEIGHT / 2 - + (settings.showWidgets ? 5 : -5); - + + (settings.showWidgets ? WIDGETS_HEIGHT / 2 : 0) + - (settings.showDate || settings.showTime ? DATETIME_SPACING_HEIGHT / 2 : 0) + - (settings.showDate ? DATE_HEIGHT / 2 : 0) + - (settings.showTime ? TIME_HEIGHT / 2 : 0); + +let date, mins; function initialize() { // draw immediately at first @@ -75,7 +88,7 @@ function draw() { g.setFontAlign(0,1); // align center bottom // pad the date - this clears the background if the date were to change length var dateStr = " "+require("locale").date(date)+" "; - g.drawString(dateStr, SCREEN_WIDTH/2, SCREEN_HEIGHT - 5, true /*clear background*/); + g.drawString(dateStr, SCREEN_WIDTH / 2, SCREEN_HEIGHT - 5, true /*clear background*/); /* Show launcher when middle button pressed This should be done *before* Bangle.loadWidgets so that @@ -96,8 +109,8 @@ function setFont(timeLines) { let width = g.stringWidth(timeLines.join('\n')); - if (width > SCREEN_WIDTH) { - g.setFont("Vector", Math.floor(size * (SCREEN_WIDTH / width))); + if (width > TEXT_WIDTH) { + g.setFont("Vector", Math.floor(size * (TEXT_WIDTH / width))); } } @@ -225,4 +238,4 @@ function roundTo(x) { return n => Math.round(n / x) * x; } -initialize(); +initialize(); \ No newline at end of file diff --git a/apps/dutchclock/default.json b/apps/dutchclock/default.json new file mode 100644 index 000000000..243f2824a --- /dev/null +++ b/apps/dutchclock/default.json @@ -0,0 +1,6 @@ +{ + "variant": "approximate", + "showWidgets": true, + "showTimeLine": false, + "showDateLine": true +} \ No newline at end of file diff --git a/apps/dutchclock/metadata.json b/apps/dutchclock/metadata.json index a7f863849..97457764c 100644 --- a/apps/dutchclock/metadata.json +++ b/apps/dutchclock/metadata.json @@ -12,6 +12,7 @@ "storage": [ {"name":"dutchclock.app.js","url":"app.js"}, {"name":"dutchclock.settings.js","url":"settings.js"}, + {"name":"dutchclock.default.json","url":"default.json"}, {"name":"dutchclock.img","url":"app-icon.js","evaluate":true} ], "data": [ diff --git a/apps/dutchclock/settings.js b/apps/dutchclock/settings.js index 2c3f1816b..6bb5b0a47 100644 --- a/apps/dutchclock/settings.js +++ b/apps/dutchclock/settings.js @@ -3,14 +3,14 @@ const VARIANT_APPROXIMATE = 'approximate'; const VARIANT_HYBRID = 'hybrid'; + const DEFAULTS_FILE = "dutchclock.default.json"; const SETTINGS_FILE = "dutchclock.json"; // Load settings - var settings = Object.assign({ - // default values - variant: VARIANT_APPROXIMATE, - showWidgets: true - }, require('Storage').readJSON(SETTINGS_FILE, true) || {}); + const settings = Object.assign( + storage.readJSON(DEFAULTS_FILE, true)?.settings || {}, + storage.readJSON(SETTINGS_FILE, true) || {} + ); function writeSettings() { require('Storage').writeJSON(SETTINGS_FILE, settings); From 4bca60e0708e8c456643df49e5ae0504488c5dff Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Tue, 3 Sep 2024 23:12:02 +0200 Subject: [PATCH 04/25] Fix bug Up version --- apps/dutchclock/app.js | 2 ++ apps/dutchclock/metadata.json | 4 ++-- apps/dutchclock/settings.js | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/dutchclock/app.js b/apps/dutchclock/app.js index 7317d3d64..be0d6f2c0 100644 --- a/apps/dutchclock/app.js +++ b/apps/dutchclock/app.js @@ -1,3 +1,5 @@ +const storage = require("Storage"); + const SCREEN_WIDTH = g.getWidth(); const SCREEN_HEIGHT = g.getHeight(); diff --git a/apps/dutchclock/metadata.json b/apps/dutchclock/metadata.json index 97457764c..fe665ea9d 100644 --- a/apps/dutchclock/metadata.json +++ b/apps/dutchclock/metadata.json @@ -3,8 +3,8 @@ "name": "Dutch Clock", "shortName":"Dutch Clock", "icon": "app.png", - "version":"0.01", - "description": "A clock that displays the time the way Dutch people would respond when asked what time it is", + "version":"0.02", + "description": "A clock that displays the time the way a Dutch person would respond when asked what time it is.", "type": "clock", "tags": "clock,dutch,text", "supports": ["BANGLEJS", "BANGLEJS2"], diff --git a/apps/dutchclock/settings.js b/apps/dutchclock/settings.js index 6bb5b0a47..bc078bf97 100644 --- a/apps/dutchclock/settings.js +++ b/apps/dutchclock/settings.js @@ -1,4 +1,6 @@ (function(back) { + const storage = require("Storage"); + const VARIANT_EXACT = 'exact'; const VARIANT_APPROXIMATE = 'approximate'; const VARIANT_HYBRID = 'hybrid'; From 2cb7ed6f9f79f37838c634dcd85942008d21392d Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Tue, 3 Sep 2024 23:17:01 +0200 Subject: [PATCH 05/25] Fix bug --- apps/dutchclock/app.js | 2 +- apps/dutchclock/metadata.json | 2 +- apps/dutchclock/settings.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/dutchclock/app.js b/apps/dutchclock/app.js index be0d6f2c0..df655c1f2 100644 --- a/apps/dutchclock/app.js +++ b/apps/dutchclock/app.js @@ -21,7 +21,7 @@ const SETTINGS_FILE = "dutchclock.json"; // Load settings const settings = Object.assign( - storage.readJSON(DEFAULTS_FILE, true)?.settings || {}, + storage.readJSON(DEFAULTS_FILE, true) || {}, storage.readJSON(SETTINGS_FILE, true) || {} ); diff --git a/apps/dutchclock/metadata.json b/apps/dutchclock/metadata.json index fe665ea9d..ab7284b65 100644 --- a/apps/dutchclock/metadata.json +++ b/apps/dutchclock/metadata.json @@ -3,7 +3,7 @@ "name": "Dutch Clock", "shortName":"Dutch Clock", "icon": "app.png", - "version":"0.02", + "version":"0.03", "description": "A clock that displays the time the way a Dutch person would respond when asked what time it is.", "type": "clock", "tags": "clock,dutch,text", diff --git a/apps/dutchclock/settings.js b/apps/dutchclock/settings.js index bc078bf97..2be7326e5 100644 --- a/apps/dutchclock/settings.js +++ b/apps/dutchclock/settings.js @@ -10,7 +10,7 @@ // Load settings const settings = Object.assign( - storage.readJSON(DEFAULTS_FILE, true)?.settings || {}, + storage.readJSON(DEFAULTS_FILE, true) || {}, storage.readJSON(SETTINGS_FILE, true) || {} ); From f35a7e509791dd7b35f57500cd567ca893ac4f7a Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Tue, 3 Sep 2024 23:20:15 +0200 Subject: [PATCH 06/25] Add some screenshots --- apps/dutchclock/metadata.json | 7 ++++++- apps/dutchclock/screenshotbangle1-2.png | Bin 0 -> 3822 bytes apps/dutchclock/screenshotbangle1.png | Bin 0 -> 4071 bytes apps/dutchclock/screenshotbangle2.png | Bin 0 -> 2365 bytes 4 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 apps/dutchclock/screenshotbangle1-2.png create mode 100644 apps/dutchclock/screenshotbangle1.png create mode 100644 apps/dutchclock/screenshotbangle2.png diff --git a/apps/dutchclock/metadata.json b/apps/dutchclock/metadata.json index ab7284b65..0d6435b1f 100644 --- a/apps/dutchclock/metadata.json +++ b/apps/dutchclock/metadata.json @@ -3,12 +3,17 @@ "name": "Dutch Clock", "shortName":"Dutch Clock", "icon": "app.png", - "version":"0.03", + "version":"0.04", "description": "A clock that displays the time the way a Dutch person would respond when asked what time it is.", "type": "clock", "tags": "clock,dutch,text", "supports": ["BANGLEJS", "BANGLEJS2"], "allow_emulator": true, + "screenshots": [ + {"url":"screenshotbangle2.png"}, + {"url":"screenshotbangle1.png"}, + {"url":"screenshotbangle1-2.png"} + ], "storage": [ {"name":"dutchclock.app.js","url":"app.js"}, {"name":"dutchclock.settings.js","url":"settings.js"}, diff --git a/apps/dutchclock/screenshotbangle1-2.png b/apps/dutchclock/screenshotbangle1-2.png new file mode 100644 index 0000000000000000000000000000000000000000..08bf31939208969239a08d2ea20ce7844e855938 GIT binary patch literal 3822 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 ScN+Z<0mt30cI7*nXa5DEn Date: Tue, 3 Sep 2024 23:26:21 +0200 Subject: [PATCH 07/25] Add date and time settings --- apps/dutchclock/metadata.json | 2 +- apps/dutchclock/settings.js | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/apps/dutchclock/metadata.json b/apps/dutchclock/metadata.json index 0d6435b1f..4988417dc 100644 --- a/apps/dutchclock/metadata.json +++ b/apps/dutchclock/metadata.json @@ -3,7 +3,7 @@ "name": "Dutch Clock", "shortName":"Dutch Clock", "icon": "app.png", - "version":"0.04", + "version":"0.05", "description": "A clock that displays the time the way a Dutch person would respond when asked what time it is.", "type": "clock", "tags": "clock,dutch,text", diff --git a/apps/dutchclock/settings.js b/apps/dutchclock/settings.js index 2be7326e5..146df5395 100644 --- a/apps/dutchclock/settings.js +++ b/apps/dutchclock/settings.js @@ -46,8 +46,18 @@ getOption('Hybrid', 'variant', VARIANT_HYBRID), { title: 'Show widgets?', - value: settings.showWidgets ?? true, + value: settings.showWidgets, onchange: v => writeSetting('showWidgets', v) + }, + { + title: 'Show time?', + value: settings.showTime, + onchange: v => writeSetting('showTime', v) + }, + { + title: 'Show date?', + value: settings.showDate, + onchange: v => writeSetting('showDate', v) } ]; From f61aa0650a8ab03ca60bf4c3417deeb3a7bc5fe7 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Tue, 3 Sep 2024 23:32:19 +0200 Subject: [PATCH 08/25] Fix setting name --- apps/dutchclock/default.json | 4 ++-- apps/dutchclock/metadata.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/dutchclock/default.json b/apps/dutchclock/default.json index 243f2824a..cfe5d34a4 100644 --- a/apps/dutchclock/default.json +++ b/apps/dutchclock/default.json @@ -1,6 +1,6 @@ { "variant": "approximate", "showWidgets": true, - "showTimeLine": false, - "showDateLine": true + "showTime": false, + "showDate": true } \ No newline at end of file diff --git a/apps/dutchclock/metadata.json b/apps/dutchclock/metadata.json index 4988417dc..9a0bc84a2 100644 --- a/apps/dutchclock/metadata.json +++ b/apps/dutchclock/metadata.json @@ -3,7 +3,7 @@ "name": "Dutch Clock", "shortName":"Dutch Clock", "icon": "app.png", - "version":"0.05", + "version":"0.06", "description": "A clock that displays the time the way a Dutch person would respond when asked what time it is.", "type": "clock", "tags": "clock,dutch,text", From 97785aadbd5b74019ff1c1063dc1e8a2365e603e Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Tue, 3 Sep 2024 23:46:05 +0200 Subject: [PATCH 09/25] Add time line --- apps/dutchclock/app.js | 30 +++++++++++++++++++++++------- apps/dutchclock/metadata.json | 2 +- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/apps/dutchclock/app.js b/apps/dutchclock/app.js index df655c1f2..135cfa5ae 100644 --- a/apps/dutchclock/app.js +++ b/apps/dutchclock/app.js @@ -76,6 +76,7 @@ function tick() { function draw() { // work out how to display the current time const timeLines = getTimeLines(mins); + const bottomLines = getBottomLines(); // Reset the state of the graphics library g.clear(true); @@ -85,12 +86,13 @@ function draw() { g.setFontAlign(0,0); // align center top g.drawString(timeLines.join("\n"), X, Y, true /*clear background*/); - // draw the date, in a normal font - g.setFont("6x8"); - g.setFontAlign(0,1); // align center bottom - // pad the date - this clears the background if the date were to change length - var dateStr = " "+require("locale").date(date)+" "; - g.drawString(dateStr, SCREEN_WIDTH / 2, SCREEN_HEIGHT - 5, true /*clear background*/); + if (bottomLines.length) { + // draw the time and/or date, in a normal font + g.setFont("6x8"); + g.setFontAlign(0,1); // align center bottom + // pad the date - this clears the background if the date were to change length + g.drawString(bottomLines.join('\n'), SCREEN_WIDTH/2, SCREEN_HEIGHT - 5, true /*clear background*/); + } /* Show launcher when middle button pressed This should be done *before* Bangle.loadWidgets so that @@ -116,7 +118,21 @@ function setFont(timeLines) { } } -function getTimeLines(m) { +function getBottomLines() { + const lines = []; + + if (settings.showTimeLine) { + lines.push(require("locale").time(date)); + } + + if (settings.showDateLine) { + lines.push(`${date.getHours()}:${String(date.getMinutes()).padStart(2, '0')}`); + } + + return lines; + } + + function getTimeLines(m) { switch (settings.variant) { case VARIANT_EXACT: return getExactTimeLines(m); diff --git a/apps/dutchclock/metadata.json b/apps/dutchclock/metadata.json index 9a0bc84a2..d11dbbf41 100644 --- a/apps/dutchclock/metadata.json +++ b/apps/dutchclock/metadata.json @@ -3,7 +3,7 @@ "name": "Dutch Clock", "shortName":"Dutch Clock", "icon": "app.png", - "version":"0.06", + "version":"0.07", "description": "A clock that displays the time the way a Dutch person would respond when asked what time it is.", "type": "clock", "tags": "clock,dutch,text", From 5977d9b41201b029f781e99460b29bfabd55fd9a Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Tue, 3 Sep 2024 23:51:05 +0200 Subject: [PATCH 10/25] Fix timelines --- apps/dutchclock/app.js | 11 +++++++---- apps/dutchclock/metadata.json | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/apps/dutchclock/app.js b/apps/dutchclock/app.js index 135cfa5ae..e806a74f7 100644 --- a/apps/dutchclock/app.js +++ b/apps/dutchclock/app.js @@ -3,8 +3,9 @@ const storage = require("Storage"); const SCREEN_WIDTH = g.getWidth(); const SCREEN_HEIGHT = g.getHeight(); -const WIDGETS_HEIGHT = 25; -const DATETIME_SPACING_HEIGHT = 10; +const TOP_SPACING = 5; +const WIDGETS_HEIGHT = 20; +const DATETIME_SPACING_HEIGHT = 5; const DATE_HEIGHT = 10; const TIME_HEIGHT = 10; @@ -26,6 +27,7 @@ const settings = Object.assign( ); const maxFontSize = SCREEN_HEIGHT + - TOP_SPACING - (settings.showWidgets ? WIDGETS_HEIGHT : 0) - (settings.showDate || settings.showTime ? DATETIME_SPACING_HEIGHT : 0) - (settings.showDate ? DATE_HEIGHT : 0) @@ -33,6 +35,7 @@ const maxFontSize = SCREEN_HEIGHT const X = SCREEN_WIDTH / 2; const Y = SCREEN_HEIGHT / 2 + + TOP_SPACING / 2 + (settings.showWidgets ? WIDGETS_HEIGHT / 2 : 0) - (settings.showDate || settings.showTime ? DATETIME_SPACING_HEIGHT / 2 : 0) - (settings.showDate ? DATE_HEIGHT / 2 : 0) @@ -121,11 +124,11 @@ function setFont(timeLines) { function getBottomLines() { const lines = []; - if (settings.showTimeLine) { + if (settings.showTime) { lines.push(require("locale").time(date)); } - if (settings.showDateLine) { + if (settings.showDate) { lines.push(`${date.getHours()}:${String(date.getMinutes()).padStart(2, '0')}`); } diff --git a/apps/dutchclock/metadata.json b/apps/dutchclock/metadata.json index d11dbbf41..b5a7ad32d 100644 --- a/apps/dutchclock/metadata.json +++ b/apps/dutchclock/metadata.json @@ -3,7 +3,7 @@ "name": "Dutch Clock", "shortName":"Dutch Clock", "icon": "app.png", - "version":"0.07", + "version":"0.08", "description": "A clock that displays the time the way a Dutch person would respond when asked what time it is.", "type": "clock", "tags": "clock,dutch,text", From 966452854eb23a6357c2d95ed0c387e59bd41247 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Tue, 3 Sep 2024 23:57:14 +0200 Subject: [PATCH 11/25] Finetuning --- apps/dutchclock/app.js | 5 +++-- apps/dutchclock/metadata.json | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/dutchclock/app.js b/apps/dutchclock/app.js index e806a74f7..b801a2044 100644 --- a/apps/dutchclock/app.js +++ b/apps/dutchclock/app.js @@ -222,10 +222,11 @@ function addApproximateDescription(lines, offset) { } if (lines[1] === 'uur') { - const plural = getPlural(lines[0]); + const singular = lines[0]; + const plural = getPlural(singular); return { '-2': ['tegen', plural], - '-1': ['iets voor', plural], + '-1': ['iets voor', singular], '1': ['iets na', plural], '2': ['even na', plural] }[`${offset}`]; diff --git a/apps/dutchclock/metadata.json b/apps/dutchclock/metadata.json index b5a7ad32d..abaf15c49 100644 --- a/apps/dutchclock/metadata.json +++ b/apps/dutchclock/metadata.json @@ -3,7 +3,7 @@ "name": "Dutch Clock", "shortName":"Dutch Clock", "icon": "app.png", - "version":"0.08", + "version":"0.09", "description": "A clock that displays the time the way a Dutch person would respond when asked what time it is.", "type": "clock", "tags": "clock,dutch,text", From 42947f27bca55b3003989ce1f77fe29dbbe088e9 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Wed, 4 Sep 2024 00:13:23 +0200 Subject: [PATCH 12/25] Fix time and date lines --- apps/dutchclock/app.js | 5 +++-- apps/dutchclock/metadata.json | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/dutchclock/app.js b/apps/dutchclock/app.js index b801a2044..90e1e3c78 100644 --- a/apps/dutchclock/app.js +++ b/apps/dutchclock/app.js @@ -1,4 +1,5 @@ const storage = require("Storage"); +const locale = require('locale'); const SCREEN_WIDTH = g.getWidth(); const SCREEN_HEIGHT = g.getHeight(); @@ -125,11 +126,11 @@ function getBottomLines() { const lines = []; if (settings.showTime) { - lines.push(require("locale").time(date)); + lines.push(locale.time(date, 1)); } if (settings.showDate) { - lines.push(`${date.getHours()}:${String(date.getMinutes()).padStart(2, '0')}`); + lines.push(locale.date(date, 1)); } return lines; diff --git a/apps/dutchclock/metadata.json b/apps/dutchclock/metadata.json index abaf15c49..d1b352e0c 100644 --- a/apps/dutchclock/metadata.json +++ b/apps/dutchclock/metadata.json @@ -3,7 +3,7 @@ "name": "Dutch Clock", "shortName":"Dutch Clock", "icon": "app.png", - "version":"0.09", + "version":"0.10", "description": "A clock that displays the time the way a Dutch person would respond when asked what time it is.", "type": "clock", "tags": "clock,dutch,text", From 2f91496e57d3f2148f8212ae6e5dca2fe28f28cf Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Wed, 4 Sep 2024 01:10:59 +0200 Subject: [PATCH 13/25] Add Midnight Add README --- apps/dutchclock/README.md | 18 ++++++++++++++++++ apps/dutchclock/app.js | 28 ++++++++++++++-------------- apps/dutchclock/metadata.json | 9 +++++---- 3 files changed, 37 insertions(+), 18 deletions(-) create mode 100644 apps/dutchclock/README.md diff --git a/apps/dutchclock/README.md b/apps/dutchclock/README.md new file mode 100644 index 000000000..167cd4a4c --- /dev/null +++ b/apps/dutchclock/README.md @@ -0,0 +1,18 @@ +# Dutch Clock +This clock shows the time, in words, the way a Dutch person would tell you what time it is. Useful when learning Dutch. + +It was inspired by my wife, who sometimes insists I tell her exactly what time it says on the watch and not just an approximation. + +## Options +- Three modes: + - exact time ("zeven voor half zes / twee voor tien") + - approximate time, rounded to the nearest 5-minute mark ("bijna vijf voor half zes / tegen tienen") (the default) + - hybrid mode, rounded when close to the quarter marks and exact otherwise ("zeven voor half zes / tegen tienen") +- Option to turn top widgets on/off (on by default) +- Option to show digital time at the bottom (off by default) +- Option to show the date at the bottom (on by default) + +## Screenshots +![](screenshotbangle1-2.png) +![](screenshotbangle2.png) +![](screenshotbangle1.png) diff --git a/apps/dutchclock/app.js b/apps/dutchclock/app.js index 90e1e3c78..9523a360c 100644 --- a/apps/dutchclock/app.js +++ b/apps/dutchclock/app.js @@ -7,8 +7,9 @@ const SCREEN_HEIGHT = g.getHeight(); const TOP_SPACING = 5; const WIDGETS_HEIGHT = 20; const DATETIME_SPACING_HEIGHT = 5; -const DATE_HEIGHT = 10; const TIME_HEIGHT = 10; +const DATE_HEIGHT = 10; +const BOTTOM_SPACING = 5; const TEXT_WIDTH = SCREEN_WIDTH - 2; @@ -84,18 +85,19 @@ function draw() { // Reset the state of the graphics library g.clear(true); + // draw the current time (4x size 7 segment) setFont(timeLines); g.setFontAlign(0,0); // align center top - g.drawString(timeLines.join("\n"), X, Y, true /*clear background*/); + g.drawString(timeLines.join("\n"), X, Y, false); if (bottomLines.length) { // draw the time and/or date, in a normal font g.setFont("6x8"); g.setFontAlign(0,1); // align center bottom // pad the date - this clears the background if the date were to change length - g.drawString(bottomLines.join('\n'), SCREEN_WIDTH/2, SCREEN_HEIGHT - 5, true /*clear background*/); + g.drawString(bottomLines.join('\n'), SCREEN_WIDTH/2, SCREEN_HEIGHT - BOTTOM_SPACING, false); } /* Show launcher when middle button pressed @@ -130,13 +132,13 @@ function getBottomLines() { } if (settings.showDate) { - lines.push(locale.date(date, 1)); + lines.push(locale.date(date)); } return lines; } - function getTimeLines(m) { +function getTimeLines(m) { switch (settings.variant) { case VARIANT_EXACT: return getExactTimeLines(m); @@ -153,6 +155,10 @@ function getBottomLines() { } function getExactTimeLines(m) { + if (m === 0) { + return ['middernacht']; + } + const hour = getHour(m); const minutes = getMinutes(hour.offset); @@ -166,15 +172,8 @@ function getExactTimeLines(m) { function getApproximateTimeLines(m) { const roundMinutes = getRoundMinutes(m); - const hour = getHour(roundMinutes.minutes); - const minutes = getMinutes(hour.offset); - - const lines = minutes.concat(hour.lines); - - if (lines.length === 1) { - lines.push('uur'); - } + const lines = getExactTimeLines(roundMinutes.minutes); return addApproximateDescription(lines, roundMinutes.offset); } @@ -222,7 +221,7 @@ function addApproximateDescription(lines, offset) { return lines; } - if (lines[1] === 'uur') { + if (lines.length === 1 || lines[1] === 'uur') { const singular = lines[0]; const plural = getPlural(singular); return { @@ -243,6 +242,7 @@ function addApproximateDescription(lines, offset) { function getPlural(h) { return { + middernacht: 'middernacht', een: 'enen', twee: 'tweeën', drie: 'drieën', diff --git a/apps/dutchclock/metadata.json b/apps/dutchclock/metadata.json index d1b352e0c..5ee68b709 100644 --- a/apps/dutchclock/metadata.json +++ b/apps/dutchclock/metadata.json @@ -3,16 +3,16 @@ "name": "Dutch Clock", "shortName":"Dutch Clock", "icon": "app.png", - "version":"0.10", + "version":"0.11", "description": "A clock that displays the time the way a Dutch person would respond when asked what time it is.", "type": "clock", "tags": "clock,dutch,text", "supports": ["BANGLEJS", "BANGLEJS2"], "allow_emulator": true, "screenshots": [ + {"url":"screenshotbangle1-2.png"}, {"url":"screenshotbangle2.png"}, - {"url":"screenshotbangle1.png"}, - {"url":"screenshotbangle1-2.png"} + {"url":"screenshotbangle1.png"} ], "storage": [ {"name":"dutchclock.app.js","url":"app.js"}, @@ -22,6 +22,7 @@ ], "data": [ {"name":"dutchclock.json"} - ] + ], + "readme":"README.md" } \ No newline at end of file From d4229a75d2083bcda255c01707d2fd730df15bd9 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Thu, 5 Sep 2024 21:51:46 +0200 Subject: [PATCH 14/25] Make icon more readable --- apps/dutchclock/README.md | 6 +++--- apps/dutchclock/app.png | Bin 1436 -> 1856 bytes 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/dutchclock/README.md b/apps/dutchclock/README.md index 167cd4a4c..4faa03aa8 100644 --- a/apps/dutchclock/README.md +++ b/apps/dutchclock/README.md @@ -1,7 +1,7 @@ # Dutch Clock -This clock shows the time, in words, the way a Dutch person would tell you what time it is. Useful when learning Dutch. +This clock shows the time, in words, the way a Dutch person would tell you what time it is. Useful when learning Dutch or pretending to know Dutch. -It was inspired by my wife, who sometimes insists I tell her exactly what time it says on the watch and not just an approximation. +Dedicated my wife, who will sometimes insist I tell her exactly what time it says on the watch and not just an approximation. ## Options - Three modes: @@ -15,4 +15,4 @@ It was inspired by my wife, who sometimes insists I tell her exactly what time i ## Screenshots ![](screenshotbangle1-2.png) ![](screenshotbangle2.png) -![](screenshotbangle1.png) +![](screenshotbangle1.png) \ No newline at end of file diff --git a/apps/dutchclock/app.png b/apps/dutchclock/app.png index faacb7eaf13b86d8144a49f9afa9f0d9a49958ce..94d35b0c50425c16b10d8a39f205514250a51f76 100644 GIT binary patch delta 1825 zcmV++2j2Lc3&0ML83+Ra003az3AK?SAAbU}P)t-s|NsB~{{Gt9+QP!Z-QC^&{r&v> z{QLX+r>CcKa&oe=vY(%yRaI5>_4Uik%gxQr$H&Ll*Vp#;_VDoV&d$!o#l__0$88qL7e~92^|9w6yf}^l52nH#ax9xVTbMQp(E84h{~pv$N^x z>EYqw_xJabl9EC~LTznrP*6}_UVmObK0XNv3E0@!O-)UKfq_p?Po}1(y}iAEe}Av9 zuQ@q61qB71oSa}_U_?YjXlQ6WJUkW_7QVi|M@L6LKR+HG9#&RXN=ix^8XB9Mn-~}v z85tRUeSO>8+veuxsi~=+o}Tmb^L%`KaBy&xl$6uc)AI82@9*#U`1tDT>VJBAdg$or ziHV8a+}y6NuI=sZ6B83HEiEZ2Dd*?s&(F`StgKU0Q_<1Ug@uK-wzh+VgAoxC5D*ZG zii*L(!B|*W<>loeAtA7^umVQ?A|fIN1_m=T zGd4Ch*4EYn0s?VyaVjb*et&*`(9qD6latic)RB>qySuwlQBi<^fNyVa;NalH!^5qu ztvx+GMMXuOot;ZdOFKI|TwGid5)vmTCvs?=0GrEs07GF%84*YgakqJ3X&Jh1S?Xs)IyM`h%RKMcD1`* z|BpV-4v#+LoYnKx?>T$FZ}0p4-tRr{_d6f{3y3)03+hu$3zCk3VOf>|sO1O<9asYD zP~NAKB#18J8^wQ=kKp@*r3eIS%>&x$A%IT*;0%JG(3u(ofqyY<*6i>IDS`>+IgwG( zF@R+*A3G0me0=;v2}pc+KEGh0G(p2BElN&d7pJDBXCx#15$mH%Z1&8orOPs82+LPw z!;zD_a+Mj6J#Jk61k`I5IrH+NTw5Sb2%TR@M^=@w?#WmS)~<)Ks95JJN!+ke<{dPf zN@+`>dn&7}e19=2HY2yP815|90*iTDtA(aM?Y2C_VVfJ=x=?rux7X~bl_F3| z9p{^bc@MCL_D5 zn$Vo~Ts3UFTUsGjDhZBOPj~P%C7^y!n>wU@jnXIxN`D#*W~S^VieRmMUoF(n@2`(J zaPW{iAmQ+l?Py%4@8~>==GjZSUO0B#Qb#*32ZGiUClk8!px`5LDwEIAzj#_tYZSv0 zpkK=z%gKB=k1xcjnwP@rvKG+y5`$9U;5@_kl%n@+0lHp38|G+vWkLh;VBmd~w>aP| zQlhISDu1kDcXVI^r8t(i669(cu(zZ$0evzu^20J zB*`qy-B&W+Y=d>vTe^X(Ijw_38P}TZ!+iId%zxg={qF&FSR;Eqn`6PW3|p&|D6V|_ z1n&ykf30i8s+T6DzcYfQGGIg5yYCsWV+$WuG`y#=#~`lo2aCk`(b3fRfupJX7>lK4 zAAFdo^X7kK5YBNb7}QxSdOmgnYRgp>1CuH#F5S+!UE?rKsYd|yeqvKF^wJoaW}wy> zdVl%SIIe5Bsr8Ex{o-)9m2&H8gkc>s7#LbTbWQ|OP$LGVVH*9^gU>$iznfM*y#Uf) zX+*aBoX{9wQ30e!BiCHy5zaS+9HtvSFZG@y!(8tYTu8es}*T<3Q(x4!st z^;agDa}WrnUq_}@r(HN4^iBDD+<&}*1AT$6XEwYu1j)B=es^reY5se-#+pag z(+@8|r;e1f*f&_%&;RhF>nCRPXOE&}rB|N7z&*54J3P?ekrjV1u8X^I+o4bWMNUi< z1dcm{zy4PIJO22yJqGMw5%!Kdr6KZt@}(kyYW9b4UC@V$!Z-2D4*U(0^X!sr6%M1+ P00000NkvXXu0mjfTW)+l delta 1401 zcmV-<1%~>-4x9^+83+ad00374`G=7qAAbM|a7bBm000id000id0mpBsWB>pKF-b&0 zRA@u(nOP`xUlhQX;a*dGL>Zn)A(=|an5jG%9;B2qJn*3Vq>G{qUr`d`MT!T7n->qR zc%X;~Dan|Wv5U-eWZM6|mUHg^`o5RHb1pai{pxnsS$kj3x_j+4>|@3_@QpDSu7BT_ z9|KIyj{$NS92}&NR7`Hb#KZ)Bq$0_H)nXs9qt8j=l&kB_GZRjbv&e_e7X{>zh$ z4`t|HI5#39f(%4A!?D1?K$;sI94yR|h_DhL0^MO}XGgeuV|8_vDHIB(Qh%vvT&vZR z9{&aZrQgX@Q&Z%AIM>qB^6OowsHg}W92|tZH~jtmVP<9qxKES&q^72lolV*|UpyCipacY~Rk8OcapT^+c%xKQ+x4ef+a zK%>#H+uK``H#av~S63Iw3x5j>j2pw6o0}O=W~7sY>=kHfY0;MgxG^!tBg@On`izWO zcxh>g$k!=9RbTMgFR#xg=1r6ibndG&#wReflsL(pdU~zGgSy))G zfq?mG_ke03OKCDLQ$`E#xujIsje=H^tG8DeE+MH{-Utqph>r7Obs z%U^Tl@KZ{dn*XN(O-)Ty>v(y2Q3;KdmzP6&dOFFSot+RK9!~Ps))qA_xF3p(iz)kJ z#>R3S_k*vmFRZMr(0^P>;2!u0yg*}ic6Mxbc9wcv>}?TVI_MJ_&kg$iH!m-baYI>6 zO${Y5UUsnI;bF#GO2#uZgxKJjD&@SvFz+@W^ZrLc>P1Vq@*Nz zaPfl=iw2;P#^A#)gl>a!z}@vY@A@hk9T~M}J4s;kc)#Cp0uPP=S|| zlS6uAVey+I$o~n9@968()6?ML;Q>`uRdm9Dpg$iR9FTF|-rl5(j*h0YAFM{Pg~a`U zrx94GCMG7*969{t0aGK(0Q6}Lr+a&Qbf2G}Pkq2wBFg~uKCD7TFU-iupd*v7M3w>L z7_8=jX>FBO@6Pp-in-(|pVczkdB<$;rvg+1Z&6gykY@1u*U-&CShpPAY;u@cQ~X z9joBcx<;cBMu76c(9jT_hH(=q0ucPoD_2PH_d`Tz;SuVtz7nqxy1D#F> zcXxMGT4vye#R?QVHGHMSV?S(cY>)xx=jZf2EUzywFJXIo8!9R)NGBCpD}bkPXn$H- z8sz~jqs3AJ!>AZC6$%BtnTd;wgM@?xG8ScH9E5%IO$_i4(zN+5K@Jf%00000NkvXX Hu0mjfa@nr} From a53d1c2503ae2555ed34fc4f5911a2a1e9ce5e66 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Thu, 5 Sep 2024 21:55:02 +0200 Subject: [PATCH 15/25] Update version --- apps/dutchclock/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dutchclock/metadata.json b/apps/dutchclock/metadata.json index 5ee68b709..7fa9e9148 100644 --- a/apps/dutchclock/metadata.json +++ b/apps/dutchclock/metadata.json @@ -3,7 +3,7 @@ "name": "Dutch Clock", "shortName":"Dutch Clock", "icon": "app.png", - "version":"0.11", + "version":"0.12", "description": "A clock that displays the time the way a Dutch person would respond when asked what time it is.", "type": "clock", "tags": "clock,dutch,text", From 17b82f9ae1c6f9acd453ec9fb08c549ffddc7ae0 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Thu, 5 Sep 2024 22:00:59 +0200 Subject: [PATCH 16/25] Add changelog --- apps/dutchclock/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/dutchclock/ChangeLog diff --git a/apps/dutchclock/ChangeLog b/apps/dutchclock/ChangeLog new file mode 100644 index 000000000..b8e2bfeb9 --- /dev/null +++ b/apps/dutchclock/ChangeLog @@ -0,0 +1 @@ +0.12: First release \ No newline at end of file From bbc9d63d513cfb43bbe4ca31d63b5b1004be5b60 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Fri, 6 Sep 2024 21:43:14 +0200 Subject: [PATCH 17/25] Fix widgets reappearing --- apps/dutchclock/ChangeLog | 3 ++- apps/dutchclock/app.js | 17 ++++++++++------- apps/dutchclock/metadata.json | 2 +- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/apps/dutchclock/ChangeLog b/apps/dutchclock/ChangeLog index b8e2bfeb9..ebb8e9a25 100644 --- a/apps/dutchclock/ChangeLog +++ b/apps/dutchclock/ChangeLog @@ -1 +1,2 @@ -0.12: First release \ No newline at end of file +0.12: First release +0.13: Fix widgets reappearing \ No newline at end of file diff --git a/apps/dutchclock/app.js b/apps/dutchclock/app.js index 9523a360c..921f73401 100644 --- a/apps/dutchclock/app.js +++ b/apps/dutchclock/app.js @@ -1,5 +1,6 @@ const storage = require("Storage"); const locale = require('locale'); +const widget_utils = require('widget_utils'); const SCREEN_WIDTH = g.getWidth(); const SCREEN_HEIGHT = g.getHeight(); @@ -46,14 +47,12 @@ const Y = SCREEN_HEIGHT / 2 let date, mins; function initialize() { + // Load widgets + Bangle.loadWidgets(); + // draw immediately at first tick(); -// for (let mm = 0; mm < 60; mm++) { -// console.log(23, mm); -// console.log(getTimeLines(23 * 60 + mm)); -// } - // now check every second let secondInterval = setInterval(tick, 1000); // Stop updates when LCD is off, restart when on @@ -76,6 +75,10 @@ function tick() { mins = m; draw(); } + + if (!settings.showWidgets) { + widget_utils.hide(); + } } function draw() { @@ -106,9 +109,9 @@ function draw() { Bangle.setUI("clock"); if (settings.showWidgets) { - // Load widgets - Bangle.loadWidgets(); Bangle.drawWidgets(); + } else { + widget_utils.hide(); } } diff --git a/apps/dutchclock/metadata.json b/apps/dutchclock/metadata.json index 7fa9e9148..cec484219 100644 --- a/apps/dutchclock/metadata.json +++ b/apps/dutchclock/metadata.json @@ -3,7 +3,7 @@ "name": "Dutch Clock", "shortName":"Dutch Clock", "icon": "app.png", - "version":"0.12", + "version":"0.13", "description": "A clock that displays the time the way a Dutch person would respond when asked what time it is.", "type": "clock", "tags": "clock,dutch,text", From 85650f6d4b6290147db3eedeb4c3a5410ba1e320 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Fri, 6 Sep 2024 22:33:54 +0200 Subject: [PATCH 18/25] Fix midnight --- apps/dutchclock/ChangeLog | 3 ++- apps/dutchclock/app.js | 2 +- apps/dutchclock/metadata.json | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/dutchclock/ChangeLog b/apps/dutchclock/ChangeLog index ebb8e9a25..0f81644ea 100644 --- a/apps/dutchclock/ChangeLog +++ b/apps/dutchclock/ChangeLog @@ -1,2 +1,3 @@ 0.12: First release -0.13: Fix widgets reappearing \ No newline at end of file +0.13: Fix widgets reappearing +0.14: Fix midnight \ No newline at end of file diff --git a/apps/dutchclock/app.js b/apps/dutchclock/app.js index 921f73401..0947b374a 100644 --- a/apps/dutchclock/app.js +++ b/apps/dutchclock/app.js @@ -214,7 +214,7 @@ function getRoundMinutes(m) { const nearest = roundTo(5)(m); return { - minutes: nearest, + minutes: nearest % 60, offset: m - nearest }; } diff --git a/apps/dutchclock/metadata.json b/apps/dutchclock/metadata.json index cec484219..4155e13b3 100644 --- a/apps/dutchclock/metadata.json +++ b/apps/dutchclock/metadata.json @@ -3,7 +3,7 @@ "name": "Dutch Clock", "shortName":"Dutch Clock", "icon": "app.png", - "version":"0.13", + "version":"0.14", "description": "A clock that displays the time the way a Dutch person would respond when asked what time it is.", "type": "clock", "tags": "clock,dutch,text", From 610e1808f53674c4eed6421e94db876b0b0cf54f Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Fri, 6 Sep 2024 22:45:18 +0200 Subject: [PATCH 19/25] Fix midnight better --- apps/dutchclock/ChangeLog | 3 ++- apps/dutchclock/app.js | 5 +++-- apps/dutchclock/metadata.json | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/dutchclock/ChangeLog b/apps/dutchclock/ChangeLog index 0f81644ea..b55f0bbf1 100644 --- a/apps/dutchclock/ChangeLog +++ b/apps/dutchclock/ChangeLog @@ -1,3 +1,4 @@ 0.12: First release 0.13: Fix widgets reappearing -0.14: Fix midnight \ No newline at end of file +0.14: Fix midnight +0.15: Fix midnight better \ No newline at end of file diff --git a/apps/dutchclock/app.js b/apps/dutchclock/app.js index 0947b374a..0e647412c 100644 --- a/apps/dutchclock/app.js +++ b/apps/dutchclock/app.js @@ -15,6 +15,7 @@ const BOTTOM_SPACING = 5; const TEXT_WIDTH = SCREEN_WIDTH - 2; const MINS_IN_HOUR = 60; +const MINS_IN_DAY = 24 * MINS_IN_HOUR; const VARIANT_EXACT = 'exact'; const VARIANT_APPROXIMATE = 'approximate'; @@ -69,7 +70,7 @@ function initialize() { function tick() { date = new Date(); - const m = date.getHours() * MINS_IN_HOUR + date.getMinutes(); + const m = (date.getHours() * MINS_IN_HOUR + date.getMinutes()) % MINS_IN_DAY; if (m !== mins) { mins = m; @@ -214,7 +215,7 @@ function getRoundMinutes(m) { const nearest = roundTo(5)(m); return { - minutes: nearest % 60, + minutes: nearest, offset: m - nearest }; } diff --git a/apps/dutchclock/metadata.json b/apps/dutchclock/metadata.json index 4155e13b3..2a711bdd4 100644 --- a/apps/dutchclock/metadata.json +++ b/apps/dutchclock/metadata.json @@ -3,7 +3,7 @@ "name": "Dutch Clock", "shortName":"Dutch Clock", "icon": "app.png", - "version":"0.14", + "version":"0.15", "description": "A clock that displays the time the way a Dutch person would respond when asked what time it is.", "type": "clock", "tags": "clock,dutch,text", From 072db5c9b9be6ecd7438dec30a4383cceaf32ab8 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Fri, 6 Sep 2024 22:53:14 +0200 Subject: [PATCH 20/25] Fix midnight decisively --- apps/dutchclock/ChangeLog | 3 ++- apps/dutchclock/app.js | 2 +- apps/dutchclock/metadata.json | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/dutchclock/ChangeLog b/apps/dutchclock/ChangeLog index b55f0bbf1..6519f3b74 100644 --- a/apps/dutchclock/ChangeLog +++ b/apps/dutchclock/ChangeLog @@ -1,4 +1,5 @@ 0.12: First release 0.13: Fix widgets reappearing 0.14: Fix midnight -0.15: Fix midnight better \ No newline at end of file +0.15: Fix midnight better +0.16: Fix midnight decisively \ No newline at end of file diff --git a/apps/dutchclock/app.js b/apps/dutchclock/app.js index 0e647412c..240dca514 100644 --- a/apps/dutchclock/app.js +++ b/apps/dutchclock/app.js @@ -215,7 +215,7 @@ function getRoundMinutes(m) { const nearest = roundTo(5)(m); return { - minutes: nearest, + minutes: nearest % MINS_IN_DAY, offset: m - nearest }; } diff --git a/apps/dutchclock/metadata.json b/apps/dutchclock/metadata.json index 2a711bdd4..0f571ae5f 100644 --- a/apps/dutchclock/metadata.json +++ b/apps/dutchclock/metadata.json @@ -3,7 +3,7 @@ "name": "Dutch Clock", "shortName":"Dutch Clock", "icon": "app.png", - "version":"0.15", + "version":"0.16", "description": "A clock that displays the time the way a Dutch person would respond when asked what time it is.", "type": "clock", "tags": "clock,dutch,text", From 0219eeb0ef9d42ed34c39d6e4b205580a846b598 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Fri, 6 Sep 2024 23:10:45 +0200 Subject: [PATCH 21/25] Fix loadWidgets location --- apps/dutchclock/ChangeLog | 3 ++- apps/dutchclock/app.js | 5 ++--- apps/dutchclock/metadata.json | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/dutchclock/ChangeLog b/apps/dutchclock/ChangeLog index 6519f3b74..bc6f1de46 100644 --- a/apps/dutchclock/ChangeLog +++ b/apps/dutchclock/ChangeLog @@ -2,4 +2,5 @@ 0.13: Fix widgets reappearing 0.14: Fix midnight 0.15: Fix midnight better -0.16: Fix midnight decisively \ No newline at end of file +0.16: Fix midnight decisively +0.17: Get loadWidgets back in the right place \ No newline at end of file diff --git a/apps/dutchclock/app.js b/apps/dutchclock/app.js index 240dca514..b1dd20b9b 100644 --- a/apps/dutchclock/app.js +++ b/apps/dutchclock/app.js @@ -48,9 +48,6 @@ const Y = SCREEN_HEIGHT / 2 let date, mins; function initialize() { - // Load widgets - Bangle.loadWidgets(); - // draw immediately at first tick(); @@ -108,6 +105,8 @@ function draw() { This should be done *before* Bangle.loadWidgets so that widgets know if they're being loaded into a clock app or not */ Bangle.setUI("clock"); + // Load widgets + Bangle.loadWidgets(); if (settings.showWidgets) { Bangle.drawWidgets(); diff --git a/apps/dutchclock/metadata.json b/apps/dutchclock/metadata.json index 0f571ae5f..3d5b50484 100644 --- a/apps/dutchclock/metadata.json +++ b/apps/dutchclock/metadata.json @@ -3,7 +3,7 @@ "name": "Dutch Clock", "shortName":"Dutch Clock", "icon": "app.png", - "version":"0.16", + "version":"0.17", "description": "A clock that displays the time the way a Dutch person would respond when asked what time it is.", "type": "clock", "tags": "clock,dutch,text", From 4bdf4a0b5ce7a4146ec1acbe1f2b62f2e76484ef Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Fri, 6 Sep 2024 23:39:29 +0200 Subject: [PATCH 22/25] Move initialization into initialize function --- apps/dutchclock/ChangeLog | 3 ++- apps/dutchclock/app.js | 11 +++++------ apps/dutchclock/metadata.json | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/dutchclock/ChangeLog b/apps/dutchclock/ChangeLog index bc6f1de46..7589f192d 100644 --- a/apps/dutchclock/ChangeLog +++ b/apps/dutchclock/ChangeLog @@ -3,4 +3,5 @@ 0.14: Fix midnight 0.15: Fix midnight better 0.16: Fix midnight decisively -0.17: Get loadWidgets back in the right place \ No newline at end of file +0.17: Get loadWidgets back in the right place +0.18: Move setUI and loadWidgets to initialize function \ No newline at end of file diff --git a/apps/dutchclock/app.js b/apps/dutchclock/app.js index b1dd20b9b..5e026316a 100644 --- a/apps/dutchclock/app.js +++ b/apps/dutchclock/app.js @@ -48,6 +48,11 @@ const Y = SCREEN_HEIGHT / 2 let date, mins; function initialize() { + // Tell Bangle this is a clock + Bangle.setUI("clock"); + // Load widgets + Bangle.loadWidgets(); + // draw immediately at first tick(); @@ -101,12 +106,6 @@ function draw() { g.drawString(bottomLines.join('\n'), SCREEN_WIDTH/2, SCREEN_HEIGHT - BOTTOM_SPACING, false); } - /* Show launcher when middle button pressed - This should be done *before* Bangle.loadWidgets so that - widgets know if they're being loaded into a clock app or not */ - Bangle.setUI("clock"); - // Load widgets - Bangle.loadWidgets(); if (settings.showWidgets) { Bangle.drawWidgets(); diff --git a/apps/dutchclock/metadata.json b/apps/dutchclock/metadata.json index 3d5b50484..8cb0fbb86 100644 --- a/apps/dutchclock/metadata.json +++ b/apps/dutchclock/metadata.json @@ -3,7 +3,7 @@ "name": "Dutch Clock", "shortName":"Dutch Clock", "icon": "app.png", - "version":"0.17", + "version":"0.18", "description": "A clock that displays the time the way a Dutch person would respond when asked what time it is.", "type": "clock", "tags": "clock,dutch,text", From 490b165862673c3840a7bb91797ac3eaf52de440 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Sat, 7 Sep 2024 12:49:56 +0200 Subject: [PATCH 23/25] Make compatible with top and bottom widgets --- apps/dutchclock/ChangeLog | 3 +- apps/dutchclock/README.md | 8 +++- apps/dutchclock/app.js | 79 ++++++++++++++++------------------- apps/dutchclock/metadata.json | 2 +- 4 files changed, 46 insertions(+), 46 deletions(-) diff --git a/apps/dutchclock/ChangeLog b/apps/dutchclock/ChangeLog index 7589f192d..16d99b124 100644 --- a/apps/dutchclock/ChangeLog +++ b/apps/dutchclock/ChangeLog @@ -4,4 +4,5 @@ 0.15: Fix midnight better 0.16: Fix midnight decisively 0.17: Get loadWidgets back in the right place -0.18: Move setUI and loadWidgets to initialize function \ No newline at end of file +0.18: Move setUI and loadWidgets to initialize function +0.19: Make compatible with top and bottom widgets \ No newline at end of file diff --git a/apps/dutchclock/README.md b/apps/dutchclock/README.md index 4faa03aa8..787bcce1b 100644 --- a/apps/dutchclock/README.md +++ b/apps/dutchclock/README.md @@ -1,7 +1,7 @@ # Dutch Clock -This clock shows the time, in words, the way a Dutch person would tell you what time it is. Useful when learning Dutch or pretending to know Dutch. +This clock shows the time, in words, the way a Dutch person might respond when asked what time it is. Useful when learning Dutch and/or pretending to know Dutch. -Dedicated my wife, who will sometimes insist I tell her exactly what time it says on the watch and not just an approximation. +Dedicated to my wife, who will sometimes insist I tell her exactly what time it says on the watch and not just an approximation. ## Options - Three modes: @@ -12,6 +12,10 @@ Dedicated my wife, who will sometimes insist I tell her exactly what time it say - Option to show digital time at the bottom (off by default) - Option to show the date at the bottom (on by default) +The app respects top and bottom widgets, but it gets a bit crowded when you add the time/date and you also have bottom widgets turned on. + +When you turn widgets off, you can still see the top widgets by swiping down from the top. + ## Screenshots ![](screenshotbangle1-2.png) ![](screenshotbangle2.png) diff --git a/apps/dutchclock/app.js b/apps/dutchclock/app.js index 5e026316a..41ace8fca 100644 --- a/apps/dutchclock/app.js +++ b/apps/dutchclock/app.js @@ -1,18 +1,14 @@ +// Load libraries const storage = require("Storage"); const locale = require('locale'); const widget_utils = require('widget_utils'); -const SCREEN_WIDTH = g.getWidth(); -const SCREEN_HEIGHT = g.getHeight(); - -const TOP_SPACING = 5; +// Define constants const WIDGETS_HEIGHT = 20; const DATETIME_SPACING_HEIGHT = 5; -const TIME_HEIGHT = 10; -const DATE_HEIGHT = 10; -const BOTTOM_SPACING = 5; - -const TEXT_WIDTH = SCREEN_WIDTH - 2; +const TIME_HEIGHT = 8; +const DATE_HEIGHT = 8; +const BOTTOM_SPACING = 2; const MINS_IN_HOUR = 60; const MINS_IN_DAY = 24 * MINS_IN_HOUR; @@ -30,29 +26,39 @@ const settings = Object.assign( storage.readJSON(SETTINGS_FILE, true) || {} ); -const maxFontSize = SCREEN_HEIGHT - - TOP_SPACING - - (settings.showWidgets ? WIDGETS_HEIGHT : 0) - - (settings.showDate || settings.showTime ? DATETIME_SPACING_HEIGHT : 0) - - (settings.showDate ? DATE_HEIGHT : 0) - - (settings.showTime ? TIME_HEIGHT : 0); - -const X = SCREEN_WIDTH / 2; -const Y = SCREEN_HEIGHT / 2 - + TOP_SPACING / 2 - + (settings.showWidgets ? WIDGETS_HEIGHT / 2 : 0) - - (settings.showDate || settings.showTime ? DATETIME_SPACING_HEIGHT / 2 : 0) - - (settings.showDate ? DATE_HEIGHT / 2 : 0) - - (settings.showTime ? TIME_HEIGHT / 2 : 0); - +// Define global variables +const textBox = {}; let date, mins; +// Define functions function initialize() { + // Reset the state of the graphics library + g.clear(true); + // Tell Bangle this is a clock Bangle.setUI("clock"); + // Load widgets Bangle.loadWidgets(); + // Show widgets, or not + if (settings.showWidgets) { + Bangle.drawWidgets(); + } else { + widget_utils.swipeOn(); + } + + const dateTimeHeight = (settings.showDate || settings.showTime ? DATETIME_SPACING_HEIGHT : 0) + + (settings.showDate ? DATE_HEIGHT : 0) + + (settings.showTime ? TIME_HEIGHT : 0); + + Object.assign(textBox, { + x: Bangle.appRect.x + Bangle.appRect.w / 2, + y: Bangle.appRect.y + (Bangle.appRect.h - dateTimeHeight) / 2, + w: Bangle.appRect.w - 2, + h: Bangle.appRect.h - dateTimeHeight + }); + // draw immediately at first tick(); @@ -78,10 +84,6 @@ function tick() { mins = m; draw(); } - - if (!settings.showWidgets) { - widget_utils.hide(); - } } function draw() { @@ -89,40 +91,32 @@ function draw() { const timeLines = getTimeLines(mins); const bottomLines = getBottomLines(); - // Reset the state of the graphics library - g.clear(true); + g.reset().clearRect(Bangle.appRect); // draw the current time (4x size 7 segment) setFont(timeLines); g.setFontAlign(0,0); // align center top - g.drawString(timeLines.join("\n"), X, Y, false); + g.drawString(timeLines.join("\n"), textBox.x, textBox.y, false); if (bottomLines.length) { // draw the time and/or date, in a normal font g.setFont("6x8"); g.setFontAlign(0,1); // align center bottom // pad the date - this clears the background if the date were to change length - g.drawString(bottomLines.join('\n'), SCREEN_WIDTH/2, SCREEN_HEIGHT - BOTTOM_SPACING, false); - } - - - if (settings.showWidgets) { - Bangle.drawWidgets(); - } else { - widget_utils.hide(); + g.drawString(bottomLines.join('\n'), Bangle.appRect.w / 2, Bangle.appRect.y2 - BOTTOM_SPACING, false); } } function setFont(timeLines) { - const size = maxFontSize / timeLines.length; + const size = textBox.h / timeLines.length; g.setFont("Vector", size); let width = g.stringWidth(timeLines.join('\n')); - if (width > TEXT_WIDTH) { - g.setFont("Vector", Math.floor(size * (TEXT_WIDTH / width))); + if (width > textBox.w) { + g.setFont("Vector", Math.floor(size * (textBox.w / width))); } } @@ -263,4 +257,5 @@ function roundTo(x) { return n => Math.round(n / x) * x; } +// Let's go initialize(); \ No newline at end of file diff --git a/apps/dutchclock/metadata.json b/apps/dutchclock/metadata.json index 8cb0fbb86..5be13d888 100644 --- a/apps/dutchclock/metadata.json +++ b/apps/dutchclock/metadata.json @@ -3,7 +3,7 @@ "name": "Dutch Clock", "shortName":"Dutch Clock", "icon": "app.png", - "version":"0.18", + "version":"0.19", "description": "A clock that displays the time the way a Dutch person would respond when asked what time it is.", "type": "clock", "tags": "clock,dutch,text", From 0d6f7687fcbc564b0b4fc760a208a552e8dbf538 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Sat, 7 Sep 2024 12:59:15 +0200 Subject: [PATCH 24/25] Remove unused constant --- apps/dutchclock/ChangeLog | 3 ++- apps/dutchclock/app.js | 1 - apps/dutchclock/metadata.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/dutchclock/ChangeLog b/apps/dutchclock/ChangeLog index 16d99b124..381e421e5 100644 --- a/apps/dutchclock/ChangeLog +++ b/apps/dutchclock/ChangeLog @@ -5,4 +5,5 @@ 0.16: Fix midnight decisively 0.17: Get loadWidgets back in the right place 0.18: Move setUI and loadWidgets to initialize function -0.19: Make compatible with top and bottom widgets \ No newline at end of file +0.19: Make compatible with top and bottom widgets +0.20: Remove unused constant \ No newline at end of file diff --git a/apps/dutchclock/app.js b/apps/dutchclock/app.js index 41ace8fca..f970b572f 100644 --- a/apps/dutchclock/app.js +++ b/apps/dutchclock/app.js @@ -4,7 +4,6 @@ const locale = require('locale'); const widget_utils = require('widget_utils'); // Define constants -const WIDGETS_HEIGHT = 20; const DATETIME_SPACING_HEIGHT = 5; const TIME_HEIGHT = 8; const DATE_HEIGHT = 8; diff --git a/apps/dutchclock/metadata.json b/apps/dutchclock/metadata.json index 5be13d888..d336023f8 100644 --- a/apps/dutchclock/metadata.json +++ b/apps/dutchclock/metadata.json @@ -3,7 +3,7 @@ "name": "Dutch Clock", "shortName":"Dutch Clock", "icon": "app.png", - "version":"0.19", + "version":"0.20", "description": "A clock that displays the time the way a Dutch person would respond when asked what time it is.", "type": "clock", "tags": "clock,dutch,text", From e4518870a6b5277c8f696131a353d1b474c61413 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Sat, 7 Sep 2024 15:00:24 +0200 Subject: [PATCH 25/25] Prune Changelog --- apps/dutchclock/ChangeLog | 10 +--------- apps/dutchclock/app.js | 2 +- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/apps/dutchclock/ChangeLog b/apps/dutchclock/ChangeLog index 381e421e5..8efcb9edb 100644 --- a/apps/dutchclock/ChangeLog +++ b/apps/dutchclock/ChangeLog @@ -1,9 +1 @@ -0.12: First release -0.13: Fix widgets reappearing -0.14: Fix midnight -0.15: Fix midnight better -0.16: Fix midnight decisively -0.17: Get loadWidgets back in the right place -0.18: Move setUI and loadWidgets to initialize function -0.19: Make compatible with top and bottom widgets -0.20: Remove unused constant \ No newline at end of file +0.20: First release \ No newline at end of file diff --git a/apps/dutchclock/app.js b/apps/dutchclock/app.js index f970b572f..588692a2b 100644 --- a/apps/dutchclock/app.js +++ b/apps/dutchclock/app.js @@ -63,8 +63,8 @@ function initialize() { // now check every second let secondInterval = setInterval(tick, 1000); - // Stop updates when LCD is off, restart when on + // Stop updates when LCD is off, restart when on Bangle.on('lcdPower',on=>{ if (secondInterval) clearInterval(secondInterval); secondInterval = undefined;