diff --git a/apps/sleeplogalarm/lib.js b/apps/sleeplogalarm/lib.js index 25bdfdbe4..8beb64ffd 100644 --- a/apps/sleeplogalarm/lib.js +++ b/apps/sleeplogalarm/lib.js @@ -2,14 +2,14 @@ var sched = require("sched"); // find next active alarm in range -function getNextAlarm(allAlarms, from, to, withId) { +function getNextAlarm(allAlarms, from, to, msg, withId) { if (withId) allAlarms = allAlarms.map((a, idx) => { a.idx = idx; return a; }); // return next active alarms in range return allAlarms.filter( - a => a.on && !a.timer && a.t >= from && a.t < to + a => a.on && !a.timer && a.t >= from && a.t < to && (!msg || a.msg.includes(msg)) ).map(a => { // add time to alarm a.tTo = sched.getTimeToAlarm(a); return a; @@ -23,17 +23,18 @@ exports = { getSettings: function() { return Object.assign({ enabled: true, - hide: false, - drawTime: true, - color: g.theme.dark ? 65504 : 31, // yellow or blue - from: 4, // 0400 - to: 8, // 0800 earlier: 30, + filter_from: 0, + filter_to: 24, + filter_msg: "", + vibrate: "..", + msg: "...\n", msgAsPrefix: true, disableOnAlarm: false, // !!! not available if alarm is at the next day - msg: "...\n", - vibrate: "..", - as: true + as: true, + wid_hide: false, + wid_time: true, + wid_color: g.theme.dark ? 65504 : 31, // yellow or blue }, require("Storage").readJSON("sleeplogalarm.settings.json", true) || {}); }, @@ -46,7 +47,7 @@ exports = { var settings = exports.getSettings(); // set the alarm time - this.time = getNextAlarm(sched.getAlarms(), settings.from * 36E5, settings.to * 36E5).t; + this.time = getNextAlarm(sched.getAlarms(), settings.filter_from * 36E5, settings.filter_to * 36E5, settings,filter_msg).t; // abort if no alarm time could be found inside range if (!this.time) return; @@ -78,7 +79,7 @@ exports = { var allAlarms = sched.getAlarms(); // find first active alarm - var alarm = getNextAlarm(sched.getAlarms(), settings.from * 36E5, settings.to * 36E5, settings.disableOnAlarm); + var alarm = getNextAlarm(sched.getAlarms(), settings.filter_from * 36E5, settings.filter_to * 36E5, settings,filter_msg, settings.disableOnAlarm); // clear sleeplog.trigger object and set alarm time to prevent resetting for this alarm sleeplog.trigger.sleeplogalarm = {last: alarm.t}; diff --git a/apps/sleeplogalarm/settings.js b/apps/sleeplogalarm/settings.js index 2447a20aa..c62f6a273 100644 --- a/apps/sleeplogalarm/settings.js +++ b/apps/sleeplogalarm/settings.js @@ -7,6 +7,66 @@ require("Storage").writeJSON("sleeplogalarm.settings.json", settings); } + // read input from keyboard + function readInput(setting, retPos, cb) { + setTimeout((setting, retPos, cb) => { + if (require("Storage").read("textinput")) { + g.clear(); + require("textinput").input({text: settings[setting]}).then(result => { + settings[setting] = result; + writeSetting(); + cb(retPos); + }); + } else { + E.showAlert(/*LANG*/"No keyboard app installed").then(() => cb(retPos)); + } + }, 0, setting, retPos, cb); + } + + // show widget menu + function showFilterMenu() { + // set menu + var filterMenu = { + "": { + title: "Filter Alarm" + }, + /*LANG*/"< Back": () => showMain(2), + /*LANG*/"time from": { + value: settings.filter_from, + step: 0.25, + min: 0, + max: 23, + wrap: true, + noList: true, + format: v => 0|v + ":" + ("" + 0|(v%1 * 60)).padStart(2, "0"), + onchange: v => { + settings.filter_from = v; + writeSetting(); + } + }, + /*LANG*/"time to": { + value: settings.filter_to, + step: 0.25, + min: 1, + max: 24, + wrap: true, + noList: true, + format: v => 0|v + ":" + ("" + 0|(v%1 * 60)).padStart(2, "0"), + onchange: v => { + settings.filter_to = v; + writeSetting(); + } + }, + /*LANG*/"msg includes": { + value: settings.filter_msg, + format: v => !v ? "" : v.length > 6 ? v.substring(0, 6)+"..." : v, + // setTimeout required to load after menu refresh + onchange: () => readInput("filter_msg", 3, showFilterMenu) + } + }; + var menu = E.showMenu(filterMenu); + } + // show widget menu function showWidMenu() { // define color values and names @@ -18,29 +78,29 @@ "": { title: "Widget Settings" }, - /*LANG*/"< Back": () => showMain(7), + /*LANG*/"< Back": () => showMain(8), /*LANG*/"hide": { - value: settings.hide, + value: settings.wid_hide, onchange: v => { - settings.hide = v; + settings.wid_hide = v; writeSetting(); } }, - /*LANG*/"time range": { - value: settings.drawRange, + /*LANG*/"show time": { + value: settings.wid_time, onchange: v => { - settings.drawRange = v; + settings.wid_time = v; writeSetting(); } }, /*LANG*/"color": { - value: colVal.indexOf(settings.color), + value: colVal.indexOf(settings.wid_color), min: 0, max: colVal.length -1, wrap: true, format: v => colName[v], onchange: v => { - settings.color = colVal[v]; + settings.wid_color = colVal[v]; writeSetting(); } } @@ -57,30 +117,6 @@ selected: selected }, /*LANG*/"< Back": () => back(), - /*LANG*/"time from": { - value: settings.from, - min: 0, - max: 23, - wrap: true, - noList: true, - format: v => v + ":00", - onchange: v => { - settings.from = v; - writeSetting(); - } - }, - /*LANG*/"time to": { - value: settings.to, - min: 1, - max: 24, - wrap: true, - noList: true, - format: v => v + ":00", - onchange: v => { - settings.to = v; - writeSetting(); - } - }, /*LANG*/"erlier": { value: settings.earlier, step: 10, @@ -94,29 +130,19 @@ writeSetting(); } }, - /*LANG*/"disable alarm": { - value: settings.disableOnAlarm, - onchange: v => { - settings.disableOnAlarm = v; + /*LANG*/"Filter Alarm": () => showFilterMenu(), + /*LANG*/"vib pattern": require("buzz_menu").pattern( + settings.vibrate, + v => { + settings.vibrate = v; writeSetting(); } - }, + ), /*LANG*/"msg": { value: settings.msg, format: v => !v ? "" : v.length > 6 ? v.substring(0, 6)+"..." : v, // setTimeout required to load after menu refresh - onchange: () => setTimeout((msg, cb) => { - if (require("Storage").read("textinput")) { - g.clear(); - require("textinput").input({text: msg}).then(result => { - settings.msg = result; - writeSetting(); - cb(7); - }); - } else { - E.showAlert(/*LANG*/"No keyboard app installed").then(() => cb(7)); - } - }, 0, settings.msg, showMain), + onchange: () => readInput("msg", 4, showMain) }, /*LANG*/"msg as prefix": { value: settings.msgAsPrefix, @@ -125,13 +151,13 @@ writeSetting(); } }, - /*LANG*/"vib pattern": require("buzz_menu").pattern( - settings.vibrate, - v => { - settings.vibrate = v; + /*LANG*/"disable alarm": { + value: settings.disableOnAlarm, + onchange: v => { + settings.disableOnAlarm = v; writeSetting(); } - ), + }, /*LANG*/"auto snooze": { value: settings.as, onchange: v => { diff --git a/apps/sleeplogalarm/widget.js b/apps/sleeplogalarm/widget.js index 96f4e7740..991238140 100644 --- a/apps/sleeplogalarm/widget.js +++ b/apps/sleeplogalarm/widget.js @@ -11,7 +11,7 @@ if ((require("Storage").readJSON("sleeplogalarm.settings.json", true) || {enable earlier: settings.earlier, draw: function () { // draw zzz - g.reset().setColor(settings.color).drawImage(atob("BwoBD8SSSP4EEEDg"), this.x + 1, this.y); + g.reset().setColor(settings.wid_color).drawImage(atob("BwoBD8SSSP4EEEDg"), this.x + 1, this.y); // call function to draw the time of alarm if a alarm is found if (this.time) this.drawTime(this.time + 1); }, @@ -20,7 +20,7 @@ if ((require("Storage").readJSON("sleeplogalarm.settings.json", true) || {enable }; // add function to draw the time of alarm if enabled - if (settings.drawTime) WIDGETS.sleeplogalarm.drawTime = function(time) { + if (settings.wid_time) WIDGETS.sleeplogalarm.drawTime = function(time) { // directly include Font4x5Numeric g.setFontCustom(atob("CAZMA/H4PgvXoK1+DhPg7W4P1uCEPg/X4O1+AA=="), 46, atob("AgQEAgQEBAQEBAQE"), 5).setFontAlign(1, 1); g.drawString(0|(time / 36E5), this.x + this.width + 1, this.y + 17);