Add 'hide if charge greater than'

Move 'DEFAULTS' to try and reduce memory usage a little
master
Gordon Williams 2020-04-20 10:06:23 +01:00
parent 9cc58597cd
commit 20bb1aed84
5 changed files with 46 additions and 33 deletions

View File

@ -354,7 +354,7 @@
"name": "Battery Level Widget (with percentage)",
"shortName": "Battery Widget",
"icon": "widget.png",
"version":"0.09",
"version":"0.10",
"description": "Show the current battery level and charging status in the top right of the clock, with charge percentage",
"tags": "widget,battery",
"type":"widget",

View File

@ -6,3 +6,4 @@
0.07: Add settings: percentage/color/charger icon
0.08: Draw percentage as inverted on monochrome battery
0.09: Fix regression stopping correct widget updates
0.10: Add 'hide if charge greater than'

View File

@ -11,22 +11,22 @@
'color': COLORS[0],
'percentage': true,
'charger': true,
'hideifmorethan20pct': false,
'hideifmorethan': 100,
}
// ...and overwrite them with any saved values
// This way saved values are preserved if a new version adds more settings
const storage = require('Storage')
const saved = storage.readJSON(SETTINGS_FILE, 1) || {}
for (const key in saved) {
s[key] = saved[key]
s[key] = saved[key];
}
// creates a function to safe a specific setting, e.g. save('color')(1)
function save(key) {
return function (value) {
s[key] = value
storage.write(SETTINGS_FILE, s)
WIDGETS["batpc"].reload()
s[key] = value;
storage.write(SETTINGS_FILE, s);
WIDGETS["batpc"].reload();
}
}
@ -54,10 +54,13 @@
save('color')(s.color)
}
},
'Hide when \> 20\%': {
value: s.hideifmorethan20pct,
format: onOffFormat,
onchange: save('hideifmorethan20pct'),
'Hide if >': {
value: s.hideifmorethan||100,
min: 10,
max : 100,
step: 10,
format: x => x+"%",
onchange: save('hideifmorethan'),
},
}
E.showMenu(menu)

View File

@ -1 +0,0 @@
{"color":"By Level","percentage":true,"charger":true,"hideifmorethan20pct":false}

View File

@ -1,10 +1,4 @@
(function(){
const DEFAULTS = {
'color': 'By Level',
'percentage': true,
'charger': true,
'hideifmorethan20pct': false,
}
const COLORS = {
'white': -1,
'charging': 0x07E0, // "Green"
@ -17,10 +11,19 @@ const SETTINGS_FILE = 'widbatpc.settings.json'
let settings
function loadSettings() {
settings = require('Storage').readJSON(SETTINGS_FILE, 1) || {}
const DEFAULTS = {
'color': 'By Level',
'percentage': true,
'charger': true,
'hideifmorethan': 100,
};
Object.keys(DEFAULTS).forEach(k=>{
if (settings[k]===undefined) settings[k]=DEFAULTS[k]
});
}
function setting(key) {
if (!settings) { loadSettings() }
return (key in settings) ? settings[key] : DEFAULTS[key]
return settings[key];
}
const levelColor = (l) => {
@ -46,24 +49,27 @@ const levelColor = (l) => {
const chargerColor = () => {
return (setting('color') === 'Monochrome') ? COLORS.white : COLORS.charging
}
// sets width, returns true if it changed
function setWidth() {
WIDGETS["batpc"].width = 40;
if (Bangle.isCharging() && setting('charger')) {
WIDGETS["batpc"].width += 16;
}
var w = 40;
if (Bangle.isCharging() && setting('charger'))
w += 16;
if (E.getBattery() > setting('hideifmorethan'))
w = 0;
var changed = WIDGETS["batpc"].width != w;
WIDGETS["batpc"].width = w;
return changed;
}
function draw() {
// if hidden, don't draw
if (!WIDGETS["batpc"].width) return;
// else...
var s = 39;
var x = this.x, y = this.y;
const l = E.getBattery(),
c = levelColor(l);
const xl = x+4+l*(s-12)/100
if(!Bangle.isCharging() && setting('hideifmorethan20pct') && l > 20){
return;}
if (Bangle.isCharging() && setting('charger')) {
g.setColor(chargerColor()).drawImage(atob(
"DhgBHOBzgc4HOP////////////////////3/4HgB4AeAHgB4AeAHgB4AeAHg"),x,y);
@ -104,20 +110,24 @@ function reload() {
g.clear();
Bangle.drawWidgets();
}
// update widget - redraw just widget, or all widgets if size changed
function update() {
if (setWidth()) Bangle.drawWidgets();
else WIDGETS["batpc"].draw();
}
Bangle.on('charging',function(charging) {
if(charging) Bangle.buzz();
setWidth();
Bangle.drawWidgets(); // relayout widgets
update();
g.flip();
});
var batteryInterval;
Bangle.on('lcdPower', function(on) {
if (on) {
WIDGETS["batpc"].draw();
update();
// refresh once a minute if LCD on
if (!batteryInterval)
batteryInterval = setInterval(()=>WIDGETS["batpc"].draw(), 60000);
batteryInterval = setInterval(update, 60000);
} else {
if (batteryInterval) {
clearInterval(batteryInterval);