First commit of widanibat (Animated battery widget)

master
Bryan 2023-12-31 16:19:57 -06:00
parent 675c8e2fbf
commit 6c8343eccc
4 changed files with 86 additions and 0 deletions

View File

@ -0,0 +1 @@
require("heatshrink").decompress(atob("oFAwMB/4A/AH38RIkDA7M/EofDA7M8EgQHQ4E/A/4HdN5Sffb7wA/AH4"));

BIN
apps/widanibat/battery.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 B

View File

@ -0,0 +1,13 @@
{ "id": "widanibat",
"name": "Battery level widget with charging animation",
"shortName":"Battery Widget",
"icon": "battery.png",
"version":"0.01",
"description": "Battery level widget with pulsing charging animation.",
"requires": ["BANGLEJS2"],
"tags": "",
"storage": [
{"name":"widanibat.widget.js","url":"widget.js"},
{"name":"widanibat.img","url":"app-icon.js","evaluate":true}
]
}

72
apps/widanibat/widget.js Normal file
View File

@ -0,0 +1,72 @@
(()=>{
const w = 26;
const h = 13;
var s, t, scale, batInt;
const animateUpdateInterval = 300;
const staticUpdateInterval = 1000 * 60 * 10; // 10 minutes
function draw(){
if (s==undefined||!Bangle.isCharging()) s = w;
if (t==undefined||!Bangle.isCharging()) t = h;
if (scale==undefined||!Bangle.isCharging()) scale = 1;
const x = this.x;
const y = this.y + 4;
const midX = ((2 * x) + w)/2;
const midY = ((2 * y) + h)/2;
g.setColor(g.theme.fg);
g.reset();
drawBattery = ()=>{
var halfS = s/2;
var halfT = t/2;
g.clearRect(x, y, x+w, y+h);
g.fillRect(midX-halfS, midY-halfT, midX+halfS-3, midY+halfT); // outer
g.clearRect(midX-halfS+2, midY-halfT+2, midX+halfS-3-2, midY+halfT-2); // centre
g.fillRect(midX+halfS-3, midY-2, midX+halfS, midY+2); // contact
g.fillRect(midX-halfS+3, midY-halfT+3,((s-9)/100*E.getBattery())+midX-halfS+3, midY+halfT-3); // the level
};
animateBattery = ()=>{
scale = 1;
var dir = 0;
if (batInt) clearInterval(batInt);
batInt = setInterval(()=>{
s = w * scale;
t = h * scale;
drawBattery();
scale = dir==0?scale-0.1:scale+0.1;
if (scale <= 0.7) dir=1;
if (scale >= 1) dir=0;
}, animateUpdateInterval);
};
staticBattery = ()=>{
s = w;
t = h;
if (batInt) clearInterval(batInt);
batInt = setInterval(drawBattery, staticUpdateInterval);
drawBattery();
};
if (Bangle.isCharging()) {
animateBattery();
} else {
staticBattery();
}
}
WIDGETS["widanibat"]={
area:"tr",
width:w,
draw:draw
};
Bangle.on('charging', (charging)=>{WIDGETS.widanibat.draw();});
})();