qmsched - Allow to use two theme files for switching themes

pull/2882/head
Martin Boonk 2023-07-15 19:06:22 +02:00
parent f4740b149b
commit 8e4eb3f5fa
2 changed files with 81 additions and 14 deletions

View File

@ -4,7 +4,8 @@ Bangle.drawWidgets();
const modeNames = [/*LANG*/"Off", /*LANG*/"Alarms", /*LANG*/"Silent"]; const modeNames = [/*LANG*/"Off", /*LANG*/"Alarms", /*LANG*/"Silent"];
const B2 = process.env.HWVERSION===2; const B2 = process.env.HWVERSION===2;
// load global settings // load global settings
let bSettings = require('Storage').readJSON('setting.json',true)||{}; const STORAGE = require('Storage');
let bSettings = STORAGE.readJSON('setting.json',true)||{};
let current = 0|bSettings.quiet; let current = 0|bSettings.quiet;
delete bSettings; // we don't need any other global settings delete bSettings; // we don't need any other global settings
@ -17,8 +18,8 @@ delete bSettings; // we don't need any other global settings
* Save settings to qmsched.json * Save settings to qmsched.json
*/ */
function save() { function save() {
require('Storage').writeJSON('qmsched.json', settings); STORAGE.writeJSON('qmsched.json', settings);
eval(require('Storage').read('qmsched.boot.js')); // apply new schedules right away eval(STORAGE.read('qmsched.boot.js')); // apply new schedules right away
} }
function get(key, def) { function get(key, def) {
return (key in settings) ? settings[key] : def; return (key in settings) ? settings[key] : def;
@ -37,12 +38,12 @@ let settings,
* Load settings file, check if we need to migrate old setting formats to new * Load settings file, check if we need to migrate old setting formats to new
*/ */
function loadSettings() { function loadSettings() {
settings = require('Storage').readJSON("qmsched.json", true) || {}; settings = STORAGE.readJSON("qmsched.json", true) || {};
if (Array.isArray(settings)) { if (Array.isArray(settings)) {
// migrate old file (plain array of schedules, qmOptions stored in global settings file) // migrate old file (plain array of schedules, qmOptions stored in global settings file)
require("Storage").erase("qmsched.json"); // need to erase old file, or Things Break, somehow... STORAGE.erase("qmsched.json"); // need to erase old file, or Things Break, somehow...
let bOptions = require('Storage').readJSON('setting.json',true)||{}; let bOptions = STORAGE.readJSON('setting.json',true)||{};
settings = { settings = {
options: bOptions.qmOptions || {}, options: bOptions.qmOptions || {},
scheds: settings, scheds: settings,
@ -51,7 +52,7 @@ function loadSettings() {
save(); save();
// and clean up qmOptions from global settings file // and clean up qmOptions from global settings file
delete bOptions.qmOptions; delete bOptions.qmOptions;
require('Storage').writeJSON('setting.json',bOptions); STORAGE.writeJSON('setting.json',bOptions);
} }
// apply defaults // apply defaults
settings = Object.assign({ settings = Object.assign({
@ -82,7 +83,7 @@ function formatTime(t) {
* Apply theme * Apply theme
*/ */
function applyTheme() { function applyTheme() {
const theme = (require("Storage").readJSON("setting.json", 1) || {}).theme; const theme = (STORAGE.readJSON("setting.json", 1) || {}).theme;
if (theme && theme.dark===g.theme.dark) return; // already correct if (theme && theme.dark===g.theme.dark) return; // already correct
g.theme = theme; g.theme = theme;
delete g.reset; delete g.reset;
@ -95,6 +96,55 @@ function applyTheme() {
m.draw(); m.draw();
} }
/**
* This creates menu entries for setting themes. This code is lifted from the setting app.
* @returns
*/
function showThemeMenu(back, quiet){
const option = quiet ? "quietTheme" : "normalTheme";
function cl(x) { return g.setColor(x).getColor(); }
var themesMenu = {
'':{title:/*LANG*/'Theme', back: back},
/*LANG*/'Dark BW': ()=>{
set(option, {
fg:cl("#fff"), bg:cl("#000"),
fg2:cl("#fff"), bg2:cl("#004"),
fgH:cl("#fff"), bgH:cl("#00f"),
dark:true,
quiet: true
});
back();
},
/*LANG*/'Light BW': ()=>{
set(option, {
fg:cl("#000"), bg:cl("#fff"),
fg2:cl("#000"), bg2:cl("#cff"),
fgH:cl("#000"), bgH:cl("#0ff"),
dark:false,
quiet: true
});
back();
}
};
STORAGE.list(/^.*\.theme$/).forEach(
n => {
let newTheme = STORAGE.readJSON(n);
themesMenu[newTheme.name ? newTheme.name : n] = () => {
set(option, {
fg:cl(newTheme.fg), bg:cl(newTheme.bg),
fg2:cl(newTheme.fg2), bg2:cl(newTheme.bg2),
fgH:cl(newTheme.fgH), bgH:cl(newTheme.bgH),
dark:newTheme.dark,
quiet: quiet
});
back();
};
}
);
E.showMenu(themesMenu);
}
/** /**
* Library uses this to make the app update itself * Library uses this to make the app update itself
* @param {int} mode New Quite Mode * @param {int} mode New Quite Mode
@ -127,7 +177,7 @@ function showMainMenu() {
value: !!get("switchTheme"), value: !!get("switchTheme"),
onchange: v => v ? set("switchTheme", v) : unset("switchTheme"), onchange: v => v ? set("switchTheme", v) : unset("switchTheme"),
}; };
menu[/*LANG*/"LCD Settings"] = () => showOptionsMenu(); menu[/*LANG*/"Options"] = () => showOptionsMenu();
m = E.showMenu(menu); m = E.showMenu(menu);
} }
@ -251,6 +301,10 @@ function showOptionsMenu() {
onchange: () => {toggle("wakeOnTwist");}, onchange: () => {toggle("wakeOnTwist");},
}, },
}; };
oMenu[/*LANG*/"Normal Theme"] = () => showThemeMenu(showOptionsMenu, false);
oMenu[/*LANG*/"Quiet Theme"] = () => showThemeMenu(showOptionsMenu, true);
m = E.showMenu(oMenu); m = E.showMenu(oMenu);
} }

View File

@ -3,23 +3,36 @@
* @param {int} mode Quiet Mode * @param {int} mode Quiet Mode
*/ */
function switchTheme(mode) { function switchTheme(mode) {
if (!!mode === g.theme.dark) return; // nothing to do
let s = require("Storage").readJSON("setting.json", 1) || {}; let s = require("Storage").readJSON("setting.json", 1) || {};
print("Theme is ", s.theme);
if (!!mode === s.theme.quiet) return; // nothing to do
// default themes, copied from settings.js:showThemeMenu() // default themes, copied from settings.js:showThemeMenu()
function cl(x) { return g.setColor(x).getColor(); } function cl(x) { return g.setColor(x).getColor(); }
s.theme = mode ? {
let q = require("Storage").readJSON("qmsched.json", 1) || {};
let quietTheme = {
// 'Dark BW' // 'Dark BW'
fg: cl("#fff"), bg: cl("#000"), fg: cl("#fff"), bg: cl("#000"),
fg2: cl("#0ff"), bg2: cl("#000"), fg2: cl("#0ff"), bg2: cl("#000"),
fgH: cl("#fff"), bgH: cl("#00f"), fgH: cl("#fff"), bgH: cl("#00f"),
dark: true dark: true,
} : { quiet: true
};
let normalTheme = {
// 'Light BW' // 'Light BW'
fg: cl("#000"), bg: cl("#fff"), fg: cl("#000"), bg: cl("#fff"),
fg2: cl("#000"), bg2: cl("#cff"), fg2: cl("#000"), bg2: cl("#cff"),
fgH: cl("#000"), bgH: cl("#0ff"), fgH: cl("#000"), bgH: cl("#0ff"),
dark: false dark: false,
quiet: false
}; };
if (q.normalTheme) normalTheme = q.normalTheme;
if (q.quietTheme) quietTheme = q.quietTheme;
s.theme = mode ? quietTheme : normalTheme;
print("New theme is ", s.theme);
require("Storage").writeJSON("setting.json", s); require("Storage").writeJSON("setting.json", s);
// reload clocks with new theme, otherwise just wait for user to switch apps // reload clocks with new theme, otherwise just wait for user to switch apps
if (Bangle.CLOCK) load(global.__FILE__); if (Bangle.CLOCK) load(global.__FILE__);