2022-04-07 22:45:27 +00:00
|
|
|
Bangle.loadWidgets();
|
|
|
|
Bangle.drawWidgets();
|
2022-04-04 05:46:04 +00:00
|
|
|
|
2022-04-07 22:45:27 +00:00
|
|
|
var notes = require("Storage").readJSON("noteify.json", true) || [];
|
|
|
|
var alarms = require("sched").getAlarms();
|
|
|
|
msg = "";
|
2022-04-04 05:46:04 +00:00
|
|
|
|
2022-04-07 22:45:27 +00:00
|
|
|
function startNote(idx) {
|
|
|
|
idx == undefined ? note = "" : note = notes[idx].note;
|
|
|
|
require("textinput").input({text:note}).then(result => {
|
|
|
|
idx == undefined ? notes.push({"note" : result}) : notes[idx].note = result;
|
|
|
|
require("Storage").write("noteify.json",JSON.stringify(notes));
|
|
|
|
showMainMenu();
|
|
|
|
});
|
2022-04-04 05:46:04 +00:00
|
|
|
}
|
|
|
|
|
2022-04-07 22:45:27 +00:00
|
|
|
function viewNote(idx) {
|
|
|
|
var textY = 30;
|
|
|
|
var textBound = g.stringMetrics(g.setColor(g.theme.fg).setFont("6x8:2").setFontAlign(-1, -1).drawString(g.wrapString(notes[idx].note, g.getWidth()).join("\n"), 0, textY)).height;
|
|
|
|
Bangle.setUI({mode:"custom", drag:e=>{
|
|
|
|
textY += e.dy;
|
|
|
|
g.setClipRect(0, 30, g.getWidth(), g.getHeight());
|
|
|
|
if (textY > 30) textY = 30;
|
|
|
|
if (textY < textBound) textY = textBound;
|
|
|
|
g.clearRect(0, 30, g.getWidth(), g.getHeight()).setColor(g.theme.fg).setFont("6x8:2").setFontAlign(-1, -1).drawString(g.wrapString(notes[idx].note, g.getWidth()).join("\n"), 0, textY);
|
|
|
|
},back:()=>{
|
|
|
|
Bangle.setUI();
|
|
|
|
showEditMenu(idx);
|
|
|
|
}});
|
|
|
|
|
2022-04-04 05:46:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function showMainMenu() {
|
|
|
|
var mainMenu = {
|
|
|
|
"" : { "title" : "Noteify" },
|
|
|
|
"< Back" : function() { load(); },
|
|
|
|
"New note" : function() {
|
|
|
|
E.showMenu();
|
|
|
|
startNote();
|
|
|
|
},
|
|
|
|
"Edit alarms/timers" : function() { showAlarmMenu(); },
|
|
|
|
};
|
|
|
|
|
|
|
|
notes.forEach((a, idx) => {
|
2022-04-07 22:45:27 +00:00
|
|
|
mainMenu[notes[idx].note.length > 12 ? notes[idx].note.substring(0, 12)+"..." : notes[idx].note] = function () { showEditMenu(idx);};
|
2022-04-04 05:46:04 +00:00
|
|
|
});
|
2022-04-07 22:45:27 +00:00
|
|
|
msg = "";
|
2022-04-04 05:46:04 +00:00
|
|
|
E.showMenu(mainMenu);
|
|
|
|
}
|
|
|
|
|
|
|
|
function showEditMenu(idx) {
|
|
|
|
var moveNote = notes[idx].note;
|
|
|
|
var editMenu = {
|
2022-04-07 22:45:27 +00:00
|
|
|
"" : { "title" : notes[idx].note.length > 12 ? notes[idx].note.substring(0, 12)+"..." : notes[idx].note },
|
|
|
|
"View note" : function() {
|
2022-04-04 05:46:04 +00:00
|
|
|
E.showMenu();
|
2022-04-07 22:45:27 +00:00
|
|
|
viewNote(idx);
|
|
|
|
},
|
|
|
|
"Edit note" : function() {
|
|
|
|
E.showMenu();
|
|
|
|
startNote(idx);
|
2022-04-04 05:46:04 +00:00
|
|
|
},
|
|
|
|
"Delete note" : function() {
|
|
|
|
notes.splice(idx,1);
|
|
|
|
require("Storage").write("noteify.json",JSON.stringify(notes));
|
|
|
|
showMainMenu();
|
|
|
|
},
|
|
|
|
"Set as alarm" : function() {
|
|
|
|
//limit alarm msg to 30 chars
|
|
|
|
msg = moveNote.substring(0, 30);
|
|
|
|
editAlarm(-1);
|
|
|
|
},
|
|
|
|
"Set as timer" : function () {
|
|
|
|
msg = moveNote.substring(0, 30);
|
|
|
|
editTimer(-1);
|
|
|
|
},
|
|
|
|
"Change position" : {
|
2022-04-07 22:45:27 +00:00
|
|
|
value : idx+1,
|
2022-04-04 05:46:04 +00:00
|
|
|
min : 1,
|
|
|
|
max : notes.length,
|
|
|
|
wrap : true,
|
|
|
|
onchange : function(v) {
|
2022-04-07 22:45:27 +00:00
|
|
|
//save changes from change position
|
|
|
|
if (v-1 != idx) {
|
|
|
|
notes.splice(v-1, 0, notes.splice(idx, 1)[0]);
|
|
|
|
require("Storage").write("noteify.json",JSON.stringify(notes));
|
|
|
|
}
|
2022-04-04 05:46:04 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
"< Back" : function() {
|
|
|
|
showMainMenu();
|
|
|
|
},
|
|
|
|
};
|
|
|
|
E.showMenu(editMenu);
|
|
|
|
}
|
|
|
|
|
2022-04-07 22:45:27 +00:00
|
|
|
function decodeTime(t) {
|
|
|
|
t = 0|t; // sanitise
|
|
|
|
var hrs = 0|(t/3600000);
|
|
|
|
return { hrs : hrs, mins : Math.round((t-hrs*3600000)/60000) };
|
|
|
|
}
|
|
|
|
|
|
|
|
// time in { hrs, mins } -> ms
|
|
|
|
function encodeTime(o) {
|
|
|
|
return o.hrs*3600000 + o.mins*60000;
|
2022-04-04 05:46:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function formatTime(t) {
|
2022-04-07 22:45:27 +00:00
|
|
|
var o = decodeTime(t);
|
|
|
|
return o.hrs+":"+("0"+o.mins).substr(-2);
|
2022-04-04 05:46:04 +00:00
|
|
|
}
|
|
|
|
|
2022-04-07 22:45:27 +00:00
|
|
|
function getCurrentTime() {
|
|
|
|
var time = new Date();
|
|
|
|
return (
|
|
|
|
time.getHours() * 3600000 +
|
|
|
|
time.getMinutes() * 60000 +
|
|
|
|
time.getSeconds() * 1000
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function saveAndReload() {
|
|
|
|
require("sched").setAlarms(alarms);
|
|
|
|
require("sched").reload();
|
2022-04-04 05:46:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function showAlarmMenu() {
|
|
|
|
const menu = {
|
|
|
|
'': { 'title': 'Alarm/Timer' },
|
|
|
|
'< Back' : ()=>{showMainMenu();},
|
|
|
|
'New Alarm': ()=>editAlarm(-1),
|
|
|
|
'New Timer': ()=>editTimer(-1)
|
|
|
|
};
|
|
|
|
alarms.forEach((alarm,idx)=>{
|
2022-04-09 19:32:36 +00:00
|
|
|
var type,txt; // a leading space is currently required (JS error in Espruino 2v12)
|
|
|
|
if (alarm.timer) {
|
|
|
|
type = /*LANG*/"Timer";
|
|
|
|
txt = " "+formatTime(alarm.timer);
|
|
|
|
} else {
|
|
|
|
type = /*LANG*/"Alarm";
|
|
|
|
txt = " "+formatTime(alarm.t);
|
|
|
|
}
|
2022-04-07 22:45:27 +00:00
|
|
|
if (alarm.rp) txt += "\0"+atob("FBaBAAABgAAcAAHn//////wAHsABzAAYwAAMAADAAAAAAwAAMAADGAAzgAN4AD//////54AAOAABgAA=");
|
2022-04-09 19:22:24 +00:00
|
|
|
// rename duplicate alarms
|
|
|
|
if (menu[type+txt]) {
|
|
|
|
var n = 2;
|
|
|
|
while (menu[type+" "+n+txt]) n++;
|
|
|
|
txt = type+" "+n+txt;
|
|
|
|
} else txt = type+txt;
|
|
|
|
// add to menu
|
2022-04-07 22:45:27 +00:00
|
|
|
menu[txt] = {
|
|
|
|
value : "\0"+atob(alarm.on?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g"),
|
|
|
|
onchange : function() {
|
|
|
|
if (alarm.timer) editTimer(idx, alarm);
|
|
|
|
else editAlarm(idx, alarm);
|
|
|
|
}
|
2022-04-04 05:46:04 +00:00
|
|
|
};
|
|
|
|
});
|
2022-04-07 22:45:27 +00:00
|
|
|
if (WIDGETS["alarm"]) WIDGETS["alarm"].reload();
|
|
|
|
return E.showMenu(menu);
|
2022-04-04 05:46:04 +00:00
|
|
|
}
|
|
|
|
|
2022-04-07 22:45:27 +00:00
|
|
|
function editDOW(dow, onchange) {
|
|
|
|
const menu = {
|
|
|
|
'': { 'title': 'Days of Week' },
|
|
|
|
'< Back' : () => onchange(dow)
|
|
|
|
};
|
|
|
|
for (var i = 0; i < 7; i++) (i => {
|
|
|
|
var dayOfWeek = require("locale").dow({ getDay: () => i });
|
|
|
|
menu[dayOfWeek] = {
|
|
|
|
value: !!(dow&(1<<i)),
|
|
|
|
format: v => v ? "Yes" : "No",
|
|
|
|
onchange: v => v ? dow |= 1<<i : dow &= ~(1<<i),
|
|
|
|
};
|
|
|
|
})(i);
|
|
|
|
E.showMenu(menu);
|
|
|
|
}
|
|
|
|
|
|
|
|
function editAlarm(alarmIndex, alarm) {
|
2022-04-04 05:46:04 +00:00
|
|
|
var newAlarm = alarmIndex<0;
|
2022-04-07 22:45:27 +00:00
|
|
|
var a = {
|
|
|
|
t : 12*3600000, // 12 o clock default
|
|
|
|
on : true,
|
|
|
|
rp : true,
|
|
|
|
as : false,
|
|
|
|
dow : 0b1111111,
|
|
|
|
last : 0,
|
|
|
|
vibrate : ".."
|
|
|
|
};
|
|
|
|
if (msg != "") a["msg"] = msg;
|
|
|
|
if (!newAlarm) Object.assign(a, alarms[alarmIndex]);
|
|
|
|
if (alarm) Object.assign(a,alarm);
|
|
|
|
var t = decodeTime(a.t);
|
2022-04-04 05:46:04 +00:00
|
|
|
|
2022-04-07 22:45:27 +00:00
|
|
|
var alarmTitle = (a.msg == undefined) ? 'Alarm' : (a.msg.length > 12) ? a.msg.substring(0, 12)+"..." : msg;
|
|
|
|
|
2022-04-04 05:46:04 +00:00
|
|
|
const menu = {
|
|
|
|
'': { 'title': alarmTitle },
|
2022-04-07 22:45:27 +00:00
|
|
|
'< Back' : () => showAlarmMenu(),
|
2022-04-09 00:47:20 +00:00
|
|
|
'Days': {
|
|
|
|
value: "SMTWTFS".split("").map((d,n)=>a.dow&(1<<n)?d:".").join(""),
|
|
|
|
onchange: () => editDOW(a.dow, d=>{a.dow=d;editAlarm(alarmIndex,a)})
|
|
|
|
},
|
2022-04-04 05:46:04 +00:00
|
|
|
'Hours': {
|
2022-04-07 22:45:27 +00:00
|
|
|
value: t.hrs, min : 0, max : 23, wrap : true,
|
|
|
|
onchange: v => t.hrs=v
|
2022-04-04 05:46:04 +00:00
|
|
|
},
|
|
|
|
'Minutes': {
|
2022-04-07 22:45:27 +00:00
|
|
|
value: t.mins, min : 0, max : 59, wrap : true,
|
|
|
|
onchange: v => t.mins=v
|
2022-04-04 05:46:04 +00:00
|
|
|
},
|
|
|
|
'Enabled': {
|
2022-04-07 22:45:27 +00:00
|
|
|
value: a.on,
|
2022-04-04 05:46:04 +00:00
|
|
|
format: v=>v?"On":"Off",
|
2022-04-07 22:45:27 +00:00
|
|
|
onchange: v=>a.on=v
|
2022-04-04 05:46:04 +00:00
|
|
|
},
|
|
|
|
'Repeat': {
|
2022-04-07 22:45:27 +00:00
|
|
|
value: a.rp,
|
2022-04-04 05:46:04 +00:00
|
|
|
format: v=>v?"Yes":"No",
|
2022-04-07 22:45:27 +00:00
|
|
|
onchange: v=>a.rp=v
|
2022-04-04 05:46:04 +00:00
|
|
|
},
|
2022-04-07 22:45:27 +00:00
|
|
|
'Vibrate': require("buzz_menu").pattern(a.vibrate, v => a.vibrate=v ),
|
2022-04-04 05:46:04 +00:00
|
|
|
'Auto snooze': {
|
2022-04-07 22:45:27 +00:00
|
|
|
value: a.as,
|
2022-04-04 05:46:04 +00:00
|
|
|
format: v=>v?"Yes":"No",
|
2022-04-07 22:45:27 +00:00
|
|
|
onchange: v=>a.as=v
|
2022-04-04 05:46:04 +00:00
|
|
|
}
|
|
|
|
};
|
2022-04-07 22:45:27 +00:00
|
|
|
menu["Save"] = function() {
|
|
|
|
a.t = encodeTime(t);
|
2022-04-09 19:22:24 +00:00
|
|
|
a.last = (a.t < getCurrentTime()) ? (new Date()).getDate() : 0;
|
2022-04-09 19:36:32 +00:00
|
|
|
a.last = 0;
|
2022-04-07 22:45:27 +00:00
|
|
|
if (newAlarm) alarms.push(a);
|
|
|
|
else alarms[alarmIndex] = a;
|
|
|
|
saveAndReload();
|
|
|
|
showMainMenu();
|
2022-04-04 05:46:04 +00:00
|
|
|
};
|
|
|
|
if (!newAlarm) {
|
2022-04-07 22:45:27 +00:00
|
|
|
menu["Delete"] = function() {
|
2022-04-04 05:46:04 +00:00
|
|
|
alarms.splice(alarmIndex,1);
|
2022-04-07 22:45:27 +00:00
|
|
|
saveAndReload();
|
|
|
|
showMainMenu();
|
2022-04-04 05:46:04 +00:00
|
|
|
};
|
|
|
|
}
|
2022-04-07 22:45:27 +00:00
|
|
|
return E.showMenu(menu);
|
2022-04-04 05:46:04 +00:00
|
|
|
}
|
|
|
|
|
2022-04-07 22:45:27 +00:00
|
|
|
function editTimer(alarmIndex, alarm) {
|
2022-04-04 05:46:04 +00:00
|
|
|
var newAlarm = alarmIndex<0;
|
2022-04-07 22:45:27 +00:00
|
|
|
var a = {
|
|
|
|
timer : 5*60*1000, // 5 minutes
|
|
|
|
on : true,
|
|
|
|
rp : false,
|
|
|
|
as : false,
|
|
|
|
dow : 0b1111111,
|
|
|
|
last : 0,
|
|
|
|
vibrate : ".."
|
|
|
|
};
|
|
|
|
if (msg != "") a["msg"] = msg;
|
|
|
|
if (!newAlarm) Object.assign(a, alarms[alarmIndex]);
|
|
|
|
if (alarm) Object.assign(a,alarm);
|
|
|
|
var t = decodeTime(a.timer);
|
|
|
|
|
|
|
|
var timerTitle = (a.msg == undefined) ? 'Timer' : (a.msg.length > 12) ? a.msg.substring(0, 12)+"..." : msg;
|
|
|
|
|
2022-04-04 05:46:04 +00:00
|
|
|
const menu = {
|
|
|
|
'': { 'title': timerTitle },
|
2022-04-07 22:45:27 +00:00
|
|
|
'< Back' : () => showMainMenu(),
|
2022-04-04 05:46:04 +00:00
|
|
|
'Hours': {
|
2022-04-07 22:45:27 +00:00
|
|
|
value: t.hrs, min : 0, max : 23, wrap : true,
|
|
|
|
onchange: v => t.hrs=v
|
2022-04-04 05:46:04 +00:00
|
|
|
},
|
|
|
|
'Minutes': {
|
2022-04-07 22:45:27 +00:00
|
|
|
value: t.mins, min : 0, max : 59, wrap : true,
|
|
|
|
onchange: v => t.mins=v
|
2022-04-04 05:46:04 +00:00
|
|
|
},
|
|
|
|
'Enabled': {
|
2022-04-07 22:45:27 +00:00
|
|
|
value: a.on,
|
2022-04-04 05:46:04 +00:00
|
|
|
format: v=>v?"On":"Off",
|
2022-04-07 22:45:27 +00:00
|
|
|
onchange: v=>a.on=v
|
|
|
|
},
|
|
|
|
'Vibrate': require("buzz_menu").pattern(a.vibrate, v => a.vibrate=v ),
|
2022-04-04 05:46:04 +00:00
|
|
|
};
|
2022-04-07 22:45:27 +00:00
|
|
|
menu["Save"] = function() {
|
|
|
|
a.timer = encodeTime(t);
|
|
|
|
a.t = getCurrentTime() + a.timer;
|
|
|
|
if (newAlarm) alarms.push(a);
|
|
|
|
else alarms[alarmIndex] = a;
|
|
|
|
saveAndReload();
|
|
|
|
showMainMenu();
|
2022-04-04 05:46:04 +00:00
|
|
|
};
|
|
|
|
if (!newAlarm) {
|
2022-04-07 22:45:27 +00:00
|
|
|
menu["Delete"] = function() {
|
2022-04-04 05:46:04 +00:00
|
|
|
alarms.splice(alarmIndex,1);
|
2022-04-07 22:45:27 +00:00
|
|
|
saveAndReload();
|
|
|
|
showMainMenu();
|
2022-04-04 05:46:04 +00:00
|
|
|
};
|
|
|
|
}
|
2022-04-07 22:45:27 +00:00
|
|
|
return E.showMenu(menu);
|
2022-04-04 05:46:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
showMainMenu();
|