From a99f21aab7f7f5cfd461a0767a3670bc2a6d8655 Mon Sep 17 00:00:00 2001 From: paul-arg Date: Sat, 23 Mar 2024 16:56:11 +0100 Subject: [PATCH 01/13] initial Elapsed Time Clock commit Update metadata.json Add files via upload Update README.md Update README.md Update README.md Add files via upload Update metadata.json Update app.js Update app.js Update settings.js Update app-icon.js Update metadata.json Update metadata.json Update README.md Add files via upload Create metadata.json --- apps/elapsed_t/ChangeLog | 1 + apps/elapsed_t/README.md | 22 ++ apps/elapsed_t/app-icon.js | 1 + apps/elapsed_t/app.js | 438 +++++++++++++++++++++++++++++++++ apps/elapsed_t/app.png | Bin 0 -> 2264 bytes apps/elapsed_t/metadata.json | 21 ++ apps/elapsed_t/screenshot1.png | Bin 0 -> 3719 bytes apps/elapsed_t/screenshot2.png | Bin 0 -> 3323 bytes apps/elapsed_t/screenshot3.png | Bin 0 -> 3893 bytes apps/elapsed_t/settings.js | 55 +++++ 10 files changed, 538 insertions(+) create mode 100644 apps/elapsed_t/ChangeLog create mode 100644 apps/elapsed_t/README.md create mode 100644 apps/elapsed_t/app-icon.js create mode 100644 apps/elapsed_t/app.js create mode 100644 apps/elapsed_t/app.png create mode 100644 apps/elapsed_t/metadata.json create mode 100644 apps/elapsed_t/screenshot1.png create mode 100644 apps/elapsed_t/screenshot2.png create mode 100644 apps/elapsed_t/screenshot3.png create mode 100644 apps/elapsed_t/settings.js diff --git a/apps/elapsed_t/ChangeLog b/apps/elapsed_t/ChangeLog new file mode 100644 index 000000000..2286a7f70 --- /dev/null +++ b/apps/elapsed_t/ChangeLog @@ -0,0 +1 @@ +0.01: New App! \ No newline at end of file diff --git a/apps/elapsed_t/README.md b/apps/elapsed_t/README.md new file mode 100644 index 000000000..b085cd70f --- /dev/null +++ b/apps/elapsed_t/README.md @@ -0,0 +1,22 @@ +# Elapsed Time Clock +A clock that calculates the time difference between now (in blue) and any given target date (in red). + +The results is show in years, months, days, hours, minutes, seconds. To save battery life, the seconds are shown only when the watch is unlocked, or can be disabled entirely. + +The time difference is positive if the target date is in the past and negative if it is in the future. + +![Screenshot 1](screenshot1.png) +![Screenshot 2](screenshot2.png) +![Screenshot 3](screenshot3.png) + +# Settings +## Time and date formats: +- time can be shown in 24h or in AM/PM format +- date can be shown in DD/MM/YYYY, MM/DD/YYYY or YYYY-MM-DD format + +## Display years and months +You can select if the difference is shown with years, months and days, or just days. + +# TODO +- add the option to set an alarm to the target date +- add an offset to said alarm (e.g. x hours/days... before/after) diff --git a/apps/elapsed_t/app-icon.js b/apps/elapsed_t/app-icon.js new file mode 100644 index 000000000..0e9a434fc --- /dev/null +++ b/apps/elapsed_t/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwcA/4A/AH8kyVJARAQE/YRLn4RD/IRT5cs2QCEEbQgFAQYjIrMlAQwjR5JHIsv2pNkz3JsgjKl/yEAO/I5l/+REBz/7I5f/EYf/I5Vf//2rNlz//8gjJAgIjE/hHIy7xEAAQjIDoIAG+RHHCA///wjHCJIjHMoI1HEY+zCI6zJv4dCFIX9R5PPR4vsEZNJCILXC/77JyXLn4jD/b7KpMnI4fZBARHHpcsEYW2AQIjKARBHIDoICECJIjRpZKCAQYjbCMH/CJVLCAgA/AHYA==")) diff --git a/apps/elapsed_t/app.js b/apps/elapsed_t/app.js new file mode 100644 index 000000000..8237ef32c --- /dev/null +++ b/apps/elapsed_t/app.js @@ -0,0 +1,438 @@ +const APP_NAME = "elapsed_t"; + +const COLOUR_BLACK = 0x0; +const COLOUR_DARK_GREY = 0x4208; // same as: g.setColor(0.25, 0.25, 0.25) +const COLOUR_GREY = 0x8410; // same as: g.setColor(0.5, 0.5, 0.5) +const COLOUR_LIGHT_GREY = 0xc618; // same as: g.setColor(0.75, 0.75, 0.75) +const COLOUR_RED = 0xf800; // same as: g.setColor(1, 0, 0) +const COLOUR_BLUE = 0x001f; // same as: g.setColor(0, 0, 1) +const COLOUR_YELLOW = 0xffe0; // same as: g.setColor(1, 1, 0) +const COLOUR_LIGHT_CYAN = 0x87ff; // same as: g.setColor(0.5, 1, 1) +const COLOUR_DARK_YELLOW = 0x8400; // same as: g.setColor(0.5, 0.5, 0) +const COLOUR_DARK_CYAN = 0x0410; // same as: g.setColor(0, 0.5, 0.5) +const COLOUR_ORANGE = 0xfc00; // same as: g.setColor(1, 0.5, 0) + +const SCREEN_WIDTH = g.getWidth(); +const SCREEN_HEIGHT = g.getHeight(); +const BIG_FONT_SIZE = 38; +const SMALL_FONT_SIZE = 22; + +var arrowFont = atob("BwA4AcAOAHADgBwA4McfOf3e/+P+D+A+AOA="); // contains only the > character + +var now = new Date(); + +var settings = Object.assign({ + // default values + displaySeconds: true, + displayMonthsYears: true, + dateFormat: 0, + time24: true +}, require('Storage').readJSON(APP_NAME + ".settings.json", true) || {}); + +var temp_displaySeconds = settings.displaySeconds; + +var data = Object.assign({ + // default values + 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() + } +}, require('Storage').readJSON(APP_NAME + ".data.json", true) || {}); + +function writeData() { + require('Storage').writeJSON(APP_NAME + ".data.json", data); +} + +function writeSettings() { + require('Storage').writeJSON(APP_NAME + ".settings.json", settings); + temp_displaySeconds = settings.temp_displaySeconds; +} + +let inMenu = false; + +Bangle.on('touch', function (zone, e) { + if (!inMenu) { + if (drawTimeout) clearTimeout(drawTimeout); + E.showMenu(menu); + inMenu = true; + } +}); + +function pad2(number) { + return (String(number).padStart(2, '0')); +} + +function formatDateTime(date, dateFormat, time24, showSeconds) { + var formattedDateTime = { + date: "", + time: "" + }; + + var DD = pad2(date.getDate()); + var MM = pad2(date.getMonth() + 1); // Month is zero-based + var YYYY = date.getFullYear(); + var h = date.getHours(); + var hh = pad2(date.getHours()); + var mm = pad2(date.getMinutes()); + var ss = pad2(date.getSeconds()); + + switch (dateFormat) { + case 0: + formattedDateTime.date = `${DD}/${MM}/${YYYY}`; + break; + + case 1: + formattedDateTime.date = `${MM}/${DD}/${YYYY}`; + break; + + case 2: + formattedDateTime.date = `${YYYY}-${MM}-${DD}`; + break; + + default: + formattedDateTime.date = `${YYYY}-${MM}-${DD}`; + break; + } + + if (time24) { + formattedDateTime.time = `${hh}:${mm}${showSeconds ? `:${ss}` : ''}`; + } else { + 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}`; + } + + return formattedDateTime; +} + +function howManyDaysInMonth(month, year) { + return new Date(year, month, 0).getDate(); +} + +function handleExceedingDay() { + var maxDays = howManyDaysInMonth(data.target.M, data.target.Y); + menu.Day.max = maxDays; + if (data.target.D > maxDays) { + menu.Day.value = maxDays; + data.target.D = maxDays; + } +} + +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", + back: function () { + E.showMenu(); + Bangle.setUI("clock"); + inMenu = false; + draw(); + } + }, + 'Day': { + value: data.target.D, + min: 1, max: 31, wrap: true, + onchange: v => { + data.target.D = v; + } + }, + 'Month': { + value: data.target.M, + min: 1, max: 12, noList: true, wrap: true, + onchange: v => { + data.target.M = v; + handleExceedingDay(); + } + }, + 'Year': { + value: data.target.Y, + min: 1900, max: 2100, + onchange: v => { + data.target.Y = v; + handleExceedingDay(); + } + }, + 'Hours': { + value: data.target.h, + min: 0, max: 23, wrap: true, + onchange: v => { + data.target.h = v; + }, + format: function (v) { return pad2(v); } + }, + 'Minutes': { + value: data.target.m, + min: 0, max: 59, wrap: true, + onchange: v => { + data.target.m = v; + }, + format: function (v) { return pad2(v); } + }, + 'Seconds': { + value: 0, + min: 0, max: 59, wrap: true, + onchange: v => { + data.target.s = v; + }, + format: function (v) { return pad2(v); } + }, + 'Save': function () { + E.showMenu(); + inMenu = false; + Bangle.setUI("clock"); + setTarget(true); + writeSettings(); + temp_displaySeconds = settings.displaySeconds; + updateQueueMillis(settings.displaySeconds); + draw(); + }, + 'Reset': function () { + E.showMenu(); + inMenu = false; + Bangle.setUI("clock"); + setTarget(false); + updateQueueMillis(settings.displaySeconds); + draw(); + } +}; + +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + var delay = queueMillis - (Date.now() % queueMillis); + if (queueMillis == 60000 && signIsNegative()) { + delay += 1000; + } + + drawTimeout = setTimeout(function () { + drawTimeout = undefined; + draw(); + }, delay); +} + +function updateQueueMillis(displaySeconds) { + if (displaySeconds) { + queueMillis = 1000; + } else { + queueMillis = 60000; + } +} + +Bangle.on('lock', function (on, reason) { + if (on) { // screen is locked + temp_displaySeconds = false; + updateQueueMillis(false); + draw(); + } else { // screen is unlocked + temp_displaySeconds = settings.displaySeconds; + updateQueueMillis(temp_displaySeconds); + draw(); + } +}); + +function signIsNegative() { + var now = new Date(); + return (now < target); +} + +function diffToTarget() { + var diff = { + sign: "+", + Y: "0", + M: "0", + D: "0", + hh: "00", + mm: "00", + ss: "00" + }; + + if (!data.target.isSet) { + return (diff); + } + + var now = new Date(); + diff.sign = now < target ? '-' : '+'; + + if (settings.displayMonthsYears) { + var start; + var end; + + if (now > target) { + start = target; + end = now; + } else { + start = now; + end = target; + } + + diff.Y = end.getFullYear() - start.getFullYear(); + diff.M = end.getMonth() - start.getMonth(); + diff.D = end.getDate() - start.getDate(); + diff.hh = end.getHours() - start.getHours(); + diff.mm = end.getMinutes() - start.getMinutes(); + diff.ss = end.getSeconds() - start.getSeconds(); + + // Adjust negative differences + if (diff.ss < 0) { + diff.ss += 60; + diff.mm--; + } + if (diff.mm < 0) { + diff.mm += 60; + diff.hh--; + } + if (diff.hh < 0) { + diff.hh += 24; + diff.D--; + } + if (diff.D < 0) { + var lastMonthDays = new Date(end.getFullYear(), end.getMonth(), 0).getDate(); + diff.D += lastMonthDays; + diff.M--; + } + if (diff.M < 0) { + diff.M += 12; + diff.Y--; + } + + + } else { + var timeDifference = target - now; + timeDifference = Math.abs(timeDifference); + + // Calculate days, hours, minutes, and seconds + diff.D = Math.floor(timeDifference / (1000 * 60 * 60 * 24)); + diff.hh = Math.floor((timeDifference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); + diff.mm = Math.floor((timeDifference % (1000 * 60 * 60)) / (1000 * 60)); + diff.ss = Math.floor((timeDifference % (1000 * 60)) / 1000); + } + + // add zero padding + diff.hh = pad2(diff.hh); + diff.mm = pad2(diff.mm); + diff.ss = pad2(diff.ss); + + return diff; +} + +function draw() { + + var nowFormatted = formatDateTime(new Date(), settings.dateFormat, settings.time24, temp_displaySeconds); + var targetFormatted = formatDateTime(target, settings.dateFormat, settings.time24, true); + var diff = diffToTarget(); + + var diffYMD; + if (settings.displayMonthsYears) + diffYMD = `${diff.sign}${diff.Y}Y ${diff.M}M ${diff.D}D`; + else + diffYMD = `${diff.sign}${diff.D}D`; + + var diff_hhmm = `${diff.hh}:${diff.mm}`; + + g.clearRect(0, 24, SCREEN_WIDTH, SCREEN_HEIGHT); + //console.log("drawing"); + + let y = 24; //Bangle.getAppRect().y; + + // draw current date + g.setFont("Vector", SMALL_FONT_SIZE).setFontAlign(-1, -1).setColor(COLOUR_BLUE); + g.drawString(nowFormatted.date, 4, y); + y += SMALL_FONT_SIZE; + + // draw current time + g.setFont("Vector", SMALL_FONT_SIZE).setFontAlign(-1, -1).setColor(COLOUR_BLUE); + g.drawString(nowFormatted.time, 4, y); + y += SMALL_FONT_SIZE; + + // draw arrow + g.setFontCustom(arrowFont, 62, 16, 13).setFontAlign(-1, -1).setColor(COLOUR_RED); + g.drawString(">", 4, y + 3); + + if (data.target.isSet) { + // draw target date + g.setFont("Vector", SMALL_FONT_SIZE).setFontAlign(-1, -1).setColor(COLOUR_RED); + g.drawString(targetFormatted.date, 4 + 16 + 6, y); + } else { + // draw NOT SET + g.setFont("Vector", SMALL_FONT_SIZE).setFontAlign(-1, -1).setColor(COLOUR_RED); + g.drawString("NOT SET", 4 + 16 + 6, y); + } + + y += SMALL_FONT_SIZE; + + // draw target time + if (data.target.isSet) { + g.setFont("Vector", SMALL_FONT_SIZE).setFontAlign(-1, -1).setColor(COLOUR_RED); + g.drawString(targetFormatted.time, 4, y); + } + y += SMALL_FONT_SIZE + 4; + + // draw separator + g.setColor(COLOUR_BLACK); + g.drawLine(0, y - 4, SCREEN_WIDTH, y - 4); + + // draw diffYMD + g.setFont("Vector", SMALL_FONT_SIZE).setFontAlign(0, -1).setColor(COLOUR_BLACK); + g.drawString(diffYMD, SCREEN_WIDTH / 2, y); + y += SMALL_FONT_SIZE; + + // draw diff_hhmm + g.setFont("Vector", BIG_FONT_SIZE).setFontAlign(0, -1).setColor(COLOUR_BLACK); + g.drawString(diff_hhmm, SCREEN_WIDTH / 2, y); + + // draw diff_ss + if (temp_displaySeconds) { + g.setFont("Vector", SMALL_FONT_SIZE).setFontAlign(-1, -1).setColor(COLOUR_GREY); + g.drawString(diff.ss, SCREEN_WIDTH / 2 + 52, y + 13); + } + + queueDraw(); +} + +Bangle.loadWidgets(); +Bangle.drawWidgets(); +Bangle.setUI("clock"); + +draw(); diff --git a/apps/elapsed_t/app.png b/apps/elapsed_t/app.png new file mode 100644 index 0000000000000000000000000000000000000000..c2cac4fa1011902362aa04d029aaf57fd86ba646 GIT binary patch literal 2264 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 A!~g&Q literal 0 HcmV?d00001 diff --git a/apps/elapsed_t/screenshot2.png b/apps/elapsed_t/screenshot2.png new file mode 100644 index 0000000000000000000000000000000000000000..e2a10ab62b2d99e0374c69b4633e7d5c987711b6 GIT binary patch literal 3323 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 back(), + 'Show\nseconds': { + value: !!settings.displaySeconds, + onchange: v => { + settings.displaySeconds = v; + writeSettings(); + } + }, + 'Show months/\nyears': { + value: !!settings.displayMonthsYears, + onchange: v => { + settings.displayMonthsYears = v; + writeSettings(); + } + }, + 'Time format': { + value: !!settings.time24, + onchange: v => { + settings.time24 = v; + writeSettings(); + }, + format: function (v) {return v ? "24h" : "AM/PM";} + }, + 'Date format': { + value: settings.dateFormat, + min: 0, max: 2, wrap: true, + onchange: v => { + settings.dateFormat = v; + writeSettings(); + }, + format: function (v) {return dateFormats[v];} + } + }); +}) From 4ee05c01c96a3577d419860da7c4453761a4f5db Mon Sep 17 00:00:00 2001 From: paul-arg Date: Sat, 23 Mar 2024 20:34:23 +0100 Subject: [PATCH 02/13] code cleanup --- apps/elapsed_t/app.js | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/apps/elapsed_t/app.js b/apps/elapsed_t/app.js index 8237ef32c..7d1df0c57 100644 --- a/apps/elapsed_t/app.js +++ b/apps/elapsed_t/app.js @@ -358,7 +358,6 @@ function diffToTarget() { } function draw() { - var nowFormatted = formatDateTime(new Date(), settings.dateFormat, settings.time24, temp_displaySeconds); var targetFormatted = formatDateTime(target, settings.dateFormat, settings.time24, true); var diff = diffToTarget(); @@ -394,21 +393,20 @@ function draw() { // draw target date g.setFont("Vector", SMALL_FONT_SIZE).setFontAlign(-1, -1).setColor(COLOUR_RED); g.drawString(targetFormatted.date, 4 + 16 + 6, y); + y += SMALL_FONT_SIZE; + + // draw target time + g.setFont("Vector", SMALL_FONT_SIZE).setFontAlign(-1, -1).setColor(COLOUR_RED); + g.drawString(targetFormatted.time, 4, y); + y += SMALL_FONT_SIZE + 4; + } else { // draw NOT SET g.setFont("Vector", SMALL_FONT_SIZE).setFontAlign(-1, -1).setColor(COLOUR_RED); g.drawString("NOT SET", 4 + 16 + 6, y); + y += 2 * SMALL_FONT_SIZE + 4; } - y += SMALL_FONT_SIZE; - - // draw target time - if (data.target.isSet) { - g.setFont("Vector", SMALL_FONT_SIZE).setFontAlign(-1, -1).setColor(COLOUR_RED); - g.drawString(targetFormatted.time, 4, y); - } - y += SMALL_FONT_SIZE + 4; - // draw separator g.setColor(COLOUR_BLACK); g.drawLine(0, y - 4, SCREEN_WIDTH, y - 4); From c99676abcc0c201e88cb7039052dba999c178695 Mon Sep 17 00:00:00 2001 From: paul-arg Date: Sat, 23 Mar 2024 20:37:27 +0100 Subject: [PATCH 03/13] fix default value for target 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 7d1df0c57..225f20c63 100644 --- a/apps/elapsed_t/app.js +++ b/apps/elapsed_t/app.js @@ -212,7 +212,7 @@ var menu = { format: function (v) { return pad2(v); } }, 'Seconds': { - value: 0, + value: data.target.s, min: 0, max: 59, wrap: true, onchange: v => { data.target.s = v; From 6ae4e76b10d0af86b11fda312e3cb22b2877ceb4 Mon Sep 17 00:00:00 2001 From: paul-arg Date: Sun, 24 Mar 2024 15:19:32 +0100 Subject: [PATCH 04/13] initial commit for Vaporwave Sunset Clock --- apps/vpw_clock/ChangeLog | 1 + apps/vpw_clock/README.md | 4 + apps/vpw_clock/app-icon.js | 1 + apps/vpw_clock/app.js | 138 ++++++++++++++++++++++++++++++++++ apps/vpw_clock/app.png | Bin 0 -> 1928 bytes apps/vpw_clock/metadata.json | 19 +++++ apps/vpw_clock/screenshot.png | Bin 0 -> 4030 bytes 7 files changed, 163 insertions(+) create mode 100644 apps/vpw_clock/ChangeLog create mode 100644 apps/vpw_clock/README.md create mode 100644 apps/vpw_clock/app-icon.js create mode 100644 apps/vpw_clock/app.js create mode 100644 apps/vpw_clock/app.png create mode 100644 apps/vpw_clock/metadata.json create mode 100644 apps/vpw_clock/screenshot.png diff --git a/apps/vpw_clock/ChangeLog b/apps/vpw_clock/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/vpw_clock/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/vpw_clock/README.md b/apps/vpw_clock/README.md new file mode 100644 index 000000000..83635d61f --- /dev/null +++ b/apps/vpw_clock/README.md @@ -0,0 +1,4 @@ +# Vaporwave Sunset Clock +This is a simple clock with a Vaporwave Sunset theme. + +![Screenshot](screenshot.png) diff --git a/apps/vpw_clock/app-icon.js b/apps/vpw_clock/app-icon.js new file mode 100644 index 000000000..f90e4e6c6 --- /dev/null +++ b/apps/vpw_clock/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwcAtu27YC/AX4C/AX4C/AVnXroRO3oDBtwRMv9p02atPTCJf7AwgRK74gBEYWmpoRJ7wGF5oRJ8wjFzoRJ+nTps0AQYRI24jGzc2CJAgEAQQREBQc1EAYCDugWDEYe/EZm+/fvAR33799ARwj/EfruIARAj/AQ88+fPARwjRA")) diff --git a/apps/vpw_clock/app.js b/apps/vpw_clock/app.js new file mode 100644 index 000000000..a9234ea9e --- /dev/null +++ b/apps/vpw_clock/app.js @@ -0,0 +1,138 @@ +Graphics.prototype.setFontMadeSunflower = function () { + // Actual height 46 (45 - 0) + return this.setFontCustom( + E.toString(require('heatshrink').decompress(atob('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'))), + 46, + atob("DxMiFyAgIiAgICEgDw=="), + 60 | 65536 + ); +}; + +var sun_img = require("heatshrink").decompress(atob("2GwwZC/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AUjdt23btuAH/MNHwQCD7CA8AQlsIGsGHwwCD2BAzgI+IAQfAIOVp22bARZAxjaAKAQdsIOGatOmARuAIF02QBgCEIFsBQBwCDQlsNQB4CC7BBsQCACDIFcDQCACDsBBqjSDUtBBq6dtmwCTIFMGQCQCD0BBognTps0AScwINEmQa2mIE8BmmTpICVwBBnQCoCCIM8NknSpoCV6BBmhKDYzRBmfyACJIMyAXQdECpMkyQCXoBBlQbVgIMkSQbVIIMkaQbVoQf6DmyVpkwCZIMqDapJB/IP5BnghB/IL0gIP5B/IP5B/IP5B/IP5B/IP5B/IP5B4gBB/ILxAjIP5B/IP4AGiRBapBB/IP5BogRBaoBB/IP4CCIEgABIP5B/AAcJILGQIM0BILGAIP5BogBBYIE8AghBWkBB/INUAIKxApgESIKlIINUCIKlAINUAIKhArgEJIKWQINkBIKWAINkAIKRAtAAJBQIF8AiRBOpBBwgBBOIGMAhJBMyBBygEEIJUgIGYABiRBIpBA1ZBLC0QxSA4AH4A/AH4A/AGA")); + +const COLOUR_BLACK = 0x0; +const COLOUR_WHITE = 0xffff; +const COLOUR_DARK_GREY = "#3F3F3F"; +const COLOUR_GREY = "#7F7F7F"; +const COLOUR_LIGHT_GREY = "#BFBFBF"; +const COLOUR_RED = "#FF0000"; +const COLOUR_BLUE = "#0000FF"; +const COLOUR_YELLOW = "#FFFF00"; +const COLOUR_LIGHT_CYAN = "#7FFFFF"; +const COLOUR_DARK_YELLOW = "#7F7F00"; +const COLOUR_DARK_CYAN = "#007F7F"; +const COLOUR_ORANGE = "#FF7F00"; +const COLOUR_VPW_GREEN = 0xf0f; +const COLOUR_MAGENTA = "#ff00ff"; + + +function drawPolygonWithGrid(x1, y1, x2, y2, x3, y3, x4, y4, M, N) { + // Draw the polygon + g.drawLine(x1, y1, x2, y2); + g.drawLine(x2, y2, x3, y3); + g.drawLine(x3, y3, x4, y4); + g.drawLine(x4, y4, x1, y1); + + for (let i = 1; i < N; i++) { + let xi1 = x1 + i * ((x2 - x1) / N); + let yi1 = y1 + i * ((y2 - y1) / N); + + let xi2 = x4 - i * ((x4 - x3) / N); + let yi2 = y4 - i * ((y4 - y3) / N); + + g.drawLine(xi1, yi1, xi2, yi2); + } + + for (let j = 1; j < M; j++) { + let xi1 = x1 + j * ((x4 - x1) / M); + let yi1 = y1 + j * ((y4 - y1) / M); + + let xi2 = x2 - j * ((x2 - x3) / M); + let yi2 = y2 - j * ((y2 - y3) / M); + + g.drawLine(xi1, yi1, xi2, yi2); + } +} + +var SCREEN_WIDTH = 176; +var SCREEN_HEIGHT = 176; +var GROUND_HEIGHT = 176 - 45; + +var GRID_BASE_OFFSET = 100; + +// timeout used to update every minute +var drawTimeout; + +// schedule a draw for the next minute +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function () { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); +} + +function draw() { + var x = g.getWidth() / 2; + var y = 24 + 20; + + g.reset().clearRect(0, 24, g.getWidth(), g.getHeight()); + + //sky + g.setColor(COLOUR_VPW_GREEN); + g.fillRect(0, 24, SCREEN_WIDTH, GROUND_HEIGHT - 1); + + g.drawImage(sun_img, 0, 0); + + //ground + g.setColor("#8000FF"); + g.fillRect(0, GROUND_HEIGHT, 176, SCREEN_HEIGHT); + + //lines + g.setColor(COLOUR_WHITE); + drawPolygonWithGrid(0, GROUND_HEIGHT, + SCREEN_WIDTH, GROUND_HEIGHT, + SCREEN_WIDTH + GRID_BASE_OFFSET, SCREEN_HEIGHT - 1, + 0 - GRID_BASE_OFFSET, SCREEN_HEIGHT - 1, + 7, //vertical + 15); //horizontal + + // work out locale-friendly date/time + var date = new Date(); + var timeStr = require("locale").time(date, 1); + var dateStr = require("locale").date(date).toUpperCase(); + var dowStr = require("locale").dow(date).toUpperCase(); + // draw time + g.setFontAlign(0, 0).setFontMadeSunflower(); + g.drawString(timeStr, x, y + 20); + // draw date + y += 35; + g.setFontAlign(0, 0, 1).setFont("6x8"); + g.drawString(dateStr, g.getWidth() - 8, g.getHeight() / 2); + // draw the day of the week + g.setFontAlign(0, 0, 3).setFont("6x8"); + g.drawString(dowStr, 8, g.getHeight() / 2); + // queue draw in one minute + queueDraw(); + // queue draw in one minute + queueDraw(); +} + +// Clear the screen once, at startup +g.setTheme({ bg: COLOUR_VPW_GREEN, fg: "#fff", dark: true }).clear(); +// draw immediately at first, queue update +draw(); +// Stop updates when LCD is off, restart when on +Bangle.on('lcdPower', on => { + if (on) { + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}); +// Show launcher when middle button pressed +Bangle.setUI("clock"); +// Load widgets +Bangle.loadWidgets(); +Bangle.drawWidgets(); diff --git a/apps/vpw_clock/app.png b/apps/vpw_clock/app.png new file mode 100644 index 0000000000000000000000000000000000000000..73c69d5a1c5283d0942ce827e7816e0c6eded7c0 GIT binary patch literal 1928 zcmV;32Y2|1P)sppOMZhk%!AJOHy<~Y&l8%kA z{DL*Wc(aYDHCGx5g8`aSh#_l`xp9uF5h{kG0%L_B(0wx(-?2#3)IiI$oa^>#0WK>B z*jcUYKA`tkUT+KlTIJDr2`HR$S(x{_ym8jR++12C8v|IG1t%sYa2p^fCD?jjnx2D3 ze{8hvkP8v8Nn%$7OWj=p3D$%*b!;@a+i1ui)x;D5p^WpLR}6sc|DFPhp_6C|dEK7G zB|}^{Ex0IhmJ&(l+&f1^UEQ2O!Z=W9!d8`Kb1E;0Lx{uf4H6h91S^usI`g-11hV%) z5PJZ%OACcM8*YymmVch%gs4#jII2u*WmZ>sV`rXjp6&sc0yeBOpckRP3>l=vN6GbV{d+<>+>3qWYosWAig7F&a zi^=BBZ+K_>6CB>Xfc4cLM5rK#;WrOGiIb0Q;^gB;5x+A>?{RH@*c8@})q1!F8L)fn z(o5puD;Kc!-6X@BVaqx z@gG0KdtZK3c?VC|q_%a@^!I^w>x&P7TRl!Z{T$eVTI1DZf=4<;;AHU~oORx(d>!1q zg!5Z(f+JNGqSO(RQ49uT)W3J%gJ)iU3)>GLK*hn8r>-)&3U%yMqlf#FyE2XExxqb& zv`>+!pReA37kX_Nme0UD-1VB2xoNzoZf$LJ*k4{`%6FkJf{Xy;m!l&{RykWWUZ8WF%cOlUjBX?$By;Bg5Y<4``)1SGz!=s zlo&7vZT;#V?!R(<0wF>G2@EtR7qvdg-iImftZ;pA4+k$^!k_yeXnhR&2#=|n04;aoqLC}-B(swZzOkm{`-ZS>TUC_t1t|x zMXIT#CTqTcqk+6d@}>-TAETx@yTfu( zl61v8;LJPBsTk=dEz~tYrISvd(gyrnUfp}`uRj(GYs=5w&3=`rDQDT<+l7Wqu;#=? z3^MTl$i1DOtYnD5%2N3uMDp&iVH6)FLruHx zDF{x^+=U`gtVAh2LYktzrbwC3a|}S1WvaVlVLcnL8Y3WfBa7~${FfE~nxFW4E_x@^ z?H_dv_}`xG6^A|ZbgLl(qV|PO9O=?p^z3o?jIz9~Y+c~dP@Yg5HIOW{W)BELAHTUp zFqYbnm9g|D=&#g9Nl|Wr@r_cp*u+$kmt+?q~_OugA(+TDsld-b? zyq)AHDBP9cg^>BC9^&+9#4HhzKW+adT|!?cxz8RgoxS=TnD zaub=)Leyl-(Ka&Q9FeJI>QZj!BX>cO_Jr(i%o`&i&zqg0sa9Al!^D64&c9&lSYfIF O0000(X-3| literal 0 HcmV?d00001 diff --git a/apps/vpw_clock/metadata.json b/apps/vpw_clock/metadata.json new file mode 100644 index 000000000..6042bdc81 --- /dev/null +++ b/apps/vpw_clock/metadata.json @@ -0,0 +1,19 @@ +{ + "id": "vpw_clock", + "name": "Vaporwave Sunset Clock", + "shortName": "Vaporwave Sunset", + "type": "clock", + "version":"0.01", + "description": "A clock with a vaporwave sunset theme.", + "tags": "clock", + "src": "vpw_clock.app.js", + "supports": ["BANGLEJS2"], + "storage": [ + {"name":"vpw_clock.app.js","url":"app.js"}, + {"name":"vpw_clock.img","url":"app-icon.js","evaluate":true} + ], + "icon": "app.png", + "readme": "README.md", + "screenshots": [{ "url": "screenshot.png" }], + "allow_emulator":true +} diff --git a/apps/vpw_clock/screenshot.png b/apps/vpw_clock/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..d0b2f1926e590e3fa051c0a4486d5485bcb1229e GIT binary patch literal 4030 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 literal 0 HcmV?d00001 From d586c824c70f778e92fe24ef46e7cbbe0e00f31f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20Arguill=C3=A8re?= Date: Sun, 24 Mar 2024 20:25:02 +0100 Subject: [PATCH 05/13] added settings to select foreground color (red, purple, white) --- apps/vpw_clock/app.js | 54 ++++++++++++++++++++++++++---------- apps/vpw_clock/metadata.json | 2 ++ apps/vpw_clock/settings.js | 28 +++++++++++++++++++ 3 files changed, 69 insertions(+), 15 deletions(-) create mode 100644 apps/vpw_clock/settings.js diff --git a/apps/vpw_clock/app.js b/apps/vpw_clock/app.js index a9234ea9e..084e220c9 100644 --- a/apps/vpw_clock/app.js +++ b/apps/vpw_clock/app.js @@ -1,15 +1,3 @@ -Graphics.prototype.setFontMadeSunflower = function () { - // Actual height 46 (45 - 0) - return this.setFontCustom( - E.toString(require('heatshrink').decompress(atob('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'))), - 46, - atob("DxMiFyAgIiAgICEgDw=="), - 60 | 65536 - ); -}; - -var sun_img = require("heatshrink").decompress(atob("2GwwZC/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AUjdt23btuAH/MNHwQCD7CA8AQlsIGsGHwwCD2BAzgI+IAQfAIOVp22bARZAxjaAKAQdsIOGatOmARuAIF02QBgCEIFsBQBwCDQlsNQB4CC7BBsQCACDIFcDQCACDsBBqjSDUtBBq6dtmwCTIFMGQCQCD0BBognTps0AScwINEmQa2mIE8BmmTpICVwBBnQCoCCIM8NknSpoCV6BBmhKDYzRBmfyACJIMyAXQdECpMkyQCXoBBlQbVgIMkSQbVIIMkaQbVoQf6DmyVpkwCZIMqDapJB/IP5BnghB/IL0gIP5B/IP5B/IP5B/IP5B/IP5B/IP5B4gBB/ILxAjIP5B/IP4AGiRBapBB/IP5BogRBaoBB/IP4CCIEgABIP5B/AAcJILGQIM0BILGAIP5BogBBYIE8AghBWkBB/INUAIKxApgESIKlIINUCIKlAINUAIKhArgEJIKWQINkBIKWAINkAIKRAtAAJBQIF8AiRBOpBBwgBBOIGMAhJBMyBBygEEIJUgIGYABiRBIpBA1ZBLC0QxSA4AH4A/AH4A/AGA")); - const COLOUR_BLACK = 0x0; const COLOUR_WHITE = 0xffff; const COLOUR_DARK_GREY = "#3F3F3F"; @@ -25,6 +13,42 @@ const COLOUR_ORANGE = "#FF7F00"; const COLOUR_VPW_GREEN = 0xf0f; const COLOUR_MAGENTA = "#ff00ff"; +var settings = Object.assign({ + // default values + foregroundColor: 0 +}, require('Storage').readJSON("vpw_clock.settings.json", true) || {}); + +var foregroundColor = COLOUR_BLACK; + +switch (settings.foregroundColor) { + case 0: + foregroundColor = COLOUR_RED; + break; + + case 1: + foregroundColor = "#8000FF"; + break; + + case 2: + foregroundColor = COLOUR_WHITE; + break; + + default: + foregroundColor = COLOUR_BLACK; // to detect problems + break; +} + +Graphics.prototype.setFontMadeSunflower = function () { + // Actual height 46 (45 - 0) + return this.setFontCustom( + E.toString(require('heatshrink').decompress(atob('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'))), + 46, + atob("DxMiFyAgIiAgICEgDw=="), + 60 | 65536 + ); +}; + +var sun_img = require("heatshrink").decompress(atob("2GwwZC/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AUjdt23btuAH/MNHwQCD7CA8AQlsIGsGHwwCD2BAzgI+IAQfAIOVp22bARZAxjaAKAQdsIOGatOmARuAIF02QBgCEIFsBQBwCDQlsNQB4CC7BBsQCACDIFcDQCACDsBBqjSDUtBBq6dtmwCTIFMGQCQCD0BBognTps0AScwINEmQa2mIE8BmmTpICVwBBnQCoCCIM8NknSpoCV6BBmhKDYzRBmfyACJIMyAXQdECpMkyQCXoBBlQbVgIMkSQbVIIMkaQbVoQf6DmyVpkwCZIMqDapJB/IP5BnghB/IL0gIP5B/IP5B/IP5B/IP5B/IP5B/IP5B4gBB/ILxAjIP5B/IP4AGiRBapBB/IP5BogRBaoBB/IP4CCIEgABIP5B/AAcJILGQIM0BILGAIP5BogBBYIE8AghBWkBB/INUAIKxApgESIKlIINUCIKlAINUAIKhArgEJIKWQINkBIKWAINkAIKRAtAAJBQIF8AiRBOpBBwgBBOIGMAhJBMyBBygEEIJUgIGYABiRBIpBA1ZBLC0QxSA4AH4A/AH4A/AGA")); function drawPolygonWithGrid(x1, y1, x2, y2, x3, y3, x4, y4, M, N) { // Draw the polygon @@ -103,7 +127,7 @@ function draw() { var dateStr = require("locale").date(date).toUpperCase(); var dowStr = require("locale").dow(date).toUpperCase(); // draw time - g.setFontAlign(0, 0).setFontMadeSunflower(); + g.setFontAlign(0, 0).setFontMadeSunflower().setColor(foregroundColor); g.drawString(timeStr, x, y + 20); // draw date y += 35; @@ -119,7 +143,7 @@ function draw() { } // Clear the screen once, at startup -g.setTheme({ bg: COLOUR_VPW_GREEN, fg: "#fff", dark: true }).clear(); +g.setTheme({ bg: COLOUR_VPW_GREEN, fg: foregroundColor, dark: true }).clear(); // draw immediately at first, queue update draw(); // Stop updates when LCD is off, restart when on @@ -135,4 +159,4 @@ Bangle.on('lcdPower', on => { Bangle.setUI("clock"); // Load widgets Bangle.loadWidgets(); -Bangle.drawWidgets(); +Bangle.drawWidgets(); \ No newline at end of file diff --git a/apps/vpw_clock/metadata.json b/apps/vpw_clock/metadata.json index 6042bdc81..49378eabd 100644 --- a/apps/vpw_clock/metadata.json +++ b/apps/vpw_clock/metadata.json @@ -10,8 +10,10 @@ "supports": ["BANGLEJS2"], "storage": [ {"name":"vpw_clock.app.js","url":"app.js"}, + {"name":"vpw_clock.settings.js","url":"settings.js"}, {"name":"vpw_clock.img","url":"app-icon.js","evaluate":true} ], + "data": [{"name":"vpw_clock.settings.json"}], "icon": "app.png", "readme": "README.md", "screenshots": [{ "url": "screenshot.png" }], diff --git a/apps/vpw_clock/settings.js b/apps/vpw_clock/settings.js new file mode 100644 index 000000000..5e267f39c --- /dev/null +++ b/apps/vpw_clock/settings.js @@ -0,0 +1,28 @@ +(function(back) { + var FILE = "vpw_clock.settings.json"; + // Load settings + var settings = Object.assign({ + foregroundColor: 0, + }, require('Storage').readJSON(FILE, true) || {}); + + function writeSettings() { + require('Storage').writeJSON(FILE, settings); + } + + var foregroundColors = ["Red", "Purple", "White"]; + + // Show the menu + E.showMenu({ + "" : { "title" : "Vaporwave Sunset" }, + "< Back" : () => back(), + 'Foreground color': { + value: 0|settings.foregroundColor, // 0| converts undefined to 0 + min: 0, max: 2, + onchange: v => { + settings.foregroundColor = v; + writeSettings(); + }, + format: function (v) {return foregroundColors[v];} + }, + }); + }) \ No newline at end of file From f01ae1c600c72b461acf85ea1b57ef6c420bc63e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20Arguill=C3=A8re?= Date: Sun, 24 Mar 2024 20:33:06 +0100 Subject: [PATCH 06/13] add screenshots --- apps/vpw_clock/README.md | 13 +++++++++++++ apps/vpw_clock/metadata.json | 2 +- apps/vpw_clock/screenshot2.png | Bin 0 -> 4190 bytes apps/vpw_clock/screenshot3.png | Bin 0 -> 4065 bytes 4 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 apps/vpw_clock/screenshot2.png create mode 100644 apps/vpw_clock/screenshot3.png diff --git a/apps/vpw_clock/README.md b/apps/vpw_clock/README.md index 83635d61f..521c08365 100644 --- a/apps/vpw_clock/README.md +++ b/apps/vpw_clock/README.md @@ -2,3 +2,16 @@ This is a simple clock with a Vaporwave Sunset theme. ![Screenshot](screenshot.png) +![Screenshot 2](screenshot2.png) +![Screenshot 3](screenshot3.png) + +# Settings + +You can select the text color: +- white +- ref +- purple + +# Todo + +- add support for AM/PM time \ No newline at end of file diff --git a/apps/vpw_clock/metadata.json b/apps/vpw_clock/metadata.json index 49378eabd..f67cc9ce1 100644 --- a/apps/vpw_clock/metadata.json +++ b/apps/vpw_clock/metadata.json @@ -16,6 +16,6 @@ "data": [{"name":"vpw_clock.settings.json"}], "icon": "app.png", "readme": "README.md", - "screenshots": [{ "url": "screenshot.png" }], + "screenshots": [{ "url": "screenshot.png" }, { "url": "screenshot2.png" }, { "url": "screenshot3.png" }], "allow_emulator":true } diff --git a/apps/vpw_clock/screenshot2.png b/apps/vpw_clock/screenshot2.png new file mode 100644 index 0000000000000000000000000000000000000000..3e4bdfd446b14198b007f1c0d39a7cb10a7e9fe0 GIT binary patch literal 4190 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 literal 0 HcmV?d00001 diff --git a/apps/vpw_clock/screenshot3.png b/apps/vpw_clock/screenshot3.png new file mode 100644 index 0000000000000000000000000000000000000000..9bd90ec01baeaac4278beef96e23712624a1bab6 GIT binary patch literal 4065 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 TC;txp00000NkvXXu0mjf^8ulb literal 0 HcmV?d00001 From e079e37dab74d6f6779e9408f2a315b6fe2a4769 Mon Sep 17 00:00:00 2001 From: paul-arg Date: Sun, 24 Mar 2024 23:34:37 +0100 Subject: [PATCH 07/13] fix double call of the draw function --- apps/vpw_clock/app.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/vpw_clock/app.js b/apps/vpw_clock/app.js index 084e220c9..b6b27ee8f 100644 --- a/apps/vpw_clock/app.js +++ b/apps/vpw_clock/app.js @@ -138,8 +138,6 @@ function draw() { g.drawString(dowStr, 8, g.getHeight() / 2); // queue draw in one minute queueDraw(); - // queue draw in one minute - queueDraw(); } // Clear the screen once, at startup From 02bf875fdaf9eabf50459f8ead0e55e5b3eb9016 Mon Sep 17 00:00:00 2001 From: paul-arg Date: Mon, 25 Mar 2024 06:15:29 +0100 Subject: [PATCH 08/13] fix.tags in metadata.json --- apps/elapsed_t/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/elapsed_t/metadata.json b/apps/elapsed_t/metadata.json index 832128955..84168adcd 100644 --- a/apps/elapsed_t/metadata.json +++ b/apps/elapsed_t/metadata.json @@ -5,7 +5,7 @@ "type": "clock", "version":"0.01", "description": "A clock that calculates the time difference between now and any given target date.", - "tags": ["clock", "tool"], + "tags": "clock, tool", "src": "elapsed_t.app.js", "supports": ["BANGLEJS2"], "storage": [ From 1cb02e1fb3bf98446b9bf347269b8de27c943639 Mon Sep 17 00:00:00 2001 From: paul-arg Date: Mon, 25 Mar 2024 07:09:59 +0100 Subject: [PATCH 09/13] Update metadata.json --- apps/elapsed_t/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/elapsed_t/metadata.json b/apps/elapsed_t/metadata.json index 84168adcd..762590a11 100644 --- a/apps/elapsed_t/metadata.json +++ b/apps/elapsed_t/metadata.json @@ -5,7 +5,7 @@ "type": "clock", "version":"0.01", "description": "A clock that calculates the time difference between now and any given target date.", - "tags": "clock, tool", + "tags": "clock,tool", "src": "elapsed_t.app.js", "supports": ["BANGLEJS2"], "storage": [ From a4ea6bfeb49b2ed4889268a125a787bca979e8a8 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 25 Mar 2024 11:02:21 +0000 Subject: [PATCH 10/13] Fix lint check - no 'src' field should be in the metadata file --- apps/vpw_clock/metadata.json | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/vpw_clock/metadata.json b/apps/vpw_clock/metadata.json index f67cc9ce1..0c2311e00 100644 --- a/apps/vpw_clock/metadata.json +++ b/apps/vpw_clock/metadata.json @@ -6,7 +6,6 @@ "version":"0.01", "description": "A clock with a vaporwave sunset theme.", "tags": "clock", - "src": "vpw_clock.app.js", "supports": ["BANGLEJS2"], "storage": [ {"name":"vpw_clock.app.js","url":"app.js"}, From 3d0ed8637ad5c9524b655a15fc47998a014603ce Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 25 Mar 2024 11:02:47 +0000 Subject: [PATCH 11/13] Fix lint check - no 'src' field should be in the metadata file --- apps/elapsed_t/metadata.json | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/elapsed_t/metadata.json b/apps/elapsed_t/metadata.json index 762590a11..0431ce1d3 100644 --- a/apps/elapsed_t/metadata.json +++ b/apps/elapsed_t/metadata.json @@ -6,7 +6,6 @@ "version":"0.01", "description": "A clock that calculates the time difference between now and any given target date.", "tags": "clock,tool", - "src": "elapsed_t.app.js", "supports": ["BANGLEJS2"], "storage": [ {"name":"elapsed_t.app.js","url":"app.js"}, From 2152dd1410fd8f158c8abeed2dd9b2b128842b3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20Arguill=C3=A8re?= Date: Mon, 25 Mar 2024 15:48:00 +0100 Subject: [PATCH 12/13] handle dark theme + add screenshot --- apps/elapsed_t/README.md | 3 ++- apps/elapsed_t/app.js | 33 +++++++++++++++++---------------- apps/elapsed_t/metadata.json | 2 +- apps/elapsed_t/screenshot2.png | Bin 3323 -> 4313 bytes apps/elapsed_t/screenshot4.png | Bin 0 -> 3323 bytes 5 files changed, 20 insertions(+), 18 deletions(-) create mode 100644 apps/elapsed_t/screenshot4.png diff --git a/apps/elapsed_t/README.md b/apps/elapsed_t/README.md index b085cd70f..f0c72a607 100644 --- a/apps/elapsed_t/README.md +++ b/apps/elapsed_t/README.md @@ -1,5 +1,5 @@ # Elapsed Time Clock -A clock that calculates the time difference between now (in blue) and any given target date (in red). +A clock that calculates the time difference between now (in blue/cyan) and any given target date (in red/orange). The results is show in years, months, days, hours, minutes, seconds. To save battery life, the seconds are shown only when the watch is unlocked, or can be disabled entirely. @@ -8,6 +8,7 @@ The time difference is positive if the target date is in the past and negative i ![Screenshot 1](screenshot1.png) ![Screenshot 2](screenshot2.png) ![Screenshot 3](screenshot3.png) +![Screenshot 4](screenshot4.png) # Settings ## Time and date formats: diff --git a/apps/elapsed_t/app.js b/apps/elapsed_t/app.js index 225f20c63..f799c4f4c 100644 --- a/apps/elapsed_t/app.js +++ b/apps/elapsed_t/app.js @@ -1,15 +1,16 @@ const APP_NAME = "elapsed_t"; -const COLOUR_BLACK = 0x0; -const COLOUR_DARK_GREY = 0x4208; // same as: g.setColor(0.25, 0.25, 0.25) +//const COLOUR_BLACK = 0x0; +//const COLOUR_DARK_GREY = 0x4208; // same as: g.setColor(0.25, 0.25, 0.25) const COLOUR_GREY = 0x8410; // same as: g.setColor(0.5, 0.5, 0.5) const COLOUR_LIGHT_GREY = 0xc618; // same as: g.setColor(0.75, 0.75, 0.75) const COLOUR_RED = 0xf800; // same as: g.setColor(1, 0, 0) const COLOUR_BLUE = 0x001f; // same as: g.setColor(0, 0, 1) -const COLOUR_YELLOW = 0xffe0; // same as: g.setColor(1, 1, 0) -const COLOUR_LIGHT_CYAN = 0x87ff; // same as: g.setColor(0.5, 1, 1) -const COLOUR_DARK_YELLOW = 0x8400; // same as: g.setColor(0.5, 0.5, 0) -const COLOUR_DARK_CYAN = 0x0410; // same as: g.setColor(0, 0.5, 0.5) +//const COLOUR_YELLOW = 0xffe0; // same as: g.setColor(1, 1, 0) +//const COLOUR_LIGHT_CYAN = 0x87ff; // same as: g.setColor(0.5, 1, 1) +//const COLOUR_DARK_YELLOW = 0x8400; // same as: g.setColor(0.5, 0.5, 0) +//const COLOUR_DARK_CYAN = 0x0410; // same as: g.setColor(0, 0.5, 0.5) +const COLOUR_CYAN = "#00FFFF"; const COLOUR_ORANGE = 0xfc00; // same as: g.setColor(1, 0.5, 0) const SCREEN_WIDTH = g.getWidth(); @@ -376,53 +377,53 @@ function draw() { let y = 24; //Bangle.getAppRect().y; // draw current date - g.setFont("Vector", SMALL_FONT_SIZE).setFontAlign(-1, -1).setColor(COLOUR_BLUE); + g.setFont("Vector", SMALL_FONT_SIZE).setFontAlign(-1, -1).setColor(g.theme.dark ? COLOUR_CYAN : COLOUR_BLUE); g.drawString(nowFormatted.date, 4, y); y += SMALL_FONT_SIZE; // draw current time - g.setFont("Vector", SMALL_FONT_SIZE).setFontAlign(-1, -1).setColor(COLOUR_BLUE); + g.setFont("Vector", SMALL_FONT_SIZE).setFontAlign(-1, -1).setColor(g.theme.dark ? COLOUR_CYAN : COLOUR_BLUE); g.drawString(nowFormatted.time, 4, y); y += SMALL_FONT_SIZE; // draw arrow - g.setFontCustom(arrowFont, 62, 16, 13).setFontAlign(-1, -1).setColor(COLOUR_RED); + g.setFontCustom(arrowFont, 62, 16, 13).setFontAlign(-1, -1).setColor(g.theme.dark ? COLOUR_ORANGE : COLOUR_RED); g.drawString(">", 4, y + 3); if (data.target.isSet) { // draw target date - g.setFont("Vector", SMALL_FONT_SIZE).setFontAlign(-1, -1).setColor(COLOUR_RED); + 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); y += SMALL_FONT_SIZE; // draw target time - g.setFont("Vector", SMALL_FONT_SIZE).setFontAlign(-1, -1).setColor(COLOUR_RED); + g.setFont("Vector", SMALL_FONT_SIZE).setFontAlign(-1, -1).setColor(g.theme.dark ? COLOUR_ORANGE : COLOUR_RED); g.drawString(targetFormatted.time, 4, y); y += SMALL_FONT_SIZE + 4; } else { // draw NOT SET - g.setFont("Vector", SMALL_FONT_SIZE).setFontAlign(-1, -1).setColor(COLOUR_RED); + g.setFont("Vector", SMALL_FONT_SIZE).setFontAlign(-1, -1).setColor(g.theme.dark ? COLOUR_ORANGE : COLOUR_RED); g.drawString("NOT SET", 4 + 16 + 6, y); y += 2 * SMALL_FONT_SIZE + 4; } // draw separator - g.setColor(COLOUR_BLACK); + g.setColor(g.theme.fg); g.drawLine(0, y - 4, SCREEN_WIDTH, y - 4); // draw diffYMD - g.setFont("Vector", SMALL_FONT_SIZE).setFontAlign(0, -1).setColor(COLOUR_BLACK); + g.setFont("Vector", SMALL_FONT_SIZE).setFontAlign(0, -1).setColor(g.theme.fg); g.drawString(diffYMD, SCREEN_WIDTH / 2, y); y += SMALL_FONT_SIZE; // draw diff_hhmm - g.setFont("Vector", BIG_FONT_SIZE).setFontAlign(0, -1).setColor(COLOUR_BLACK); + g.setFont("Vector", BIG_FONT_SIZE).setFontAlign(0, -1).setColor(g.theme.fg); g.drawString(diff_hhmm, SCREEN_WIDTH / 2, y); // draw diff_ss if (temp_displaySeconds) { - g.setFont("Vector", SMALL_FONT_SIZE).setFontAlign(-1, -1).setColor(COLOUR_GREY); + g.setFont("Vector", SMALL_FONT_SIZE).setFontAlign(-1, -1).setColor(g.theme.dark ? COLOUR_LIGHT_GREY : COLOUR_GREY); g.drawString(diff.ss, SCREEN_WIDTH / 2 + 52, y + 13); } diff --git a/apps/elapsed_t/metadata.json b/apps/elapsed_t/metadata.json index 0431ce1d3..fe9af630f 100644 --- a/apps/elapsed_t/metadata.json +++ b/apps/elapsed_t/metadata.json @@ -15,6 +15,6 @@ "data": [{"name":"elapsed_t.data.json"}], "icon": "app.png", "readme": "README.md", - "screenshots": [{ "url": "screenshot1.png" }, { "url": "screenshot2.png" }, { "url": "screenshot3.png" }], + "screenshots": [{ "url": "screenshot1.png" }, { "url": "screenshot2.png" }, { "url": "screenshot3.png" }, { "url": "screenshot4.png" }], "allow_emulator":true } diff --git a/apps/elapsed_t/screenshot2.png b/apps/elapsed_t/screenshot2.png index e2a10ab62b2d99e0374c69b4633e7d5c987711b6..67dd4f186dfa32dde31a2a1b4be69d457b45a80d 100644 GIT binary patch delta 4305 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 literal 3323 zcmd57Cfr7SOHmwn&9`Of$K|NZ;j=REgyo^ze&e$Khib*}r|i5D;61mP#(000P{ zv$1mEV&%UNFN~WRwLb`40FfPV7C=QOY6buVnCGm_uTTgJxx*RqN&% z5(NHwbj&|mR|Y8CK!yDRV$|ggg23J0`MUA z1@ai{e5U>1{6wwFYA~2GvvQgOQiEkUngJSaCOjI{Hr7`-@7Rm>qA{LIalA7K)EKgj zXaqzd=T&8?nP>9j#8{rh8$8gZuRkv@f$;+WqxhC0aImxEQapH=)b?A|FRCe2-}&Km zV@`3I2B*SR-Z0<=9v#eHN_%@F2N;c47h}F5h7eS>u+`H!-C?S2Iq6XF$8NaRW-FdYy7kj z|7GiO7528Z!Jo?`C>OWLp`$3IVTAN$aqsx|5f36dXcc7l=AV#l?1ZsFMiZSRrx*VI zAN9MnsvErT5xrg_$nQp7q{aHTW=-9cYH8i(Ze}=OO?Cq!gr~#SD(7U4bO>{Q-uXN0 zgF*v#t&Fxu59;zU?~r>X3a-5K46Gk~UyN0!lU%`jLT4myWoL0(FEL8%{a|Vp705h^ zcAG)oM2z{FV-hM;t@Dn~CnC!SzaqURehA3&SAmQJi7bl*nmnxLH7DXdmZVhzn6d4nJY_Ku`<9< zu#fZTO7de6yUKotH(<;|986eUSbXAfmAS@=yk&bZTU6%8J21*gs4sgxac?cT`8Kg@ z;$A|+aw0rIdhQW98v^$2g#aV=!%_T~ESaCZq@%fk0<=&&HD5n{a{u`eV zf{vpPy&!cu>~uSx(W;zdM5B)ik3e?ac6`{%zp2Kjd#+#gaGRq+8Y@DQB4J$R30%D> z;K2h8#2eZ@GY5e%mPmvp9>g2C)~0C4$T-(~EkxR(XVv`v&j)W~te2l*e(hY^^I(S{W7hWjE4RBs|S<*~)hb>d=yMv(?9Sr9D+~@>~%Zfhk^QZ5yqu5ckQF z-j(<~1!b|6L&rbifj@i|c#rB3z^FtJvQNZv&UQaZwOuIb+5|qf+J*N@FGoLTla#5r zAJl9kz%=Nl6s`tJbTMrpb0=Z1WuO4x|2|#%FRit z!5b@LGW(x)O2u^*78~jCtZH|qYenCj>Pil??cXpf$*isVW(OQGQT71& zEWFR41T2;S?havu=Qpi8r=J(!GOkrn%PNyfx;o*{GbVu_KNp+LbtLpPT$MQwRP%`q z49&F}--=YvcsMUnIZeRFam;`^crAEiyqDbP;YQQ!^EmTInoPjK$5B$_?eur-a<}IZ zlXjjB(k!-=X~bJ8%=_0|PjtxDr&YUK!KJ2b0~@xNYh!V`Nb|yp{*$7l#B+ z_BUgZ2D4`k88F+Ij6bMrXG9=d%p|dK&P4S(FH@SP#$tZaAd9x@Qe*zPO5)nu@ga1MxTxMT{ZFBjlOFJ zE*v`vjLNJl0pH1&Pf`!%mdHS+)T|2o0=J*9KPZ)w(8J%}@GVnmIlWdB%bEI%4_xPh z91k|7K%H+qSL4V(j>jQOrbOfFsWIb{Q{_cKsX0xmp#WFbJwbj|Uv+doK`hoGqE*{8 z&oW?S^Y!iXTlTk4gPy%Y?g6;54p?2Nw6`7zY_j^y&tKqt3tKRKMwO>FQYi|EfTy;4 z>)o5WcQ-|_t&eUX62Q45m-qddagIXQIs_$11+|fSk`fZcj3o-|39HaRMqJ=QIN%aU zVU=$uvi}giW>Qt%IVrHllz(EVd6{p}Cbk|ysep8)*A@<1aR<&hIeR-xAm4f0Zbg*! z6tU8)16?XfA5{qW|DYBb{fCtyk6oX=`w z?CYng&A-POZGPKwX(}5o9g%jqC&ZB<-6@}8${Pn>0d|qe!?BHiQEVOIVbM1_O21x(wbqQ)X4^Fb6 zb}Rd#cWcrtRnH6RK)xKk>8N?^xbUN>AdkJ?TUlYZoIm#S0W^xl%XL#hA{3?Sx_F9| ztLj2qk8thIix2kIb0PWv_*SY)I{bJ%E{acC#?%I(Lx@*{+-(p-K=|9P*Q&5K&!C2h zYSo9+hgL@pbXd~~nkQX-jzl9Hp;G%13X^3W9Os4_KKY>VNmO?%F0Wg=pbjESHAt2L zZ7s~o&xq(kX;YWFKCSrB;gmNZkPX7J*Z59M>1 zM2^Q-GZUyLy>Mdp$fdtY9Y^j;I(0wfeM4uRO7yOkNF$TpR)GL)6PkuS!B*k_vf(3Jwt_?2Z zysqmh{bfD5r49I=Qg`1~mZff%{7lQ{9g}Zwvi}OEAud8sYv^@ICj@J80CT1WhGC)P|mZD=icFZhWEHH zP`Dvm{y-~Amr@9QA8jou)#7((n@ab839Z9zWfF_|X&YS#{}2H#X<*{<8o^?ZDiGfU zmex5PWWP&E^{9?H^+D;@OUQuyp5nu)j_~T3mwt3F@rC?P%cq|z0$5yJCSI+z%*}~9 z-RLYwZyE?I8~%vmS+WCx_FM!+Z8;YJp#dLyo6JIfn)iRdxlWgd29eT+_puPYp~K68 z+H<@_&|b?qL?o>Gk{%cj+yU*y9qjbr*$tofCzZ7q7rvW(3m7kSqvn1XvUU#?KTNjk zT4?h-ROi*mx>T!P;5&6y_c&|ou~Ba9X!i~C`^4lCOtUo`4>(q~x z3X+P@n%{y^p~sg=WWxDZ?iX=Wmb92ted**YM^35CpALjpbRQ%lW*FF-R8+a(&T8l{ zO6Jl{@wayOJ6&d_2UNr%FtU1|3jSV9C^4LIp1%H;!k zj^A)PTKx9(3B#T!VP9kLxs87qk9ag4g>_?JiO@SE8FNy>p#;_O8=zEbvK8ak*k`9I zMbU|TV~g+oOCg@8V3VN*XL0-%H9a+Ypb7Cfr7SOHmwn&9`Of$K|NZ;j=REgyo^ze&e$Khib*}r|i5D;61mP#(000P{ zv$1mEV&%UNFN~WRwLb`40FfPV7C=QOY6buVnCGm_uTTgJxx*RqN&% z5(NHwbj&|mR|Y8CK!yDRV$|ggg23J0`MUA z1@ai{e5U>1{6wwFYA~2GvvQgOQiEkUngJSaCOjI{Hr7`-@7Rm>qA{LIalA7K)EKgj zXaqzd=T&8?nP>9j#8{rh8$8gZuRkv@f$;+WqxhC0aImxEQapH=)b?A|FRCe2-}&Km zV@`3I2B*SR-Z0<=9v#eHN_%@F2N;c47h}F5h7eS>u+`H!-C?S2Iq6XF$8NaRW-FdYy7kj z|7GiO7528Z!Jo?`C>OWLp`$3IVTAN$aqsx|5f36dXcc7l=AV#l?1ZsFMiZSRrx*VI zAN9MnsvErT5xrg_$nQp7q{aHTW=-9cYH8i(Ze}=OO?Cq!gr~#SD(7U4bO>{Q-uXN0 zgF*v#t&Fxu59;zU?~r>X3a-5K46Gk~UyN0!lU%`jLT4myWoL0(FEL8%{a|Vp705h^ zcAG)oM2z{FV-hM;t@Dn~CnC!SzaqURehA3&SAmQJi7bl*nmnxLH7DXdmZVhzn6d4nJY_Ku`<9< zu#fZTO7de6yUKotH(<;|986eUSbXAfmAS@=yk&bZTU6%8J21*gs4sgxac?cT`8Kg@ z;$A|+aw0rIdhQW98v^$2g#aV=!%_T~ESaCZq@%fk0<=&&HD5n{a{u`eV zf{vpPy&!cu>~uSx(W;zdM5B)ik3e?ac6`{%zp2Kjd#+#gaGRq+8Y@DQB4J$R30%D> z;K2h8#2eZ@GY5e%mPmvp9>g2C)~0C4$T-(~EkxR(XVv`v&j)W~te2l*e(hY^^I(S{W7hWjE4RBs|S<*~)hb>d=yMv(?9Sr9D+~@>~%Zfhk^QZ5yqu5ckQF z-j(<~1!b|6L&rbifj@i|c#rB3z^FtJvQNZv&UQaZwOuIb+5|qf+J*N@FGoLTla#5r zAJl9kz%=Nl6s`tJbTMrpb0=Z1WuO4x|2|#%FRit z!5b@LGW(x)O2u^*78~jCtZH|qYenCj>Pil??cXpf$*isVW(OQGQT71& zEWFR41T2;S?havu=Qpi8r=J(!GOkrn%PNyfx;o*{GbVu_KNp+LbtLpPT$MQwRP%`q z49&F}--=YvcsMUnIZeRFam;`^crAEiyqDbP;YQQ!^EmTInoPjK$5B$_?eur-a<}IZ zlXjjB(k!-=X~bJ8%=_0|PjtxDr&YUK!KJ2b0~@xNYh!V`Nb|yp{*$7l#B+ z_BUgZ2D4`k88F+Ij6bMrXG9=d%p|dK&P4S(FH@SP#$tZaAd9x@Qe*zPO5)nu@ga1MxTxMT{ZFBjlOFJ zE*v`vjLNJl0pH1&Pf`!%mdHS+)T|2o0=J*9KPZ)w(8J%}@GVnmIlWdB%bEI%4_xPh z91k|7K%H+qSL4V(j>jQOrbOfFsWIb{Q{_cKsX0xmp#WFbJwbj|Uv+doK`hoGqE*{8 z&oW?S^Y!iXTlTk4gPy%Y?g6;54p?2Nw6`7zY_j^y&tKqt3tKRKMwO>FQYi|EfTy;4 z>)o5WcQ-|_t&eUX62Q45m-qddagIXQIs_$11+|fSk`fZcj3o-|39HaRMqJ=QIN%aU zVU=$uvi}giW>Qt%IVrHllz(EVd6{p}Cbk|ysep8)*A@<1aR<&hIeR-xAm4f0Zbg*! z6tU8)16?XfA5{qW|DYBb{fCtyk6oX=`w z?CYng&A-POZGPKwX(}5o9g%jqC&ZB<-6@}8${Pn>0d|qe!?BHiQEVOIVbM1_O21x(wbqQ)X4^Fb6 zb}Rd#cWcrtRnH6RK)xKk>8N?^xbUN>AdkJ?TUlYZoIm#S0W^xl%XL#hA{3?Sx_F9| ztLj2qk8thIix2kIb0PWv_*SY)I{bJ%E{acC#?%I(Lx@*{+-(p-K=|9P*Q&5K&!C2h zYSo9+hgL@pbXd~~nkQX-jzl9Hp;G%13X^3W9Os4_KKY>VNmO?%F0Wg=pbjESHAt2L zZ7s~o&xq(kX;YWFKCSrB;gmNZkPX7J*Z59M>1 zM2^Q-GZUyLy>Mdp$fdtY9Y^j;I(0wfeM4uRO7yOkNF$TpR)GL)6PkuS!B*k_vf(3Jwt_?2Z zysqmh{bfD5r49I=Qg`1~mZff%{7lQ{9g}Zwvi}OEAud8sYv^@ICj@J80CT1WhGC)P|mZD=icFZhWEHH zP`Dvm{y-~Amr@9QA8jou)#7((n@ab839Z9zWfF_|X&YS#{}2H#X<*{<8o^?ZDiGfU zmex5PWWP&E^{9?H^+D;@OUQuyp5nu)j_~T3mwt3F@rC?P%cq|z0$5yJCSI+z%*}~9 z-RLYwZyE?I8~%vmS+WCx_FM!+Z8;YJp#dLyo6JIfn)iRdxlWgd29eT+_puPYp~K68 z+H<@_&|b?qL?o>Gk{%cj+yU*y9qjbr*$tofCzZ7q7rvW(3m7kSqvn1XvUU#?KTNjk zT4?h-ROi*mx>T!P;5&6y_c&|ou~Ba9X!i~C`^4lCOtUo`4>(q~x z3X+P@n%{y^p~sg=WWxDZ?iX=Wmb92ted**YM^35CpALjpbRQ%lW*FF-R8+a(&T8l{ zO6Jl{@wayOJ6&d_2UNr%FtU1|3jSV9C^4LIp1%H;!k zj^A)PTKx9(3B#T!VP9kLxs87qk9ag4g>_?JiO@SE8FNy>p#;_O8=zEbvK8ak*k`9I zMbU|TV~g+oOCg@8V3VN*XL0-%H9a+Ypb Date: Mon, 25 Mar 2024 16:04:05 +0100 Subject: [PATCH 13/13] commented out unused colors --- apps/vpw_clock/app.js | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/apps/vpw_clock/app.js b/apps/vpw_clock/app.js index b6b27ee8f..41e44ec10 100644 --- a/apps/vpw_clock/app.js +++ b/apps/vpw_clock/app.js @@ -1,17 +1,18 @@ const COLOUR_BLACK = 0x0; const COLOUR_WHITE = 0xffff; -const COLOUR_DARK_GREY = "#3F3F3F"; -const COLOUR_GREY = "#7F7F7F"; -const COLOUR_LIGHT_GREY = "#BFBFBF"; +//const COLOUR_DARK_GREY = "#3F3F3F"; +//const COLOUR_GREY = "#7F7F7F"; +//const COLOUR_LIGHT_GREY = "#BFBFBF"; const COLOUR_RED = "#FF0000"; -const COLOUR_BLUE = "#0000FF"; -const COLOUR_YELLOW = "#FFFF00"; -const COLOUR_LIGHT_CYAN = "#7FFFFF"; -const COLOUR_DARK_YELLOW = "#7F7F00"; -const COLOUR_DARK_CYAN = "#007F7F"; -const COLOUR_ORANGE = "#FF7F00"; +//const COLOUR_BLUE = "#0000FF"; +//const COLOUR_YELLOW = "#FFFF00"; +//const COLOUR_LIGHT_CYAN = "#7FFFFF"; +//const COLOUR_DARK_YELLOW = "#7F7F00"; +//const COLOUR_DARK_CYAN = "#007F7F"; +//const COLOUR_ORANGE = "#FF7F00"; const COLOUR_VPW_GREEN = 0xf0f; -const COLOUR_MAGENTA = "#ff00ff"; +//const COLOUR_MAGENTA = "#ff00ff"; +const COLOUR_PURPLE = "#8000FF"; var settings = Object.assign({ // default values @@ -26,7 +27,7 @@ switch (settings.foregroundColor) { break; case 1: - foregroundColor = "#8000FF"; + foregroundColor = COLOUR_PURPLE; break; case 2: