From 52d71ab0cac3d04a3d4a329cd5ebbe1b291c99f0 Mon Sep 17 00:00:00 2001 From: Leon Matthes Date: Tue, 29 Nov 2022 23:14:51 +0100 Subject: [PATCH] CalClock: Version 0.5 - Use event colors - Improved all day event support --- apps/calclock/ChangeLog | 1 + apps/calclock/calclock.js | 51 +++++++++++++++++++++------------ apps/calclock/metadata.json | 2 +- apps/calclock/screenshot.patch | 32 +++++++++++++++++++++ apps/calclock/screenshot.png | Bin 2922 -> 3212 bytes 5 files changed, 67 insertions(+), 19 deletions(-) create mode 100644 apps/calclock/screenshot.patch diff --git a/apps/calclock/ChangeLog b/apps/calclock/ChangeLog index f4a0c96f5..5c1b7c4bc 100644 --- a/apps/calclock/ChangeLog +++ b/apps/calclock/ChangeLog @@ -2,3 +2,4 @@ 0.02: More compact rendering & app icon 0.03: Tell clock widgets to hide. 0.04: Improve current time readability in light theme. +0.05: Show calendar colors & improved all day events. diff --git a/apps/calclock/calclock.js b/apps/calclock/calclock.js index a55dc05f9..5a13a202f 100644 --- a/apps/calclock/calclock.js +++ b/apps/calclock/calclock.js @@ -20,41 +20,55 @@ function zp(str) { } function drawEventHeader(event, y) { - g.setFont("Vector", 24); - + var x = 0; var time = isActive(event) ? new Date() : new Date(event.timestamp * 1000); - var timeStr = zp(time.getHours()) + ":" + zp(time.getMinutes()); - g.drawString(timeStr, 5, y); - y += 24; + + //Don't need to know what time the event is at if its all day + if (isActive(event) || !event.allDay) { + g.setFont("Vector", 24); + var timeStr = zp(time.getHours()) + ":" + zp(time.getMinutes()); + g.drawString(timeStr, 0, y); + y += 3; + x = 13*timeStr.length+5; + } g.setFont("12x20", 1); + if (isActive(event)) { - g.drawString(zp(time.getDate())+". " + require("locale").month(time,1),15*timeStr.length,y-21); + g.drawString(zp(time.getDate())+". " + require("locale").month(time,1),x,y); } else { var offset = 0-time.getTimezoneOffset()/1440; var days = Math.floor((time.getTime()/1000)/86400+offset)-Math.floor(getTime()/86400+offset); - if(days > 0) { + if(days > 0 || event.allDay) { var daysStr = days===1?/*LANG*/"tomorrow":/*LANG*/"in "+days+/*LANG*/" days"; - g.drawString(daysStr,15*timeStr.length,y-21); + g.drawString(daysStr,x,y); } } + y += 21; return y; } function drawEventBody(event, y) { g.setFont("12x20", 1); - var lines = g.wrapString(event.title, g.getWidth()-10); + var lines = g.wrapString(event.title, g.getWidth()-15); + var yStart = y; if (lines.length > 2) { lines = lines.slice(0,2); lines[1] = lines[1].slice(0,-3)+"..."; } - g.drawString(lines.join('\n'), 5, y); + g.drawString(lines.join('\n'),10,y); y+=20 * lines.length; if(event.location) { - g.drawImage(atob("DBSBAA8D/H/nDuB+B+B+B3Dn/j/B+A8A8AYAYAYAAAAAAA=="),5,y); - g.drawString(event.location, 20, y); + g.drawImage(atob("DBSBAA8D/H/nDuB+B+B+B3Dn/j/B+A8A8AYAYAYAAAAAAA=="),10,y); + g.drawString(event.location,25,y); y+=20; } + if (event.color) { + var oldColor = g.getColor(); + g.setColor("#"+(0x1000000+Number(event.color)).toString(16).padStart(6,"0")); + g.fillRect(0,yStart,5,y-3); + g.setColor(oldColor); + } y+=5; return y; } @@ -68,19 +82,19 @@ function drawEvent(event, y) { var curEventHeight = 0; function drawCurrentEvents(y) { - g.setColor(g.theme.dark ? "#0ff" : "#0000ff"); - g.clearRect(5, y, g.getWidth() - 5, y + curEventHeight); + g.setColor(g.theme.dark ? "#0ff" : "#00f"); + g.clearRect(0,y,g.getWidth()-5,y+curEventHeight); curEventHeight = y; if(current.length === 0) { y = drawEvent({timestamp: getTime(), durationInSeconds: 100}, y); } else { - y = drawEventHeader(current[0], y); + y = drawEventHeader(current[0],y); for (var e of current) { - y = drawEventBody(e, y); + y = drawEventBody(e,y); } } - curEventHeight = y - curEventHeight; + curEventHeight = y-curEventHeight; return y; } @@ -94,7 +108,7 @@ function drawFutureEvents(y) { } function fullRedraw() { - g.clearRect(5,24,g.getWidth()-5,g.getHeight()); + g.clearRect(0,24,g.getWidth()-5,g.getHeight()); updateCalendar(); var y = 30; y = drawCurrentEvents(y); @@ -117,3 +131,4 @@ var minuteInterval = setInterval(redraw, 60 * 1000); Bangle.setUI("clock"); Bangle.loadWidgets(); Bangle.drawWidgets(); + diff --git a/apps/calclock/metadata.json b/apps/calclock/metadata.json index 3aab55186..be0a1bdd8 100644 --- a/apps/calclock/metadata.json +++ b/apps/calclock/metadata.json @@ -2,7 +2,7 @@ "id": "calclock", "name": "Calendar Clock", "shortName": "CalClock", - "version": "0.04", + "version": "0.05", "description": "Show the current and upcoming events synchronized from Gadgetbridge", "icon": "calclock.png", "type": "clock", diff --git a/apps/calclock/screenshot.patch b/apps/calclock/screenshot.patch new file mode 100644 index 000000000..3fdbf79d1 --- /dev/null +++ b/apps/calclock/screenshot.patch @@ -0,0 +1,32 @@ +diff --git a/apps/calclock/calclock.js b/apps/calclock/calclock.js +index cb8c6100e..2092c1a4e 100644 +--- a/apps/calclock/calclock.js ++++ b/apps/calclock/calclock.js +@@ -3,9 +3,24 @@ var current = []; + var next = []; + + function updateCalendar() { +- calendar = require("Storage").readJSON("android.calendar.json",true)||[]; +- calendar = calendar.filter(e => isActive(e) || getTime() <= e.timestamp); +- calendar.sort((a,b) => a.timestamp - b.timestamp); ++ calendar = [ ++ { ++ t: "calendar", ++ id: 2, type: 0, timestamp: getTime(), durationInSeconds: 200, ++ title: "Capture Screenshot", ++ description: "Capture Screenshot", ++ location: "", ++ calName: "", ++ color: -7151168, allDay: true }, ++ { ++ t: "calendar", ++ id: 7186, type: 0, timestamp: getTime() + 2000, durationInSeconds: 100, ++ title: "Upload to BangleApps", ++ description: "", ++ location: "", ++ calName: "", ++ color: -509406, allDay: false } ++ ]; + + current = calendar.filter(isActive); + next = calendar.filter(e=>!isActive(e)); diff --git a/apps/calclock/screenshot.png b/apps/calclock/screenshot.png index 4ab503f2bc209f3e5993d2d54cc98a8ffc8b6a32..8b2e39784c75f9c6301234454871dc29cd29a755 100644 GIT binary patch literal 3212 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