From ede6318ac624766f20e381f79d83f3395bfb70c4 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 24 Jun 2021 16:09:40 +0100 Subject: [PATCH 1/6] add settings theme menu --- apps.json | 2 +- apps/setting/ChangeLog | 1 + apps/setting/settings.js | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 7151661fb..94c0f7647 100644 --- a/apps.json +++ b/apps.json @@ -172,7 +172,7 @@ { "id": "setting", "name": "Settings", "icon": "settings.png", - "version":"0.26", + "version":"0.27", "description": "A menu for setting up Bangle.js", "tags": "tool,system,b2", "readme": "README.md", diff --git a/apps/setting/ChangeLog b/apps/setting/ChangeLog index 00d11d562..779a14ebd 100644 --- a/apps/setting/ChangeLog +++ b/apps/setting/ChangeLog @@ -29,3 +29,4 @@ 0.24: Add Quiet Mode settings 0.25: Move boot.js code into 'boot' app itself 0.26: Use Bangle.softOff if available as this keeps the time +0.27: Add Theme menu diff --git a/apps/setting/settings.js b/apps/setting/settings.js index 12448d463..361d6046b 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -114,6 +114,7 @@ function showMainMenu() { 'Select Clock': ()=>showClockMenu(), 'Set Time': ()=>showSetTimeMenu(), 'LCD': ()=>showLCDMenu(), + 'Theme': ()=>showThemeMenu(), 'Reset Settings': ()=>showResetMenu(), 'Turn Off': ()=>{ if (Bangle.softOff) Bangle.softOff(); else Bangle.off() }, '< Back': ()=>load() @@ -162,6 +163,41 @@ function showBLEMenu() { }); } +function showThemeMenu() { + function cl(x) { return g.setColor(x).getColor(); } + function upd(th) { + g.theme = th; + settings.theme = th; + updateSettings(); + 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); + Bangle.drawWidgets(); + m.draw(); + } + var m = E.showMenu({ + 'Dark BW': ()=>{ + upd({ + fg:cl("#fff"), bg:cl("#000"), + fg2:cl("#0ff"), bg2:cl("#000"), + fgH:cl("#fff"), bgH:cl("#00f"), + dark:true + }); + }, + 'Light BW': ()=>{ + upd({ + fg:cl("#000"), bg:cl("#fff"), + fg2:cl("#00f"), bg2:cl("#0ff"), + fgH:cl("#000"), bgH:cl("#00f"), + dark:false + }); + }, + '< Back': ()=>showMainMenu() + }); +} + function showPasskeyMenu() { var menu = { "Disable" : () => { From 1ebd554ef82f8147513a8c81d9bd9f217c7482f0 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 25 Jun 2021 10:50:23 +0100 Subject: [PATCH 2/6] tweak for #766 to copy with very slow file reads --- apps/gpsrec/interface.html | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/gpsrec/interface.html b/apps/gpsrec/interface.html index 11b53164f..4c7270f0a 100644 --- a/apps/gpsrec/interface.html +++ b/apps/gpsrec/interface.html @@ -95,6 +95,7 @@ function getTrackList() { Util.showModal("Loading Tracks..."); domTracks.innerHTML = ""; Puck.write(`\x10(function() { + Bluetooth.println(""); for (var n=0;n<36;n++) { var f = require("Storage").open(".gpsrc"+n.toString(36),"r"); var l = f.readLine(); From a4358600a0791e17cc5978c9ae0d08b0a584e6b4 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 28 Jun 2021 11:13:47 +0100 Subject: [PATCH 3/6] verticalface 0.09: Fix time when minutes<10 and hours>9 (fix #767) --- apps.json | 2 +- apps/verticalface/ChangeLog | 1 + apps/verticalface/app.js | 29 ++++++++++++++--------------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/apps.json b/apps.json index eeeff3d86..4289a318c 100644 --- a/apps.json +++ b/apps.json @@ -2172,7 +2172,7 @@ "name": "Vertical watch face", "shortName":"Vertical Face", "icon": "app.png", - "version":"0.08", + "version":"0.09", "description": "A simple vertical watch face with the date. Heart rate monitor is toggled with BTN1", "tags": "clock", "type":"clock", diff --git a/apps/verticalface/ChangeLog b/apps/verticalface/ChangeLog index c5dc1c7bd..99ab68ec4 100644 --- a/apps/verticalface/ChangeLog +++ b/apps/verticalface/ChangeLog @@ -3,3 +3,4 @@ 0.06: Tweak sizing to allow widgets at top, and add widgets (fix #567) 0.07: Added leading zero to hours and minutes 0.08: Show step count by calling wpedom.getSteps() or activepedom.getSteps() +0.09: Fix time when minutes<10 and hours>9 (fix #767) diff --git a/apps/verticalface/app.js b/apps/verticalface/app.js index e44a522de..4fcae5642 100644 --- a/apps/verticalface/app.js +++ b/apps/verticalface/app.js @@ -6,13 +6,13 @@ let currentHRM = "CALC"; function drawTimeDate() { var d = new Date(); var h = d.getHours(), m = d.getMinutes(), day = d.getDate(), month = d.getMonth(), weekDay = d.getDay(); - + if (h < 10) { h = "0" + h; } - + if (m < 10) { - m = "0" + h; + m = "0" + m; } var daysOfWeek = ["SUN", "MON", "TUE","WED","THU","FRI","SAT"]; @@ -128,17 +128,10 @@ Bangle.on('lcdPower',on=>{ } }); -// Show launcher when middle button pressed -setWatch(Bangle.showLauncher, BTN2, { repeat: false, edge: "falling" }); - -Bangle.on('touch', function(button) { - if(button == 1 || button == 2){ - Bangle.showLauncher(); - } -}); - -//HRM Controller. -setWatch(function(){ +// Show launcher when button pressed +Bangle.setUI("clockupdown", btn=>{ + if (btn!=0) return; + //HRM Controller. if(!HRMstate){ //console.log("Toggled HRM"); //Turn on. @@ -155,7 +148,13 @@ setWatch(function(){ currentHRM = []; } drawBPM(HRMstate); -}, BTN1, { repeat: true, edge: "falling" }); +}); + +Bangle.on('touch', function(button) { + if(button == 1 || button == 2){ + Bangle.showLauncher(); + } +}); Bangle.on('HRM', function(hrm) { if(hrm.confidence > 90){ From 8b4af27cfcfd2a753e1b07037b4fc65ebbad8162 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 30 Jun 2021 10:13:24 +0100 Subject: [PATCH 4/6] swap nob2 tag to bno2 to allow us to filter on search term 'b2' more easily --- apps.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/apps.json b/apps.json index 4289a318c..100ac0e76 100644 --- a/apps.json +++ b/apps.json @@ -340,7 +340,7 @@ "icon": "clock.png", "version":"0.03", "description": "7 segment clock with animated background in the style of Ryan Geiss' music visualisation. NOTE: The first run will take ~1 minute to do some precalculation", - "tags": "clock,nob2", + "tags": "clock,bno2", "type":"clock", "storage": [ {"name":"geissclk.app.js","url":"clock.js"}, @@ -1170,7 +1170,7 @@ "icon": "app.png", "version":"0.03", "description": "Watch-centered digital 24h clock with date in dd.mm.yyyy format.", - "tags": "clock,nob2", + "tags": "clock,bno2", "type":"clock", "allow_emulator":true, "storage": [ @@ -1210,7 +1210,7 @@ "icon": "app.png", "version": "0.04", "description": "Pipboy themed clock", - "tags": "clock,nob2", + "tags": "clock,bno2", "type":"clock", "allow_emulator":true, "storage": [ @@ -2143,7 +2143,7 @@ "icon": "app.png", "version":"0.03", "description": "An animated clock face using Mark Ferrari's amazing 8 bit game art and palette cycling: http://www.markferrari.com/art/8bit-game-art", - "tags": "clock,animated,nob2", + "tags": "clock,animated,bno2", "type": "clock", "storage": [ {"name":"animclk.app.js","url":"app.js"}, @@ -2159,7 +2159,7 @@ "icon": "app.png", "version":"0.03", "description": "An analog clock with an image background", - "tags": "clock,nob2", + "tags": "clock,bno2", "type": "clock", "storage": [ {"name":"analogimgclk.app.js","url":"app.js"}, @@ -2497,7 +2497,7 @@ "icon": "digiclock.png", "version":"0.02", "description": "A simple digital clock with the time, day, month, and year", - "tags": "clock,nob2", + "tags": "clock,bno2", "type" : "clock", "storage": [ {"name":"digiclock.app.js","url":"digiclock.js"}, @@ -3051,7 +3051,7 @@ "version":"0.01", "description": "Displays RGB565 and RGB888 colors, its name and code in screen.", "readme": "README.md", - "tags": "Color,input,buttons,touch,UI,nob2", + "tags": "Color,input,buttons,touch,UI,bno2", "storage": [ {"name":"color_catalog.app.js","url":"app.js"}, {"name":"color_catalog.img","url":"app-icon.js","evaluate":true} From 8e11e1811c3cae02325a44e05dbaf4a8b4e4d835 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 30 Jun 2021 10:17:55 +0100 Subject: [PATCH 5/6] Add Bangle.js 2 scroll launcher --- apps.json | 13 ++++++++ apps/launchb2/ChangeLog | 1 + apps/launchb2/app.js | 67 ++++++++++++++++++++++++++++++++++++++++ apps/launchb2/app.png | Bin 0 -> 899 bytes 4 files changed, 81 insertions(+) create mode 100644 apps/launchb2/ChangeLog create mode 100644 apps/launchb2/app.js create mode 100644 apps/launchb2/app.png diff --git a/apps.json b/apps.json index 100ac0e76..148120854 100644 --- a/apps.json +++ b/apps.json @@ -51,6 +51,19 @@ ], "sortorder" : -10 }, + { "id": "launchb2", + "name": "Launcher (Bangle.js 2)", + "shortName":"Launcher", + "icon": "app.png", + "version":"0.01", + "description": "This is needed by Bangle.js 2.0 to display a menu allowing you to choose your own applications. It will not work on Bangle.js 1.0.", + "tags": "tool,system,launcher,b2,bno1", + "type":"launch", + "storage": [ + {"name":"launchb2.app.js","url":"app.js"} + ], + "sortorder" : -10 + }, { "id": "about", "name": "About", "icon": "app.png", diff --git a/apps/launchb2/ChangeLog b/apps/launchb2/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/launchb2/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/launchb2/app.js b/apps/launchb2/app.js new file mode 100644 index 000000000..56f3fd696 --- /dev/null +++ b/apps/launchb2/app.js @@ -0,0 +1,67 @@ +var s = require("Storage"); +var apps = s.list(/\.info$/).map(app=>{var a=s.readJSON(app,1);return a&&{name:a.name,type:a.type,icon:a.icon,sortorder:a.sortorder,src:a.src};}).filter(app=>app && (app.type=="app" || app.type=="clock" || !app.type)); +apps.sort((a,b)=>{ + var n=(0|a.sortorder)-(0|b.sortorder); + if (n) return n; // do sortorder first + if (a.nameb.name) return 1; + return 0; +}); +var APPH = 64; +var menuScroll = 0; +var menuShowing = false; +var w = g.getWidth(); +var h = g.getHeight(); +var n = Math.ceil((h-24)/APPH); +var menuScrollMax = APPH*apps.length - (h-24); + +apps.forEach(app=>{ + if (app.icon) + app.icon = s.read(app.icon); // should just be a link to a memory area +}); + +function drawApp(i) { + var y = 24+i*APPH-menuScroll; + var app = apps[i]; + if (!app || y<-APPH || y>=g.getHeight()) return; + g.setFont("6x8",2).setFontAlign(-1,0).drawString(app.name,64,y+32); + if (app.icon) try {g.drawImage(app.icon,8,y+8);} catch(e){} +} + +function drawMenu() { + g.reset().clearRect(0,24,w-1,h-1); + g.setClipRect(0,24,g.getWidth()-1,g.getHeight()-1); + for (var i=0;i{ + var dy = e.dy; + if (menuScroll - dy < 0) + dy = menuScroll; + if (menuScroll - dy > menuScrollMax) + dy = menuScroll - menuScrollMax; + if (!dy) return; + g.reset().setClipRect(0,24,g.getWidth()-1,g.getHeight()-1); + g.scroll(0,dy); + menuScroll -= dy; + if (e.dy < 0) drawApp(Math.floor((menuScroll+24)/APPH)+n-1); + else drawApp(Math.floor((menuScroll+24)/APPH)); + g.setClipRect(0,0,g.getWidth()-1,g.getHeight()-1); +}); +Bangle.on("touch",(_,e)=>{ + if (e.y<20) return; + var i = Math.floor((e.y+menuScroll-24) / APPH); + var app = apps[i]; + if (!app) return; + if (!app.src || require("Storage").read(app.src)===undefined) { + E.showMessage("App Source\nNot found"); + setTimeout(drawMenu, 2000); + } else { + E.showMessage("Loading..."); + load(app.src); + } +}); +Bangle.loadWidgets(); +Bangle.drawWidgets(); diff --git a/apps/launchb2/app.png b/apps/launchb2/app.png new file mode 100644 index 0000000000000000000000000000000000000000..8b4e6caa2fe4720a32f492bd00c6e68751fabfbc GIT binary patch literal 899 zcmV-}1AP36P)EZi8a;XNfX0KK)EG5t2&jmXSR!CR3JOvSF^w(VT@Oq6O4&}^ElAua zX|l63`{wtXcjoO3*x1-CYovub^cOBY?cfcO1>;+VoWa;>Pk;!SG_WW*Es5gZ1-`R@ z4t>oKYJ)f#xYia)IV)#&xZ*BHYck+F1K9eED0&f|F;Lm{VL;rb?(c)W{8d& zzrH4`vJJ?>K!fln4K4LjpAx19%+|UjgL{LF?3gt^suTXG8HN@KQv>tY{cLjA%Q)j? zIX0ma_G_?6n>drF(WulAaitj}A^+b$v5k$*zr})O^uogfX;+bphn_9#OZ}pdk^!&c zqrUVgUd3m%o}@|o!cmyJiIaP-*BlK-1F7-kNoN^X5h5L~tnN`_& zI3(jUhvcNZU>jbg3|-gg8hTDln@m+>N(dP^vh_T*8x8>Qb*ytvU&Y#;lz3_Z*tBLl zEghFFmS~QUfhzCr>E}|Fxr&yKOBoXz4vqjF zlzKwtw{idZM95W(Tbb#rO0Wkqaj6$F@MWZp>h=2o=nr;LTzCQiH!$$4i=w<5W87%F zs6NXOGI0OH6?#VB0k9%#HO2Wg(|z6FTj}`r1kmXWJk5wmGlUFGsuA7}JOW^&y9!O$ zkR=&S*XaHEp1^o_Mn#&D^ig6k6`9rJMEHEc@fMjg8GR Z=Px>?AD_-bQjY)t002ovPDHLkV1j2qp7Q_z literal 0 HcmV?d00001 From 97e6d54f8965cfe3b7dd38605355d484d1aa8b56 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 30 Jun 2021 10:18:21 +0100 Subject: [PATCH 6/6] Quick about tweak to make it work if only one button --- apps/about/app.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/about/app.js b/apps/about/app.js index 9edd0c94f..b95b8bbd0 100644 --- a/apps/about/app.js +++ b/apps/about/app.js @@ -37,5 +37,7 @@ g.drawString(NRF.getAddress(),g.getWidth()/2,g.getHeight()-8,true); g.flip(); setWatch(_=>load(), BTN1); -setWatch(_=>load(), BTN2); -setWatch(_=>load(), BTN3); +if (global.BTN2) { + setWatch(_=>load(), BTN2); + setWatch(_=>load(), BTN3); +}