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)", "name": "Battery Level Widget (with percentage)",
"shortName": "Battery Widget", "shortName": "Battery Widget",
"icon": "widget.png", "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", "description": "Show the current battery level and charging status in the top right of the clock, with charge percentage",
"tags": "widget,battery", "tags": "widget,battery",
"type":"widget", "type":"widget",
@ -1372,7 +1372,7 @@
{"name":"hidcam.img","url":"app-icon.js","evaluate":true} {"name":"hidcam.img","url":"app-icon.js","evaluate":true}
] ]
}, },
{ {
"id": "rclock", "id": "rclock",
"name": "Round clock with seconds, minutes and date", "name": "Round clock with seconds, minutes and date",
"shortName":"Round Clock", "shortName":"Round Clock",

View File

@ -6,3 +6,4 @@
0.07: Add settings: percentage/color/charger icon 0.07: Add settings: percentage/color/charger icon
0.08: Draw percentage as inverted on monochrome battery 0.08: Draw percentage as inverted on monochrome battery
0.09: Fix regression stopping correct widget updates 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], 'color': COLORS[0],
'percentage': true, 'percentage': true,
'charger': true, 'charger': true,
'hideifmorethan20pct': false, 'hideifmorethan': 100,
} }
// ...and overwrite them with any saved values // ...and overwrite them with any saved values
// This way saved values are preserved if a new version adds more settings // This way saved values are preserved if a new version adds more settings
const storage = require('Storage') const storage = require('Storage')
const saved = storage.readJSON(SETTINGS_FILE, 1) || {} const saved = storage.readJSON(SETTINGS_FILE, 1) || {}
for (const key in saved) { 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) // creates a function to safe a specific setting, e.g. save('color')(1)
function save(key) { function save(key) {
return function (value) { return function (value) {
s[key] = value s[key] = value;
storage.write(SETTINGS_FILE, s) storage.write(SETTINGS_FILE, s);
WIDGETS["batpc"].reload() WIDGETS["batpc"].reload();
} }
} }
@ -54,11 +54,14 @@
save('color')(s.color) save('color')(s.color)
} }
}, },
'Hide when \> 20\%': { 'Hide if >': {
value: s.hideifmorethan20pct, value: s.hideifmorethan||100,
format: onOffFormat, min: 10,
onchange: save('hideifmorethan20pct'), max : 100,
step: 10,
format: x => x+"%",
onchange: save('hideifmorethan'),
}, },
} }
E.showMenu(menu) E.showMenu(menu)
}) })

View File

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

View File

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