1
0
Fork 0

Merge pull request #2240 from halemmerich/wid_edit

Widedit
master
Gordon Williams 2022-11-07 09:33:05 +00:00 committed by GitHub
commit 5f0e3b18a5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 56 additions and 50 deletions

View File

@ -1 +1,4 @@
0.01: new Widget Editor! 0.01: new Widget Editor!
0.02: Wrap loadWidgets instead of replacing to keep original functionality intact
Change back entry to menu option
Allow changing widgets into all areas, including bottom widget bar

View File

@ -1,24 +1,20 @@
Bangle.loadWidgets = function() { Bangle.loadWidgets = (o => ()=>{
global.WIDGETS={}; o();
require("Storage").list(/\.wid\.js$/) const s = require("Storage").readJSON("wid_edit.json", 1) || {};
.forEach(w=>{ const c = s.custom || {};
try { eval(require("Storage").read(w)); }
catch (e) { print(w, e); }
});
const s = require("Storage").readJSON("wid_edit.json", 1) || {},
c = s.custom || {};
for (const w in c){ for (const w in c){
if (!(w in WIDGETS)) continue; // widget no longer exists if (!(w in WIDGETS)) continue; // widget no longer exists
// store defaults of customized values in _WIDGETS // store defaults of customized values in _WIDGETS
global._WIDGETS=global._WIDGETS||{}; if (!global._WIDGETS) global._WIDGETS = {};
_WIDGETS[w] = {}; if (!global._WIDGETS[w]) global._WIDGETS[w] = {};
Object.keys(c[w]).forEach(k => _WIDGETS[w][k] = WIDGETS[w][k]); Object.keys(c[w]).forEach(k => global._WIDGETS[w][k] = global.WIDGETS[w][k]);
Object.assign(WIDGETS[w], c[w]); //overide values in widget with configured ones
Object.assign(global.WIDGETS[w], c[w]);
} }
const W = WIDGETS; const W = global.WIDGETS;
WIDGETS = {}; global.WIDGETS = {};
Object.keys(W) Object.keys(W)
.sort() .sort()
.sort((a, b) => (0|W[b].sortorder)-(0|W[a].sortorder)) .sort((a, b) => (0|W[b].sortorder)-(0|W[a].sortorder))
.forEach(k => WIDGETS[k] = W[k]); .forEach(k => global.WIDGETS[k] = W[k]);
} })(Bangle.loadWidgets);

View File

@ -1,6 +1,6 @@
{ {
"id": "wid_edit", "id": "wid_edit",
"version": "0.01", "version": "0.02",
"name": "Widget Editor", "name": "Widget Editor",
"icon": "icon.png", "icon": "icon.png",
"description": "Customize widget locations", "description": "Customize widget locations",

View File

@ -9,7 +9,7 @@
let cleanup = false; let cleanup = false;
for (const id in settings.custom) { for (const id in settings.custom) {
if (!(id in WIDGETS)) { if (!(id in global.WIDGETS)) {
// widget which no longer exists // widget which no longer exists
cleanup = true; cleanup = true;
delete settings.custom[id]; delete settings.custom[id];
@ -24,12 +24,12 @@
* Sort & redraw all widgets * Sort & redraw all widgets
*/ */
function redrawWidgets() { function redrawWidgets() {
let W = WIDGETS; let W = global.WIDGETS;
global.WIDGETS = {}; global.WIDGETS = {};
Object.keys(W) Object.keys(W)
.sort() .sort()
.sort((a, b) => (0|W[b].sortorder)-(0|W[a].sortorder)) .sort((a, b) => (0|W[b].sortorder)-(0|W[a].sortorder))
.forEach(k => {WIDGETS[k] = W[k]}); .forEach(k => {global.WIDGETS[k] = W[k];});
Bangle.drawWidgets(); Bangle.drawWidgets();
} }
@ -52,9 +52,9 @@
} }
function edit(id) { function edit(id) {
let WIDGET = WIDGETS[id], let WIDGET = global.WIDGETS[id],
def = {area: WIDGET.area, sortorder: WIDGET.sortorder|0}; // default values def = {area: WIDGET.area, sortorder: WIDGET.sortorder|0}; // default values
Object.assign(def, _WIDGETS[id]||{}); // defaults were saved in _WIDGETS Object.assign(def, global._WIDGETS[id]||{}); // defaults were saved in _WIDGETS
settings.custom = settings.custom||{}; settings.custom = settings.custom||{};
let saved = settings.custom[id] || {}, let saved = settings.custom[id] || {},
@ -102,7 +102,7 @@
settings.custom = settings.custom || {}; settings.custom = settings.custom || {};
settings.custom[id] = saved; settings.custom[id] = saved;
} else if (settings.custom) { } else if (settings.custom) {
delete settings.custom[id] delete settings.custom[id];
} }
if (!Object.keys(settings.custom).length) delete settings.custom; if (!Object.keys(settings.custom).length) delete settings.custom;
require("Storage").writeJSON("wid_edit.json", settings); require("Storage").writeJSON("wid_edit.json", settings);
@ -112,8 +112,8 @@
let _W = {}; let _W = {};
if (saved.area) _W.area = def.area; if (saved.area) _W.area = def.area;
if ('sortorder' in saved) _W.sortorder = def.sortorder; if ('sortorder' in saved) _W.sortorder = def.sortorder;
if (Object.keys(_W).length) _WIDGETS[id] = _W; if (Object.keys(_W).length) global._WIDGETS[id] = _W;
else delete _WIDGETS[id]; else delete global._WIDGETS[id];
// drawWidgets won't clear e.g. bottom bar if we just disabled the last bottom widget // drawWidgets won't clear e.g. bottom bar if we just disabled the last bottom widget
redrawWidgets(); redrawWidgets();
@ -122,17 +122,23 @@
m.draw(); m.draw();
} }
const AREA_NAMES = [ "Top left", "Top right", "Bottom left", "Bottom right" ];
const AREAS = [ "tl", "tr", "bl", "br" ];
const menu = { const menu = {
"": {"title": name(id)}, "": {"title": name(id),
/*LANG*/"< Back": () => { back: () => {
redrawWidgets(); redrawWidgets();
mainMenu(); mainMenu();
}, } },
/*LANG*/"Side": { /*LANG*/"Position": {
value: (area === 'tl'), value: AREAS.indexOf(area),
format: tl => tl ? /*LANG*/"Left" : /*LANG*/"Right", format: v => AREA_NAMES[v],
onchange: tl => { min: 0,
area = tl ? "tl" : "tr"; max: AREAS.length - 1,
onchange: v => {
print("v", v);
area = AREAS[v];
save(); save();
} }
}, },
@ -149,7 +155,7 @@
save(); save();
mainMenu(); // changing multiple values made the rest of the menu wrong, so take the easy out mainMenu(); // changing multiple values made the rest of the menu wrong, so take the easy out
} }
} };
let m = E.showMenu(menu); let m = E.showMenu(menu);
} }
@ -157,31 +163,32 @@
function mainMenu() { function mainMenu() {
let menu = { let menu = {
"": {"title": /*LANG*/"Widgets"}, "": {
"title": /*LANG*/"Widgets",
back: ()=>{
if (!Object.keys(global._WIDGETS).length) delete global._WIDGETS; // no defaults to remember
back();
}},
}; };
menu[/*LANG*/"< Back"] = ()=>{ Object.keys(global.WIDGETS).forEach(id=>{
if (!Object.keys(_WIDGETS).length) delete _WIDGETS; // no defaults to remember
back();
};
Object.keys(WIDGETS).forEach(id=>{
// mark customized widgets with asterisk // mark customized widgets with asterisk
menu[name(id)+((id in _WIDGETS) ? " *" : "")] = () => edit(id); menu[name(id)+((id in global._WIDGETS) ? " *" : "")] = () => edit(id);
}); });
if (Object.keys(_WIDGETS).length) { // only show reset if there is anything to reset if (Object.keys(global._WIDGETS).length) { // only show reset if there is anything to reset
menu[/*LANG*/"Reset All"] = () => { menu[/*LANG*/"Reset All"] = () => {
E.showPrompt(/*LANG*/"Reset all widgets?").then(confirm => { E.showPrompt(/*LANG*/"Reset all widgets?").then(confirm => {
if (confirm) { if (confirm) {
delete settings.custom; delete settings.custom;
require("Storage").writeJSON("wid_edit.json", settings); require("Storage").writeJSON("wid_edit.json", settings);
for(let id in _WIDGETS) { for(let id in global._WIDGETS) {
Object.assign(WIDGETS[id], _WIDGETS[id]) // restore defaults Object.assign(global.WIDGETS[id], global._WIDGETS[id]); // restore defaults
} }
global._WIDGETS = {}; global._WIDGETS = {};
redrawWidgets(); redrawWidgets();
} }
mainMenu(); // reload with reset widgets mainMenu(); // reload with reset widgets
}) });
} };
} }
E.showMenu(menu); E.showMenu(menu);