mirror of https://github.com/espruino/BangleApps
202 lines
4.6 KiB
JavaScript
202 lines
4.6 KiB
JavaScript
{
|
|
require("Font7x11Numeric7Seg").add(Graphics);
|
|
|
|
const centerY = g.getHeight() / 2; //88
|
|
const lineStart = 25;
|
|
const lineEndFull = 110;
|
|
const lineEndHalf = 90;
|
|
const lineEndQuarter = 70;
|
|
const lineEndDefault = 50;
|
|
|
|
let drawTimeout;
|
|
|
|
let queueDrawTime = function () {
|
|
if (drawTimeout) clearTimeout(drawTimeout);
|
|
drawTimeout = setTimeout(function () {
|
|
drawTimeout = undefined;
|
|
drawTime();
|
|
}, 60000 - (Date.now() % 60000));
|
|
};
|
|
|
|
let drawCenterLine = function () {
|
|
// center line
|
|
g.drawLineAA(0, centerY, g.getWidth(), centerY);
|
|
// left decoration
|
|
var steps = [0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
|
|
var stepsReversed = steps.slice();
|
|
stepsReversed.reverse();
|
|
var polyLeftTop = [0, 0];
|
|
var polyLeftBottom = [0, g.getHeight()];
|
|
var polyRightTop = [g.getWidth() - 1, 0];
|
|
var polyRightBottom = [g.getWidth() - 1, g.getHeight()];
|
|
let xL = 0;
|
|
let xR = g.getWidth() - 1;
|
|
let yT = centerY - 13;
|
|
let yB = centerY + 13;
|
|
|
|
for (let i = 0; i < steps.length; i++) {
|
|
xL += steps[i];
|
|
xR -= steps[i];
|
|
yT += stepsReversed[i];
|
|
yB -= stepsReversed[i];
|
|
|
|
// Left Top
|
|
polyLeftTop.push(xL);
|
|
polyLeftTop.push(yT);
|
|
|
|
// Left Bottom
|
|
polyLeftBottom.push(xL);
|
|
polyLeftBottom.push(yB);
|
|
|
|
// Right Top
|
|
polyRightTop.push(xR);
|
|
polyRightTop.push(yT);
|
|
|
|
// Right Bottom
|
|
polyRightBottom.push(xR);
|
|
polyRightBottom.push(yB);
|
|
}
|
|
|
|
polyLeftTop.push(0, 88);
|
|
polyLeftBottom.push(0, 88);
|
|
polyRightTop.push(g.getWidth(), 88);
|
|
polyRightBottom.push(g.getWidth(), 88);
|
|
|
|
g.fillPolyAA(polyLeftTop, true);
|
|
g.fillPolyAA(polyLeftBottom, true);
|
|
g.fillPolyAA(polyRightTop, true);
|
|
g.fillPolyAA(polyRightBottom, true);
|
|
};
|
|
|
|
let hourStringXOffset = function (hour) {
|
|
if (hour == 1) {
|
|
return lineEndFull - 5;
|
|
}
|
|
if (hour < 10 || hour >= 20) {
|
|
return lineEndFull + 5;
|
|
}
|
|
return lineEndFull - 5;
|
|
};
|
|
|
|
let drawHourString = function(hour, yLines) {
|
|
var hourForDrawing = 0;
|
|
if (hour < 0) {
|
|
// a negative hour => (+ and - = -)
|
|
hourForDrawing = 24 + hour;
|
|
} else if (hour >= 24) {
|
|
hourForDrawing = hour - 24;
|
|
} else {
|
|
hourForDrawing = hour;
|
|
}
|
|
g.drawString(hourForDrawing, hourStringXOffset(hourForDrawing), yLines, true);
|
|
};
|
|
|
|
let drawTime = function () {
|
|
g.clear();
|
|
var d = new Date();
|
|
var mins = d.getMinutes();
|
|
|
|
var offset = mins % 5;
|
|
var yTopLines = centerY - offset;
|
|
var topReached = false;
|
|
|
|
var yBottomLines = centerY - offset + 5;
|
|
var bottomReached = false;
|
|
|
|
drawCenterLine();
|
|
|
|
var lineEnd = lineEndDefault;
|
|
g.setFont("7x11Numeric7Seg", 2);
|
|
g.setFontAlign(-1, 0);
|
|
|
|
// gone
|
|
do {
|
|
switch (yTopLines - 88 + mins) {
|
|
case -60:
|
|
lineEnd = lineEndFull;
|
|
drawHourString(d.getHours() - 1, yTopLines);
|
|
break;
|
|
case 0:
|
|
case 60:
|
|
lineEnd = lineEndFull;
|
|
drawHourString(d.getHours(), yTopLines);
|
|
break;
|
|
case 45:
|
|
case -45:
|
|
case 15:
|
|
case -15:
|
|
case -75:
|
|
lineEnd = lineEndQuarter;
|
|
break;
|
|
case 30:
|
|
case -30:
|
|
lineEnd = lineEndHalf;
|
|
break;
|
|
default:
|
|
lineEnd = lineEndDefault;
|
|
}
|
|
g.drawLineAA(lineStart, yTopLines, lineEnd, yTopLines);
|
|
|
|
yTopLines -= 5;
|
|
if (yTopLines < -4) {
|
|
topReached = true;
|
|
}
|
|
} while (!topReached);
|
|
|
|
// upcoming
|
|
do {
|
|
switch (yBottomLines - 88 + mins) {
|
|
case 0:
|
|
case 60:
|
|
lineEnd = lineEndFull;
|
|
drawHourString(d.getHours() + 1, yBottomLines);
|
|
break;
|
|
case 120:
|
|
lineEnd = lineEndFull;
|
|
drawHourString(d.getHours() + 2, yBottomLines);
|
|
break;
|
|
case 15:
|
|
case 75:
|
|
case 135:
|
|
case 45:
|
|
case 105:
|
|
case 165:
|
|
lineEnd = lineEndQuarter;
|
|
break;
|
|
case 30:
|
|
case 90:
|
|
case 150:
|
|
lineEnd = lineEndHalf;
|
|
break;
|
|
default:
|
|
lineEnd = lineEndDefault;
|
|
}
|
|
g.drawLineAA(lineStart, yBottomLines, lineEnd, yBottomLines);
|
|
|
|
yBottomLines += 5;
|
|
if (yBottomLines > 176) {
|
|
bottomReached = true;
|
|
}
|
|
} while (!bottomReached);
|
|
|
|
queueDrawTime();
|
|
};
|
|
|
|
|
|
g.clear();
|
|
drawTime();
|
|
|
|
Bangle.setUI(
|
|
{
|
|
mode: "clock",
|
|
remove: function () {
|
|
if (drawTimeout) clearTimeout(drawTimeout);
|
|
require("widget_utils").show();
|
|
}
|
|
}
|
|
);
|
|
|
|
Bangle.loadWidgets();
|
|
require("widget_utils").swipeOn();
|
|
}
|