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 B2 = process.env.HWVERSION===2;
// 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;
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
*/
function save() {
require('Storage').writeJSON('qmsched.json', settings);
eval(require('Storage').read('qmsched.boot.js')); // apply new schedules right away
STORAGE.writeJSON('qmsched.json', settings);
eval(STORAGE.read('qmsched.boot.js')); // apply new schedules right away
}
function get(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
*/
function loadSettings() {
settings = require('Storage').readJSON("qmsched.json", true) || {};
settings = STORAGE.readJSON("qmsched.json", true) || {};
if (Array.isArray(settings)) {
// 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...
let bOptions = require('Storage').readJSON('setting.json',true)||{};
STORAGE.erase("qmsched.json"); // need to erase old file, or Things Break, somehow...
let bOptions = STORAGE.readJSON('setting.json',true)||{};
settings = {
options: bOptions.qmOptions || {},
scheds: settings,
@ -51,7 +52,7 @@ function loadSettings() {
save();
// and clean up qmOptions from global settings file
delete bOptions.qmOptions;
require('Storage').writeJSON('setting.json',bOptions);
STORAGE.writeJSON('setting.json',bOptions);
}
// apply defaults
settings = Object.assign({
@ -82,7 +83,7 @@ function formatTime(t) {
* Apply theme
*/
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
g.theme = theme;
delete g.reset;
@ -95,6 +96,55 @@ function applyTheme() {
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
* @param {int} mode New Quite Mode
@ -127,7 +177,7 @@ function showMainMenu() {
value: !!get("switchTheme"),
onchange: v => v ? set("switchTheme", v) : unset("switchTheme"),
};
menu[/*LANG*/"LCD Settings"] = () => showOptionsMenu();
menu[/*LANG*/"Options"] = () => showOptionsMenu();
m = E.showMenu(menu);
}
@ -251,6 +301,10 @@ function showOptionsMenu() {
onchange: () => {toggle("wakeOnTwist");},
},
};
oMenu[/*LANG*/"Normal Theme"] = () => showThemeMenu(showOptionsMenu, false);
oMenu[/*LANG*/"Quiet Theme"] = () => showThemeMenu(showOptionsMenu, true);
m = E.showMenu(oMenu);
}

View File

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