diff --git a/apps/multitimer/ChangeLog b/apps/multitimer/ChangeLog index 27cfd17a5..b708a990f 100644 --- a/apps/multitimer/ChangeLog +++ b/apps/multitimer/ChangeLog @@ -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 diff --git a/apps/multitimer/app.js b/apps/multitimer/app.js index 677b971ef..079136431 100644 --- a/apps/multitimer/app.js +++ b/apps/multitimer/app.js @@ -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<",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< v ? dow |= 1< { @@ -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); +} diff --git a/apps/multitimer/metadata.json b/apps/multitimer/metadata.json index 1db3235a1..40d376986 100644 --- a/apps/multitimer/metadata.json +++ b/apps/multitimer/metadata.json @@ -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": [