From 4569f526926dab426e80c551457cbe4bf28c57b3 Mon Sep 17 00:00:00 2001 From: lauzonhomeschool <85599144+lauzonhomeschool@users.noreply.github.com> Date: Wed, 7 Jun 2023 23:13:06 -0400 Subject: [PATCH 01/22] alarm settings (incl group), drag keyboard settings fix --- apps/alarm/ChangeLog | 1 + apps/alarm/README.md | 2 +- apps/alarm/app.js | 28 ++++++++++++++++++--- apps/alarm/metadata.json | 5 ++-- apps/alarm/settings.js | 47 +++++++++++++++++++++++++++++++++++ apps/dragboard/ChangeLog | 1 + apps/dragboard/metadata.json | 2 +- apps/dragboard/settings.js | 2 +- apps/draguboard/ChangeLog | 1 + apps/draguboard/lib.js | 2 +- apps/draguboard/metadata.json | 2 +- apps/draguboard/settings.js | 2 +- 12 files changed, 84 insertions(+), 11 deletions(-) create mode 100644 apps/alarm/settings.js diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index f1f8fb40e..7d4d23f57 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -45,3 +45,4 @@ 0.40: Use substring of message when it's longer than fits the designated menu entry. 0.41: Fix a menu bug affecting alarms with empty messages. 0.42: Fix date not getting saved in event edit menu when tapping Confirm +0.43: New settings: Show confirm, Show Overflow, Show Type. diff --git a/apps/alarm/README.md b/apps/alarm/README.md index 9da142dab..43f72665e 100644 --- a/apps/alarm/README.md +++ b/apps/alarm/README.md @@ -13,7 +13,7 @@ It uses the [`sched` library](https://github.com/espruino/BangleApps/blob/master - `Repeat` → Select when the alarm will fire. You can select a predefined option (_Once_, _Every Day_, _Workdays_ or _Weekends_ or you can configure the days freely) - `New Timer` → Configure a new timer (triggered based on amount of time elapsed in hours/minutes/seconds) - `New Event` → Configure a new event (triggered based on time and date) - - `Repeat` → Alarm can be be fired only once or repeated (every X number of _days_, _weeks_, _months_ or _years_) + - `Repeat` → Alarm can be fired only once or repeated (every X number of _days_, _weeks_, _months_ or _years_) - `Advanced` - `Scheduler settings` → Open the [Scheduler](https://github.com/espruino/BangleApps/tree/master/apps/sched) settings page, see its [README](https://github.com/espruino/BangleApps/blob/master/apps/sched/README.md) for details - `Enable All` → Enable _all_ disabled alarms & timers diff --git a/apps/alarm/app.js b/apps/alarm/app.js index d135f184e..2167ead36 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -1,6 +1,7 @@ Bangle.loadWidgets(); Bangle.drawWidgets(); +const settings = require('Storage').readJSON('alarm.json',1)||{}; // 0 = Sunday (default), 1 = Monday const firstDayOfWeek = (require("Storage").readJSON("setting.json", true) || {}).firstDayOfWeek || 0; const WORKDAYS = 62; @@ -51,12 +52,14 @@ function getLabel(e) { } function trimLabel(label, maxLength) { + if(settings.showOverflow) return label; return (label.length > maxLength ? label.substring(0,maxLength-3) + "..." : label.substring(0,maxLength)); } -function formatAlarmMessage(msg) { +function formatAlarmProperty(msg) { + if(settings.showOverflow) return msg; if (msg == null) { return msg; } else if (msg.length > 7) { @@ -155,7 +158,7 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex, withDate) { }, /*LANG*/"Message": { value: alarm.msg, - format: formatAlarmMessage, + format: formatAlarmProperty, onchange: () => { setTimeout(() => { keyboard.input({text:alarm.msg}).then(result => { @@ -166,6 +169,19 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex, withDate) { }, 100); } }, + /*LANG*/"Group": { + value: alarm.group, + format: formatAlarmProperty, + onchange: () => { + setTimeout(() => { + keyboard.input({text:alarm.group}).then(result => { + alarm.group = result; + prepareAlarmForSave(alarm, alarmIndex, time, date, true); + setTimeout(showEditAlarmMenu, 10, alarm, alarmIndex, withDate); + }); + }, 100); + } + }, /*LANG*/"Enabled": { value: alarm.on, onchange: v => alarm.on = v @@ -197,6 +213,10 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex, withDate) { }; if (!keyboard) delete menu[/*LANG*/"Message"]; + if (!keyboard || !settings.showGroup) delete menu[/*LANG*/"Group"]; + if (!(settings.showConfirm == null ? true : settings.showConfirm)) delete menu[/*LANG*/"Confirm"]; + if (!(settings.showAutoSnooze == null ? true : settings.showAutoSnooze)) delete menu[/*LANG*/"Auto Snooze"]; + if (!(settings.showHidden == null ? true : settings.showHidden)) delete menu[/*LANG*/"Hidden"]; if (!alarm.date) { delete menu[/*LANG*/"Day"]; delete menu[/*LANG*/"Month"]; @@ -387,7 +407,7 @@ function showEditTimerMenu(selectedTimer, timerIndex) { }, /*LANG*/"Message": { value: timer.msg, - format: formatAlarmMessage, + format: formatAlarmProperty, onchange: () => { setTimeout(() => { keyboard.input({text:timer.msg}).then(result => { @@ -420,6 +440,8 @@ function showEditTimerMenu(selectedTimer, timerIndex) { }; if (!keyboard) delete menu[/*LANG*/"Message"]; + if (!(settings.showConfirm == null ? true : settings.showConfirm)) delete menu[/*LANG*/"Confirm"]; + if (!(settings.showHidden == null ? true : settings.showHidden)) delete menu[/*LANG*/"Hidden"]; if (!isNew) { menu[/*LANG*/"Delete"] = () => { E.showPrompt(getLabel(timer) + "\n" + /*LANG*/"Are you sure?", { title: /*LANG*/"Delete Timer" }).then((confirm) => { diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index 3c676c217..bd92542db 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -2,7 +2,7 @@ "id": "alarm", "name": "Alarms & Timers", "shortName": "Alarms", - "version": "0.42", + "version": "0.43", "description": "Set alarms and timers on your Bangle", "icon": "app.png", "tags": "tool,alarm", @@ -11,7 +11,8 @@ "dependencies": { "scheduler":"type", "alarm":"widget" }, "storage": [ { "name": "alarm.app.js", "url": "app.js" }, - { "name": "alarm.img", "url": "app-icon.js", "evaluate": true } + { "name": "alarm.img", "url": "app-icon.js", "evaluate": true }, + { "name": "alarm.settings.js", "url":"settings.js" } ], "screenshots": [ { "url": "screenshot-1.png" }, diff --git a/apps/alarm/settings.js b/apps/alarm/settings.js new file mode 100644 index 000000000..ad5084f23 --- /dev/null +++ b/apps/alarm/settings.js @@ -0,0 +1,47 @@ +(function(back) { + let settings = require('Storage').readJSON('alarm.json',1)||{}; + + const save = () => require('Storage').write('alarm.json', settings); + const DATE_FORMATS = ['default', 'mmdd']; + const DATE_FORMATS_LABELS = [/*LANG*/'Default', /*LANG*/'MMDD']; + + const appMenu = { + '': {title: 'alarm'}, '< Back': back, + /*LANG*/'Menu Date Format': { + value: DATE_FORMATS.indexOf(settings.menuDateFormat || 'default'), + format: v => DATE_FORMATS_LABELS[v], + min: 0, + max: DATE_FORMATS.length - 1, + onchange : v => { + if(v > 0) { + settings.menuDateFormat=DATE_FORMATS[v]; + } else { + delete settings.menuDateFormat; + } + save(); + } + }, + /*LANG*/'Show Menu Auto Snooze': { + value : settings.showAutoSnooze == null ? true : settings.showAutoSnooze, + onchange : v => { settings.showAutoSnooze=v; save();} + }, + /*LANG*/'Show Menu Confirm': { + value : settings.showConfirm == null ? true : settings.showConfirm, + onchange : v => { settings.showConfirm=v; save();} + }, + /*LANG*/'Show Menu Hidden': { + value : settings.showHidden == null ? true : settings.showHidden, + onchange : v => { settings.showHidden=v; save();} + }, + /*LANG*/'Show Menu Group': { + value : !!settings.showGroup, + onchange : v => { settings.showGroup=v; save();} + }, + /*LANG*/'Show Text Overflow': { + value : !!settings.showOverflow, + onchange : v => { settings.showOverflow=v; save();} + }, + }; + + E.showMenu(appMenu); +}); \ No newline at end of file diff --git a/apps/dragboard/ChangeLog b/apps/dragboard/ChangeLog index d147a623b..68cd82cfa 100644 --- a/apps/dragboard/ChangeLog +++ b/apps/dragboard/ChangeLog @@ -7,3 +7,4 @@ 0.07: Settings for display colors 0.08: Catch and discard swipe events on fw2v19 and up (as well as some cutting edge 2v18 ones), allowing compatability with the Back Swipe app. +0.09: Fix colors settings, where color was stored as string instead of the expected int. diff --git a/apps/dragboard/metadata.json b/apps/dragboard/metadata.json index 5c52d9389..090c37a01 100644 --- a/apps/dragboard/metadata.json +++ b/apps/dragboard/metadata.json @@ -1,6 +1,6 @@ { "id": "dragboard", "name": "Dragboard", - "version":"0.08", + "version":"0.09", "description": "A library for text input via swiping keyboard", "icon": "app.png", "type":"textinput", diff --git a/apps/dragboard/settings.js b/apps/dragboard/settings.js index a53914869..59a13c443 100644 --- a/apps/dragboard/settings.js +++ b/apps/dragboard/settings.js @@ -21,7 +21,7 @@ value: settings[key] == color, onchange: () => { if (color >= 0) { - settings[key] = color; + settings[key] = parseInt(color); } else { delete settings[key]; } diff --git a/apps/draguboard/ChangeLog b/apps/draguboard/ChangeLog index bca1ca7c4..3f36dc4a6 100644 --- a/apps/draguboard/ChangeLog +++ b/apps/draguboard/ChangeLog @@ -1,3 +1,4 @@ 0.01: New App based on dragboard, but with a U shaped drag area 0.02: Catch and discard swipe events on fw2v19 and up (as well as some cutting edge 2v18 ones), allowing compatability with the Back Swipe app. +0.03: Fix "Uncaught Error: Unhandled promise rejection: ReferenceError: "dragHandlerDB" is not defined" diff --git a/apps/draguboard/lib.js b/apps/draguboard/lib.js index 6c63668a9..57093de3f 100644 --- a/apps/draguboard/lib.js +++ b/apps/draguboard/lib.js @@ -148,7 +148,7 @@ exports.input = function(options) { g.clearRect(Bangle.appRect); resolve(text); }, - drag: dragHandlerDB + drag: dragHandlerUB }); Bangle.prependListener&&Bangle.prependListener('swipe', catchSwipe); // Intercept swipes on fw2v19 and later. Should not break on older firmwares. diff --git a/apps/draguboard/metadata.json b/apps/draguboard/metadata.json index 620f39f71..2f395f8a8 100644 --- a/apps/draguboard/metadata.json +++ b/apps/draguboard/metadata.json @@ -1,6 +1,6 @@ { "id": "draguboard", "name": "DragUboard", - "version":"0.02", + "version":"0.03", "description": "A library for text input via swiping U-shaped keyboard.", "icon": "app.png", "type":"textinput", diff --git a/apps/draguboard/settings.js b/apps/draguboard/settings.js index c94ebee70..ff4ede637 100644 --- a/apps/draguboard/settings.js +++ b/apps/draguboard/settings.js @@ -21,7 +21,7 @@ value: settings[key] == color, onchange: () => { if (color >= 0) { - settings[key] = color; + settings[key] = parseInt(color); } else { delete settings[key]; } From bf5f56b7fc5380a873d9fe5e632551c036ef7a04 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Mon, 11 Sep 2023 00:31:43 +0200 Subject: [PATCH 02/22] Update app.js --- apps/contourclock/app.js | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/apps/contourclock/app.js b/apps/contourclock/app.js index 407203e6c..5a75e1581 100644 --- a/apps/contourclock/app.js +++ b/apps/contourclock/app.js @@ -29,14 +29,17 @@ } let showExtras = function() { //show extras for a limited time drawExtras(); - if (extrasTimeout) clearTimeout(extrasTimeout); + //if (extrasTimeout) clearTimeout(extrasTimeout); extrasTimeout = setTimeout(() => { extrasTimeout = undefined; hideExtras(); }, 5000); + extrasShown = false; }; let drawExtras = function() { //draw date, day of the week and widgets let date = new Date(); + g.reset(); + g.clearRect(0, 138, g.getWidth() - 1, 176); g.setFont("Teletext10x18Ascii").setFontAlign(0, 1); if (settings.weekday) g.drawString(require("locale").dow(date).toUpperCase(), g.getWidth() / 2, g.getHeight() - 18); if (settings.date) g.drawString(require('locale').date(date, 1), g.getWidth() / 2, g.getHeight()); @@ -45,21 +48,23 @@ }; let hideExtras = function() { if (extrasTimeout) clearTimeout(extrasTimeout); + extrasTimeout = undefined; //NEW + g.reset(); g.clearRect(0, 138, g.getWidth() - 1, 176); require("widget_utils").hide(); - extrasShown = false; + extrasShown = false; ///NEW }; let draw = function() { + if (drawTimeout) clearTimeout(drawTimeout); //NEW + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); let date = new Date(); g.reset(); if (extrasShown) drawExtras(); else hideExtras(); require('contourclock').drawClock(settings.fontIndex); - if (drawTimeout) clearTimeout(drawTimeout); - drawTimeout = setTimeout(function() { - drawTimeout = undefined; - draw(); - }, 60000 - (Date.now() % 60000)); }; if (settings.hideWhenLocked) { onLock = locked => { @@ -83,6 +88,8 @@ Bangle.removeListener('twist', showExtras); if (drawTimeout) clearTimeout(drawTimeout); if (extrasTimeout) clearTimeout(extrasTimeout); + drawTimeout = undefined; + extrasTimeout = undefined; if (settings.hideWhenLocked) require("widget_utils").show(); g.reset(); g.clear(); @@ -91,7 +98,7 @@ g.clear(); if (settings.widgets) { Bangle.loadWidgets(); - Bangle.drawWidgets(); + setTimeout(Bangle.drawWidgets,0); //NEW } draw(); } From 10b642ea44c35ed872fe0e87541e7c999a31ea2b Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Mon, 11 Sep 2023 00:34:29 +0200 Subject: [PATCH 03/22] Update ChangeLog --- apps/contourclock/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/contourclock/ChangeLog b/apps/contourclock/ChangeLog index d13b16702..2fa26b89a 100644 --- a/apps/contourclock/ChangeLog +++ b/apps/contourclock/ChangeLog @@ -10,3 +10,4 @@ 0.28: More config options for cleaner look, enabled fast loading 0.29: Fixed a bug that would leave old font files in storage. 0.30: Added options to show widgets and date on twist and tap. New fonts. +0.31: Bugfix, no more freeze. From c9ce0a967b8b0f8d2fca60fb9ef483f5fda20dd3 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Mon, 11 Sep 2023 00:34:46 +0200 Subject: [PATCH 04/22] Update metadata.json --- apps/contourclock/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/contourclock/metadata.json b/apps/contourclock/metadata.json index ca5ee114f..5c97ce933 100644 --- a/apps/contourclock/metadata.json +++ b/apps/contourclock/metadata.json @@ -1,7 +1,7 @@ { "id": "contourclock", "name": "Contour Clock", "shortName" : "Contour Clock", - "version":"0.30", + "version":"0.31", "icon": "app.png", "readme": "README.md", "description": "A Minimalist clockface with large Digits.", From 0d6ebc6612629adf6e81d9381b874a01f745ebf3 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Tue, 12 Sep 2023 12:21:10 +0200 Subject: [PATCH 05/22] Revert "alarm settings (incl group), drag keyboard settings fix" To be recommitted in app specific commits. This reverts commit 4569f526926dab426e80c551457cbe4bf28c57b3. --- apps/alarm/ChangeLog | 1 - apps/alarm/README.md | 2 +- apps/alarm/app.js | 28 +++------------------ apps/alarm/metadata.json | 5 ++-- apps/alarm/settings.js | 47 ----------------------------------- apps/dragboard/ChangeLog | 1 - apps/dragboard/metadata.json | 2 +- apps/dragboard/settings.js | 2 +- apps/draguboard/ChangeLog | 1 - apps/draguboard/lib.js | 2 +- apps/draguboard/metadata.json | 2 +- apps/draguboard/settings.js | 2 +- 12 files changed, 11 insertions(+), 84 deletions(-) delete mode 100644 apps/alarm/settings.js diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index 7d4d23f57..f1f8fb40e 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -45,4 +45,3 @@ 0.40: Use substring of message when it's longer than fits the designated menu entry. 0.41: Fix a menu bug affecting alarms with empty messages. 0.42: Fix date not getting saved in event edit menu when tapping Confirm -0.43: New settings: Show confirm, Show Overflow, Show Type. diff --git a/apps/alarm/README.md b/apps/alarm/README.md index 43f72665e..9da142dab 100644 --- a/apps/alarm/README.md +++ b/apps/alarm/README.md @@ -13,7 +13,7 @@ It uses the [`sched` library](https://github.com/espruino/BangleApps/blob/master - `Repeat` → Select when the alarm will fire. You can select a predefined option (_Once_, _Every Day_, _Workdays_ or _Weekends_ or you can configure the days freely) - `New Timer` → Configure a new timer (triggered based on amount of time elapsed in hours/minutes/seconds) - `New Event` → Configure a new event (triggered based on time and date) - - `Repeat` → Alarm can be fired only once or repeated (every X number of _days_, _weeks_, _months_ or _years_) + - `Repeat` → Alarm can be be fired only once or repeated (every X number of _days_, _weeks_, _months_ or _years_) - `Advanced` - `Scheduler settings` → Open the [Scheduler](https://github.com/espruino/BangleApps/tree/master/apps/sched) settings page, see its [README](https://github.com/espruino/BangleApps/blob/master/apps/sched/README.md) for details - `Enable All` → Enable _all_ disabled alarms & timers diff --git a/apps/alarm/app.js b/apps/alarm/app.js index 2167ead36..d135f184e 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -1,7 +1,6 @@ Bangle.loadWidgets(); Bangle.drawWidgets(); -const settings = require('Storage').readJSON('alarm.json',1)||{}; // 0 = Sunday (default), 1 = Monday const firstDayOfWeek = (require("Storage").readJSON("setting.json", true) || {}).firstDayOfWeek || 0; const WORKDAYS = 62; @@ -52,14 +51,12 @@ function getLabel(e) { } function trimLabel(label, maxLength) { - if(settings.showOverflow) return label; return (label.length > maxLength ? label.substring(0,maxLength-3) + "..." : label.substring(0,maxLength)); } -function formatAlarmProperty(msg) { - if(settings.showOverflow) return msg; +function formatAlarmMessage(msg) { if (msg == null) { return msg; } else if (msg.length > 7) { @@ -158,7 +155,7 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex, withDate) { }, /*LANG*/"Message": { value: alarm.msg, - format: formatAlarmProperty, + format: formatAlarmMessage, onchange: () => { setTimeout(() => { keyboard.input({text:alarm.msg}).then(result => { @@ -169,19 +166,6 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex, withDate) { }, 100); } }, - /*LANG*/"Group": { - value: alarm.group, - format: formatAlarmProperty, - onchange: () => { - setTimeout(() => { - keyboard.input({text:alarm.group}).then(result => { - alarm.group = result; - prepareAlarmForSave(alarm, alarmIndex, time, date, true); - setTimeout(showEditAlarmMenu, 10, alarm, alarmIndex, withDate); - }); - }, 100); - } - }, /*LANG*/"Enabled": { value: alarm.on, onchange: v => alarm.on = v @@ -213,10 +197,6 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex, withDate) { }; if (!keyboard) delete menu[/*LANG*/"Message"]; - if (!keyboard || !settings.showGroup) delete menu[/*LANG*/"Group"]; - if (!(settings.showConfirm == null ? true : settings.showConfirm)) delete menu[/*LANG*/"Confirm"]; - if (!(settings.showAutoSnooze == null ? true : settings.showAutoSnooze)) delete menu[/*LANG*/"Auto Snooze"]; - if (!(settings.showHidden == null ? true : settings.showHidden)) delete menu[/*LANG*/"Hidden"]; if (!alarm.date) { delete menu[/*LANG*/"Day"]; delete menu[/*LANG*/"Month"]; @@ -407,7 +387,7 @@ function showEditTimerMenu(selectedTimer, timerIndex) { }, /*LANG*/"Message": { value: timer.msg, - format: formatAlarmProperty, + format: formatAlarmMessage, onchange: () => { setTimeout(() => { keyboard.input({text:timer.msg}).then(result => { @@ -440,8 +420,6 @@ function showEditTimerMenu(selectedTimer, timerIndex) { }; if (!keyboard) delete menu[/*LANG*/"Message"]; - if (!(settings.showConfirm == null ? true : settings.showConfirm)) delete menu[/*LANG*/"Confirm"]; - if (!(settings.showHidden == null ? true : settings.showHidden)) delete menu[/*LANG*/"Hidden"]; if (!isNew) { menu[/*LANG*/"Delete"] = () => { E.showPrompt(getLabel(timer) + "\n" + /*LANG*/"Are you sure?", { title: /*LANG*/"Delete Timer" }).then((confirm) => { diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index bd92542db..3c676c217 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -2,7 +2,7 @@ "id": "alarm", "name": "Alarms & Timers", "shortName": "Alarms", - "version": "0.43", + "version": "0.42", "description": "Set alarms and timers on your Bangle", "icon": "app.png", "tags": "tool,alarm", @@ -11,8 +11,7 @@ "dependencies": { "scheduler":"type", "alarm":"widget" }, "storage": [ { "name": "alarm.app.js", "url": "app.js" }, - { "name": "alarm.img", "url": "app-icon.js", "evaluate": true }, - { "name": "alarm.settings.js", "url":"settings.js" } + { "name": "alarm.img", "url": "app-icon.js", "evaluate": true } ], "screenshots": [ { "url": "screenshot-1.png" }, diff --git a/apps/alarm/settings.js b/apps/alarm/settings.js deleted file mode 100644 index ad5084f23..000000000 --- a/apps/alarm/settings.js +++ /dev/null @@ -1,47 +0,0 @@ -(function(back) { - let settings = require('Storage').readJSON('alarm.json',1)||{}; - - const save = () => require('Storage').write('alarm.json', settings); - const DATE_FORMATS = ['default', 'mmdd']; - const DATE_FORMATS_LABELS = [/*LANG*/'Default', /*LANG*/'MMDD']; - - const appMenu = { - '': {title: 'alarm'}, '< Back': back, - /*LANG*/'Menu Date Format': { - value: DATE_FORMATS.indexOf(settings.menuDateFormat || 'default'), - format: v => DATE_FORMATS_LABELS[v], - min: 0, - max: DATE_FORMATS.length - 1, - onchange : v => { - if(v > 0) { - settings.menuDateFormat=DATE_FORMATS[v]; - } else { - delete settings.menuDateFormat; - } - save(); - } - }, - /*LANG*/'Show Menu Auto Snooze': { - value : settings.showAutoSnooze == null ? true : settings.showAutoSnooze, - onchange : v => { settings.showAutoSnooze=v; save();} - }, - /*LANG*/'Show Menu Confirm': { - value : settings.showConfirm == null ? true : settings.showConfirm, - onchange : v => { settings.showConfirm=v; save();} - }, - /*LANG*/'Show Menu Hidden': { - value : settings.showHidden == null ? true : settings.showHidden, - onchange : v => { settings.showHidden=v; save();} - }, - /*LANG*/'Show Menu Group': { - value : !!settings.showGroup, - onchange : v => { settings.showGroup=v; save();} - }, - /*LANG*/'Show Text Overflow': { - value : !!settings.showOverflow, - onchange : v => { settings.showOverflow=v; save();} - }, - }; - - E.showMenu(appMenu); -}); \ No newline at end of file diff --git a/apps/dragboard/ChangeLog b/apps/dragboard/ChangeLog index 68cd82cfa..d147a623b 100644 --- a/apps/dragboard/ChangeLog +++ b/apps/dragboard/ChangeLog @@ -7,4 +7,3 @@ 0.07: Settings for display colors 0.08: Catch and discard swipe events on fw2v19 and up (as well as some cutting edge 2v18 ones), allowing compatability with the Back Swipe app. -0.09: Fix colors settings, where color was stored as string instead of the expected int. diff --git a/apps/dragboard/metadata.json b/apps/dragboard/metadata.json index 090c37a01..5c52d9389 100644 --- a/apps/dragboard/metadata.json +++ b/apps/dragboard/metadata.json @@ -1,6 +1,6 @@ { "id": "dragboard", "name": "Dragboard", - "version":"0.09", + "version":"0.08", "description": "A library for text input via swiping keyboard", "icon": "app.png", "type":"textinput", diff --git a/apps/dragboard/settings.js b/apps/dragboard/settings.js index 59a13c443..a53914869 100644 --- a/apps/dragboard/settings.js +++ b/apps/dragboard/settings.js @@ -21,7 +21,7 @@ value: settings[key] == color, onchange: () => { if (color >= 0) { - settings[key] = parseInt(color); + settings[key] = color; } else { delete settings[key]; } diff --git a/apps/draguboard/ChangeLog b/apps/draguboard/ChangeLog index 3f36dc4a6..bca1ca7c4 100644 --- a/apps/draguboard/ChangeLog +++ b/apps/draguboard/ChangeLog @@ -1,4 +1,3 @@ 0.01: New App based on dragboard, but with a U shaped drag area 0.02: Catch and discard swipe events on fw2v19 and up (as well as some cutting edge 2v18 ones), allowing compatability with the Back Swipe app. -0.03: Fix "Uncaught Error: Unhandled promise rejection: ReferenceError: "dragHandlerDB" is not defined" diff --git a/apps/draguboard/lib.js b/apps/draguboard/lib.js index 57093de3f..6c63668a9 100644 --- a/apps/draguboard/lib.js +++ b/apps/draguboard/lib.js @@ -148,7 +148,7 @@ exports.input = function(options) { g.clearRect(Bangle.appRect); resolve(text); }, - drag: dragHandlerUB + drag: dragHandlerDB }); Bangle.prependListener&&Bangle.prependListener('swipe', catchSwipe); // Intercept swipes on fw2v19 and later. Should not break on older firmwares. diff --git a/apps/draguboard/metadata.json b/apps/draguboard/metadata.json index 2f395f8a8..620f39f71 100644 --- a/apps/draguboard/metadata.json +++ b/apps/draguboard/metadata.json @@ -1,6 +1,6 @@ { "id": "draguboard", "name": "DragUboard", - "version":"0.03", + "version":"0.02", "description": "A library for text input via swiping U-shaped keyboard.", "icon": "app.png", "type":"textinput", diff --git a/apps/draguboard/settings.js b/apps/draguboard/settings.js index ff4ede637..c94ebee70 100644 --- a/apps/draguboard/settings.js +++ b/apps/draguboard/settings.js @@ -21,7 +21,7 @@ value: settings[key] == color, onchange: () => { if (color >= 0) { - settings[key] = parseInt(color); + settings[key] = color; } else { delete settings[key]; } From 9e2b05afd6a8ade9b5e052ef8122a87e87eea7d5 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Tue, 12 Sep 2023 12:14:19 +0200 Subject: [PATCH 06/22] alarm settings (incl group) Courtesy of @lauzonhomeschool --- apps/alarm/ChangeLog | 1 + apps/alarm/README.md | 2 +- apps/alarm/app.js | 28 +++++++++++++++++++++--- apps/alarm/metadata.json | 5 +++-- apps/alarm/settings.js | 47 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 77 insertions(+), 6 deletions(-) create mode 100644 apps/alarm/settings.js diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index f1f8fb40e..7d4d23f57 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -45,3 +45,4 @@ 0.40: Use substring of message when it's longer than fits the designated menu entry. 0.41: Fix a menu bug affecting alarms with empty messages. 0.42: Fix date not getting saved in event edit menu when tapping Confirm +0.43: New settings: Show confirm, Show Overflow, Show Type. diff --git a/apps/alarm/README.md b/apps/alarm/README.md index 9da142dab..43f72665e 100644 --- a/apps/alarm/README.md +++ b/apps/alarm/README.md @@ -13,7 +13,7 @@ It uses the [`sched` library](https://github.com/espruino/BangleApps/blob/master - `Repeat` → Select when the alarm will fire. You can select a predefined option (_Once_, _Every Day_, _Workdays_ or _Weekends_ or you can configure the days freely) - `New Timer` → Configure a new timer (triggered based on amount of time elapsed in hours/minutes/seconds) - `New Event` → Configure a new event (triggered based on time and date) - - `Repeat` → Alarm can be be fired only once or repeated (every X number of _days_, _weeks_, _months_ or _years_) + - `Repeat` → Alarm can be fired only once or repeated (every X number of _days_, _weeks_, _months_ or _years_) - `Advanced` - `Scheduler settings` → Open the [Scheduler](https://github.com/espruino/BangleApps/tree/master/apps/sched) settings page, see its [README](https://github.com/espruino/BangleApps/blob/master/apps/sched/README.md) for details - `Enable All` → Enable _all_ disabled alarms & timers diff --git a/apps/alarm/app.js b/apps/alarm/app.js index d135f184e..2167ead36 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -1,6 +1,7 @@ Bangle.loadWidgets(); Bangle.drawWidgets(); +const settings = require('Storage').readJSON('alarm.json',1)||{}; // 0 = Sunday (default), 1 = Monday const firstDayOfWeek = (require("Storage").readJSON("setting.json", true) || {}).firstDayOfWeek || 0; const WORKDAYS = 62; @@ -51,12 +52,14 @@ function getLabel(e) { } function trimLabel(label, maxLength) { + if(settings.showOverflow) return label; return (label.length > maxLength ? label.substring(0,maxLength-3) + "..." : label.substring(0,maxLength)); } -function formatAlarmMessage(msg) { +function formatAlarmProperty(msg) { + if(settings.showOverflow) return msg; if (msg == null) { return msg; } else if (msg.length > 7) { @@ -155,7 +158,7 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex, withDate) { }, /*LANG*/"Message": { value: alarm.msg, - format: formatAlarmMessage, + format: formatAlarmProperty, onchange: () => { setTimeout(() => { keyboard.input({text:alarm.msg}).then(result => { @@ -166,6 +169,19 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex, withDate) { }, 100); } }, + /*LANG*/"Group": { + value: alarm.group, + format: formatAlarmProperty, + onchange: () => { + setTimeout(() => { + keyboard.input({text:alarm.group}).then(result => { + alarm.group = result; + prepareAlarmForSave(alarm, alarmIndex, time, date, true); + setTimeout(showEditAlarmMenu, 10, alarm, alarmIndex, withDate); + }); + }, 100); + } + }, /*LANG*/"Enabled": { value: alarm.on, onchange: v => alarm.on = v @@ -197,6 +213,10 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex, withDate) { }; if (!keyboard) delete menu[/*LANG*/"Message"]; + if (!keyboard || !settings.showGroup) delete menu[/*LANG*/"Group"]; + if (!(settings.showConfirm == null ? true : settings.showConfirm)) delete menu[/*LANG*/"Confirm"]; + if (!(settings.showAutoSnooze == null ? true : settings.showAutoSnooze)) delete menu[/*LANG*/"Auto Snooze"]; + if (!(settings.showHidden == null ? true : settings.showHidden)) delete menu[/*LANG*/"Hidden"]; if (!alarm.date) { delete menu[/*LANG*/"Day"]; delete menu[/*LANG*/"Month"]; @@ -387,7 +407,7 @@ function showEditTimerMenu(selectedTimer, timerIndex) { }, /*LANG*/"Message": { value: timer.msg, - format: formatAlarmMessage, + format: formatAlarmProperty, onchange: () => { setTimeout(() => { keyboard.input({text:timer.msg}).then(result => { @@ -420,6 +440,8 @@ function showEditTimerMenu(selectedTimer, timerIndex) { }; if (!keyboard) delete menu[/*LANG*/"Message"]; + if (!(settings.showConfirm == null ? true : settings.showConfirm)) delete menu[/*LANG*/"Confirm"]; + if (!(settings.showHidden == null ? true : settings.showHidden)) delete menu[/*LANG*/"Hidden"]; if (!isNew) { menu[/*LANG*/"Delete"] = () => { E.showPrompt(getLabel(timer) + "\n" + /*LANG*/"Are you sure?", { title: /*LANG*/"Delete Timer" }).then((confirm) => { diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index 3c676c217..bd92542db 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -2,7 +2,7 @@ "id": "alarm", "name": "Alarms & Timers", "shortName": "Alarms", - "version": "0.42", + "version": "0.43", "description": "Set alarms and timers on your Bangle", "icon": "app.png", "tags": "tool,alarm", @@ -11,7 +11,8 @@ "dependencies": { "scheduler":"type", "alarm":"widget" }, "storage": [ { "name": "alarm.app.js", "url": "app.js" }, - { "name": "alarm.img", "url": "app-icon.js", "evaluate": true } + { "name": "alarm.img", "url": "app-icon.js", "evaluate": true }, + { "name": "alarm.settings.js", "url":"settings.js" } ], "screenshots": [ { "url": "screenshot-1.png" }, diff --git a/apps/alarm/settings.js b/apps/alarm/settings.js new file mode 100644 index 000000000..ad5084f23 --- /dev/null +++ b/apps/alarm/settings.js @@ -0,0 +1,47 @@ +(function(back) { + let settings = require('Storage').readJSON('alarm.json',1)||{}; + + const save = () => require('Storage').write('alarm.json', settings); + const DATE_FORMATS = ['default', 'mmdd']; + const DATE_FORMATS_LABELS = [/*LANG*/'Default', /*LANG*/'MMDD']; + + const appMenu = { + '': {title: 'alarm'}, '< Back': back, + /*LANG*/'Menu Date Format': { + value: DATE_FORMATS.indexOf(settings.menuDateFormat || 'default'), + format: v => DATE_FORMATS_LABELS[v], + min: 0, + max: DATE_FORMATS.length - 1, + onchange : v => { + if(v > 0) { + settings.menuDateFormat=DATE_FORMATS[v]; + } else { + delete settings.menuDateFormat; + } + save(); + } + }, + /*LANG*/'Show Menu Auto Snooze': { + value : settings.showAutoSnooze == null ? true : settings.showAutoSnooze, + onchange : v => { settings.showAutoSnooze=v; save();} + }, + /*LANG*/'Show Menu Confirm': { + value : settings.showConfirm == null ? true : settings.showConfirm, + onchange : v => { settings.showConfirm=v; save();} + }, + /*LANG*/'Show Menu Hidden': { + value : settings.showHidden == null ? true : settings.showHidden, + onchange : v => { settings.showHidden=v; save();} + }, + /*LANG*/'Show Menu Group': { + value : !!settings.showGroup, + onchange : v => { settings.showGroup=v; save();} + }, + /*LANG*/'Show Text Overflow': { + value : !!settings.showOverflow, + onchange : v => { settings.showOverflow=v; save();} + }, + }; + + E.showMenu(appMenu); +}); \ No newline at end of file From b6ec2a4761f383ba3372325729a63f04182eeb5f Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Tue, 12 Sep 2023 12:17:28 +0200 Subject: [PATCH 07/22] dragboard keyboard settings fix Courtesy of @lauzonhomeschool --- apps/dragboard/ChangeLog | 1 + apps/dragboard/metadata.json | 2 +- apps/dragboard/settings.js | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/dragboard/ChangeLog b/apps/dragboard/ChangeLog index d147a623b..68cd82cfa 100644 --- a/apps/dragboard/ChangeLog +++ b/apps/dragboard/ChangeLog @@ -7,3 +7,4 @@ 0.07: Settings for display colors 0.08: Catch and discard swipe events on fw2v19 and up (as well as some cutting edge 2v18 ones), allowing compatability with the Back Swipe app. +0.09: Fix colors settings, where color was stored as string instead of the expected int. diff --git a/apps/dragboard/metadata.json b/apps/dragboard/metadata.json index 5c52d9389..090c37a01 100644 --- a/apps/dragboard/metadata.json +++ b/apps/dragboard/metadata.json @@ -1,6 +1,6 @@ { "id": "dragboard", "name": "Dragboard", - "version":"0.08", + "version":"0.09", "description": "A library for text input via swiping keyboard", "icon": "app.png", "type":"textinput", diff --git a/apps/dragboard/settings.js b/apps/dragboard/settings.js index a53914869..59a13c443 100644 --- a/apps/dragboard/settings.js +++ b/apps/dragboard/settings.js @@ -21,7 +21,7 @@ value: settings[key] == color, onchange: () => { if (color >= 0) { - settings[key] = color; + settings[key] = parseInt(color); } else { delete settings[key]; } From 0c5033a7c12996719934b8cab81bd87d7a80f28c Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Tue, 12 Sep 2023 12:18:44 +0200 Subject: [PATCH 08/22] draguboard keyboard settings fix Courtesy of @lauzonhomeschool --- apps/draguboard/ChangeLog | 1 + apps/draguboard/lib.js | 2 +- apps/draguboard/metadata.json | 2 +- apps/draguboard/settings.js | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/draguboard/ChangeLog b/apps/draguboard/ChangeLog index bca1ca7c4..3f36dc4a6 100644 --- a/apps/draguboard/ChangeLog +++ b/apps/draguboard/ChangeLog @@ -1,3 +1,4 @@ 0.01: New App based on dragboard, but with a U shaped drag area 0.02: Catch and discard swipe events on fw2v19 and up (as well as some cutting edge 2v18 ones), allowing compatability with the Back Swipe app. +0.03: Fix "Uncaught Error: Unhandled promise rejection: ReferenceError: "dragHandlerDB" is not defined" diff --git a/apps/draguboard/lib.js b/apps/draguboard/lib.js index 6c63668a9..57093de3f 100644 --- a/apps/draguboard/lib.js +++ b/apps/draguboard/lib.js @@ -148,7 +148,7 @@ exports.input = function(options) { g.clearRect(Bangle.appRect); resolve(text); }, - drag: dragHandlerDB + drag: dragHandlerUB }); Bangle.prependListener&&Bangle.prependListener('swipe', catchSwipe); // Intercept swipes on fw2v19 and later. Should not break on older firmwares. diff --git a/apps/draguboard/metadata.json b/apps/draguboard/metadata.json index 620f39f71..2f395f8a8 100644 --- a/apps/draguboard/metadata.json +++ b/apps/draguboard/metadata.json @@ -1,6 +1,6 @@ { "id": "draguboard", "name": "DragUboard", - "version":"0.02", + "version":"0.03", "description": "A library for text input via swiping U-shaped keyboard.", "icon": "app.png", "type":"textinput", diff --git a/apps/draguboard/settings.js b/apps/draguboard/settings.js index c94ebee70..ff4ede637 100644 --- a/apps/draguboard/settings.js +++ b/apps/draguboard/settings.js @@ -21,7 +21,7 @@ value: settings[key] == color, onchange: () => { if (color >= 0) { - settings[key] = color; + settings[key] = parseInt(color); } else { delete settings[key]; } From e098d0fc9eed2ca76991d3c1279b5a437c08528d Mon Sep 17 00:00:00 2001 From: Travis Evans Date: Wed, 13 Sep 2023 16:25:22 -0500 Subject: [PATCH 09/22] =?UTF-8?q?Implement=20separate=20colors=20for=20but?= =?UTF-8?q?ton=20background=20(face)=20and=20=E2=80=9Cactual=E2=80=9D=20ba?= =?UTF-8?q?ckground=20(outside=20border)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/Layout.js | 9 +++++---- modules/Layout.min.js | 16 ++++++++-------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/modules/Layout.js b/modules/Layout.js index 5afcce410..75d9adc34 100644 --- a/modules/Layout.js +++ b/modules/Layout.js @@ -186,14 +186,15 @@ Layout.prototype.render = function (l) { x+4,y+h-1, x,y+h-5, x,y+4 - ], bg = l.bgCol!==undefined?l.bgCol:gfx.theme.bg2, - btnborder = l.btnBorder!==undefined?l.btnBorder:gfx.theme.fg2; + ], bg = l.bgCol!==undefined?l.bgCol:gfx.theme.bg, + btnborder = l.btnBorder!==undefined?l.btnBorder:gfx.theme.fg2, + btnface = l.btnFace!==undefined?l.btnFace:gfx.theme.bg2; if(l.selected){ bg = gfx.theme.bgH, btnborder = gfx.theme.fgH; } - gfx.setColor(bg).fillPoly(poly).setColor(btnborder).drawPoly(poly); + gfx.setColor(btnface).fillPoly(poly).setColor(btnborder).drawPoly(poly); if (l.col!==undefined) gfx.setColor(l.col); - if (l.src) gfx.setBgColor(bg).drawImage( + if (l.src) gfx.setBgColor(btnface).drawImage( "function"==typeof l.src?l.src():l.src, l.x + l.w/2, l.y + l.h/2, diff --git a/modules/Layout.min.js b/modules/Layout.min.js index 914f02637..5dc4ee7c5 100644 --- a/modules/Layout.min.js +++ b/modules/Layout.min.js @@ -4,11 +4,11 @@ h,b,f,a){var e=null==d.bgCol?a:g.toColor(d.bgCol);if(e!=a||"txt"==d.type||"btn"= if(void 0===h&&this.buttons[b])return this.buttons[b].cb();this.buttons[b]&&(delete this.buttons[b].selected,this.render(this.buttons[b]));b=(b+f+h)%f;this.buttons[b]&&(this.buttons[b].selected=1,this.render(this.buttons[b]));this.selectedButton=b}),d=!0);!this.options.back&&!this.options.remove||d||Bangle.setUI({mode:"custom",back:this.options.back,remove:this.options.remove});if(this.b){function h(b,f){.75=b.x&&f.y>=b.y&&f.x<=b.x+b.w&&f.y<=b.y+b.h&&(2==f.type&&b.cbl?b.cbl(f):b.cb&&b.cb(f));b.c&&b.c.forEach(a=>h(a,f))}Bangle.touchHandler= (b,f)=>h(this._l,f);Bangle.on("touch",Bangle.touchHandler)}};p.prototype.render=function(d){function h(c){"ram";b.reset();void 0!==c.col&&b.setColor(c.col);void 0!==c.bgCol&&b.setBgColor(c.bgCol).clearRect(c.x,c.y,c.x+c.w-1,c.y+c.h-1);f[c.type](c)}d||(d=this._l);this.updateNeeded&&this.update();var b=g,f={"":function(){},txt:function(c){"ram";if(c.wrap){var m=b.setFont(c.font).setFontAlign(0,-1).wrapString(c.label,c.w),n=c.y+(c.h-b.getFontHeight()*m.length>>1);b.drawString(m.join("\n"),c.x+(c.w>> -1),n)}else b.setFont(c.font).setFontAlign(0,0,c.r).drawString(c.label,c.x+(c.w>>1),c.y+(c.h>>1))},btn:function(c){"ram";var m=c.x+(0|c.pad),n=c.y+(0|c.pad),q=c.w-(c.pad<<1),r=c.h-(c.pad<<1);m=[m,n+4,m+4,n,m+q-5,n,m+q-1,n+4,m+q-1,n+r-5,m+q-5,n+r-1,m+4,n+r-1,m,n+r-5,m,n+4];n=void 0!==c.bgCol?c.bgCol:b.theme.bg2;q=void 0!==c.btnBorder?c.btnBorder:b.theme.fg2;c.selected&&(n=b.theme.bgH,q=b.theme.fgH);b.setColor(n).fillPoly(m).setColor(q).drawPoly(m);void 0!==c.col&&b.setColor(c.col);c.src?b.setBgColor(n).drawImage("function"== -typeof c.src?c.src():c.src,c.x+c.w/2,c.y+c.h/2,{scale:c.scale||void 0,rotate:.5*Math.PI*(c.r||0)}):b.setFont(c.font||"6x8:2").setFontAlign(0,0,c.r).drawString(c.label,c.x+c.w/2,c.y+c.h/2)},img:function(c){"ram";b.drawImage("function"==typeof c.src?c.src():c.src,c.x+c.w/2,c.y+c.h/2,{scale:c.scale||void 0,rotate:.5*Math.PI*(c.r||0)})},custom:function(c){"ram";c.render(c)},h:function(c){"ram";c.c.forEach(h)},v:function(c){"ram";c.c.forEach(h)}};if(this.lazy){this.rects||(this.rects={});var a=this.rects.clone(), -e=[];t(d,a,e,this.rects,null);for(var l in a)delete this.rects[l];d=Object.keys(a).map(c=>a[c]).reverse();for(var k of d)b.setBgColor(k.bg).clearRect.apply(g,k);e.forEach(h)}else h(d)};p.prototype.forgetLazyState=function(){this.rects={}};p.prototype.layout=function(d){var h={h:function(b){"ram";var f=b.x+(0|b.pad),a=0,e=b.c&&b.c.reduce((k,c)=>k+(0|c.fillx),0);e||(f+=b.w-b._w>>1,e=1);var l=f;b.c.forEach(k=>{k.x=0|l;f+=k._w;a+=0|k.fillx;l=f+Math.floor(a*(b.w-b._w)/e);k.w=0|l-k.x;k.h=0|(k.filly?b.h- -(b.pad<<1):k._h);k.y=0|b.y+(0|b.pad)+((1+(0|k.valign))*(b.h-(b.pad<<1)-k.h)>>1);if(k.c)h[k.type](k)})},v:function(b){"ram";var f=b.y+(0|b.pad),a=0,e=b.c&&b.c.reduce((k,c)=>k+(0|c.filly),0);e||(f+=b.h-b._h>>1,e=1);var l=f;b.c.forEach(k=>{k.y=0|l;f+=k._h;a+=0|k.filly;l=f+Math.floor(a*(b.h-b._h)/e);k.h=0|l-k.y;k.w=0|(k.fillx?b.w-(b.pad<<1):k._w);k.x=0|b.x+(0|b.pad)+((1+(0|k.halign))*(b.w-(b.pad<<1)-k.w)>>1);if(k.c)h[k.type](k)})}};if(h[d.type])h[d.type](d)};p.prototype.debug=function(d,h){d||(d=this._l); -h=h||1;g.setColor(h&1,h&2,h&4).drawRect(d.x+h-1,d.y+h-1,d.x+d.w-h,d.y+d.h-h);d.pad&&g.drawRect(d.x+d.pad-1,d.y+d.pad-1,d.x+d.w-d.pad,d.y+d.h-d.pad);h++;d.c&&d.c.forEach(b=>this.debug(b,h))};p.prototype.update=function(){function d(a){"ram";b[a.type](a);if(a.r&1){var e=a._w;a._w=a._h;a._h=e}a._w=Math.max(a._w+(a.pad<<1),0|a.width);a._h=Math.max(a._h+(a.pad<<1),0|a.height)}delete this.updateNeeded;var h=g,b={txt:function(a){"ram";a.font.endsWith("%")&&(a.font="Vector"+Math.round(h.getHeight()*a.font.slice(0, --1)/100));if(a.wrap)a._h=a._w=0;else{var e=g.setFont(a.font).stringMetrics(a.label);a._w=e.width;a._h=e.height}},btn:function(a){"ram";a.font&&a.font.endsWith("%")&&(a.font="Vector"+Math.round(h.getHeight()*a.font.slice(0,-1)/100));var e=a.src?h.imageMetrics("function"==typeof a.src?a.src():a.src):h.setFont(a.font||"6x8:2").stringMetrics(a.label);a._h=16+e.height;a._w=20+e.width},img:function(a){"ram";var e=h.imageMetrics("function"==typeof a.src?a.src():a.src),l=a.scale||1;a._w=e.width*l;a._h=e.height* -l},"":function(a){"ram";a._w=0;a._h=0},custom:function(a){"ram";a._w=0;a._h=0},h:function(a){"ram";a.c.forEach(d);a._h=a.c.reduce((e,l)=>Math.max(e,l._h),0);a._w=a.c.reduce((e,l)=>e+l._w,0);null==a.fillx&&a.c.some(e=>e.fillx)&&(a.fillx=1);null==a.filly&&a.c.some(e=>e.filly)&&(a.filly=1)},v:function(a){"ram";a.c.forEach(d);a._h=a.c.reduce((e,l)=>e+l._h,0);a._w=a.c.reduce((e,l)=>Math.max(e,l._w),0);null==a.fillx&&a.c.some(e=>e.fillx)&&(a.fillx=1);null==a.filly&&a.c.some(e=>e.filly)&&(a.filly=1)}},f= -this._l;d(f);delete b;f.fillx||f.filly?(f.w=Bangle.appRect.w,f.h=Bangle.appRect.h,f.x=Bangle.appRect.x,f.y=Bangle.appRect.y):(f.w=f._w,f.h=f._h,f.x=Bangle.appRect.w-f.w>>1,f.y=Bangle.appRect.y+(Bangle.appRect.h-f.h>>1));this.layout(f)};p.prototype.clear=function(d){d||(d=this._l);g.reset();void 0!==d.bgCol&&g.setBgColor(d.bgCol);g.clearRect(d.x,d.y,d.x+d.w-1,d.y+d.h-1)};exports=p \ No newline at end of file +1),n)}else b.setFont(c.font).setFontAlign(0,0,c.r).drawString(c.label,c.x+(c.w>>1),c.y+(c.h>>1))},btn:function(c){"ram";var m=c.x+(0|c.pad),n=c.y+(0|c.pad),q=c.w-(c.pad<<1),r=c.h-(c.pad<<1);m=[m,n+4,m+4,n,m+q-5,n,m+q-1,n+4,m+q-1,n+r-5,m+q-5,n+r-1,m+4,n+r-1,m,n+r-5,m,n+4];n=void 0!==c.bgCol?c.bgCol:b.theme.bg;q=void 0!==c.btnBorder?c.btnBorder:b.theme.fg2;r=void 0!==c.btnFace?c.btnFace:b.theme.bg2;c.selected&&(n=b.theme.bgH,q=b.theme.fgH);b.setColor(r).fillPoly(m).setColor(q).drawPoly(m);void 0!== +c.col&&b.setColor(c.col);c.src?b.setBgColor(n).drawImage("function"==typeof c.src?c.src():c.src,c.x+c.w/2,c.y+c.h/2,{scale:c.scale||void 0,rotate:.5*Math.PI*(c.r||0)}):b.setFont(c.font||"6x8:2").setFontAlign(0,0,c.r).drawString(c.label,c.x+c.w/2,c.y+c.h/2)},img:function(c){"ram";b.drawImage("function"==typeof c.src?c.src():c.src,c.x+c.w/2,c.y+c.h/2,{scale:c.scale||void 0,rotate:.5*Math.PI*(c.r||0)})},custom:function(c){"ram";c.render(c)},h:function(c){"ram";c.c.forEach(h)},v:function(c){"ram";c.c.forEach(h)}}; +if(this.lazy){this.rects||(this.rects={});var a=this.rects.clone(),e=[];t(d,a,e,this.rects,null);for(var l in a)delete this.rects[l];d=Object.keys(a).map(c=>a[c]).reverse();for(var k of d)b.setBgColor(k.bg).clearRect.apply(g,k);e.forEach(h)}else h(d)};p.prototype.forgetLazyState=function(){this.rects={}};p.prototype.layout=function(d){var h={h:function(b){"ram";var f=b.x+(0|b.pad),a=0,e=b.c&&b.c.reduce((k,c)=>k+(0|c.fillx),0);e||(f+=b.w-b._w>>1,e=1);var l=f;b.c.forEach(k=>{k.x=0|l;f+=k._w;a+=0|k.fillx; +l=f+Math.floor(a*(b.w-b._w)/e);k.w=0|l-k.x;k.h=0|(k.filly?b.h-(b.pad<<1):k._h);k.y=0|b.y+(0|b.pad)+((1+(0|k.valign))*(b.h-(b.pad<<1)-k.h)>>1);if(k.c)h[k.type](k)})},v:function(b){"ram";var f=b.y+(0|b.pad),a=0,e=b.c&&b.c.reduce((k,c)=>k+(0|c.filly),0);e||(f+=b.h-b._h>>1,e=1);var l=f;b.c.forEach(k=>{k.y=0|l;f+=k._h;a+=0|k.filly;l=f+Math.floor(a*(b.h-b._h)/e);k.h=0|l-k.y;k.w=0|(k.fillx?b.w-(b.pad<<1):k._w);k.x=0|b.x+(0|b.pad)+((1+(0|k.halign))*(b.w-(b.pad<<1)-k.w)>>1);if(k.c)h[k.type](k)})}};if(h[d.type])h[d.type](d)}; +p.prototype.debug=function(d,h){d||(d=this._l);h=h||1;g.setColor(h&1,h&2,h&4).drawRect(d.x+h-1,d.y+h-1,d.x+d.w-h,d.y+d.h-h);d.pad&&g.drawRect(d.x+d.pad-1,d.y+d.pad-1,d.x+d.w-d.pad,d.y+d.h-d.pad);h++;d.c&&d.c.forEach(b=>this.debug(b,h))};p.prototype.update=function(){function d(a){"ram";b[a.type](a);if(a.r&1){var e=a._w;a._w=a._h;a._h=e}a._w=Math.max(a._w+(a.pad<<1),0|a.width);a._h=Math.max(a._h+(a.pad<<1),0|a.height)}delete this.updateNeeded;var h=g,b={txt:function(a){"ram";a.font.endsWith("%")&& +(a.font="Vector"+Math.round(h.getHeight()*a.font.slice(0,-1)/100));if(a.wrap)a._h=a._w=0;else{var e=g.setFont(a.font).stringMetrics(a.label);a._w=e.width;a._h=e.height}},btn:function(a){"ram";a.font&&a.font.endsWith("%")&&(a.font="Vector"+Math.round(h.getHeight()*a.font.slice(0,-1)/100));var e=a.src?h.imageMetrics("function"==typeof a.src?a.src():a.src):h.setFont(a.font||"6x8:2").stringMetrics(a.label);a._h=16+e.height;a._w=20+e.width},img:function(a){"ram";var e=h.imageMetrics("function"==typeof a.src? +a.src():a.src),l=a.scale||1;a._w=e.width*l;a._h=e.height*l},"":function(a){"ram";a._w=0;a._h=0},custom:function(a){"ram";a._w=0;a._h=0},h:function(a){"ram";a.c.forEach(d);a._h=a.c.reduce((e,l)=>Math.max(e,l._h),0);a._w=a.c.reduce((e,l)=>e+l._w,0);null==a.fillx&&a.c.some(e=>e.fillx)&&(a.fillx=1);null==a.filly&&a.c.some(e=>e.filly)&&(a.filly=1)},v:function(a){"ram";a.c.forEach(d);a._h=a.c.reduce((e,l)=>e+l._h,0);a._w=a.c.reduce((e,l)=>Math.max(e,l._w),0);null==a.fillx&&a.c.some(e=>e.fillx)&&(a.fillx= +1);null==a.filly&&a.c.some(e=>e.filly)&&(a.filly=1)}},f=this._l;d(f);delete b;f.fillx||f.filly?(f.w=Bangle.appRect.w,f.h=Bangle.appRect.h,f.x=Bangle.appRect.x,f.y=Bangle.appRect.y):(f.w=f._w,f.h=f._h,f.x=Bangle.appRect.w-f.w>>1,f.y=Bangle.appRect.y+(Bangle.appRect.h-f.h>>1));this.layout(f)};p.prototype.clear=function(d){d||(d=this._l);g.reset();void 0!==d.bgCol&&g.setBgColor(d.bgCol);g.clearRect(d.x,d.y,d.x+d.w-1,d.y+d.h-1)};exports=p \ No newline at end of file From 6b2bcc61baf52417d0f4102cb4f42b026e9392a8 Mon Sep 17 00:00:00 2001 From: Travis Evans Date: Wed, 13 Sep 2023 16:56:12 -0500 Subject: [PATCH 10/22] Update documentation --- modules/Layout.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/Layout.md b/modules/Layout.md index 96790a41a..e95ab4f2c 100644 --- a/modules/Layout.md +++ b/modules/Layout.md @@ -45,9 +45,10 @@ layout.render(); - A `scale` field, eg `2` to set scale of an image - A `r` field to set rotation of text or images (0: 0°, 1: 90°, 2: 180°, 3: 270°). - A `wrap` field to enable line wrapping. Requires some combination of `width`/`height` and `fillx`/`filly` to be set. Not compatible with text rotation. -- A `col` field, eg `#f00` for red -- A `bgCol` field for background color (will automatically fill on render). When `type:"btn"`, this sets the background color of the button, and will not change color on press -- A `btnBorder` field for button border color (will default to theme if not set) +- A `col` field, eg `#f00` for red. When `type:"btn"`, this sets the color of the button's text label (defaults to `Graphics.theme.fg2` if not set) +- A `bgCol` field for background color (will automatically fill on render). When `type:"btn"`, this sets the color of the space outside the button border (defaults to parent layoutObject's `bgCol` if not set) +- A `btnBorder` field for button border color (defaults to `Graphics.theme.fg2` if not set) +- A `btnFace` field for the background color of the area inside the button border (defaults to `Graphics.theme.bg2` if not set) - A `halign` field to set horizontal alignment WITHIN a `v` container. `-1`=left, `1`=right, `0`=center - A `valign` field to set vertical alignment WITHIN a `h` container. `-1`=top, `1`=bottom, `0`=center - A `pad` integer field to set pixels padding From e0b262249b1e90c721583efa82d5cd731193c5e9 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Thu, 14 Sep 2023 14:04:15 +0200 Subject: [PATCH 11/22] Update app.js --- apps/contourclock/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/contourclock/app.js b/apps/contourclock/app.js index 5a75e1581..1a510f014 100644 --- a/apps/contourclock/app.js +++ b/apps/contourclock/app.js @@ -29,7 +29,7 @@ } let showExtras = function() { //show extras for a limited time drawExtras(); - //if (extrasTimeout) clearTimeout(extrasTimeout); + if (extrasTimeout) clearTimeout(extrasTimeout); extrasTimeout = setTimeout(() => { extrasTimeout = undefined; hideExtras(); From 86cb19a64ea6ec54b3f0abe72ad932cc291441e0 Mon Sep 17 00:00:00 2001 From: Hugh Barney Date: Thu, 14 Sep 2023 17:53:35 +0100 Subject: [PATCH 12/22] updated image to a fuller red heart so easier to see --- apps/widhrt/icons8-heart-20.png | Bin 0 -> 5452 bytes apps/widhrt/widget.js | 9 ++++++--- apps/widhrt/widget.png | Bin 848 -> 1319 bytes 3 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 apps/widhrt/icons8-heart-20.png diff --git a/apps/widhrt/icons8-heart-20.png b/apps/widhrt/icons8-heart-20.png new file mode 100644 index 0000000000000000000000000000000000000000..d0e801502331718bd0f3c620e3e06d514a21fb08 GIT binary patch literal 5452 zcmeHKd010d77rjIQIu9_ZHH_$vM-acFA0KBgDe%7mzNiaBzYluA;G1eSU^Rp zFt%Dz5o!^umb%+T5vVAwV4-3y6%lb{Y%91|T&i&p= zU^L9CQBx?^pL*BoR&~(E6g)B&PMmyz#XmlIk?e5j>hrJOXx-F4TeG8YbIf=TTEU@_ z!DBfUkM4=;$ECdw6>RJAtJ-&=P^4yD?$1ucPVZ}&IceN=uPxCFKX;kn6B=-QOO@#% zRyC_DgSy~eRO7FrUBP4jdCKAbnwFnsJ%tlCWm7LHWc?F9PfA&()A@aM_*{MG>faVU z8s*dn2kfp~yiyVz9e%5{-nVJCjNcZxC@`c43Z;r)tJ;L2sR?-myIAVu$7sXm%l zyw#*Qlaw@Wyd^K~hfLQ7L%_WQF;Ul-T=}&8)PXO1eLrBcc8w`)+tyNE^HYrHw4#po z7IyMl%)~mGhK=s>NUx|Hsf_c21FlhbF8VBg?fF9;GmS!h-uhVgE$gXB()qW7JYPq* zN?Lm?J9jb4sx9_go)4S|wHPQ1!lXq&l^LWqR z>#4>26_m+K@dl+VWZtwlV^;7{KK*EGT~$b9D*b9m$o7t1F{|jVhK*JDA#`8Qo*T%q z_0I18@-Z3LgHMcN=3B)?H~77>CY|f!)T`qiiE_+$k)*mFKvywP(WcjDw^>U{$M+qg%Q~D6 zx?c>=y0|j!!^<`Af{&odcgoJXwEgs8|0f&rA~W78;B4E_b@S`IzWl>YllC(YUcl#C zT@UBY31e2QYngU=%B@GE+#cjK_OE&PH=XZCr|)(&|3;xWYn{Kmy4 zQrXubUJY{u5NY1_IFqA ztsYywl-BRi{Y&@9m+4a;GX3@~zuoouq^o_>zD|d*!%f^BnT{>Q+1M%FN}sR%N6u+o z=|0juJVL#eHB~Mryyo7ycKtTv+r8q=_f2_i8yhH_Ws(zPPWg1w$~yPCoxFb(NqT=~ zx2Zd84MX;z(cExRaMF35bJ=VBQ=jB?!@E;5(8~8xTicdbE%)BORZ&xXJ>}A&hSY%M z)SG1w^6NI%>}fKWddud$G_9Bx7V0_WeZ)Iv$MnK{kKW^d?_W0iNCYE4Z3=7*EO&I< z^Q+6Fch8@D`|dX%uJb5zI>%gflSLhoog3AhRkQkysw~I;&A9=GFMZaQyFUK=Ob9ZL zxP?2tdIpMXcVbwUR7?%$W63v8dECh9`n{;eZ}gZ>$Hkd*@aDxEgD9F`{BxYVyc|*I zZ|7XS)>rmh=R@hKD_321E;81rLhkfZDC1UYKrc#(ixs1|j)ACfCC0Go44_w0D3V~S z0YNh{f~LgMHF_!i>Q_hTG>uA1Pv*tJafWa#LnB*Y#1sprC!z~7QIU!s97L5^#ehJE z5eUty)9OuPtCViz6@%a8G?PxVL5NH#JtZ!I7LFS+8kfOkz)+-Blg*|FQE3vRN-drd z5j98wMpAkPK^VkLrp01mSU3#an9gL0L?R~4X0q83KtQG(J%Lyuy~&%T7~qJ&OsG*~ zAT+q1Msgxb+)PO6bg)hvBnPW#q!mmKIv~e3dJ~~y%E5pO_5%P+HVg|Pm<_Q-OnZB< z8W%TYtv3y-2=ruH5d)LOfSEeoFbfkAnf=7yQ!Px1;7VZ5z)ZN=h+>i1n4a*qcWTg@ zP4+&`CXAf2#jRDTnII^eXM3Ayd0fJf4Jl)~MrW{DkZ60P3LU~3%toyZqe7XO7Sn-1 zOn{j+3{Pm(PY!6RQj+#lQ@(3xNj909}QH@G$`^m@H zEErL8ARe2ogt$VX5E8+B76dE#m;m8%VXlg2M_r@I#1H~ECgQkON+%DmQW*M!Ht>m#(3p?3?-h;^EB`f(+tq-OoTB<{wJII51eEm zU1h))H|E&+S72EKqk)E`)!3w>(QHjXjGzPZn~-cwWjg|(P{f#}mQ&}|1x?eVny2K7hO?V+HDN)FSZF%P0dUTsv~1^0 z^R;E4-*B`g0|Pk{0JFp}OdmL2nuJL<)W_SCkS!-JPHZoLgltJ-IhlD1v%#R%V8-FX zJWiDVg0r(9Ov*nqw}%Z_hvSAEP_!9DyhZ;^_fG*1FvMz5OmD)U6}mlSKo+}u2gE!u z2ktX)Ju-*x$HBB9E9WnK4W`>)=mAi_aPnOGzL4vMT+gMzbAexE*9*CxOM&MCzsRot zn_ScMw2@hZlTPdn9^Ri6xie?)TuO7N@@R)SXKvH0DjL4Z9&NIr00blJ%*ac3=8rB$vxS-+X^}|NAEg zkRU;V1PKzv2-Y;@VRhrX!@gi>#2dUmQd$4|h%az?*cbd3YZ_n0npMWA8S`Jsz?zp| zAE{iqf5aEO`cFo%d&CzwhSiO4V{Jnr#G40I4Mkz^isOn;ZdJ3gf zGfGSWO4F-`B!6F!kN5&j=v!*|U-7C&Q^Xh8CRMH!!qcm`2$PSJA>+S{h&cztQ{AHE z_4AS^aP&dVOVi>~Ui1alh#o&LWETyGRVoYvJXx&{MY~%NJ^s7Ax8D74hEP>sDR}$? zVxdb6Ym%Ryp-Mu*>KGP0eqQtjSC6YaH)qBB-0Vf1pns!K1c+I|l!ZeT%eg_Xzk0|U zn9o%#=LDl=bQyXBa;`-j=U)Ean9ARqvn;^Qs^bNX4h1=Ilya#wvhF1;TfStFGh~b@ zL(u4ub=C3r+)G!CsyypincnYO%np(!w;) zw=6~BYbEpFiaJ1daqYUBnFWzQ08mNZVC>=U;(vM32e>q?dTo!z!T$z;O0p+=`p~6m zb5}(j;DTfB!izahwhsW6=kZ;d(zZvrYq5L__N!v{R zYJZXjuK`S|SJYZOX`98hX1g$Y^2b#gJP9x^+f-`YO%YnrsQ zAC$;uFlT+DF|{?R)42Ua5*`NlTlrePw?%Dg-2#~mD4h>frZ+xJGV;3!?L*nkNk-u# zm1zw;PizEZ*+#<9w}~*^+5}_?Jddmg(0vS$JlQ=GBuD_tqS-#nF1MJUE*lGXw{LcAy@p!h1sXKqv6QxVKkmT{8OK14n^X zN}~#B06KsnJtI&4oQ7h;BA@1s_jaL@N>&1U{nOuXMd46DH@pdGh!1kAp)v%=gXRE zX8lZ4d;t}j(DEe6;Ahd^n5-8kWNGrr>|l1z%>Wy6 zV9J(t%7gEx(I%(}Z~ym$9-^;{d{GQM5 Date: Thu, 14 Sep 2023 17:55:47 +0100 Subject: [PATCH 13/22] updated image to a fuller red heart so easier to see --- apps/widhrt/ChangeLog | 6 ++++-- apps/widhrt/metadata.json | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/widhrt/ChangeLog b/apps/widhrt/ChangeLog index 39520ad6a..57e4c6b9c 100644 --- a/apps/widhrt/ChangeLog +++ b/apps/widhrt/ChangeLog @@ -1,5 +1,7 @@ 0.01: First version 0.02: Don't break if running on 2v08 firmware (just don't display anything) 0.03: Works with light theme - Doesn't drain battery by updating every 2 secs - fix alignment +0.04: Doesn't drain battery by updating every 2 secs +0.05: fix alignment +0.06: changed to solid red heart image when HRM is on + diff --git a/apps/widhrt/metadata.json b/apps/widhrt/metadata.json index a8f030157..21934f280 100644 --- a/apps/widhrt/metadata.json +++ b/apps/widhrt/metadata.json @@ -1,7 +1,7 @@ { "id": "widhrt", "name": "HRM Widget", - "version": "0.03", + "version": "0.06", "description": "Tiny widget to show the power on/off status of the Heart Rate Monitor", "icon": "widget.png", "type": "widget", From 45f07db37050897861b94846343469c2e94f2da4 Mon Sep 17 00:00:00 2001 From: Travis Evans Date: Thu, 14 Sep 2023 15:39:50 -0500 Subject: [PATCH 14/22] Fix selected button color on Bangle.js 1 --- modules/Layout.js | 2 +- modules/Layout.min.js | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/modules/Layout.js b/modules/Layout.js index 75d9adc34..35a343090 100644 --- a/modules/Layout.js +++ b/modules/Layout.js @@ -190,7 +190,7 @@ Layout.prototype.render = function (l) { btnborder = l.btnBorder!==undefined?l.btnBorder:gfx.theme.fg2, btnface = l.btnFace!==undefined?l.btnFace:gfx.theme.bg2; if(l.selected){ - bg = gfx.theme.bgH, btnborder = gfx.theme.fgH; + btnface = gfx.theme.bgH, btnborder = gfx.theme.fgH; } gfx.setColor(btnface).fillPoly(poly).setColor(btnborder).drawPoly(poly); if (l.col!==undefined) gfx.setColor(l.col); diff --git a/modules/Layout.min.js b/modules/Layout.min.js index 5dc4ee7c5..44b14ec35 100644 --- a/modules/Layout.min.js +++ b/modules/Layout.min.js @@ -4,11 +4,11 @@ h,b,f,a){var e=null==d.bgCol?a:g.toColor(d.bgCol);if(e!=a||"txt"==d.type||"btn"= if(void 0===h&&this.buttons[b])return this.buttons[b].cb();this.buttons[b]&&(delete this.buttons[b].selected,this.render(this.buttons[b]));b=(b+f+h)%f;this.buttons[b]&&(this.buttons[b].selected=1,this.render(this.buttons[b]));this.selectedButton=b}),d=!0);!this.options.back&&!this.options.remove||d||Bangle.setUI({mode:"custom",back:this.options.back,remove:this.options.remove});if(this.b){function h(b,f){.75=b.x&&f.y>=b.y&&f.x<=b.x+b.w&&f.y<=b.y+b.h&&(2==f.type&&b.cbl?b.cbl(f):b.cb&&b.cb(f));b.c&&b.c.forEach(a=>h(a,f))}Bangle.touchHandler= (b,f)=>h(this._l,f);Bangle.on("touch",Bangle.touchHandler)}};p.prototype.render=function(d){function h(c){"ram";b.reset();void 0!==c.col&&b.setColor(c.col);void 0!==c.bgCol&&b.setBgColor(c.bgCol).clearRect(c.x,c.y,c.x+c.w-1,c.y+c.h-1);f[c.type](c)}d||(d=this._l);this.updateNeeded&&this.update();var b=g,f={"":function(){},txt:function(c){"ram";if(c.wrap){var m=b.setFont(c.font).setFontAlign(0,-1).wrapString(c.label,c.w),n=c.y+(c.h-b.getFontHeight()*m.length>>1);b.drawString(m.join("\n"),c.x+(c.w>> -1),n)}else b.setFont(c.font).setFontAlign(0,0,c.r).drawString(c.label,c.x+(c.w>>1),c.y+(c.h>>1))},btn:function(c){"ram";var m=c.x+(0|c.pad),n=c.y+(0|c.pad),q=c.w-(c.pad<<1),r=c.h-(c.pad<<1);m=[m,n+4,m+4,n,m+q-5,n,m+q-1,n+4,m+q-1,n+r-5,m+q-5,n+r-1,m+4,n+r-1,m,n+r-5,m,n+4];n=void 0!==c.bgCol?c.bgCol:b.theme.bg;q=void 0!==c.btnBorder?c.btnBorder:b.theme.fg2;r=void 0!==c.btnFace?c.btnFace:b.theme.bg2;c.selected&&(n=b.theme.bgH,q=b.theme.fgH);b.setColor(r).fillPoly(m).setColor(q).drawPoly(m);void 0!== -c.col&&b.setColor(c.col);c.src?b.setBgColor(n).drawImage("function"==typeof c.src?c.src():c.src,c.x+c.w/2,c.y+c.h/2,{scale:c.scale||void 0,rotate:.5*Math.PI*(c.r||0)}):b.setFont(c.font||"6x8:2").setFontAlign(0,0,c.r).drawString(c.label,c.x+c.w/2,c.y+c.h/2)},img:function(c){"ram";b.drawImage("function"==typeof c.src?c.src():c.src,c.x+c.w/2,c.y+c.h/2,{scale:c.scale||void 0,rotate:.5*Math.PI*(c.r||0)})},custom:function(c){"ram";c.render(c)},h:function(c){"ram";c.c.forEach(h)},v:function(c){"ram";c.c.forEach(h)}}; -if(this.lazy){this.rects||(this.rects={});var a=this.rects.clone(),e=[];t(d,a,e,this.rects,null);for(var l in a)delete this.rects[l];d=Object.keys(a).map(c=>a[c]).reverse();for(var k of d)b.setBgColor(k.bg).clearRect.apply(g,k);e.forEach(h)}else h(d)};p.prototype.forgetLazyState=function(){this.rects={}};p.prototype.layout=function(d){var h={h:function(b){"ram";var f=b.x+(0|b.pad),a=0,e=b.c&&b.c.reduce((k,c)=>k+(0|c.fillx),0);e||(f+=b.w-b._w>>1,e=1);var l=f;b.c.forEach(k=>{k.x=0|l;f+=k._w;a+=0|k.fillx; -l=f+Math.floor(a*(b.w-b._w)/e);k.w=0|l-k.x;k.h=0|(k.filly?b.h-(b.pad<<1):k._h);k.y=0|b.y+(0|b.pad)+((1+(0|k.valign))*(b.h-(b.pad<<1)-k.h)>>1);if(k.c)h[k.type](k)})},v:function(b){"ram";var f=b.y+(0|b.pad),a=0,e=b.c&&b.c.reduce((k,c)=>k+(0|c.filly),0);e||(f+=b.h-b._h>>1,e=1);var l=f;b.c.forEach(k=>{k.y=0|l;f+=k._h;a+=0|k.filly;l=f+Math.floor(a*(b.h-b._h)/e);k.h=0|l-k.y;k.w=0|(k.fillx?b.w-(b.pad<<1):k._w);k.x=0|b.x+(0|b.pad)+((1+(0|k.halign))*(b.w-(b.pad<<1)-k.w)>>1);if(k.c)h[k.type](k)})}};if(h[d.type])h[d.type](d)}; -p.prototype.debug=function(d,h){d||(d=this._l);h=h||1;g.setColor(h&1,h&2,h&4).drawRect(d.x+h-1,d.y+h-1,d.x+d.w-h,d.y+d.h-h);d.pad&&g.drawRect(d.x+d.pad-1,d.y+d.pad-1,d.x+d.w-d.pad,d.y+d.h-d.pad);h++;d.c&&d.c.forEach(b=>this.debug(b,h))};p.prototype.update=function(){function d(a){"ram";b[a.type](a);if(a.r&1){var e=a._w;a._w=a._h;a._h=e}a._w=Math.max(a._w+(a.pad<<1),0|a.width);a._h=Math.max(a._h+(a.pad<<1),0|a.height)}delete this.updateNeeded;var h=g,b={txt:function(a){"ram";a.font.endsWith("%")&& -(a.font="Vector"+Math.round(h.getHeight()*a.font.slice(0,-1)/100));if(a.wrap)a._h=a._w=0;else{var e=g.setFont(a.font).stringMetrics(a.label);a._w=e.width;a._h=e.height}},btn:function(a){"ram";a.font&&a.font.endsWith("%")&&(a.font="Vector"+Math.round(h.getHeight()*a.font.slice(0,-1)/100));var e=a.src?h.imageMetrics("function"==typeof a.src?a.src():a.src):h.setFont(a.font||"6x8:2").stringMetrics(a.label);a._h=16+e.height;a._w=20+e.width},img:function(a){"ram";var e=h.imageMetrics("function"==typeof a.src? -a.src():a.src),l=a.scale||1;a._w=e.width*l;a._h=e.height*l},"":function(a){"ram";a._w=0;a._h=0},custom:function(a){"ram";a._w=0;a._h=0},h:function(a){"ram";a.c.forEach(d);a._h=a.c.reduce((e,l)=>Math.max(e,l._h),0);a._w=a.c.reduce((e,l)=>e+l._w,0);null==a.fillx&&a.c.some(e=>e.fillx)&&(a.fillx=1);null==a.filly&&a.c.some(e=>e.filly)&&(a.filly=1)},v:function(a){"ram";a.c.forEach(d);a._h=a.c.reduce((e,l)=>e+l._h,0);a._w=a.c.reduce((e,l)=>Math.max(e,l._w),0);null==a.fillx&&a.c.some(e=>e.fillx)&&(a.fillx= -1);null==a.filly&&a.c.some(e=>e.filly)&&(a.filly=1)}},f=this._l;d(f);delete b;f.fillx||f.filly?(f.w=Bangle.appRect.w,f.h=Bangle.appRect.h,f.x=Bangle.appRect.x,f.y=Bangle.appRect.y):(f.w=f._w,f.h=f._h,f.x=Bangle.appRect.w-f.w>>1,f.y=Bangle.appRect.y+(Bangle.appRect.h-f.h>>1));this.layout(f)};p.prototype.clear=function(d){d||(d=this._l);g.reset();void 0!==d.bgCol&&g.setBgColor(d.bgCol);g.clearRect(d.x,d.y,d.x+d.w-1,d.y+d.h-1)};exports=p \ No newline at end of file +1),n)}else b.setFont(c.font).setFontAlign(0,0,c.r).drawString(c.label,c.x+(c.w>>1),c.y+(c.h>>1))},btn:function(c){"ram";var m=c.x+(0|c.pad),n=c.y+(0|c.pad),q=c.w-(c.pad<<1),r=c.h-(c.pad<<1);m=[m,n+4,m+4,n,m+q-5,n,m+q-1,n+4,m+q-1,n+r-5,m+q-5,n+r-1,m+4,n+r-1,m,n+r-5,m,n+4];n=void 0!==c.btnBorder?c.btnBorder:b.theme.fg2;q=void 0!==c.btnFace?c.btnFace:b.theme.bg2;c.selected&&(q=b.theme.bgH,n=b.theme.fgH);b.setColor(q).fillPoly(m).setColor(n).drawPoly(m);void 0!==c.col&&b.setColor(c.col);c.src?b.setBgColor(q).drawImage("function"== +typeof c.src?c.src():c.src,c.x+c.w/2,c.y+c.h/2,{scale:c.scale||void 0,rotate:.5*Math.PI*(c.r||0)}):b.setFont(c.font||"6x8:2").setFontAlign(0,0,c.r).drawString(c.label,c.x+c.w/2,c.y+c.h/2)},img:function(c){"ram";b.drawImage("function"==typeof c.src?c.src():c.src,c.x+c.w/2,c.y+c.h/2,{scale:c.scale||void 0,rotate:.5*Math.PI*(c.r||0)})},custom:function(c){"ram";c.render(c)},h:function(c){"ram";c.c.forEach(h)},v:function(c){"ram";c.c.forEach(h)}};if(this.lazy){this.rects||(this.rects={});var a=this.rects.clone(), +e=[];t(d,a,e,this.rects,null);for(var l in a)delete this.rects[l];d=Object.keys(a).map(c=>a[c]).reverse();for(var k of d)b.setBgColor(k.bg).clearRect.apply(g,k);e.forEach(h)}else h(d)};p.prototype.forgetLazyState=function(){this.rects={}};p.prototype.layout=function(d){var h={h:function(b){"ram";var f=b.x+(0|b.pad),a=0,e=b.c&&b.c.reduce((k,c)=>k+(0|c.fillx),0);e||(f+=b.w-b._w>>1,e=1);var l=f;b.c.forEach(k=>{k.x=0|l;f+=k._w;a+=0|k.fillx;l=f+Math.floor(a*(b.w-b._w)/e);k.w=0|l-k.x;k.h=0|(k.filly?b.h- +(b.pad<<1):k._h);k.y=0|b.y+(0|b.pad)+((1+(0|k.valign))*(b.h-(b.pad<<1)-k.h)>>1);if(k.c)h[k.type](k)})},v:function(b){"ram";var f=b.y+(0|b.pad),a=0,e=b.c&&b.c.reduce((k,c)=>k+(0|c.filly),0);e||(f+=b.h-b._h>>1,e=1);var l=f;b.c.forEach(k=>{k.y=0|l;f+=k._h;a+=0|k.filly;l=f+Math.floor(a*(b.h-b._h)/e);k.h=0|l-k.y;k.w=0|(k.fillx?b.w-(b.pad<<1):k._w);k.x=0|b.x+(0|b.pad)+((1+(0|k.halign))*(b.w-(b.pad<<1)-k.w)>>1);if(k.c)h[k.type](k)})}};if(h[d.type])h[d.type](d)};p.prototype.debug=function(d,h){d||(d=this._l); +h=h||1;g.setColor(h&1,h&2,h&4).drawRect(d.x+h-1,d.y+h-1,d.x+d.w-h,d.y+d.h-h);d.pad&&g.drawRect(d.x+d.pad-1,d.y+d.pad-1,d.x+d.w-d.pad,d.y+d.h-d.pad);h++;d.c&&d.c.forEach(b=>this.debug(b,h))};p.prototype.update=function(){function d(a){"ram";b[a.type](a);if(a.r&1){var e=a._w;a._w=a._h;a._h=e}a._w=Math.max(a._w+(a.pad<<1),0|a.width);a._h=Math.max(a._h+(a.pad<<1),0|a.height)}delete this.updateNeeded;var h=g,b={txt:function(a){"ram";a.font.endsWith("%")&&(a.font="Vector"+Math.round(h.getHeight()*a.font.slice(0, +-1)/100));if(a.wrap)a._h=a._w=0;else{var e=g.setFont(a.font).stringMetrics(a.label);a._w=e.width;a._h=e.height}},btn:function(a){"ram";a.font&&a.font.endsWith("%")&&(a.font="Vector"+Math.round(h.getHeight()*a.font.slice(0,-1)/100));var e=a.src?h.imageMetrics("function"==typeof a.src?a.src():a.src):h.setFont(a.font||"6x8:2").stringMetrics(a.label);a._h=16+e.height;a._w=20+e.width},img:function(a){"ram";var e=h.imageMetrics("function"==typeof a.src?a.src():a.src),l=a.scale||1;a._w=e.width*l;a._h=e.height* +l},"":function(a){"ram";a._w=0;a._h=0},custom:function(a){"ram";a._w=0;a._h=0},h:function(a){"ram";a.c.forEach(d);a._h=a.c.reduce((e,l)=>Math.max(e,l._h),0);a._w=a.c.reduce((e,l)=>e+l._w,0);null==a.fillx&&a.c.some(e=>e.fillx)&&(a.fillx=1);null==a.filly&&a.c.some(e=>e.filly)&&(a.filly=1)},v:function(a){"ram";a.c.forEach(d);a._h=a.c.reduce((e,l)=>e+l._h,0);a._w=a.c.reduce((e,l)=>Math.max(e,l._w),0);null==a.fillx&&a.c.some(e=>e.fillx)&&(a.fillx=1);null==a.filly&&a.c.some(e=>e.filly)&&(a.filly=1)}},f= +this._l;d(f);delete b;f.fillx||f.filly?(f.w=Bangle.appRect.w,f.h=Bangle.appRect.h,f.x=Bangle.appRect.x,f.y=Bangle.appRect.y):(f.w=f._w,f.h=f._h,f.x=Bangle.appRect.w-f.w>>1,f.y=Bangle.appRect.y+(Bangle.appRect.h-f.h>>1));this.layout(f)};p.prototype.clear=function(d){d||(d=this._l);g.reset();void 0!==d.bgCol&&g.setBgColor(d.bgCol);g.clearRect(d.x,d.y,d.x+d.w-1,d.y+d.h-1)};exports=p \ No newline at end of file From 7dfd7dde54826608e93899251851f0b4019bdb2c Mon Sep 17 00:00:00 2001 From: Travis Evans Date: Thu, 14 Sep 2023 16:17:43 -0500 Subject: [PATCH 15/22] Rename public `btnBorder` and `btnFace` fields to `btnBorderCol` and `btnFaceCol`, respectively --- modules/Layout.js | 4 ++-- modules/Layout.md | 4 ++-- modules/Layout.min.js | 16 ++++++++-------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/modules/Layout.js b/modules/Layout.js index 35a343090..35b396c0e 100644 --- a/modules/Layout.js +++ b/modules/Layout.js @@ -187,8 +187,8 @@ Layout.prototype.render = function (l) { x,y+h-5, x,y+4 ], bg = l.bgCol!==undefined?l.bgCol:gfx.theme.bg, - btnborder = l.btnBorder!==undefined?l.btnBorder:gfx.theme.fg2, - btnface = l.btnFace!==undefined?l.btnFace:gfx.theme.bg2; + btnborder = l.btnBorderCol!==undefined?l.btnBorderCol:gfx.theme.fg2, + btnface = l.btnFaceCol!==undefined?l.btnFaceCol:gfx.theme.bg2; if(l.selected){ btnface = gfx.theme.bgH, btnborder = gfx.theme.fgH; } diff --git a/modules/Layout.md b/modules/Layout.md index e95ab4f2c..f9a858633 100644 --- a/modules/Layout.md +++ b/modules/Layout.md @@ -47,8 +47,8 @@ layout.render(); - A `wrap` field to enable line wrapping. Requires some combination of `width`/`height` and `fillx`/`filly` to be set. Not compatible with text rotation. - A `col` field, eg `#f00` for red. When `type:"btn"`, this sets the color of the button's text label (defaults to `Graphics.theme.fg2` if not set) - A `bgCol` field for background color (will automatically fill on render). When `type:"btn"`, this sets the color of the space outside the button border (defaults to parent layoutObject's `bgCol` if not set) -- A `btnBorder` field for button border color (defaults to `Graphics.theme.fg2` if not set) -- A `btnFace` field for the background color of the area inside the button border (defaults to `Graphics.theme.bg2` if not set) +- A `btnBorderCol` field for button border color (defaults to `Graphics.theme.fg2` if not set) +- A `btnFaceCol` field for the background color of the area inside the button border (defaults to `Graphics.theme.bg2` if not set) - A `halign` field to set horizontal alignment WITHIN a `v` container. `-1`=left, `1`=right, `0`=center - A `valign` field to set vertical alignment WITHIN a `h` container. `-1`=top, `1`=bottom, `0`=center - A `pad` integer field to set pixels padding diff --git a/modules/Layout.min.js b/modules/Layout.min.js index 44b14ec35..043477fd5 100644 --- a/modules/Layout.min.js +++ b/modules/Layout.min.js @@ -4,11 +4,11 @@ h,b,f,a){var e=null==d.bgCol?a:g.toColor(d.bgCol);if(e!=a||"txt"==d.type||"btn"= if(void 0===h&&this.buttons[b])return this.buttons[b].cb();this.buttons[b]&&(delete this.buttons[b].selected,this.render(this.buttons[b]));b=(b+f+h)%f;this.buttons[b]&&(this.buttons[b].selected=1,this.render(this.buttons[b]));this.selectedButton=b}),d=!0);!this.options.back&&!this.options.remove||d||Bangle.setUI({mode:"custom",back:this.options.back,remove:this.options.remove});if(this.b){function h(b,f){.75=b.x&&f.y>=b.y&&f.x<=b.x+b.w&&f.y<=b.y+b.h&&(2==f.type&&b.cbl?b.cbl(f):b.cb&&b.cb(f));b.c&&b.c.forEach(a=>h(a,f))}Bangle.touchHandler= (b,f)=>h(this._l,f);Bangle.on("touch",Bangle.touchHandler)}};p.prototype.render=function(d){function h(c){"ram";b.reset();void 0!==c.col&&b.setColor(c.col);void 0!==c.bgCol&&b.setBgColor(c.bgCol).clearRect(c.x,c.y,c.x+c.w-1,c.y+c.h-1);f[c.type](c)}d||(d=this._l);this.updateNeeded&&this.update();var b=g,f={"":function(){},txt:function(c){"ram";if(c.wrap){var m=b.setFont(c.font).setFontAlign(0,-1).wrapString(c.label,c.w),n=c.y+(c.h-b.getFontHeight()*m.length>>1);b.drawString(m.join("\n"),c.x+(c.w>> -1),n)}else b.setFont(c.font).setFontAlign(0,0,c.r).drawString(c.label,c.x+(c.w>>1),c.y+(c.h>>1))},btn:function(c){"ram";var m=c.x+(0|c.pad),n=c.y+(0|c.pad),q=c.w-(c.pad<<1),r=c.h-(c.pad<<1);m=[m,n+4,m+4,n,m+q-5,n,m+q-1,n+4,m+q-1,n+r-5,m+q-5,n+r-1,m+4,n+r-1,m,n+r-5,m,n+4];n=void 0!==c.btnBorder?c.btnBorder:b.theme.fg2;q=void 0!==c.btnFace?c.btnFace:b.theme.bg2;c.selected&&(q=b.theme.bgH,n=b.theme.fgH);b.setColor(q).fillPoly(m).setColor(n).drawPoly(m);void 0!==c.col&&b.setColor(c.col);c.src?b.setBgColor(q).drawImage("function"== -typeof c.src?c.src():c.src,c.x+c.w/2,c.y+c.h/2,{scale:c.scale||void 0,rotate:.5*Math.PI*(c.r||0)}):b.setFont(c.font||"6x8:2").setFontAlign(0,0,c.r).drawString(c.label,c.x+c.w/2,c.y+c.h/2)},img:function(c){"ram";b.drawImage("function"==typeof c.src?c.src():c.src,c.x+c.w/2,c.y+c.h/2,{scale:c.scale||void 0,rotate:.5*Math.PI*(c.r||0)})},custom:function(c){"ram";c.render(c)},h:function(c){"ram";c.c.forEach(h)},v:function(c){"ram";c.c.forEach(h)}};if(this.lazy){this.rects||(this.rects={});var a=this.rects.clone(), -e=[];t(d,a,e,this.rects,null);for(var l in a)delete this.rects[l];d=Object.keys(a).map(c=>a[c]).reverse();for(var k of d)b.setBgColor(k.bg).clearRect.apply(g,k);e.forEach(h)}else h(d)};p.prototype.forgetLazyState=function(){this.rects={}};p.prototype.layout=function(d){var h={h:function(b){"ram";var f=b.x+(0|b.pad),a=0,e=b.c&&b.c.reduce((k,c)=>k+(0|c.fillx),0);e||(f+=b.w-b._w>>1,e=1);var l=f;b.c.forEach(k=>{k.x=0|l;f+=k._w;a+=0|k.fillx;l=f+Math.floor(a*(b.w-b._w)/e);k.w=0|l-k.x;k.h=0|(k.filly?b.h- -(b.pad<<1):k._h);k.y=0|b.y+(0|b.pad)+((1+(0|k.valign))*(b.h-(b.pad<<1)-k.h)>>1);if(k.c)h[k.type](k)})},v:function(b){"ram";var f=b.y+(0|b.pad),a=0,e=b.c&&b.c.reduce((k,c)=>k+(0|c.filly),0);e||(f+=b.h-b._h>>1,e=1);var l=f;b.c.forEach(k=>{k.y=0|l;f+=k._h;a+=0|k.filly;l=f+Math.floor(a*(b.h-b._h)/e);k.h=0|l-k.y;k.w=0|(k.fillx?b.w-(b.pad<<1):k._w);k.x=0|b.x+(0|b.pad)+((1+(0|k.halign))*(b.w-(b.pad<<1)-k.w)>>1);if(k.c)h[k.type](k)})}};if(h[d.type])h[d.type](d)};p.prototype.debug=function(d,h){d||(d=this._l); -h=h||1;g.setColor(h&1,h&2,h&4).drawRect(d.x+h-1,d.y+h-1,d.x+d.w-h,d.y+d.h-h);d.pad&&g.drawRect(d.x+d.pad-1,d.y+d.pad-1,d.x+d.w-d.pad,d.y+d.h-d.pad);h++;d.c&&d.c.forEach(b=>this.debug(b,h))};p.prototype.update=function(){function d(a){"ram";b[a.type](a);if(a.r&1){var e=a._w;a._w=a._h;a._h=e}a._w=Math.max(a._w+(a.pad<<1),0|a.width);a._h=Math.max(a._h+(a.pad<<1),0|a.height)}delete this.updateNeeded;var h=g,b={txt:function(a){"ram";a.font.endsWith("%")&&(a.font="Vector"+Math.round(h.getHeight()*a.font.slice(0, --1)/100));if(a.wrap)a._h=a._w=0;else{var e=g.setFont(a.font).stringMetrics(a.label);a._w=e.width;a._h=e.height}},btn:function(a){"ram";a.font&&a.font.endsWith("%")&&(a.font="Vector"+Math.round(h.getHeight()*a.font.slice(0,-1)/100));var e=a.src?h.imageMetrics("function"==typeof a.src?a.src():a.src):h.setFont(a.font||"6x8:2").stringMetrics(a.label);a._h=16+e.height;a._w=20+e.width},img:function(a){"ram";var e=h.imageMetrics("function"==typeof a.src?a.src():a.src),l=a.scale||1;a._w=e.width*l;a._h=e.height* -l},"":function(a){"ram";a._w=0;a._h=0},custom:function(a){"ram";a._w=0;a._h=0},h:function(a){"ram";a.c.forEach(d);a._h=a.c.reduce((e,l)=>Math.max(e,l._h),0);a._w=a.c.reduce((e,l)=>e+l._w,0);null==a.fillx&&a.c.some(e=>e.fillx)&&(a.fillx=1);null==a.filly&&a.c.some(e=>e.filly)&&(a.filly=1)},v:function(a){"ram";a.c.forEach(d);a._h=a.c.reduce((e,l)=>e+l._h,0);a._w=a.c.reduce((e,l)=>Math.max(e,l._w),0);null==a.fillx&&a.c.some(e=>e.fillx)&&(a.fillx=1);null==a.filly&&a.c.some(e=>e.filly)&&(a.filly=1)}},f= -this._l;d(f);delete b;f.fillx||f.filly?(f.w=Bangle.appRect.w,f.h=Bangle.appRect.h,f.x=Bangle.appRect.x,f.y=Bangle.appRect.y):(f.w=f._w,f.h=f._h,f.x=Bangle.appRect.w-f.w>>1,f.y=Bangle.appRect.y+(Bangle.appRect.h-f.h>>1));this.layout(f)};p.prototype.clear=function(d){d||(d=this._l);g.reset();void 0!==d.bgCol&&g.setBgColor(d.bgCol);g.clearRect(d.x,d.y,d.x+d.w-1,d.y+d.h-1)};exports=p \ No newline at end of file +1),n)}else b.setFont(c.font).setFontAlign(0,0,c.r).drawString(c.label,c.x+(c.w>>1),c.y+(c.h>>1))},btn:function(c){"ram";var m=c.x+(0|c.pad),n=c.y+(0|c.pad),q=c.w-(c.pad<<1),r=c.h-(c.pad<<1);m=[m,n+4,m+4,n,m+q-5,n,m+q-1,n+4,m+q-1,n+r-5,m+q-5,n+r-1,m+4,n+r-1,m,n+r-5,m,n+4];n=void 0!==c.btnBorderCol?c.btnBorderCol:b.theme.fg2;q=void 0!==c.btnFaceCol?c.btnFaceCol:b.theme.bg2;c.selected&&(q=b.theme.bgH,n=b.theme.fgH);b.setColor(q).fillPoly(m).setColor(n).drawPoly(m);void 0!==c.col&&b.setColor(c.col);c.src? +b.setBgColor(q).drawImage("function"==typeof c.src?c.src():c.src,c.x+c.w/2,c.y+c.h/2,{scale:c.scale||void 0,rotate:.5*Math.PI*(c.r||0)}):b.setFont(c.font||"6x8:2").setFontAlign(0,0,c.r).drawString(c.label,c.x+c.w/2,c.y+c.h/2)},img:function(c){"ram";b.drawImage("function"==typeof c.src?c.src():c.src,c.x+c.w/2,c.y+c.h/2,{scale:c.scale||void 0,rotate:.5*Math.PI*(c.r||0)})},custom:function(c){"ram";c.render(c)},h:function(c){"ram";c.c.forEach(h)},v:function(c){"ram";c.c.forEach(h)}};if(this.lazy){this.rects|| +(this.rects={});var a=this.rects.clone(),e=[];t(d,a,e,this.rects,null);for(var l in a)delete this.rects[l];d=Object.keys(a).map(c=>a[c]).reverse();for(var k of d)b.setBgColor(k.bg).clearRect.apply(g,k);e.forEach(h)}else h(d)};p.prototype.forgetLazyState=function(){this.rects={}};p.prototype.layout=function(d){var h={h:function(b){"ram";var f=b.x+(0|b.pad),a=0,e=b.c&&b.c.reduce((k,c)=>k+(0|c.fillx),0);e||(f+=b.w-b._w>>1,e=1);var l=f;b.c.forEach(k=>{k.x=0|l;f+=k._w;a+=0|k.fillx;l=f+Math.floor(a*(b.w- +b._w)/e);k.w=0|l-k.x;k.h=0|(k.filly?b.h-(b.pad<<1):k._h);k.y=0|b.y+(0|b.pad)+((1+(0|k.valign))*(b.h-(b.pad<<1)-k.h)>>1);if(k.c)h[k.type](k)})},v:function(b){"ram";var f=b.y+(0|b.pad),a=0,e=b.c&&b.c.reduce((k,c)=>k+(0|c.filly),0);e||(f+=b.h-b._h>>1,e=1);var l=f;b.c.forEach(k=>{k.y=0|l;f+=k._h;a+=0|k.filly;l=f+Math.floor(a*(b.h-b._h)/e);k.h=0|l-k.y;k.w=0|(k.fillx?b.w-(b.pad<<1):k._w);k.x=0|b.x+(0|b.pad)+((1+(0|k.halign))*(b.w-(b.pad<<1)-k.w)>>1);if(k.c)h[k.type](k)})}};if(h[d.type])h[d.type](d)};p.prototype.debug= +function(d,h){d||(d=this._l);h=h||1;g.setColor(h&1,h&2,h&4).drawRect(d.x+h-1,d.y+h-1,d.x+d.w-h,d.y+d.h-h);d.pad&&g.drawRect(d.x+d.pad-1,d.y+d.pad-1,d.x+d.w-d.pad,d.y+d.h-d.pad);h++;d.c&&d.c.forEach(b=>this.debug(b,h))};p.prototype.update=function(){function d(a){"ram";b[a.type](a);if(a.r&1){var e=a._w;a._w=a._h;a._h=e}a._w=Math.max(a._w+(a.pad<<1),0|a.width);a._h=Math.max(a._h+(a.pad<<1),0|a.height)}delete this.updateNeeded;var h=g,b={txt:function(a){"ram";a.font.endsWith("%")&&(a.font="Vector"+Math.round(h.getHeight()* +a.font.slice(0,-1)/100));if(a.wrap)a._h=a._w=0;else{var e=g.setFont(a.font).stringMetrics(a.label);a._w=e.width;a._h=e.height}},btn:function(a){"ram";a.font&&a.font.endsWith("%")&&(a.font="Vector"+Math.round(h.getHeight()*a.font.slice(0,-1)/100));var e=a.src?h.imageMetrics("function"==typeof a.src?a.src():a.src):h.setFont(a.font||"6x8:2").stringMetrics(a.label);a._h=16+e.height;a._w=20+e.width},img:function(a){"ram";var e=h.imageMetrics("function"==typeof a.src?a.src():a.src),l=a.scale||1;a._w=e.width* +l;a._h=e.height*l},"":function(a){"ram";a._w=0;a._h=0},custom:function(a){"ram";a._w=0;a._h=0},h:function(a){"ram";a.c.forEach(d);a._h=a.c.reduce((e,l)=>Math.max(e,l._h),0);a._w=a.c.reduce((e,l)=>e+l._w,0);null==a.fillx&&a.c.some(e=>e.fillx)&&(a.fillx=1);null==a.filly&&a.c.some(e=>e.filly)&&(a.filly=1)},v:function(a){"ram";a.c.forEach(d);a._h=a.c.reduce((e,l)=>e+l._h,0);a._w=a.c.reduce((e,l)=>Math.max(e,l._w),0);null==a.fillx&&a.c.some(e=>e.fillx)&&(a.fillx=1);null==a.filly&&a.c.some(e=>e.filly)&& +(a.filly=1)}},f=this._l;d(f);delete b;f.fillx||f.filly?(f.w=Bangle.appRect.w,f.h=Bangle.appRect.h,f.x=Bangle.appRect.x,f.y=Bangle.appRect.y):(f.w=f._w,f.h=f._h,f.x=Bangle.appRect.w-f.w>>1,f.y=Bangle.appRect.y+(Bangle.appRect.h-f.h>>1));this.layout(f)};p.prototype.clear=function(d){d||(d=this._l);g.reset();void 0!==d.bgCol&&g.setBgColor(d.bgCol);g.clearRect(d.x,d.y,d.x+d.w-1,d.y+d.h-1)};exports=p \ No newline at end of file From d9de3d8b3ef11c44244801c1d6f76c82063462a5 Mon Sep 17 00:00:00 2001 From: notEvil Date: Sat, 16 Sep 2023 13:35:50 +0200 Subject: [PATCH 16/22] - first version --- apps/pomoplus/ChangeLog | 3 ++- apps/pomoplus/app.js | 34 +++++++++++++++++++++------------- apps/pomoplus/metadata.json | 2 +- apps/pomoplus/settings.js | 12 ++++++++++-- 4 files changed, 34 insertions(+), 17 deletions(-) diff --git a/apps/pomoplus/ChangeLog b/apps/pomoplus/ChangeLog index 1a137aad0..96104469b 100644 --- a/apps/pomoplus/ChangeLog +++ b/apps/pomoplus/ChangeLog @@ -1,3 +1,4 @@ 0.01: New app! 0.02-0.04: Bug fixes -0.05: Submitted to the app loader \ No newline at end of file +0.05: Submitted to the app loader +0.06: Added setting to show clock after start/resume diff --git a/apps/pomoplus/app.js b/apps/pomoplus/app.js index 73af5c935..a9e21b98a 100644 --- a/apps/pomoplus/app.js +++ b/apps/pomoplus/app.js @@ -1,3 +1,5 @@ +g.clear(); + Bangle.POMOPLUS_ACTIVE = true; //Prevent the boot code from running. To avoid having to reload on every interaction, we'll control the vibrations from here when the user is in the app. const storage = require("Storage"); @@ -13,32 +15,36 @@ if ( } function drawButtons() { + let w = g.getWidth(); + let h = g.getHeight(); //Draw the backdrop - const BAR_TOP = g.getHeight() - 24; + const BAR_TOP = h - 24; g.setColor(0, 0, 1).setFontAlign(0, -1) - .clearRect(0, BAR_TOP, g.getWidth(), g.getHeight()) - .fillRect(0, BAR_TOP, g.getWidth(), g.getHeight()) + .clearRect(0, BAR_TOP, w, h) + .fillRect(0, BAR_TOP, w, h) .setColor(1, 1, 1); if (!common.state.wasRunning) { //If the timer was never started, only show a play button - g.drawImage(common.BUTTON_ICONS.play, g.getWidth() / 2, BAR_TOP); + g.drawImage(common.BUTTON_ICONS.play, w / 2, BAR_TOP); } else { - g.drawLine(g.getWidth() / 2, BAR_TOP, g.getWidth() / 2, g.getHeight()); + g.drawLine(w / 2, BAR_TOP, w / 2, h); if (common.state.running) { - g.drawImage(common.BUTTON_ICONS.pause, g.getWidth() / 4, BAR_TOP) - .drawImage(common.BUTTON_ICONS.skip, g.getWidth() * 3 / 4, BAR_TOP); + g.drawImage(common.BUTTON_ICONS.pause, w / 4, BAR_TOP) + .drawImage(common.BUTTON_ICONS.skip, w * 3 / 4, BAR_TOP); } else { - g.drawImage(common.BUTTON_ICONS.reset, g.getWidth() / 4, BAR_TOP) - .drawImage(common.BUTTON_ICONS.play, g.getWidth() * 3 / 4, BAR_TOP); + g.drawImage(common.BUTTON_ICONS.reset, w / 4, BAR_TOP) + .drawImage(common.BUTTON_ICONS.play, w * 3 / 4, BAR_TOP); } } } function drawTimerAndMessage() { + let w = g.getWidth(); + let h = g.getHeight(); g.reset() .setFontAlign(0, 0) .setFont("Vector", 36) - .clearRect(0, 24, 176, 152) + .clearRect(w / 2 - 60, h / 2 - 34, w / 2 + 60, h / 2 + 34) //Draw the timer .drawString((() => { @@ -53,7 +59,7 @@ function drawTimerAndMessage() { if (hours >= 1) return `${parseInt(hours)}:${pad(minutes)}:${pad(seconds)}`; else return `${parseInt(minutes)}:${pad(seconds)}`; - })(), g.getWidth() / 2, g.getHeight() / 2) + })(), w / 2, h / 2) //Draw the phase label .setFont("Vector", 12) @@ -63,7 +69,7 @@ function drawTimerAndMessage() { else if (currentPhase == common.PHASE_SHORT_BREAK) return `Short break ${numShortBreaks + 1}/${common.settings.numShortBreaks}`; else return "Long break!"; })(common.state.phase, common.state.numShortBreaks), - g.getWidth() / 2, g.getHeight() / 2 + 18); + w / 2, h / 2 + 18); //Update phase with vibation if needed if (common.getTimeLeft() <= 0) { @@ -91,6 +97,7 @@ Bangle.on("touch", (button, xy) => { }; setupTimerInterval(); drawButtons(); + if (common.settings.showClock) Bangle.showClock(); } else if (common.state.running) { //If we are running, there are two buttons: pause and skip @@ -127,6 +134,7 @@ Bangle.on("touch", (button, xy) => { drawTimerAndMessage(); setupTimerInterval(); drawButtons(); + if (common.settings.showClock) Bangle.showClock(); } } }); @@ -154,4 +162,4 @@ E.on('kill', () => { }); Bangle.loadWidgets(); -Bangle.drawWidgets(); \ No newline at end of file +Bangle.drawWidgets(); diff --git a/apps/pomoplus/metadata.json b/apps/pomoplus/metadata.json index 0db15ab4d..4f2fd6cbb 100644 --- a/apps/pomoplus/metadata.json +++ b/apps/pomoplus/metadata.json @@ -1,7 +1,7 @@ { "id": "pomoplus", "name": "Pomodoro Plus", - "version": "0.05", + "version": "0.06", "description": "A configurable pomodoro timer that runs in the background.", "icon": "icon.png", "type": "app", diff --git a/apps/pomoplus/settings.js b/apps/pomoplus/settings.js index 1ff52340a..e5c516457 100644 --- a/apps/pomoplus/settings.js +++ b/apps/pomoplus/settings.js @@ -10,7 +10,8 @@ const storage = require("Storage"); longBreak: 900000, //15 minute long break numShortBreaks: 3, //3 short breaks for every long break pausedTimerExpireTime: 21600000, //If the timer was left paused for >6 hours, reset it on next launch - widget: false //If a widget is added in the future, whether the user wants it + showClock: false, //Show clock after start/resume + widget: false, //If a widget is added in the future, whether the user wants it }; } @@ -89,6 +90,13 @@ const storage = require("Storage"); else return `${Math.floor(value / 3600000)}h ${(value % 3600000) / 60000}m` } }, + 'Show clock': { + value: settings.showClock, + onchange: function(value) { + settings.showClock = value; + save(); + }, + }, }; E.showMenu(menu) -}) \ No newline at end of file +}) From 713a6582e58e0a3ce6e7c548a0eef1010f153a41 Mon Sep 17 00:00:00 2001 From: notEvil Date: Sat, 16 Sep 2023 19:07:35 +0200 Subject: [PATCH 17/22] - changed buzz pattern before long break --- apps/pomoplus/common.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/pomoplus/common.js b/apps/pomoplus/common.js index b1cd42de8..bf3e80751 100644 --- a/apps/pomoplus/common.js +++ b/apps/pomoplus/common.js @@ -105,14 +105,13 @@ exports.nextPhase = function (vibrate) { if (vibrate) { if (exports.state.phase == exports.PHASE_WORKING) { - Bangle.buzz(750, 1); + Bangle.buzz(800, 1); } else if (exports.state.phase == exports.PHASE_SHORT_BREAK) { Bangle.buzz(); setTimeout(Bangle.buzz, 400); } else { Bangle.buzz(); - setTimeout(Bangle.buzz, 400); - setTimeout(Bangle.buzz, 600); + setTimeout(Bangle.buzz, 400, 400); } } -} \ No newline at end of file +} From d58c29f8d0e38befbbb47068ff948dae58f76c02 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 18 Sep 2023 13:42:27 +0100 Subject: [PATCH 18/22] semicolons --- apps/setting/settings.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/setting/settings.js b/apps/setting/settings.js index f3b963d6e..3c4115a2f 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -823,7 +823,7 @@ function showAppSettings(app) { try { appSettings = eval(appSettings); } catch (e) { - console.log(`${app.name} settings error:`, e) + console.log(`${app.name} settings error:`, e); return showError(/*LANG*/'Error in settings'); } if (typeof appSettings !== "function") { @@ -833,7 +833,7 @@ function showAppSettings(app) { // pass showAppSettingsMenu as "back" argument appSettings(()=>showAppSettingsMenu()); } catch (e) { - console.log(`${app.name} settings error:`, e) + console.log(`${app.name} settings error:`, e); return showError(/*LANG*/'Error in settings'); } } From 08afc6a9e8eff44ba6d5bbcefe6afeacc609fcb5 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 18 Sep 2023 13:43:42 +0100 Subject: [PATCH 19/22] When adding translations, switch to using our own toJSON implementation which will escape any chars that fall into the UTF8 character start range. Fixes https://github.com/espruino/Espruino/issues/2417 --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index 71813fe2e..11f8e16d2 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 71813fe2eaf19987cec07db850ab9d1959694f96 +Subproject commit 11f8e16d2ebb726bb92f29d812dc3ccba4f362a9 From 279ee5d292b32dcdfcfc11541c8ed092f2dfc955 Mon Sep 17 00:00:00 2001 From: lauzonhomeschool <85599144+lauzonhomeschool@users.noreply.github.com> Date: Mon, 18 Sep 2023 17:38:17 -0400 Subject: [PATCH 20/22] [alarm] default settings at the top; upd metadata --- apps/alarm/app.js | 12 ++++++++---- apps/alarm/metadata.json | 3 ++- apps/alarm/settings.js | 12 ++++++++---- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/apps/alarm/app.js b/apps/alarm/app.js index 2167ead36..a68e118ca 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -1,7 +1,11 @@ Bangle.loadWidgets(); Bangle.drawWidgets(); -const settings = require('Storage').readJSON('alarm.json',1)||{}; +const settings = Object.assign({ + showConfirm : true, + showAutoSnooze : true, + showHidden : true +}, require('Storage').readJSON('alarm.json',1)||{}); // 0 = Sunday (default), 1 = Monday const firstDayOfWeek = (require("Storage").readJSON("setting.json", true) || {}).firstDayOfWeek || 0; const WORKDAYS = 62; @@ -214,9 +218,9 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex, withDate) { if (!keyboard) delete menu[/*LANG*/"Message"]; if (!keyboard || !settings.showGroup) delete menu[/*LANG*/"Group"]; - if (!(settings.showConfirm == null ? true : settings.showConfirm)) delete menu[/*LANG*/"Confirm"]; - if (!(settings.showAutoSnooze == null ? true : settings.showAutoSnooze)) delete menu[/*LANG*/"Auto Snooze"]; - if (!(settings.showHidden == null ? true : settings.showHidden)) delete menu[/*LANG*/"Hidden"]; + if (!settings.showConfirm) delete menu[/*LANG*/"Confirm"]; + if (!settings.showAutoSnooze) delete menu[/*LANG*/"Auto Snooze"]; + if (!settings.showHidden) delete menu[/*LANG*/"Hidden"]; if (!alarm.date) { delete menu[/*LANG*/"Day"]; delete menu[/*LANG*/"Month"]; diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index bd92542db..bcd60a376 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -26,5 +26,6 @@ { "url": "screenshot-9.png" }, { "url": "screenshot-10.png" }, { "url": "screenshot-11.png" } - ] + ], + "data":[ {"name":"alarm.settings.json"} ] } diff --git a/apps/alarm/settings.js b/apps/alarm/settings.js index ad5084f23..253bade93 100644 --- a/apps/alarm/settings.js +++ b/apps/alarm/settings.js @@ -1,5 +1,9 @@ (function(back) { - let settings = require('Storage').readJSON('alarm.json',1)||{}; + let settings = Object.assign({ + showConfirm : true, + showAutoSnooze : true, + showHidden : true + }, require('Storage').readJSON('alarm.json',1)||{}); const save = () => require('Storage').write('alarm.json', settings); const DATE_FORMATS = ['default', 'mmdd']; @@ -22,15 +26,15 @@ } }, /*LANG*/'Show Menu Auto Snooze': { - value : settings.showAutoSnooze == null ? true : settings.showAutoSnooze, + value : settings.showAutoSnooze, onchange : v => { settings.showAutoSnooze=v; save();} }, /*LANG*/'Show Menu Confirm': { - value : settings.showConfirm == null ? true : settings.showConfirm, + value : settings.showConfirm, onchange : v => { settings.showConfirm=v; save();} }, /*LANG*/'Show Menu Hidden': { - value : settings.showHidden == null ? true : settings.showHidden, + value : settings.showHidden, onchange : v => { settings.showHidden=v; save();} }, /*LANG*/'Show Menu Group': { From d5889ebf8dca8c84c775db15b7f62b568eb1621b Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 19 Sep 2023 08:27:11 +0100 Subject: [PATCH 21/22] Quick tweak after recent default value changes --- apps/alarm/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/alarm/app.js b/apps/alarm/app.js index a68e118ca..f8dcdbfed 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -444,8 +444,8 @@ function showEditTimerMenu(selectedTimer, timerIndex) { }; if (!keyboard) delete menu[/*LANG*/"Message"]; - if (!(settings.showConfirm == null ? true : settings.showConfirm)) delete menu[/*LANG*/"Confirm"]; - if (!(settings.showHidden == null ? true : settings.showHidden)) delete menu[/*LANG*/"Hidden"]; + if (!settings.showConfirm) delete menu[/*LANG*/"Confirm"]; + if (!settings.showHidden) delete menu[/*LANG*/"Hidden"]; if (!isNew) { menu[/*LANG*/"Delete"] = () => { E.showPrompt(getLabel(timer) + "\n" + /*LANG*/"Are you sure?", { title: /*LANG*/"Delete Timer" }).then((confirm) => { From 2c6209ecca6259673ca9ea94733cbd90cd6aadd3 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 19 Sep 2023 08:27:42 +0100 Subject: [PATCH 22/22] Ensure values are bools --- apps/alarm/settings.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/alarm/settings.js b/apps/alarm/settings.js index 253bade93..765e5a5fa 100644 --- a/apps/alarm/settings.js +++ b/apps/alarm/settings.js @@ -26,15 +26,15 @@ } }, /*LANG*/'Show Menu Auto Snooze': { - value : settings.showAutoSnooze, + value : !!settings.showAutoSnooze, onchange : v => { settings.showAutoSnooze=v; save();} }, /*LANG*/'Show Menu Confirm': { - value : settings.showConfirm, + value : !!settings.showConfirm, onchange : v => { settings.showConfirm=v; save();} }, /*LANG*/'Show Menu Hidden': { - value : settings.showHidden, + value : !!settings.showHidden, onchange : v => { settings.showHidden=v; save();} }, /*LANG*/'Show Menu Group': { @@ -48,4 +48,4 @@ }; E.showMenu(appMenu); -}); \ No newline at end of file +});