From 9eb19d701072d6ce4e9d99c9f1a3782630bc46e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20Arguill=C3=A8re?= Date: Wed, 27 Mar 2024 19:06:04 +0100 Subject: [PATCH 1/5] handle AM/PM time in target menu, add yesterday/today/tomorrow to improve readability --- apps/elapsed_t/app.js | 121 +++++++++++++++++++++++++++--------------- 1 file changed, 79 insertions(+), 42 deletions(-) diff --git a/apps/elapsed_t/app.js b/apps/elapsed_t/app.js index f799c4f4c..da006c144 100644 --- a/apps/elapsed_t/app.js +++ b/apps/elapsed_t/app.js @@ -112,6 +112,13 @@ function formatDateTime(date, dateFormat, time24, showSeconds) { return formattedDateTime; } +function formatHourToAMPM(h){ + var ampm = (h >= 12 ? 'PM' : 'AM'); + var h_ampm = h % 12; + h_ampm = (h_ampm == 0 ? 12 : h_ampm); + return `${h_ampm} ${ampm}` +} + function howManyDaysInMonth(month, year) { return new Date(year, month, 0).getDate(); } @@ -125,44 +132,6 @@ function handleExceedingDay() { } } -function setTarget(set) { - if (set) { - target = new Date( - data.target.Y, - data.target.M - 1, - data.target.D, - data.target.h, - data.target.m, - data.target.s - ); - data.target.isSet = true; - } else { - target = new Date(); - Object.assign( - data, - { - target: { - isSet: false, - Y: now.getFullYear(), - M: now.getMonth() + 1, // Month is zero-based, so add 1 - D: now.getDate(), - h: now.getHours(), - m: now.getMinutes(), - s: now.getSeconds() - } - } - ); - } - - writeData(); -} - -var target; -setTarget(data.target.isSet); - -var drawTimeout; -var queueMillis = 1000; - var menu = { "": { "title": "Set target", @@ -202,7 +171,7 @@ var menu = { onchange: v => { data.target.h = v; }, - format: function (v) { return pad2(v); } + format: function (v) {return(settings.time24 ? pad2(v) : formatHourToAMPM(v))} }, 'Minutes': { value: data.target.m, @@ -240,6 +209,51 @@ var menu = { } }; +function setTarget(set) { + if (set) { + target = new Date( + data.target.Y, + data.target.M - 1, + data.target.D, + data.target.h, + data.target.m, + data.target.s + ); + data.target.isSet = true; + } else { + target = new Date(); + Object.assign( + data, + { + target: { + isSet: false, + Y: now.getFullYear(), + M: now.getMonth() + 1, // Month is zero-based, so add 1 + D: now.getDate(), + h: now.getHours(), + m: now.getMinutes(), + s: 0 + } + } + ); + menu.Day.value = data.target.D; + menu.Month.value = data.target.M; + menu.Year.value = data.target.Y; + menu.Hours.value = data.target.h; + menu.Minutes.value = data.target.m; + menu.Seconds.value = 0; + } + + writeData(); +} + +var target; +setTarget(data.target.isSet); + +var drawTimeout; +var queueMillis = 1000; + + function queueDraw() { if (drawTimeout) clearTimeout(drawTimeout); var delay = queueMillis - (Date.now() % queueMillis); @@ -359,10 +373,19 @@ function diffToTarget() { } function draw() { - var nowFormatted = formatDateTime(new Date(), settings.dateFormat, settings.time24, temp_displaySeconds); + var now = new Date(); + var nowFormatted = formatDateTime(now, settings.dateFormat, settings.time24, temp_displaySeconds); var targetFormatted = formatDateTime(target, settings.dateFormat, settings.time24, true); var diff = diffToTarget(); + const nowY = now.getFullYear(); + const nowM = now.getMonth(); + const nowD = now.getDate(); + + const targetY = target.getFullYear(); + const targetM = target.getMonth(); + const targetD = target.getDate(); + var diffYMD; if (settings.displayMonthsYears) diffYMD = `${diff.sign}${diff.Y}Y ${diff.M}M ${diff.D}D`; @@ -391,9 +414,23 @@ function draw() { g.drawString(">", 4, y + 3); if (data.target.isSet) { - // draw target date g.setFont("Vector", SMALL_FONT_SIZE).setFontAlign(-1, -1).setColor(g.theme.dark ? COLOUR_ORANGE : COLOUR_RED); - g.drawString(targetFormatted.date, 4 + 16 + 6, y); + + if (nowY == targetY && nowM == targetM && nowD == targetD) { + // today + g.drawString("TODAY", 4 + 16 + 6, y); + } else if (nowY == targetY && nowM == targetM && nowD - targetD == 1) { + // yesterday + g.drawString("YESTERDAY", 4 + 16 + 6, y); + } else if (nowY == targetY && nowM == targetM && targetD - nowD == 1) { + // tomorrow + g.drawString("TOMORROW", 4 + 16 + 6, y); + } else { + // general case + // draw target date + g.drawString(targetFormatted.date, 4 + 16 + 6, y); + } + y += SMALL_FONT_SIZE; // draw target time From 40a29528d236e0f7102109f4cfa4f0f86b0d3258 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20Arguill=C3=A8re?= Date: Wed, 27 Mar 2024 19:07:25 +0100 Subject: [PATCH 2/5] update changelog and metadata --- apps/elapsed_t/ChangeLog | 3 ++- apps/elapsed_t/metadata.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/elapsed_t/ChangeLog b/apps/elapsed_t/ChangeLog index 2286a7f70..45cb47c9a 100644 --- a/apps/elapsed_t/ChangeLog +++ b/apps/elapsed_t/ChangeLog @@ -1 +1,2 @@ -0.01: New App! \ No newline at end of file +0.01: New App! +0.02: Handle AM/PM time in the "set target" menu. Add yesterday/today/tomorrow when showing target date to improve readability. \ No newline at end of file diff --git a/apps/elapsed_t/metadata.json b/apps/elapsed_t/metadata.json index fe9af630f..7f8460e49 100644 --- a/apps/elapsed_t/metadata.json +++ b/apps/elapsed_t/metadata.json @@ -3,7 +3,7 @@ "name": "Elapsed Time Clock", "shortName": "Elapsed Time", "type": "clock", - "version":"0.01", + "version":"0.02", "description": "A clock that calculates the time difference between now and any given target date.", "tags": "clock,tool", "supports": ["BANGLEJS2"], From 13b82670a312fdc3c7c3c07061a2d2a55b0364bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20Arguill=C3=A8re?= Date: Wed, 27 Mar 2024 19:08:39 +0100 Subject: [PATCH 3/5] add space in AM/PM time --- apps/elapsed_t/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/elapsed_t/app.js b/apps/elapsed_t/app.js index da006c144..a61eb2176 100644 --- a/apps/elapsed_t/app.js +++ b/apps/elapsed_t/app.js @@ -106,7 +106,7 @@ function formatDateTime(date, dateFormat, time24, showSeconds) { var ampm = (h >= 12 ? 'PM' : 'AM'); var h_ampm = h % 12; h_ampm = (h_ampm == 0 ? 12 : h_ampm); - formattedDateTime.time = `${h_ampm}:${mm}${showSeconds ? `:${ss}` : ''}${ampm}`; + formattedDateTime.time = `${h_ampm}:${mm}${showSeconds ? `:${ss}` : ''} ${ampm}`; } return formattedDateTime; From df787b6db1d919fd12dabad45c26032a8644f073 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20Arguill=C3=A8re?= Date: Wed, 27 Mar 2024 19:11:20 +0100 Subject: [PATCH 4/5] set 0 as default value for seconds --- apps/elapsed_t/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/elapsed_t/app.js b/apps/elapsed_t/app.js index a61eb2176..b38735a32 100644 --- a/apps/elapsed_t/app.js +++ b/apps/elapsed_t/app.js @@ -41,7 +41,7 @@ var data = Object.assign({ D: now.getDate(), h: now.getHours(), m: now.getMinutes(), - s: now.getSeconds() + s: 0 } }, require('Storage').readJSON(APP_NAME + ".data.json", true) || {}); From 71ff4afb39ecbe2c758f6dc3849e3589066136c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20Arguill=C3=A8re?= Date: Wed, 27 Mar 2024 19:28:19 +0100 Subject: [PATCH 5/5] Update screenshot2.png --- apps/elapsed_t/screenshot2.png | Bin 4313 -> 4020 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/elapsed_t/screenshot2.png b/apps/elapsed_t/screenshot2.png index 67dd4f186dfa32dde31a2a1b4be69d457b45a80d..00ad8aa366434f55b27897511edde9321f28ac27 100644 GIT binary patch delta 4010 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 QsQ>@~07*qoM6N<$f>ivrqyPW_ delta 4305 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