|
5 | 5 | mode = options.mode;
|
6 | 6 | if (!mode) throw new Error("Missing mode in setUI({...})");
|
7 | 7 | }
|
8 |
| - var redraw = true; |
9 |
| - if (global.WIDGETS && WIDGETS.back) { |
10 |
| - redraw = false; |
11 |
| - WIDGETS.back.remove(mode && options.back); |
| 8 | + var hadBackWidget = false; |
| 9 | + if (global.WIDGETS && WIDGETS.back) { |
| 10 | + hadBackWidget = true; // if we had a back widget already, don't redraw at the end |
| 11 | + WIDGETS.back.remove(options.back); // only redraw when removing if we don't have options.back |
12 | 12 | }
|
13 | 13 | if (Bangle.btnWatches) {
|
14 | 14 | Bangle.btnWatches.forEach(clearWatch);
|
|
52 | 52 | };
|
53 | 53 | Bangle.on('drag',Bangle.dragHandler);
|
54 | 54 | Bangle.touchHandler = d => {b();cb();};
|
| 55 | + Bangle.on("touch", Bangle.touchHandler); |
55 | 56 | Bangle.btnWatches = [
|
56 | 57 | setWatch(function() { b();cb(); }, BTN1, {repeat:1, edge:"rising"}),
|
57 | 58 | ];
|
|
69 | 70 | };
|
70 | 71 | Bangle.on('drag',Bangle.dragHandler);
|
71 | 72 | Bangle.touchHandler = d => {b();cb();};
|
| 73 | + Bangle.on("touch", Bangle.touchHandler); |
72 | 74 | Bangle.btnWatches = [
|
73 | 75 | setWatch(function() { b();cb(); }, BTN1, {repeat:1, edge:"rising"}),
|
74 | 76 | ];
|
|
83 | 85 | if (e.x < 120) return;
|
84 | 86 | b();cb((e.y > 88) ? 1 : -1);
|
85 | 87 | };
|
| 88 | + Bangle.on("touch", Bangle.touchHandler); |
86 | 89 | Bangle.btnWatches = [
|
87 | 90 | setWatch(Bangle.showLauncher, BTN1, {repeat:1,edge:"rising"})
|
88 | 91 | ];
|
|
95 | 98 | } else
|
96 | 99 | throw new Error("Unknown UI mode "+E.toJS(mode));
|
97 | 100 | if (options.clock) Bangle.CLOCK=1;
|
98 |
| - if (options.touch) |
99 |
| - Bangle.touchHandler = options.touch; |
| 101 | + if (options.touch) { |
| 102 | + Bangle.touchHandler = options.touch; |
| 103 | + Bangle.on("touch", Bangle.touchHandler); |
| 104 | + } |
100 | 105 | if (options.drag) {
|
101 | 106 | Bangle.dragHandler = options.drag;
|
102 | 107 | Bangle.on("drag", Bangle.dragHandler);
|
|
113 | 118 | if (options.redraw) // handler for redrawing the UI
|
114 | 119 | Bangle.uiRedraw = options.redraw;
|
115 | 120 | if (options.back) {
|
116 |
| - var touchHandler = (_,e) => { |
117 |
| - if (e.y<36 && e.x<48) { |
118 |
| - e.handled = true; |
119 |
| - E.stopEventPropagation(); |
| 121 | + var btnWatch; |
| 122 | + // only add back button handler if there's no existing watch on BTN1 |
| 123 | + if (Bangle.btnWatches===undefined) |
| 124 | + btnWatch = setWatch(function() { |
| 125 | + btnWatch = undefined; |
120 | 126 | options.back();
|
121 |
| - } |
122 |
| - }; |
123 |
| - Bangle.on("touch", touchHandler); |
124 |
| - // If a touch handler was needed for setUI, add it - but ignore touches if they've already gone to the 'back' handler |
125 |
| - if (Bangle.touchHandler) { |
126 |
| - var uiTouchHandler = Bangle.touchHandler; |
127 |
| - Bangle.touchHandler = (_,e) => { |
128 |
| - if (!e.handled) uiTouchHandler(_,e); |
| 127 | + }, BTN1, {edge:"rising"}); |
| 128 | + // if we have widgets loaded *and* visible at the top, add a back widget (see #3788) |
| 129 | + if (global.WIDGETS && Bangle.appRect.y) { |
| 130 | + // add our own touch handler for touching in the top left |
| 131 | + var touchHandler = function(_,e) { |
| 132 | + if (e.y<36 && e.x<48) { |
| 133 | + e.handled = true; |
| 134 | + E.stopEventPropagation(); // stop subsequent touch handlers from being called |
| 135 | + options.back(); |
| 136 | + } |
129 | 137 | };
|
130 |
| - Bangle.on("touch", Bangle.touchHandler); |
| 138 | + Bangle.prependListener("touch", touchHandler); |
| 139 | + // add widget - 'remove' function will remove the widgets |
| 140 | + WIDGETS.back = { |
| 141 | + area:"tl", width:24, |
| 142 | + draw:e=>g.reset().setColor("#f00").drawImage(atob("GBiBAAAYAAH/gAf/4A//8B//+D///D///H/P/n+H/n8P/n4f/vwAP/wAP34f/n8P/n+H/n/P/j///D///B//+A//8Af/4AH/gAAYAA=="),e.x,e.y), |
| 143 | + remove:function(noclear){ |
| 144 | + var w = WIDGETS.back; |
| 145 | + if (w.area!="tl") noclear=true; // area="" is set by widget_utils.hide, so avoid drawing |
| 146 | + if (btnWatch) clearWatch(btnWatch); |
| 147 | + Bangle.removeListener("touch", touchHandler); |
| 148 | + if (!noclear) g.reset().clearRect({x:w.x, y:w.y, w:24,h:24}); |
| 149 | + delete WIDGETS.back; |
| 150 | + if (!noclear) Bangle.drawWidgets(); |
| 151 | + } |
| 152 | + }; |
| 153 | + if (!hadBackWidget) Bangle.drawWidgets(); |
131 | 154 | }
|
132 |
| - var btnWatch; |
133 |
| - if (Bangle.btnWatches===undefined) // only add back button handler if there's no existing watch on BTN1 |
134 |
| - btnWatch = setWatch(function() { |
135 |
| - btnWatch = undefined; |
136 |
| - options.back(); |
137 |
| - }, BTN1, {edge:"rising"}); |
138 |
| - WIDGETS = Object.assign({back:{ |
139 |
| - area:"tl", width:24, |
140 |
| - draw:e=>g.reset().setColor("#f00").drawImage(atob("GBiBAAAYAAH/gAf/4A//8B//+D///D///H/P/n+H/n8P/n4f/vwAP/wAP34f/n8P/n+H/n/P/j///D///B//+A//8Af/4AH/gAAYAA=="),e.x,e.y), |
141 |
| - remove:(noclear)=>{ |
142 |
| - var w = WIDGETS.back; |
143 |
| - if (w.area!="tl") noclear=true; // area="" is set by widget_utils.hide, so avoid drawing |
144 |
| - if (btnWatch) clearWatch(btnWatch); |
145 |
| - Bangle.removeListener("touch", touchHandler); |
146 |
| - if (!noclear) g.reset().clearRect({x:w.x, y:w.y, w:24,h:24}); |
147 |
| - delete WIDGETS.back; |
148 |
| - if (!noclear) Bangle.drawWidgets(); |
149 |
| - } |
150 |
| - }},global.WIDGETS); |
151 |
| - if (redraw) Bangle.drawWidgets(); |
152 |
| - } else { // If a touch handler was needed for setUI, add it |
153 |
| - if (Bangle.touchHandler) |
154 |
| - Bangle.on("touch", Bangle.touchHandler); |
155 | 155 | }
|
156 | 156 | })
|
0 commit comments