mirror of https://github.com/espruino/BangleApps
Merge branch 'master' into bwclock
commit
df653552ed
|
@ -2,4 +2,5 @@
|
||||||
0.02: Design improvements and fixes.
|
0.02: Design improvements and fixes.
|
||||||
0.03: Indicate battery level through line occurrence.
|
0.03: Indicate battery level through line occurrence.
|
||||||
0.04: Use widget_utils module.
|
0.04: Use widget_utils module.
|
||||||
0.05: Support for clkinfo.
|
0.05: Support for clkinfo.
|
||||||
|
0.06: ClockInfo Fix: Use .get instead of .show as .show is not implemented for weather etc.
|
|
@ -29,7 +29,6 @@ var H = g.getHeight();
|
||||||
var cx = W/2;
|
var cx = W/2;
|
||||||
var cy = H/2;
|
var cy = H/2;
|
||||||
var drawTimeout;
|
var drawTimeout;
|
||||||
var lock_input = false;
|
|
||||||
|
|
||||||
|
|
||||||
/************************************************
|
/************************************************
|
||||||
|
@ -93,28 +92,6 @@ menu = menu.concat(clockItems);
|
||||||
settings.menuPosY = 0;
|
settings.menuPosY = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set draw functions for each item
|
|
||||||
menu.forEach((menuItm, x) => {
|
|
||||||
menuItm.items.forEach((item, y) => {
|
|
||||||
function drawItem() {
|
|
||||||
// For the clock, we have a special case, as we don't wanna redraw
|
|
||||||
// immediately when something changes. Instead, we update data each minute
|
|
||||||
// to save some battery etc. Therefore, we hide (and disable the listener)
|
|
||||||
// immedeately after redraw...
|
|
||||||
item.hide();
|
|
||||||
|
|
||||||
// After drawing the item, we enable inputs again...
|
|
||||||
lock_input = false;
|
|
||||||
|
|
||||||
var info = item.get();
|
|
||||||
drawMenuItem(info.text, info.img);
|
|
||||||
}
|
|
||||||
|
|
||||||
item.on('redraw', drawItem);
|
|
||||||
})
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
function canRunMenuItem(){
|
function canRunMenuItem(){
|
||||||
if(settings.menuPosY == 0){
|
if(settings.menuPosY == 0){
|
||||||
return false;
|
return false;
|
||||||
|
@ -204,8 +181,6 @@ function drawMenuItem(text, image){
|
||||||
drawTime();
|
drawTime();
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// image = atob("GBiBAAD+AAH+AAH+AAH+AAH/AAOHAAYBgAwAwBgwYBgwYBgwIBAwOBAwOBgYIBgMYBgAYAwAwAYBgAOHAAH/AAH+AAH+AAH+AAD+AA==");
|
|
||||||
|
|
||||||
text = String(text);
|
text = String(text);
|
||||||
|
|
||||||
g.reset().setBgColor("#fff").setColor("#000");
|
g.reset().setBgColor("#fff").setColor("#000");
|
||||||
|
@ -292,7 +267,7 @@ function drawDigits(){
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function drawDate(){
|
function drawMenu(){
|
||||||
var menuEntry = menu[settings.menuPosX];
|
var menuEntry = menu[settings.menuPosX];
|
||||||
|
|
||||||
// The first entry is the overview...
|
// The first entry is the overview...
|
||||||
|
@ -302,9 +277,8 @@ function drawDate(){
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw item if needed
|
// Draw item if needed
|
||||||
lock_input = true;
|
var item = menuEntry.items[settings.menuPosY-1].get();
|
||||||
var item = menuEntry.items[settings.menuPosY-1];
|
drawMenuItem(item.text, item.img);
|
||||||
item.show();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -320,7 +294,7 @@ function draw(){
|
||||||
g.setColor(1,1,1);
|
g.setColor(1,1,1);
|
||||||
|
|
||||||
drawBackground();
|
drawBackground();
|
||||||
drawDate();
|
drawMenu();
|
||||||
drawCircle(Bangle.isLocked());
|
drawCircle(Bangle.isLocked());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -353,10 +327,6 @@ Bangle.on('touch', function(btn, e){
|
||||||
var is_right = e.x > right && !is_upper && !is_lower;
|
var is_right = e.x > right && !is_upper && !is_lower;
|
||||||
var is_center = !is_upper && !is_lower && !is_left && !is_right;
|
var is_center = !is_upper && !is_lower && !is_left && !is_right;
|
||||||
|
|
||||||
if(lock_input){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(is_lower){
|
if(is_lower){
|
||||||
Bangle.buzz(40, 0.6);
|
Bangle.buzz(40, 0.6);
|
||||||
settings.menuPosY = (settings.menuPosY+1) % (menu[settings.menuPosX].items.length+1);
|
settings.menuPosY = (settings.menuPosY+1) % (menu[settings.menuPosX].items.length+1);
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
"name": "AI Clock",
|
"name": "AI Clock",
|
||||||
"shortName":"AI Clock",
|
"shortName":"AI Clock",
|
||||||
"icon": "aiclock.png",
|
"icon": "aiclock.png",
|
||||||
"version":"0.05",
|
"version":"0.06",
|
||||||
"readme": "README.md",
|
"readme": "README.md",
|
||||||
"supports": ["BANGLEJS2"],
|
"supports": ["BANGLEJS2"],
|
||||||
"description": "A watch face that was designed by an AI (stable diffusion) and implemented by a human.",
|
"description": "A watch face that was designed by an AI (stable diffusion) and implemented by a human.",
|
||||||
|
|
|
@ -37,3 +37,4 @@
|
||||||
0.34: Add "Confirm" option to alarm/timer edit menus
|
0.34: Add "Confirm" option to alarm/timer edit menus
|
||||||
0.35: Add automatic translation of more strings
|
0.35: Add automatic translation of more strings
|
||||||
0.36: alarm widget moved out of app
|
0.36: alarm widget moved out of app
|
||||||
|
0.37: add message input and dated Events
|
||||||
|
|
|
@ -1,15 +1,18 @@
|
||||||
# Alarms & Timers
|
# Alarms & Timers
|
||||||
|
|
||||||
This app allows you to add/modify any alarms and timers.
|
This app allows you to add/modify any alarms, timers and events.
|
||||||
|
|
||||||
|
Optional: When a keyboard app is detected, you can add a message to display when any of these is triggered.
|
||||||
|
|
||||||
It uses the [`sched` library](https://github.com/espruino/BangleApps/blob/master/apps/sched) to handle the alarm scheduling in an efficient way that can work alongside other apps.
|
It uses the [`sched` library](https://github.com/espruino/BangleApps/blob/master/apps/sched) to handle the alarm scheduling in an efficient way that can work alongside other apps.
|
||||||
|
|
||||||
## Menu overview
|
## Menu overview
|
||||||
|
|
||||||
- `New...`
|
- `New...`
|
||||||
- `New Alarm` → Configure a new alarm
|
- `New Alarm` → Configure a new alarm (triggered based on time and day of week)
|
||||||
- `Repeat` → Select when the alarm will fire. You can select a predefined option (_Once_, _Every Day_, _Workdays_ or _Weekends_ or you can configure the days freely)
|
- `Repeat` → Select when the alarm will fire. You can select a predefined option (_Once_, _Every Day_, _Workdays_ or _Weekends_ or you can configure the days freely)
|
||||||
- `New Timer` → Configure a new timer
|
- `New Timer` → Configure a new timer (triggered based on amount of time elapsed in hours/minutes/seconds)
|
||||||
|
- `New Event` → Configure a new event (triggered based on time and date)
|
||||||
- `Advanced`
|
- `Advanced`
|
||||||
- `Scheduler settings` → Open the [Scheduler](https://github.com/espruino/BangleApps/tree/master/apps/sched) settings page, see its [README](https://github.com/espruino/BangleApps/blob/master/apps/sched/README.md) for details
|
- `Scheduler settings` → Open the [Scheduler](https://github.com/espruino/BangleApps/tree/master/apps/sched) settings page, see its [README](https://github.com/espruino/BangleApps/blob/master/apps/sched/README.md) for details
|
||||||
- `Enable All` → Enable _all_ disabled alarms & timers
|
- `Enable All` → Enable _all_ disabled alarms & timers
|
||||||
|
|
|
@ -48,9 +48,10 @@ function showMainMenu() {
|
||||||
};
|
};
|
||||||
|
|
||||||
alarms.forEach((e, index) => {
|
alarms.forEach((e, index) => {
|
||||||
var label = e.timer
|
var label = (e.timer
|
||||||
? require("time_utils").formatDuration(e.timer)
|
? require("time_utils").formatDuration(e.timer)
|
||||||
: require("time_utils").formatTime(e.t) + (e.rp ? ` ${decodeDOW(e)}` : "");
|
: (e.date ? `${e.date.substring(5,10)} ${require("time_utils").formatTime(e.t)}` : require("time_utils").formatTime(e.t) + (e.rp ? ` ${decodeDOW(e)}` : ""))
|
||||||
|
) + (e.msg ? " " + e.msg : "");
|
||||||
menu[label] = {
|
menu[label] = {
|
||||||
value: e.on ? (e.timer ? iconTimerOn : iconAlarmOn) : (e.timer ? iconTimerOff : iconAlarmOff),
|
value: e.on ? (e.timer ? iconTimerOn : iconAlarmOn) : (e.timer ? iconTimerOff : iconAlarmOff),
|
||||||
onchange: () => setTimeout(e.timer ? showEditTimerMenu : showEditAlarmMenu, 10, e, index)
|
onchange: () => setTimeout(e.timer ? showEditTimerMenu : showEditAlarmMenu, 10, e, index)
|
||||||
|
@ -67,11 +68,12 @@ function showNewMenu() {
|
||||||
"": { "title": /*LANG*/"New..." },
|
"": { "title": /*LANG*/"New..." },
|
||||||
"< Back": () => showMainMenu(),
|
"< Back": () => showMainMenu(),
|
||||||
/*LANG*/"Alarm": () => showEditAlarmMenu(undefined, undefined),
|
/*LANG*/"Alarm": () => showEditAlarmMenu(undefined, undefined),
|
||||||
/*LANG*/"Timer": () => showEditTimerMenu(undefined, undefined)
|
/*LANG*/"Timer": () => showEditTimerMenu(undefined, undefined),
|
||||||
|
/*LANG*/"Event": () => showEditAlarmMenu(undefined, undefined, true)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function showEditAlarmMenu(selectedAlarm, alarmIndex) {
|
function showEditAlarmMenu(selectedAlarm, alarmIndex, withDate) {
|
||||||
var isNew = alarmIndex === undefined;
|
var isNew = alarmIndex === undefined;
|
||||||
|
|
||||||
var alarm = require("sched").newDefaultAlarm();
|
var alarm = require("sched").newDefaultAlarm();
|
||||||
|
@ -82,11 +84,16 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var time = require("time_utils").decodeTime(alarm.t);
|
var time = require("time_utils").decodeTime(alarm.t);
|
||||||
|
if (withDate && !alarm.date) alarm.date = new Date().toLocalISOString().slice(0,10);
|
||||||
|
var date = alarm.date ? new Date(alarm.date) : undefined;
|
||||||
|
var title = date ? (isNew ? /*LANG*/"New Event" : /*LANG*/"Edit Event") : (isNew ? /*LANG*/"New Alarm" : /*LANG*/"Edit Alarm");
|
||||||
|
var keyboard = "textinput";
|
||||||
|
try {keyboard = require(keyboard);} catch(e) {keyboard = null;}
|
||||||
|
|
||||||
const menu = {
|
const menu = {
|
||||||
"": { "title": isNew ? /*LANG*/"New Alarm" : /*LANG*/"Edit Alarm" },
|
"": { "title": title },
|
||||||
"< Back": () => {
|
"< Back": () => {
|
||||||
prepareAlarmForSave(alarm, alarmIndex, time);
|
prepareAlarmForSave(alarm, alarmIndex, time, date);
|
||||||
saveAndReload();
|
saveAndReload();
|
||||||
showMainMenu();
|
showMainMenu();
|
||||||
},
|
},
|
||||||
|
@ -106,6 +113,36 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex) {
|
||||||
wrap: true,
|
wrap: true,
|
||||||
onchange: v => time.m = v
|
onchange: v => time.m = v
|
||||||
},
|
},
|
||||||
|
/*LANG*/"Day": {
|
||||||
|
value: date ? date.getDate() : null,
|
||||||
|
min: 1,
|
||||||
|
max: 31,
|
||||||
|
wrap: true,
|
||||||
|
onchange: v => date.setDate(v)
|
||||||
|
},
|
||||||
|
/*LANG*/"Month": {
|
||||||
|
value: date ? date.getMonth() + 1 : null,
|
||||||
|
format: v => require("date_utils").month(v),
|
||||||
|
onchange: v => date.setMonth((v+11)%12)
|
||||||
|
},
|
||||||
|
/*LANG*/"Year": {
|
||||||
|
value: date ? date.getFullYear() : null,
|
||||||
|
min: new Date().getFullYear(),
|
||||||
|
max: 2100,
|
||||||
|
onchange: v => date.setFullYear(v)
|
||||||
|
},
|
||||||
|
/*LANG*/"Message": {
|
||||||
|
value: alarm.msg,
|
||||||
|
onchange: () => {
|
||||||
|
setTimeout(() => {
|
||||||
|
keyboard.input({text:alarm.msg}).then(result => {
|
||||||
|
alarm.msg = result;
|
||||||
|
prepareAlarmForSave(alarm, alarmIndex, time, date, true);
|
||||||
|
setTimeout(showEditAlarmMenu, 10, alarm, alarmIndex, withDate);
|
||||||
|
});
|
||||||
|
}, 100);
|
||||||
|
}
|
||||||
|
},
|
||||||
/*LANG*/"Enabled": {
|
/*LANG*/"Enabled": {
|
||||||
value: alarm.on,
|
value: alarm.on,
|
||||||
onchange: v => alarm.on = v
|
onchange: v => alarm.on = v
|
||||||
|
@ -115,8 +152,8 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex) {
|
||||||
onchange: () => setTimeout(showEditRepeatMenu, 100, alarm.rp, alarm.dow, (repeat, dow) => {
|
onchange: () => setTimeout(showEditRepeatMenu, 100, alarm.rp, alarm.dow, (repeat, dow) => {
|
||||||
alarm.rp = repeat;
|
alarm.rp = repeat;
|
||||||
alarm.dow = dow;
|
alarm.dow = dow;
|
||||||
alarm.t = require("time_utils").encodeTime(time);
|
prepareAlarmForSave(alarm, alarmIndex, time, date, true);
|
||||||
setTimeout(showEditAlarmMenu, 10, alarm, alarmIndex);
|
setTimeout(showEditAlarmMenu, 10, alarm, alarmIndex, withDate);
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
/*LANG*/"Vibrate": require("buzz_menu").pattern(alarm.vibrate, v => alarm.vibrate = v),
|
/*LANG*/"Vibrate": require("buzz_menu").pattern(alarm.vibrate, v => alarm.vibrate = v),
|
||||||
|
@ -136,6 +173,15 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (!keyboard) delete menu[/*LANG*/"Message"];
|
||||||
|
if (alarm.date || withDate) {
|
||||||
|
delete menu[/*LANG*/"Repeat"];
|
||||||
|
} else {
|
||||||
|
delete menu[/*LANG*/"Day"];
|
||||||
|
delete menu[/*LANG*/"Month"];
|
||||||
|
delete menu[/*LANG*/"Year"];
|
||||||
|
}
|
||||||
|
|
||||||
if (!isNew) {
|
if (!isNew) {
|
||||||
menu[/*LANG*/"Delete"] = () => {
|
menu[/*LANG*/"Delete"] = () => {
|
||||||
E.showPrompt(/*LANG*/"Are you sure?", { title: /*LANG*/"Delete Alarm" }).then((confirm) => {
|
E.showPrompt(/*LANG*/"Are you sure?", { title: /*LANG*/"Delete Alarm" }).then((confirm) => {
|
||||||
|
@ -145,7 +191,7 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex) {
|
||||||
showMainMenu();
|
showMainMenu();
|
||||||
} else {
|
} else {
|
||||||
alarm.t = require("time_utils").encodeTime(time);
|
alarm.t = require("time_utils").encodeTime(time);
|
||||||
setTimeout(showEditAlarmMenu, 10, alarm, alarmIndex);
|
setTimeout(showEditAlarmMenu, 10, alarm, alarmIndex, withDate);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
@ -154,14 +200,17 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex) {
|
||||||
E.showMenu(menu);
|
E.showMenu(menu);
|
||||||
}
|
}
|
||||||
|
|
||||||
function prepareAlarmForSave(alarm, alarmIndex, time) {
|
function prepareAlarmForSave(alarm, alarmIndex, time, date, temp) {
|
||||||
alarm.t = require("time_utils").encodeTime(time);
|
alarm.t = require("time_utils").encodeTime(time);
|
||||||
alarm.last = alarm.t < require("time_utils").getCurrentTimeMillis() ? new Date().getDate() : 0;
|
alarm.last = alarm.t < require("time_utils").getCurrentTimeMillis() ? new Date().getDate() : 0;
|
||||||
|
if(date) alarm.date = date.toLocalISOString().slice(0,10);
|
||||||
|
|
||||||
if (alarmIndex === undefined) {
|
if(!temp) {
|
||||||
alarms.push(alarm);
|
if (alarmIndex === undefined) {
|
||||||
} else {
|
alarms.push(alarm);
|
||||||
alarms[alarmIndex] = alarm;
|
} else {
|
||||||
|
alarms[alarmIndex] = alarm;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -255,6 +304,8 @@ function showEditTimerMenu(selectedTimer, timerIndex) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var time = require("time_utils").decodeTime(timer.timer);
|
var time = require("time_utils").decodeTime(timer.timer);
|
||||||
|
var keyboard = "textinput";
|
||||||
|
try {keyboard = require(keyboard);} catch(e) {keyboard = null;}
|
||||||
|
|
||||||
const menu = {
|
const menu = {
|
||||||
"": { "title": isNew ? /*LANG*/"New Timer" : /*LANG*/"Edit Timer" },
|
"": { "title": isNew ? /*LANG*/"New Timer" : /*LANG*/"Edit Timer" },
|
||||||
|
@ -285,6 +336,18 @@ function showEditTimerMenu(selectedTimer, timerIndex) {
|
||||||
wrap: true,
|
wrap: true,
|
||||||
onchange: v => time.s = v
|
onchange: v => time.s = v
|
||||||
},
|
},
|
||||||
|
/*LANG*/"Message": {
|
||||||
|
value: timer.msg,
|
||||||
|
onchange: () => {
|
||||||
|
setTimeout(() => {
|
||||||
|
keyboard.input({text:timer.msg}).then(result => {
|
||||||
|
timer.msg = result;
|
||||||
|
prepareTimerForSave(timer, timerIndex, time, true);
|
||||||
|
setTimeout(showEditTimerMenu, 10, timer, timerIndex);
|
||||||
|
});
|
||||||
|
}, 100);
|
||||||
|
}
|
||||||
|
},
|
||||||
/*LANG*/"Enabled": {
|
/*LANG*/"Enabled": {
|
||||||
value: timer.on,
|
value: timer.on,
|
||||||
onchange: v => timer.on = v
|
onchange: v => timer.on = v
|
||||||
|
@ -306,6 +369,7 @@ function showEditTimerMenu(selectedTimer, timerIndex) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (!keyboard) delete menu[/*LANG*/"Message"];
|
||||||
if (!isNew) {
|
if (!isNew) {
|
||||||
menu[/*LANG*/"Delete"] = () => {
|
menu[/*LANG*/"Delete"] = () => {
|
||||||
E.showPrompt(/*LANG*/"Are you sure?", { title: /*LANG*/"Delete Timer" }).then((confirm) => {
|
E.showPrompt(/*LANG*/"Are you sure?", { title: /*LANG*/"Delete Timer" }).then((confirm) => {
|
||||||
|
@ -324,15 +388,17 @@ function showEditTimerMenu(selectedTimer, timerIndex) {
|
||||||
E.showMenu(menu);
|
E.showMenu(menu);
|
||||||
}
|
}
|
||||||
|
|
||||||
function prepareTimerForSave(timer, timerIndex, time) {
|
function prepareTimerForSave(timer, timerIndex, time, temp) {
|
||||||
timer.timer = require("time_utils").encodeTime(time);
|
timer.timer = require("time_utils").encodeTime(time);
|
||||||
timer.t = require("time_utils").getCurrentTimeMillis() + timer.timer;
|
timer.t = require("time_utils").getCurrentTimeMillis() + timer.timer;
|
||||||
timer.last = 0;
|
timer.last = 0;
|
||||||
|
|
||||||
if (timerIndex === undefined) {
|
if (!temp) {
|
||||||
alarms.push(timer);
|
if (timerIndex === undefined) {
|
||||||
} else {
|
alarms.push(timer);
|
||||||
alarms[timerIndex] = timer;
|
} else {
|
||||||
|
alarms[timerIndex] = timer;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
"id": "alarm",
|
"id": "alarm",
|
||||||
"name": "Alarms & Timers",
|
"name": "Alarms & Timers",
|
||||||
"shortName": "Alarms",
|
"shortName": "Alarms",
|
||||||
"version": "0.36",
|
"version": "0.37",
|
||||||
"description": "Set alarms and timers on your Bangle",
|
"description": "Set alarms and timers on your Bangle",
|
||||||
"icon": "app.png",
|
"icon": "app.png",
|
||||||
"tags": "tool,alarm",
|
"tags": "tool,alarm",
|
||||||
|
|
|
@ -23,3 +23,5 @@
|
||||||
0.23: Feedback of apps after run is now optional and decided by the corresponding clkinfo.
|
0.23: Feedback of apps after run is now optional and decided by the corresponding clkinfo.
|
||||||
0.24: Update clock_info to avoid a redraw
|
0.24: Update clock_info to avoid a redraw
|
||||||
0.25: Use Bangle.setUI({remove:...}) to allow loading the launcher without a full reset on fw2v16.
|
0.25: Use Bangle.setUI({remove:...}) to allow loading the launcher without a full reset on fw2v16.
|
||||||
|
ClockInfo Fix: Use .get instead of .show as .show is not implemented for weather etc.
|
||||||
|
|
||||||
|
|
|
@ -14,8 +14,6 @@ const clock_info = require("clock_info");
|
||||||
const SETTINGS_FILE = "bwclk.setting.json";
|
const SETTINGS_FILE = "bwclk.setting.json";
|
||||||
const W = g.getWidth();
|
const W = g.getWidth();
|
||||||
const H = g.getHeight();
|
const H = g.getHeight();
|
||||||
let lock_input = false;
|
|
||||||
|
|
||||||
|
|
||||||
/************************************************
|
/************************************************
|
||||||
* Settings
|
* Settings
|
||||||
|
@ -125,28 +123,6 @@ if(settings.menuPosX >= menu.length || settings.menuPosY > menu[settings.menuPos
|
||||||
settings.menuPosY = 0;
|
settings.menuPosY = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set draw functions for each item
|
|
||||||
menu.forEach((menuItm, x) => {
|
|
||||||
menuItm.items.forEach((item, y) => {
|
|
||||||
let drawItem = function() {
|
|
||||||
// For the clock, we have a special case, as we don't wanna redraw
|
|
||||||
// immediately when something changes. Instead, we update data each minute
|
|
||||||
// to save some battery etc. Therefore, we hide (and disable the listener)
|
|
||||||
// immedeately after redraw...
|
|
||||||
item.hide();
|
|
||||||
|
|
||||||
// After drawing the item, we enable inputs again...
|
|
||||||
lock_input = false;
|
|
||||||
|
|
||||||
var info = item.get();
|
|
||||||
drawMenuItem(info.text, info.img);
|
|
||||||
};
|
|
||||||
|
|
||||||
item.on('redraw', drawItem);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
let canRunMenuItem = function() {
|
let canRunMenuItem = function() {
|
||||||
if(settings.menuPosY == 0){
|
if(settings.menuPosY == 0){
|
||||||
return false;
|
return false;
|
||||||
|
@ -294,12 +270,10 @@ let drawMenuAndTime = function() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw item if needed
|
// Draw item if needed
|
||||||
lock_input = true;
|
var item = menuEntry.items[settings.menuPosY-1].get();
|
||||||
var item = menuEntry.items[settings.menuPosY-1];
|
drawMenuItem(item.text, item.img);
|
||||||
item.show();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
let drawLock = function() {
|
let drawLock = function() {
|
||||||
if(settings.showLock && Bangle.isLocked()){
|
if(settings.showLock && Bangle.isLocked()){
|
||||||
g.setColor(g.theme.fg);
|
g.setColor(g.theme.fg);
|
||||||
|
@ -393,10 +367,6 @@ let touchListenerBw = function(btn, e) {
|
||||||
var is_right = e.x > right && !is_upper && !is_lower;
|
var is_right = e.x > right && !is_upper && !is_lower;
|
||||||
var is_center = !is_upper && !is_lower && !is_left && !is_right;
|
var is_center = !is_upper && !is_lower && !is_left && !is_right;
|
||||||
|
|
||||||
if(lock_input){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(is_lower){
|
if(is_lower){
|
||||||
Bangle.buzz(40, 0.6);
|
Bangle.buzz(40, 0.6);
|
||||||
settings.menuPosY = (settings.menuPosY+1) % (menu[settings.menuPosX].items.length+1);
|
settings.menuPosY = (settings.menuPosY+1) % (menu[settings.menuPosX].items.length+1);
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
0.01: New App.
|
0.01: New App.
|
||||||
0.02: Performance improvements.
|
0.02: Performance improvements.
|
||||||
0.03: Update clock_info to avoid a redraw
|
0.03: Update clock_info to avoid a redraw
|
||||||
|
0.04: Fix clkinfo -- use .get instead of .show
|
|
@ -76,21 +76,6 @@ var H = g.getHeight();
|
||||||
var menu = clock_info.load();
|
var menu = clock_info.load();
|
||||||
menu = menu.concat(dateMenu);
|
menu = menu.concat(dateMenu);
|
||||||
|
|
||||||
// Set draw functions for each item
|
|
||||||
menu.forEach((menuItm, x) => {
|
|
||||||
menuItm.items.forEach((item, y) => {
|
|
||||||
function drawItem() {
|
|
||||||
item.hide();
|
|
||||||
|
|
||||||
var info = item.get();
|
|
||||||
drawText(item.name, info.text, (y%4)+1);
|
|
||||||
}
|
|
||||||
|
|
||||||
item.on('redraw', drawItem);
|
|
||||||
})
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
// Ensure that our settings are still in range (e.g. app uninstall). Otherwise reset the position it.
|
// Ensure that our settings are still in range (e.g. app uninstall). Otherwise reset the position it.
|
||||||
if(settings.menuPosX >= menu.length || settings.menuPosY > menu[settings.menuPosX].items.length ){
|
if(settings.menuPosX >= menu.length || settings.menuPosY > menu[settings.menuPosX].items.length ){
|
||||||
settings.menuPosX = 0;
|
settings.menuPosX = 0;
|
||||||
|
@ -184,8 +169,9 @@ function drawMenuItems(menuItem) {
|
||||||
if (i >= menuItem.items.length) {
|
if (i >= menuItem.items.length) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
lock_input++;
|
|
||||||
menuItem.items[i].show();
|
var item = menuItem.items[i];
|
||||||
|
drawText(item.name, item.get().text, (i%4)+1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -217,7 +203,6 @@ function drawText(key, value, line){
|
||||||
value = String(value).replace("\n", " ");
|
value = String(value).replace("\n", " ");
|
||||||
g.drawString(key + value, x, y);
|
g.drawString(key + value, x, y);
|
||||||
|
|
||||||
lock_input -= 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -289,14 +274,8 @@ Bangle.on('charging',function(charging) {
|
||||||
draw();
|
draw();
|
||||||
});
|
});
|
||||||
|
|
||||||
var lock_input = 0;
|
|
||||||
|
|
||||||
Bangle.on('touch', function(btn, e){
|
Bangle.on('touch', function(btn, e){
|
||||||
if(lock_input > 0){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
lock_input = 0;
|
|
||||||
|
|
||||||
var left = parseInt(g.getWidth() * 0.22);
|
var left = parseInt(g.getWidth() * 0.22);
|
||||||
var right = g.getWidth() - left;
|
var right = g.getWidth() - left;
|
||||||
var upper = parseInt(g.getHeight() * 0.22) + 20;
|
var upper = parseInt(g.getHeight() * 0.22) + 20;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"id": "linuxclock",
|
"id": "linuxclock",
|
||||||
"name": "Linux Clock",
|
"name": "Linux Clock",
|
||||||
"version": "0.03",
|
"version": "0.04",
|
||||||
"description": "A Linux inspired clock.",
|
"description": "A Linux inspired clock.",
|
||||||
"readme": "README.md",
|
"readme": "README.md",
|
||||||
"icon": "app.png",
|
"icon": "app.png",
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
"BANGLEJS",
|
"BANGLEJS",
|
||||||
"BANGLEJS2"
|
"BANGLEJS2"
|
||||||
],
|
],
|
||||||
"allow_emulator": true,
|
|
||||||
"storage": [
|
"storage": [
|
||||||
{
|
{
|
||||||
"name": "pomoplus.app.js",
|
"name": "pomoplus.app.js",
|
||||||
|
@ -34,4 +33,4 @@
|
||||||
"url": "settings.js"
|
"url": "settings.js"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,11 +71,15 @@ exports.load = function() {
|
||||||
bangleItems[2].emit("redraw");
|
bangleItems[2].emit("redraw");
|
||||||
}
|
}
|
||||||
function altUpdateHandler() {
|
function altUpdateHandler() {
|
||||||
Bangle.getPressure().then(data=>{
|
try {
|
||||||
if (!data) return;
|
Bangle.getPressure().then(data=>{
|
||||||
alt = Math.round(data.altitude) + "m";
|
if (!data) return;
|
||||||
bangleItems[3].emit("redraw");
|
alt = Math.round(data.altitude) + "m";
|
||||||
});
|
bangleItems[3].emit("redraw");
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
print("Caught "+e+"\n in function altUpdateHandler in module clock_info");
|
||||||
|
bangleItems[3].emit('redraw');}
|
||||||
}
|
}
|
||||||
// actual menu
|
// actual menu
|
||||||
var menu = [{
|
var menu = [{
|
||||||
|
|
Loading…
Reference in New Issue