Fast load to clockface on B2

master
thyttan 2022-11-06 15:15:42 +01:00
parent 5374b1af30
commit ffd85de635
3 changed files with 83 additions and 34 deletions

View File

@ -14,3 +14,4 @@
0.14: Don't move pages when doing exit swipe - Bangle 2. 0.14: Don't move pages when doing exit swipe - Bangle 2.
0.15: 'Swipe to exit'-code is slightly altered to be more reliable - Bangle 2. 0.15: 'Swipe to exit'-code is slightly altered to be more reliable - Bangle 2.
0.16: Use default Bangle formatter for booleans 0.16: Use default Bangle formatter for booleans
0.17: Bangle 2: Fast loading on exit to clock face

View File

@ -1,28 +1,31 @@
{ // must be inside our own scope here so that when we are unloaded everything disappears
/* Desktop launcher /* Desktop launcher
* *
*/ */
var settings = Object.assign({ let settings = Object.assign({
showClocks: true, showClocks: true,
showLaunchers: true, showLaunchers: true,
direct: false, direct: false,
oneClickExit:false, oneClickExit:false,
swipeExit: false swipeExit: false,
fastload: false,
}, require('Storage').readJSON("dtlaunch.json", true) || {}); }, require('Storage').readJSON("dtlaunch.json", true) || {});
if( settings.oneClickExit) if( settings.oneClickExit)
setWatch(_=> load(), BTN1); setWatch(_=> returnToClock, BTN1);
var s = require("Storage"); let s = require("Storage");
var apps = s.list(/\.info$/).map(app=>{ var apps = s.list(/\.info$/).map(app=>{
var a=s.readJSON(app,1); let a=s.readJSON(app,1);
return a && { return a && {
name:a.name, type:a.type, icon:a.icon, sortorder:a.sortorder, src:a.src name:a.name, type:a.type, icon:a.icon, sortorder:a.sortorder, src:a.src
};}).filter( };}).filter(
app=>app && (app.type=="app" || (app.type=="clock" && settings.showClocks) || (app.type=="launch" && settings.showLaunchers) || !app.type)); app=>app && (app.type=="app" || (app.type=="clock" && settings.showClocks) || (app.type=="launch" && settings.showLaunchers) || !app.type));
apps.sort((a,b)=>{ apps.sort((a,b)=>{
var n=(0|a.sortorder)-(0|b.sortorder); let n=(0|a.sortorder)-(0|b.sortorder);
if (n) return n; // do sortorder first if (n) return n; // do sortorder first
if (a.name<b.name) return -1; if (a.name<b.name) return -1;
if (a.name>b.name) return 1; if (a.name>b.name) return 1;
@ -33,28 +36,28 @@ apps.forEach(app=>{
app.icon = s.read(app.icon); // should just be a link to a memory area app.icon = s.read(app.icon); // should just be a link to a memory area
}); });
var Napps = apps.length; let Napps = apps.length;
var Npages = Math.ceil(Napps/4); let Npages = Math.ceil(Napps/4);
var maxPage = Npages-1; let maxPage = Npages-1;
var selected = -1; let selected = -1;
var oldselected = -1; let oldselected = -1;
var page = 0; let page = 0;
const XOFF = 24; const XOFF = 24;
const YOFF = 30; const YOFF = 30;
function draw_icon(p,n,selected) { function draw_icon(p,n,selected) {
var x = (n%2)*72+XOFF; let x = (n%2)*72+XOFF;
var y = n>1?72+YOFF:YOFF; let y = n>1?72+YOFF:YOFF;
(selected?g.setColor(g.theme.fgH):g.setColor(g.theme.bg)).fillRect(x+11,y+3,x+60,y+52); (selected?g.setColor(g.theme.fgH):g.setColor(g.theme.bg)).fillRect(x+11,y+3,x+60,y+52);
g.clearRect(x+12,y+4,x+59,y+51); g.clearRect(x+12,y+4,x+59,y+51);
g.setColor(g.theme.fg); g.setColor(g.theme.fg);
try{g.drawImage(apps[p*4+n].icon,x+12,y+4);} catch(e){} try{g.drawImage(apps[p*4+n].icon,x+12,y+4);} catch(e){}
g.setFontAlign(0,-1,0).setFont("6x8",1); g.setFontAlign(0,-1,0).setFont("6x8",1);
var txt = apps[p*4+n].name.replace(/([a-z])([A-Z])/g, "$1 $2").split(" "); let txt = apps[p*4+n].name.replace(/([a-z])([A-Z])/g, "$1 $2").split(" ");
var lineY = 0; let lineY = 0;
var line = ""; let line = "";
while (txt.length > 0){ while (txt.length > 0){
var c = txt.shift(); let c = txt.shift();
if (c.length + 1 + line.length > 13){ if (c.length + 1 + line.length > 13){
if (line.length > 0){ if (line.length > 0){
@ -72,24 +75,24 @@ function draw_icon(p,n,selected) {
function drawPage(p){ function drawPage(p){
g.reset(); g.reset();
g.clearRect(0,24,175,175); g.clearRect(0,24,175,175);
var O = 88+YOFF/2-12*(Npages/2); let O = 88+YOFF/2-12*(Npages/2);
for (var j=0;j<Npages;j++){ for (let j=0;j<Npages;j++){
var y = O+j*12; let y = O+j*12;
g.setColor(g.theme.fg); g.setColor(g.theme.fg);
if (j==page) g.fillCircle(XOFF/2,y,4); if (j==page) g.fillCircle(XOFF/2,y,4);
else g.drawCircle(XOFF/2,y,4); else g.drawCircle(XOFF/2,y,4);
} }
for (var i=0;i<4;i++) { for (let i=0;i<4;i++) {
if (!apps[p*4+i]) return i; if (!apps[p*4+i]) return i;
draw_icon(p,i,selected==i && !settings.direct); draw_icon(p,i,selected==i && !settings.direct);
} }
g.flip(); g.flip();
} }
Bangle.on("swipe",(dirLeftRight, dirUpDown)=>{ function swipeListenerDt(dirLeftRight, dirUpDown){
selected = 0; selected = 0;
oldselected=-1; oldselected=-1;
if(settings.swipeExit && dirLeftRight==1) load(); if(settings.swipeExit && dirLeftRight==1) returnToClock();
if (dirUpDown==-1||dirLeftRight==-1){ if (dirUpDown==-1||dirLeftRight==-1){
++page; if (page>maxPage) page=0; ++page; if (page>maxPage) page=0;
drawPage(page); drawPage(page);
@ -97,17 +100,18 @@ Bangle.on("swipe",(dirLeftRight, dirUpDown)=>{
--page; if (page<0) page=maxPage; --page; if (page<0) page=maxPage;
drawPage(page); drawPage(page);
} }
}); }
Bangle.on("swipe",swipeListenerDt);
function isTouched(p,n){ function isTouched(p,n){
if (n<0 || n>3) return false; if (n<0 || n>3) return false;
var x1 = (n%2)*72+XOFF; var y1 = n>1?72+YOFF:YOFF; let x1 = (n%2)*72+XOFF; let y1 = n>1?72+YOFF:YOFF;
var x2 = x1+71; var y2 = y1+81; let x2 = x1+71; let y2 = y1+81;
return (p.x>x1 && p.y>y1 && p.x<x2 && p.y<y2); return (p.x>x1 && p.y>y1 && p.x<x2 && p.y<y2);
} }
Bangle.on("touch",(_,p)=>{ function touchListenerDt(_,p){
var i; let i;
for (i=0;i<4;i++){ for (i=0;i<4;i++){
if((page*4+i)<Napps){ if((page*4+i)<Napps){
if (isTouched(p,i)) { if (isTouched(p,i)) {
@ -116,7 +120,7 @@ Bangle.on("touch",(_,p)=>{
if (selected!=i && !settings.direct){ if (selected!=i && !settings.direct){
draw_icon(page,selected,false); draw_icon(page,selected,false);
} else { } else {
load(apps[page*4+i].src); loadApp(apps[page*4+i].src);
} }
} }
selected=i; selected=i;
@ -128,9 +132,53 @@ Bangle.on("touch",(_,p)=>{
draw_icon(page,selected,false); draw_icon(page,selected,false);
selected=-1; selected=-1;
} }
}); }
Bangle.on("touch",touchListenerDt);
const returnToClock = function() { // Delete virtually everything, don't know if some deletes are unnecessary.
Bangle.setUI();
if (watch) clearWatch(watch);
delete s;
delete a;
delete n;
delete Napps;
delete Npages;
delete maxPage;
delete selected;
delete oldselected;
delete page;
delete XOFF;
delete YOFF;
delete x;
delete y;
delete txt;
delete lineY;
delete line;
delete c;
delete O;
delete x1;
delete x2;
delete i;
Bangle.removeListener("swipe", swipeListenerDt);
Bangle.removeListener("touch", touchListenerDt);
var apps = [];
delete apps;
delete returnToClock;
delete settings;
delete watch;
delete loadApp;
setTimeout(eval, 0, s.read(".bootcde"));
};
let watch;
let loadApp;
loadApp = function(name) {
load(name);
};
Bangle.loadWidgets(); Bangle.loadWidgets();
g.clear(); g.clear();
Bangle.drawWidgets(); Bangle.drawWidgets();
drawPage(0); drawPage(0);
} // end of app scope

View File

@ -1,7 +1,7 @@
{ {
"id": "dtlaunch", "id": "dtlaunch",
"name": "Desktop Launcher", "name": "Desktop Launcher",
"version": "0.16", "version": "0.17",
"description": "Desktop style App Launcher with six (four for Bangle 2) apps per page - fast access if you have lots of apps installed.", "description": "Desktop style App Launcher with six (four for Bangle 2) apps per page - fast access if you have lots of apps installed.",
"screenshots": [{"url":"shot1.png"},{"url":"shot2.png"},{"url":"shot3.png"}], "screenshots": [{"url":"shot1.png"},{"url":"shot2.png"},{"url":"shot3.png"}],
"icon": "icon.png", "icon": "icon.png",