Merge pull request #2879 from bobrippling/multitimer-fastload

multitimer: fastload
pull/2894/head
Gordon Williams 2023-07-20 11:50:01 +01:00 committed by GitHub
commit 8c4deb5388
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 71 additions and 52 deletions

View File

@ -3,3 +3,4 @@
0.03: Use default Bangle formatter for booleans
0.04: Remove copied sched alarm.js & import newer features (oneshot alarms)
0.05: Fix creating new alarms/timers in hardmode
0.06: Support fastloading

View File

@ -1,11 +1,12 @@
{
Bangle.loadWidgets();
Bangle.drawWidgets();
var R = Bangle.appRect;
var layer;
var drag;
var timerInt1 = [];
var timerInt2 = [];
const R = Bangle.appRect;
let layer;
let drag;
let timerInt1 = [];
let timerInt2 = [];
function getCurrentTime() {
let time = new Date();
@ -66,8 +67,7 @@ function setHM(alarm, on) {
function drawTimers() {
layer = 0;
var timers = require("sched").getAlarms().filter(a => a.timer && a.appid == "multitimer");
var alarms = require("sched").getAlarms();
const timers = require("sched").getAlarms().filter(a => a.timer && a.appid == "multitimer");
function updateTimers(idx) {
if (!timerInt1[idx]) timerInt1[idx] = setTimeout(function() {
@ -78,15 +78,15 @@ function drawTimers() {
}, 1000 - (timers[idx].t % 1000));
}
var s = E.showScroller({
E.showScroller({
h : 40, c : timers.length+2,
back : function() {load();},
draw : (idx, r) => {
function drawMenuItem(a) {
let msg = "";
g.setClipRect(R.x,R.y,R.x2,R.y2);
if (idx > 0 && timers[idx-1].msg) msg = "\n"+(timers[idx-1].msg.length > 10 ?
timers[idx-1].msg.substring(0, 10)+"..." : timers[idx-1].msg);
else msg = "";
return g.setColor(g.theme.bg2).fillRect({x:r.x+4,y:r.y+2,w:r.w-8, h:r.h-4, r:5})
.setColor(g.theme.fg2).setFont("6x8:2").setFontAlign(-1,0).drawString(a+msg,r.x+12,r.y+(r.h/2));
}
@ -112,22 +112,22 @@ function drawTimers() {
else if (idx > 0 && idx < timers.length+1) timerMenu(idx-1);
}
});
setUI();
}
function timerMenu(idx) {
layer = -1;
var timers = require("sched").getAlarms();
var timerIdx = [];
var j = 0;
const timers = require("sched").getAlarms();
const timerIdx = [];
let a;
for (let i = 0; i < timers.length; i++) {
if (timers[i].timer && timers[i].appid == "multitimer") {
a = i;
timerIdx.push(a);
j++;
}
}
var a = timers[timerIdx[idx]];
var msg = "";
a = timers[timerIdx[idx]];
function updateTimer() {
if (timerInt1[0] == undefined) timerInt1[0] = setTimeout(function() {
@ -138,7 +138,7 @@ function timerMenu(idx) {
}, 1000 - (a.t % 1000));
}
var s = E.showScroller({
E.showScroller({
h : 40, c : 5,
back : function() {
clearInt();
@ -153,6 +153,7 @@ function timerMenu(idx) {
}
if (i == 0) {
let msg = "";
if (a.msg) msg = "\n"+(a.msg.length > 10 ? a.msg.substring(0, 10)+"..." : a.msg);
if (a.on == true) {
drawMenuItem(formatTime(a.t-getCurrentTime())+msg);
@ -220,15 +221,12 @@ function timerMenu(idx) {
function editTimer(idx, a) {
layer = -1;
var timers = require("sched").getAlarms().filter(a => a.timer && a.appid == "multitimer");
var alarms = require("sched").getAlarms();
var timerIdx = [];
var j = 0;
const timers = require("sched").getAlarms().filter(a => a.timer && a.appid == "multitimer");
const alarms = require("sched").getAlarms();
const timerIdx = [];
for (let i = 0; i < alarms.length; i++) {
if (alarms[i].timer && alarms[i].appid == "multitimer") {
b = i;
timerIdx.push(b);
j++;
timerIdx.push(i);
}
}
if (!a) {
@ -238,9 +236,10 @@ function editTimer(idx, a) {
if (!a.data) {
a.data = { hm: false };
}
var t = decodeTime(a.timer);
const t = decodeTime(a.timer);
function editMsg(idx, a) {
let msg;
g.clear();
idx < 0 ? msg = "" : msg = a.msg;
require("textinput").input({text:msg}).then(result => {
@ -256,9 +255,10 @@ function editTimer(idx, a) {
E.showAlert("Must install keyboard app").then(function() {
editTimer(idx, a);
});
setUI();
}
var menu = {
const menu = {
"": { "title": "Timer" },
"< Back": () => {
a.t = getCurrentTime() + a.timer;
@ -312,7 +312,7 @@ function editTimer(idx, a) {
value: !a.msg ? "" : a.msg.length > 6 ? a.msg.substring(0, 6)+"..." : a.msg,
//menu glitch? setTimeout required here
onchange: () => {
var kbapp = require("Storage").read("textinput");
const kbapp = require("Storage").read("textinput");
if (kbapp != undefined) setTimeout(editMsg, 0, idx, a);
else setTimeout(kbAlert, 0);
}
@ -324,11 +324,12 @@ function editTimer(idx, a) {
};
E.showMenu(menu);
setUI();
}
function drawSw() {
layer = 1;
var sw = require("Storage").readJSON("multitimer.json", true) || [];
const sw = require("Storage").readJSON("multitimer.json", true) || [];
function updateTimers(idx) {
if (!timerInt1[idx]) timerInt1[idx] = setTimeout(function() {
@ -339,12 +340,13 @@ function drawSw() {
}, 1000 - (sw[idx].t % 1000));
}
var s = E.showScroller({
E.showScroller({
h : 40, c : sw.length+2,
back : function() {load();},
draw : (idx, r) => {
function drawMenuItem(a) {
let msg;
g.setClipRect(R.x,R.y,R.x2,R.y2);
if (idx > 0 && sw[idx-1].msg) msg = "\n"+(sw[idx-1].msg.length > 10 ?
sw[idx-1].msg.substring(0, 10)+"..." : sw[idx-1].msg);
@ -378,7 +380,7 @@ function drawSw() {
function swMenu(idx, a) {
layer = -1;
var sw = require("Storage").readJSON("multitimer.json", true) || [];
const sw = require("Storage").readJSON("multitimer.json", true) || [];
if (sw[idx]) a = sw[idx];
else {
a = {"t" : 0, "on" : false, "msg" : ""};
@ -397,7 +399,7 @@ function swMenu(idx, a) {
function editMsg(idx, a) {
g.clear();
msg = a.msg;
const msg = a.msg;
require("textinput").input({text:msg}).then(result => {
if (result != "") {
a.msg = result;
@ -413,9 +415,10 @@ function swMenu(idx, a) {
E.showAlert("Must install keyboard app").then(function() {
swMenu(idx, a);
});
setUI();
}
var s = E.showScroller({
E.showScroller({
h : 40, c : 5,
back : function() {
clearInt();
@ -430,6 +433,7 @@ function swMenu(idx, a) {
}
if (i == 0) {
let msg;
if (a.msg) msg = "\n"+(a.msg.length > 10 ? a.msg.substring(0, 10)+"..." : a.msg);
else msg = "";
if (a.on == true) {
@ -482,7 +486,7 @@ function swMenu(idx, a) {
//edit message
if (i == 3) {
clearInt();
var kbapp = require("Storage").read("textinput");
const kbapp = require("Storage").read("textinput");
if (kbapp != undefined) editMsg(idx, a);
else kbAlert();
}
@ -499,17 +503,17 @@ function swMenu(idx, a) {
function drawAlarms() {
layer = 2;
var alarms = require("sched").getAlarms().filter(a => !a.timer);
const alarms = require("sched").getAlarms().filter(a => !a.timer);
var s = E.showScroller({
E.showScroller({
h : 40, c : alarms.length+2,
back : function() {load();},
draw : (idx, r) => {
function drawMenuItem(a) {
g.setClipRect(R.x,R.y,R.x2,R.y2);
var on = "";
var dow = "";
let on = "";
let dow = "";
if (idx > 0 && alarms[idx-1].on == true) on = " - on";
else if (idx > 0 && alarms[idx-1].on == false) on = " - off";
if (idx > 0 && idx < alarms.length+1) dow = "\n"+"SMTWTFS".split("").map((d,n)=>alarms[idx-1].dow&(1<<n)?d:".").join("");
@ -525,7 +529,7 @@ function drawAlarms() {
.setColor(g.theme.fg).setFont("6x8:2").setFontAlign(0,0).drawString("< Swipe >",r.x+(r.w/2),r.y+(r.h/2));
}
else if (idx > 0 && idx < alarms.length+1){
var str = formatTime(alarms[idx-1].t);
const str = formatTime(alarms[idx-1].t);
drawMenuItem(str.slice(0, -3));
}
},
@ -542,26 +546,24 @@ function editDOW(dow, onchange) {
'': { 'title': 'Days of Week' },
'< Back' : () => onchange(dow)
};
for (var i = 0; i < 7; i++) (i => {
var dayOfWeek = require("locale").dow({ getDay: () => i });
for (let i = 0; i < 7; i++) (i => {
const dayOfWeek = require("locale").dow({ getDay: () => i });
menu[dayOfWeek] = {
value: !!(dow&(1<<i)),
onchange: v => v ? dow |= 1<<i : dow &= ~(1<<i),
};
})(i);
E.showMenu(menu);
setUI();
}
function editAlarm(idx, a) {
layer = -1;
var alarms = require("sched").getAlarms();
var alarmIdx = [];
var j = 0;
const alarms = require("sched").getAlarms();
const alarmIdx = [];
for (let i = 0; i < alarms.length; i++) {
if (!alarms[i].timer) {
b = i;
alarmIdx.push(b);
j++;
alarmIdx.push(i);
}
}
if (!a) {
@ -571,9 +573,10 @@ function editAlarm(idx, a) {
if (!a.data) {
a.data = { hm: false };
}
var t = decodeTime(a.t);
const t = decodeTime(a.t);
function editMsg(idx, a) {
let msg;
g.clear();
idx < 0 ? msg = "" : msg = a.msg;
require("textinput").input({text:msg}).then(result => {
@ -589,9 +592,10 @@ function editAlarm(idx, a) {
E.showAlert("Must install keyboard app").then(function() {
editAlarm(idx, a);
});
setUI();
}
var menu = {
const menu = {
"": { "title": "Alarm" },
"< Back": () => {
if (idx >= 0) alarms[alarmIdx[idx]] = a;
@ -646,7 +650,7 @@ function editAlarm(idx, a) {
value: !a.msg ? "" : a.msg.length > 6 ? a.msg.substring(0, 6)+"..." : a.msg,
//menu glitch? setTimeout required here
onchange: () => {
var kbapp = require("Storage").read("textinput");
const kbapp = require("Storage").read("textinput");
if (kbapp != undefined) setTimeout(editMsg, 0, idx, a);
else setTimeout(kbAlert, 0);
}
@ -662,11 +666,20 @@ function editAlarm(idx, a) {
};
E.showMenu(menu);
setUI();
}
drawTimers();
function setUI() {
// E.showMenu/E.showScroller/E.showAlert call setUI, so we register onDrag() separately
// and tack on uiRemove after the fact to avoid interfering
Bangle.uiRemove = () => {
Bangle.removeListener("drag", onDrag);
Object.values(timerInt1).forEach(clearTimeout);
Object.values(timerInt2).forEach(clearTimeout);
};
}
Bangle.on("drag", e=>{
function onDrag(e) {
if (layer < 0) return;
if (!drag) { // start dragging
drag = {x: e.x, y: e.y};
@ -687,4 +700,9 @@ Bangle.on("drag", e=>{
else if (layer == 2) drawAlarms();
}
}
});
}
drawTimers();
Bangle.on("drag", onDrag);
}

View File

@ -1,7 +1,7 @@
{
"id": "multitimer",
"name": "Multi Timer",
"version": "0.05",
"version": "0.06",
"description": "Set timers and chronographs (stopwatches) and watch them count down in real time. Pause, create, edit, and delete timers and chronos, and add custom labels/messages. Also sets alarms.",
"icon": "app.png",
"screenshots": [