Merge branch 'master' of github.com:espruino/BangleApps

master
Gordon Williams 2021-10-20 08:51:15 +01:00
commit 54a0b89fe7
18 changed files with 232 additions and 112 deletions

View File

@ -348,9 +348,9 @@
{ "id": "matrixclock", { "id": "matrixclock",
"name": "Matrix Clock", "name": "Matrix Clock",
"icon": "matrixclock.png", "icon": "matrixclock.png",
"version":"0.01", "version":"0.02",
"description": "inspired by The Matrix, a clock of the same style", "description": "inspired by The Matrix, a clock of the same style",
"tags": "clock", "tags": "clock,b2",
"type":"clock", "type":"clock",
"allow_emulator":true, "allow_emulator":true,
"readme": "README.md", "readme": "README.md",
@ -972,7 +972,7 @@
{ "id": "svclock", { "id": "svclock",
"name": "Simple V-Clock", "name": "Simple V-Clock",
"icon": "vclock-simple.png", "icon": "vclock-simple.png",
"version":"0.02", "version":"0.03",
"description": "Modification of Simple Clock 0.04 to use Vectorfont", "description": "Modification of Simple Clock 0.04 to use Vectorfont",
"tags": "clock", "tags": "clock",
"type":"clock", "type":"clock",
@ -1489,10 +1489,11 @@
"name": "Touch Launcher", "name": "Touch Launcher",
"shortName":"Toucher", "shortName":"Toucher",
"icon": "app.png", "icon": "app.png",
"version":"0.06", "version":"0.07",
"description": "Touch enable left to right launcher.", "description": "Touch enable left to right launcher.",
"tags": "tool,system,launcher", "tags": "tool,system,launcher,b2",
"type":"launch", "type":"launch",
"readme": "README.md",
"data": [ "data": [
{"name":"toucher.json"} {"name":"toucher.json"}
], ],
@ -3528,7 +3529,7 @@
"name": "Pastel Clock", "name": "Pastel Clock",
"shortName": "Pastel", "shortName": "Pastel",
"icon": "pastel.png", "icon": "pastel.png",
"version":"0.04", "version":"0.05",
"description": "A Configurable clock with custom fonts and background", "description": "A Configurable clock with custom fonts and background",
"tags": "clock,b2", "tags": "clock,b2",
"type":"clock", "type":"clock",

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

View File

@ -7,13 +7,9 @@ function showMainMenu() {
'': { '': {
'title': 'App Manager', 'title': 'App Manager',
}, },
'Free': { '< Back': ()=> {load();},
value: undefined, 'Sort Apps': () => showSortAppsMenu(),
format: (v) => { 'Manage Apps': ()=> showApps(),
return store.getFree();
},
onchange: () => {}
},
'Compact': () => { 'Compact': () => {
E.showMessage('Compacting...'); E.showMessage('Compacting...');
try { try {
@ -22,9 +18,13 @@ function showMainMenu() {
} }
showMainMenu(); showMainMenu();
}, },
'Apps': ()=> showApps(), 'Free': {
'Sort Apps': () => showSortAppsMenu(), value: undefined,
'< Back': ()=> {load();} format: (v) => {
return store.getFree();
},
onchange: () => {}
},
}; };
E.showMenu(mainmenu); E.showMenu(mainmenu);
} }

View File

@ -1 +1,2 @@
0.01: Initial Release 0.01: Initial Release
0.02: Support for Bangle 2

View File

@ -12,6 +12,8 @@ const Locale = require('locale');
const SHARD_COLOR =[0,1.0,0]; const SHARD_COLOR =[0,1.0,0];
const SHARD_FONT_SIZE = 12; const SHARD_FONT_SIZE = 12;
const SHARD_Y_START = 30; const SHARD_Y_START = 30;
const w = g.getWidth();
/** /**
* The text shard object is responsible for creating the * The text shard object is responsible for creating the
* shards of text that move down the screen. As the * shards of text that move down the screen. As the
@ -111,7 +113,7 @@ var dateStr = "";
var last_draw_time = null; var last_draw_time = null;
const TIME_X_COORD = 20; const TIME_X_COORD = 20;
const TIME_Y_COORD = 100; const TIME_Y_COORD = g.getHeight() / 2;
const DATE_X_COORD = 170; const DATE_X_COORD = 170;
const DATE_Y_COORD = 30; const DATE_Y_COORD = 30;
const RESET_PROBABILITY = 0.5; const RESET_PROBABILITY = 0.5;
@ -141,29 +143,26 @@ function draw_clock(){
} }
var now = new Date(); var now = new Date();
// draw time. Have to draw time on every loop // draw time. Have to draw time on every loop
g.setFont("Vector",45);
g.setFontAlign(-1,-1,0); g.setFont("Vector", g.getWidth() / 5);
g.setFontAlign(0,-1);
if(last_draw_time == null || now.getMinutes() != last_draw_time.getMinutes()){ if(last_draw_time == null || now.getMinutes() != last_draw_time.getMinutes()){
g.setColor(0,0,0); g.setColor(g.theme.fg);
g.drawString(timeStr, TIME_X_COORD, TIME_Y_COORD); g.drawString(timeStr, w/2, TIME_Y_COORD);
timeStr = format_time(now); timeStr = format_time(now);
} }
g.setColor(SHARD_COLOR[0], g.setColor(SHARD_COLOR[0], SHARD_COLOR[1], SHARD_COLOR[2]);
SHARD_COLOR[1], g.drawString(timeStr, w/2, TIME_Y_COORD);
SHARD_COLOR[2]);
g.drawString(timeStr, TIME_X_COORD, TIME_Y_COORD);
// //
// draw date when it changes // draw date when it changes
g.setFont("Vector",15); g.setFont("Vector",15);
g.setFontAlign(-1,-1,0); g.setFontAlign(0,-1,0);
if(last_draw_time == null || now.getDate() != last_draw_time.getDate()){ if(last_draw_time == null || now.getDate() != last_draw_time.getDate()){
g.setColor(0,0,0); g.setColor(g.theme.fg);
g.drawString(dateStr, DATE_X_COORD, DATE_Y_COORD); g.drawString(dateStr, w/2, DATE_Y_COORD);
dateStr = format_date(now); dateStr = format_date(now);
g.setColor(SHARD_COLOR[0], g.setColor(SHARD_COLOR[0], SHARD_COLOR[1], SHARD_COLOR[2]);
SHARD_COLOR[1], g.drawString(dateStr, w/2, DATE_Y_COORD);
SHARD_COLOR[2]);
g.drawString(dateStr, DATE_X_COORD, DATE_Y_COORD);
} }
last_draw_time = now; last_draw_time = now;
} }
@ -232,10 +231,10 @@ function startTimers(){
Bangle.on('lcdPower', (on) => { Bangle.on('lcdPower', (on) => {
if (on) { if (on) {
console.log("lcdPower: on"); //console.log("lcdPower: on");
startTimers(); startTimers();
} else { } else {
console.log("lcdPower: off"); //console.log("lcdPower: off");
clearTimers(); clearTimers();
} }
}); });

View File

@ -2,3 +2,4 @@
0.02: Display 12 hour clock as 12:xx not 00:xx when just into PM 0.02: Display 12 hour clock as 12:xx not 00:xx when just into PM
0.03: Make it work with Gadgetbridge, Notifications fullscreen on a Bangle 2 0.03: Make it work with Gadgetbridge, Notifications fullscreen on a Bangle 2
0.04: Leave space at the bottom for Chrono widget, set back option at first option 0.04: Leave space at the bottom for Chrono widget, set back option at first option
0.05: Added 2 new fonts

View File

@ -1,7 +1,7 @@
# Pastel Clock - a configurable clock with custom fonts and background # Pastel Clock - a configurable clock with custom fonts and background
* Designed specifically for Bangle 1 and Bangle 2 * Designed specifically for Bangle 1 and Bangle 2
* A choice of 5 different custom fonts * A choice of 7 different custom fonts
* Supports the Light and Dark themes * Supports the Light and Dark themes
* Has a settings menu, change font, enable/disable the grid and the date display * Has a settings menu, change font, enable/disable the grid and the date display
@ -15,3 +15,6 @@ I came up with the name Pastel due to the shade of the grid background.
![](screenshot_b1_light.jpg) ![](screenshot_b1_light.jpg)
![](screenshot_b2_dark.jpg) ![](screenshot_b2_dark.jpg)
![](screenshot_monoton.jpg)
![](screenshot_elite.jpg)

View File

@ -47,6 +47,16 @@ var scale = 1; // size multiplier for this font
g.setFontCustom(font, 46, widths, 58+(scale<<8)+(1<<16)); g.setFontCustom(font, 46, widths, 58+(scale<<8)+(1<<16));
}; };
Graphics.prototype.setFontMonoton = function(scale) {
// Actual height 44 (43 - 0)
g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAABmwAAAAAAzYAAAAAAZsAAAAAAM2AAAAAAGbAAAAAADNgAAAAABmwAAAAAAzYAAAAAAZsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAD+AAAAAAf8AAAAAD/ggAAAAf8HwAAAD/g/4AAAf8H/AAAD/g/4OAAf8H/B/AD/g/4P+Af8H/B/wAfg/4P+AAMH/B/wAAA/4H+AAAD/A/4AAAB4H/AAAAAA/4AAAAAH/AAAAAAP4AAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAH//gAAAAf//8AAAA/AAPgAAA8f/x8AAB4//+PAAB5+APxwABzwfwecAAzj//jnAA7n+P85gA7ngAPO4AbnH/xzsAdnP/+c3AN3PAHndgGzOAA5m4DbuAAO7MD9mAADN2Bs3AAB2bA2bAAAbNgbNgAANmwNmwAAGzYGzYAADZsDdmAADN2B+7AABuzAbMwABmbgNneAD3NgHZ3+/3MwBuc//nO4A7nB8HGYAM58AfOcAHeP/+OcABzx/8ecAAc+AA+cAAHH//8cAAB4//48AAAPg+B8AAAD+AP4AAAAP//wAAAAA/+AAAAAAAAAAAAAAAAAAABsAAAAAAA2AAAAAAAbAAAAAAANgAAAAAAGwAAAAAADf////8ABv////+AA3/////AAbAAAAAAAN/////wAG/////4ADYAAAAAABv////+AA3/////AAb/////gANgAAAAAAG/////4ADf////8AAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAADcAAAA2wBs2AADbYA2bAADtsAbZgADm2AftwAHjbAN24AHNtgGzYAPO2wDZsAPebYBs2AOeNsA2bAec22AbNge87bANmwc55tgG7c8542wD9355zbYA2Z5zztsAbODzjm2ANz/nnjbADc/nnhtgBnCPHA2wA74fPAbYAOf+OANsADj8eAG2AA8A+ADbAAP/8AAAAAB/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAABgG6AAAAuwDdsAAG3YBs2AADZuA27AABu3A/ZgAA7dgbtwAAduwN2w2zG3YGzYbZjZsDZsNsxs2Bs2G2Y2bA2bDbMbNgbNhtmNmwNmw2zGzYG7MbdnbsD939m/d2A2Z/7PM3AbuBtwO7AOz73eeZgDc/9n+dwB3H2Y8cwAZ4HnA84AGf/5/84ADz/OP44AAeALwB4AAH/+//4AAA/+H/wAAADwAfAAAAAAAAAAAAAAAAAAAAAAAZsAAAAAB82AAAAAD+bAAAAAHzNgAAAAPjmwAAAAfHzYAAAB+P5sAAAD8fM2AAAHw+ObAAAPj8fNgAAfH4/mwAA+Ph8zYAAcfH4ZsAAA+Px82AAB8fD+bAAD4+HzNgABh8PhmwAAH4/AzYAAPx+AZsAAPD4AM2AAGHwP+bfgAfgH/NvwA/AABmwAA8AAAzYAAYAA/5t+AAAAf82/AAAAAGbAAAAAADNgAAAAAAAAAAAAAAAAAAAAAAAGAAE///ADAAGf//gBwADP//wCcABmAAADmAAz//8C7gAZ//+DMwAMwAAA3YAGf//hZsADP//xu3ABn//4zdgAzDNsNuwAZhu2GzYAMw2bDZsAGYbNhs2ADMNmw2bABmGzYbNgAzDZsdmwAZhs2M3YAMw3d+zcAGYZm+ZsADMOzgd2ABmDM883AAzB3P87AAZgZx47gAMwOcB5gAGYDn/5gADMA4/zwAAAAPADwAAAAD8fgAAAAAf/gAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///4AAAD////AAAHwAADwAAHH//8eAAHP///ngAHfgAB8wAHeH/8PcADcf//x3ADsf//+ZgBu8AADu4B2c//8zMA3d///M2AbNwAB2bgduxs2bswP2Z2/O3YGzYzbDZsDZsbths2Bs2Nmw2bA2bGzYbNgbNjZsNmwNmxs2GzYH7c2bHbsDtmbtzdmA2bM3fs3AbMHZnO7AM3BuYOZgHZAzP+dgBmAMx+cwA7gHeAcwAMgB3584AHAAc/84ABgAHHx4AAAAB4D4AAAAAf/wAAAAAD/gAAAAAAAAAAAAAAAAAAZsAAAAAAM2AAAAAAGbAAAAAADNgAAAAABmwAAAAAAzYAAAAAAZsAAAAAAM2AAAAPAGbAAAB/gDNgAAP+ABmwAD/wYAzYAf+D8AZsD/wf8AM2f8D/gAGT/gf8HgAf8D/g/wB/g/8H/AA8H/g/4MAA/8H/B+AH/g/4P+AH4H/B/wADA/4P+AAAH/B/wAAA/4P+AAAAfB/wAAAAAP+AAAAAB/wAAAAAD+AAAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAGAAwAAAA/8H/gAAB//v/8AAB4B/APgADz+PP54ABn/x//OABng8eDzAB3HHOcdwA3P9z/nYA7P/d/5mAbOBmYO7ANmebvzNwP3fs392YGzc3ZmbsDZsZsxs2Bs2M2Y2bA2bGbMbNgbNjNmNmwNmxmzGzYGzYzZjZsDZsZsxs2Bs2M2Y2bA2bGbMbNgbNzNmNmwP2Zm7s3YDbv7M+7MBszt3OZuA3MGZwd2ANn/uf8zAGY+zn47gDvAc4A7gA78/Pj5gAOf/z/zwADj8cPjwAA+A/gHgAAH/9//gAAA/4P/AAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAD/4AAAAAHw/AAAAAHADwADAAHP8cABgAHf/nAA4AHeB5gDuAHcfOYAzADc/7uBdwBs8ezBmYBu4DdgbsA2Z924s3AbN+bM3bgfsxt2duwNm4zbG3YGzYZtjZsDZsM2xs2Bs2GbY2bA2bDNsbNgbNhv2NmwP242zO3YHbszbm7sBs3AAHZuA2Z///M2Abuf//O7AGzh/8ObgDc8AA+dgB3P//+dwAdx//8cwAGeAAA8wADn///44AA8///54AAPgAAB4AAB+AAPwAAAP///gAAAA//+AAAAAAAAAAAAAAAAAAAAAAAAAAAADbBmwAAABtgzYAAAA2wZsAAAAbYM2AAAANsGbAAAAG2DNgAAADbBmwAAABtgzYAAAA2wZsAAAAAAAAAAAAAAAAAAA="), 46, atob("DRYpFR0eHiImHygmDQ=="), 49+(scale<<8)+(1<<16));
}
Graphics.prototype.setFontSpecialElite = function(scale) {
// Actual height 40 (39 - 0)
g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAYAAAAAAAfwAAAAAAP/AAAAAAH/4AAAAAB/+AAAAAAf/gAAAAAH/4AAAAAB/+AAAAAAf/gAAAAAH/4AAAAAAv8AAAAAAN6AAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAfAAAAAAAPwAAAAAAP8AAAAAAH+AAAAAAH+AAAAAAD+AAAAAAD/AAAAAAD/AAAAAAB/AAAAAAB/AAAAAAB/AAAAAAB/gAAAAAB/gAAAAAB/gAAAAAA/gAAAAAB/wAAAAAA/4AAAAAA/wAAAAAA/4AAAAAA/4AAAAAAf8AAAAAAP8AAAAAAD8AAAAAAA8AAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//wAAAAP///gAAAH/9/+AAAD/gAf4AAB/AAB+AAA/AAAHwAAPAAAA+AADgAAAPgAAwAAAD4AAcAAAAfAAHAAAAHwABwAAAB8AA4AAAAfAAOAAAAHwABwAAAB8AAcAAAA/AAHgAAAPgAB+AAAH4AAPgAAD8AAD+AAD+AAA/4Af/AAAB////AAAAP///wAAAAP//gAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAOAAAAHAADgAAAD4AB4AAAA+AAeAAAAPgAHgAAAD4AB4AAAAeAAeAAAAHgAHgAAAB4AB4AAAAcAAeAAAAPAAH4AAP/wAB/////+AAf/////gAH/////4AB///+/+AAAAQAAPgAAAAAAB4AAAAAAAeAAAAAAAHgAAAAAAD4AAAAAAA+AAAAAAAPgAAAAAADwAAAAAAA+AAAAAAAPgAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAcAAAB+AAfwAAA/wAf/AAA/8Af/wAAf/AP/8AAGPwP//AADh8D48AAA4OB8OAAAOAAfDgAAHAAPg4AABwADwPAAAcAB8DwAAHAAeAeAABwAHAHgAAcADwB8AAHAB4APgAB4A+AB4AAPAfAAeAAD4fgADgAAf/4AA4AAD/8AAeAAAf+AAfAAAB8AAPwAAAAAAD4AAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAf8AAB/wAH/wAAf8AB/8AAH+AAffgAB4AcDx4AAcAPAAfAAHAPwAHwABwHwAA8AAcB+AAPAAHA/gADwABw/4AA8AAcf+AAPAAHP/gAHwABz74AB8AAf8fAA/AAH8DwAPgAD/A8AHwAA/gHwP8AAPwA//+AADwAH//AAAAAA//gAAAAAD/wAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAP8AAAAAAD/AAAAAAD/wAAAAAD/8AAAAAB/PAAAAAA/jwAAAAAfg8AAAAAPwPAAAAAH4DwAAAAD4A8HAAAD8APBwAAB+ADw8AAA+AA8PAAA/AAPDgAAPgADw8AAHwAB8/AAD+B///wAA/////8AAP/////AAB+f///wAAAAAHx8AAAAAB8PAAAAAAPDwAAAAADw8AAAAAA4PAAAAAAODwAAAAADgcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAB/gAAH//wf8AAB//+H/gAAf//h/4AAHJ/wf/AABwD4D/4AAeA+AAeAAHgPAAHgAB4DwAB4AAeA4AAeAAHgOAAHgAA4DgAB4AAOA8AAeAADgPAAHgAB4D4ADwAAeAeAB4AAHAHwAeAABgAfAPgAAYAD8fgAAAAA//wAAAAAH/4AAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAA//wAAAAB///AAAAB////AAAB/7//wAAA/AfB+AAAfAPAPwAAPgHgB+AAHwBwAPgAB4A8AB8AAeAPAAfAAPADwAHwADgA8AB8AA8APAAfAAPADwAHwADwA8AB8AA8AHgA+AAP8B4APgAD/wfAH4AA/8D4D8AAH/A///AAB/wH//gAAH8A//wAAA8AH/4AAAAAA/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAB/4AAAAAA/8AAAAAAP+AAAAAAD+AAAAAAAeAAAAAAAHAAAAAAADwAAAAAAB8AAAAAAAfAAAAAAAHwAAA/8AD+AAB//AA/gAB//wAP4AB//gAB+AB//AAAfwB//AAAH8A/wAAAA/A/wAAAAHw/wAAAAB8/wAAAAAffwAAAAAP/wAAAAAD/4AAAAAA/4AAAAAAP8AAAAAAD4AAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAP/wAAAH8H/+AAAH/z//wAAD////+AAB///h/gAA/B/gH4AAPAP4A/AAHwB8AHwAB4APAB8AAeADgAfAAHgA4ADwABwAOAA8AAcADgAPAAHAA4ADwAB4AeAA8AAfAHwAPAADwB8AHgAA+A/gD4AAPgP4B+AAB+P/h/gAAP////wAAB/8f/4AAAP8D/8AAAAAAf8AAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAA/4APAAAA//gH4AAAP/8D/gAAP4Pg/8AADwB8P/AAB4AfD/4AAeAD4d+AAHAA+AfwADwAHgH8AA4AA8A/AAOAAPAPgADgADwD4AA8AA4B+AAPAAeAfAAB4AHgHgAAeADwD4AAHwA8A8AAA+AfA/AAAHp/h/gAAA3//+gAAAB//+gAAAAd//gAAAACf/wAAAAAH/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAABwB/AAAAB/A/8AAAA/wf/gAAAP+H/4AAAH/h/+AAAB/8f/gAAAP+H/4AAAD/h/+AAAAfwf/gAAAH8C/wAAAAAA3oAAAAAABwAAAAAAAAAAAAAAAAAAAA=="), 46, atob("ERwfHB0cHxsdHB4dEQ=="), 50+(scale<<8)+(1<<16));
}
const SETTINGS_FILE = "pastel.json"; const SETTINGS_FILE = "pastel.json";
let settings = undefined; let settings = undefined;
@ -113,6 +123,10 @@ function draw() {
g.setFontCabinSketch(); g.setFontCabinSketch();
else if (settings.font == "Orbitron") else if (settings.font == "Orbitron")
g.setFontOrbitron(); g.setFontOrbitron();
else if (settings.font == "Monoton")
g.setFontMonoton();
else if (settings.font == "Elite")
g.setFontSpecialElite();
else else
g.setFontLato(); g.setFontLato();

View File

@ -22,14 +22,14 @@
storage.write(SETTINGS_FILE, settings) storage.write(SETTINGS_FILE, settings)
} }
var font_options = ["Lato","Architect","GochiHand","CabinSketch","Orbitron"]; var font_options = ["Lato","Architect","GochiHand","CabinSketch","Orbitron","Monoton","Elite"];
E.showMenu({ E.showMenu({
'': { 'title': 'Pastel Clock' }, '': { 'title': 'Pastel Clock' },
'< Back': back, '< Back': back,
'Font': { 'Font': {
value: 0 | font_options.indexOf(s.font), value: 0 | font_options.indexOf(s.font),
min: 0, max: 4, min: 0, max: 6,
format: v => font_options[v], format: v => font_options[v],
onchange: v => { onchange: v => {
s.font = font_options[v]; s.font = font_options[v];

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -1,2 +1,3 @@
0.01: Modification of SimpleClock 0.04 to use Vectorfont 0.01: Modification of SimpleClock 0.04 to use Vectorfont
0.02: Use Bangle.setUI for button/launcher handling 0.02: Use Bangle.setUI for button/launcher handling
0.03: Scale to BangleJS 2 and add locale

View File

@ -1,15 +1,39 @@
/* jshint esversion: 6 */ /* jshint esversion: 6 */
const timeFontSize = 65; const locale = require("locale");
const dateFontSize = 20;
const gmtFontSize = 10;
const font = "Vector";
const xyCenter = g.getWidth() / 2; var timeFontSize;
const yposTime = 75; var dateFontSize;
const yposDate = 130; var gmtFontSize;
const yposYear = 175; var font = "Vector";
const yposGMT = 220;
var xyCenter = g.getWidth() / 2;
var yposTime;
var yposDate;
var yposYear;
var yposGMT;
switch (process.env.BOARD) {
case "EMSCRIPTEN":
timeFontSize = 65;
dateFontSize = 20;
gmtFontSize = 10;
yposTime = 75;
yposDate = 130;
yposYear = 175;
yposGMT = 220;
break;
case "EMSCRIPTEN2":
timeFontSize = 48;
dateFontSize = 15;
gmtFontSize = 10;
yposTime = 55;
yposDate = 95;
yposYear = 128;
yposGMT = 161;
break;
}
// Check settings for what type our clock should be // Check settings for what type our clock should be
var is12Hour = (require("Storage").readJSON("setting.json",1)||{})["12hour"]; var is12Hour = (require("Storage").readJSON("setting.json",1)||{})["12hour"];
@ -19,49 +43,39 @@ function drawSimpleClock() {
// get date // get date
var d = new Date(); var d = new Date();
var da = d.toString().split(" ");
g.reset(); // default draw styles g.reset(); // default draw styles
// drawSting centered // drawSting centered
g.setFontAlign(0, 0); g.setFontAlign(0, 0);
// draw time // drawTime
var time = da[4].substr(0, 5).split(":"); var hours;
var hours = time[0],
minutes = time[1];
var meridian = "";
if (is12Hour) { if (is12Hour) {
hours = parseInt(hours,10); hours = ("0" + d.getHours()%12).slice(-2);
meridian = "AM"; } else {
if (hours == 0) { hours = ("0" + d.getHours()).slice(-2);
hours = 12;
meridian = "AM";
} else if (hours >= 12) {
meridian = "PM";
if (hours>12) hours -= 12;
}
hours = (" "+hours).substr(-2);
} }
var minutes = ("0" + d.getMinutes()).slice(-2);
g.setFont(font, timeFontSize); g.setFont(font, timeFontSize);
g.drawString(`${hours}:${minutes}`, xyCenter, yposTime, true); g.drawString(`${hours}:${minutes}`, xyCenter, yposTime, true);
if (is12Hour) {
g.setFont(font, gmtFontSize); g.setFont(font, gmtFontSize);
g.drawString(meridian, xyCenter + 102, yposTime + 10, true); g.drawString(locale.meridian(d), xyCenter + 102, yposTime + 10, true);
}
// draw Day, name of month, Date // draw Day, name of month, Date
var date = [da[0], da[1], da[2]].join(" ");
g.setFont(font, dateFontSize); g.setFont(font, dateFontSize);
g.drawString([locale.dow(d,1), locale.month(d,1), d.getDate()].join(" "), xyCenter, yposDate, true);
g.drawString(date, xyCenter, yposDate, true);
// draw year // draw year
g.setFont(font, dateFontSize); g.setFont(font, dateFontSize);
g.drawString(d.getFullYear(), xyCenter, yposYear, true); g.drawString(d.getFullYear(), xyCenter, yposYear, true);
// draw gmt // draw gmt
var gmt = da[5];
g.setFont(font, gmtFontSize); g.setFont(font, gmtFontSize);
g.drawString(gmt, xyCenter, yposGMT, true); g.drawString(d.toString().match(/GMT[+-]\d+/), xyCenter, yposGMT, true);
} }
// handle switch display on by pressing BTN1 // handle switch display on by pressing BTN1

View File

@ -4,3 +4,4 @@
0.04: Complete rewrite to add animation and loop ( issue #210 ) 0.04: Complete rewrite to add animation and loop ( issue #210 )
0.05: Improve perf 0.05: Improve perf
0.06: Complete rewrite in 80x80, better perf, add settings 0.06: Complete rewrite in 80x80, better perf, add settings
0.07: Added suppport for Bangle 2, added README file

22
apps/toucher/README.md Normal file
View File

@ -0,0 +1,22 @@
# Toucher - A touch based launcher, swipe left, swipe right, tap to launch
* Designed specifically for Bangle 1 and Bangle 2
## Installation
- Use the App loader to install toucher
- Then delete the existing launcher
- When you restart the new launcher will be loaded
- To return to the default launcher, delete toucher and install the default launcher.
## Bangle 1
In the settings menu 'Low Res' refers to setting the Bangle 1 screen into 80x80 mode.
This significantly improves the animation performance.
## Bangle 2
The Hires/Lowres settings is ignored.
Touch the top third of the screen to launch the selected app.
Press button 1 to launch the selected app.
## Screenshots
![](screenshot1.jpg)

View File

@ -7,8 +7,11 @@ let settings = Storage.readJSON(filename,1) || {
debug: false debug: false
}; };
if(!settings.highres) Bangle.setLCDMode("80x80"); // this means that setFont('6x8',1) is actually setFont('6x8',3)
else Bangle.setLCDMode(); if (process.env.HWVERSION == 1) {
if(!settings.highres) Bangle.setLCDMode("80x80");
else Bangle.setLCDMode();
}
g.clear(); g.clear();
g.flip(); g.flip();
@ -23,7 +26,7 @@ const ORIGINAL_ICON_SIZE = 48;
const STATE = { const STATE = {
settings_open: false, settings_open: false,
index: 0, index: 0,
target: 240, target: g.getWidth(),
offset: 0 offset: 0
}; };
@ -63,7 +66,7 @@ const APPS = getApps();
function noIcon(x, y, scale){ function noIcon(x, y, scale){
if(scale < 0.2) return; if(scale < 0.2) return;
g.setColor(scale, scale, scale); g.setColor(g.theme.fg);
g.setFontAlign(0,0); g.setFontAlign(0,0);
g.setFont('6x8',settings.highres ? 6:3); g.setFont('6x8',settings.highres ? 6:3);
g.drawString('x_x', x+1.5, y); g.drawString('x_x', x+1.5, y);
@ -81,23 +84,24 @@ function render(){
g.clear(); g.clear();
const visibleApps = APPS.filter(app => app.x >= STATE.offset-HALF && app.x <= STATE.offset+WIDTH-HALF ); const visibleApps = APPS.filter(app => app.x >= STATE.offset-HALF && app.x <= STATE.offset+WIDTH-HALF );
visibleApps.forEach(app => { let cycle = 0;
let lastCycle = visibleApps.length;
const x = app.x+HALF-STATE.offset; visibleApps.forEach(app => {
const y = HALF - (HALF*0.3); cycle++;
const x = app.x + HALF - STATE.offset;
const y = HALF;
let dist = HALF - x; let dist = HALF - x;
if(dist < 0) dist *= -1; if(dist < 0) dist *= -1;
const scale = 1 - (dist / HALF); const scale = 1 - (dist / HALF);
if(!scale) return; if(!scale) return;
if(app.special){ if(app.special){
const font = settings.highres ? '6x8' : '4x6'; const fontSize = (process.env.HWVERSION == 2) ? 4 : (settings.highres ? 6 : 2);
const fontSize = settings.highres ? 2 : 1; g.setFont('6x8', fontSize);
g.setFont(font, fontSize); g.setColor(g.theme.fg);
g.setColor(scale,scale,scale);
g.setFontAlign(0,0); g.setFontAlign(0,0);
g.drawString(app.name, HALF, HALF); g.drawString(app.name, HALF, HALF);
return; return;
@ -111,26 +115,69 @@ function render(){
if(icon){ if(icon){
icons[app.name] = icon; icons[app.name] = icon;
try { try {
const rescale = settings.highres ? scale*ORIGINAL_ICON_SIZE : (scale*(ORIGINAL_ICON_SIZE/2)); let rescale;
const imageScale = settings.highres ? scale*2 : scale; let imageScale;
if (process.env.HWVERSION == 1) {
// on a bangle 1 !highres means 80x80
rescale = settings.highres ? scale*ORIGINAL_ICON_SIZE : (scale*(ORIGINAL_ICON_SIZE/2));
imageScale = settings.highres ? scale*2 : scale;
} else {
// !highres mode is meaningless on a bangle 2 at present
rescale = 1.25*scale*ORIGINAL_ICON_SIZE;
imageScale = 2.5*scale;
}
g.drawImage(icon, x-rescale, y-rescale, { scale: imageScale }); g.drawImage(icon, x-rescale, y-rescale, { scale: imageScale });
} catch(e){ } catch(e) {
noIcon(x, y, scale); noIcon(x, y, scale);
} }
}else{ } else {
noIcon(x, y, scale); noIcon(x, y, scale);
} }
//draw text //draw text
g.setColor(scale,scale,scale); g.setColor(g.theme.fg);
if(scale > 0.1){
const font = settings.highres ? '6x8': '4x6'; if (cycle == 2 && scale > 0.1) {
const fontSize = settings.highres ? 2 : 1; let fontSize = (process.env.HWVERSION == 2) ? 2 : 1;
g.setFont(font, fontSize); if (process.env.HWVERSION == 1) {
g.setFontAlign(0,0); fontSize = (settings.highres) ? 3 : 1;
g.drawString(app.name, HALF, HEIGHT/4*3);
} }
if (app.name.length <= 12) {
g.setFont("6x8", fontSize);
g.setFontAlign(0,1);
g.drawString(app.name, HALF, HEIGHT);
} else {
// some app names are too long for one line
var name = app.name;
var first = name.substring(0, name.indexOf(" "));
var last = name.substring(name.indexOf(" ") + 1, name.length);
// all this to handle long names like
// Simple 7 Segment Clock
if (last.length > 12 && process.env.HWVERSION == 1) {
g.setFont((settings.highres ? "6x8" : "4x6"),(settings.highres ? 2 : 1) );
} else {
g.setFont("6x8", fontSize);
}
g.setFontAlign(0,-1);
g.drawString(first, HALF, 0);
if (last.length > 12 && process.env.HWVERSION == 1) {
g.setFont((settings.highres ? "6x8" : "4x6"),(settings.highres ? 2 : 1) );
} else {
g.setFont("6x8", fontSize);
}
g.setFontAlign(0,1);
g.drawString(last, HALF, HEIGHT);
}
}
/*
if(settings.highres){ if(settings.highres){
const type = app.type ? app.type : 'App'; const type = app.type ? app.type : 'App';
const version = app.version ? app.version : '0.00'; const version = app.version ? app.version : '0.00';
@ -138,18 +185,21 @@ function render(){
g.setFontAlign(0,1); g.setFontAlign(0,1);
g.setFont('6x8', 1.5); g.setFont('6x8', 1.5);
g.setColor(scale,scale,scale); g.setColor(scale,scale,scale);
g.drawString(info, HALF, 215, { scale: scale }); g.drawString(info, HALF, HEIGHT/8*7, { scale: scale });
} }
*/
}); });
const duration = Math.floor(Date.now()-start); const duration = Math.floor(Date.now()-start);
if(settings.debug){ if(settings.debug){
g.setFontAlign(0,1); g.setFontAlign(0,1);
g.setColor(0, 1, 0); g.setColor(g.theme.fgH);
const fontSize = settings.highres ? 2 : 1; const fontSize = (process.env.HWVERSION == 2) ? 2 : (settings.highres ? 2 : 1);
g.setFont('4x6',fontSize); g.setFont(((process.env.HWVERSION == 2) ? '6x8' : (settings.highres ? '6x8' :'4x6')), fontSize);
g.drawString('Render: '+duration+'ms', HALF, HEIGHT); // steal the bottom line, and print the duration
g.clearRect(0, HEIGHT - (process.env.HWVERSION == 1 && !settings.highres ? 8 : 24), WIDTH, HEIGHT);
g.drawString('Render: '+duration+' ms', HALF, HEIGHT);
} }
g.flip(); g.flip();
if(STATE.offset == STATE.target) return; if(STATE.offset == STATE.target) return;
@ -202,7 +252,7 @@ function run(){
E.showMessage("App Source\nNot found"); E.showMessage("App Source\nNot found");
setTimeout(render, 2000); setTimeout(render, 2000);
} else { } else {
Bangle.setLCDMode(); if (process.env.HWVERSION == 1) Bangle.setLCDMode();
g.clear(); g.clear();
g.flip(); g.flip();
E.showMessage("Loading..."); E.showMessage("Loading...");
@ -211,8 +261,9 @@ function run(){
} }
// Screen event if (process.env.HWVERSION == 1) {
Bangle.on('touch', function(button){ // Screen event
Bangle.on('touch', function(button){
if(STATE.settings_open) return; if(STATE.settings_open) return;
switch(button){ switch(button){
case 1: case 1:
@ -225,7 +276,16 @@ Bangle.on('touch', function(button){
run(); run();
break; break;
} }
}); });
}
if (process.env.HWVERSION == 2) {
// tap at top 1/3 of screen to launch app
Bangle.on('touch', function(button, xy) {
if (xy.y < HEIGHT / 3)
run();
});
}
Bangle.on('swipe', dir => { Bangle.on('swipe', dir => {
if(STATE.settings_open) return; if(STATE.settings_open) return;
@ -238,9 +298,12 @@ Bangle.on('lcdPower', on => {
if(!on) return load(); if(!on) return load();
}); });
if (process.env.HWVERSION == 1) {
setWatch(prev, BTN1, { repeat: true }); setWatch(prev, BTN1, { repeat: true });
setWatch(next, BTN3, { repeat: true }); setWatch(next, BTN3, { repeat: true });
setWatch(run, BTN2, { repeat:true }); setWatch(run, BTN2, { repeat:true });
} else {
setWatch(run, BTN1, { repeat:true });
}
jumpTo(1); jumpTo(1);

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB