Skip to content

Commit 595160b

Browse files
committed
Tweaks to allow up to 6 buttons in showPrompt, different heights as per https://github.com/orgs/espruino/discussions/7692#discussioncomment-12418912
Bangle.js2: Fix issue when an onchange callback from E.showMenu submenu changes the menu immediately - see https://github.com/orgs/espruino/discussions/7697
1 parent a3e938b commit 595160b

File tree

5 files changed

+30
-22
lines changed

5 files changed

+30
-22
lines changed

ChangeLog

+2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
STM32: Ensure proper distribution of analogRead values (now `0<=analogRead()<1` as on other boards) and add docs (fix #2612)
2020
Change ioBuffer FIFO from 4 byte blocks to variable length blocks. Far more efficient for USB/BLE/other block data
2121
STM32: Fix spi.write usage on same port that SD card is used with (fix #2613)
22+
Bangle.js2: Added new Renaissance fonts and g.findFont function for selecting the best font
23+
Bangle.js2: Fix issue when an onchange callback from E.showMenu submenu changes the menu immediately
2224

2325
2v25 : ESP32C3: Get analogRead working correctly
2426
Graphics: Adjust image alignment when rotating images to avoid cropping (fix #2535)

libs/js/banglejs/E_showMenu_Q3.js

+11-7
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
if (!item.noList && item.min!==undefined && item.max!==undefined &&
2525
((item.max-item.min)/step)<20) {
2626
// show scrolling menu of options
27-
E.showScroller({
27+
var scroller = E.showScroller({
2828
h : H, c : (item.max+step-item.min)/step,
2929
back: show, // redraw original menu
3030
remove: options.remove,
@@ -45,8 +45,10 @@
4545
Bangle.buzz(20);
4646
item.value = item.min + idx*step;
4747
if (item.onchange) item.onchange(item.value);
48-
scr.scroll = l.scroller.scroll; // set scroll to prev position
49-
show(); // redraw original menu
48+
if (scroller.isActive()) { // onchange may have changed menu!
49+
scr.scroll = l.scroller.scroll; // set scroll to prev position
50+
show(); // redraw original menu
51+
}
5052
}
5153
});
5254
} else {
@@ -72,8 +74,10 @@
7274
} else { // actually selected
7375
item.value = v;
7476
if (item.onchange) item.onchange(item.value);
75-
scr.scroll = l.scroller.scroll; // set scroll to prev position
76-
show(); // redraw original menu
77+
if (Bangle.uiRedraw == draw) { // onchange may have changed menu!
78+
scr.scroll = l.scroller.scroll; // set scroll to prev position
79+
show(); // redraw original menu
80+
}
7781
}
7882
}
7983
draw();
@@ -123,14 +127,14 @@
123127
var v = item.value;
124128
if (item.format) v=item.format(v);
125129
var val = g.findFont(v, {w:r.w/2,h:r.h,wrap:1,trim:1});
126-
g.setFontAlign(1,0).drawString(val.text,r.x+r.w-8,r.y+H/2);
130+
g.setFontAlign(1,0).drawString(val.text,r.x+r.w-8,2+r.y+H/2);
127131
pad += g.stringWidth(val.text);
128132
} else if ("function" == typeof item) {
129133
g.drawImage(/* 9x18 */atob("CRKBAGA4Hg8DwPB4HgcDg8PB4eHg8HAwAA=="), r.x+r.w-21, r.y+H/2-9);
130134
pad += 16;
131135
}
132136
var itemText = g.findFont((item&&item.title)??keys[idx], {w:r.w-pad,h:r.h,wrap:1,trim:1});
133-
g.setFontAlign(-1,0).drawString(itemText.text, r.x+8, 1+r.y+H/2);
137+
g.setFontAlign(-1,0).drawString(itemText.text, r.x+8, 2+r.y+H/2);
134138
},
135139
select : function(idx, touch) {
136140
if (idx<0) return back&&back(); // title

libs/js/banglejs/E_showMenu_Q3.min.js

40 Bytes
Binary file not shown.

libs/js/banglejs/E_showPrompt_Q3.js

+15-14
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
if (!options.buttons)
44
options.buttons = {"Yes":true,"No":false};
55
var btns = Object.keys(options.buttons);
6+
if (btns.length>6) throw new Error(">6 buttons");
67
var btnPos;
78
function draw(highlightedButton) {
89
g.reset().setFontAlign(0,0);
@@ -13,9 +14,9 @@
1314
clearRect(0,Y,W-1,Y+4+title.h).
1415
drawString(title.text,W/2,Y+4+title.h/2);
1516
Y += title.h+4;
16-
var BX = Math.min(2,btns.length),
17+
var BX = 0|"0123233"[btns.length],
1718
BY = Math.ceil(btns.length / BX),
18-
BW = W/BX, BH = 40;
19+
BW = (W-1)/BX, BH = (BY>1 || options.img)?40:50;
1920
var H = R.y2-(Y + BY*BH);
2021
if (options.img) {
2122
var im = g.imageMetrics(options.img);
@@ -28,22 +29,21 @@
2829
drawString(msg.text,W/2,Y+H/2);
2930
btnPos = [];
3031
btns.forEach((btn,idx)=>{
31-
var x = (idx&1)*BW + 2, y = R.y2-(BY-(idx>>1))*BH - 2,
32-
bw = BW-5, poly = [x+4,y,
32+
var ix=idx%BX,iy=0|(idx/BX),x = ix*BW + 2, y = R.y2-(BY-iy)*BH + 1,
33+
bw = BW-4, bh = BH-2, poly = [x+4,y,
3334
x+bw-4,y,
3435
x+bw,y+4,
35-
x+bw,y+BH-4,
36-
x+bw-4,y+BH,
37-
x+4,y+BH,
38-
x,y+BH-4,
36+
x+bw,y+bh-4,
37+
x+bw-4,y+bh,
38+
x+4,y+bh,
39+
x,y+bh-4,
3940
x,y+4,
4041
x+4,y];
41-
btnPos.push({x1:x-2, x2:x+bw,
42-
y1:y, y2:y+BH+2,
43-
poly: poly});
42+
btnPos.push({x1:x-2, x2:x+BW-2,
43+
y1:y, y2:y+BH});
4444
var btnText = g.findFont(btn, {w:bw-4,h:BH-4,wrap:1});
4545
g.setColor(idx===highlightedButton ? g.theme.bgH : g.theme.bg2).fillPoly(poly).
46-
setColor(idx===highlightedButton ? g.theme.fgH : g.theme.fg2).drawPoly(poly).drawString(btnText.text,x+bw/2,y+BH/2);
46+
setColor(idx===highlightedButton ? g.theme.fgH : g.theme.fg2).drawPoly(poly).drawString(btnText.text,x+bw/2,y+2+BH/2);
4747
if (idx&1) y+=BH;
4848
});
4949
Bangle.setLCDPower(1); // ensure screen is on
@@ -57,8 +57,9 @@
5757
return new Promise(resolve=>{
5858
var ui = {mode:"custom", remove: options.remove, redraw: draw, back:options.back, touch:(_,e)=>{
5959
btnPos.forEach((b,i)=>{
60-
if (e.x > b.x1 && e.x < b.x2 &&
61-
e.y > b.y1 && e.y < b.y2) {
60+
if (e.x >= b.x1 && e.x <= b.x2 &&
61+
e.y >= b.y1 && e.y <= b.y2 && !e.hit) {
62+
e.hit = true; // ensure we don't call twice if the buttons overlap
6263
draw(i); // highlighted button
6364
g.flip(); // write to screen
6465
E.showPrompt(); // remove

libs/js/banglejs/E_showPrompt_Q3.min.js

+2-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)