BangleApps/apps/ctrlpad/main.js

302 lines
10 KiB
JavaScript
Raw Normal View History

2024-04-24 17:18:00 +00:00
(function () {
2024-04-24 16:46:14 +00:00
if (!Bangle.prependListener) {
Bangle.prependListener = function (evt, listener) {
var handlers = Bangle["#on".concat(evt)];
if (!handlers) {
Bangle.on(evt, listener);
}
else {
if (typeof handlers === "function") {
Bangle.on(evt, listener);
}
Bangle["#on".concat(evt)] = [listener].concat(handlers.filter(function (f) { return f !== listener; }));
}
};
2024-04-24 17:18:00 +00:00
}
2024-04-24 16:46:14 +00:00
var Overlay = (function () {
function Overlay() {
this.width = g.getWidth() - 10 * 2;
this.height = g.getHeight() - 24 - 10;
2024-04-24 16:46:14 +00:00
this.g2 = Graphics.createArrayBuffer(this.width, this.height, 4, { msb: true });
2024-04-24 16:46:14 +00:00
this.renderG2();
2024-04-24 17:18:00 +00:00
}
2024-04-24 16:46:14 +00:00
Overlay.prototype.setBottom = function (bottom) {
var g2 = this.g2;
var y = bottom - this.height;
Bangle.setLCDOverlay(g2, 10, y - 10);
};
Overlay.prototype.hide = function () {
Bangle.setLCDOverlay();
};
Overlay.prototype.renderG2 = function () {
this.g2
.reset()
2024-04-25 11:56:36 +00:00
.setColor(g.theme.bg)
.fillRect(0, 0, this.width, this.height)
.setColor(colour.on.bg)
2024-04-24 16:46:14 +00:00
.drawRect(0, 0, this.width - 1, this.height - 1)
.drawRect(1, 1, this.width - 2, this.height - 2);
};
return Overlay;
}());
var colour = {
on: {
2024-04-24 16:46:14 +00:00
fg: "#fff",
bg: "#00a",
2024-04-24 16:46:14 +00:00
},
off: {
2024-04-24 16:46:14 +00:00
fg: "#000",
bg: "#bbb",
2024-04-24 16:46:14 +00:00
},
};
var Controls = (function () {
2024-04-25 11:56:36 +00:00
function Controls(g, controls) {
2024-04-24 16:46:14 +00:00
var height = g.getHeight();
var centreY = height / 2;
var circleGapY = 30;
var width = g.getWidth();
this.controls = [
2024-04-25 11:56:36 +00:00
{ x: width / 4 - 10, y: centreY - circleGapY },
{ x: width / 2, y: centreY - circleGapY },
{ x: width * 3 / 4 + 10, y: centreY - circleGapY },
{ x: width / 3, y: centreY + circleGapY },
{ x: width * 2 / 3, y: centreY + circleGapY },
].map(function (xy, i) {
var ctrl = xy;
var from = controls[i];
ctrl.text = from.text;
ctrl.cb = from.cb;
Object.assign(ctrl, from.cb(false) ? colour.on : colour.off);
return ctrl;
});
2024-04-24 16:46:14 +00:00
}
Controls.prototype.draw = function (g, single) {
g
.setFontAlign(0, 0)
.setFont("4x6:3");
for (var _i = 0, _a = single ? [single] : this.controls; _i < _a.length; _i++) {
var ctrl = _a[_i];
g
.setColor(ctrl.bg)
.fillCircle(ctrl.x, ctrl.y, 23)
.setColor(ctrl.fg)
.drawString(ctrl.text, ctrl.x, ctrl.y);
2024-04-24 17:18:00 +00:00
}
2024-04-24 16:46:14 +00:00
};
Controls.prototype.hitTest = function (x, y) {
var dist = Infinity;
var closest;
for (var _i = 0, _a = this.controls; _i < _a.length; _i++) {
var ctrl = _a[_i];
var dx = x - ctrl.x;
var dy = y - ctrl.y;
var d = Math.sqrt(dx * dx + dy * dy);
if (d < dist) {
dist = d;
closest = ctrl;
}
2024-04-24 17:18:00 +00:00
}
2024-04-24 16:46:14 +00:00
return dist < 30 ? closest : undefined;
};
return Controls;
}());
var state = 0;
var startY = 0;
var startedUpDrag = false;
var upDragAnim;
var ui;
var touchDown = false;
2024-04-25 11:56:36 +00:00
var initUI = function () {
if (ui)
return;
var controls = [
{
text: "BLE",
cb: function (tap) {
var on = NRF.getSecurityStatus().advertising;
if (tap) {
if (on)
NRF.sleep();
else
NRF.wake();
}
return on !== tap;
}
},
{
text: "DnD",
cb: function (tap) {
var on;
if (on = !!origBuzz) {
if (tap) {
Bangle.buzz = origBuzz;
origBuzz = undefined;
}
}
else {
if (tap) {
origBuzz = Bangle.buzz;
Bangle.buzz = function () { return Promise.resolve(); };
setTimeout(function () {
if (!origBuzz)
return;
Bangle.buzz = origBuzz;
origBuzz = undefined;
}, 1000 * 60 * 10);
}
}
return on !== tap;
}
},
{
text: "HRM",
cb: function (tap) {
var _a;
var id = "widhid";
var hrm = (_a = Bangle._PWR) === null || _a === void 0 ? void 0 : _a.HRM;
var off = !hrm || hrm.indexOf(id) === -1;
if (off) {
if (tap)
Bangle.setHRMPower(1, id);
}
else if (tap) {
Bangle.setHRMPower(0, id);
}
return !off !== tap;
}
},
2024-04-26 17:43:22 +00:00
{
text: "clk",
cb: function (tap) {
if (tap)
Bangle.showClock(), terminateUI();
return true;
},
},
{
text: "lch",
cb: function (tap) {
if (tap)
Bangle.showLauncher(), terminateUI();
return true;
},
},
2024-04-25 11:56:36 +00:00
];
var overlay = new Overlay();
ui = {
overlay: overlay,
ctrls: new Controls(overlay.g2, controls),
};
ui.ctrls.draw(ui.overlay.g2);
};
2024-04-26 17:43:22 +00:00
var terminateUI = function () {
state = 0;
ui === null || ui === void 0 ? void 0 : ui.overlay.hide();
ui = undefined;
};
2024-04-24 16:46:14 +00:00
var onDrag = (function (e) {
var _a, _b;
var dragDistance = 30;
if (e.b === 0)
touchDown = startedUpDrag = false;
switch (state) {
case 2:
2024-04-25 11:56:36 +00:00
if (e.b === 0)
2024-04-24 16:46:14 +00:00
state = 0;
break;
case 0:
if (e.b && !touchDown) {
if (e.y <= 40) {
state = 1;
startY = e.y;
}
else {
state = 2;
}
}
break;
case 1:
if (e.b === 0) {
if (e.y > startY + dragDistance) {
2024-04-25 11:56:36 +00:00
initUI();
2024-04-24 16:46:14 +00:00
state = 3;
startY = 0;
Bangle.prependListener("touch", onTouch);
Bangle.buzz(20);
ui.overlay.setBottom(g.getHeight());
2024-04-25 11:56:36 +00:00
}
else {
2024-04-26 17:43:22 +00:00
terminateUI();
2024-04-24 16:46:14 +00:00
break;
}
}
else {
var dragOffset = 32;
2024-04-25 11:56:36 +00:00
initUI();
2024-04-24 16:46:14 +00:00
ui.overlay.setBottom(e.y - dragOffset);
}
(_a = E.stopEventPropagation) === null || _a === void 0 ? void 0 : _a.call(E);
break;
case 3:
(_b = E.stopEventPropagation) === null || _b === void 0 ? void 0 : _b.call(E);
if (e.b) {
if (!touchDown) {
startY = e.y;
}
else if (startY) {
var dist = Math.max(0, startY - e.y);
if (startedUpDrag || (startedUpDrag = dist > 10))
ui.overlay.setBottom(g.getHeight() - dist);
}
}
else if (e.b === 0) {
if ((startY - e.y) > dragDistance) {
var bottom_1 = g.getHeight() - Math.max(0, startY - e.y);
if (upDragAnim)
clearInterval(upDragAnim);
upDragAnim = setInterval(function () {
if (!ui || bottom_1 <= 0) {
clearInterval(upDragAnim);
upDragAnim = undefined;
2024-04-26 17:43:22 +00:00
terminateUI();
2024-04-24 16:46:14 +00:00
return;
}
ui.overlay.setBottom(bottom_1);
bottom_1 -= 30;
}, 50);
Bangle.removeListener("touch", onTouch);
state = 0;
}
else {
ui.overlay.setBottom(g.getHeight());
}
}
break;
2024-04-24 17:18:00 +00:00
}
2024-04-24 16:46:14 +00:00
if (e.b)
touchDown = true;
});
var onTouch = (function (_btn, xy) {
var _a;
if (!ui || !xy)
2024-04-24 17:18:00 +00:00
return;
2024-04-24 16:46:14 +00:00
var top = g.getHeight() - ui.overlay.height;
var left = (g.getWidth() - ui.overlay.width) / 2;
var ctrl = ui.ctrls.hitTest(xy.x - left, xy.y - top);
if (ctrl) {
onCtrlTap(ctrl, ui);
(_a = E.stopEventPropagation) === null || _a === void 0 ? void 0 : _a.call(E);
2024-04-24 17:18:00 +00:00
}
});
2024-04-24 16:46:14 +00:00
var origBuzz;
var onCtrlTap = function (ctrl, ui) {
2024-04-25 11:56:36 +00:00
Bangle.buzz(20);
var col = ctrl.cb(true) ? colour.on : colour.off;
2024-04-24 16:46:14 +00:00
ctrl.fg = col.fg;
ctrl.bg = col.bg;
ui.ctrls.draw(ui.overlay.g2, ctrl);
2024-04-24 17:18:00 +00:00
};
2024-04-24 16:46:14 +00:00
Bangle.prependListener("drag", onDrag);
2024-04-26 17:43:22 +00:00
Bangle.on("lock", terminateUI);
2024-04-24 17:18:00 +00:00
})();