From 81c429d1a52776bd0cfd253d7b09af2240f94c8d Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 19 Apr 2024 15:28:51 +0100 Subject: [PATCH] Added analog clock with 4 clockinfo widgets and a configurable background --- apps/analogquadclk/ChangeLog | 1 + apps/analogquadclk/app-icon.js | 1 + apps/analogquadclk/app.js | 242 +++++++++++++++++++++++++++++ apps/analogquadclk/icon.png | Bin 0 -> 12013 bytes apps/analogquadclk/metadata.json | 16 ++ apps/analogquadclk/screenshot.png | Bin 0 -> 7128 bytes apps/analogquadclk/screenshot2.png | Bin 0 -> 2906 bytes 7 files changed, 260 insertions(+) create mode 100644 apps/analogquadclk/ChangeLog create mode 100644 apps/analogquadclk/app-icon.js create mode 100644 apps/analogquadclk/app.js create mode 100644 apps/analogquadclk/icon.png create mode 100644 apps/analogquadclk/metadata.json create mode 100644 apps/analogquadclk/screenshot.png create mode 100644 apps/analogquadclk/screenshot2.png diff --git a/apps/analogquadclk/ChangeLog b/apps/analogquadclk/ChangeLog new file mode 100644 index 000000000..09953593e --- /dev/null +++ b/apps/analogquadclk/ChangeLog @@ -0,0 +1 @@ +0.01: New Clock! diff --git a/apps/analogquadclk/app-icon.js b/apps/analogquadclk/app-icon.js new file mode 100644 index 000000000..8eedcb6cb --- /dev/null +++ b/apps/analogquadclk/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEw4X//8HA4IEBgH4C5cFqgJHitQjWpBY9q0gLvI5ar/AAkgBRMC1ALJlX6CxOrBZMq34LJ1f/9QKHhW//2gCxP6wAWHy/+KREqq4WIgGtr+qLhG1vw5IgX1KBALBywWIIwNaHJEAlNqUZOltAuJyouKqwuKrQuhywuJNIIuJlIuJHQLGIBYQ6IgtU1Q6GitQjWplQVGtWkBYIhHBcpHBBY5HBM5IABA")) \ No newline at end of file diff --git a/apps/analogquadclk/app.js b/apps/analogquadclk/app.js new file mode 100644 index 000000000..20da83280 --- /dev/null +++ b/apps/analogquadclk/app.js @@ -0,0 +1,242 @@ +const W = g.getWidth(); +const H = g.getHeight(); +const background = require("clockbg"); // image backgrounds +let drawTimeout; // timeout used to update every minute +let date = new Date(); // date at last draw +let lastModified = {x1:0,y1:0,x2:W-1,y2:H-1,first:true}; // rect that was covered by hands + +const HOUR_LEN = 55; // how far forwards does hand go? +const MIN_LEN = 72; +const HOUR_BACK = 10; // how far backwards dows hand go? +const MIN_BACK = 10; +const HOUR_W = 10; // width of cleared area +const MIN_W = 8; + +function get_hand(len, w, cornerw, overhang) { + return new Int8Array([ + 0, overhang+w, + -cornerw, overhang+cornerw, + -w, overhang, + -w, -len, + -cornerw, -len - cornerw, + 0, -len - w, + cornerw, -len - cornerw, + w, -len, + w, overhang, + cornerw, overhang+cornerw + ]); +} +const hand_hour = get_hand(HOUR_LEN, 6, 4, HOUR_BACK); +const hand_hour_bg = get_hand(HOUR_LEN, HOUR_W, 8, HOUR_BACK); +const hand_minute = get_hand(MIN_LEN, 4, 3, MIN_BACK); +const hand_minute_bg = get_hand(MIN_LEN, MIN_W, 6, MIN_BACK); + + +// schedule a draw for the next minute +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); +} + +// draw the clock hands +function drawHands() { + let h = date.getHours()*Math.PI/6, m = date.getMinutes()*Math.PI/30; + g.setColor(g.theme.bg).fillPolyAA(g.transformVertices(hand_hour_bg,{x:W/2,y:H/2,rotate:h})); + g.fillPolyAA(g.transformVertices(hand_minute_bg,{x:W/2,y:H/2,rotate:m})); + g.setColor("#f00").fillPolyAA(g.transformVertices(hand_hour,{x:W/2,y:H/2,rotate:h})); + g.setColor(g.theme.fg).fillPolyAA(g.transformVertices(hand_minute,{x:W/2,y:H/2,rotate:m})); +} + +// return the screen area covered by clock hands (used for filling in background) +function getHandBounds() { + let h = date.getHours()*Math.PI/6, m = date.getMinutes()*Math.PI/30; + let sh = Math.sin(h), ch = Math.cos(h), sm = Math.sin(m), cm = Math.cos(m); + return { + x1 : Math.round((W/2)+Math.min(sh*HOUR_LEN, sm*MIN_LEN, -sh*HOUR_BACK, -sm*MIN_BACK)-HOUR_W), + y1 : Math.round((H/2)-Math.max(ch*HOUR_LEN, cm*MIN_LEN, -ch*HOUR_BACK, -cm*MIN_BACK)-HOUR_W), + x2 : Math.round((W/2)+Math.max(sh*HOUR_LEN, sm*MIN_LEN, -sh*HOUR_BACK, -sm*MIN_BACK)+HOUR_W), + y2 : Math.round((H/2)-Math.min(ch*HOUR_LEN, cm*MIN_LEN, -ch*HOUR_BACK, -cm*MIN_BACK)+HOUR_W), + }; +} + +function draw() { + // queue next draw in one minute + queueDraw(); + // work out locale-friendly date/time + date = new Date(); + //var timeStr = require("locale").time(date,1); + //var dateStr = require("locale").date(date); + // fill in area that we changed last time + background.fillRect(lastModified.x1, lastModified.y1, lastModified.x2, lastModified.y2); + if (!lastModified.first) { // first draw we don't have clockInfoMenuA/etc defined + if (lastModified.y1<30) { + if (lastModified.x1 < 30) clockInfoMenuA.redraw(); + if (lastModified.x2 > W-30) clockInfoMenuB.redraw(); + } + if (lastModified.y2>W-20) { + if (lastModified.x1 < 30) clockInfoMenuD.redraw(); + if (lastModified.x2 > W-30) clockInfoMenuC.redraw(); + } + } + // draw hands + drawHands(); + lastModified = getHandBounds(); + //g.drawRect(lastModified); // debug +} + +// Clear the screen once, at startup +background.fillRect(0, 0, W - 1, H - 1); +// draw immediately at first, queue update +draw(); + +// used for clockinfo image rendering +let clockInfoG = Graphics.createArrayBuffer(28, 28, 2, {msb:true}); +clockInfoG.transparent = 3; +// render clockinfos +let clockInfoDraw = function(itm, info, options) { + // itm: the item containing name/hasRange/etc + // info: data returned from itm.get() containing text/img/etc + // options: options passed into addInteractive + const left = options.x < 88, + top = options.y < 88, + imgx = left ? 1 : W - 28, imgy = top ? 19 : H - 42, + textx = left ? 2 : W - 1, texty = top ? 2 : H - 16; + let bg = g.theme.bg, fg = g.theme.fg; + // Clear the background + g.reset(); + background.fillRect(imgx, imgy, imgx+25, imgy+25); // erase image + background.fillRect(left?0:W/2, texty-1, left?W/2:W-1, texty+15); // erase text + // indicate focus - change colours + if (options.focus) { + bg = g.theme.fg; + fg = g.toColor("#f00"); + } + + if (info.img) { + //g.drawImage(info.img, left ? 2 : W - 27, top ? 18 : H - 41); // draw the image + // fiddle around colouring the border and inside of the image + clockInfoG.clear(1); + // do a border - images need to be transparent for this + clockInfoG.setColor(2).drawImage(info.img, 1,1).drawImage(info.img, 3,1). + drawImage(info.img, 1,3).drawImage(info.img, 3,3); + clockInfoG.setColor(1).drawImage(info.img, 2,2); // main image + clockInfoG.floodFill(27,27,3); // flood fill edge to transparent + clockInfoG.palette = new Uint16Array([bg,fg,bg/*border*/, g.toColor("#888")]); + g.drawImage(clockInfoG, imgx-1, imgy-1); + } + + g.setFont("6x8:2").setFontAlign(left ? -1 : 1, -1); + g.setColor(bg).drawString(info.text, textx-2, texty). // draw the text background + drawString(info.text, textx+2, texty). + drawString(info.text, textx, texty-2). + drawString(info.text, textx, texty+2); + g.setColor(fg).drawString(info.text, textx, texty); // draw the text + // redraw hands if needed + if ((top && lastModified.x1=texty)) { + g.reset(); + drawHands(); + } +}; + +// Load the clock infos +let clockInfoItems = require("clock_info").load(); +let clockInfoItemsBangle = clockInfoItems.find(i=>i.name=="Bangle"); +// Add extra Calendar and digital clock ClockInfos +if (clockInfoItemsBangle) { + if (!clockInfoItemsBangle.items.find(i=>i.name=="Date")) { + clockInfoItemsBangle.items.push({ name : "Date", + get : () => { + let d = new Date(); + let g = Graphics.createArrayBuffer(24,24,1,{msb:true}); + g.drawImage(atob("FhgBDADAMAMP/////////////////////8AADwAAPAAA8AADwAAPAAA8AADwAAPAAA8AADwAAPAAA8AADwAAP///////"),1,0); + g.setFont("6x15").setFontAlign(0,0).drawString(d.getDate(),11,17); + return { + text : require("locale").dow(d,1).toUpperCase(), + img : g.asImage("string") + }; + }, + show : function() { + this.interval = setTimeout(()=>{ + this.emit("redraw"); + this.interval = setInterval(()=>{ + this.emit("redraw"); + }, 86400000); + }, 86400000 - (Date.now() % 86400000)); + }, + hide : function() { + clearInterval(this.interval); + this.interval = undefined; + } + }); + } + if (!clockInfoItemsBangle.items.find(i=>i.name=="Clock")) { + clockInfoItemsBangle.items.push({ name : "Clock", + get : () => { + return { + text : require("locale").time(new Date(),1), + img : atob("GBiBAAAAAAB+AAD/AAD/AAH/gAP/wAP/wAYAYAYAYAYAYAYAYAYAcAYAcAYAYAYAYAYAYAYAYAP/wAP/wAH/gAD/AAD/AAB+AAAAAA==") + }; + }, + show : function() { + this.interval = setTimeout(()=>{ + this.emit("redraw"); + this.interval = setInterval(()=>{ + this.emit("redraw"); + }, 60000); + }, 60000 - (Date.now() % 60000)); + }, + hide : function() { + clearInterval(this.interval); + this.interval = undefined; + } + }); + } +} + + +// Add the 4 clockinfos +const CLOCKINFOSIZE = 50; +let clockInfoMenuA = require("clock_info").addInteractive(clockInfoItems, { + x: 0, + y: 0, + w: CLOCKINFOSIZE, + h: CLOCKINFOSIZE, + draw: clockInfoDraw +}); +let clockInfoMenuB = require("clock_info").addInteractive(clockInfoItems, { + x: W - CLOCKINFOSIZE, + y: 0, + w: CLOCKINFOSIZE, + h: CLOCKINFOSIZE, + draw: clockInfoDraw +}); +let clockInfoMenuC = require("clock_info").addInteractive(clockInfoItems, { + x: W - CLOCKINFOSIZE, + y: H - CLOCKINFOSIZE, + w: CLOCKINFOSIZE, + h: CLOCKINFOSIZE, + draw: clockInfoDraw +}); +let clockInfoMenuD = require("clock_info").addInteractive(clockInfoItems, { + x: 0, + y: H - CLOCKINFOSIZE, + w: CLOCKINFOSIZE, + h: CLOCKINFOSIZE, + draw: clockInfoDraw +}); + +// Show launcher when middle button pressed +Bangle.setUI({ + mode: "clock", + remove: function() { + if (drawTimeout) clearTimeout(drawTimeout); + clockInfoMenuA.remove(); + } +}); +// Load widgets +Bangle.loadWidgets(); +require("widget_utils").hide(); \ No newline at end of file diff --git a/apps/analogquadclk/icon.png b/apps/analogquadclk/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..79ded13c18c6af129b7b95b72ae3fe24b66177ca GIT binary patch literal 12013 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 Ef}(pb%7 literal 0 HcmV?d00001