From a3c5a723bc052273f0c58b2b6e97e5eed436648f Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 8 Jan 2023 10:53:16 +0100 Subject: [PATCH] Added option to only show the time as well as the week number. This also fixes issue #2459 --- apps/bwclk/ChangeLog | 1 + apps/bwclk/README.md | 10 +++--- apps/bwclk/app.js | 62 ++++++++++++++++++++++++++++++++---- apps/bwclk/metadata.json | 2 +- apps/bwclk/screenshot.png | Bin 2945 -> 2841 bytes apps/bwclk/screenshot_2.png | Bin 3215 -> 3038 bytes apps/bwclk/screenshot_3.png | Bin 3438 -> 3031 bytes 7 files changed, 62 insertions(+), 13 deletions(-) diff --git a/apps/bwclk/ChangeLog b/apps/bwclk/ChangeLog index daebecf8f..6a71769f3 100644 --- a/apps/bwclk/ChangeLog +++ b/apps/bwclk/ChangeLog @@ -27,3 +27,4 @@ 0.26: Use clkinfo.addInteractive instead of a custom implementation 0.27: Clean out some leftovers in the remove function after switching to clkinfo.addInteractive that would cause ReferenceError. +0.28: Option to show (1) time only and (2) week of year. \ No newline at end of file diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index b19e52787..5e2a7b55f 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -3,16 +3,14 @@ A very minimalistic clock. ![](screenshot.png) -## ToDos and known issues -- [ ] The clkinfo is always shown and its, therefore, not possible to only show the time as shown in the screenshot. -- [ ] The weeknumber is currently not an option in clkinfo. -- [ ] Its not possible to run clkinfo items (e.g. trigger home assistant). - ## Features The BW clock implements features that are exposed by other apps through the `clkinfo` module. For example, if you install the HomeAssistant app, this menu item will be shown if you first touch the bottom of the screen and then swipe left/right to the home assistant menu. To select -sub-items simply swipe up/down. +sub-items simply swipe up/down. To run an action (e.g. trigger home assistant), simply select the clkinfo (border) and touch on the item again. See also the screenshot below: + +![](screenshot_3.png) + ## Settings - Screen: Normal (widgets shown), Dynamic (widgets shown if unlocked) or Full (widgets are hidden). diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 3f142a066..580c6102e 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -100,12 +100,45 @@ let imgLock = function() { * Clock Info */ let clockInfoItems = clock_info.load(); + +// Add some custom clock-infos +function weekOfYear() { + var date = new Date(); + date.setHours(0, 0, 0, 0); + // Thursday in current week decides the year. + date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7); + // January 4 is always in week 1. + var week1 = new Date(date.getFullYear(), 0, 4); + // Adjust to Thursday in week 1 and count number of weeks from date to week1. + return 1 + Math.round(((date.getTime() - week1.getTime()) / 86400000 + - 3 + (week1.getDay() + 6) % 7) / 7); +} + +clockInfoItems[0].items.unshift({ name : "weekofyear", + get : function() { return { text : "Week " + weekOfYear(), + img : null}}, + show : function() {}, + hide : function() {}, +}) + +// Empty for large time +clockInfoItems[0].items.unshift({ name : "nop", + get : function() { return { text : null, + img : null}}, + show : function() {}, + hide : function() {}, +}) + + + let clockInfoMenu = clock_info.addInteractive(clockInfoItems, { x : 0, y: 135, w: W, h: H-135, draw : (itm, info, options) => { + var isLarge = info.text == null; + g.setColor(g.theme.fg); g.fillRect(options.x, options.y, options.x+options.w, options.y+options.h); @@ -113,11 +146,18 @@ let clockInfoMenu = clock_info.addInteractive(clockInfoItems, { g.setColor(g.theme.bg); if (options.focus){ - g.drawRect(options.x, options.y, options.x+options.w-2, options.y+options.h-1); // show if focused - g.drawRect(options.x+1, options.y+1, options.x+options.w-3, options.y+options.h-2); // show if focused + var y = isLarge ? options.y+20 : options.y+2; + var h = isLarge ? options.h-20 : options.h-2; + g.drawRect(options.x, y, options.x+options.w-2, y+h-1); // show if focused + g.drawRect(options.x+1, y+1, options.x+options.w-3, y+h-2); // show if focused } // Set text and font + if(isLarge){ + drawTime(); + return; + } + var image = info.img; var text = String(info.text); if(text.split('\n').length > 1){ @@ -137,6 +177,8 @@ let clockInfoMenu = clock_info.addInteractive(clockInfoItems, { g.drawImage(image, midx-parseInt(imgWidth*1.3/2)-parseInt(strWidth/2), options.y+6, {scale: scale}); } g.drawString(text, midx+parseInt(imgWidth*1.3/2), options.y+20); + + drawTime(); } }); @@ -187,6 +229,8 @@ let drawDate = function() { let drawTime = function() { + var isLarge = clockInfoMenu.menuA == 0 && clockInfoMenu.menuB == 0; + // Draw background var y1 = getLineY(); var y = y1; @@ -199,13 +243,19 @@ let drawTime = function() { var timeStr = hours + colon + minutes; // Set y coordinates correctly - y += parseInt((H - y)/2)-10; + y += parseInt((H - y)/2) + 5; - // Clear region + if (isLarge){ + g.setLargeFont(); + } else { + y -= 15; + g.setMediumFont(); + } + + // Clear region and draw time g.setColor(g.theme.fg); - g.fillRect(0,y1,W,y+20); + g.fillRect(0,y1,W,y+20 + (isLarge ? 1 : 0)); - g.setMediumFont(); g.setColor(g.theme.bg); g.setFontAlign(0,0); g.drawString(timeStr, W/2, y); diff --git a/apps/bwclk/metadata.json b/apps/bwclk/metadata.json index 2f628a6b9..7c5d285e3 100644 --- a/apps/bwclk/metadata.json +++ b/apps/bwclk/metadata.json @@ -1,7 +1,7 @@ { "id": "bwclk", "name": "BW Clock", - "version": "0.27", + "version": "0.28", "description": "A very minimalistic clock.", "readme": "README.md", "icon": "app.png", diff --git a/apps/bwclk/screenshot.png b/apps/bwclk/screenshot.png index 3a75f13d1694d1f6bfeeedc1c2ed2d45f8c7b3b7..37acf7cc07edd69a42f300923ecb8bfbec97a9cc 100644 GIT binary patch literal 2841 zcmd5;`#;kQAOC)LVTM>7jNF=2r<1OzVI-HP6K2(UNX#lW8Kv7WVarLkF^-azOD+c| zvPna^H06@!k|(se%oL$b+c~+maC&}x{($H8dVY9+-mmu$pV#}R&-?Sf;qQmnMVcZ3 z0MI???Roe+^Zx^c#`npqn;?BB@WNrdJ5bfLVFmz@Zx4FzKN?4x%^N;Hfz|QYySCOR z`P7e{tdD{=zB2Mse5mzg33nYI?d-aon4FxvR<<_bM$~ME#q>?ss5?N=R{s}gE9Rk& z&3{1xb#Bw$fV=60_i(<+PqR#5yLmyYHhGu-5C{f4x!y1qo_z2G3aP(%dHoJ%o7-tk zSj^0l4GAzN%j9zT;qb-KO@=}P=w;2%M0!9*nMRzY>^Nv{%{Y7wF4KEMh`c}fv;avy zL@s{uIKo6rS1seqDd6_w9frX1LdpFM_<7Hlh>UGY*KC0VXbMqYViwDyG!D4s?|+Gc zY2OYwB0m0Mdh%aX^;$rZ*KU<7f(OZk`@!C$?Q^eES<0HVnpGt3qxt*KxLbIF$2U`< z(GgohS(^}TA3UFZu1FOI-Z6Q^# z+X4%d&o~dfP5v3(a*HjMZdcw*EIM$&@~52_HSWjK@!e#!k%@@S2q2Q zjMfw8g)3Hmc;vw=SeC71+9!lq`xoAQk|#uvhg!0(Mx5L&P+DX(taK4N-z-DKOAbLc zs%b&1_Uj*DnWQ&~Vx+}|0mq6hOl>gN@kY&fI2hL3lpwyOdEmqN81LII0*?48_TWWG z03d#kuM<2{3c0E?GX7h>Sw!*IXx*5Fl|`-VV@oCbkj?C8(I91f{+p|6a}F^p5Ljy? z0ikRVX2k&BBq`@mLdeooFX!0vLxQBXADK;@^5{^JR_^kVCtX247w-x03F{2RPL5QV zxMF6>ECwA)+^rWLmbOXNq7tLcU-{PUFC4*EQeL*8nE zZCJp(L<=`;S@2vzEqyL-h3GxwRf8MSsw0*Zd1!J4Uh%S}>Wgbhb|S}*Y*-(@9^Z1~ zGrlR%61K-4rgw#&?Dxl*I*$S=mZ4gG+;ni|>mH&;dm#zI9VD=-3a?07FxOe0n9Ukp zT!K*mN*i9uN4WFSGYd)JtEBJu+4QHyLK?FJ*@MuXHn)kigz{qRG~-`94mJkzq;4#eR;awKCxa9;+uE0$OY$gy;2>jiA54M z?CnnTas6s(ZijhYRAo|cPZ`(o6`C+&V|%JzUsKv1*MPG`T=Ib{=*GW z#l%PeWdT7>FdDMfOvUc(Hjnd;{rOoV6cV?5{oNUVfS0HIdsIs{i6J%Y2OH_lqS(#M zyPUXL4Y+D(dHYx%KyrOAFf$a=rW!8C{?}6C>b-X5WW&)Ek&_kkZdxt=6r>*CBcgBl z{})?;;$+9HWn&u`dhvxt2mEQ(bkESsxi!x*cKV~KC>Lwyv2kvZ#Exgx+5bDdsBYbd zwpU5qFZd~$hIpf^$Wz2c+_d$b&L#5fNNh!>W5JBe!#*88KJIAARM+ONQ#~ev)W2*# zsk!uz!L(jfp1lw?j$&nAKw~gNIbSh@JM-Dow;bOM^8$9jV~*AbjC8Q4CG0{}qR)!L zfxTJcvWt2^Jr|J*P!WrW1f-N$kY0R(G)w(k^)<1K>$ta=TCs2%tTm-ajXYaB)jZJ1 z7FIgsG(T38dqx&foi83X;eo_yd}&Mx9p?YUINp}I zW5Wo$LEDH+V{NR-)|8>FtgwCZS6Re+eNVH4IWCleR09*P$jA3k@v$^7sp&QbI=P6J zu^ED$-nm;0@uWPesLjV>B4(8Il1qk-l9Yo6O9jyEYvWo>6q(pm-VFFHbu?#oX6xJ0 ze$_OI-?g4Zf#7@aP1Rk~>n^)H(ku)f|B*c(y$7Oyp>2PLR}WrrYz(F<0g9PQ+0$Xs zm1@cQzVSrOCpZ&GJz8jl&56xH&D%P_RlfoFGK-6wETV9-q_dju}9bS0= z#G!-;oCb+6l77T=Zq3TDBw|Me5zr>LZn%n`%`s{+j*$=WBW)5VJC~21NxOeIt!#RC=LRs37VQmH?(fi3qeyy2FNEm`&sA7 z4tJnfWMK9=LMk_Ya8$FRZ%QGjPFgYb{;Vb>eM~gC>S$_9>qRsCdn-$4fYqF=fsww5 zqwnlSiN2c$`|HW{pxyd*snO$sY!S=^q$HZp zD`pHrI{bZ0PKR0!e669kZ~YA}E3Pj1xQ*f^3%?ljf`5e}u$Z?TXdT4Md*+S{e4SZn z>|+RZ)ADhC9K%x$xq&H-Phmt_LbeS# zKkQvV4-nVMx^u3x(52O2lVII));Q<{ozE|{)+O7}`{hOkH9BSkhbEszt;6j0ehLlP z6FNlu{x4`#??_F+8ID^t6c#i4ZK%RnIEyNeW&%}tp$YSldKZX5S6?XjLgSHuI{brL z5K>Q1njO%VEg<^$xB>5acufp&#DX=XfshR?3j%g9hcW)c02u82eBl#3CIJ>{_P;V= bu7T|roXdI-%T9jpy1+p%KhG+6@|Ax8FvV5G literal 2945 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 Xv5wplOP_VhnHo6ce*6G$KRMwa>ezR( diff --git a/apps/bwclk/screenshot_2.png b/apps/bwclk/screenshot_2.png index 31bf6373ef212f3f10d427f8052c672c41d67453..8d2f1717f7bbebcac6557e2d6e475741f708ab67 100644 GIT binary patch literal 3038 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 literal 3215 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 delta 3423 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