1
0
Fork 0
BangleApps/apps/factclock/app.js

110 lines
4.9 KiB
JavaScript

Graphics.prototype.setFontBebasNeue = function() {
// Actual height 31 (32 - 2)
// 1 BPP
return this.setFontCustom(
atob('AAAAAAAAAAAAAAAAAAAPgAAAAAD4AAAAAA+AAAAAAPgAAAAAD4AAAAAAAAAAAAAAgAAAAAA4AAAAAB+AAAAAD/gAAAAD/4AAAAH/4AAAAH/4AAAAP/wAAAAP/wAAAAf/gAAAAf/gAAAA//AAAAA/+AAAAAP+AAAAAD8AAAAAA8AAAAAAIAAAAAAAAAAAAAAAAAAAAAAf//8AAAf///wAAP///+AAH////wAD////+AA/////gAPgAAD4AD4AAA+AA+AAAPgAPgAAD4AD////+AAf////AAH////wAA////4AAH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAADwAAAAAA8AAAAAAfAAAAAAHwAAAAAD////4AB////+AA/////gAP////4AD////+AA/////gAAAAAAAAAAAAAAAAAcAAHgAB/gA/4AA/4A/+AAf+Af/gAP/gP/4AD/wH/+AA+AD+PgAPgD+D4AD4B/A+AA+B/gPgAP//wD4AD//4A+AAf/8APgAD/8AD4AAf8AAeAAAAAAAAAAAAAAAAADgAfAAAH4AH8AAD+AB/wAB/gAf8AA/4AH/gAPwPgH4AD4D4A+AA+A+APgAPgPwD4AD8H+B+AA/////gAH////wAB//f/8AAP/j/+AAA/gf+AAAAAAAAAAAAAHgAAAAAP8AAAAAP/AAAAAP/wAAAAf/8AAAAf//AAAA//HwAAA/+B8AAA/+AfAAA/+AHwAAP////4AD////+AA/////gAP////4AD////+AAAAAHwAAAAAB8AAAAAAAAAAAAAAAAAAAAh4AAD//4fwAA//+H+AAP//h/wAD//4f+AA//+B/gAPgeAD4AD4PAA+AA+DwAPgAPh+AD4AD4f//+AA+D///gAPg///wAD4H//4AA8A//8AAAAAAAAAAAAAAAAAA///gAAB////AAA////4AAf////AAP////4AD////+AA+A8APgAPgfAD4AD4HwA+AA+B8APgAP8f//4AD/H//+AAfx///AAD8P//gAAfB//wAAAAB/AAAAAAAAAAAAAAAAAA8AAAAAAPgAAAAAD4AAACAA+AAAHgAPgAAf4AD4AA/+AA+AD//gAPgH//4AD4P//wAA+///gAAP//+AAAD//8AAAA//wAAAAP/AAAAAD+AAAAAAAAAAAAAAAAAAAAAH4D/gAAH/j/+AAD/9//wAB////8AA/////gAP9/4H4AD4D8A+AA+A+APgAPgPgD4AD4D8A+AA/////gAP////4AB////8AAP/3/+AAB/4f/AAAAAA+AAAAAAAAAAAAAAAAAAH/wHAAAH//B8AAH//4fwAB///H8AA///x/gAPwH8H4AD4AfA+AA+AHwPgAPgB4D4AD4A+B+AA/////gAH////wAB////8AAP///+AAA///+AAAAAAAAAAAAAAAAAAAAAAAAAAPgA+AAAD4APgAAA+AD4AAAPgA+AAAD4APgAAAAAAAAA'),
46,
atob("CBIRDxEREhESERIRCA=="),
44|65536
);
};
{
// the font we're using
const factFont = "6x15";
// swap every 10 minutes
const minsPerFact = 5;
// timeout used to update every minute
let drawTimeout;
// the fact we're going to display (pre-rendered with a border)
let factGfx;
// how long until the next fact?
let factCounter = minsPerFact;
// the gfx we use for the time so we can gat a shadow on it
let timeGfx = Graphics.createArrayBuffer(g.getWidth()>>1, 48, 2, {msb:true});
timeGfx.transparent = 0;
timeGfx.palette = new Uint16Array([
0, g.toColor(g.theme.bg), 0, g.toColor(g.theme.fg)
]);
let getNewFact = () => {
let fact = require("textsource").getRandomText();
// wrap to fit the screen
let lines = g.setFont(factFont).wrapString(fact.txt, g.getWidth()-10);
let txt = lines.join("\n");
// allocate a gfx for this
factGfx = Graphics.createArrayBuffer(g.getWidth(), g.stringMetrics(txt).height+4, 2, {msb:true});
factGfx.transparent = 0;
factGfx.setFont(factFont).setFontAlign(0,-1).setColor(3).drawString(txt, factGfx.getWidth()/2, 2);
if (factGfx.filter) factGfx.filter([ // add shadow behind text
0,1,1,1,0,
1,1,1,1,1,
1,1,1,1,1,
1,1,1,1,1,
0,1,1,1,0,
], { w:5, h:5, div:1, max:1, filter:"max" });
factGfx.palette = new Uint16Array([
0, g.toColor(g.theme.bg), 0, g.toColor(g.theme.fg)
]);
};
getNewFact();
// schedule a draw for the next minute
let queueDraw = function() {
if (drawTimeout) clearTimeout(drawTimeout);
drawTimeout = setTimeout(function() {
drawTimeout = undefined;
draw();
}, 60000 - (Date.now() % 60000));
};
let draw = function() {
// queue next draw in one minute
queueDraw();
// new fact?
if (--factCounter < 0) {
factCounter = minsPerFact;
getNewFact();
}
// Work out where to draw...
g.reset();
require("clockbg").fillRect(Bangle.appRect);
// work out locale-friendly date/time
var date = new Date();
var timeStr = require("locale").time(date,1);
var dateStr = require("locale").date(date,1);
// draw time to buffer
timeGfx.clear(1);
timeGfx.setFontAlign(0,-1).setFont("BebasNeue");
timeGfx.drawString(timeStr,timeGfx.getWidth()/2,2);
timeGfx.setFontAlign(0,1).setFont("6x8");
timeGfx.drawString(dateStr,timeGfx.getWidth()/2,timeGfx.getHeight()-2);
// add shadow to buffer and render
if (timeGfx.filter) timeGfx.filter([ // add shadow behind text
0,1,1,1,0,
1,1,1,1,1,
1,1,1,1,1,
1,1,1,1,1,
0,1,1,1,0,
], { w:5, h:5, div:1, max:1, filter:"max" });
var y = (Bangle.appRect.y+g.getHeight()-(factGfx.getHeight()+timeGfx.getHeight()*2))>>1;
g.drawImage(timeGfx,0, y, {scale:2});
// draw the fact
g.drawImage(factGfx,0, g.getHeight()-factGfx.getHeight());
};
// Show launcher when middle button pressed
Bangle.setUI({mode:"clock", remove:function() {
// free any memory we allocated to allow fast loading
delete Graphics.prototype.setFontBebasNeue;
if (drawTimeout) clearTimeout(drawTimeout);
drawTimeout = undefined;
require('widget_utils').show(); // re-show widgets
}});
// Load widgets
Bangle.loadWidgets();
require("widget_utils").swipeOn();
// draw immediately at first, queue update
draw();
}