From 9f73450b8318b930cdf6108184ebc9f757393c91 Mon Sep 17 00:00:00 2001 From: Mika Dede Date: Tue, 28 Sep 2021 01:03:13 +0200 Subject: [PATCH] score: add configuration preset functionality --- apps.json | 1 + apps/score/README.md | 1 + apps/score/score.presets.json | 1 + apps/score/score.settings.js | 208 ++++++++++++++++++++-------------- 4 files changed, 127 insertions(+), 84 deletions(-) create mode 100644 apps/score/score.presets.json diff --git a/apps.json b/apps.json index c98686e72..b1e6f70fc 100644 --- a/apps.json +++ b/apps.json @@ -3565,6 +3565,7 @@ "storage": [ {"name":"score.app.js","url":"score.app.js"}, {"name":"score.settings.js","url":"score.settings.js"}, + {"name":"score.presets.json","url":"score.presets.json"}, {"name":"score.img","url":"score.app-icon.js","evaluate":true} ] } diff --git a/apps/score/README.md b/apps/score/README.md index ffd35e065..c3ad0e622 100644 --- a/apps/score/README.md +++ b/apps/score/README.md @@ -16,6 +16,7 @@ In this mode any score increments will be decrements. To move back a set, reduce # Settings | Setting | Description | |------------------------------------|------------------------------------------------------------------------------------------------------------------------------| +| `Presets` | Enable a preset for one of the configured sports | | `Sets to win` | How many sets a player has to win before the match is won (Maximum sets: this*2-1) | | `Sets per page` | How many sets should be shown in the app. Further sets will be available by scrolling (ignored if higher than `Sets to win`) | | `Score to win` | What score ends a given set | diff --git a/apps/score/score.presets.json b/apps/score/score.presets.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/score/score.presets.json @@ -0,0 +1 @@ +{} diff --git a/apps/score/score.settings.js b/apps/score/score.settings.js index 901867d7b..cbae83f0c 100644 --- a/apps/score/score.settings.js +++ b/apps/score/score.settings.js @@ -1,20 +1,4 @@ -(function (back, ret) { - - const fileName = 'score.json' - let settings = require('Storage').readJSON(fileName, 1) || {}; - const offon = ['No', 'Yes']; - - let changed = false; - - function save(key, value) { - changed = true; - settings[key] = value; - if (key === 'winScore' && settings.maxScore < value) { - settings.maxScore = value; - } - require('Storage').writeJSON(fileName, settings); - } - +function fillSettingsWithDefaults(settings) { if (settings.winSets == null) { settings.winSets = 1; } @@ -53,76 +37,132 @@ settings.maxScoreTiebreakMaxScore = 15; } + return settings; +} + +(function (back, ret) { + + const fileName = 'score.json'; + let settings = require('Storage').readJSON(fileName, 1) || {}; + const offon = ['No', 'Yes']; + + let presetsFileName = 'score.presets.json'; + let presets = require('Storage').readJSON(presetsFileName); + let presetNames = Object.keys(presets); + + let changed = false; + + function save(settings) { + require('Storage').writeJSON(fileName, settings); + } + + function setAndSave(key, value) { + changed = true; + settings[key] = value; + if (key === 'winScore' && settings.maxScore < value) { + settings.maxScore = value; + } + save(settings); + } + + settings = fillSettingsWithDefaults(settings); + if (ret) { return settings; } - const appMenu = {}; - appMenu[''] = {'title': 'Score Settings'}, - appMenu['< Back'] = function () { back(settings, changed); }; - if (reset) { - appMenu['Reset match'] = function () { back(settings, true); }; - } - appMenu['Sets to win'] = { - value: settings.winSets, - min:1, - onchange: m => save('winSets', m) - }; - appMenu['Sets per page'] = { - value: settings.setsPerPage, - min:1, - max:5, - onchange: m => save('setsPerPage', m) - }; - appMenu['Score to win'] = { - value: settings.winScore, - min:1, - onchange: m => save('winScore', m) - }; - appMenu['2-point lead'] = { - value: settings.enableTwoAhead, - format: m => offon[~~m], - onchange: m => save('enableTwoAhead', m) - }; - appMenu['Maximum score?'] = { - value: settings.enableMaxScore, - format: m => offon[~~m], - onchange: m => save('enableMaxScore', m) - }; - appMenu['Maximum score'] = { - value: settings.maxScore, - min: 1, - onchange: m => save('maxScore', m) - }; - appMenu['Tennis scoring'] = { - value: settings.enableTennisScoring, - format: m => offon[~~m], - onchange: m => save('enableTennisScoring', m) - }; - appMenu['TB sets?'] = { - value: settings.enableMaxScoreTiebreak, - format: m => offon[~~m], - onchange: m => save('enableMaxScoreTiebreak', m) - } - appMenu['TB Score to win'] = { - value: settings.maxScoreTiebreakWinScore, - onchange: m => save('maxScoreTiebreakWinScore', m) - } - appMenu['TB 2-point lead'] = { - value: settings.maxScoreTiebreakEnableTwoAhead, - format: m => offon[~~m], - onchange: m => save('maxScoreTiebreakEnableTwoAhead', m) - } - appMenu['TB max score?'] = { - value: settings.maxScoreTiebreakEnableMaxScore, - format: m => offon[~~m], - onchange: m => save('maxScoreTiebreakEnableMaxScore', m) - } - appMenu['TB max score'] = { - value: settings.maxScoreTiebreakMaxScore, - onchange: m => save('maxScoreTiebreakMaxScore', m) - } + const presetMenu = function () { + let ret = function () { E.showMenu(appMenu()); }; + let m = { + '': {'title': 'Score Presets'}, + '< Back': ret, + }; + for (let i = 0; i < presetNames.length; i++) { + m[presetNames[i]] = (function (i) { + return function() { + changed = true; + settings = fillSettingsWithDefaults(presets[presetNames[i]]); + save(settings); + ret(); + }; + })(i); + } - E.showMenu(appMenu) + return m; + }; -}) + const appMenu = function () { + let m = {}; + + m[''] = {'title': 'Score Settings'}; + m['< Back'] = function () { back(settings, changed); }; + if (reset) { + m['Reset match'] = function () { back(settings, true); }; + } + m['Presets'] = function () { E.showMenu(presetMenu()); }; + m['Sets to win'] = { + value: settings.winSets, + min:1, + onchange: m => setAndSave('winSets', m), + }; + m['Sets per page'] = { + value: settings.setsPerPage, + min:1, + max:5, + onchange: m => setAndSave('setsPerPage', m), + }; + m['Score to win'] = { + value: settings.winScore, + min:1, + onchange: m => setAndSave('winScore', m), + }; + m['2-point lead'] = { + value: settings.enableTwoAhead, + format: m => offon[~~m], + onchange: m => setAndSave('enableTwoAhead', m), + }; + m['Maximum score?'] = { + value: settings.enableMaxScore, + format: m => offon[~~m], + onchange: m => setAndSave('enableMaxScore', m), + }; + m['Maximum score'] = { + value: settings.maxScore, + min: 1, + onchange: m => setAndSave('maxScore', m), + }; + m['Tennis scoring'] = { + value: settings.enableTennisScoring, + format: m => offon[~~m], + onchange: m => setAndSave('enableTennisScoring', m), + }; + m['TB sets?'] = { + value: settings.enableMaxScoreTiebreak, + format: m => offon[~~m], + onchange: m => setAndSave('enableMaxScoreTiebreak', m), + }; + m['TB Score to win'] = { + value: settings.maxScoreTiebreakWinScore, + onchange: m => setAndSave('maxScoreTiebreakWinScore', m), + }; + m['TB 2-point lead'] = { + value: settings.maxScoreTiebreakEnableTwoAhead, + format: m => offon[~~m], + onchange: m => setAndSave('maxScoreTiebreakEnableTwoAhead', m), + }; + m['TB max score?'] = { + value: settings.maxScoreTiebreakEnableMaxScore, + format: m => offon[~~m], + onchange: m => setAndSave('maxScoreTiebreakEnableMaxScore', m), + }; + m['TB max score'] = { + value: settings.maxScoreTiebreakMaxScore, + onchange: m => setAndSave('maxScoreTiebreakMaxScore', m), + }; + + return m; + }; + + E.showMenu(appMenu()); + +});