From 42700ea24d0de4e188d9e3702ef28509b8a1eaa6 Mon Sep 17 00:00:00 2001 From: stweedo <108593831+stweedo@users.noreply.github.com> Date: Fri, 5 May 2023 12:09:58 -0500 Subject: [PATCH] v0.02 of Shadow Clock with settings menu --- apps/shadowclk/ChangeLog | 1 + apps/shadowclk/README.md | 25 ++++ apps/shadowclk/app-icon.js | 2 +- apps/shadowclk/app.js | 146 ++++++++++++-------- apps/shadowclk/app.png | Bin 8844 -> 2377 bytes apps/shadowclk/custom.html | 231 ++++++++++++++++++++++++++++++++ apps/shadowclk/icon.png | Bin 0 -> 446 bytes apps/shadowclk/metadata.json | 34 +++-- apps/shadowclk/screenshot-1.png | Bin 2704 -> 3510 bytes apps/shadowclk/screenshot.png | Bin 2676 -> 3505 bytes apps/shadowclk/settings.js | 58 ++++++++ 11 files changed, 430 insertions(+), 67 deletions(-) create mode 100644 apps/shadowclk/README.md create mode 100644 apps/shadowclk/custom.html create mode 100644 apps/shadowclk/icon.png create mode 100644 apps/shadowclk/settings.js diff --git a/apps/shadowclk/ChangeLog b/apps/shadowclk/ChangeLog index 5560f00bc..5a654d5a1 100644 --- a/apps/shadowclk/ChangeLog +++ b/apps/shadowclk/ChangeLog @@ -1 +1,2 @@ 0.01: New App! +0.02: New 'Settings Menu' to choose your favorite color and switch between light or dark themes diff --git a/apps/shadowclk/README.md b/apps/shadowclk/README.md new file mode 100644 index 000000000..15455f003 --- /dev/null +++ b/apps/shadowclk/README.md @@ -0,0 +1,25 @@ +# Shadow Clock + +Shadow Clock uses the "Londrina" font in a user selectable color and surrounds it in the "Londrina Shadow" font to create a visually appealing way to show the time in a clear, easily readable manner. On the Bangle.js 2, the time can be read easily even if the screen is locked and unlit. + +## Usage + +* Install Shadow Clock through the Bangle.js app loader. +* Configure it through the default Bangle.js configuration mechanism +(Settings app, "Apps" menu, "Shadow Clock" submenu). +* If you like it, make it your default watch face +(Settings app, "System" menu, "Clock" submenu, select "Shadow Clock"). + +## Configuration + +Anton Clock is configured by the standard settings mechanism of Bangle.js's operating system: +Open the `Settings` app, then the `Apps` submenu and below it the `Shadow Clock` menu. +You configure Shadow Clock by selecting a `Light` or `Dark` system wide theme and then selecting the color of the clock numbers. + +## Compatibility + +Shadow Clock should be compatible with with Bangle.js 1, however it was built and tested with Bangle.js 2 + +## Creator + +[stweedo](https://github.com/stweedo) diff --git a/apps/shadowclk/app-icon.js b/apps/shadowclk/app-icon.js index 3e3eee97f..afbb8269a 100644 --- a/apps/shadowclk/app-icon.js +++ b/apps/shadowclk/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwhHXAH4A/AH4A/AH4A/AH4A/AH4A/AFGsAAQOUA4OBDBYfHo8jAAOBByOssgICkdkF6AWEF5IOHxAHDAAVALx4VEF5AOHA4oAD0ovNoEjo6BCF5AOHF4ccp9dAoVdFxh2CioUCa44OIwIFCirwBjgFBqyNPqxJCEAOIKwOIBxYJChwfBwIABJQ7dHnIkCEAsVBxovDdiMcVYIgHFQgOJR4WIxBdMCoccshUCkdkRYJ6DBxIvDAAlkF5wWLBxQKJOAIvTroOOBQkcmU5aoYAKhwACjiqDqwOOTQQqDGwQvMAAawCcoOsAAQOL642DBAI0EAB1AC4QfBJIU5BxQ2DAAp5FF6ZJFF4xgFAAMOOwyPKjkcCgWsAoMyBxQAB1k5BAMcZAQuPDIS6EYBAIRAHKHCAIhPLAoWswIMEL6OBDIgYGHA4qCCwIKBDIgvPDggnIAw7lBF4J4KR5gVJKgZDDIgQCDMITvXXA47EHxD2aFQhOCBAY8DRiiWLD4aEBMYzuCLzgvEEQK4BFAQCDB4TACF7QA/AH4A/AH4A/AAQA==")) +require("heatshrink").decompress(atob("mEwxH+64Afq17AAlWq2sBYOtB4Urq2BFzeBwONAAeyHAQvCrPX1g3BlYvb02BjwADF4QmBwdZF4MrleBgAvlgAwBgqQBlcAF72HF46PBwaPDwK/dVoLpBAAwMBweDFTYA/AH4A/AH4A/AF2lAAOsBRIAF6AMDp9Wp+lFyNWkYABitWFwoKCAAsHBgMyBAkVwIuO6EVCod6F50A6+BBI0VMRxGEF6BfBIwZqHABRGCo5EIF4cOgEHAAUA0scBYQDDCAIvMhx7CCYTfDAYIvDK4McNoaODh1PPgcO1jsNiskOYQTBh0cjlW1iDHfwJfDjmeoDKEABSlCgAlCF4QJGcgwPEfQ5eMFQIvDRYIfClesioADEgcrSAguEwJeNh1AAgQkBwOlkkkQoOBvQACIgRAB685F4wJBF5oAGp4UJ1i6CeQK/Dg4ECZYQvTComsnNdrp+B0rADlaKD1l6X52BgAACJIgvEFIcO0sOF4cAAgeISgYvLMg8HKoOBAAIvEAAsOL4bwGFxyuDg/QGoYZBT5AKBXQYvVCYUH1gvFqwjGTwWBGA0AOwIAN6EOhytBAwIFBh1PAoN6g8VskVmUAZoelBQVABQIuPMAS6DfYWBMgI9CwMrq2lDA2Bq1PFqLpCHBAWKMIJGBAgRDEABiKBlYTDAYcA1gKBqwgFlYMBLoIaBCIKZDABh+BDIQVBC4WsF4YOBGAmsBQSgCAIIvQFYIiBKwReDFQI3DEIlWFIIsBCwIABF6JhClZhBZQo8BAYIOBIoh0CBIJ5DAH4AEPYKBDWwSGCAoKIDAoIwcEwJ/CRYICCFoI8BQ4YKBMDhWBEwIjBYQcAAYQKBZIRfdAIJVCQgLkDAYJjCcX4A/AH4A/AFwA==")) diff --git a/apps/shadowclk/app.js b/apps/shadowclk/app.js index c18363f72..e69225035 100644 --- a/apps/shadowclk/app.js +++ b/apps/shadowclk/app.js @@ -1,63 +1,93 @@ // Clock with large colored digits using the "Londrina" font and a slightly larger "Londrina Shadow" font on top Graphics.prototype.setFontLondrinaSolid = function() { - // Actual height 59 (64 - 6) - return this.setFontCustom( - E.toString(require('heatshrink').decompress(atob('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'))), - 46, - atob("DyEqHigoJikpJygqEQ=="), - 81|65536 - ); -}; - -Graphics.prototype.setFontLondrinaShadow = function() { - // Actual height 63 (67 - 5) - return this.setFontCustom( - E.toString(require('heatshrink').decompress(atob('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'))), - 46, - atob("DyEqHigoJikpJygqEQ=="), - 81|65536 - ); -}; - -(function() { - let drawTimeout; - - // Actually draw the watch face - function draw() { - const x = g.getWidth() / 2; - const y = g.getHeight() / 2; - g.reset().clearRect(Bangle.appRect); - const date = new Date(); - var hour = String(date.getHours()).padStart(2, '0'); - if (hour[0] === '0') hour = hour[1]; - var minutes = String(date.getMinutes()).padStart(2, '0'); - const timeStr = hour + ':' + minutes; - - g.setFontAlign(0, 0).setFont("LondrinaSolid").setColor(0, 1, 1).drawString(timeStr, x - 1, y); - g.reset().setFontAlign(0, 0).setFont("LondrinaShadow").drawString(timeStr, x - 1, y); - - const locale = require("locale"); - const dateStr = locale.date(date, 0).toUpperCase() + "\n" + - locale.dow(date, 0).toUpperCase(); - g.setFontAlign(0, 0).setFont("6x8", 2).drawString(dateStr, x, y + 48); - - if (drawTimeout) clearTimeout(drawTimeout); - drawTimeout = setTimeout(() => { - drawTimeout = undefined; - draw(); - }, 60000 - (Date.now() % 60000)); - } - - Bangle.setUI({ - mode: "clock", - remove: function() { + // Actual height 59 (64 - 6) + return this.setFontCustom( + E.toString(require('heatshrink').decompress(atob('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'))), + 46, + atob("DyEqHigoJikpJygqEQ=="), + 81 | 65536 + ); + }; + + Graphics.prototype.setFontLondrinaShadow = function() { + // Actual height 63 (67 - 5) + return this.setFontCustom( + E.toString(require('heatshrink').decompress(atob('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'))), + 46, + atob("DyEqHigoJikpJygqEQ=="), + 81 | 65536 + ); + }; + + Graphics.prototype.setFontDotGothic16 = function() { + // Actual height 20 (19 - 0) + return this.setFontCustom( + E.toString(require('heatshrink').decompress(atob('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'))), + 32, + atob("CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoA"), + 20|65536 + ); + }; + + const storage = require('Storage'); + + var settings = Object.assign({ + // default values + color: "#0ff", + theme: "light", + }, storage.readJSON("shadowclk.json", true) || {}); + + (function() { + let drawTimeout; + + function draw() { + const x = g.getWidth() / 2; + const y = g.getHeight() / 2; + g.reset().clearRect(Bangle.appRect); + const date = new Date(); + var hour = String(date.getHours()).padStart(2, '0'); + if (hour[0] === '0') hour = hour[1]; + var minutes = String(date.getMinutes()).padStart(2, '0'); + const timeStr = hour + ':' + minutes; + var color = settings.color; + g.setFontAlign(0, 0).setFont("LondrinaSolid").setColor(color).drawString(timeStr, x - 1, y); + g.reset().setFontAlign(0, 0).setFont("LondrinaShadow").drawString(timeStr, x - 1, y); + + const locale = require("locale"); + const dayOfMonth = date.getDate(); + const month = locale.month(date, 1).slice(0, 1).toUpperCase() + locale.month(date, 1).slice(1).toLowerCase(); + const year = date.getFullYear(); + var dayOfMonthStr = dayOfMonth.toString(); + if (dayOfMonth === 1 || dayOfMonth === 21 || dayOfMonth === 31) { + dayOfMonthStr += "st"; + } else if (dayOfMonth === 2 || dayOfMonth === 22) { + dayOfMonthStr += "nd"; + } else if (dayOfMonth === 3 || dayOfMonth === 23) { + dayOfMonthStr += "rd"; + } else { + dayOfMonthStr += "th"; + } + const dayOfWeek = locale.dow(date, 0).slice(0, 1).toUpperCase() + locale.dow(date, 0).slice(1).toLowerCase(); + const dateStr = month + " " + dayOfMonthStr + ", " + year + "\n" + dayOfWeek; + g.setFontAlign(0, 0).setFont("DotGothic16").drawString(dateStr, x, y + 48); + if (drawTimeout) clearTimeout(drawTimeout); - drawTimeout = undefined; + drawTimeout = setTimeout(() => { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); } - }); - - Bangle.loadWidgets(); - draw(); - setTimeout(Bangle.drawWidgets, 0); -})(); + + Bangle.setUI({ + mode: "clock", + remove: function() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } + }); + Bangle.loadWidgets(); + draw(); + setTimeout(Bangle.drawWidgets, 0); + applySettings(); + })(); \ No newline at end of file diff --git a/apps/shadowclk/app.png b/apps/shadowclk/app.png index 9d02ed5b4bbb2e4c5002d1b3b2c10c84ae0b9866..c50f7ed61dafde3e84b71fa223a687f8a80dbed9 100644 GIT binary patch delta 2367 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 + + + + + + + 3-Bit Color Picker + + + + +
+

3-Bit Color Picker

+
+ +
+ +
+ +
+ + +
+ + + diff --git a/apps/shadowclk/icon.png b/apps/shadowclk/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..447dffb511a6bb298302bfc47555d32ccbb63134 GIT binary patch literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^^*~(B!3HE_b>dlp6icy_X9x!n)NrJ9FfcHddb&7< zRLpsM_af&Z2N4EGQR@xt+Cdv#0<|}>XLraxdA;z&Igt+>I_2_;({JmY-jw5U>+dhd zAF>}0AK@3a_xWQ$EaSF6Z;KdPzR`SQvI{&AuJ-+=7-H;6%r`t@{m;ceX_Wq`l zn;6n~EZeYgefj$7*RN=V-FbI>V`Ny}j30@Q+B@adkQmCh60wS7s)UF<6MJj_nCq)S v_zGhuG>;ayR?YbQGjZErJWj$X^@cebP0l+XkKo@vS% literal 0 HcmV?d00001 diff --git a/apps/shadowclk/metadata.json b/apps/shadowclk/metadata.json index 972f34ad6..1811dd5e6 100644 --- a/apps/shadowclk/metadata.json +++ b/apps/shadowclk/metadata.json @@ -1,16 +1,34 @@ { "id": "shadowclk", "name": "Shadow Clock", - "version": "0.01", - "description": "A simple clock using the Londrina font with color and a shadowed outline. Based on the Anton Clock.", + "version": "0.02", + "description": "A simple clock using the Londrina font in color with a shadowed outline. Based on the Anton Clock.", "icon": "app.png", - "screenshots": [{"url":"screenshot.png"},{"url":"screenshot-1.png"}], + "screenshots": [{ + "url": "screenshot.png" + }, { + "url": "screenshot-1.png" + }], "type": "clock", "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], + "supports": ["BANGLEJS", "BANGLEJS2"], + //"custom": "custom.html", "allow_emulator": true, - "storage": [ - {"name":"shadowclk.app.js","url":"app.js"}, - {"name":"shadowclk.img","url":"app-icon.js","evaluate":true} - ] + "storage": [{ + "name": "shadowclk.app.js", + "url": "app.js" + }, + { + "name": "shadowclk.settings.js", + "url": "settings.js" + }, + { + "name": "shadowclk.img", + "url": "app-icon.js", + "evaluate": true + } + ], + "data": [{ + "name": "shadowclk.json" + }] } diff --git a/apps/shadowclk/screenshot-1.png b/apps/shadowclk/screenshot-1.png index 3f4e0870ee5c007bcc899b98dc9a65e4b58b45b9..2d4933110df1d029b6835f0ef7e84e687d642368 100644 GIT binary patch literal 3510 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 {1&Eb)7-gw?d&bpP>&_Eo{~EDYn%; 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 diff --git a/apps/shadowclk/screenshot.png b/apps/shadowclk/screenshot.png index 5f05672433958d4180c1373c9bf9270f1813ccaa..790294ca3f274cb48a46826bde0b6c6034219cd6 100644 GIT binary patch literal 3505 zcmds)`8(8$`^Mkzx53O{;UtPk<763G z$37&M?A*^z)rvHKJXrOdl{WL0Shs{w%%-OWdx z;~+CpUOVY7sCX4u6?gEpO`-o)$&1kug)?3r`7m=p6Wfy}n9)f{W?c%!n$nZIH+ss9xor3YXMD zG0*d+`_U$sCG0<7NQ;@V)f(^1@;v0gqZNPX_8%Lv(9$D)Whf635V(0A_-9&mhv!RA ztWr`@|H`)o;z#$3By1fu0wa93(3Er~Z*pjJ`w3kRuyFP?`7geuZ|A;~1L{5}22bIP z8)cjN!#=NnO{6Ok9F|DdNnr)W3icdvqr3CVicCXa?>8(u9Y(^vI@^}ChDKut3gWhx z2G^Yz+T9^rjmEK>Kre;A%q_9-k2AED4wwN=E_*U*cuiF;lTd>HD$K%Z-Lao?S zatn3qn60Sj<%OPAb|;tB=w2z)^^6;MP)jE0(GyMRAf%$&mt37G==x|2qf!e-Ix4r2kDD%^gs2!#JE>~m?&L!Lzn$#R z_$9G_FZ}#b8m#+5NBHyWLhi8ZC>&-`p?Nj;yTc@ldIR`x6Z5q*m#X{+>*{p02fQxJQHZ}Pt)Jft6D=P4~I+s`==N7BQnfrcitAo?oBxC&g(&XAR z?$3lT@THS6|3F$ep1G?M3nV$}Cnt55Dc02nEJ59!JFIuxMqUzn>!~fu?do8&MGp*0 zd#E|xhNuhbOY2f$PXL2T8FI7SdpWF@9)|Cfb``q& z;yNy*sf%x;2jN@pI;L23N#S+|=NcB`tjrnh6~l*b_*R=S(_r{2Cngy`lA7Irz7Z8A$a?(P(W- z4RS8TZ-|Of&BDu<);IL#mA=3aJgVxWcRX?!i0*AE)lV%5wW#IAF!kt*bK5r6qiKR~ z!|5YGE}esvlH1#R^q!YYN{iJ0RFg5mRtLQ zs!}mjd9l|TAJvgjf*Txzwzs&5Ega`Ox+us5Zx0~;ni1LDVIHPyv%V1`LZzY;MpYnx zrfq<&{CjS}_}6)GifwpHLGVeKS@6TCQ6yXDh!jHkp=;1CJ^I^Wd{GK#WSzU<_!sxD z=i`U9pvx?hJ89RIEHV!PlH%0}V86-J4W?$u6r%MvkM#)QE+f^mbW1Bvzu%pXJl&(jlaM^ITBtEAhcB@f<$B@$?}?it@=7U{Uz0KwVxgLX2CXU zk-1#z*auG{S~__Yt}=LtXR9;P9QR9=Cy@kGRbhhiUQ1rd#3ZeX6y`NF82Cc9|Bl_? z9))xrjt(Lekd0WKpumj%acL^Xhbfbtz)a~I)_CDQGHO|CiN!P0zfznQoG3jVUp03(ulRmy$*+BS}T635KdE z(%5=6$X!YM(Z-6cx?*^RPL($8+Q*Tx&eDopwu&2;hG5p-o0%y)<$>8+kgA1A&lfM- zTl`y#BRIR&Pa1>dT*!9_;UOAl{xx#rt;cf%E<0DxzsH0cGSl)K!WQ;;WDv=UB0nA` z0oJ3%HGF;67nmqQ@`KLVva(SYLdQvw@IrJ*J)t!5k|$YDkpJ~a&0G53=8GaF z^iu7IYe59qDac#=8UASXGoEApJgFvOYqUT2d2>L;#=U^!tUH&Nv%iB!s)?a3D@Yy! zZ)i0H+wt8V*ck&A#rIyycLtd#+e;9C+yq=@>aDKNpFU$=8S!qaRfZN}${iyR7SHnX z9AcH-n7~DAJ}-9dxQtR()Z$n^hbeDZo@;m8u$!RwI}5dAu}qX@6+m?6tv+k&81m1* zk8dQSjSe5{97mFfN^`#89d&08a}8sEtsjh%O>@)09_PZ9?E>dbHAjYgaItkKA>U@(e1QKW&WolY{tQZa&K6&l-1xlsu?Ejag2cE{{ei!f`#8KO5pXC`rW|*QzLW3a(zPF{{Wg5RM-Fj literal 2676 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 ayYRInTDGC?DC6sm1l&%ab*gm0XZ!=*Lh}az diff --git a/apps/shadowclk/settings.js b/apps/shadowclk/settings.js new file mode 100644 index 000000000..e76467fb0 --- /dev/null +++ b/apps/shadowclk/settings.js @@ -0,0 +1,58 @@ +(function (back) { + // Constants + const LOC = "shadowclk.json"; + const SYS = "setting.json"; + const teletextColors = ["#000", "#f00", "#0f0", "#ff0", "#00f", "#f0f", "#0ff", "#fff"]; + const teletextColorNames = ["Black", "Red", "Green", "Yellow", "Blue", "Magenta", "Cyan", "White"]; + + // Load and set default settings + let appSettings = Object.assign({ + color: teletextColors[6], + theme: 'light', + }, require('Storage').readJSON(LOC, true) || {}); + + // Save settings to storage + function writeSettings() { + require('Storage').writeJSON(LOC, appSettings); + } + + // Switch theme and save to storage + function switchTheme(mode) { + if (mode === g.theme.dark) return; + let s = require("Storage").readJSON(SYS, 1) || {}; + const cl = x => g.setColor(x).getColor(); + s.theme = mode ? { + fg: cl("#fff"), bg: cl("#000"), fg2: cl("#0ff"), bg2: cl("#000"), fgH: cl("#fff"), bgH: cl("#00f"), dark: true + } : { + fg: cl("#000"), bg: cl("#fff"), fg2: cl("#000"), bg2: cl("#cff"), fgH: cl("#000"), bgH: cl("#0ff"), dark: false + }; + require("Storage").writeJSON("setting.json", s); + if (Bangle.CLOCK) load(global.__FILE__); + } + + // Show settings menu + E.showMenu({ + "": { "title": "Shadow Clock" }, + "< Back": () => back(), + 'Theme:': { + value: (appSettings.theme === 'dark'), + format: v => v ? "Dark" : "Light", + onchange: v => { + const newTheme = v ? 'dark' : 'light'; + switchTheme(newTheme === 'dark'); + appSettings.theme = newTheme; + writeSettings(); + } + }, + 'Color:': { + value: teletextColors.indexOf(appSettings.color), + min: 0, + max: 7, + onchange: v => { + appSettings.color = teletextColors[v]; + writeSettings(); + }, + format: v => teletextColorNames[v] + } + }); +});