BangleApps_old/apps/mtimer/dowpicker.lib.js

116 lines
3.2 KiB
JavaScript

const r = Bangle.appRect;
const dow = ["S", "M", "T", "W", "T", "F", "S"];
let button = [[],[],[]];
const ms2String = function(ms) {
let h = Math.floor(ms / 3600000);
let m = Math.floor((ms / 60000) % 60);
if (m < 10) m = "0" + m;
let meridiem = "AM";
if (ms >= 43200000) { //12h * 60min * 60sec * 1000ms is 12:00pm
meridiem = "PM";
h -= 12;
}
return {time: h + ":" + m, meridiem: meridiem};
};
exports.dowPicker = function(alarm, submit, changeTime) {
/**
* alarm: alarm object
* submit: function, callback when ok button tapped
* changeTime: function, callback when alarm time is tapped
*/
if (alarm.rp) bits = alarm.dow;
else bits = 0b0000000;
g.clearRect(Bangle.appRect);
setupButtons();
drawButtons();
drawTime(alarm.t);
setTimeout(() => {
Bangle.setUI({mode: "custom", touch: (n, e) => buttonHandler(n, e, alarm, submit, changeTime)});
}, 100);
}
drawButton = function(button) {
// {x: number, y: number, w: number, h: number, label: string}
g.setFont("Vector:27").setFontAlign(0,0).setColor(0, 1, 1);
g.fillRect({x: button.x, y: button.y, x2: button.x + button.w - 1, y2: button.y + button.h - 1, r: 12});
if (!((bits >> button.dowNumber) & 1) || button.dowNumber === undefined) {
g.setColor(0, 0, 0).fillRect({x: button.x + 1, y: button.y + 1, x2: button.x + button.w - 2, y2: button.y + button.h - 2, r: 11});
g.setColor(1, 1, 1)
}
else g.setColor(0, 0, 0);
g.setFontAlign(0,0).drawString(button.label, button.x + (button.w / 2), button.y + (button.h / 2));
};
drawTime = function(ms) {
const timeStr = ms2String(ms);
//g.setColor(0, 1, 1).fillRect({x: r.x, y: r.y, x2: r.x2, y2: r.y + 42, r: 12})
g.setColor(1, 1, 1).setFontAlign(-1, 1).setFont("Vector:40");
const sw = g.stringWidth(timeStr.time);
g.drawString(timeStr.time, r.x + 4, r.y + 40);
g.setFont("Vector:23").drawString(timeStr.meridiem, r.x + 4 + sw, r.y + 35);
};
const setupButtons = function() {
for (let i = 0, x = 0; i <= 3; i++, x += 44) {
button[0].push({x: r.x + x, y: r.y + 47, w: 40, h: 40, label: dow[i], dowNumber: i});
}
for (let i = 4, x = 22; i <= 6; i++, x += 44) {
button[1].push({x: r.x + x, y: r.y + 91, w: 40, h: 40, label: dow[i], dowNumber: i});
}
button[2].push({x: r.x, y: r.y2 - 41, w: r.x + r.w - 1, h: 40, label: "OK"});
};
const drawButtons = function() {
g.setFontAlign(0, 1).setFont("Vector:25");
for (let row = 0; row <= 2; row++) {
for (let col = 0; col < button[row].length; col++)
{
drawButton(button[row][col]);
}
}
};
const buttonHandler = function(_n, e, alarm, submit, changeTime) {
// get row:
let row;
if (e.y < 50) {
Bangle.setUI();
changeTime(alarm);
return;
}
if (e.y > 50) row = 0;
if (e.y > 94) row = 1;
if (e.y > 135) row = 2;
// get column:
let col = 0;
if (row === 0) {
// less than 44 col = 0
if (e.x > 44) col = 1;
if (e.x > 2 * 44) col = 2;
if (e.x > 3 * 44) col = 3;
}
if (row === 1) {
// less than 66 col = 0
if (e.x > 66) col = 1;
if (e.x > 110) col = 2;
}
if (row === 2) { // submit button
Bangle.setUI();
if (bits) {
alarm.rp = true;
alarm.dow = bits;
} else {
alarm.rp = false;
alarm.dow = 0b1111111;
}
submit();
return;
}
bits = bits ^ (1 << button[row][col].dowNumber); // flip bit
drawButton(button[row][col]);
}