diff --git a/apps.json b/apps.json index 2179e766b..909c4793a 100644 --- a/apps.json +++ b/apps.json @@ -2429,7 +2429,7 @@ { "id": "calendar", "name": "Calendar", - "version": "0.03", + "version": "0.04", "description": "Simple calendar", "icon": "calendar.png", "screenshots": [{"url":"screenshot_calendar.png"}], @@ -3896,7 +3896,7 @@ "id": "qmsched", "name": "Quiet Mode Schedule and Widget", "shortName": "Quiet Mode", - "version": "0.05", + "version": "0.06", "description": "Automatically turn Quiet Mode on or off at set times, and change LCD options while Quiet Mode is active.", "icon": "app.png", "screenshots": [{"url":"screenshot_b1_main.png"},{"url":"screenshot_b1_edit.png"},{"url":"screenshot_b1_lcd.png"}, @@ -4487,7 +4487,7 @@ "name": "LCARS Clock", "shortName":"LCARS", "icon": "lcars.png", - "version":"0.06", + "version":"0.07", "readme": "README.md", "supports": ["BANGLEJS2"], "description": "Library Computer Access Retrieval System (LCARS) clock.", @@ -4496,7 +4496,8 @@ "screenshots": [{"url":"screenshot.png"}], "storage": [ {"name":"lcars.app.js","url":"lcars.app.js"}, - {"name":"lcars.img","url":"lcars.icon.js","evaluate":true} + {"name":"lcars.img","url":"lcars.icon.js","evaluate":true}, + {"name":"lcars.settings.js","url":"lcars.settings.js"} ] }, { "id": "binwatch", diff --git a/apps/calendar/ChangeLog b/apps/calendar/ChangeLog index de887bfa7..e164d6be9 100644 --- a/apps/calendar/ChangeLog +++ b/apps/calendar/ChangeLog @@ -1,3 +1,4 @@ 0.01: Basic calendar 0.02: Make Bangle 2 compatible 0.03: Add setting to start week on Sunday +0.04: Add setting to switch color schemes. On Bangle 2 non-dithering colors will be used by default. Use localized names for months and days of the week (Language app needed). diff --git a/apps/calendar/README.md b/apps/calendar/README.md index e22d06573..4fc6962cf 100644 --- a/apps/calendar/README.md +++ b/apps/calendar/README.md @@ -9,5 +9,6 @@ Basic calendar ## Settings -- Starts on Sunday: whether the calendar should start on Sunday (default is Monday). +- Starts Sunday: whether the calendar should start on Sunday (default is Monday). +- B2 Colors: use non-dithering colors (default, recommended for Bangle 2) or the original color scheme. diff --git a/apps/calendar/calendar-icon.js b/apps/calendar/calendar-icon.js index ed1bf3667..ed6690033 100644 --- a/apps/calendar/calendar-icon.js +++ b/apps/calendar/calendar-icon.js @@ -1,5 +1 @@ -require("heatshrink").decompress( - atob( - "mEwxH+AH4A/ADuIUCARRDhgePCKIv13YAEDoYJFAA4RJFyQvcGBYRGy4dDy4uLCJgv/DoOBDgOBF5oRLF6IeBDgIvNCJYvQDwQuNCJovRADov/F9OsAEgv/F/4vhwIACAqYv/F/4vnd94vvX/4v/F/7vvF96//F/4v/d94v/F/4wsFxQwjFxgA/AH4A/AH4AZA==" - ) -) +require("heatshrink").decompress(atob("mEwwcCpMkyQC3wAIFgIRJn8JAoeQ/gRYwB0Bn57F/gCBHAgfCn8EDgdI/kSAoIR8oBkFgAFCCIysKCPM//4AKZAgR3/0Aj+Ag/ggP4gF/CPpr/Nf5r/NfYRhw4RL8IRDyEAABUJCIYC/AVI=")) \ No newline at end of file diff --git a/apps/calendar/calendar.js b/apps/calendar/calendar.js index 5707bd97a..01977570a 100644 --- a/apps/calendar/calendar.js +++ b/apps/calendar/calendar.js @@ -1,6 +1,6 @@ const maxX = g.getWidth(); const maxY = g.getHeight(); -const fontSize = g.getWidth()>200?2:1; +const fontSize = g.getWidth() > 200 ? 2 : 1; const rowN = 7; const colN = 7; const headerH = maxY / 7; @@ -10,26 +10,109 @@ const color1 = "#035AA6"; const color2 = "#4192D9"; const color3 = "#026873"; const color4 = "#038C8C"; -const color5 = "#03A696"; +const gray1 = "#bbbbbb"; const black = "#000000"; const white = "#ffffff"; -const gray1 = "#444444"; -const gray2 = "#888888"; -const gray3 = "#bbbbbb"; const red = "#d41706"; +const blue = "#0000ff"; +const yellow = "#ffff00"; let settings = require('Storage').readJSON("calendar.json", true) || {}; if (settings.startOnSun === undefined) settings.startOnSun = false; +if (settings.ndColors === undefined) + if (process.env.HWVERSION == 2) { + settings.ndColors = true; + } else { + settings.ndColors = false; + } + +if (settings.ndColors === true) { + let bgColor = white; + let bgColorMonth = blue; + let bgColorDow = black; + let bgColorWeekend = yellow; + let fgOtherMonth = blue; + let fgSameMonth = black; +} else { + let bgColor = color4; + let bgColorMonth = color1; + let bgColorDow = color2; + let bgColorWeekend = color3; + let fgOtherMonth = gray1; + let fgSameMonth = white; +} + +function getDowLbls(locale) { + let dowLbls; + //TODO: Find some clever way to generate this programmatically from locale lib + switch (locale) { + case "de_AT": + case "de_CH": + case "de_DE": + if (settings.startOnSun) { + dowLbls = ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"]; + } else { + dowLbls = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]; + } + break; + case "nl_NL": + if (settings.startOnSun) { + dowLbls = ["zo", "ma", "di", "wo", "do", "vr", "za"]; + } else { + dowLbls = ["ma", "di", "wo", "do", "vr", "za", "zo"]; + } + break; + case "fr_BE": + case "fr_CH": + case "fr_FR": + if (settings.startOnSun) { + dowLbls = ["Di", "Lu", "Ma", "Me", "Je", "Ve", "Sa"]; + } else { + dowLbls = ["Lu", "Ma", "Me", "Je", "Ve", "Sa", "Di"]; + } + break; + case "sv_SE": + if (settings.startOnSun) { + dowLbls = ["Di", "Lu", "Ma", "Me", "Je", "Ve", "Sa"]; + } else { + dowLbls = ["Lu", "Ma", "Me", "Je", "Ve", "Sa", "Di"]; + } + break; + case "it_CH": + case "it_IT": + if (settings.startOnSun) { + dowLbls = ["Do", "Lu", "Ma", "Me", "Gi", "Ve", "Sa"]; + } else { + dowLbls = ["Lu", "Ma", "Me", "Gi", "Ve", "Sa", "Do"]; + } + break; + case "oc_FR": + if (settings.startOnSun) { + dowLbls = ["dg", "dl", "dm", "dc", "dj", "dv", "ds"]; + } else { + dowLbls = ["dl", "dm", "dc", "dj", "dv", "ds", "dg"]; + } + break; + default: + if (settings.startOnSun) { + dowLbls = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]; + } else { + dowLbls = ["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"]; + } + break; + } + return dowLbls; +} function drawCalendar(date) { - g.setBgColor(color4); + g.setBgColor(bgColor); g.clearRect(0, 0, maxX, maxY); - g.setBgColor(color1); + g.setBgColor(bgColorMonth); g.clearRect(0, 0, maxX, headerH); - g.setBgColor(color2); + g.setBgColor(bgColorDow); g.clearRect(0, headerH, maxX, headerH + rowH); - g.setBgColor(color3); + g.setBgColor(bgColorWeekend); g.clearRect(colW * 5, headerH + rowH, maxX, maxY); for (let y = headerH; y < maxY; y += rowH) { g.drawLine(0, y, maxX, y); @@ -40,24 +123,11 @@ function drawCalendar(date) { const month = date.getMonth(); const year = date.getFullYear(); - const monthMap = { - 0: "January", - 1: "February", - 2: "March", - 3: "April", - 4: "May", - 5: "June", - 6: "July", - 7: "August", - 8: "September", - 9: "October", - 10: "November", - 11: "December" - }; + const localeMonth = require('locale').month(date); g.setFontAlign(0, 0); g.setFont("6x8", fontSize); g.setColor(white); - g.drawString(`${monthMap[month]} ${year}`, maxX / 2, headerH / 2); + g.drawString(`${localeMonth} ${year}`, maxX / 2, headerH / 2); g.drawPoly([10, headerH / 2, 20, 10, 20, headerH - 10], true); g.drawPoly( [maxX - 10, headerH / 2, maxX - 20, 10, maxX - 20, headerH - 10], @@ -65,12 +135,7 @@ function drawCalendar(date) { ); g.setFont("6x8", fontSize); - let dowLbls; - if (settings.startOnSun) { - dowLbls = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]; - } else { - dowLbls = ["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"]; - } + let dowLbls = getDowLbls(require('locale').name); dowLbls.forEach((lbl, i) => { g.drawString(lbl, i * colW + colW / 2, headerH + rowH / 2); }); @@ -120,14 +185,19 @@ function drawCalendar(date) { today.year === year && today.month === month && today.day === day - 50; if (isToday) { g.setColor(red); + let x1 = x * colW; + let y1 = y * rowH + headerH + rowH; + let x2 = x * colW + colW; + let y2 = y * rowH + headerH + rowH + rowH; + g.drawRect(x1, y1, x2, y2); g.drawRect( - x * colW, - y * rowH + headerH + rowH, - x * colW + colW - 1, - y * rowH + headerH + rowH + rowH + x1 + 1, + y1 + 1, + x2 - 1, + y2 - 1 ); } - g.setColor(day < 50 ? gray3 : white); + g.setColor(day < 50 ? fgOtherMonth : fgSameMonth); g.drawString( (day > 50 ? day - 50 : day).toString(), x * colW + colW / 2, @@ -145,10 +215,10 @@ const today = { }; drawCalendar(date); clearWatch(); -Bangle.on("touch",area=>{ +Bangle.on("touch", area => { const month = date.getMonth(); let prevMonth; - if (area==1) { + if (area == 1) { let prevMonth = month > 0 ? month - 1 : 11; if (prevMonth === 11) date.setFullYear(date.getFullYear() - 1); date.setMonth(prevMonth); diff --git a/apps/calendar/calendar.png b/apps/calendar/calendar.png index 056cab3b7..ccbcce5ff 100644 Binary files a/apps/calendar/calendar.png and b/apps/calendar/calendar.png differ diff --git a/apps/calendar/screenshot_calendar.png b/apps/calendar/screenshot_calendar.png index 4507d77dd..8285932c4 100644 Binary files a/apps/calendar/screenshot_calendar.png and b/apps/calendar/screenshot_calendar.png differ diff --git a/apps/calendar/settings.js b/apps/calendar/settings.js index f9c7783a3..3c8f7d8e8 100644 --- a/apps/calendar/settings.js +++ b/apps/calendar/settings.js @@ -1,24 +1,38 @@ -(function(back) { +(function (back) { var FILE = "calendar.json"; var settings = require('Storage').readJSON(FILE, true) || {}; if (settings.startOnSun === undefined) - settings.startOnSun = true; + settings.startOnSun = false; + if (settings.ndColors === undefined) + if (process.env.HWVERSION == 2) { + settings.ndColors = true; + } else { + settings.ndColors = false; + } function writeSettings() { require('Storage').writeJSON(FILE, settings); } E.showMenu({ - "" : { "title" : "Calendar" }, - "< Back" : () => back(), - 'Start on Sunday': { + "": { "title": "Calendar" }, + "< Back": () => back(), + 'Start Sunday': { value: settings.startOnSun, - format: v => v?"Yes":"No", + format: v => v ? "Yes" : "No", onchange: v => { settings.startOnSun = v; writeSettings(); } }, + 'B2 Colors': { + value: settings.ndColors, + format: v => v ? "Yes" : "No", + onchange: v => { + settings.ndColors = v; + writeSettings(); + } + }, }); }) diff --git a/apps/lcars/ChangeLog b/apps/lcars/ChangeLog index 85bcbad36..c5f8187b7 100644 --- a/apps/lcars/ChangeLog +++ b/apps/lcars/ChangeLog @@ -3,4 +3,5 @@ 0.03: New design with different icons if gps, hrm or compass is on. 0.04: Inluded LCARS Logo. 0.05: Additional icons for (1) charging and (2) bat < 30%. -0.06: Fix - Alarm disabled, if clock was closed \ No newline at end of file +0.06: Fix - Alarm disabled, if clock was closed. +0.07: Added settings to adjust data that is shown for each row. \ No newline at end of file diff --git a/apps/lcars/README.md b/apps/lcars/README.md index 3acaacb4d..15009e838 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -5,10 +5,9 @@ Note: To display the steps, its necessary to install the [Pedometer widget](https://banglejs.com/apps/#pedometer%20widget). ## Features - * Shows the time - * Shows the date - * Shows the current battery level in % - * Shows the number of daily steps + * LCARS Style watch face + * Shows satate (charging, out of battery etc.) + * SHows data that can be configured (steps, HRM, temperature etc.) * Swipe left/right to activate an alarm ## Icons diff --git a/apps/lcars/bg_large.png b/apps/lcars/bg_large.png index dd5bda4f3..56590e878 100644 Binary files a/apps/lcars/bg_large.png and b/apps/lcars/bg_large.png differ diff --git a/apps/lcars/bg_small.png b/apps/lcars/bg_small.png index 8030c0ddb..ea3a75688 100644 Binary files a/apps/lcars/bg_small.png and b/apps/lcars/bg_small.png differ diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 9b7244ece..859e999a5 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -1,8 +1,21 @@ -const filename = "lcars.setting.json"; +const SETTINGS_FILE = "lcars.setting.json"; const Storage = require("Storage"); -let settings = Storage.readJSON(filename,1) || { + + +// ...and overwrite them with any saved values +// This way saved values are preserved if a new version adds more settings +const storage = require('Storage') +let settings = { alarm: -1, + dataRow1: "Battery", + dataRow2: "Steps", + dataRow3: "Temp." }; +let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; +for (const key in saved_settings) { + settings[key] = saved_settings[key] +} +let hrmValue = 0; /* * Requirements and globals @@ -12,7 +25,7 @@ const locale = require('locale'); var backgroundImage = { width : 176, height : 151, bpp : 3, transparent : 2, - buffer : require("heatshrink").decompress(atob("AAUEufPnnzATkAg4daIIXnz15ATvkwEDDrUAgPHQDyDghyAeQcNzJQ0cuPHATCDBDrUDJQ1AgAA3jjOF+BA4T4KDFyBB5Qf4ABQAaD9QAaD/QesH8CD/n/8Qf8//+AQfsB///GQ6D2h5BJQf6D7/yD8jl/IIIABjiD5n4/DAAWAQe8B//8QYfH//x4CD2HwMDQIf4AoP4Qesf/56BQYYFBuP/Qev//0AQYoKBn/gQecH/lwQwQADBYaDzGoZBHR4OAQehBKj5BBsuWrICDBAIAofYZBFBAZ6qIJJ6DQZBB3IAiDDgZBygJ6EIIn8IOqDKIIscuPHAQdwINkHIJEfIIPnz15AQeAINT+CHwcPAYI1BIIU8+fPAQbOqg56BQYcAgKD4IIv4RgSDCAQSD34AIC//wBYSDyO4P+IIoIB+E/8AFBQeL7B//HHYJKE+P/AoSDygF/QQJBF//4AoSDygEBQYgFBj/xZYaDzgE/PoIAE/wMDQeZBB/jICAAMcuAMDQevgQwR0CvyD3gP/BAxBEQek4A40OQe4ANQegAMQf6D/AAccQf8Ak6DFyCD/QfcDQYueIPMAuaDE+fBIPMOQYoCb8glB7dt2wCW2EAgKDFATkAg2atOmAS5eBhKDigyDZ2zHCjiD/AAMChEgwQCcQb4AiQb5BiQbscuPHATyDfyfPnnzATnwQbsBQD6DghKAeQcJoHiFBggCYQYVhdwQATgOmgVPNAnOECwAGQYIZXgM2dI1wIL2aoCDYibsF4CD/QcGYILGmyaDFwCD/QfaADQf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D4jCD/ADKDnILSD/Qf6DEHO6DJIP6D/Qf6D/QY8cuPHAQdAQfPz588AQeAQf8cuCD/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6DqoCD5HO6DJIP6D/Qf6D/QY8cuPHAQdwE7sGzCDZ+fPngCDwBBe7aD/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/QfcTQYvAQf6DgzVAQbECp6DE5yD5gCDFATqDCsOAIKtB00AhKDEATnwQYVt2wCXQwKDltOmAS6IC2aD82BBCQccaQbGAA==")) + buffer : require("heatshrink").decompress(atob("AAdx48cATsAg4daIAX3799ATv2wEFDrUAgNHQDyDghaAeQcJKG86D4gRKGgAA4jxKFuBB5iaDF6BB5ZwyD6QAYCC4CD/Qf6Dzg/gQf8H/iD/n//wCD9gP///wQfpBKQf6D4h5BB/yD8jl/IIIABjiD5n4/DAAWAQe8B//8QYfHj//PAaDzHwICCAAP4gYCBQep6DIIYFBRgKD1j/+gB9BQYYKBn/gQen/+BBFQAUH/iDzGoZBHJoOAQeRBDj5BHj6PB0WKlACDJQIAofYZBFBAZBBAGMHPQZB8QYZAEIIcDIOiDI/hB3QZBBFjlx44CDuBBpg4DCIJEfIIPnz15AQeAQeH8gIDBGoJBCnnz54CDZ1UHPQMHIIUAIIKD3II6MBQYQCCQeI1B+BBC/BKCBASGCQeK5B/xBC4BKEn/gAoKDyj//45BFj/xZYSDzgF/IAP+JQrLCQecAgKDBF4cHQYKJDQecAn6EBAAiJEQeZBB/jICAAMcvwMDQevgQwR0CIIiDzgP/BA1/4CD3nAHGhyD3ABqD0ABiD/Qf4ADjiD/gEnQYuQQf6D7gaDFzxB5gFzQYnz4BB5hyDFATfkEoIdagEBQYoCcgEHDrReBhKDhwEBQbYABjiD/AH4A/AH4AGiFx48cATsAg4daIIWSpMkATuQEbkAgJfbQckJQDyDhZxQA1gRKFpBA4gEQQYtwIPMSQYtAIPKADQfqADAQRA5Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf4A/AH4A/AH4A/AFkcuPHAQdAIPOSpMkAQaD/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf4A/AH4A/AH4A/AGUcuPHAQdwIPOSpMkAQaD/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf4AciSDFoCD/QfcCQYtIIPMAQYoC6gEJQYgC6gEBQf7HCQf4ABiiD9")) } var iconEarth = { @@ -95,6 +108,33 @@ function queueDraw() { } +function printData(key, y){ + g.setFontAlign(-1,-1,0); + + if(key == "Battery"){ + var bat = E.getBattery(); + g.drawString("BAT:", 30, y); + g.drawString(bat+ "%", 68, y); + + } else if(key == "Steps"){ + var steps = getSteps(); + g.drawString("STEP:", 30, y); + g.drawString(steps, 68, y); + + } else if(key == "Temp."){ + var temperature = Math.floor(E.getTemperature()); + g.drawString("TEMP:", 30, y); + g.drawString(temperature + "C", 69, y); + + } else if(key == "HRM"){ + g.drawString("HRM:", 30, y); + g.drawString(hrmValue, 69, y); + + } else { + g.drawString("NOT FOUND", 30, y); + } +} + function draw(){ // First handle alarm to show this correctly afterwards @@ -125,7 +165,7 @@ function draw(){ // Alarm within symbol g.setFontAlign(0,0,0); g.setFontAntonioSmall(); - g.drawString(iconImg.text, 115+25, 102); + g.drawString(iconImg.text, 115+25, 105); if(isAlarmEnabled() > 0){ g.drawString(getAlarmMinutes(), 115+25, 115+25); } @@ -147,18 +187,9 @@ function draw(){ g.drawString(dayName, 100, 55); // Draw battery - g.drawString("BAT:", 25, 98); - g.drawString(bat+ "%", 62, 98); - - // Draw steps - var steps = getSteps(); - g.drawString("STEP:", 25, 121); - g.drawString(steps, 62, 121); - - // Temperature - g.setFontAlign(-1,-1,0); - g.drawString("TEMP:", 25, 144); - g.drawString(Math.floor(E.getTemperature()) + "C", 62, 144); + printData(settings.dataRow1, 98); + printData(settings.dataRow2, 121); + printData(settings.dataRow3, 144); // Queue draw in one minute queueDraw(); @@ -182,6 +213,12 @@ function stepsWidget() { return undefined; } +/* + * HRM Listener + */ +Bangle.on('HRM', function (hrm) { + hrmValue = hrm.bpm; +}); /* * Handle alarm @@ -220,7 +257,7 @@ function handleAlarm(){ // Update alarm state to disabled settings.alarm = -1; - Storage.writeJSON(filename, settings); + Storage.writeJSON(SETTINGS_FILE, settings); } @@ -250,7 +287,7 @@ Bangle.on('swipe',function(dir) { draw(); // Update alarm state - Storage.writeJSON(filename, settings); + Storage.writeJSON(SETTINGS_FILE, settings); }); diff --git a/apps/lcars/lcars.settings.js b/apps/lcars/lcars.settings.js new file mode 100644 index 000000000..2255caf9b --- /dev/null +++ b/apps/lcars/lcars.settings.js @@ -0,0 +1,54 @@ +(function(back) { + const SETTINGS_FILE = "lcars.setting.json"; + + // initialize with default settings... + const storage = require('Storage') + let settings = { + alarm: -1, + dataRow1: "Battery", + dataRow2: "Steps", + dataRow3: "Temp." + }; + let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; + for (const key in saved_settings) { + settings[key] = saved_settings[key] + } + + function save() { + storage.write(SETTINGS_FILE, settings) + } + + var data_options = ['Battery', 'Steps', 'Temp.', "HRM"]; + + E.showMenu({ + '': { 'title': 'LCARS Clock' }, + '< Back': back, + 'Row 1': { + value: 0 | data_options.indexOf(settings.dataRow1), + min: 0, max: 3, + format: v => data_options[v], + onchange: v => { + settings.dataRow1 = data_options[v]; + save(); + }, + }, + 'Row 2': { + value: 0 | data_options.indexOf(settings.dataRow2), + min: 0, max: 3, + format: v => data_options[v], + onchange: v => { + settings.dataRow2 = data_options[v]; + save(); + }, + }, + 'Row 3': { + value: 0 | data_options.indexOf(settings.dataRow3), + min: 0, max: 3, + format: v => data_options[v], + onchange: v => { + settings.dataRow3 = data_options[v]; + save(); + }, + } + }); +}) diff --git a/apps/lcars/screenshot.png b/apps/lcars/screenshot.png index 70db639eb..d74635f64 100644 Binary files a/apps/lcars/screenshot.png and b/apps/lcars/screenshot.png differ diff --git a/apps/qmsched/ChangeLog b/apps/qmsched/ChangeLog index f41fe3416..35832a300 100644 --- a/apps/qmsched/ChangeLog +++ b/apps/qmsched/ChangeLog @@ -2,4 +2,5 @@ 0.02: Add widget 0.03: Bangle.js 2 support 0.04: Move Quiet Mode LCD options from global settings to this app -0.05: Avoid immediately redrawing widgets on load \ No newline at end of file +0.05: Avoid immediately redrawing widgets on load +0.06: Fix: don't try to redraw widget when widgets not loaded \ No newline at end of file diff --git a/apps/qmsched/lib.js b/apps/qmsched/lib.js index 9b307769a..e9ed3ec90 100644 --- a/apps/qmsched/lib.js +++ b/apps/qmsched/lib.js @@ -19,5 +19,5 @@ exports.setMode = function(mode) { {quiet:mode} )); exports.applyOptions(mode); - if (WIDGETS && "qmsched" in WIDGETS) WIDGETS["qmsched"].draw(); + if (typeof WIDGETS === "object" && "qmsched" in WIDGETS) WIDGETS["qmsched"].draw(); };