From 66bf7f3b1269bf1b2a053d6b50bb9604e2d54ba4 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Tue, 7 Jun 2022 21:23:12 +0200 Subject: [PATCH 1/6] ClockFace_menu: use addItems for settings --- modules/ClockFace.md | 25 +++++++++++++++++++++++++ modules/ClockFace_menu.js | 29 ++++++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/modules/ClockFace.md b/modules/ClockFace.md index 6b59e68e7..e5ab71179 100644 --- a/modules/ClockFace.md +++ b/modules/ClockFace.md @@ -174,4 +174,29 @@ Bangle.on('step', function(steps) { if (clock.paused === false) // draw step count }); +``` + + +ClockFace_menu +============== +If your clock comes with a settings menu, you can use this library to easily add +some common options: + +```js + +let settings = require("Storage").readJSON(".settings.json", true)||{}; +function save(key, value) { + settings[key] = value; + require("Storage").writeJSON(".settings.json", settings); +} + +let menu = { + "": {"title": /*LANG*/" Settings"}, +}; +require("ClockFace_menu").addItems(menu, save, { + showDate: settings.showDate, + loadWidgets: settings.loadWidgets, +}); +E.showMenu(menu); + ``` \ No newline at end of file diff --git a/modules/ClockFace_menu.js b/modules/ClockFace_menu.js index cd99ea39f..9fe61cac6 100644 --- a/modules/ClockFace_menu.js +++ b/modules/ClockFace_menu.js @@ -1,4 +1,31 @@ -// boolean options, which default to true +/** + * Add setting items to a menu + * + * @param {object} menu Menu to add items to + * @param {function} callback Callback when value changes + * @param {object} items Menu items to add, with their current value + */ +exports.addItems = function(menu, callback, items) { + Object.keys(items).forEach(key => { + let value = items[key]; + const label = { + showDate:/*LANG*/"Show date", + loadWidgets:/*LANG*/"Load widgets", + }[key]; + switch(key) { + case "showDate": + case "loadWidgets": + // boolean options, which default to true + if (value===undefined) value = true; + menu[label] = { + value: !!value, + onchange: v => callback(key, v), + }; + } + }); +}; + +// legacy boolean options exports.showDate = exports.loadWidgets = function(value, callback) { From c6c146029ef0e1ac6b65d33e6fd8661e2b7caf85 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Tue, 7 Jun 2022 21:26:31 +0200 Subject: [PATCH 2/6] barclock: Use ClockFace_menu.addItems --- apps/barclock/ChangeLog | 1 + apps/barclock/metadata.json | 2 +- apps/barclock/settings.js | 24 ++++++++++++------------ 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/apps/barclock/ChangeLog b/apps/barclock/ChangeLog index 197a24738..ba44ecef8 100644 --- a/apps/barclock/ChangeLog +++ b/apps/barclock/ChangeLog @@ -11,3 +11,4 @@ 0.11: Use ClockFace.is12Hour 0.12: Add settings to hide date,widgets 0.13: Add font setting +0.14: Use ClockFace_menu.addItems diff --git a/apps/barclock/metadata.json b/apps/barclock/metadata.json index 0a0b73778..0c227dc52 100644 --- a/apps/barclock/metadata.json +++ b/apps/barclock/metadata.json @@ -1,7 +1,7 @@ { "id": "barclock", "name": "Bar Clock", - "version": "0.13", + "version": "0.14", "description": "A simple digital clock showing seconds as a bar", "icon": "clock-bar.png", "screenshots": [{"url":"screenshot.png"},{"url":"screenshot_pm.png"}], diff --git a/apps/barclock/settings.js b/apps/barclock/settings.js index 3e97688a1..dfe25581c 100644 --- a/apps/barclock/settings.js +++ b/apps/barclock/settings.js @@ -1,26 +1,26 @@ (function(back) { - let s = require('Storage').readJSON("barclock.settings.json", true) || {}; + let s = require("Storage").readJSON("barclock.settings.json", true) || {}; - function saver(key) { - return value => { - s[key] = value; - require('Storage').writeJSON("barclock.settings.json", s); - } + function save(key, value) { + s[key] = value; + require("Storage").writeJSON("barclock.settings.json", s); } const fonts = [/*LANG*/"Bitmap",/*LANG*/"Vector"]; - const menu = { + let menu = { "": {"title": /*LANG*/"Bar Clock"}, /*LANG*/"< Back": back, - /*LANG*/"Show date": require("ClockFace_menu").showDate(s.showDate, saver('showDate')), - /*LANG*/"Load widgets": require("ClockFace_menu").loadWidgets(s.loadWidgets, saver('loadWidgets')), /*LANG*/"Font": { value: s.font|0, - min:0,max:1,wrap:true, - format:v=>fonts[v], - onchange:saver('font'), + min: 0, max: 1, wrap: true, + format: v => fonts[v], + onchange: v => save("font", v), }, }; + require("ClockFace_menu").addItems(menu, save, { + showDate: s.showDate, + loadWidgets: s.loadWidgets, + }); E.showMenu(menu); }); From 994d9f2a0871d1fd4efe5b3d6b62ba1bb55f37b9 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Tue, 7 Jun 2022 21:28:11 +0200 Subject: [PATCH 3/6] cogclock: Use ClockFace_menu.addItems --- apps/cogclock/ChangeLog | 1 + apps/cogclock/metadata.json | 2 +- apps/cogclock/settings.js | 16 ++++++++-------- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/apps/cogclock/ChangeLog b/apps/cogclock/ChangeLog index 3158b6116..684b22642 100644 --- a/apps/cogclock/ChangeLog +++ b/apps/cogclock/ChangeLog @@ -1,2 +1,3 @@ 0.01: New clock 0.02: Use ClockFace library, add settings +0.03: Use ClockFace_menu.addItems \ No newline at end of file diff --git a/apps/cogclock/metadata.json b/apps/cogclock/metadata.json index 40733bcd1..29000b589 100644 --- a/apps/cogclock/metadata.json +++ b/apps/cogclock/metadata.json @@ -1,7 +1,7 @@ { "id": "cogclock", "name": "Cog Clock", - "version": "0.02", + "version": "0.03", "description": "A cross-shaped clock inside a cog", "icon": "icon.png", "screenshots": [{"url":"screenshot.png"}], diff --git a/apps/cogclock/settings.js b/apps/cogclock/settings.js index 4eadc32c2..a6627d6d2 100644 --- a/apps/cogclock/settings.js +++ b/apps/cogclock/settings.js @@ -1,19 +1,19 @@ (function(back) { let s = require('Storage').readJSON("cogclock.settings.json", true) || {}; - function saver(key) { - return value => { - s[key] = value; - require('Storage').writeJSON("cogclock.settings.json", s); - } + function save(key, value) { + s[key] = value; + require("Storage").writeJSON("cogclock.settings.json", s); } - const menu = { + let menu = { "": {"title": /*LANG*/"Cog Clock"}, /*LANG*/"< Back": back, - /*LANG*/"Show date": require("ClockFace_menu").showDate(s.showDate, saver('showDate')), - /*LANG*/"Load widgets": require("ClockFace_menu").loadWidgets(s.loadWidgets, saver('loadWidgets')), }; + require("ClockFace_menu").addItems(menu, save, { + showDate: s.showDate, + loadWidgets: s.loadWidgets, + }); E.showMenu(menu); }); From aded08293fca595dacfaac7705be0228a46e438b Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Tue, 7 Jun 2022 21:29:18 +0200 Subject: [PATCH 4/6] ClockFace_menu: remove old options exports --- modules/ClockFace_menu.js | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/modules/ClockFace_menu.js b/modules/ClockFace_menu.js index 9fe61cac6..62a3a9576 100644 --- a/modules/ClockFace_menu.js +++ b/modules/ClockFace_menu.js @@ -23,15 +23,4 @@ exports.addItems = function(menu, callback, items) { }; } }); -}; - -// legacy boolean options -exports.showDate = -exports.loadWidgets = - function(value, callback) { - if (value === undefined) value = true; - return { - value: !!value, - onchange: v=>callback(v), - }; - }; +}; \ No newline at end of file From 5ffb6117e600f593a6764fa4ff21bad0368f8012 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Tue, 7 Jun 2022 21:43:00 +0200 Subject: [PATCH 5/6] ClockFace_menu: addSettingsFile with included Storage code --- modules/ClockFace.md | 13 +++++++++++++ modules/ClockFace_menu.js | 22 ++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/modules/ClockFace.md b/modules/ClockFace.md index e5ab71179..b2332c805 100644 --- a/modules/ClockFace.md +++ b/modules/ClockFace.md @@ -199,4 +199,17 @@ require("ClockFace_menu").addItems(menu, save, { }); E.showMenu(menu); +``` + +Or even simpler, if you just want to use a basic settings file: +```js +let menu = { + "": {"title": /*LANG*/" Settings"}, + /*LANG*/"< Back": back, +}; +require("ClockFace_menu").addSettingsFile(menu, ".settings.json", [ + "showDate", "loadWidgets" +]); +E.showMenu(menu); + ``` \ No newline at end of file diff --git a/modules/ClockFace_menu.js b/modules/ClockFace_menu.js index 62a3a9576..f2267d9ca 100644 --- a/modules/ClockFace_menu.js +++ b/modules/ClockFace_menu.js @@ -23,4 +23,26 @@ exports.addItems = function(menu, callback, items) { }; } }); +}; + +/** + * Create a basic settings menu for app, reading/writing to settings file + * + * @param {object} menu Menu to add settings to + * @param {string} settingsFile File to read/write settings to/from + * @param {string[]} items List of settings to add + */ +exports.addSettingsFile = function(menu, settingsFile, items) { + let s = require("Storage").readJSON(settingsFile, true) || {}; + + function save(key, value) { + s[key] = value; + require("Storage").writeJSON(settingsFile, s); + } + + let toAdd = {}; + items.forEach(function(key) { + toAdd[key] = s[key]; + }); + exports.addItems(menu, save, toAdd); }; \ No newline at end of file From d09f85413b0f0d13307ed0fdf15039fb1f10c76e Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Tue, 7 Jun 2022 21:44:54 +0200 Subject: [PATCH 6/6] cogclock: Use ClockFace_menu.addSettingsFile --- apps/cogclock/ChangeLog | 2 +- apps/cogclock/settings.js | 15 +++------------ 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/apps/cogclock/ChangeLog b/apps/cogclock/ChangeLog index 684b22642..f4bfe77a5 100644 --- a/apps/cogclock/ChangeLog +++ b/apps/cogclock/ChangeLog @@ -1,3 +1,3 @@ 0.01: New clock 0.02: Use ClockFace library, add settings -0.03: Use ClockFace_menu.addItems \ No newline at end of file +0.03: Use ClockFace_menu.addSettingsFile diff --git a/apps/cogclock/settings.js b/apps/cogclock/settings.js index a6627d6d2..a91b033d0 100644 --- a/apps/cogclock/settings.js +++ b/apps/cogclock/settings.js @@ -1,19 +1,10 @@ (function(back) { - let s = require('Storage').readJSON("cogclock.settings.json", true) || {}; - - function save(key, value) { - s[key] = value; - require("Storage").writeJSON("cogclock.settings.json", s); - } - let menu = { "": {"title": /*LANG*/"Cog Clock"}, /*LANG*/"< Back": back, }; - require("ClockFace_menu").addItems(menu, save, { - showDate: s.showDate, - loadWidgets: s.loadWidgets, - }); - + require("ClockFace_menu").addSettingsFile(menu, "cogclock.settings.json", [ + "showDate", "loadWidgets" + ]); E.showMenu(menu); });