forked from FOSS/BangleApps
commit
5f0e3b18a5
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue