diff --git a/apps/mtimer/mtimer.app.js b/apps/mtimer/mtimer.app.js index f2a83dbc6..8727983d7 100644 --- a/apps/mtimer/mtimer.app.js +++ b/apps/mtimer/mtimer.app.js @@ -1,6 +1,6 @@ { - // Bangle.loadWidgets(); - // Bangle.drawWidgets(); + Bangle.loadWidgets(); + require("widget_utils").hide(); const resetImg = require("heatshrink").decompress(atob("kkkwIJGgwCBhkP/4EB4f//gIB/8P+EA/+Ah4BB8EAvkA/EAgPgh4EBh4RCgFwDAUHAwIABnADCgPAAgUcBBY9BAYUOuAEC8YDChgkCgPDFoUcBA88EgUDwJUBgF4hwDBg8AJYICBJoUegE+BgPAgPwgJkC+CCCn//J4X/DgUAsCbFA==")); const deleteImg = require("heatshrink").decompress(atob("mUywIROgP/8AGD//8AocwgYFDhkA4AFCBQMwAgMH/4ACwAjBAAQmBjAVCsEAgwFCBIMBwAFBBIQOBBIYYssEBwIYCjkA8AYCgeAuAYDuE4DAcOjgxDgPOGIk/GIkHwAYDgPgJQihBDAdzwAYDnFwDAcchwYDAgPADAUHgE4DARaBgyV1DBTzD/AIBAoRxBABgA==")); @@ -27,43 +27,7 @@ let numActiveAlarms = 0; let mode = "timer"; // "timer" or "alarm" - const loadAlarmsAndTimers = function() { - sched.reload(); - alarms = sched.getAlarms(); - timerIndexes = []; - alarmIndexes = []; - numActiveTimers = 0; - numActiveAlarms = 0; - if (alarms.length > 0) { - for (let i = alarms.length - 1; i >= 0; i--) { - if (alarms[i].appid === appId) { - if (alarms[i].timer != undefined) { - timerIndexes.push(i); - if (alarms[i].on === true) numActiveTimers++; - } else { - alarmIndexes.push(i); - if (alarms[i].on === true) numActiveAlarms++; - } - } - } - } - }; - loadAlarmsAndTimers(); - - const saveAlarms = function() { - sched.setAlarms(alarms); - sched.reload(); - }; - - const getTimer = function(idx) { - return alarms[timerIndexes[idx]]; - }; - - const getAlarm = function(idx) { - return alarms[alarmIndexes[idx]]; - }; - - const hms2ms = function(hms) { + const hms2ms = function(hms) { let t = (hms.h * 3600000) + (hms.m * 60000) + (hms.s * 1000); if (hms.meridiem === "PM") { t += (3600000 * 12); // add 12 hours if we are p.m. @@ -102,7 +66,38 @@ } }; - const getCurrentTime = function() { +// Common: + const loadAlarmsAndTimers = function() { + sched.reload(); + alarms = sched.getAlarms(); + timerIndexes = []; + alarmIndexes = []; + numActiveTimers = 0; + numActiveAlarms = 0; + if (alarms.length > 0) { + for (let i = alarms.length - 1; i >= 0; i--) { + if (alarms[i].appid === appId) { + if (alarms[i].timer != undefined) { + timerIndexes.push(i); + if (alarms[i].on === true) numActiveTimers++; + } else { + alarmIndexes.push(i); + if (alarms[i].on === true) numActiveAlarms++; + } + } + } + } + }; + loadAlarmsAndTimers(); + + const saveAlarms = function() { + sched.setAlarms(alarms); + sched.reload(); + }; + + + + const getCurrentTime = function() { const time = new Date(); return (time.getHours() * 3600000) + (time.getMinutes() * 60000) + (time.getSeconds() * 1000); }; @@ -113,283 +108,7 @@ showScroller(s); }; - const timerTimePicker = new TimePicker({ - meridiem: undefined, - start: (hms) => setTimer(hms2ms(hms)), - cancel: cancel, - }); - - const newAlarmTimePicker = new TimePicker({ - meridiem: "AM", - start: (hms) => setAlarm(hms2ms(hms)), - cancel: cancel - }); - - const changeAlarmTime = function(alarm) { - const hms = ms2hms(alarm.t, "alarm"); - const tp = new TimePicker({ - meridiem: hms.meridiem, - h: hms.h, - m: hms.m, - s: 0, - start: (hms) => { - alarm.t = hms2ms(hms); - saveAlarms(); - loadAlarmsAndTimers(); - g.clearRect(Bangle.appRect); - //showScroller(alarmScroller); - showDowPicker(alarm); - }, - cancel: cancel - }) - tp.draw(); - }; - - const drawButton1 = function(r) { - const midX = (r.x + r.x2) / 2; - const midY = (r.y + r.y2) / 2; - const halfImg = 25; - g.setColor(1, 0, 0).fillRect({ x: r.x, y: r.y + 4, x2: r.x2 - 3, y2: r.y2 - 3}).setColor(g.theme.fg); - g.drawImage(deleteImg, midX - halfImg, midY - halfImg); - }; - - const drawButton2 = function(r) { - const midX = (r.x + r.x2) / 2; - const midY = (r.y + r.y2) / 2; - const halfImg = 16; - g.setColor(0, 0, 1).fillRect({ x: r.x, y: r.y + 4, x2: r.x2 - 3, y2: r.y2 - 3}).setColor(g.theme.fg); - g.drawImage(resetImg, midX - halfImg, midY - halfImg); - }; - - const drawTimerStart = function(x, y) { - g.drawImage(playImg, x - 24, y - 24); - }; - - const drawTimerPause = function(x, y) { - g.drawImage(pauseImg, x - 24, y - 24); - }; - - const drawTimerProgress = function(value, maxValue, x, y) { - const len = 115; - const t = 16; - const x2 = x + len; - const y2 = y + t; - const progLen = ((len - 4) / maxValue) * value; - g.setColor(0, 1, 1).fillRect({ x: x, y: y, x2: x2, y2: y2, r: t }); - g.setColor(g.theme.bg).fillRect({ x: x + 2, y: y + 2, x2: x2 - 2, y2: y2 - 2, r: t - 2 }).setColor(g.theme.fg); - g.setColor(0, 1, 1).fillRect({ x: x + 4, y: y + 4, x2: x + progLen, y2: y2 - 4, r: t - 4 }); - g.setColor(g.theme.fg); - }; - - const drawTimer = function(idx, r, dragging) { - const timer = getTimer(idx); - if (timer.timer === 0) { - drawTimeUp(timer, r); - return; - } - const midY = r.y + (r.h / 2); - g.clearRect(r.x, r.y, r.x2, r.y2); - g.setColor(g.theme.bg2).fillRect(r.x + 3, r.y + 4, r.x2 - 3, r.y2 - 3).setColor(g.theme.fg); - let time; - if (timer.on) { - drawTimerPause(r.x2 - 25, midY); - time = sched.getTimeToAlarm(timer); - } else { - drawTimerStart(r.x2 - 25, midY); - time = timer.timer; - } - const str = ms2String(time, "timer"); - g.setColor(0, 0, 1); - drawTimerProgress(time, timer.data.ot, r.x + 4, r.y2 - 30); - g.setColor(g.theme.fg); - g.setFontAlign(-1, -1).setFont("Vector:27").drawString(str.time, r.x + 4, r.y + 10); - }; - - const drawAlarm = function(idx, r, dragging) { - const alarm = getAlarm(idx); - g.setColor(g.theme.bg2).fillRect(r.x + 3, r.y + 4, r.x2 - 3, r.y2 - 3).setColor(g.theme.fg); - - let timeToAlarm; - if (alarm.on) { - g.setColor(0, 1, 0.5).drawImage(alarmOnImg, r.x2 - 50, r.y + 5).setColor(-1); - timeToAlarm = sched.getTimeToAlarm(alarm); - } else { - g.setColor(0.5, 0.5, 0.5).drawImage(alarmOffImg, r.x2 - 50, r.y + 5).setColor(-1); - timeToAlarm = 0; - } - const timeStr = ms2String(alarm.t, "alarm"); - g.setColor(g.theme.fg).setFontAlign(-1, 1).setFont("Vector:35"); - const sw = g.stringWidth(timeStr.time); - g.drawString(timeStr.time, r.x + 4, r.y + 40); - g.setFont("Vector:18").drawString(timeStr.meridiem, r.x + 4 + sw, r.y + 35); - if (!dragging) { - const timeToAlarmStr = timeToAlarm > 0 ? "In " + ms2String(timeToAlarm, "timeto", false).time : ""; - g.setFont("Vector:20"); - g.drawString(timeToAlarmStr, r.x + 4, r.y + 55); - if (alarm.rp) { - const dow = ["S", "M", "T", "W", "T", "F", "S"]; - g.setFontAlign(0, 1); - g.setColor(-1); - for (let i = 0, x = 13; i <= 6; i++, x += 25) { - if ((alarm.dow >> i) & 1) { // check bit - g.setColor(-1); - } else { - g.setColor(0.25, 0.5, 0.5); - } - g.drawString(dow[i], r.x + x, r.y2-5); - } - } - } - g.setBgColor(g.theme.bg).setColor(g.theme.fg); - }; - - const drawEmpty = function(r, mode) { - const midX = (r.x2 + r.x) / 2; - const midY = (r.y2 + r.y) / 2; - g.setColor(0.25, 0.25, 0.25); - // g.setFontAlign(0, 0).setFont("Vector:80"); - // g.drawString("o", midX, midY); - // g.drawString("/", midX, midY); - // g.drawImage(nullImg, midX, midY); - g.setColor(-1); - g.drawCircle(midX, midY - 20, 30); - g.drawLine(midX + 30, midY - 50, midX - 30, midY + 10); - let str; - if (mode === "timer") str = "No Timers"; - else if (mode === "alarm") str = "No Alarms"; - g.setColor(0.5, 0.5, 0.5).setFont("Vector:20").drawString(str, midX, r.y2 - 30); - } - - const drawTimeUp = function(timer, r) { - const midY = r.y + (r.h / 2); - g.clearRect(r.x, r.y, r.x2, r.y2); - g.setColor(0, 0.5, 0.5).fillRect({ x: r.x, y: r.y, x2: r.x2, y2: r.y2, r: 12 }); - g.setColor(g.theme.bg).fillRect({ x: r.x + 5, y: r.y + 6, x2: r.x2 - 5, y2: r.y2 - 6, r: 7 }).setColor(g.theme.fg); - g.drawImage(okImg, r.x2 - 51, midY - 24); - const time = getCurrentTime() - timer.t; - const timeStr = ms2String(time, "timer"); - const timerStr = ms2String(timer.data.ot, "timer"); - g.setFontAlign(-1, -1).setFont("Vector:20").drawString(timerStr.time, r.x + 6, r.y + 7); - g.setFontAlign(-1, 1).setFont("Vector:27").drawString(timeStr.time, r.x + 6, r.y2 - 3); - g.setBgColor(g.theme.bg).setColor(g.theme.fg); - }; - - const playPauseTimer = function(timer) { - if (timer.on) { - changeTimerTime(timer); - timer.on = false; - numActiveTimers--; - } else { - changeTimerTime(timer); - timer.on = true; - numActiveTimers++; - } - saveAlarms(); - showScroller(timerScroller); - }; - - const changeTimerTime = function(timer, newTime) { - const currentTime = getCurrentTime(); - const timerTime = sched.getTimeToAlarm(timer); - if (timerTime) { - timer.timer = newTime === undefined ? timerTime : newTime; - } - timer.t = (currentTime + timer.timer) % 86400000; - }; - - const timerTouchHandler = function(idx, r, x) { - const timer = getTimer(idx); - if (x > r.x2 - 40) { - if (timer.timer === 0) dismissTimer(timer); - else playPauseTimer(timer); - } - if (timer.on === false) { - if (x < r.x + 40) { - editTimer(timer); - } - } - }; - - const showDowPicker = function(alarm) { - dowPicker(alarm, () => { - saveAlarms(); - loadAlarmsAndTimers(); - g.clearRect(Bangle.appRect); - showScroller(alarmScroller); - }, - () => changeAlarmTime(alarm) - ) - } - - const alarmTouchHandler = function(idx, r, x) { - if (x < r.x2 - 40) { - stopRedraws(); - Bangle.setUI(); - removeScroller(alarmScroller); - showDowPicker(alarms[alarmIndexes[idx]]) - } else if (x > r.x2 - 40) { - alarms[alarmIndexes[idx]].on = !alarms[alarmIndexes[idx]].on; - saveAlarms(); - loadAlarmsAndTimers(); - showScroller(alarmScroller); - } - } - - const setAlarm = function(t) { - const id = Math.round(Date.now()); - sched.setAlarm(id, { - appid: appId, t: t, on: true, rp: false, del: false, - dow: 0b1111111, - as: settings.defaultAutoSnooze, - vibrate: settings.defaultAlarmPattern, - last: 0, - js: `try { - if (__FILE__ === 'mtimer.app.js') { - Bangle.emit("timeup"); - } else { - load("sched.js"); - } - } catch { - load("sched.js"); - }` - }); //ot: original time - loadAlarmsAndTimers(); - reMakeScroller(alarmScroller); - showScroller(alarmScroller); - }; - - const setTimer = function(t) { - if (t > 1000) { // don't make timers less than 1 second - const id = Math.round(Date.now()); - sched.setAlarm(id, { - appid: appId, timer: t, on: true, - del: settings.defaultDeleteExpiredTimers, - rp: false, as: false, dow: 0b1111111, last: 0, - data: { ot: t }, - js: `try { - if (__FILE__ === 'mtimer.app.js') { - Bangle.emit("timeup"); - } else { - load("sched.js"); - } - } catch { - load("sched.js"); - }` - }); //ot: original time - } - loadAlarmsAndTimers(); - reMakeScroller(timerScroller); - showScroller(timerScroller); - } - - const resetTimer = function(timer) { - changeTimerTime(timer, timer.data.ot); - if (timer.on) playPauseTimer(timer); - saveAlarms(); - showScroller(timerScroller); - } - - const remove = function(idx) { + const remove = function(idx) { let alarm; if (mode === "timer") { removeScroller(timerScroller); @@ -407,13 +126,72 @@ reMakeScroller(alarmScroller); showScroller(alarmScroller); } + }; + + const timeup = function() { + currentTime = getCurrentTime(); + for (let i = 0; i < timerIndexes.length; i++) { + timer = getTimer(i); + if (timer.on && timer.t <= currentTime) { + //timer.on = false; + timer.timer = 0; + timer.on = false; + s.scrollToCenter(i + 1); + buzz(); + } + } + sched.setAlarms(alarms); + sched.reload(); + }; + + const startRedraws = function(s) { + if (intID) clearTimeout(intID); + const redraw = function() { + g.clearRect(Bangle.appRect); + s.drawAll(); + intID = setTimeout(redraw, 1000); + } + redraw(); + }; + + const stopRedraws = function() { + if (intID) clearTimeout(intID); + intID = undefined; + }; + + const showScroller = function(s) { + stopRedraws(); + if ((mode === "timer" && timerIndexes.length > 0) || + (mode === "alarm" && alarmIndexes.length > 0)) { + startRedraws(s); + } + s.reload(); + s.drawAll(); } - const editTimer = function(timer) { - console.log("edit function, timer: " + timer); - } + const removeScroller = function(s) { + //if (mode === "timer") { + stopRedraws(); + //} + s.remove(); + g.reset(); + g.clearRect(Bangle.appRect); + }; - const drawTbMin = function(r) { + const reMakeScroller = function(s) { + s.c = mode === "timer" ? timerIndexes.length : alarmIndexes.length; + s.reload(); + }; + + const topBar = { + minH: 24, + maxH: 54, + drawMin: (r) => drawTbMin(r), + drawMax: (r) => drawTbMax(r), + handler: (d, r) => topBarHandler(d, r), + }; + + const drawTbMin = function(r) { g.clearRect(r.x, r.y, r.x2, r.y2); const h = r.y2 - r.y; g.setFont("Vector:" + h).setFontAlign(-1, -1).drawString(mode === "timer" ? "Timers" : "Alarms"); @@ -468,101 +246,54 @@ } }; - const topBar = { - minH: 24, - maxH: 54, - drawMin: (r) => drawTbMin(r), - drawMax: (r) => drawTbMax(r), - handler: (d, r) => topBarHandler(d, r), + const drawButton1 = function(r) { + const midX = (r.x + r.x2) / 2; + const midY = (r.y + r.y2) / 2; + const halfImg = 25; + g.setColor(1, 0, 0).fillRect({ x: r.x, y: r.y + 4, x2: r.x2 - 3, y2: r.y2 - 3}).setColor(g.theme.fg); + g.drawImage(deleteImg, midX - halfImg, midY - halfImg); }; - const timerScroller = new Scroller({ - h: 75, c: timerIndexes.length, - draw: (i, r, d) => drawTimer(i, r, d), - drawEmpty: (r) => drawEmpty(r, "timer"), - select: (i, r, x) => timerTouchHandler(i, r, x), - button1: (i) => remove(i), - button2: (i) => resetTimer(i), - drawButton1: (r) => drawButton1(r), - drawButton2: (r) => drawButton2(r), - topBar: topBar, - }); - - const alarmScroller = new Scroller({ - h: 95, c: alarmIndexes.length, - draw: (i, r, d) => drawAlarm(i, r, d), - drawEmpty: (r) => drawEmpty(r, "alarm"), - select: (i, r, x) => alarmTouchHandler(i, r, x), - button1: (i) => remove(i), - button2: undefined, - drawButton1: (r) => drawButton1(r), - drawButton2: undefined, - topBar: topBar, - }); - - const reMakeScroller = function(s) { - s.c = mode === "timer" ? timerIndexes.length : alarmIndexes.length; - s.reload(); - } - - const startRedraws = function(s) { - if (intID) clearTimeout(intID); - const redraw = function() { - g.clearRect(Bangle.appRect); - s.drawAll(); - intID = setTimeout(redraw, 1000); - } - redraw(); + const drawButton2 = function(r) { + const midX = (r.x + r.x2) / 2; + const midY = (r.y + r.y2) / 2; + const halfImg = 16; + g.setColor(0, 0, 1).fillRect({ x: r.x, y: r.y + 4, x2: r.x2 - 3, y2: r.y2 - 3}).setColor(g.theme.fg); + g.drawImage(resetImg, midX - halfImg, midY - halfImg); }; - const stopRedraws = function() { - if (intID) clearTimeout(intID); - intID = undefined; + const drawEmpty = function(r, mode) { + const midX = (r.x2 + r.x) / 2; + const midY = (r.y2 + r.y) / 2; + g.setColor(0.25, 0.25, 0.25); + // g.setFontAlign(0, 0).setFont("Vector:80"); + // g.drawString("o", midX, midY); + // g.drawString("/", midX, midY); + // g.drawImage(nullImg, midX, midY); + g.setColor(-1); + g.drawCircle(midX, midY - 20, 30); + g.drawLine(midX + 30, midY - 50, midX - 30, midY + 10); + let str; + if (mode === "timer") str = "No Timers"; + else if (mode === "alarm") str = "No Alarms"; + g.setColor(0.5, 0.5, 0.5).setFont("Vector:20").drawString(str, midX, r.y2 - 30); }; - const showScroller = function(s) { - stopRedraws(); - if ((mode === "timer" && timerIndexes.length > 0) || - (mode === "alarm" && alarmIndexes.length > 0)) { - startRedraws(s); - } - s.reload(); - s.drawAll(); - } - - const removeScroller = function(s) { - //if (mode === "timer") { - stopRedraws(); - //} - s.remove(); - g.reset(); - g.clearRect(Bangle.appRect); - } - - const timeup = function() { - currentTime = getCurrentTime(); - for (let i = 0; i < timerIndexes.length; i++) { - timer = getTimer(i); - if (timer.on && timer.t <= currentTime) { - //timer.on = false; - timer.timer = 0; - timer.on = false; - s.scrollToCenter(i + 1); - buzz(); - } - } - sched.setAlarms(alarms); - sched.reload(); + const drawTimeUp = function(timer, r) { + const midY = r.y + (r.h / 2); + g.clearRect(r.x, r.y, r.x2, r.y2); + g.setColor(0, 0.5, 0.5).fillRect({ x: r.x, y: r.y, x2: r.x2, y2: r.y2, r: 12 }); + g.setColor(g.theme.bg).fillRect({ x: r.x + 5, y: r.y + 6, x2: r.x2 - 5, y2: r.y2 - 6, r: 7 }).setColor(g.theme.fg); + g.drawImage(okImg, r.x2 - 51, midY - 24); + const time = getCurrentTime() - timer.t; + const timeStr = ms2String(time, "timer"); + const timerStr = ms2String(timer.data.ot, "timer"); + g.setFontAlign(-1, -1).setFont("Vector:20").drawString(timerStr.time, r.x + 6, r.y + 7); + g.setFontAlign(-1, 1).setFont("Vector:27").drawString(timeStr.time, r.x + 6, r.y2 - 3); + g.setBgColor(g.theme.bg).setColor(g.theme.fg); }; - const dismissTimer = function(timer) { - stopBuzz(); - timer.timer = timer.data.ot; - sched.setAlarms(alarms); - sched.reload(); - }; - - const buzz = function() { + const buzz = function() { if (settings.unlockAtBuzz) Bangle.setLocked(false); const pattern = settings.defaultAlarmPattern; Bangle.buzzCount = settings.buzzCount; @@ -591,6 +322,281 @@ return; }; - Bangle.on("timeup", timeup); +// Timers: + const getTimer = function(idx) { + return alarms[timerIndexes[idx]]; + }; + + const timerTimePicker = new TimePicker({ + meridiem: undefined, + start: (hms) => setTimer(hms2ms(hms)), + cancel: cancel, + }); + + const drawTimerStart = function(x, y) { + g.drawImage(playImg, x - 24, y - 24); + }; + + const drawTimerPause = function(x, y) { + g.drawImage(pauseImg, x - 24, y - 24); + }; + + const drawTimerProgress = function(value, maxValue, x, y) { + const len = 115; + const t = 16; + const x2 = x + len; + const y2 = y + t; + const progLen = ((len - 4) / maxValue) * value; + g.setColor(0, 1, 1).fillRect({ x: x, y: y, x2: x2, y2: y2, r: t }); + g.setColor(g.theme.bg).fillRect({ x: x + 2, y: y + 2, x2: x2 - 2, y2: y2 - 2, r: t - 2 }).setColor(g.theme.fg); + g.setColor(0, 1, 1).fillRect({ x: x + 4, y: y + 4, x2: x + progLen, y2: y2 - 4, r: t - 4 }); + g.setColor(g.theme.fg); + }; + + const drawTimer = function(idx, r, dragging) { + const timer = getTimer(idx); + if (timer.timer === 0) { + drawTimeUp(timer, r); + return; + } + const midY = r.y + (r.h / 2); + g.clearRect(r.x, r.y, r.x2, r.y2); + g.setColor(g.theme.bg2).fillRect(r.x + 3, r.y + 4, r.x2 - 3, r.y2 - 3).setColor(g.theme.fg); + let time; + if (timer.on) { + drawTimerPause(r.x2 - 25, midY); + time = sched.getTimeToAlarm(timer); + } else { + drawTimerStart(r.x2 - 25, midY); + time = timer.timer; + } + const str = ms2String(time, "timer"); + g.setColor(0, 0, 1); + drawTimerProgress(time, timer.data.ot, r.x + 4, r.y2 - 30); + g.setColor(g.theme.fg); + g.setFontAlign(-1, -1).setFont("Vector:27").drawString(str.time, r.x + 4, r.y + 10); + }; + + const playPauseTimer = function(timer) { + if (timer.on) { + changeTimerTime(timer); + timer.on = false; + numActiveTimers--; + } else { + changeTimerTime(timer); + timer.on = true; + numActiveTimers++; + } + saveAlarms(); + showScroller(timerScroller); + }; + + const changeTimerTime = function(timer, newTime) { + const currentTime = getCurrentTime(); + const timerTime = sched.getTimeToAlarm(timer); + if (timerTime) { + timer.timer = newTime === undefined ? timerTime : newTime; + } + timer.t = (currentTime + timer.timer) % 86400000; + }; + + const timerTouchHandler = function(idx, r, x) { + const timer = getTimer(idx); + if (x > r.x2 - 40) { + if (timer.timer === 0) dismissTimer(timer); + else playPauseTimer(timer); + } + if (timer.on === false) { + if (x < r.x + 40) { + editTimer(timer); + } + } + }; + + const setTimer = function(t) { + if (t > 1000) { // don't make timers less than 1 second + const id = Math.round(Date.now()); + sched.setAlarm(id, { + appid: appId, timer: t, on: true, + del: settings.defaultDeleteExpiredTimers, + rp: false, as: false, dow: 0b1111111, last: 0, + data: { ot: t }, + js: `try { + if (__FILE__ === 'mtimer.app.js') { + Bangle.emit("timeup"); + } else { + load("sched.js"); + } + } catch { + load("sched.js"); + }` + }); //ot: original time + } + loadAlarmsAndTimers(); + reMakeScroller(timerScroller); + showScroller(timerScroller); + }; + + const resetTimer = function(timer) { + changeTimerTime(timer, timer.data.ot); + if (timer.on) playPauseTimer(timer); + saveAlarms(); + showScroller(timerScroller); + }; + + const editTimer = function(timer) { + console.log("edit function, timer: " + timer); + }; + + const timerScroller = new Scroller({ + h: 75, c: timerIndexes.length, + draw: (i, r, d) => drawTimer(i, r, d), + drawEmpty: (r) => drawEmpty(r, "timer"), + select: (i, r, x) => timerTouchHandler(i, r, x), + button1: (i) => remove(i), + button2: (i) => resetTimer(i), + drawButton1: (r) => drawButton1(r), + drawButton2: (r) => drawButton2(r), + topBar: topBar, + }); + + const dismissTimer = function(timer) { + stopBuzz(); + timer.timer = timer.data.ot; + sched.setAlarms(alarms); + sched.reload(); + }; + +// Alarms: + const getAlarm = function(idx) { + return alarms[alarmIndexes[idx]]; + }; + + const newAlarmTimePicker = new TimePicker({ + meridiem: "AM", + start: (hms) => setAlarm(hms2ms(hms)), + cancel: cancel + }); + + const changeAlarmTime = function(alarm) { + const hms = ms2hms(alarm.t, "alarm"); + const tp = new TimePicker({ + meridiem: hms.meridiem, + h: hms.h, + m: hms.m, + s: 0, + start: (hms) => { + alarm.t = hms2ms(hms); + saveAlarms(); + loadAlarmsAndTimers(); + g.clearRect(Bangle.appRect); + //showScroller(alarmScroller); + showDowPicker(alarm); + }, + cancel: cancel + }) + tp.draw(); + }; + + const drawAlarm = function(idx, r, dragging) { + const alarm = getAlarm(idx); + g.setColor(g.theme.bg2).fillRect(r.x + 3, r.y + 4, r.x2 - 3, r.y2 - 3).setColor(g.theme.fg); + + let timeToAlarm; + if (alarm.on) { + g.setColor(0, 1, 0.5).drawImage(alarmOnImg, r.x2 - 50, r.y + 5).setColor(-1); + timeToAlarm = sched.getTimeToAlarm(alarm); + } else { + g.setColor(0.5, 0.5, 0.5).drawImage(alarmOffImg, r.x2 - 50, r.y + 5).setColor(-1); + timeToAlarm = 0; + } + const timeStr = ms2String(alarm.t, "alarm"); + g.setColor(g.theme.fg).setFontAlign(-1, 1).setFont("Vector:35"); + const sw = g.stringWidth(timeStr.time); + g.drawString(timeStr.time, r.x + 4, r.y + 40); + g.setFont("Vector:18").drawString(timeStr.meridiem, r.x + 4 + sw, r.y + 35); + if (!dragging) { + const timeToAlarmStr = timeToAlarm > 0 ? "In " + ms2String(timeToAlarm, "timeto", false).time : ""; + g.setFont("Vector:20"); + g.drawString(timeToAlarmStr, r.x + 4, r.y + 55); + if (alarm.rp) { + const dow = ["S", "M", "T", "W", "T", "F", "S"]; + g.setFontAlign(0, 1); + g.setColor(-1); + for (let i = 0, x = 13; i <= 6; i++, x += 25) { + if ((alarm.dow >> i) & 1) { // check bit + g.setColor(-1); + } else { + g.setColor(0.25, 0.5, 0.5); + } + g.drawString(dow[i], r.x + x, r.y2-5); + } + } + } + g.setBgColor(g.theme.bg).setColor(g.theme.fg); + }; + + const showDowPicker = function(alarm) { + dowPicker(alarm, () => { + saveAlarms(); + loadAlarmsAndTimers(); + g.clearRect(Bangle.appRect); + showScroller(alarmScroller); + }, + () => changeAlarmTime(alarm) + ) + }; + + const alarmTouchHandler = function(idx, r, x) { + if (x < r.x2 - 40) { + stopRedraws(); + Bangle.setUI(); + removeScroller(alarmScroller); + showDowPicker(alarms[alarmIndexes[idx]]) + } else if (x > r.x2 - 40) { + alarms[alarmIndexes[idx]].on = !alarms[alarmIndexes[idx]].on; + saveAlarms(); + loadAlarmsAndTimers(); + showScroller(alarmScroller); + } + }; + + const setAlarm = function(t) { + const id = Math.round(Date.now()); + sched.setAlarm(id, { + appid: appId, t: t, on: true, rp: false, del: false, + dow: 0b1111111, + as: settings.defaultAutoSnooze, + vibrate: settings.defaultAlarmPattern, + last: 0, + js: `try { + if (__FILE__ === 'mtimer.app.js') { + Bangle.emit("timeup"); + } else { + load("sched.js"); + } + } catch { + load("sched.js"); + }` + }); //ot: original time + loadAlarmsAndTimers(); + reMakeScroller(alarmScroller); + showScroller(alarmScroller); + }; + + const alarmScroller = new Scroller({ + h: 95, c: alarmIndexes.length, + draw: (i, r, d) => drawAlarm(i, r, d), + drawEmpty: (r) => drawEmpty(r, "alarm"), + select: (i, r, x) => alarmTouchHandler(i, r, x), + button1: (i) => remove(i), + button2: undefined, + drawButton1: (r) => drawButton1(r), + drawButton2: undefined, + topBar: topBar, + }); + + // Start + Bangle.on("timeup", timeup); showScroller(timerScroller); }