From 554e2dfb19405eef2d0981f2e01bbb397d2c1bea Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 6 Jul 2023 11:41:00 +0100 Subject: [PATCH] Bangle.js2: number selector now supports tapping at top/bottom to increment/decrement value --- ChangeLog | 2 ++ libs/js/banglejs/E_showMenu_Q3.js | 33 ++++++++++++++++++++------- libs/js/banglejs/E_showMenu_Q3.min.js | 16 ++++++------- 3 files changed, 35 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index 06c0b49ee..131dd819d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -19,6 +19,8 @@ Bangle.js: Add Bangle.setBacklight(), Bangle.backlight event, Bangle.isBacklightOn() and allow input when lcd off if lockTimeout is 0 (fix #2383) Added NRF.eraseBonds() to allow peer manager info to be removed (other than by holding all buttons down) nRF52840: Fix potential 'SPI Send Error 17' SPI lockup + Bangle.js2: Fix number selector first draw in menu after 'redraw' argument added + Bangle.js2: number selector now supports tapping at top/bottom to increment/decrement value 2v18 : Fix drawString with setClipRect with 90/270-degree rotation (fix #2343) Pico/Wifi: Enabled JIT compiler diff --git a/libs/js/banglejs/E_showMenu_Q3.js b/libs/js/banglejs/E_showMenu_Q3.js index bbad8376b..96f493656 100644 --- a/libs/js/banglejs/E_showMenu_Q3.js +++ b/libs/js/banglejs/E_showMenu_Q3.js @@ -51,7 +51,7 @@ // show simple box for scroll up/down var R = Bangle.appRect; var v = item.value; - g.reset().clearRect(Bangle.appRect); + g.reset().clearRect(R); g.setFont("12x20").setFontAlign(0,0).drawString( menuIcon+" "+title, R.x+R.w/2,R.y+12); @@ -61,13 +61,7 @@ g.setColor(g.theme.fg2).setFontVector(Math.min(30,(R.w-52)*100/g.setFontVector(100).stringWidth(txt))).setFontAlign(0,0).drawString(txt, mx, my); g.fillPoly([mx,my-45, mx+15,my-30, mx-15,my-30]).fillPoly([mx,my+45, mx+15,my+30, mx-15,my+30]); } - draw(); - Bangle.setUI({ - mode: "updown", - back: show, - remove: options.remove, - redraw : l.draw() - }, dir => { + function cb(dir) { if (dir) { v -= (dir||1)*(item.step||1); if (item.min!==undefined && v { + dy += e.dy; // after a certain amount of dragging up/down fire cb + if (!e.b) dy=0; + while (Math.abs(dy)>32) { + if (dy>0) { dy-=32; cb(1); } + else { dy+=32; cb(-1); } + Bangle.buzz(20); + } + }, + touch : (_,e) => { + Bangle.buzz(20); + if (e.y<82) cb(-1); // top third + else if (e.y>142) cb(1); // bottom third + else cb(); // middle = accept + } }); } } diff --git a/libs/js/banglejs/E_showMenu_Q3.min.js b/libs/js/banglejs/E_showMenu_Q3.min.js index f80da871e..d2ddd5094 100644 --- a/libs/js/banglejs/E_showMenu_Q3.min.js +++ b/libs/js/banglejs/E_showMenu_Q3.min.js @@ -1,8 +1,8 @@ -(function(m){function w(a,b){var h=a.step||1;if(!a.noList&&void 0!==a.min&&void 0!==a.max&&20>(a.max-a.min)/h)E.showScroller({h:40,c:(a.max+h-a.min)/h,back:q,remove:l.remove,scrollMin:-24,scroll:-24,draw:(e,c)=>{if(0>e)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\x81\x00\xff\xff\xff\x00\x00\x00\x00\x0f\xff\xff\xf0\x00\x00\x00\x00\xff\xff\xff "+b,c.x+12,c.y+40-12);g.setColor(g.theme.bg2).fillRect({x:c.x+4,y:c.y+2,w:c.w-8,h:c.h-4,r:5}); -e=e*h+a.min;g.setColor(g.theme.fg2).setFont("12x20").setFontAlign(-1,0).drawString(a.format?a.format(e,1):e,c.x+12,c.y+20);g.drawImage(atob(e==a.value?"FBSBAAH4AH/gHgeDgBww8MY/xmf+bH/jz/88//PP/zz/88f+Nn/mY/xjDww4AcHgeAf+AB+A":"FBSBAAH4AH/gHgeDgBwwAMYABmAAbAADwAA8AAPAADwAA8AANgAGYABjAAw4AcHgeAf+AB+A"),c.x+c.w-32,c.y+20-10)},select:function(e){if(!(0>e)){Bangle.buzz(20);a.value=a.min+e*h;if(a.onchange)a.onchange(a.value);r.scroll=k.scroller.scroll;q()}}});else{var d=Bangle.appRect,f=a.value;g.reset().clearRect(Bangle.appRect); -g.setFont("12x20").setFontAlign(0,0).drawString("\x00\f\f\x81\x00\xff\xff\xff\x00\x00\x00\x00\x0f\xff\xff\xf0\x00\x00\x00\x00\xff\xff\xff "+b,d.x+d.w/2,d.y+12);function e(){var c=d.x+d.w/2,n=12+d.y+d.h/2,u=a.format?a.format(f,2):f;g.reset().setColor(g.theme.bg2).fillRect({x:d.x+24,y:d.y+36,w:d.w-48,h:d.h-48,r:5});g.setColor(g.theme.fg2).setFontVector(Math.min(30,100*(d.w-52)/g.setFontVector(100).stringWidth(u))).setFontAlign(0,0).drawString(u,c,n);g.fillPoly([c,n-45,c+15,n-30, -c-15,n-30]).fillPoly([c,n+45,c+15,n+30,c-15,n+30])}e();Bangle.setUI({mode:"updown",back:q,remove:l.remove,redraw:k.draw()},c=>{if(c)f-=(c||1)*(a.step||1),void 0!==a.min&&fa.max&&(f=a.wrap?a.min:a.max),e();else{a.value=f;if(a.onchange)a.onchange(a.value);r.scroll=k.scroller.scroll;q()}})}}function q(){k.scroller=E.showScroller(r)}if(void 0===m)return g.clearRect(Bangle.appRect),Bangle.setUI();var l=m[""]||{};l.title||(l.title="Menu");var t=l.back||m["< Back"], -p=Object.keys(m).filter(a=>""!==a&&"< Back"!=a);p.forEach(a=>{a=m[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format||(a.format=b=>"\x00"+atob(b?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g"))});var k={draw:()=>k.scroller.draw(),scroller:void 0};let v;var r={h:40,c:p.length,scrollMin:-24,scroll:null!=(v=l.scroll)?v:-24,back:t,remove:l.remove,draw:(a,b)=>{if(0>a)return g.setColor(g.theme.fg).setFont("12x20").setFontAlign(-1, -0).drawString("\x00\f\f\x81\x00\xff\xff\xff\x00\x00\x00\x00\x0f\xff\xff\xf0\x00\x00\x00\x00\xff\xff\xff "+l.title,b.x+12,b.y+40-12);g.setColor(g.theme.bg2).fillRect({x:b.x+4,y:b.y+2,w:b.w-8,h:b.h-4,r:5});g.setColor(g.theme.fg2).setFont("12x20");var h=24,d=m[p[a]];if("object"==typeof d){var f=d.value;d.format&&(f=d.format(f));g.stringMetrics(f).width>b.w/2&&(f=g.wrapString(f,b.w/2).join("\n"));g.setFontAlign(1,0).drawString(f,b.x+b.w-8,b.y+20);h+=g.stringWidth(f)}else"function"== -typeof d&&(g.drawImage(atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="),b.x+b.w-21,b.y+20-9),h+=16);var e;a=null!=(e=d&&d.title)?e:p[a];e=g.wrapString(a,b.w-h);1a)return t&&t();var b=m[p[a]];Bangle.buzz(20);if("function"==typeof b)b(k);else if("object"==typeof b)if("number"==typeof b.value)w(b,p[a]);else{"boolean"==typeof b.value&&(b.value=!b.value);if(b.onchange)b.onchange(b.value); -k.scroller.isActive()&&k.scroller.drawItem(a)}}};q();return k}) \ No newline at end of file +(function(q){function y(a,b){var l=a.step||1;if(!a.noList&&void 0!==a.min&&void 0!==a.max&&20>(a.max-a.min)/l)E.showScroller({h:40,c:(a.max+l-a.min)/l,back:t,remove:n.remove,scrollMin:-24,scroll:-24,draw:(h,d)=>{if(0>h)return g.setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\x81\x00\xff\xff\xff\x00\x00\x00\x00\x0f\xff\xff\xf0\x00\x00\x00\x00\xff\xff\xff "+b,d.x+12,d.y+40-12);g.setColor(g.theme.bg2).fillRect({x:d.x+4,y:d.y+2,w:d.w-8,h:d.h-4,r:5}); +h=h*l+a.min;g.setColor(g.theme.fg2).setFont("12x20").setFontAlign(-1,0).drawString(a.format?a.format(h,1):h,d.x+12,d.y+20);g.drawImage(atob(h==a.value?"FBSBAAH4AH/gHgeDgBww8MY/xmf+bH/jz/88//PP/zz/88f+Nn/mY/xjDww4AcHgeAf+AB+A":"FBSBAAH4AH/gHgeDgBwwAMYABmAAbAADwAA8AAPAADwAA8AANgAGYABjAAw4AcHgeAf+AB+A"),d.x+d.w-32,d.y+20-10)},select:function(h){if(!(0>h)){Bangle.buzz(20);a.value=a.min+h*l;if(a.onchange)a.onchange(a.value);u.scroll=p.scroller.scroll;t()}}});else{var c=Bangle.appRect,e=a.value;g.reset().clearRect(c); +g.setFont("12x20").setFontAlign(0,0).drawString("\x00\f\f\x81\x00\xff\xff\xff\x00\x00\x00\x00\x0f\xff\xff\xf0\x00\x00\x00\x00\xff\xff\xff "+b,c.x+c.w/2,c.y+12);function h(){var f=c.x+c.w/2,m=12+c.y+c.h/2,w=a.format?a.format(e,2):e;g.reset().setColor(g.theme.bg2).fillRect({x:c.x+24,y:c.y+36,w:c.w-48,h:c.h-48,r:5});g.setColor(g.theme.fg2).setFontVector(Math.min(30,100*(c.w-52)/g.setFontVector(100).stringWidth(w))).setFontAlign(0,0).drawString(w,f,m);g.fillPoly([f,m-45,f+15,m-30, +f-15,m-30]).fillPoly([f,m+45,f+15,m+30,f-15,m+30])}function d(f){if(f)e-=(f||1)*(a.step||1),void 0!==a.min&&ea.max&&(e=a.wrap?a.min:a.max),h();else{a.value=e;if(a.onchange)a.onchange(a.value);u.scroll=p.scroller.scroll;t()}}h();var k=0;Bangle.setUI({mode:"custom",back:t,remove:n.remove,redraw:h,drag:f=>{k+=f.dy;for(f.b||(k=0);32{Bangle.buzz(20);82>m.y?d(-1):142""!==a&&"< Back"!=a);r.forEach(a=>{a=q[a];"object"!=typeof a||"boolean"!=typeof a.value||a.format||(a.format=b=>"\x00"+atob(b?"EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g":"EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g"))});var p={draw:()=>p.scroller.draw(),scroller:void 0}; +let x;var u={h:40,c:r.length,scrollMin:-24,scroll:null!=(x=n.scroll)?x:-24,back:v,remove:n.remove,draw:(a,b)=>{if(0>a)return g.setColor(g.theme.fg).setFont("12x20").setFontAlign(-1,0).drawString("\x00\f\f\x81\x00\xff\xff\xff\x00\x00\x00\x00\x0f\xff\xff\xf0\x00\x00\x00\x00\xff\xff\xff "+n.title,b.x+12,b.y+40-12);g.setColor(g.theme.bg2).fillRect({x:b.x+4,y:b.y+2,w:b.w-8,h:b.h-4,r:5});g.setColor(g.theme.fg2).setFont("12x20");var l=24,c=q[r[a]];if("object"==typeof c){var e=c.value; +c.format&&(e=c.format(e));g.stringMetrics(e).width>b.w/2&&(e=g.wrapString(e,b.w/2).join("\n"));g.setFontAlign(1,0).drawString(e,b.x+b.w-8,b.y+20);l+=g.stringWidth(e)}else"function"==typeof c&&(g.drawImage(atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="),b.x+b.w-21,b.y+20-9),l+=16);var k;a=null!=(k=c&&c.title)?k:r[a];k=g.wrapString(a,b.w-l);1a)return v&&v();var b=q[r[a]]; +Bangle.buzz(20);if("function"==typeof b)b(p);else if("object"==typeof b)if("number"==typeof b.value)y(b,r[a]);else{"boolean"==typeof b.value&&(b.value=!b.value);if(b.onchange)b.onchange(b.value);p.scroller.isActive()&&p.scroller.drawItem(a)}}};t();return p}) \ No newline at end of file