From e068ba789a18be27e16bad45e1fbc02ee833a8a9 Mon Sep 17 00:00:00 2001 From: jla-42 <66872002+jla-42@users.noreply.github.com> Date: Wed, 13 Mar 2024 22:29:08 +0100 Subject: [PATCH 01/10] Create ChangeLog --- apps/slpquiet/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/slpquiet/ChangeLog diff --git a/apps/slpquiet/ChangeLog b/apps/slpquiet/ChangeLog new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/apps/slpquiet/ChangeLog @@ -0,0 +1 @@ + From 29933cb4e8b930d3ad49109fc8931bc15b3de25d Mon Sep 17 00:00:00 2001 From: jla-42 <66872002+jla-42@users.noreply.github.com> Date: Wed, 13 Mar 2024 22:29:28 +0100 Subject: [PATCH 02/10] Add files via upload --- apps/slpquiet/ChangeLog | 2 +- apps/slpquiet/README.md | 27 +++++++++++++++++++ apps/slpquiet/app-icon.js | 1 + apps/slpquiet/app.js | 45 +++++++++++++++++++++++++++++++ apps/slpquiet/app.png | Bin 0 -> 2275 bytes apps/slpquiet/boot.js | 52 ++++++++++++++++++++++++++++++++++++ apps/slpquiet/metadata.json | 16 +++++++++++ apps/slpquiet/widget.js | 36 +++++++++++++++++++++++++ 8 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 apps/slpquiet/README.md create mode 100644 apps/slpquiet/app-icon.js create mode 100644 apps/slpquiet/app.js create mode 100644 apps/slpquiet/app.png create mode 100644 apps/slpquiet/boot.js create mode 100644 apps/slpquiet/metadata.json create mode 100644 apps/slpquiet/widget.js diff --git a/apps/slpquiet/ChangeLog b/apps/slpquiet/ChangeLog index 8b1378917..5560f00bc 100644 --- a/apps/slpquiet/ChangeLog +++ b/apps/slpquiet/ChangeLog @@ -1 +1 @@ - +0.01: New App! diff --git a/apps/slpquiet/README.md b/apps/slpquiet/README.md new file mode 100644 index 000000000..a1f2e94e1 --- /dev/null +++ b/apps/slpquiet/README.md @@ -0,0 +1,27 @@ +# Sleep Quiet + +Set Quiet mode (or alarms only mode), when the sleep tracking app detects sleep (each 10 min evaluated) + +## Usage + +When activated, app disables all notifications / all except alarms when sleep detected. + +## Controls + +In the app you can activate / deactivate the functionality and define if all notifications / all except alarms are to be silenced. + +## Creator + +[jla-42](https://github.com/jla-42) + +## Note +The app is based upon the [sleeplog](https://github.com/espruino/BangleApps/tree/master/apps/sleeplog) app. + +It reuses the widget from [Quiet Mode Schedule and Widget](https://github.com/espruino/BangleApps/tree/master/apps/qmsched), as it does exactly what I needed, so why reinvent the wheel. + +## ToDos +-further code clean up + +-optimization of code (and check if needed) + +-feedback is always welcome diff --git a/apps/slpquiet/app-icon.js b/apps/slpquiet/app-icon.js new file mode 100644 index 000000000..0f0ece725 --- /dev/null +++ b/apps/slpquiet/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEw4UA///jc+tfUvk+Jf8AhWoBhUoBZWgBRMCwAvKHa5bTG5UqJ4OqBY+qBYJpIBYRpIBYRRIBYQAIBbJhJBYIBBktVAAVoBYmoj//AAXWBYsdC4d1BZVdGwILO0ALIAAWdBY+vIQILI04LBrojKAAoLyX40CBeUqBZD1HAH8AA=")) diff --git a/apps/slpquiet/app.js b/apps/slpquiet/app.js new file mode 100644 index 000000000..7ec02d676 --- /dev/null +++ b/apps/slpquiet/app.js @@ -0,0 +1,45 @@ +const SETTINGS_FILE = "quietSwitch.json"; +const storage = require("Storage"); +let settings = storage.readJSON('setting.json', 1); +let saved = storage.readJSON(SETTINGS_FILE, 1) || {}; + +// Main menu +var mainmenu = { +"" : { + "title" : "Quiet Switch" + }, + + "Quiet Switch" : { + value : saved.quietWhenSleep, + format : v => v?"On":"Off", + min:0,max:1,step:1, + onchange :v=>{ + saved.quietWhenSleep = v; + storage.writeJSON(SETTINGS_FILE,saved); + } + }, + "Quiet Mode" : { + value : saved.quietMode, + format : v => v?"Alerts":"Silent", + min:0,max:1,step:1, + onchange :v=>{ + saved.quietMode = v; + storage.writeJSON(SETTINGS_FILE,saved); + } + }, + "Exit" : function() {load();}, +}; + +// Actually display the menu +E.showMenu(mainmenu); + +// Function to fix time format +function fixTime(h, m) { + if (h.toString().length <2) { + h = "0" + h.toString(); + } + if (m.toString().length <2) { + m = "0" + m.toString(); + } + return h.toString() +":" + m.toString(); +} diff --git a/apps/slpquiet/app.png b/apps/slpquiet/app.png new file mode 100644 index 0000000000000000000000000000000000000000..c038d8a5d2bcc4224381efe9241e3edc24983c10 GIT binary patch literal 2275 zcmV<92pso`P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5dZ)S5dnW>Uy%R+2zW_EK~!i%?OAllnbASv=^xM>1#o*!onnBoIr z=1zqx!}~vIX1V-CY52qxXc?ZU4&~(0s@36ouII<7%XZ-=%w;scVNo*AfS|hQ#|fh4~v$;|!M-?E}%D+%%g#(hC^~Vct{P^A5#2Phvk~UVetF*w)OR?#M99~aUZL!>XIue!PF9O zrPWA}{qR-7qkshJ3aG-payZ4pm>v|6s&H6>W{0I9gv373r*cp0m!i)YvFJXY&1gK! zF;hy%SB;MHw%*Bhkl9aB_>iu}`xS0=Ddt7Bt#2ySe)Mz=M)HEQqBjfKISv(QeF|XR zZh(qL04qN=AC9fBA3E9^*o*CM6h>jy)it`Nz2Sd%aL?$ft&AzsZY3CMG&K!_3|5=6 z{AWM+oswlS#HtzwJN^;-lCxCF@Vbz&1jqq^NE_z9l>mVTREnaSV!Jf74@~Y*YHGi2 z#$!k1OmfGOo{eT=e1u679)&F9@)e*|*M!ta-KTt!$c?_b$a1-+`eroqGG~dB;kAGb zlvUtu>Gl_Z_P+70lE30bu4e}&U|&Ca=S_BQ|Ie1@oN7u>axLCzWYV2RI@zfw;x<{y zRHr#UxshkAU)zf;03M&?2fxrIHQd+@Ew2D5L4d=Z0P#ZrS?G}-fo_LwPTX-az5y$Q z{Yo&n+|Uxg1&RGhW~>$u;Uis7|Dpf38>SuBvY~(l5NL0wPceqwEv7+6=!Pp|enLzu9XcMUCeH_uFW z@&byH4Yg2{D zJPs<~4wh&FSsK6~-^13QI^ZnviNdSE;d{HJh_4%_lK4voh#mv*O@T;4H+vL%ME|YZ zFw4FM3O>rwQa%aicodo@HtkzAc&@hj%tM&?uj7=uY`Pj?iH(02m=l6azuSKN?t<1U ztUw&=TnX#kiNE2sFbP6~o$N7qfgitRP^w^SA>(8xS|MOT`cioRueQIEtgT^>sj^Dd zC1PP2>|GJw`nnUA)>n{{p!PynT4SWaZe0Zfbq*R{5sRVl>DT`*IxqB!&xs@Emfx>`p4@OR=(3O6`u3r?=^QxLA@I;ok!vEkck5o z_{EByuy@5Ss5NxFumo6GGSRuviHnd5YX)L)-*f*0!$;=IuXU}U64)j}MgbBjECkRK5?F-GC@E8*&ROj;%Bw&T7@Q200sLwyrZw-`;M6-e0> zwj{iBE}r75GzI8s`le8Ml~jdG;2H|<7Q){(^H9M4et||qtIZcOp7}Y07;jjtD#noe z^0%D@0e2ynNM-Oev0uo`T%h1Lt1_%K&=M{p_;NUvhMt!1&3-GKOMxFrweUkoI0FQF zDU8E&>=D@Ij4UdKUxJ<2hhZ1_zl-{6jE6Klf6I4Kwi)ockOWcth|uh=`R(e{D*jcj zoIsyXlgp92RafL&f@A?k#cX&j@HQ;R=2?7~X|>ZHx(}wnVN~@6_BFuzV(~HZGBlwA zJFz%iLvDob1f~fiQYAdU=9_TNVOzoy$^lOdln4rbs(dJ8Q%gkALgTdN%$7iD!F|hj z`%YnD7a7zNE%+-ysS1#AVWbEWCN%pMkH#>(Y;yaw-jzfkp|7NTZp$m;wpk>~c6e(* z%o!^RcY|Ue!8RZ@*uV16kN^Z%7=qgpX7*=d=6-IU+L?X#SuEjz{^3_t2@-BTxEr|U zbzP;9@WtQ?>SE?^>XRkN0+UFj09~g=*S>PW`9Q8i{!Uj5UNJzQ6={t66c2PDq#U(w xpFqmHF5~ve_sL~k!a@V+<1fVm{Vo9j{{y6Xx8*7r14{q^002ovPDHLkV1jX@N16Zt literal 0 HcmV?d00001 diff --git a/apps/slpquiet/boot.js b/apps/slpquiet/boot.js new file mode 100644 index 000000000..a4eb3faeb --- /dev/null +++ b/apps/slpquiet/boot.js @@ -0,0 +1,52 @@ +// first ensure that the sleeplog trigger object is available (sleeplog is enabled) +if (typeof (global.sleeplog || {}).trigger === "object") { + // then add your parameters with the function to call as object into the trigger object + +sleeplog.trigger["quietMode"] = { + onChange: true, // false as default, if true call fn only on a status change + from: 0, // 0 as default, in ms, first time fn will be called + // to: 24*60*60*1000, // 24h as default, in ms, last time fn will be called + to: 0, + // reference time to from & to is rounded to full minutes + fn: function(data, thisTriggerEntry) { + aSettings = require('Storage').readJSON('quietSwitch.json', 1) || {}; + const DEFAULTS = { + 'quietWhenSleep': false, + 'quietMode': 1 + }; + Object.keys(DEFAULTS).forEach(k => { + if (aSettings[k] === undefined) aSettings[k] = DEFAULTS[k]; + }); + + if (aSettings && aSettings['quietWhenSleep']){ + console.log("the sleep status is: "+data.status); + quietMode = aSettings['quietMode']; + delete aSettings; + if ((data.status === 3 || data.status === 4) + && (data.prevStatus !== 3 && data.prevStatus !== 4 )) { + bSettings = require("Storage").readJSON('setting.json',true)||{}; + current = 0|bSettings.quiet; + console.log("quiet mode is:" + current); + if (current !== quietMode ){ + console.log("fallen asleep"); + bSettings.quiet = quietMode; + require("Storage").writeJSON("setting.json", bSettings); + } + delete bSettings; + } + if ((data.status === 2 || data.status === 1) + && (data.prevStatus !== 2 && data.prevStatus !== 1 )) { + bSettings = require("Storage").readJSON('setting.json',true)||{}; + current = 0|bSettings.quiet; + console.log("quiet mode is:" + current); + if (current !== 0 ){ + console.log("woken up"); + bSettings.quiet = 0; + require("Storage").writeJSON("setting.json", bSettings); + } + delete bSettings; + } + } + } + }; +} diff --git a/apps/slpquiet/metadata.json b/apps/slpquiet/metadata.json new file mode 100644 index 000000000..d1f763e68 --- /dev/null +++ b/apps/slpquiet/metadata.json @@ -0,0 +1,16 @@ +{ "id": "slpquiet", + "name": "Sleep Quiet (activate quiet mode when asleep)", + "shortName":"Sleep Quiet", + "version":"0.01", + "description": "Set Quiet mode (or alarms only mode), when the sleep tracking app detects sleep (each 10 min evaluated)", + "icon": "app.png", + "tags": "tool,widget", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"slpquiet.app.js","url":"app.js"}, + {"name":"slpquiet.boot.js","url":"boot.js"}, + {"name":"slpquiet.img","url":"app-icon.js","evaluate":true}, + {"name":"slpquiet.wid.js","url":"widget.js"} + ] +} diff --git a/apps/slpquiet/widget.js b/apps/slpquiet/widget.js new file mode 100644 index 000000000..0ad3c776f --- /dev/null +++ b/apps/slpquiet/widget.js @@ -0,0 +1,36 @@ +(function() { + WIDGETS["qmsched"] = { + area: "tl", + width: ((require("Storage").readJSON("setting.json", 1) || {}).quiet|0) ? 24 : 0, + draw: function() { + const mode = (require("Storage").readJSON("setting.json", 1) || {}).quiet|0; + if (mode===0) { // Off + if (this.width!==0) { + this.width = 0; + Bangle.drawWidgets(); + } + return; + } + // not Off: make sure width is correct + if (this.width!==24) { + this.width = 24; + Bangle.drawWidgets(); + return; // drawWidgets will call draw again + } + let x = this.x, y = this.y; + g.reset().clearRect(x, y, x+23, y+23); + // quiet mode: draw red one-way-street sign (dim red on Bangle.js 1) + x = this.x+11;y = this.y+11; // center of widget + g.setColor(process.env.HWVERSION===2 ? 1 : 0.8, 0, 0).fillCircle(x, y, 8); + g.setColor(g.theme.bg).fillRect(x-6, y-2, x+6, y+2); + if (mode>1) {return;} // no alarms + // alarms still on: draw alarm icon in bottom-right corner + x = this.x+18;y = this.y+17; // center of alarm + g.setColor(1, 1, 0) + .fillCircle(x, y, 3) // alarm body + .fillRect(x-5, y+2, x+5, y+3) // bottom ridge + .fillRect(x-1, y-5, x+1, y+5).drawLine(x, y-6, x, y+6) // top+bottom + .drawLine(x+5, y-3, x+3, y-5).drawLine(x-5, y-3, x-3, y-5); // wriggles + }, + }; +})(); From 9fa101b934806bd35269c163778144b39b2588cc Mon Sep 17 00:00:00 2001 From: jla-42 <66872002+jla-42@users.noreply.github.com> Date: Wed, 13 Mar 2024 22:30:18 +0100 Subject: [PATCH 03/10] Create ChangeLog --- apps/thmswtch/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/thmswtch/ChangeLog diff --git a/apps/thmswtch/ChangeLog b/apps/thmswtch/ChangeLog new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/apps/thmswtch/ChangeLog @@ -0,0 +1 @@ + From f314eabe20d8e334e59e98abe29cf566d64b8cc5 Mon Sep 17 00:00:00 2001 From: jla-42 <66872002+jla-42@users.noreply.github.com> Date: Wed, 13 Mar 2024 22:32:13 +0100 Subject: [PATCH 04/10] Add files via upload --- apps/thmswtch/ChangeLog | 2 +- apps/thmswtch/README.md | 35 ++++++ apps/thmswtch/app-icon.js | 1 + apps/thmswtch/app.js | 217 ++++++++++++++++++++++++++++++++++++ apps/thmswtch/app.png | Bin 0 -> 879 bytes apps/thmswtch/boot.js | 115 +++++++++++++++++++ apps/thmswtch/metadata.json | 15 +++ 7 files changed, 384 insertions(+), 1 deletion(-) create mode 100644 apps/thmswtch/README.md create mode 100644 apps/thmswtch/app-icon.js create mode 100644 apps/thmswtch/app.js create mode 100644 apps/thmswtch/app.png create mode 100644 apps/thmswtch/boot.js create mode 100644 apps/thmswtch/metadata.json diff --git a/apps/thmswtch/ChangeLog b/apps/thmswtch/ChangeLog index 8b1378917..5560f00bc 100644 --- a/apps/thmswtch/ChangeLog +++ b/apps/thmswtch/ChangeLog @@ -1 +1 @@ - +0.01: New App! diff --git a/apps/thmswtch/README.md b/apps/thmswtch/README.md new file mode 100644 index 000000000..31e6aabe9 --- /dev/null +++ b/apps/thmswtch/README.md @@ -0,0 +1,35 @@ +# Theme Switcher + +Switch Dark/Light theme based on time or on sunrise/sunset + +## Usage + +When activated, switches automaticaly the theme based on time or on sunrise/sunset. + +## Controls + +In the app you can: + +-activate / deactivate the general functionality + +-manualy switch dark/light theme + +-define times for light / dark switch (at the moment 1 --> dark and 1 --> light switch time) + +-set automatic witching based on sunrise/sunset times privided by the [suncalc](https://github.com/jla-42/BangleApps/blob/master/modules/suncalc.js) module + +## Creator + +[jla-42](https://github.com/jla-42) + +## Note +The app functionality is inspired by the [Quiet Mode Schedule and Widget](https://github.com/espruino/BangleApps/tree/master/apps/qmsched) app, where i missed the sunrise/sunset functionality, and wanted an indipendent switch of the theme and notifications. + +## ToDos +-further code clean up + +-optimization of code (and check if needed) + +-transfer of configuration into settings, so app can be used as a shortcut to switch theme. + +-feedback is always welcome diff --git a/apps/thmswtch/app-icon.js b/apps/thmswtch/app-icon.js new file mode 100644 index 000000000..bc47207e5 --- /dev/null +++ b/apps/thmswtch/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgIWTj/4Aof//4ECgYFB4AFBh4FB+AWCAoIYCn///18AoN/BYMeEQf/h8AgIFCg+AFAX/gfAAocB4EHAofgAocA8A6CAoPwAolwAopGC/wFGnAFI/gFKMgIFDOAIFJ8AFERAJBDOoIFCGgIFDRoXwMoIcBMoJ/BAgJxBgYFDQYKwCAYINBAoIVCWwShBgF4AQKtCnwCBXIUfwEBG4UPSQIaCborpFCQT/HABY=")) diff --git a/apps/thmswtch/app.js b/apps/thmswtch/app.js new file mode 100644 index 000000000..e4312a44d --- /dev/null +++ b/apps/thmswtch/app.js @@ -0,0 +1,217 @@ +const SETTINGS_FILE = "themeSwitch.json"; +const storage = require("Storage"); +var sunrise, sunset, date; +var SunCalc = require("suncalc"); // from modules folder +const locale = require("locale"); +let settings = storage.readJSON('setting.json', 1); +let saved = storage.readJSON(SETTINGS_FILE, 1) || {}; +if (settings.theme.fg >0) { + saved.darkModeActive = 1 +}else { + saved.darkModeActive = 0 +} + if (require("Storage").readJSON("themeSwitch.json",1) !== undefined){ + dmH = parseInt(saved.darkModeAt.split(":")[0]| 0); + dmM = parseInt(saved.darkModeAt.split(":")[1] |0); + lmH = parseInt(saved.lightModeAt.split(":")[0] |0); + lmM = parseInt(saved.lightModeAt.split(":")[1] |0); + }else{ + dmH = 0; + dmM = 0; + lmH = 0; + lmM = 0; + } +// Main menu + + var mainmenu = { + "" : { + "title" : "Theme Switch" + }, + "< Back" : function() {load();}, + "Automatic Dark Mode" : { + value : saved.darkMode | false, + format : v => v?"On":"Off", + min:0,max:1,step:1, + onchange :v=>{ + saved.darkMode = v; + storage.writeJSON(SETTINGS_FILE,saved); + } + }, + "Dark Mode Active" : { + value : saved.darkModeActive | false, + format : v => v?"On":"Off", + min:0,max:1,step:1, + onchange :v=>{ + saved.darkModeActive = v; + storage.writeJSON(SETTINGS_FILE,saved); + if (v!==0) { + setDarkTheme(); + Bangle.drawWidgets(); + delete m.lastIdx; + }else { + setLightTheme(); + Bangle.drawWidgets(); + delete m.lastIdx;} + } + }, + "Dark Mode by Sun" : { + value : saved.darkModeBySun | false, + format : v => v?"On":"Off", + min:0,max:1,step:1, + onchange : v =>{ + saved.darkModeBySun =v; + if (v!==0) { + //print("calculating sun times"); + calculateSunTimes(); + saved.lightModeAt = sunrise; + saved.darkModeAt = sunset; + //print("sunrise" +sunrise); + //print("sunset" +sunset); + + + + } + storage.writeJSON(SETTINGS_FILE,saved); + }, + }, + "light mode at" : { + value : saved.lightModeAt, + format: v => saved.lightModeAt, + onchange :function(){ + if(saved.darkModeBySun===0){ + E.showMenu(lightModeAtMenu); + } + else{ + E.showAlert("Deactivate dark mode first!", "Action Blocked").then( + function() {E.showMenu(mainmenu);}); + } + } + }, + "dark mode at" : { + value : saved.darkModeAt , + format: v => saved.darkModeAt, + onchange :function(){ + if(saved.darkModeBySun===0){ + E.showMenu(darkModeAtMenu); + } + else{ + E.showAlert("Deactivate dark mode first!", "Action Blocked").then( function() {E.showMenu(mainmenu);}); + } + } + }, + "Exit" : function() {load();}, + +}; + +var lightModeAtMenu = { + "" : { + "title" : "light mode at" + }, + "Hour" : { + value : lmH, + min:0,max:23,step:1, + onchange : v => { lmH=v; }}, + "Minute" : { + value : lmM, + min:0,max:59,step:1, + onchange : v => { lmM=v; }}, + "< Back" : function() { saved.lightModeAt = fixTime(lmH,lmM); + storage.writeJSON(SETTINGS_FILE,saved); + E.showMenu(mainmenu); }, + }; + + var darkModeAtMenu = { + "" : { + "title" : "dark mode at" + }, + "Hour" : { + value : dmH, + min:0,max:23,step:1, + onchange : v => { dmH=v; }}, + "Minute" : { + value : dmM, + min:0,max:59,step:1, + onchange : v => { dmM=v; }}, + "< Back" : function() {saved.darkModeAt = fixTime(dmH,dmM); + storage.writeJSON(SETTINGS_FILE,saved); + E.showMenu(mainmenu); }, + }; + +// Actually display the menu +E.showMenu(mainmenu); + +// Function to fix time format +function fixTime(h, m) { + if (h.toString().length <2) { + h = "0" + h.toString(); + } + if (m.toString().length <2) { + m = "0" + m.toString(); + } + return h.toString() +":" + m.toString(); +} + +function calculateSunTimes() { + var location = require("Storage").readJSON("mylocation.json",1)||{}; + location.lat = location.lat||51.5072; + location.lon = location.lon||0.1276; // London + date = new Date(Date.now()); + var times = SunCalc.getTimes(date, location.lat, location.lon); + sunrise = fixTime(times.sunrise.getHours() , times.sunrise.getMinutes()); + sunset = fixTime(times.sunset.getHours() ,times.sunset.getMinutes()); + /* do we want to re-calculate this every day? Or we just assume + that 'show' will get called once a day? */ + } + +function cl(x) { return g.setColor(x).getColor(); } + +function upd(th) { + g.theme = th; + settings.theme = th; + storage.write('setting.json', settings); + delete g.reset; + g._reset = g.reset; + g.reset = function(n) { return g._reset().setColor(th.fg).setBgColor(th.bg); }; + g.clear = function(n) { if (n) g.reset(); return g.clearRect(0,0,g.getWidth(),g.getHeight()); }; + g.clear(1); +} + +function flipTheme() { + if (!g.theme.dark) { + upd({ + fg:cl("#fff"), bg:cl("#000"), + fg2:cl("#fff"), bg2:cl("#004"), + fgH:cl("#fff"), bgH:cl("#00f"), + dark:true + }); + } else { + upd({ + fg:cl("#000"), bg:cl("#fff"), + fg2:cl("#000"), bg2:cl("#cff"), + fgH:cl("#000"), bgH:cl("#0ff"), + dark:false + }); + } +} + +function setDarkTheme() { + if (!g.theme.dark) { + upd({ + fg:cl("#fff"), bg:cl("#000"), + fg2:cl("#fff"), bg2:cl("#004"), + fgH:cl("#fff"), bgH:cl("#00f"), + dark:true + }); + } +} + +function setLightTheme() { + if (g.theme.dark) { + upd({ + fg:cl("#000"), bg:cl("#fff"), + fg2:cl("#000"), bg2:cl("#cff"), + fgH:cl("#000"), bgH:cl("#0ff"), + dark:false + }); + } +} diff --git a/apps/thmswtch/app.png b/apps/thmswtch/app.png new file mode 100644 index 0000000000000000000000000000000000000000..44ad1483d97e53187b3df19e83b7d68eb55a3fc7 GIT binary patch literal 879 zcmV-#1CacQP)rK7_^Hdg`HSLLJUf*Gzx-3P!Tn)f=$%Bh=OP$-pRmQ7{=S(+1c5N#eMML z*nKnez1cVKy?F;sH1S`c1oQ(#z!WeKECS2GlKg%r?}kKIjahMY0^`6}pq^2bQDZVk zaC87OK+S=;DK+3eP!2(S4R9U!?SZ%{YR-`&U28k=$}{P=4Zh+_pv^b=J;3JzcKxEv zJ!?Gw1oZeM|Gfb6N*>D^Ex>t+SkXJRX15QwDPrd%`31CU>+Lrpn)(vkT*;TjAL|9n z7Gqr%R=;TPUju7h47e76d_BfZdL;=)I#*rdd=a6tksOWTa8}b<&YCA?0+FvL7@+V( z)4OL&zSC2NwUq-2T)KciqE{2oNX2+S^7RIX*u;dUd&4I3xD;lt@&j0v!s(EvUp2z+ zKR6h8_aCP1s2KQO8`GDhJQUb~3)tbNHs(^2;@!Xo?65T8v^HikNpU_P`KS)EL6=d% z#-bX~fWsLK*sP6HWkxLYYOqLA<#QISGYY^JH9)P=p3#7ktpSw)2Am-~Hrl#S(TDh! zTwb!G+x8Go6-fR;S{6;ffNdBpDv{mJLEfy-)IB;D{ho=dI{uua+eA=fKiHNMCFz*? zApg|1{7pfhHm3?QtJ4OI_05wP1+sGK$CUhqj?cPIT!M6vmf9PqUEh`Hm+6(<_xm^mMA6Ni#C zTJ^?jBp)S lt && at < dt) { + return "darkT"; + }else if (at >lt && at > dt) { + return "lightN";} + } + function setDarkTheme() { + if (!g.theme.dark) { + upd({ + fg:cl("#fff"), bg:cl("#000"), + fg2:cl("#fff"), bg2:cl("#004"), + fgH:cl("#fff"), bgH:cl("#00f"), + dark:true + }); + } + } + + function setLightTheme() { + if (g.theme.dark) { + upd({ + fg:cl("#000"), bg:cl("#fff"), + fg2:cl("#000"), bg2:cl("#cff"), + fgH:cl("#000"), bgH:cl("#0ff"), + dark:false + }); + } + } + function fixTime(h, m) { + if (h.toString().length <2) { + h = "0" + h.toString(); + } + if (m.toString().length <2) { + m = "0" + m.toString(); + } + return h.toString() +":" + m.toString(); + } + function calculateSunTimes() { + var location = require("Storage").readJSON("mylocation.json",1)||{}; + location.lat = location.lat||51.5072; + location.lon = location.lon||0.1276; // London + date = new Date(Date.now()); + var times = SunCalc.getTimes(date, location.lat, location.lon); + sunrise = fixTime(times.sunrise.getHours() , times.sunrise.getMinutes()); + sunset = fixTime(times.sunset.getHours() ,times.sunset.getMinutes()); + /* do we want to re-calculate this every day? Or we just assume + that 'show' will get called once a day? */ + } + function cl(x) { return g.setColor(x).getColor(); } + function upd(th) { + g.theme = th; + settings = storage.readJSON('setting.json',1) + settings.theme = th; + storage.write('setting.json', settings); + delete g.reset; + g._reset = g.reset; + g.reset = function(n) { return g._reset().setColor(th.fg).setBgColor(th.bg); }; + g.clear = function(n) { if (n) g.reset(); return g.clearRect(0,0,g.getWidth(),g.getHeight()); }; + g.clear(1); + } + try { + if (Bangle.dmTimeout) clearTimeout(Bangle.dmTimeout); // so the app can eval() this file to apply changes right away + delete Bangle.dmTimeout; + } catch (e) { + print("Bangle.dmTimeout does not exist"); + } + const SETTINGS_FILE = "themeSwitch.json"; + const storage = require("Storage"); + var sunrise, sunset, date; + var SunCalc = require("suncalc"); // from modules folder + const locale = require("locale"); + let bSettings = storage.readJSON(SETTINGS_FILE,true)||{}; + const now = new Date(); + hr = now.getHours()+(now.getMinutes()/60)+(now.getSeconds()/3600); // current (decimal) hour + dmH = parseFloat(bSettings.darkModeAt.split(":")[0]); + dmM = parseFloat(bSettings.darkModeAt.split(":")[1]); + lmH = parseFloat(bSettings.lightModeAt.split(":")[0]); + lmM = parseFloat(bSettings.lightModeAt.split(":")[1]); + print("reading switch timeslots....."); + let dmDec = parseFloat(dmH)+parseFloat(dmM)/parseFloat(60); + let lmDec = parseFloat(lmH)+parseFloat(lmM)/parseFloat(60); + targetMode = selectRightMode(parseFloat(lmDec),parseFloat(dmDec),parseFloat(hr)); + if (targetMode === "lightT" || targetMode === "lightN" ){ + nextH = lmH; + nextM = lmM; + } else { + nextH = dmH; + nextM = dmM; + } + nextDecH = parseFloat(nextH) + parseFloat(nextM)/parseFloat(60); + let t = 3600000*(nextDecH-hr); // timeout in milliseconds + if (t<0) {t += 86400000;} // scheduled for tomorrow: add a day + /* update theme mode at the correct time. */ + Bangle.dmTimeout=setTimeout(() => { + if (bSettings.darkMode !==0){ + if (targetMode === "lightT" || targetMode === "lightN" ){ + setLightTheme(); + }else { + setDarkTheme(); + } + Bangle.loadWidgets(); + Bangle.drawWidgets(); + setTimeout(load, 20); + if (bSettings.darkModeBySun !==0){ + calculateSunTimes(); + bSettings.lightModeAt = sunrise; + bSettings.darkModeAt = sunset; + storage.writeJSON(SETTINGS_FILE, bSettings); + } + dm(); // schedule next update + } + }, t); +})(); diff --git a/apps/thmswtch/metadata.json b/apps/thmswtch/metadata.json new file mode 100644 index 000000000..e2826acdd --- /dev/null +++ b/apps/thmswtch/metadata.json @@ -0,0 +1,15 @@ +{ "id": "thmswtch", + "name": "Theme Switcher", + "shortName":"Theme Switcher", + "version":"0.01", + "description": "change theme based on time or sunset/sunrise", + "icon": "app.png", + "tags": "tool", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"thmswtch.app.js","url":"app.js"}, + {"name":"thmswtch.boot.js","url":"boot.js"}, + {"name":"thmswtch.img","url":"app-icon.js","evaluate":true} + ] +} From 0eb73b95c7ef79c736f5d671202dca263fd10c83 Mon Sep 17 00:00:00 2001 From: jan lamos Date: Sat, 16 Mar 2024 10:03:29 +0100 Subject: [PATCH 05/10] slpquiet: -removed obsolete variable in app.js -renamed widget title in widget.js -added dependency to sleeplog into metadata.json --- apps/slpquiet/app.js | 1 - apps/slpquiet/metadata.json | 1 + apps/slpquiet/widget.js | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/slpquiet/app.js b/apps/slpquiet/app.js index 7ec02d676..5c8bc0dae 100644 --- a/apps/slpquiet/app.js +++ b/apps/slpquiet/app.js @@ -1,6 +1,5 @@ const SETTINGS_FILE = "quietSwitch.json"; const storage = require("Storage"); -let settings = storage.readJSON('setting.json', 1); let saved = storage.readJSON(SETTINGS_FILE, 1) || {}; // Main menu diff --git a/apps/slpquiet/metadata.json b/apps/slpquiet/metadata.json index d1f763e68..342dbc5d5 100644 --- a/apps/slpquiet/metadata.json +++ b/apps/slpquiet/metadata.json @@ -5,6 +5,7 @@ "description": "Set Quiet mode (or alarms only mode), when the sleep tracking app detects sleep (each 10 min evaluated)", "icon": "app.png", "tags": "tool,widget", + "dependencies": {"sleeplog":"app"}, "supports" : ["BANGLEJS2"], "readme": "README.md", "storage": [ diff --git a/apps/slpquiet/widget.js b/apps/slpquiet/widget.js index 0ad3c776f..048bac4ff 100644 --- a/apps/slpquiet/widget.js +++ b/apps/slpquiet/widget.js @@ -1,5 +1,5 @@ (function() { - WIDGETS["qmsched"] = { + WIDGETS["slpquiet"] = { area: "tl", width: ((require("Storage").readJSON("setting.json", 1) || {}).quiet|0) ? 24 : 0, draw: function() { From 7310ab970803bb5827a36e5294023a324089ee68 Mon Sep 17 00:00:00 2001 From: jan lamos Date: Sat, 16 Mar 2024 10:17:11 +0100 Subject: [PATCH 06/10] slpquiet + thmswtch: cleaned up indentation via vs code --- apps/slpquiet/app.js | 36 ++--- apps/slpquiet/boot.js | 48 +++---- apps/slpquiet/widget.js | 32 ++--- apps/thmswtch/app.js | 303 +++++++++++++++++++++------------------- apps/thmswtch/boot.js | 91 ++++++------ 5 files changed, 260 insertions(+), 250 deletions(-) diff --git a/apps/slpquiet/app.js b/apps/slpquiet/app.js index 5c8bc0dae..9d339ff12 100644 --- a/apps/slpquiet/app.js +++ b/apps/slpquiet/app.js @@ -4,29 +4,29 @@ let saved = storage.readJSON(SETTINGS_FILE, 1) || {}; // Main menu var mainmenu = { -"" : { - "title" : "Quiet Switch" + "": { + "title": "Quiet Switch" }, - "Quiet Switch" : { - value : saved.quietWhenSleep, - format : v => v?"On":"Off", - min:0,max:1,step:1, - onchange :v=>{ + "Quiet Switch": { + value: saved.quietWhenSleep, + format: v => v ? "On" : "Off", + min: 0, max: 1, step: 1, + onchange: v => { saved.quietWhenSleep = v; - storage.writeJSON(SETTINGS_FILE,saved); + storage.writeJSON(SETTINGS_FILE, saved); } }, - "Quiet Mode" : { - value : saved.quietMode, - format : v => v?"Alerts":"Silent", - min:0,max:1,step:1, - onchange :v=>{ + "Quiet Mode": { + value: saved.quietMode, + format: v => v ? "Alerts" : "Silent", + min: 0, max: 1, step: 1, + onchange: v => { saved.quietMode = v; - storage.writeJSON(SETTINGS_FILE,saved); + storage.writeJSON(SETTINGS_FILE, saved); } }, - "Exit" : function() {load();}, + "Exit": function () { load(); }, }; // Actually display the menu @@ -34,11 +34,11 @@ E.showMenu(mainmenu); // Function to fix time format function fixTime(h, m) { - if (h.toString().length <2) { + if (h.toString().length < 2) { h = "0" + h.toString(); } - if (m.toString().length <2) { + if (m.toString().length < 2) { m = "0" + m.toString(); } - return h.toString() +":" + m.toString(); + return h.toString() + ":" + m.toString(); } diff --git a/apps/slpquiet/boot.js b/apps/slpquiet/boot.js index a4eb3faeb..a6a79f877 100644 --- a/apps/slpquiet/boot.js +++ b/apps/slpquiet/boot.js @@ -2,51 +2,51 @@ if (typeof (global.sleeplog || {}).trigger === "object") { // then add your parameters with the function to call as object into the trigger object -sleeplog.trigger["quietMode"] = { + sleeplog.trigger["quietMode"] = { onChange: true, // false as default, if true call fn only on a status change from: 0, // 0 as default, in ms, first time fn will be called - // to: 24*60*60*1000, // 24h as default, in ms, last time fn will be called - to: 0, + // to: 24*60*60*1000, // 24h as default, in ms, last time fn will be called + to: 0, // reference time to from & to is rounded to full minutes - fn: function(data, thisTriggerEntry) { + fn: function (data, thisTriggerEntry) { aSettings = require('Storage').readJSON('quietSwitch.json', 1) || {}; const DEFAULTS = { - 'quietWhenSleep': false, - 'quietMode': 1 + 'quietWhenSleep': false, + 'quietMode': 1 }; Object.keys(DEFAULTS).forEach(k => { - if (aSettings[k] === undefined) aSettings[k] = DEFAULTS[k]; + if (aSettings[k] === undefined) aSettings[k] = DEFAULTS[k]; }); - if (aSettings && aSettings['quietWhenSleep']){ - console.log("the sleep status is: "+data.status); + if (aSettings && aSettings['quietWhenSleep']) { + console.log("the sleep status is: " + data.status); quietMode = aSettings['quietMode']; delete aSettings; - if ((data.status === 3 || data.status === 4) - && (data.prevStatus !== 3 && data.prevStatus !== 4 )) { - bSettings = require("Storage").readJSON('setting.json',true)||{}; - current = 0|bSettings.quiet; + if ((data.status === 3 || data.status === 4) + && (data.prevStatus !== 3 && data.prevStatus !== 4)) { + bSettings = require("Storage").readJSON('setting.json', true) || {}; + current = 0 | bSettings.quiet; console.log("quiet mode is:" + current); - if (current !== quietMode ){ + if (current !== quietMode) { console.log("fallen asleep"); - bSettings.quiet = quietMode; + bSettings.quiet = quietMode; require("Storage").writeJSON("setting.json", bSettings); + } + delete bSettings; } - delete bSettings; - } - if ((data.status === 2 || data.status === 1) - && (data.prevStatus !== 2 && data.prevStatus !== 1 )) { - bSettings = require("Storage").readJSON('setting.json',true)||{}; - current = 0|bSettings.quiet; + if ((data.status === 2 || data.status === 1) + && (data.prevStatus !== 2 && data.prevStatus !== 1)) { + bSettings = require("Storage").readJSON('setting.json', true) || {}; + current = 0 | bSettings.quiet; console.log("quiet mode is:" + current); - if (current !== 0 ){ + if (current !== 0) { console.log("woken up"); bSettings.quiet = 0; require("Storage").writeJSON("setting.json", bSettings); } - delete bSettings; + delete bSettings; } } - } + } }; } diff --git a/apps/slpquiet/widget.js b/apps/slpquiet/widget.js index 048bac4ff..7412ecce2 100644 --- a/apps/slpquiet/widget.js +++ b/apps/slpquiet/widget.js @@ -1,36 +1,36 @@ -(function() { +(function () { WIDGETS["slpquiet"] = { area: "tl", - width: ((require("Storage").readJSON("setting.json", 1) || {}).quiet|0) ? 24 : 0, - draw: function() { - const mode = (require("Storage").readJSON("setting.json", 1) || {}).quiet|0; - if (mode===0) { // Off - if (this.width!==0) { + width: ((require("Storage").readJSON("setting.json", 1) || {}).quiet | 0) ? 24 : 0, + draw: function () { + const mode = (require("Storage").readJSON("setting.json", 1) || {}).quiet | 0; + if (mode === 0) { // Off + if (this.width !== 0) { this.width = 0; Bangle.drawWidgets(); } return; } // not Off: make sure width is correct - if (this.width!==24) { + if (this.width !== 24) { this.width = 24; Bangle.drawWidgets(); return; // drawWidgets will call draw again } let x = this.x, y = this.y; - g.reset().clearRect(x, y, x+23, y+23); + g.reset().clearRect(x, y, x + 23, y + 23); // quiet mode: draw red one-way-street sign (dim red on Bangle.js 1) - x = this.x+11;y = this.y+11; // center of widget - g.setColor(process.env.HWVERSION===2 ? 1 : 0.8, 0, 0).fillCircle(x, y, 8); - g.setColor(g.theme.bg).fillRect(x-6, y-2, x+6, y+2); - if (mode>1) {return;} // no alarms + x = this.x + 11; y = this.y + 11; // center of widget + g.setColor(process.env.HWVERSION === 2 ? 1 : 0.8, 0, 0).fillCircle(x, y, 8); + g.setColor(g.theme.bg).fillRect(x - 6, y - 2, x + 6, y + 2); + if (mode > 1) { return; } // no alarms // alarms still on: draw alarm icon in bottom-right corner - x = this.x+18;y = this.y+17; // center of alarm + x = this.x + 18; y = this.y + 17; // center of alarm g.setColor(1, 1, 0) .fillCircle(x, y, 3) // alarm body - .fillRect(x-5, y+2, x+5, y+3) // bottom ridge - .fillRect(x-1, y-5, x+1, y+5).drawLine(x, y-6, x, y+6) // top+bottom - .drawLine(x+5, y-3, x+3, y-5).drawLine(x-5, y-3, x-3, y-5); // wriggles + .fillRect(x - 5, y + 2, x + 5, y + 3) // bottom ridge + .fillRect(x - 1, y - 5, x + 1, y + 5).drawLine(x, y - 6, x, y + 6) // top+bottom + .drawLine(x + 5, y - 3, x + 3, y - 5).drawLine(x - 5, y - 3, x - 3, y - 5); // wriggles }, }; })(); diff --git a/apps/thmswtch/app.js b/apps/thmswtch/app.js index e4312a44d..2ac67468e 100644 --- a/apps/thmswtch/app.js +++ b/apps/thmswtch/app.js @@ -5,163 +5,172 @@ var SunCalc = require("suncalc"); // from modules folder const locale = require("locale"); let settings = storage.readJSON('setting.json', 1); let saved = storage.readJSON(SETTINGS_FILE, 1) || {}; -if (settings.theme.fg >0) { - saved.darkModeActive = 1 -}else { - saved.darkModeActive = 0 +if (settings.theme.fg > 0) { + saved.darkModeActive = 1 +} else { + saved.darkModeActive = 0 +} +if (require("Storage").readJSON("themeSwitch.json", 1) !== undefined) { + dmH = parseInt(saved.darkModeAt.split(":")[0] | 0); + dmM = parseInt(saved.darkModeAt.split(":")[1] | 0); + lmH = parseInt(saved.lightModeAt.split(":")[0] | 0); + lmM = parseInt(saved.lightModeAt.split(":")[1] | 0); +} else { + dmH = 0; + dmM = 0; + lmH = 0; + lmM = 0; } - if (require("Storage").readJSON("themeSwitch.json",1) !== undefined){ - dmH = parseInt(saved.darkModeAt.split(":")[0]| 0); - dmM = parseInt(saved.darkModeAt.split(":")[1] |0); - lmH = parseInt(saved.lightModeAt.split(":")[0] |0); - lmM = parseInt(saved.lightModeAt.split(":")[1] |0); - }else{ - dmH = 0; - dmM = 0; - lmH = 0; - lmM = 0; - } // Main menu - - var mainmenu = { - "" : { - "title" : "Theme Switch" + +var mainmenu = { + "": { + "title": "Theme Switch" }, - "< Back" : function() {load();}, - "Automatic Dark Mode" : { - value : saved.darkMode | false, - format : v => v?"On":"Off", - min:0,max:1,step:1, - onchange :v=>{ + "< Back": function () { load(); }, + "Automatic Dark Mode": { + value: saved.darkMode | false, + format: v => v ? "On" : "Off", + min: 0, max: 1, step: 1, + onchange: v => { saved.darkMode = v; - storage.writeJSON(SETTINGS_FILE,saved); + storage.writeJSON(SETTINGS_FILE, saved); } }, - "Dark Mode Active" : { - value : saved.darkModeActive | false, - format : v => v?"On":"Off", - min:0,max:1,step:1, - onchange :v=>{ + "Dark Mode Active": { + value: saved.darkModeActive | false, + format: v => v ? "On" : "Off", + min: 0, max: 1, step: 1, + onchange: v => { saved.darkModeActive = v; - storage.writeJSON(SETTINGS_FILE,saved); - if (v!==0) { + storage.writeJSON(SETTINGS_FILE, saved); + if (v !== 0) { setDarkTheme(); - Bangle.drawWidgets(); - delete m.lastIdx; - }else { - setLightTheme(); - Bangle.drawWidgets(); - delete m.lastIdx;} - } - }, - "Dark Mode by Sun" : { - value : saved.darkModeBySun | false, - format : v => v?"On":"Off", - min:0,max:1,step:1, - onchange : v =>{ - saved.darkModeBySun =v; - if (v!==0) { - //print("calculating sun times"); - calculateSunTimes(); - saved.lightModeAt = sunrise; - saved.darkModeAt = sunset; - //print("sunrise" +sunrise); - //print("sunset" +sunset); - - - - } - storage.writeJSON(SETTINGS_FILE,saved); - }, - }, - "light mode at" : { - value : saved.lightModeAt, - format: v => saved.lightModeAt, - onchange :function(){ - if(saved.darkModeBySun===0){ - E.showMenu(lightModeAtMenu); - } - else{ - E.showAlert("Deactivate dark mode first!", "Action Blocked").then( - function() {E.showMenu(mainmenu);}); - } - } - }, - "dark mode at" : { - value : saved.darkModeAt , - format: v => saved.darkModeAt, - onchange :function(){ - if(saved.darkModeBySun===0){ - E.showMenu(darkModeAtMenu); - } - else{ - E.showAlert("Deactivate dark mode first!", "Action Blocked").then( function() {E.showMenu(mainmenu);}); - } + Bangle.drawWidgets(); + delete m.lastIdx; + } else { + setLightTheme(); + Bangle.drawWidgets(); + delete m.lastIdx; } + } }, - "Exit" : function() {load();}, - + "Dark Mode by Sun": { + value: saved.darkModeBySun | false, + format: v => v ? "On" : "Off", + min: 0, max: 1, step: 1, + onchange: v => { + saved.darkModeBySun = v; + if (v !== 0) { + //print("calculating sun times"); + calculateSunTimes(); + saved.lightModeAt = sunrise; + saved.darkModeAt = sunset; + //print("sunrise" +sunrise); + //print("sunset" +sunset); + + + + } + storage.writeJSON(SETTINGS_FILE, saved); + }, + }, + "light mode at": { + value: saved.lightModeAt, + format: v => saved.lightModeAt, + onchange: function () { + if (saved.darkModeBySun === 0) { + E.showMenu(lightModeAtMenu); + } + else { + E.showAlert("Deactivate dark mode first!", "Action Blocked").then( + function () { E.showMenu(mainmenu); }); + } + } + }, + "dark mode at": { + value: saved.darkModeAt, + format: v => saved.darkModeAt, + onchange: function () { + if (saved.darkModeBySun === 0) { + E.showMenu(darkModeAtMenu); + } + else { + E.showAlert("Deactivate dark mode first!", "Action Blocked").then(function () { E.showMenu(mainmenu); }); + } + } + }, + "Exit": function () { load(); }, + }; var lightModeAtMenu = { - "" : { - "title" : "light mode at" + "": { + "title": "light mode at" }, - "Hour" : { - value : lmH, - min:0,max:23,step:1, - onchange : v => { lmH=v; }}, - "Minute" : { - value : lmM, - min:0,max:59,step:1, - onchange : v => { lmM=v; }}, - "< Back" : function() { saved.lightModeAt = fixTime(lmH,lmM); - storage.writeJSON(SETTINGS_FILE,saved); - E.showMenu(mainmenu); }, - }; + "Hour": { + value: lmH, + min: 0, max: 23, step: 1, + onchange: v => { lmH = v; } + }, + "Minute": { + value: lmM, + min: 0, max: 59, step: 1, + onchange: v => { lmM = v; } + }, + "< Back": function () { + saved.lightModeAt = fixTime(lmH, lmM); + storage.writeJSON(SETTINGS_FILE, saved); + E.showMenu(mainmenu); + }, +}; - var darkModeAtMenu = { - "" : { - "title" : "dark mode at" +var darkModeAtMenu = { + "": { + "title": "dark mode at" }, - "Hour" : { - value : dmH, - min:0,max:23,step:1, - onchange : v => { dmH=v; }}, - "Minute" : { - value : dmM, - min:0,max:59,step:1, - onchange : v => { dmM=v; }}, - "< Back" : function() {saved.darkModeAt = fixTime(dmH,dmM); - storage.writeJSON(SETTINGS_FILE,saved); - E.showMenu(mainmenu); }, - }; + "Hour": { + value: dmH, + min: 0, max: 23, step: 1, + onchange: v => { dmH = v; } + }, + "Minute": { + value: dmM, + min: 0, max: 59, step: 1, + onchange: v => { dmM = v; } + }, + "< Back": function () { + saved.darkModeAt = fixTime(dmH, dmM); + storage.writeJSON(SETTINGS_FILE, saved); + E.showMenu(mainmenu); + }, +}; // Actually display the menu E.showMenu(mainmenu); // Function to fix time format function fixTime(h, m) { - if (h.toString().length <2) { + if (h.toString().length < 2) { h = "0" + h.toString(); } - if (m.toString().length <2) { + if (m.toString().length < 2) { m = "0" + m.toString(); } - return h.toString() +":" + m.toString(); + return h.toString() + ":" + m.toString(); } function calculateSunTimes() { - var location = require("Storage").readJSON("mylocation.json",1)||{}; - location.lat = location.lat||51.5072; - location.lon = location.lon||0.1276; // London - date = new Date(Date.now()); - var times = SunCalc.getTimes(date, location.lat, location.lon); - sunrise = fixTime(times.sunrise.getHours() , times.sunrise.getMinutes()); - sunset = fixTime(times.sunset.getHours() ,times.sunset.getMinutes()); - /* do we want to re-calculate this every day? Or we just assume - that 'show' will get called once a day? */ - } + var location = require("Storage").readJSON("mylocation.json", 1) || {}; + location.lat = location.lat || 51.5072; + location.lon = location.lon || 0.1276; // London + date = new Date(Date.now()); + var times = SunCalc.getTimes(date, location.lat, location.lon); + sunrise = fixTime(times.sunrise.getHours(), times.sunrise.getMinutes()); + sunset = fixTime(times.sunset.getHours(), times.sunset.getMinutes()); + /* do we want to re-calculate this every day? Or we just assume + that 'show' will get called once a day? */ +} function cl(x) { return g.setColor(x).getColor(); } @@ -171,25 +180,25 @@ function upd(th) { storage.write('setting.json', settings); delete g.reset; g._reset = g.reset; - g.reset = function(n) { return g._reset().setColor(th.fg).setBgColor(th.bg); }; - g.clear = function(n) { if (n) g.reset(); return g.clearRect(0,0,g.getWidth(),g.getHeight()); }; + g.reset = function (n) { return g._reset().setColor(th.fg).setBgColor(th.bg); }; + g.clear = function (n) { if (n) g.reset(); return g.clearRect(0, 0, g.getWidth(), g.getHeight()); }; g.clear(1); } function flipTheme() { if (!g.theme.dark) { upd({ - fg:cl("#fff"), bg:cl("#000"), - fg2:cl("#fff"), bg2:cl("#004"), - fgH:cl("#fff"), bgH:cl("#00f"), - dark:true + fg: cl("#fff"), bg: cl("#000"), + fg2: cl("#fff"), bg2: cl("#004"), + fgH: cl("#fff"), bgH: cl("#00f"), + dark: true }); } else { upd({ - fg:cl("#000"), bg:cl("#fff"), - fg2:cl("#000"), bg2:cl("#cff"), - fgH:cl("#000"), bgH:cl("#0ff"), - dark:false + fg: cl("#000"), bg: cl("#fff"), + fg2: cl("#000"), bg2: cl("#cff"), + fgH: cl("#000"), bgH: cl("#0ff"), + dark: false }); } } @@ -197,21 +206,21 @@ function flipTheme() { function setDarkTheme() { if (!g.theme.dark) { upd({ - fg:cl("#fff"), bg:cl("#000"), - fg2:cl("#fff"), bg2:cl("#004"), - fgH:cl("#fff"), bgH:cl("#00f"), - dark:true + fg: cl("#fff"), bg: cl("#000"), + fg2: cl("#fff"), bg2: cl("#004"), + fgH: cl("#fff"), bgH: cl("#00f"), + dark: true }); } } function setLightTheme() { if (g.theme.dark) { - upd({ - fg:cl("#000"), bg:cl("#fff"), - fg2:cl("#000"), bg2:cl("#cff"), - fgH:cl("#000"), bgH:cl("#0ff"), - dark:false + upd({ + fg: cl("#000"), bg: cl("#fff"), + fg2: cl("#000"), bg2: cl("#cff"), + fgH: cl("#000"), bgH: cl("#0ff"), + dark: false }); } } diff --git a/apps/thmswtch/boot.js b/apps/thmswtch/boot.js index 16e2f4b87..bf2a518a6 100644 --- a/apps/thmswtch/boot.js +++ b/apps/thmswtch/boot.js @@ -1,113 +1,114 @@ (function dm() { - function selectRightMode(lt,dt,at) { - if (at < lt && at < dt ) { + function selectRightMode(lt, dt, at) { + if (at < lt && at < dt) { return "lightT"; - }else if (at > lt && at < dt) { + } else if (at > lt && at < dt) { return "darkT"; - }else if (at >lt && at > dt) { - return "lightN";} + } else if (at > lt && at > dt) { + return "lightN"; + } } function setDarkTheme() { if (!g.theme.dark) { upd({ - fg:cl("#fff"), bg:cl("#000"), - fg2:cl("#fff"), bg2:cl("#004"), - fgH:cl("#fff"), bgH:cl("#00f"), - dark:true - }); + fg: cl("#fff"), bg: cl("#000"), + fg2: cl("#fff"), bg2: cl("#004"), + fgH: cl("#fff"), bgH: cl("#00f"), + dark: true + }); } } function setLightTheme() { if (g.theme.dark) { upd({ - fg:cl("#000"), bg:cl("#fff"), - fg2:cl("#000"), bg2:cl("#cff"), - fgH:cl("#000"), bgH:cl("#0ff"), - dark:false + fg: cl("#000"), bg: cl("#fff"), + fg2: cl("#000"), bg2: cl("#cff"), + fgH: cl("#000"), bgH: cl("#0ff"), + dark: false }); } } function fixTime(h, m) { - if (h.toString().length <2) { + if (h.toString().length < 2) { h = "0" + h.toString(); } - if (m.toString().length <2) { + if (m.toString().length < 2) { m = "0" + m.toString(); } - return h.toString() +":" + m.toString(); + return h.toString() + ":" + m.toString(); } function calculateSunTimes() { - var location = require("Storage").readJSON("mylocation.json",1)||{}; - location.lat = location.lat||51.5072; - location.lon = location.lon||0.1276; // London + var location = require("Storage").readJSON("mylocation.json", 1) || {}; + location.lat = location.lat || 51.5072; + location.lon = location.lon || 0.1276; // London date = new Date(Date.now()); var times = SunCalc.getTimes(date, location.lat, location.lon); - sunrise = fixTime(times.sunrise.getHours() , times.sunrise.getMinutes()); - sunset = fixTime(times.sunset.getHours() ,times.sunset.getMinutes()); + sunrise = fixTime(times.sunrise.getHours(), times.sunrise.getMinutes()); + sunset = fixTime(times.sunset.getHours(), times.sunset.getMinutes()); /* do we want to re-calculate this every day? Or we just assume that 'show' will get called once a day? */ } function cl(x) { return g.setColor(x).getColor(); } function upd(th) { g.theme = th; - settings = storage.readJSON('setting.json',1) + settings = storage.readJSON('setting.json', 1) settings.theme = th; storage.write('setting.json', settings); delete g.reset; g._reset = g.reset; - g.reset = function(n) { return g._reset().setColor(th.fg).setBgColor(th.bg); }; - g.clear = function(n) { if (n) g.reset(); return g.clearRect(0,0,g.getWidth(),g.getHeight()); }; + g.reset = function (n) { return g._reset().setColor(th.fg).setBgColor(th.bg); }; + g.clear = function (n) { if (n) g.reset(); return g.clearRect(0, 0, g.getWidth(), g.getHeight()); }; g.clear(1); } try { if (Bangle.dmTimeout) clearTimeout(Bangle.dmTimeout); // so the app can eval() this file to apply changes right away delete Bangle.dmTimeout; - } catch (e) { - print("Bangle.dmTimeout does not exist"); - } + } catch (e) { + print("Bangle.dmTimeout does not exist"); + } const SETTINGS_FILE = "themeSwitch.json"; const storage = require("Storage"); var sunrise, sunset, date; var SunCalc = require("suncalc"); // from modules folder const locale = require("locale"); - let bSettings = storage.readJSON(SETTINGS_FILE,true)||{}; + let bSettings = storage.readJSON(SETTINGS_FILE, true) || {}; const now = new Date(); - hr = now.getHours()+(now.getMinutes()/60)+(now.getSeconds()/3600); // current (decimal) hour + hr = now.getHours() + (now.getMinutes() / 60) + (now.getSeconds() / 3600); // current (decimal) hour dmH = parseFloat(bSettings.darkModeAt.split(":")[0]); dmM = parseFloat(bSettings.darkModeAt.split(":")[1]); lmH = parseFloat(bSettings.lightModeAt.split(":")[0]); lmM = parseFloat(bSettings.lightModeAt.split(":")[1]); print("reading switch timeslots....."); - let dmDec = parseFloat(dmH)+parseFloat(dmM)/parseFloat(60); - let lmDec = parseFloat(lmH)+parseFloat(lmM)/parseFloat(60); - targetMode = selectRightMode(parseFloat(lmDec),parseFloat(dmDec),parseFloat(hr)); - if (targetMode === "lightT" || targetMode === "lightN" ){ + let dmDec = parseFloat(dmH) + parseFloat(dmM) / parseFloat(60); + let lmDec = parseFloat(lmH) + parseFloat(lmM) / parseFloat(60); + targetMode = selectRightMode(parseFloat(lmDec), parseFloat(dmDec), parseFloat(hr)); + if (targetMode === "lightT" || targetMode === "lightN") { nextH = lmH; nextM = lmM; } else { nextH = dmH; nextM = dmM; } - nextDecH = parseFloat(nextH) + parseFloat(nextM)/parseFloat(60); - let t = 3600000*(nextDecH-hr); // timeout in milliseconds - if (t<0) {t += 86400000;} // scheduled for tomorrow: add a day + nextDecH = parseFloat(nextH) + parseFloat(nextM) / parseFloat(60); + let t = 3600000 * (nextDecH - hr); // timeout in milliseconds + if (t < 0) { t += 86400000; } // scheduled for tomorrow: add a day /* update theme mode at the correct time. */ - Bangle.dmTimeout=setTimeout(() => { - if (bSettings.darkMode !==0){ - if (targetMode === "lightT" || targetMode === "lightN" ){ + Bangle.dmTimeout = setTimeout(() => { + if (bSettings.darkMode !== 0) { + if (targetMode === "lightT" || targetMode === "lightN") { setLightTheme(); - }else { + } else { setDarkTheme(); - } + } Bangle.loadWidgets(); Bangle.drawWidgets(); - setTimeout(load, 20); - if (bSettings.darkModeBySun !==0){ + setTimeout(load, 20); + if (bSettings.darkModeBySun !== 0) { calculateSunTimes(); bSettings.lightModeAt = sunrise; bSettings.darkModeAt = sunset; - storage.writeJSON(SETTINGS_FILE, bSettings); + storage.writeJSON(SETTINGS_FILE, bSettings); } dm(); // schedule next update } From f26169856e496fca2df5d2a94f93864188decfec Mon Sep 17 00:00:00 2001 From: jan lamos Date: Sat, 16 Mar 2024 12:28:43 +0100 Subject: [PATCH 07/10] fixed linter warnings --- apps/slpquiet/app.js | 11 ---------- apps/slpquiet/boot.js | 8 ++++---- apps/thmswtch/app.js | 47 +++++++++++++++++++------------------------ apps/thmswtch/boot.js | 17 ++++++++-------- 4 files changed, 34 insertions(+), 49 deletions(-) diff --git a/apps/slpquiet/app.js b/apps/slpquiet/app.js index 9d339ff12..1de61498b 100644 --- a/apps/slpquiet/app.js +++ b/apps/slpquiet/app.js @@ -31,14 +31,3 @@ var mainmenu = { // Actually display the menu E.showMenu(mainmenu); - -// Function to fix time format -function fixTime(h, m) { - if (h.toString().length < 2) { - h = "0" + h.toString(); - } - if (m.toString().length < 2) { - m = "0" + m.toString(); - } - return h.toString() + ":" + m.toString(); -} diff --git a/apps/slpquiet/boot.js b/apps/slpquiet/boot.js index a6a79f877..ffb2be69f 100644 --- a/apps/slpquiet/boot.js +++ b/apps/slpquiet/boot.js @@ -9,7 +9,7 @@ if (typeof (global.sleeplog || {}).trigger === "object") { to: 0, // reference time to from & to is rounded to full minutes fn: function (data, thisTriggerEntry) { - aSettings = require('Storage').readJSON('quietSwitch.json', 1) || {}; + let aSettings = require('Storage').readJSON('quietSwitch.json', 1) || {}; const DEFAULTS = { 'quietWhenSleep': false, 'quietMode': 1 @@ -20,12 +20,12 @@ if (typeof (global.sleeplog || {}).trigger === "object") { if (aSettings && aSettings['quietWhenSleep']) { console.log("the sleep status is: " + data.status); - quietMode = aSettings['quietMode']; + let quietMode = aSettings['quietMode']; delete aSettings; if ((data.status === 3 || data.status === 4) && (data.prevStatus !== 3 && data.prevStatus !== 4)) { bSettings = require("Storage").readJSON('setting.json', true) || {}; - current = 0 | bSettings.quiet; + let current = 0 | bSettings.quiet; console.log("quiet mode is:" + current); if (current !== quietMode) { console.log("fallen asleep"); @@ -36,7 +36,7 @@ if (typeof (global.sleeplog || {}).trigger === "object") { } if ((data.status === 2 || data.status === 1) && (data.prevStatus !== 2 && data.prevStatus !== 1)) { - bSettings = require("Storage").readJSON('setting.json', true) || {}; + let bSettings = require("Storage").readJSON('setting.json', true) || {}; current = 0 | bSettings.quiet; console.log("quiet mode is:" + current); if (current !== 0) { diff --git a/apps/thmswtch/app.js b/apps/thmswtch/app.js index 2ac67468e..8391e1a13 100644 --- a/apps/thmswtch/app.js +++ b/apps/thmswtch/app.js @@ -2,14 +2,14 @@ const SETTINGS_FILE = "themeSwitch.json"; const storage = require("Storage"); var sunrise, sunset, date; var SunCalc = require("suncalc"); // from modules folder -const locale = require("locale"); let settings = storage.readJSON('setting.json', 1); let saved = storage.readJSON(SETTINGS_FILE, 1) || {}; if (settings.theme.fg > 0) { - saved.darkModeActive = 1 + saved.darkModeActive = 1; } else { - saved.darkModeActive = 0 + saved.darkModeActive = 0; } +let dmH, dmM, lmH, lmM; if (require("Storage").readJSON("themeSwitch.json", 1) !== undefined) { dmH = parseInt(saved.darkModeAt.split(":")[0] | 0); dmM = parseInt(saved.darkModeAt.split(":")[1] | 0); @@ -47,11 +47,9 @@ var mainmenu = { if (v !== 0) { setDarkTheme(); Bangle.drawWidgets(); - delete m.lastIdx; } else { setLightTheme(); Bangle.drawWidgets(); - delete m.lastIdx; } } }, @@ -68,9 +66,6 @@ var mainmenu = { saved.darkModeAt = sunset; //print("sunrise" +sunrise); //print("sunset" +sunset); - - - } storage.writeJSON(SETTINGS_FILE, saved); }, @@ -101,7 +96,6 @@ var mainmenu = { } }, "Exit": function () { load(); }, - }; var lightModeAtMenu = { @@ -185,23 +179,24 @@ function upd(th) { g.clear(1); } -function flipTheme() { - if (!g.theme.dark) { - upd({ - fg: cl("#fff"), bg: cl("#000"), - fg2: cl("#fff"), bg2: cl("#004"), - fgH: cl("#fff"), bgH: cl("#00f"), - dark: true - }); - } else { - upd({ - fg: cl("#000"), bg: cl("#fff"), - fg2: cl("#000"), bg2: cl("#cff"), - fgH: cl("#000"), bgH: cl("#0ff"), - dark: false - }); - } -} +//flipTheme function to be used in future version +// function flipTheme() { +// if (!g.theme.dark) { +// upd({ +// fg: cl("#fff"), bg: cl("#000"), +// fg2: cl("#fff"), bg2: cl("#004"), +// fgH: cl("#fff"), bgH: cl("#00f"), +// dark: true +// }); +// } else { +// upd({ +// fg: cl("#000"), bg: cl("#fff"), +// fg2: cl("#000"), bg2: cl("#cff"), +// fgH: cl("#000"), bgH: cl("#0ff"), +// dark: false +// }); +// } +// } function setDarkTheme() { if (!g.theme.dark) { diff --git a/apps/thmswtch/boot.js b/apps/thmswtch/boot.js index bf2a518a6..c02f05b5b 100644 --- a/apps/thmswtch/boot.js +++ b/apps/thmswtch/boot.js @@ -8,6 +8,7 @@ return "lightN"; } } + function setDarkTheme() { if (!g.theme.dark) { upd({ @@ -52,7 +53,7 @@ function cl(x) { return g.setColor(x).getColor(); } function upd(th) { g.theme = th; - settings = storage.readJSON('setting.json', 1) + let settings = storage.readJSON('setting.json', 1) settings.theme = th; storage.write('setting.json', settings); delete g.reset; @@ -71,18 +72,18 @@ const storage = require("Storage"); var sunrise, sunset, date; var SunCalc = require("suncalc"); // from modules folder - const locale = require("locale"); let bSettings = storage.readJSON(SETTINGS_FILE, true) || {}; const now = new Date(); - hr = now.getHours() + (now.getMinutes() / 60) + (now.getSeconds() / 3600); // current (decimal) hour - dmH = parseFloat(bSettings.darkModeAt.split(":")[0]); - dmM = parseFloat(bSettings.darkModeAt.split(":")[1]); - lmH = parseFloat(bSettings.lightModeAt.split(":")[0]); - lmM = parseFloat(bSettings.lightModeAt.split(":")[1]); + let hr = now.getHours() + (now.getMinutes() / 60) + (now.getSeconds() / 3600); // current (decimal) hour + let dmH = parseFloat(bSettings.darkModeAt.split(":")[0]); + let dmM = parseFloat(bSettings.darkModeAt.split(":")[1]); + let lmH = parseFloat(bSettings.lightModeAt.split(":")[0]); + let lmM = parseFloat(bSettings.lightModeAt.split(":")[1]); print("reading switch timeslots....."); let dmDec = parseFloat(dmH) + parseFloat(dmM) / parseFloat(60); let lmDec = parseFloat(lmH) + parseFloat(lmM) / parseFloat(60); - targetMode = selectRightMode(parseFloat(lmDec), parseFloat(dmDec), parseFloat(hr)); + let targetMode = selectRightMode(parseFloat(lmDec), parseFloat(dmDec), parseFloat(hr)); + let nextH, nextM; if (targetMode === "lightT" || targetMode === "lightN") { nextH = lmH; nextM = lmM; From cd8e2379dbc81ec56c12ef29f511992b227f08ca Mon Sep 17 00:00:00 2001 From: jan lamos Date: Sat, 16 Mar 2024 13:33:10 +0100 Subject: [PATCH 08/10] thmswtch + slpquiet -further linter fixes thmswtch -movement of menu to config file and creation of app.js for switching only --- apps/slpquiet/boot.js | 4 +- apps/thmswtch/app.js | 260 ++++++++---------------------------- apps/thmswtch/boot.js | 2 +- apps/thmswtch/metadata.json | 1 + apps/thmswtch/settings.js | 202 ++++++++++++++++++++++++++++ 5 files changed, 261 insertions(+), 208 deletions(-) create mode 100644 apps/thmswtch/settings.js diff --git a/apps/slpquiet/boot.js b/apps/slpquiet/boot.js index ffb2be69f..65d9340c0 100644 --- a/apps/slpquiet/boot.js +++ b/apps/slpquiet/boot.js @@ -24,7 +24,7 @@ if (typeof (global.sleeplog || {}).trigger === "object") { delete aSettings; if ((data.status === 3 || data.status === 4) && (data.prevStatus !== 3 && data.prevStatus !== 4)) { - bSettings = require("Storage").readJSON('setting.json', true) || {}; + let bSettings = require("Storage").readJSON('setting.json', true) || {}; let current = 0 | bSettings.quiet; console.log("quiet mode is:" + current); if (current !== quietMode) { @@ -37,7 +37,7 @@ if (typeof (global.sleeplog || {}).trigger === "object") { if ((data.status === 2 || data.status === 1) && (data.prevStatus !== 2 && data.prevStatus !== 1)) { let bSettings = require("Storage").readJSON('setting.json', true) || {}; - current = 0 | bSettings.quiet; + let current = 0 | bSettings.quiet; console.log("quiet mode is:" + current); if (current !== 0) { console.log("woken up"); diff --git a/apps/thmswtch/app.js b/apps/thmswtch/app.js index 8391e1a13..90cd8f0af 100644 --- a/apps/thmswtch/app.js +++ b/apps/thmswtch/app.js @@ -1,221 +1,71 @@ const SETTINGS_FILE = "themeSwitch.json"; const storage = require("Storage"); -var sunrise, sunset, date; -var SunCalc = require("suncalc"); // from modules folder let settings = storage.readJSON('setting.json', 1); let saved = storage.readJSON(SETTINGS_FILE, 1) || {}; -if (settings.theme.fg > 0) { - saved.darkModeActive = 1; -} else { - saved.darkModeActive = 0; -} -let dmH, dmM, lmH, lmM; -if (require("Storage").readJSON("themeSwitch.json", 1) !== undefined) { - dmH = parseInt(saved.darkModeAt.split(":")[0] | 0); - dmM = parseInt(saved.darkModeAt.split(":")[1] | 0); - lmH = parseInt(saved.lightModeAt.split(":")[0] | 0); - lmM = parseInt(saved.lightModeAt.split(":")[1] | 0); -} else { - dmH = 0; - dmM = 0; - lmH = 0; - lmM = 0; -} -// Main menu - -var mainmenu = { - "": { - "title": "Theme Switch" - }, - "< Back": function () { load(); }, - "Automatic Dark Mode": { - value: saved.darkMode | false, - format: v => v ? "On" : "Off", - min: 0, max: 1, step: 1, - onchange: v => { - saved.darkMode = v; - storage.writeJSON(SETTINGS_FILE, saved); - } - }, - "Dark Mode Active": { - value: saved.darkModeActive | false, - format: v => v ? "On" : "Off", - min: 0, max: 1, step: 1, - onchange: v => { - saved.darkModeActive = v; - storage.writeJSON(SETTINGS_FILE, saved); - if (v !== 0) { - setDarkTheme(); - Bangle.drawWidgets(); - } else { - setLightTheme(); - Bangle.drawWidgets(); - } - } - }, - "Dark Mode by Sun": { - value: saved.darkModeBySun | false, - format: v => v ? "On" : "Off", - min: 0, max: 1, step: 1, - onchange: v => { - saved.darkModeBySun = v; - if (v !== 0) { - //print("calculating sun times"); - calculateSunTimes(); - saved.lightModeAt = sunrise; - saved.darkModeAt = sunset; - //print("sunrise" +sunrise); - //print("sunset" +sunset); - } - storage.writeJSON(SETTINGS_FILE, saved); - }, - }, - "light mode at": { - value: saved.lightModeAt, - format: v => saved.lightModeAt, - onchange: function () { - if (saved.darkModeBySun === 0) { - E.showMenu(lightModeAtMenu); - } - else { - E.showAlert("Deactivate dark mode first!", "Action Blocked").then( - function () { E.showMenu(mainmenu); }); - } - } - }, - "dark mode at": { - value: saved.darkModeAt, - format: v => saved.darkModeAt, - onchange: function () { - if (saved.darkModeBySun === 0) { - E.showMenu(darkModeAtMenu); - } - else { - E.showAlert("Deactivate dark mode first!", "Action Blocked").then(function () { E.showMenu(mainmenu); }); - } - } - }, - "Exit": function () { load(); }, -}; - -var lightModeAtMenu = { - "": { - "title": "light mode at" - }, - "Hour": { - value: lmH, - min: 0, max: 23, step: 1, - onchange: v => { lmH = v; } - }, - "Minute": { - value: lmM, - min: 0, max: 59, step: 1, - onchange: v => { lmM = v; } - }, - "< Back": function () { - saved.lightModeAt = fixTime(lmH, lmM); - storage.writeJSON(SETTINGS_FILE, saved); - E.showMenu(mainmenu); - }, -}; - -var darkModeAtMenu = { - "": { - "title": "dark mode at" - }, - "Hour": { - value: dmH, - min: 0, max: 23, step: 1, - onchange: v => { dmH = v; } - }, - "Minute": { - value: dmM, - min: 0, max: 59, step: 1, - onchange: v => { dmM = v; } - }, - "< Back": function () { - saved.darkModeAt = fixTime(dmH, dmM); - storage.writeJSON(SETTINGS_FILE, saved); - E.showMenu(mainmenu); - }, -}; - -// Actually display the menu -E.showMenu(mainmenu); - -// Function to fix time format -function fixTime(h, m) { - if (h.toString().length < 2) { - h = "0" + h.toString(); - } - if (m.toString().length < 2) { - m = "0" + m.toString(); - } - return h.toString() + ":" + m.toString(); -} - -function calculateSunTimes() { - var location = require("Storage").readJSON("mylocation.json", 1) || {}; - location.lat = location.lat || 51.5072; - location.lon = location.lon || 0.1276; // London - date = new Date(Date.now()); - var times = SunCalc.getTimes(date, location.lat, location.lon); - sunrise = fixTime(times.sunrise.getHours(), times.sunrise.getMinutes()); - sunset = fixTime(times.sunset.getHours(), times.sunset.getMinutes()); - /* do we want to re-calculate this every day? Or we just assume - that 'show' will get called once a day? */ -} function cl(x) { return g.setColor(x).getColor(); } function upd(th) { - g.theme = th; - settings.theme = th; - storage.write('setting.json', settings); - delete g.reset; - g._reset = g.reset; - g.reset = function (n) { return g._reset().setColor(th.fg).setBgColor(th.bg); }; - g.clear = function (n) { if (n) g.reset(); return g.clearRect(0, 0, g.getWidth(), g.getHeight()); }; - g.clear(1); + g.theme = th; + settings.theme = th; + storage.write('setting.json', settings); + delete g.reset; + g._reset = g.reset; + g.reset = function (n) { return g._reset().setColor(th.fg).setBgColor(th.bg); }; + g.clear = function (n) { if (n) g.reset(); return g.clearRect(0, 0, g.getWidth(), g.getHeight()); }; + g.clear(1); } -//flipTheme function to be used in future version -// function flipTheme() { -// if (!g.theme.dark) { -// upd({ -// fg: cl("#fff"), bg: cl("#000"), -// fg2: cl("#fff"), bg2: cl("#004"), -// fgH: cl("#fff"), bgH: cl("#00f"), -// dark: true -// }); -// } else { -// upd({ -// fg: cl("#000"), bg: cl("#fff"), -// fg2: cl("#000"), bg2: cl("#cff"), -// fgH: cl("#000"), bgH: cl("#0ff"), -// dark: false -// }); -// } -// } +function flipTheme(saved) { + if (!g.theme.dark) { + upd({ + fg: cl("#fff"), bg: cl("#000"), + fg2: cl("#fff"), bg2: cl("#004"), + fgH: cl("#fff"), bgH: cl("#00f"), + dark: true + }); + + saved.darkModeActive = 1; + } else { + upd({ + fg: cl("#000"), bg: cl("#fff"), + fg2: cl("#000"), bg2: cl("#cff"), + fgH: cl("#000"), bgH: cl("#0ff"), + dark: false + }); + saved.darkModeActive = 0; + } + return saved; +} function setDarkTheme() { - if (!g.theme.dark) { - upd({ - fg: cl("#fff"), bg: cl("#000"), - fg2: cl("#fff"), bg2: cl("#004"), - fgH: cl("#fff"), bgH: cl("#00f"), - dark: true - }); - } + if (!g.theme.dark) { + upd({ + fg: cl("#fff"), bg: cl("#000"), + fg2: cl("#fff"), bg2: cl("#004"), + fgH: cl("#fff"), bgH: cl("#00f"), + dark: true + }); + } } function setLightTheme() { - if (g.theme.dark) { - upd({ - fg: cl("#000"), bg: cl("#fff"), - fg2: cl("#000"), bg2: cl("#cff"), - fgH: cl("#000"), bgH: cl("#0ff"), - dark: false - }); - } + if (g.theme.dark) { + upd({ + fg: cl("#000"), bg: cl("#fff"), + fg2: cl("#000"), bg2: cl("#cff"), + fgH: cl("#000"), bgH: cl("#0ff"), + dark: false + }); + } } + +if (settings.theme.fg > 0) { + saved.darkModeActive = 1; +} else { + saved.darkModeActive = 0; +} + +saved = flipTheme(saved); +storage.writeJSON(SETTINGS_FILE, saved); +Bangle.drawWidgets(); \ No newline at end of file diff --git a/apps/thmswtch/boot.js b/apps/thmswtch/boot.js index c02f05b5b..e4cf0c491 100644 --- a/apps/thmswtch/boot.js +++ b/apps/thmswtch/boot.js @@ -91,7 +91,7 @@ nextH = dmH; nextM = dmM; } - nextDecH = parseFloat(nextH) + parseFloat(nextM) / parseFloat(60); + let nextDecH = parseFloat(nextH) + parseFloat(nextM) / parseFloat(60); let t = 3600000 * (nextDecH - hr); // timeout in milliseconds if (t < 0) { t += 86400000; } // scheduled for tomorrow: add a day /* update theme mode at the correct time. */ diff --git a/apps/thmswtch/metadata.json b/apps/thmswtch/metadata.json index e2826acdd..581cbaff9 100644 --- a/apps/thmswtch/metadata.json +++ b/apps/thmswtch/metadata.json @@ -9,6 +9,7 @@ "readme": "README.md", "storage": [ {"name":"thmswtch.app.js","url":"app.js"}, + {"name":"thmswtch.settings.js","url":"settings.js"}, {"name":"thmswtch.boot.js","url":"boot.js"}, {"name":"thmswtch.img","url":"app-icon.js","evaluate":true} ] diff --git a/apps/thmswtch/settings.js b/apps/thmswtch/settings.js new file mode 100644 index 000000000..83ce6010f --- /dev/null +++ b/apps/thmswtch/settings.js @@ -0,0 +1,202 @@ +const SETTINGS_FILE = "themeSwitch.json"; +const storage = require("Storage"); +var sunrise, sunset, date; +var SunCalc = require("suncalc"); // from modules folder +let settings = storage.readJSON('setting.json', 1); +let saved = storage.readJSON(SETTINGS_FILE, 1) || {}; +if (settings.theme.fg > 0) { + saved.darkModeActive = 1; +} else { + saved.darkModeActive = 0; +} +let dmH, dmM, lmH, lmM; +if (require("Storage").readJSON("themeSwitch.json", 1) !== undefined) { + dmH = parseInt(saved.darkModeAt.split(":")[0] | 0); + dmM = parseInt(saved.darkModeAt.split(":")[1] | 0); + lmH = parseInt(saved.lightModeAt.split(":")[0] | 0); + lmM = parseInt(saved.lightModeAt.split(":")[1] | 0); +} else { + dmH = 0; + dmM = 0; + lmH = 0; + lmM = 0; +} +// Main menu + +var mainmenu = { + "": { + "title": "Theme Switch" + }, + "< Back": function () { load(); }, + "Automatic Dark Mode": { + value: saved.darkMode | false, + format: v => v ? "On" : "Off", + min: 0, max: 1, step: 1, + onchange: v => { + saved.darkMode = v; + storage.writeJSON(SETTINGS_FILE, saved); + } + }, + "Dark Mode Active": { + value: saved.darkModeActive | false, + format: v => v ? "On" : "Off", + min: 0, max: 1, step: 1, + onchange: v => { + saved.darkModeActive = v; + storage.writeJSON(SETTINGS_FILE, saved); + if (v !== 0) { + setDarkTheme(); + Bangle.drawWidgets(); + } else { + setLightTheme(); + Bangle.drawWidgets(); + } + } + }, + "Dark Mode by Sun": { + value: saved.darkModeBySun | false, + format: v => v ? "On" : "Off", + min: 0, max: 1, step: 1, + onchange: v => { + saved.darkModeBySun = v; + if (v !== 0) { + //print("calculating sun times"); + calculateSunTimes(); + saved.lightModeAt = sunrise; + saved.darkModeAt = sunset; + //print("sunrise" +sunrise); + //print("sunset" +sunset); + } + storage.writeJSON(SETTINGS_FILE, saved); + }, + }, + "light mode at": { + value: saved.lightModeAt, + format: v => saved.lightModeAt, + onchange: function () { + if (saved.darkModeBySun === 0) { + E.showMenu(lightModeAtMenu); + } + else { + E.showAlert("Deactivate dark mode first!", "Action Blocked").then( + function () { E.showMenu(mainmenu); }); + } + } + }, + "dark mode at": { + value: saved.darkModeAt, + format: v => saved.darkModeAt, + onchange: function () { + if (saved.darkModeBySun === 0) { + E.showMenu(darkModeAtMenu); + } + else { + E.showAlert("Deactivate dark mode first!", "Action Blocked").then(function () { E.showMenu(mainmenu); }); + } + } + }, + "Exit": function () { load(); }, +}; + +var lightModeAtMenu = { + "": { + "title": "light mode at" + }, + "Hour": { + value: lmH, + min: 0, max: 23, step: 1, + onchange: v => { lmH = v; } + }, + "Minute": { + value: lmM, + min: 0, max: 59, step: 1, + onchange: v => { lmM = v; } + }, + "< Back": function () { + saved.lightModeAt = fixTime(lmH, lmM); + storage.writeJSON(SETTINGS_FILE, saved); + E.showMenu(mainmenu); + }, +}; + +var darkModeAtMenu = { + "": { + "title": "dark mode at" + }, + "Hour": { + value: dmH, + min: 0, max: 23, step: 1, + onchange: v => { dmH = v; } + }, + "Minute": { + value: dmM, + min: 0, max: 59, step: 1, + onchange: v => { dmM = v; } + }, + "< Back": function () { + saved.darkModeAt = fixTime(dmH, dmM); + storage.writeJSON(SETTINGS_FILE, saved); + E.showMenu(mainmenu); + }, +}; + +// Actually display the menu +E.showMenu(mainmenu); + +// Function to fix time format +function fixTime(h, m) { + if (h.toString().length < 2) { + h = "0" + h.toString(); + } + if (m.toString().length < 2) { + m = "0" + m.toString(); + } + return h.toString() + ":" + m.toString(); +} + +function calculateSunTimes() { + var location = require("Storage").readJSON("mylocation.json", 1) || {}; + location.lat = location.lat || 51.5072; + location.lon = location.lon || 0.1276; // London + date = new Date(Date.now()); + var times = SunCalc.getTimes(date, location.lat, location.lon); + sunrise = fixTime(times.sunrise.getHours(), times.sunrise.getMinutes()); + sunset = fixTime(times.sunset.getHours(), times.sunset.getMinutes()); + /* do we want to re-calculate this every day? Or we just assume + that 'show' will get called once a day? */ +} + +function cl(x) { return g.setColor(x).getColor(); } + +function upd(th) { + g.theme = th; + settings.theme = th; + storage.write('setting.json', settings); + delete g.reset; + g._reset = g.reset; + g.reset = function (n) { return g._reset().setColor(th.fg).setBgColor(th.bg); }; + g.clear = function (n) { if (n) g.reset(); return g.clearRect(0, 0, g.getWidth(), g.getHeight()); }; + g.clear(1); +} + +function setDarkTheme() { + if (!g.theme.dark) { + upd({ + fg: cl("#fff"), bg: cl("#000"), + fg2: cl("#fff"), bg2: cl("#004"), + fgH: cl("#fff"), bgH: cl("#00f"), + dark: true + }); + } +} + +function setLightTheme() { + if (g.theme.dark) { + upd({ + fg: cl("#000"), bg: cl("#fff"), + fg2: cl("#000"), bg2: cl("#cff"), + fgH: cl("#000"), bgH: cl("#0ff"), + dark: false + }); + } +} \ No newline at end of file From f7acb5c86e109ac0fc7a041c119954963825805e Mon Sep 17 00:00:00 2001 From: jan lamos Date: Sat, 16 Mar 2024 13:40:56 +0100 Subject: [PATCH 09/10] further linter issue fixes --- apps/thmswtch/app.js | 22 ---------------------- apps/thmswtch/metadata.json | 3 ++- apps/thmswtch/settings.js | 2 +- 3 files changed, 3 insertions(+), 24 deletions(-) diff --git a/apps/thmswtch/app.js b/apps/thmswtch/app.js index 90cd8f0af..d1be7b997 100644 --- a/apps/thmswtch/app.js +++ b/apps/thmswtch/app.js @@ -38,28 +38,6 @@ function flipTheme(saved) { return saved; } -function setDarkTheme() { - if (!g.theme.dark) { - upd({ - fg: cl("#fff"), bg: cl("#000"), - fg2: cl("#fff"), bg2: cl("#004"), - fgH: cl("#fff"), bgH: cl("#00f"), - dark: true - }); - } -} - -function setLightTheme() { - if (g.theme.dark) { - upd({ - fg: cl("#000"), bg: cl("#fff"), - fg2: cl("#000"), bg2: cl("#cff"), - fgH: cl("#000"), bgH: cl("#0ff"), - dark: false - }); - } -} - if (settings.theme.fg > 0) { saved.darkModeActive = 1; } else { diff --git a/apps/thmswtch/metadata.json b/apps/thmswtch/metadata.json index 581cbaff9..a60197dff 100644 --- a/apps/thmswtch/metadata.json +++ b/apps/thmswtch/metadata.json @@ -12,5 +12,6 @@ {"name":"thmswtch.settings.js","url":"settings.js"}, {"name":"thmswtch.boot.js","url":"boot.js"}, {"name":"thmswtch.img","url":"app-icon.js","evaluate":true} - ] + ], + "data":[{"name":"thmswtch.settings.json"}] } diff --git a/apps/thmswtch/settings.js b/apps/thmswtch/settings.js index 83ce6010f..06a46472c 100644 --- a/apps/thmswtch/settings.js +++ b/apps/thmswtch/settings.js @@ -30,7 +30,7 @@ var mainmenu = { "< Back": function () { load(); }, "Automatic Dark Mode": { value: saved.darkMode | false, - format: v => v ? "On" : "Off", + //format: v => v ? "On" : "Off", min: 0, max: 1, step: 1, onchange: v => { saved.darkMode = v; From 306a975bf8597f04be273e1826b8701614efb7b8 Mon Sep 17 00:00:00 2001 From: jan lamos Date: Sat, 16 Mar 2024 14:52:29 +0100 Subject: [PATCH 10/10] further linter issue fixes --- apps/thmswtch/app.js | 230 +++++++++++++++++++-- apps/thmswtch/metadata.json | 4 +- apps/thmswtch/settings.js | 384 ++++++++++++++++++------------------ 3 files changed, 410 insertions(+), 208 deletions(-) diff --git a/apps/thmswtch/app.js b/apps/thmswtch/app.js index d1be7b997..55ddd7554 100644 --- a/apps/thmswtch/app.js +++ b/apps/thmswtch/app.js @@ -1,7 +1,170 @@ const SETTINGS_FILE = "themeSwitch.json"; const storage = require("Storage"); +var sunrise, sunset, date; +var SunCalc = require("suncalc"); // from modules folder let settings = storage.readJSON('setting.json', 1); let saved = storage.readJSON(SETTINGS_FILE, 1) || {}; +if (settings.theme.fg > 0) { + saved.darkModeActive = 1; +} else { + saved.darkModeActive = 0; +} +let dmH, dmM, lmH, lmM; +if (require("Storage").readJSON("themeSwitch.json", 1) !== undefined) { + dmH = parseInt(saved.darkModeAt.split(":")[0] | 0); + dmM = parseInt(saved.darkModeAt.split(":")[1] | 0); + lmH = parseInt(saved.lightModeAt.split(":")[0] | 0); + lmM = parseInt(saved.lightModeAt.split(":")[1] | 0); +} else { + dmH = 0; + dmM = 0; + lmH = 0; + lmM = 0; +} +// Main menu + +var mainmenu = { + "": { + "title": "Theme Switch" + }, + "< Back": function () { load(); }, + "Automatic Dark Mode": { + value: saved.darkMode | false, + format: v => v ? "On" : "Off", + min: 0, max: 1, step: 1, + onchange: v => { + saved.darkMode = v; + storage.writeJSON(SETTINGS_FILE, saved); + } + }, + "Dark Mode Active": { + value: saved.darkModeActive | false, + format: v => v ? "On" : "Off", + min: 0, max: 1, step: 1, + onchange: v => { + saved.darkModeActive = v; + storage.writeJSON(SETTINGS_FILE, saved); + if (v !== 0) { + setDarkTheme(); + Bangle.drawWidgets(); + } else { + setLightTheme(); + Bangle.drawWidgets(); + } + } + }, + "Dark Mode by Sun": { + value: saved.darkModeBySun | false, + format: v => v ? "On" : "Off", + min: 0, max: 1, step: 1, + onchange: v => { + saved.darkModeBySun = v; + if (v !== 0) { + //print("calculating sun times"); + calculateSunTimes(); + saved.lightModeAt = sunrise; + saved.darkModeAt = sunset; + //print("sunrise" +sunrise); + //print("sunset" +sunset); + } + storage.writeJSON(SETTINGS_FILE, saved); + }, + }, + "light mode at": { + value: saved.lightModeAt, + format: v => saved.lightModeAt, + onchange: function () { + if (saved.darkModeBySun === 0) { + E.showMenu(lightModeAtMenu); + } + else { + E.showAlert("Deactivate dark mode first!", "Action Blocked").then( + function () { E.showMenu(mainmenu); }); + } + } + }, + "dark mode at": { + value: saved.darkModeAt, + format: v => saved.darkModeAt, + onchange: function () { + if (saved.darkModeBySun === 0) { + E.showMenu(darkModeAtMenu); + } + else { + E.showAlert("Deactivate dark mode first!", "Action Blocked").then(function () { E.showMenu(mainmenu); }); + } + } + }, + "Exit": function () { load(); }, +}; + +var lightModeAtMenu = { + "": { + "title": "light mode at" + }, + "Hour": { + value: lmH, + min: 0, max: 23, step: 1, + onchange: v => { lmH = v; } + }, + "Minute": { + value: lmM, + min: 0, max: 59, step: 1, + onchange: v => { lmM = v; } + }, + "< Back": function () { + saved.lightModeAt = fixTime(lmH, lmM); + storage.writeJSON(SETTINGS_FILE, saved); + E.showMenu(mainmenu); + }, +}; + +var darkModeAtMenu = { + "": { + "title": "dark mode at" + }, + "Hour": { + value: dmH, + min: 0, max: 23, step: 1, + onchange: v => { dmH = v; } + }, + "Minute": { + value: dmM, + min: 0, max: 59, step: 1, + onchange: v => { dmM = v; } + }, + "< Back": function () { + saved.darkModeAt = fixTime(dmH, dmM); + storage.writeJSON(SETTINGS_FILE, saved); + E.showMenu(mainmenu); + }, +}; + +// Actually display the menu +E.showMenu(mainmenu); + +// Function to fix time format +function fixTime(h, m) { + if (h.toString().length < 2) { + h = "0" + h.toString(); + } + if (m.toString().length < 2) { + m = "0" + m.toString(); + } + return h.toString() + ":" + m.toString(); +} + +function calculateSunTimes() { + var location = require("Storage").readJSON("mylocation.json", 1) || {}; + location.lat = location.lat || 51.5072; + location.lon = location.lon || 0.1276; // London + date = new Date(Date.now()); + var times = SunCalc.getTimes(date, location.lat, location.lon); + sunrise = fixTime(times.sunrise.getHours(), times.sunrise.getMinutes()); + sunset = fixTime(times.sunset.getHours(), times.sunset.getMinutes()); + /* do we want to re-calculate this every day? Or we just assume + that 'show' will get called once a day? */ +} function cl(x) { return g.setColor(x).getColor(); } @@ -16,7 +179,7 @@ function upd(th) { g.clear(1); } -function flipTheme(saved) { +function setDarkTheme() { if (!g.theme.dark) { upd({ fg: cl("#fff"), bg: cl("#000"), @@ -24,26 +187,67 @@ function flipTheme(saved) { fgH: cl("#fff"), bgH: cl("#00f"), dark: true }); + } +} - saved.darkModeActive = 1; - } else { +function setLightTheme() { + if (g.theme.dark) { upd({ fg: cl("#000"), bg: cl("#fff"), fg2: cl("#000"), bg2: cl("#cff"), fgH: cl("#000"), bgH: cl("#0ff"), dark: false }); - saved.darkModeActive = 0; } - return saved; } -if (settings.theme.fg > 0) { - saved.darkModeActive = 1; -} else { - saved.darkModeActive = 0; -} +// const SETTINGS_FILE = "themeSwitch.json"; +// const storage = require("Storage"); +// let settings = storage.readJSON('setting.json', 1); +// let saved = storage.readJSON(SETTINGS_FILE, 1) || {}; -saved = flipTheme(saved); -storage.writeJSON(SETTINGS_FILE, saved); -Bangle.drawWidgets(); \ No newline at end of file +// function cl(x) { return g.setColor(x).getColor(); } + +// function upd(th) { +// g.theme = th; +// settings.theme = th; +// storage.write('setting.json', settings); +// delete g.reset; +// g._reset = g.reset; +// g.reset = function (n) { return g._reset().setColor(th.fg).setBgColor(th.bg); }; +// g.clear = function (n) { if (n) g.reset(); return g.clearRect(0, 0, g.getWidth(), g.getHeight()); }; +// g.clear(1); +// } + +// function flipTheme(saved) { +// if (!g.theme.dark) { +// upd({ +// fg: cl("#fff"), bg: cl("#000"), +// fg2: cl("#fff"), bg2: cl("#004"), +// fgH: cl("#fff"), bgH: cl("#00f"), +// dark: true +// }); + +// saved.darkModeActive = 1; +// } else { +// upd({ +// fg: cl("#000"), bg: cl("#fff"), +// fg2: cl("#000"), bg2: cl("#cff"), +// fgH: cl("#000"), bgH: cl("#0ff"), +// dark: false +// }); +// saved.darkModeActive = 0; +// } +// return saved; +// } + +// if (settings.theme.fg > 0) { +// saved.darkModeActive = 1; +// } else { +// saved.darkModeActive = 0; +// } + +// saved = flipTheme(saved); +// storage.writeJSON(SETTINGS_FILE, saved); +// Bangle.drawWidgets(); +// load(); \ No newline at end of file diff --git a/apps/thmswtch/metadata.json b/apps/thmswtch/metadata.json index a60197dff..e2826acdd 100644 --- a/apps/thmswtch/metadata.json +++ b/apps/thmswtch/metadata.json @@ -9,9 +9,7 @@ "readme": "README.md", "storage": [ {"name":"thmswtch.app.js","url":"app.js"}, - {"name":"thmswtch.settings.js","url":"settings.js"}, {"name":"thmswtch.boot.js","url":"boot.js"}, {"name":"thmswtch.img","url":"app-icon.js","evaluate":true} - ], - "data":[{"name":"thmswtch.settings.json"}] + ] } diff --git a/apps/thmswtch/settings.js b/apps/thmswtch/settings.js index 06a46472c..2b539666a 100644 --- a/apps/thmswtch/settings.js +++ b/apps/thmswtch/settings.js @@ -1,202 +1,202 @@ -const SETTINGS_FILE = "themeSwitch.json"; -const storage = require("Storage"); -var sunrise, sunset, date; -var SunCalc = require("suncalc"); // from modules folder -let settings = storage.readJSON('setting.json', 1); -let saved = storage.readJSON(SETTINGS_FILE, 1) || {}; -if (settings.theme.fg > 0) { - saved.darkModeActive = 1; -} else { - saved.darkModeActive = 0; -} -let dmH, dmM, lmH, lmM; -if (require("Storage").readJSON("themeSwitch.json", 1) !== undefined) { - dmH = parseInt(saved.darkModeAt.split(":")[0] | 0); - dmM = parseInt(saved.darkModeAt.split(":")[1] | 0); - lmH = parseInt(saved.lightModeAt.split(":")[0] | 0); - lmM = parseInt(saved.lightModeAt.split(":")[1] | 0); -} else { - dmH = 0; - dmM = 0; - lmH = 0; - lmM = 0; -} -// Main menu +// const SETTINGS_FILE = "themeSwitch.json"; +// const storage = require("Storage"); +// var sunrise, sunset, date; +// var SunCalc = require("suncalc"); // from modules folder +// let settings = storage.readJSON('setting.json', 1); +// let saved = storage.readJSON(SETTINGS_FILE, 1) || {}; +// if (settings.theme.fg > 0) { +// saved.darkModeActive = 1; +// } else { +// saved.darkModeActive = 0; +// } +// let dmH, dmM, lmH, lmM; +// if (require("Storage").readJSON("themeSwitch.json", 1) !== undefined) { +// dmH = parseInt(saved.darkModeAt.split(":")[0] | 0); +// dmM = parseInt(saved.darkModeAt.split(":")[1] | 0); +// lmH = parseInt(saved.lightModeAt.split(":")[0] | 0); +// lmM = parseInt(saved.lightModeAt.split(":")[1] | 0); +// } else { +// dmH = 0; +// dmM = 0; +// lmH = 0; +// lmM = 0; +// } +// // Main menu -var mainmenu = { - "": { - "title": "Theme Switch" - }, - "< Back": function () { load(); }, - "Automatic Dark Mode": { - value: saved.darkMode | false, - //format: v => v ? "On" : "Off", - min: 0, max: 1, step: 1, - onchange: v => { - saved.darkMode = v; - storage.writeJSON(SETTINGS_FILE, saved); - } - }, - "Dark Mode Active": { - value: saved.darkModeActive | false, - format: v => v ? "On" : "Off", - min: 0, max: 1, step: 1, - onchange: v => { - saved.darkModeActive = v; - storage.writeJSON(SETTINGS_FILE, saved); - if (v !== 0) { - setDarkTheme(); - Bangle.drawWidgets(); - } else { - setLightTheme(); - Bangle.drawWidgets(); - } - } - }, - "Dark Mode by Sun": { - value: saved.darkModeBySun | false, - format: v => v ? "On" : "Off", - min: 0, max: 1, step: 1, - onchange: v => { - saved.darkModeBySun = v; - if (v !== 0) { - //print("calculating sun times"); - calculateSunTimes(); - saved.lightModeAt = sunrise; - saved.darkModeAt = sunset; - //print("sunrise" +sunrise); - //print("sunset" +sunset); - } - storage.writeJSON(SETTINGS_FILE, saved); - }, - }, - "light mode at": { - value: saved.lightModeAt, - format: v => saved.lightModeAt, - onchange: function () { - if (saved.darkModeBySun === 0) { - E.showMenu(lightModeAtMenu); - } - else { - E.showAlert("Deactivate dark mode first!", "Action Blocked").then( - function () { E.showMenu(mainmenu); }); - } - } - }, - "dark mode at": { - value: saved.darkModeAt, - format: v => saved.darkModeAt, - onchange: function () { - if (saved.darkModeBySun === 0) { - E.showMenu(darkModeAtMenu); - } - else { - E.showAlert("Deactivate dark mode first!", "Action Blocked").then(function () { E.showMenu(mainmenu); }); - } - } - }, - "Exit": function () { load(); }, -}; +// var mainmenu = { +// "": { +// "title": "Theme Switch" +// }, +// "< Back": function () { load(); }, +// "Automatic Dark Mode": { +// value: saved.darkMode | false, +// //format: v => v ? "On" : "Off", +// min: 0, max: 1, step: 1, +// onchange: v => { +// saved.darkMode = v; +// storage.writeJSON(SETTINGS_FILE, saved); +// } +// }, +// "Dark Mode Active": { +// value: saved.darkModeActive | false, +// format: v => v ? "On" : "Off", +// min: 0, max: 1, step: 1, +// onchange: v => { +// saved.darkModeActive = v; +// storage.writeJSON(SETTINGS_FILE, saved); +// if (v !== 0) { +// setDarkTheme(); +// Bangle.drawWidgets(); +// } else { +// setLightTheme(); +// Bangle.drawWidgets(); +// } +// } +// }, +// "Dark Mode by Sun": { +// value: saved.darkModeBySun | false, +// format: v => v ? "On" : "Off", +// min: 0, max: 1, step: 1, +// onchange: v => { +// saved.darkModeBySun = v; +// if (v !== 0) { +// //print("calculating sun times"); +// calculateSunTimes(); +// saved.lightModeAt = sunrise; +// saved.darkModeAt = sunset; +// //print("sunrise" +sunrise); +// //print("sunset" +sunset); +// } +// storage.writeJSON(SETTINGS_FILE, saved); +// }, +// }, +// "light mode at": { +// value: saved.lightModeAt, +// format: v => saved.lightModeAt, +// onchange: function () { +// if (saved.darkModeBySun === 0) { +// E.showMenu(lightModeAtMenu); +// } +// else { +// E.showAlert("Deactivate dark mode first!", "Action Blocked").then( +// function () { E.showMenu(mainmenu); }); +// } +// } +// }, +// "dark mode at": { +// value: saved.darkModeAt, +// format: v => saved.darkModeAt, +// onchange: function () { +// if (saved.darkModeBySun === 0) { +// E.showMenu(darkModeAtMenu); +// } +// else { +// E.showAlert("Deactivate dark mode first!", "Action Blocked").then(function () { E.showMenu(mainmenu); }); +// } +// } +// }, +// "Exit": function () { load(); }, +// }; -var lightModeAtMenu = { - "": { - "title": "light mode at" - }, - "Hour": { - value: lmH, - min: 0, max: 23, step: 1, - onchange: v => { lmH = v; } - }, - "Minute": { - value: lmM, - min: 0, max: 59, step: 1, - onchange: v => { lmM = v; } - }, - "< Back": function () { - saved.lightModeAt = fixTime(lmH, lmM); - storage.writeJSON(SETTINGS_FILE, saved); - E.showMenu(mainmenu); - }, -}; +// var lightModeAtMenu = { +// "": { +// "title": "light mode at" +// }, +// "Hour": { +// value: lmH, +// min: 0, max: 23, step: 1, +// onchange: v => { lmH = v; } +// }, +// "Minute": { +// value: lmM, +// min: 0, max: 59, step: 1, +// onchange: v => { lmM = v; } +// }, +// "< Back": function () { +// saved.lightModeAt = fixTime(lmH, lmM); +// storage.writeJSON(SETTINGS_FILE, saved); +// E.showMenu(mainmenu); +// }, +// }; -var darkModeAtMenu = { - "": { - "title": "dark mode at" - }, - "Hour": { - value: dmH, - min: 0, max: 23, step: 1, - onchange: v => { dmH = v; } - }, - "Minute": { - value: dmM, - min: 0, max: 59, step: 1, - onchange: v => { dmM = v; } - }, - "< Back": function () { - saved.darkModeAt = fixTime(dmH, dmM); - storage.writeJSON(SETTINGS_FILE, saved); - E.showMenu(mainmenu); - }, -}; +// var darkModeAtMenu = { +// "": { +// "title": "dark mode at" +// }, +// "Hour": { +// value: dmH, +// min: 0, max: 23, step: 1, +// onchange: v => { dmH = v; } +// }, +// "Minute": { +// value: dmM, +// min: 0, max: 59, step: 1, +// onchange: v => { dmM = v; } +// }, +// "< Back": function () { +// saved.darkModeAt = fixTime(dmH, dmM); +// storage.writeJSON(SETTINGS_FILE, saved); +// E.showMenu(mainmenu); +// }, +// }; -// Actually display the menu -E.showMenu(mainmenu); +// // Actually display the menu +// E.showMenu(mainmenu); -// Function to fix time format -function fixTime(h, m) { - if (h.toString().length < 2) { - h = "0" + h.toString(); - } - if (m.toString().length < 2) { - m = "0" + m.toString(); - } - return h.toString() + ":" + m.toString(); -} +// // Function to fix time format +// function fixTime(h, m) { +// if (h.toString().length < 2) { +// h = "0" + h.toString(); +// } +// if (m.toString().length < 2) { +// m = "0" + m.toString(); +// } +// return h.toString() + ":" + m.toString(); +// } -function calculateSunTimes() { - var location = require("Storage").readJSON("mylocation.json", 1) || {}; - location.lat = location.lat || 51.5072; - location.lon = location.lon || 0.1276; // London - date = new Date(Date.now()); - var times = SunCalc.getTimes(date, location.lat, location.lon); - sunrise = fixTime(times.sunrise.getHours(), times.sunrise.getMinutes()); - sunset = fixTime(times.sunset.getHours(), times.sunset.getMinutes()); - /* do we want to re-calculate this every day? Or we just assume - that 'show' will get called once a day? */ -} +// function calculateSunTimes() { +// var location = require("Storage").readJSON("mylocation.json", 1) || {}; +// location.lat = location.lat || 51.5072; +// location.lon = location.lon || 0.1276; // London +// date = new Date(Date.now()); +// var times = SunCalc.getTimes(date, location.lat, location.lon); +// sunrise = fixTime(times.sunrise.getHours(), times.sunrise.getMinutes()); +// sunset = fixTime(times.sunset.getHours(), times.sunset.getMinutes()); +// /* do we want to re-calculate this every day? Or we just assume +// that 'show' will get called once a day? */ +// } -function cl(x) { return g.setColor(x).getColor(); } +// function cl(x) { return g.setColor(x).getColor(); } -function upd(th) { - g.theme = th; - settings.theme = th; - storage.write('setting.json', settings); - delete g.reset; - g._reset = g.reset; - g.reset = function (n) { return g._reset().setColor(th.fg).setBgColor(th.bg); }; - g.clear = function (n) { if (n) g.reset(); return g.clearRect(0, 0, g.getWidth(), g.getHeight()); }; - g.clear(1); -} +// function upd(th) { +// g.theme = th; +// settings.theme = th; +// storage.write('setting.json', settings); +// delete g.reset; +// g._reset = g.reset; +// g.reset = function (n) { return g._reset().setColor(th.fg).setBgColor(th.bg); }; +// g.clear = function (n) { if (n) g.reset(); return g.clearRect(0, 0, g.getWidth(), g.getHeight()); }; +// g.clear(1); +// } -function setDarkTheme() { - if (!g.theme.dark) { - upd({ - fg: cl("#fff"), bg: cl("#000"), - fg2: cl("#fff"), bg2: cl("#004"), - fgH: cl("#fff"), bgH: cl("#00f"), - dark: true - }); - } -} +// function setDarkTheme() { +// if (!g.theme.dark) { +// upd({ +// fg: cl("#fff"), bg: cl("#000"), +// fg2: cl("#fff"), bg2: cl("#004"), +// fgH: cl("#fff"), bgH: cl("#00f"), +// dark: true +// }); +// } +// } -function setLightTheme() { - if (g.theme.dark) { - upd({ - fg: cl("#000"), bg: cl("#fff"), - fg2: cl("#000"), bg2: cl("#cff"), - fgH: cl("#000"), bgH: cl("#0ff"), - dark: false - }); - } -} \ No newline at end of file +// function setLightTheme() { +// if (g.theme.dark) { +// upd({ +// fg: cl("#000"), bg: cl("#fff"), +// fg2: cl("#000"), bg2: cl("#cff"), +// fgH: cl("#000"), bgH: cl("#0ff"), +// dark: false +// }); +// } +// } \ No newline at end of file