timeout to clock copied from Icon Launcher

master
thyttan 2022-11-06 19:53:28 +01:00
parent 84837228f9
commit a46c76a2ff
2 changed files with 202 additions and 180 deletions

View File

@ -1,180 +1,189 @@
{ // must be inside our own scope here so that when we are unloaded everything disappears { // must be inside our own scope here so that when we are unloaded everything disappears
/* Desktop launcher
*
*/
let settings = Object.assign({
showClocks: true,
showLaunchers: true,
direct: false,
oneClickExit:false,
swipeExit: false,
}, require('Storage').readJSON("dtlaunch.json", true) || {});
if (settings.oneClickExit) {
var buttonWatch = setWatch(_=> returnToClock, BTN1);
}
let s = require("Storage");
var apps = s.list(/\.info$/).map(app=>{
let a=s.readJSON(app,1);
return a && {
name:a.name, type:a.type, icon:a.icon, sortorder:a.sortorder, src:a.src
};}).filter(
app=>app && (app.type=="app" || (app.type=="clock" && settings.showClocks) || (app.type=="launch" && settings.showLaunchers) || !app.type));
apps.sort((a,b)=>{ /* Desktop launcher
let n=(0|a.sortorder)-(0|b.sortorder); *
if (n) return n; // do sortorder first */
if (a.name<b.name) return -1;
if (a.name>b.name) return 1; let settings = Object.assign({
return 0; showClocks: true,
}); showLaunchers: true,
apps.forEach(app=>{ direct: false,
if (app.icon) oneClickExit: false,
app.icon = s.read(app.icon); // should just be a link to a memory area swipeExit: false,
timeOut: "Off"
}, require('Storage').readJSON("dtlaunch.json", true) || {});
if (settings.oneClickExit) {
var buttonWatch = setWatch(_=> returnToClock, BTN1);
}
// taken from Icon Launcher with minor alterations
if (settings.timeOut!="Off"){
let time=parseInt(settings.timeOut); //the "s" will be trimmed by the parseInt
var timeoutToClock = setTimeout(returnToClock,time*1000);
}
let s = require("Storage");
var apps = s.list(/\.info$/).map(app=>{
let a=s.readJSON(app,1);
return a && {
name:a.name, type:a.type, icon:a.icon, sortorder:a.sortorder, src:a.src
};}).filter(
app=>app && (app.type=="app" || (app.type=="clock" && settings.showClocks) || (app.type=="launch" && settings.showLaunchers) || !app.type));
apps.sort((a,b)=>{
let n=(0|a.sortorder)-(0|b.sortorder);
if (n) return n; // do sortorder first
if (a.name<b.name) return -1;
if (a.name>b.name) return 1;
return 0;
}); });
apps.forEach(app=>{
let Napps = apps.length; if (app.icon)
let Npages = Math.ceil(Napps/4); app.icon = s.read(app.icon); // should just be a link to a memory area
let maxPage = Npages-1; });
let selected = -1;
let oldselected = -1; let Napps = apps.length;
let page = 0; let Npages = Math.ceil(Napps/4);
const XOFF = 24; let maxPage = Npages-1;
const YOFF = 30; let selected = -1;
let oldselected = -1;
let drawIcon= function(p,n,selected) { let page = 0;
let x = (n%2)*72+XOFF; const XOFF = 24;
let y = n>1?72+YOFF:YOFF; const YOFF = 30;
(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); let drawIcon= function(p,n,selected) {
g.setColor(g.theme.fg); let x = (n%2)*72+XOFF;
try{g.drawImage(apps[p*4+n].icon,x+12,y+4);} catch(e){} let y = n>1?72+YOFF:YOFF;
g.setFontAlign(0,-1,0).setFont("6x8",1); (selected?g.setColor(g.theme.fgH):g.setColor(g.theme.bg)).fillRect(x+11,y+3,x+60,y+52);
let txt = apps[p*4+n].name.replace(/([a-z])([A-Z])/g, "$1 $2").split(" "); g.clearRect(x+12,y+4,x+59,y+51);
let lineY = 0; g.setColor(g.theme.fg);
let line = ""; try{g.drawImage(apps[p*4+n].icon,x+12,y+4);} catch(e){}
while (txt.length > 0){ g.setFontAlign(0,-1,0).setFont("6x8",1);
let c = txt.shift(); let txt = apps[p*4+n].name.replace(/([a-z])([A-Z])/g, "$1 $2").split(" ");
if (c.length + 1 + line.length > 13){ let lineY = 0;
if (line.length > 0){ let line = "";
g.drawString(line.trim(),x+36,y+54+lineY*8); while (txt.length > 0){
lineY++; let c = txt.shift();
if (c.length + 1 + line.length > 13){
if (line.length > 0){
g.drawString(line.trim(),x+36,y+54+lineY*8);
lineY++;
}
line = c;
} else {
line += " " + c;
} }
line = c;
} else {
line += " " + c;
} }
} g.drawString(line.trim(),x+36,y+54+lineY*8);
g.drawString(line.trim(),x+36,y+54+lineY*8); };
};
let drawPage = function(p){
g.reset();
g.clearRect(0,24,175,175);
let O = 88+YOFF/2-12*(Npages/2);
for (let j=0;j<Npages;j++){
let y = O+j*12;
g.setColor(g.theme.fg);
if (j==page) g.fillCircle(XOFF/2,y,4);
else g.drawCircle(XOFF/2,y,4);
}
for (let i=0;i<4;i++) {
if (!apps[p*4+i]) return i;
drawIcon(p,i,selected==i && !settings.direct);
}
g.flip();
};
Bangle.loadWidgets(); let drawPage = function(p){
//g.clear(); g.reset();
Bangle.drawWidgets(); g.clearRect(0,24,175,175);
drawPage(0); let O = 88+YOFF/2-12*(Npages/2);
for (let j=0;j<Npages;j++){
let swipeListenerDt = function(dirLeftRight, dirUpDown){ let y = O+j*12;
selected = 0; g.setColor(g.theme.fg);
oldselected=-1; if (j==page) g.fillCircle(XOFF/2,y,4);
if(settings.swipeExit && dirLeftRight==1) returnToClock(); else g.drawCircle(XOFF/2,y,4);
if (dirUpDown==-1||dirLeftRight==-1){ }
++page; if (page>maxPage) page=0; for (let i=0;i<4;i++) {
drawPage(page); if (!apps[p*4+i]) return i;
} else if (dirUpDown==1||(dirLeftRight==1 && !settings.swipeExit)){ drawIcon(p,i,selected==i && !settings.direct);
--page; if (page<0) page=maxPage; }
drawPage(page); g.flip();
} };
};
Bangle.on("swipe",swipeListenerDt); Bangle.loadWidgets();
//g.clear();
let isTouched = function(p,n){ Bangle.drawWidgets();
if (n<0 || n>3) return false; drawPage(0);
let x1 = (n%2)*72+XOFF; let y1 = n>1?72+YOFF:YOFF;
let x2 = x1+71; let y2 = y1+81; let swipeListenerDt = function(dirLeftRight, dirUpDown){
return (p.x>x1 && p.y>y1 && p.x<x2 && p.y<y2); selected = 0;
}; oldselected=-1;
if(settings.swipeExit && dirLeftRight==1) returnToClock();
let touchListenerDt = function(_,p){ if (dirUpDown==-1||dirLeftRight==-1){
let i; ++page; if (page>maxPage) page=0;
for (i=0;i<4;i++){ drawPage(page);
if((page*4+i)<Napps){ } else if (dirUpDown==1||(dirLeftRight==1 && !settings.swipeExit)){
if (isTouched(p,i)) { --page; if (page<0) page=maxPage;
drawIcon(page,i,true && !settings.direct); drawPage(page);
if (selected>=0 || settings.direct) { }
if (selected!=i && !settings.direct){ };
drawIcon(page,selected,false); Bangle.on("swipe",swipeListenerDt);
} else {
load(apps[page*4+i].src); let isTouched = function(p,n){
} if (n<0 || n>3) return false;
} let x1 = (n%2)*72+XOFF; let y1 = n>1?72+YOFF:YOFF;
selected=i; let x2 = x1+71; let y2 = y1+81;
break; return (p.x>x1 && p.y>y1 && p.x<x2 && p.y<y2);
} };
}
} let touchListenerDt = function(_,p){
if ((i==4 || (page*4+i)>Napps) && selected>=0) { let i;
drawIcon(page,selected,false); for (i=0;i<4;i++){
selected=-1; if((page*4+i)<Napps){
} if (isTouched(p,i)) {
}; drawIcon(page,i,true && !settings.direct);
Bangle.on("touch",touchListenerDt); if (selected>=0 || settings.direct) {
if (selected!=i && !settings.direct){
drawIcon(page,selected,false);
} else {
load(apps[page*4+i].src);
}
}
selected=i;
break;
}
}
}
if ((i==4 || (page*4+i)>Napps) && selected>=0) {
drawIcon(page,selected,false);
selected=-1;
}
};
Bangle.on("touch",touchListenerDt);
const returnToClock = function() {
Bangle.setUI();
clearWatch(buttonWatch);
delete buttonWatch;
clearTimeout(timeoutToClock);
delete timeoutToClock;
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;
delete drawIcon;
delete drawPage;
delete isTouched;
Bangle.removeListener("swipe", swipeListenerDt);
delete swipeListenerDt;
Bangle.removeListener("touch", touchListenerDt);
delete touchListenerDt;
var apps = [];
delete apps;
delete returnToClock;
delete settings;
setTimeout(eval, 0, s.read(".bootcde"));
};
const returnToClock = function() {
Bangle.setUI();
clearWatch(buttonWatch);
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;
delete drawIcon;
delete drawPage;
delete isTouched;
Bangle.removeListener("swipe", swipeListenerDt);
delete swipeListenerDt;
Bangle.removeListener("touch", touchListenerDt);
delete touchListenerDt;
var apps = [];
delete apps;
delete returnToClock;
delete settings;
setTimeout(eval, 0, s.read(".bootcde"));
};
} // end of app scope } // end of app scope

View File

@ -6,50 +6,63 @@
showLaunchers: true, showLaunchers: true,
direct: false, direct: false,
oneClickExit:false, oneClickExit:false,
swipeExit: false swipeExit: false,
timeOut: "Off"
}, require('Storage').readJSON(FILE, true) || {}); }, require('Storage').readJSON(FILE, true) || {});
function writeSettings() { function writeSettings() {
require('Storage').writeJSON(FILE, settings); require('Storage').writeJSON(FILE, settings);
} }
const timeOutChoices = [/*LANG*/"Off", "10s", "15s", "20s", "30s"];
E.showMenu({ E.showMenu({
"" : { "title" : "Desktop launcher" }, "" : { "title" : "Desktop launcher" },
"< Back" : () => back(), /*LANG*/"< Back" : () => back(),
'Show clocks': { /*LANG*/'Show clocks': {
value: settings.showClocks, value: settings.showClocks,
onchange: v => { onchange: v => {
settings.showClocks = v; settings.showClocks = v;
writeSettings(); writeSettings();
} }
}, },
'Show launchers': { /*LANG*/'Show launchers': {
value: settings.showLaunchers, value: settings.showLaunchers,
onchange: v => { onchange: v => {
settings.showLaunchers = v; settings.showLaunchers = v;
writeSettings(); writeSettings();
} }
}, },
'Direct launch': { /*LANG*/'Direct launch': {
value: settings.direct, value: settings.direct,
onchange: v => { onchange: v => {
settings.direct = v; settings.direct = v;
writeSettings(); writeSettings();
} }
}, },
'Swipe Exit': { /*LANG*/'Swipe Exit': {
value: settings.swipeExit, value: settings.swipeExit,
onchange: v => { onchange: v => {
settings.swipeExit = v; settings.swipeExit = v;
writeSettings(); writeSettings();
} }
}, },
'One click exit': { /*LANG*/'One click exit': {
value: settings.oneClickExit, value: settings.oneClickExit,
onchange: v => { onchange: v => {
settings.oneClickExit = v; settings.oneClickExit = v;
writeSettings(); writeSettings();
} }
} },
/*LANG*/'Time Out': {
value: timeOutChoices.indexOf(settings.timeOut),
min: 0,
max: timeOutChoices.length-1,
format: v => timeOutChoices[v],
onchange: m => {
settings.timeOut = m;
writeSettings();
}
},
}); });
}) })