From 670c232f28e0c746ae8f356c81a8f65e4fef340f Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 6 Jan 2022 06:33:01 +0100 Subject: [PATCH 01/86] Create LICENSE --- apps/colorful_clock/LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 apps/colorful_clock/LICENSE diff --git a/apps/colorful_clock/LICENSE b/apps/colorful_clock/LICENSE new file mode 100644 index 000000000..7487dd5da --- /dev/null +++ b/apps/colorful_clock/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Andreas Rozek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 49bee5390bff6e8c03710fb094227b0f5b45f5e9 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 6 Jan 2022 06:33:06 +0100 Subject: [PATCH 02/86] Create LICENSE --- apps/themesetter/LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 apps/themesetter/LICENSE diff --git a/apps/themesetter/LICENSE b/apps/themesetter/LICENSE new file mode 100644 index 000000000..7487dd5da --- /dev/null +++ b/apps/themesetter/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Andreas Rozek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 754e752a8bd292bdcccf73f3eb8a7ef172cd99cb Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 6 Jan 2022 06:33:09 +0100 Subject: [PATCH 03/86] Create LICENSE --- apps/simple_clock/LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 apps/simple_clock/LICENSE diff --git a/apps/simple_clock/LICENSE b/apps/simple_clock/LICENSE new file mode 100644 index 000000000..7487dd5da --- /dev/null +++ b/apps/simple_clock/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Andreas Rozek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 117348cb16f74003180f4474c125efca0523e98e Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 6 Jan 2022 06:33:17 +0100 Subject: [PATCH 04/86] Create app.js --- apps/configurable_clock/app.js | 1336 ++++++++++++++++++++++++++++++++ 1 file changed, 1336 insertions(+) create mode 100644 apps/configurable_clock/app.js diff --git a/apps/configurable_clock/app.js b/apps/configurable_clock/app.js new file mode 100644 index 000000000..19dc363e4 --- /dev/null +++ b/apps/configurable_clock/app.js @@ -0,0 +1,1336 @@ + let Layout = require('Layout'); + + let Caret = require("heatshrink").decompress(atob("hEUgMAsFgmEwjEYhkMg0GAYIHBBYIPBgAA==")); + + let ScreenWidth = g.getWidth(), CenterX; + let ScreenHeight = g.getHeight(), CenterY, outerRadius; + + Bangle.loadWidgets(); + +/**** updateClockFaceSize ****/ + + function updateClockFaceSize () { + CenterX = ScreenWidth/2; + CenterY = ScreenHeight/2; + + outerRadius = Math.min(CenterX,CenterY) * 0.9; + + if (global.WIDGETS == null) { return; } + + let WidgetLayouts = { + tl:{ x:0, y:0, Direction:0 }, + tr:{ x:ScreenWidth-1, y:0, Direction:1 }, + bl:{ x:0, y:ScreenHeight-24, Direction:0 }, + br:{ x:ScreenWidth-1, y:ScreenHeight-24, Direction:1 } + }; + + for (let Widget of WIDGETS) { + let WidgetLayout = WidgetLayouts[Widget.area]; // reference, not copy! + if (WidgetLayout == null) { continue; } + + Widget.x = WidgetLayout.x - WidgetLayout.Direction * Widget.width; + Widget.y = WidgetLayout.y; + + WidgetLayout.x += Widget.width * (1-2*WidgetLayout.Direction); + } + + let x,y, dx,dy; + let cx = CenterX, cy = CenterY, r = outerRadius, r2 = r*r; + + x = WidgetLayouts.tl.x; y = WidgetLayouts.tl.y+24; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY + 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + x = WidgetLayouts.tr.x; y = WidgetLayouts.tr.y+24; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY + 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + x = WidgetLayouts.bl.x; y = WidgetLayouts.bl.y; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY - 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + x = WidgetLayouts.br.x; y = WidgetLayouts.br.y; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY - 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + CenterX = cx; CenterY = cy; outerRadius = r * 0.9; + } + + updateClockFaceSize(); + +/**** custom version of Bangle.drawWidgets (does not clear the widget areas) ****/ + + Bangle.drawWidgets = function () { + var w = g.getWidth(), h = g.getHeight(); + + var pos = { + tl:{x:0, y:0, r:0, c:0}, // if r==1, we're right->left + tr:{x:w-1, y:0, r:1, c:0}, + bl:{x:0, y:h-24, r:0, c:0}, + br:{x:w-1, y:h-24, r:1, c:0} + }; + + if (global.WIDGETS) { + for (var wd of WIDGETS) { + var p = pos[wd.area]; + if (!p) continue; + + wd.x = p.x - p.r*wd.width; + wd.y = p.y; + + p.x += wd.width*(1-2*p.r); + p.c++; + } + + g.reset(); // also loads the current theme + + if (pos.tl.c || pos.tr.c) { + g.setClipRect(0,h-24,w-1,h-1); + g.reset(); // also (re)loads the current theme + } + + if (pos.bl.c || pos.br.c) { + g.setClipRect(0,h-24,w-1,h-1); + g.reset(); // also (re)loads the current theme + } + + try { + for (wd of WIDGETS) { + g.clearRect(wd.x,wd.y, wd.x+wd.width-1,23); + wd.draw(wd); + } + } catch (e) { print(e); } + } + }; + +/**** EventConsumerAtPoint ****/ + + let activeLayout; + + function EventConsumerAtPoint (HandlerName, x,y) { + let Layout = (activeLayout || {}).l; + if (Layout == null) { return; } + + function ConsumerIn (Control) { + if ( + (x < Control.x) || (x >= Control.x + Control.w) || + (y < Control.y) || (y >= Control.y + Control.h) + ) { return undefined; } + + if (typeof Control[HandlerName] === 'function') { return Control; } + + if (Control.c != null) { + let ControlList = Control.c; + for (let i = 0, l = ControlList.length; i < l; i++) { + let Consumer = ConsumerIn(ControlList[i]); + if (Consumer != null) { return Consumer; } + } + } + + return undefined; + } + + return ConsumerIn(Layout); + } + +/**** dispatchTouchEvent ****/ + + function dispatchTouchEvent (DefaultHandler) { + function handleTouchEvent (Button, xy) { + if (activeLayout == null) { + if (typeof DefaultHandler === 'function') { + DefaultHandler(); + } + } else { + let Control = EventConsumerAtPoint('onTouch', xy.x,xy.y); + if (Control != null) { + Control.onTouch(Control, Button, xy); + } + } + } + Bangle.on('touch',handleTouchEvent); + } + dispatchTouchEvent(); + +/**** dispatchStrokeEvent ****/ + + function dispatchStrokeEvent (DefaultHandler) { + function handleStrokeEvent (Coordinates) { + if (activeLayout == null) { + if (typeof DefaultHandler === 'function') { + DefaultHandler(); + } + } else { + let Control = EventConsumerAtPoint('onStroke', Coordinates.xy[0],Coordinates.xy[1]); + if (Control != null) { + Control.onStroke(Control, Coordinates); + } + } + } + Bangle.on('stroke',handleStrokeEvent); + } + dispatchStrokeEvent(); +/**** Label ****/ + + function Label (Text, Options) { + function renderLabel (Details) { + let x = Details.x, xAlignment = Details.halign || 0; + let y = Details.y, yAlignment = Details.valign || 0; + + let Width = Details.w, halfWidth = Width/2; + let Height = Details.h, halfHeight = Height/2; + + let Border = Details.border || 0, BorderColor = Details.BorderColor; + let Padding = Details.pad || 0; + let Hilite = Details.hilite || false; + let bold = Details.bold ? 1 : 0; + + if (Hilite || (Details.bgCol != null)) { + g.setBgColor(Hilite ? g.theme.bgH : Details.bgCol); + g.clearRect(x,y, x + Width-1,y + Height-1); + } + + if ((Border > 0) && (BorderColor !== null)) {// draw border of layout cell + g.setColor(BorderColor || Details.col || g.theme.fg); + + switch (Border) { + case 2: g.drawRect(x+1,y+1, x+Width-2,y+Height-2);// no break here! + case 1: g.drawRect(x,y, x+Width-1,y+Height-1); break; + default: g.fillPoly([ + x,y, x+Width,y, x+Width,y+Height, x,y+Height, x,y, + x+Border,y+Border, x+Border,y+Height-Border, + x+Width-Border,y+Height-Border, x+Width-Border,y+Border, + x+Border,y+Border + ]); + } + } + + g.setClipRect( + x+Border+Padding,y+Border+Padding, + x + Width-Border-Padding-1,y + Height-Border-Padding-1 + ); + + x += halfWidth + xAlignment*(halfWidth - Border - Padding); + y += halfHeight + yAlignment*(halfHeight - Border - Padding); + + g.setColor (Hilite ? g.theme.fgH : Details.col || g.theme.fg); + g.setBgColor(Hilite ? g.theme.bgH : Details.bgCol || g.theme.bg); + + if (Details.font != null) { g.setFont(Details.font); } + g.setFontAlign(xAlignment,yAlignment); + + g.drawString(Details.label, x,y); + if (bold !== 0) { + g.drawString(Details.label, x+1,y); + g.drawString(Details.label, x,y+1); + g.drawString(Details.label, x+1,y+1); + } + } + + let Result = Object.assign(( + Options == null ? {} : Object.assign({}, Options.common || {}, Options) + ), { + type:'custom', render:renderLabel, label:Text || '' + }); + let Border = Result.border || 0; + let Padding = Result.pad || 0; + + let TextMetrics; + if (! Result.width || ! Result.height) { + if (Result.font == null) { + Result.font = g.getFont(); + } else { + g.setFont(Result.font); + } + TextMetrics = g.stringMetrics(Result.label); + } + + if (Result.col == null) { Result.col = g.getColor(); } + if (Result.bgCol == null) { Result.bgCol = g.getBgColor(); } + + Result.width = Result.width || TextMetrics.width + 2*Border + 2*Padding; + Result.height = Result.height || TextMetrics.height + 2*Border + 2*Padding; + return Result; + } + +/**** Image ****/ + + function Image (Image, Options) { + function renderImage (Details) { + let x = Details.x, xAlignment = Details.halign || 0; + let y = Details.y, yAlignment = Details.valign || 0; + + let Width = Details.w, halfWidth = Width/2 - Details.ImageWidth/2; + let Height = Details.h, halfHeight = Height/2 - Details.ImageHeight/2; + + let Border = Details.border || 0, BorderColor = Details.BorderColor; + let Padding = Details.pad || 0; + let Hilite = Details.hilite || false; + + if (Hilite || (Details.bgCol != null)) { + g.setBgColor(Hilite ? g.theme.bgH : Details.bgCol); + g.clearRect(x,y, x + Width-1,y + Height-1); + } + + if ((Border > 0) && (BorderColor !== null)) {// draw border of layout cell + g.setColor(BorderColor || Details.col || g.theme.fg); + + switch (Border) { + case 2: g.drawRect(x+1,y+1, x+Width-2,y+Height-2);// no break here! + case 1: g.drawRect(x,y, x+Width-1,y+Height-1); break; + default: g.fillPoly([ + x,y, x+Width,y, x+Width,y+Height, x,y+Height, x,y, + x+Border,y+Border, x+Border,y+Height-Border, + x+Width-Border,y+Height-Border, x+Width-Border,y+Border, + x+Border,y+Border + ]); + } + } + + g.setClipRect( + x+Border+Padding,y+Border+Padding, + x + Width-Border-Padding-1,y + Height-Border-Padding-1 + ); + + x += halfWidth + xAlignment*(halfWidth - Border - Padding); + y += halfHeight + yAlignment*(halfHeight - Border - Padding); + + if ('rotate' in Details) { // "rotate" centers image at x,y! + x += Details.ImageWidth/2; + y += Details.ImageHeight/2; + } + + g.setColor (Hilite ? g.theme.fgH : Details.col || g.theme.fg); + g.setBgColor(Hilite ? g.theme.bgH : Details.bgCol || g.theme.bg); + + g.drawImage(Image, x,y, Details.ImageOptions); + } + + let Result = Object.assign(( + Options == null ? {} : Object.assign({}, Options.common || {}, Options) + ), { + type:'custom', render:renderImage, Image:Image + }); + let ImageMetrics = g.imageMetrics(Image); + let Scale = Result.scale || 1; + let Border = Result.border || 0; + let Padding = Result.pad || 0; + + Result.ImageWidth = Scale * ImageMetrics.width; + Result.ImageHeight = Scale * ImageMetrics.height; + + if (('rotate' in Result) || ('scale' in Result) || ('frame' in Result)) { + Result.ImageOptions = {}; + if ('rotate' in Result) { Result.ImageOptions.rotate = Result.rotate; } + if ('scale' in Result) { Result.ImageOptions.scale = Result.scale; } + if ('frame' in Result) { Result.ImageOptions.frame = Result.frame; } + } + + Result.width = Result.width || Result.ImageWidth + 2*Border + 2*Padding; + Result.height = Result.height || Result.ImageHeight + 2*Border + 2*Padding; + return Result; + } + +/**** Drawable ****/ + + function Drawable (Callback, Options) { + function renderDrawable (Details) { + let x = Details.x, xAlignment = Details.halign || 0; + let y = Details.y, yAlignment = Details.valign || 0; + + let Width = Details.w, DrawableWidth = Details.DrawableWidth || Width; + let Height = Details.h, DrawableHeight = Details.DrawableHeight || Height; + + let halfWidth = Width/2 - DrawableWidth/2; + let halfHeight = Height/2 - DrawableHeight/2; + + let Border = Details.border || 0, BorderColor = Details.BorderColor; + let Padding = Details.pad || 0; + let Hilite = Details.hilite || false; + + if (Hilite || (Details.bgCol != null)) { + g.setBgColor(Hilite ? g.theme.bgH : Details.bgCol); + g.clearRect(x,y, x + Width-1,y + Height-1); + } + + if ((Border > 0) && (BorderColor !== null)) {// draw border of layout cell + g.setColor(BorderColor || Details.col || g.theme.fg); + + switch (Border) { + case 2: g.drawRect(x+1,y+1, x+Width-2,y+Height-2);// no break here! + case 1: g.drawRect(x,y, x+Width-1,y+Height-1); break; + default: g.fillPoly([ + x,y, x+Width,y, x+Width,y+Height, x,y+Height, x,y, + x+Border,y+Border, x+Border,y+Height-Border, + x+Width-Border,y+Height-Border, x+Width-Border,y+Border, + x+Border,y+Border + ]); + } + } + + let DrawableX = x + halfWidth + xAlignment*(halfWidth - Border - Padding); + let DrawableY = y + halfHeight + yAlignment*(halfHeight - Border - Padding); + + g.setClipRect( + Math.max(x+Border+Padding,DrawableX), + Math.max(y+Border+Padding,DrawableY), + Math.min(x+Width -Border-Padding,DrawableX+DrawableWidth)-1, + Math.min(y+Height-Border-Padding,DrawableY+DrawableHeight)-1 + ); + + g.setColor (Hilite ? g.theme.fgH : Details.col || g.theme.fg); + g.setBgColor(Hilite ? g.theme.bgH : Details.bgCol || g.theme.bg); + + Callback(DrawableX,DrawableY, DrawableWidth,DrawableHeight, Details); + } + + let Result = Object.assign(( + Options == null ? {} : Object.assign({}, Options.common || {}, Options) + ), { + type:'custom', render:renderDrawable, cb:Callback + }); + let DrawableWidth = Result.DrawableWidth || 10; + let DrawableHeight = Result.DrawableHeight || 10; + + let Border = Result.border || 0; + let Padding = Result.pad || 0; + + Result.width = Result.width || DrawableWidth + 2*Border + 2*Padding; + Result.height = Result.height || DrawableHeight + 2*Border + 2*Padding; + return Result; + } + + if (g.drawRoundedRect == null) { + g.drawRoundedRect = function drawRoundedRect (x1,y1, x2,y2, r) { + let x,y; + if (x1 > x2) { x = x1; x1 = x2; x2 = x; } + if (y1 > y2) { y = y1; y1 = y2; y2 = y; } + + r = Math.min(r || 0, (x2-x1)/2, (y2-y1)/2); + + let cx1 = x1+r, cx2 = x2-r; + let cy1 = y1+r, cy2 = y2-r; + + this.drawLine(cx1,y1, cx2,y1); + this.drawLine(cx1,y2, cx2,y2); + this.drawLine(x1,cy1, x1,cy2); + this.drawLine(x2,cy1, x2,cy2); + + x = r; y = 0; + + let dx,dy, Error = 0; + while (y <= x) { + dy = 1 + 2*y; y++; Error -= dy; + if (Error < 0) { + dx = 1 - 2*x; x--; Error -= dx; + } + + this.setPixel(cx1 - x, cy1 - y); this.setPixel(cx1 - y, cy1 - x); + this.setPixel(cx2 + x, cy1 - y); this.setPixel(cx2 + y, cy1 - x); + this.setPixel(cx2 + x, cy2 + y); this.setPixel(cx2 + y, cy2 + x); + this.setPixel(cx1 - x, cy2 + y); this.setPixel(cx1 - y, cy2 + x); + } + }; + } + + if (g.fillRoundedRect == null) { + g.fillRoundedRect = function fillRoundedRect (x1,y1, x2,y2, r) { + let x,y; + if (x1 > x2) { x = x1; x1 = x2; x2 = x; } + if (y1 > y2) { y = y1; y1 = y2; y2 = y; } + + r = Math.min(r || 0, (x2-x1)/2, (y2-y1)/2); + + let cx1 = x1+r, cx2 = x2-r; + let cy1 = y1+r, cy2 = y2-r; + + this.fillRect(x1,cy1, x2,cy2); + + x = r; y = 0; + + let dx,dy, Error = 0; + while (y <= x) { + dy = 1 + 2*y; y++; Error -= dy; + if (Error < 0) { + dx = 1 - 2*x; x--; Error -= dx; + } + + this.drawLine(cx1 - x, cy1 - y, cx2 + x, cy1 - y); + this.drawLine(cx1 - y, cy1 - x, cx2 + y, cy1 - x); + this.drawLine(cx1 - x, cy2 + y, cx2 + x, cy2 + y); + this.drawLine(cx1 - y, cy2 + x, cx2 + y, cy2 + x); + } + }; + } + + +/**** Button ****/ + + function Button (Text, Options) { + function renderButton (Details) { + let x = Details.x, Width = Details.w, halfWidth = Width/2; + let y = Details.y, Height = Details.h, halfHeight = Height/2; + + let Padding = Details.pad || 0; + let Hilite = Details.hilite || false; + + if (Details.bgCol != null) { + g.setBgColor(Details.bgCol); + g.clearRect(x,y, x + Width-1,y + Height-1); + } + + if (Hilite) { + g.setColor(g.theme.bgH); // no typo! + g.fillRoundedRect(x+Padding,y+Padding, x+Width-Padding-1,y+Height-Padding-1,8); + } + + g.setColor (Hilite ? g.theme.fgH : Details.col || g.theme.fg); + g.setBgColor(Hilite ? g.theme.bgH : Details.bgCol || g.theme.bg); + + if (Details.font != null) { g.setFont(Details.font); } + g.setFontAlign(0,0); + + g.drawRoundedRect(x+Padding,y+Padding, x+Width-Padding-1,y+Height-Padding-1,8); + + g.setClipRect(x+Padding,y+Padding, x+Width-Padding-1,y+Height-Padding-1); + + g.drawString(Details.label, x+halfWidth,y+halfHeight); + g.drawString(Details.label, x+halfWidth+1,y+halfHeight); + g.drawString(Details.label, x+halfWidth,y+halfHeight+1); + g.drawString(Details.label, x+halfWidth+1,y+halfHeight+1); + } + + let Result = Object.assign(( + Options == null ? {} : Object.assign({}, Options.common || {}, Options) + ), { + type:'custom', render:renderButton, label:Text || 'Tap' + }); + let Padding = Result.pad || 0; + + let TextMetrics; + if (! Result.width || ! Result.height) { + if (Result.font == null) { + Result.font = g.getFont(); + } else { + g.setFont(Result.font); + } + TextMetrics = g.stringMetrics(Result.label); + } + + Result.width = Result.width || TextMetrics.width + 2*10 + 2*Padding; + Result.height = Result.height || TextMetrics.height + 2*5 + 2*Padding; + return Result; + } + + const Checkbox_checked = require("heatshrink").decompress(atob("ikUgMf/+GgEGoEAlEAgOAgEYsFhw8OjE54OB/EYh4OB+EYj+BwecjFw8OGg0YDocUgECsEAsP//A")); + const Checkbox_unchecked = require("heatshrink").decompress(atob("ikUgMf/+GgEGoEAlEAgOAgEYAjkUgECsEAsP//A=")); + +/**** Checkbox ****/ + + function Checkbox (Options) { + function renderCheckbox (Details) { + let x = Details.x, xAlignment = Details.halign || 0; + let y = Details.y, yAlignment = Details.valign || 0; + + let Width = Details.w, halfWidth = Width/2 - 10; + let Height = Details.h, halfHeight = Height/2 - 10; + + let Padding = Details.pad || 0; + + if (Details.bgCol != null) { + g.setBgColor(Details.bgCol); + g.clearRect(x,y, x + Width-1,y + Height-1); + } + + x += halfWidth + xAlignment*(halfWidth - Padding); + y += halfHeight + yAlignment*(halfHeight - Padding); + + g.setColor (Details.col || g.theme.fg); + g.setBgColor(Details.bgCol || g.theme.bg); + + g.drawImage( + Details.checked ? Checkbox_checked : Checkbox_unchecked, x,y + ); + } + + let Result = Object.assign(( + Options == null ? {} : Object.assign({}, Options.common || {}, Options) + ), { + type:'custom', render:renderCheckbox, onTouch:toggleCheckbox + }); + let Padding = Result.pad || 0; + + Result.width = Result.width || 20 + 2*Padding; + Result.height = Result.height || 20 + 2*Padding; + + if (Result.checked == null) { Result.checked = false; } + return Result; + } + + /* private */ function toggleCheckbox (Control) { + g.reset(); + + Control.checked = ! Control.checked; + Control.render(Control); + + if (typeof Control.onChange === 'function') { + Control.onChange(Control); + } + } + +/**** toggleInnerCheckbox ****/ + + /* export */ function toggleInnerCheckbox (Control) { + if (Control.c == null) { + if (('checked' in Control) && ! ('GroupName' in Control)) { + toggleCheckbox(Control); + return true; + } + } else { + let ControlList = Control.c; + for (let i = 0, l = ControlList.length; i < l; i++) { + let done = toggleInnerCheckbox(ControlList[i]); + if (done) { return true; } + } + } + } + + const Radiobutton_checked = require("heatshrink").decompress(atob("ikUgMB/EAsFgjEBwUAgkggFEgECoEAlEPgOB/EYj+BAgmA+EUCYciDodBwEYg0GgEfwA")); + const Radiobutton_unchecked = require("heatshrink").decompress(atob("ikUgMB/EAsFgjEBwUAgkggFEgECoEAlEAgOAgEYAhEUCYciDodBwEYg0GgEfwAA=")); + +/**** Radiobutton ****/ + + function Radiobutton (Options) { + function renderRadiobutton (Details) { + let x = Details.x, xAlignment = Details.halign || 0; + let y = Details.y, yAlignment = Details.valign || 0; + + let Width = Details.w, halfWidth = Width/2 - 10; + let Height = Details.h, halfHeight = Height/2 - 10; + + let Padding = Details.pad || 0; + + if (Details.bgCol != null) { + g.setBgColor(Details.bgCol); + g.clearRect(x,y, x + Width-1,y + Height-1); + } + + x += halfWidth + xAlignment*(halfWidth - Padding); + y += halfHeight + yAlignment*(halfHeight - Padding); + + g.setColor (Details.col || g.theme.fg); + g.setBgColor(Details.bgCol || g.theme.bg); + + g.drawImage( + Details.checked ? Radiobutton_checked : Radiobutton_unchecked, x,y + ); + } + + let Result = Object.assign(( + Options == null ? {} : Object.assign({}, Options.common || {}, Options) + ), { + type:'custom', render:renderRadiobutton, onTouch:checkRadiobutton + }); + let Padding = Result.pad || 0; + + Result.width = Result.width || 20 + 2*Padding; + Result.height = Result.height || 20 + 2*Padding; + + if (Result.checked == null) { Result.checked = false; } + return Result; + } + + /* private */ function checkRadiobutton (Control) { + if (! Control.checked) { + uncheckRadiobuttonsIn((activeLayout || {}).l,Control.GroupName); + toggleRadiobutton(Control); + + if (typeof Control.onChange === 'function') { + Control.onChange(Control); + } + } + } + + /* private */ function toggleRadiobutton (Control) { + g.reset(); + + Control.checked = ! Control.checked; + Control.render(Control); + } + + /* private */ function uncheckRadiobuttonsIn (Control,GroupName) { + if ((Control == null) || (GroupName == null)) { return; } + + if (Control.c == null) { + if (('checked' in Control) && (Control.GroupName === GroupName)) { + if (Control.checked) { toggleRadiobutton(Control); } + } + } else { + let ControlList = Control.c; + for (let i = 0, l = ControlList.length; i < l; i++) { + uncheckRadiobuttonsIn(ControlList[i],GroupName); + } + } + } + +/**** checkInnerRadiobutton ****/ + + /* export */ function checkInnerRadiobutton (Control) { + if (Control.c == null) { + if (('checked' in Control) && ('GroupName' in Control)) { + checkRadiobutton(Control); + return true; + } + } else { + let ControlList = Control.c; + for (let i = 0, l = ControlList.length; i < l; i++) { + let done = checkInnerRadiobutton(ControlList[i]); + if (done) { return true; } + } + } + } + + + let Theme = g.theme; + g.clear(true); + +/**** Settings ****/ + + let Settings; + + function readSettings () { + Settings = Object.assign({}, + { + Face:'1-12', colored:true, + Hands:'rounded', withSeconds:true, + Foreground:'Theme', Background:'Theme', Seconds:'#FF0000' + }, + require('Storage').readJSON('configurable_clock.json', true) || {} + ); + + prepareTransformedPolygon(); + } + + function saveSettings () { + require('Storage').writeJSON('configurable_clock.json', Settings); + prepareTransformedPolygon(); + } + + function prepareTransformedPolygon () { + switch (Settings.Hands) { + case 'simple': transformedPolygon = new Array(simpleHourHandPolygon.length); break; + case 'rounded': transformedPolygon = new Array(roundedHandPolygon.length); break; + case 'hollow': transformedPolygon = new Array(hollowHandPolygon.length); + } + } + +//readSettings(); // not yet + + +/**** Hands ****/ + + let HourHandLength = outerRadius * 0.5; + let HourHandWidth = 2*3, halfHourHandWidth = HourHandWidth/2; + + let MinuteHandLength = outerRadius * 0.8; + let MinuteHandWidth = 2*2, halfMinuteHandWidth = MinuteHandWidth/2; + + let SecondHandLength = outerRadius * 0.9; + let SecondHandOffset = 10; + + let twoPi = 2*Math.PI, deg2rad = Math.PI/180; + let Pi = Math.PI; + let halfPi = Math.PI/2; + + let sin = Math.sin, cos = Math.cos; + +/**** simple Hands ****/ + + let simpleHourHandPolygon = [ + -halfHourHandWidth,halfHourHandWidth, + -halfHourHandWidth,halfHourHandWidth-HourHandLength, + halfHourHandWidth,halfHourHandWidth-HourHandLength, + halfHourHandWidth,halfHourHandWidth, + ]; + + let simpleMinuteHandPolygon = [ + -halfMinuteHandWidth,halfMinuteHandWidth, + -halfMinuteHandWidth,halfMinuteHandWidth-MinuteHandLength, + halfMinuteHandWidth,halfMinuteHandWidth-MinuteHandLength, + halfMinuteHandWidth,halfMinuteHandWidth, + ]; + + +/**** rounded Hands ****/ + + let outerBoltRadius = halfHourHandWidth + 2; + let innerBoltRadius = outerBoltRadius - 4; + let roundedHandOffset = outerBoltRadius + 4; + + let sine = [0, sin(30*deg2rad), sin(60*deg2rad), 1]; + + let roundedHandPolygon = [ + -sine[3],-sine[0], -sine[2],-sine[1], -sine[1],-sine[2], -sine[0],-sine[3], + sine[0],-sine[3], sine[1],-sine[2], sine[2],-sine[1], sine[3],-sine[0], + sine[3], sine[0], sine[2], sine[1], sine[1], sine[2], sine[0], sine[3], + -sine[0], sine[3], -sine[1], sine[2], -sine[2], sine[1], -sine[3], sine[0], + ]; + + let roundedHourHandPolygon = new Array(roundedHandPolygon.length); + for (let i = 0, l = roundedHandPolygon.length; i < l; i+=2) { + roundedHourHandPolygon[i] = halfHourHandWidth*roundedHandPolygon[i]; + roundedHourHandPolygon[i+1] = halfHourHandWidth*roundedHandPolygon[i+1]; + if (i < l/2) { roundedHourHandPolygon[i+1] -= HourHandLength; } + if (i > l/2) { roundedHourHandPolygon[i+1] += roundedHandOffset; } + } + let roundedMinuteHandPolygon = new Array(roundedHandPolygon.length); + for (let i = 0, l = roundedHandPolygon.length; i < l; i+=2) { + roundedMinuteHandPolygon[i] = halfMinuteHandWidth*roundedHandPolygon[i]; + roundedMinuteHandPolygon[i+1] = halfMinuteHandWidth*roundedHandPolygon[i+1]; + if (i < l/2) { roundedMinuteHandPolygon[i+1] -= MinuteHandLength; } + if (i > l/2) { roundedMinuteHandPolygon[i+1] += roundedHandOffset; } + } + + +/**** hollow Hands ****/ + + let BoltRadius = 3; + let hollowHandOffset = BoltRadius + 15; + + let hollowHandPolygon = [ + -sine[3],-sine[0], -sine[2],-sine[1], -sine[1],-sine[2], -sine[0],-sine[3], + sine[0],-sine[3], sine[1],-sine[2], sine[2],-sine[1], sine[3],-sine[0], + sine[3], sine[0], sine[2], sine[1], sine[1], sine[2], sine[0], sine[3], + 0,0, + -sine[0], sine[3], -sine[1], sine[2], -sine[2], sine[1], -sine[3], sine[0] + ]; + + let hollowHourHandPolygon = new Array(hollowHandPolygon.length); + for (let i = 0, l = hollowHandPolygon.length; i < l; i+=2) { + hollowHourHandPolygon[i] = halfHourHandWidth*hollowHandPolygon[i]; + hollowHourHandPolygon[i+1] = halfHourHandWidth*hollowHandPolygon[i+1]; + if (i < l/2) { hollowHourHandPolygon[i+1] -= HourHandLength; } + if (i > l/2) { hollowHourHandPolygon[i+1] -= hollowHandOffset; } + } + hollowHourHandPolygon[25] = -BoltRadius; + + let hollowMinuteHandPolygon = new Array(hollowHandPolygon.length); + for (let i = 0, l = hollowHandPolygon.length; i < l; i+=2) { + hollowMinuteHandPolygon[i] = halfMinuteHandWidth*hollowHandPolygon[i]; + hollowMinuteHandPolygon[i+1] = halfMinuteHandWidth*hollowHandPolygon[i+1]; + if (i < l/2) { hollowMinuteHandPolygon[i+1] -= MinuteHandLength; } + if (i > l/2) { hollowMinuteHandPolygon[i+1] -= hollowHandOffset; } + } + hollowMinuteHandPolygon[25] = -BoltRadius; + + + +/**** transform polygon ****/ + + let transformedPolygon; + + function transformPolygon (originalPolygon, OriginX,OriginY, Phi) { + let sPhi = sin(Phi), cPhi = cos(Phi), x,y; + + for (let i = 0, l = originalPolygon.length; i < l; i+=2) { + x = originalPolygon[i]; + y = originalPolygon[i+1]; + + transformedPolygon[i] = OriginX + x*cPhi + y*sPhi; + transformedPolygon[i+1] = OriginY + x*sPhi - y*cPhi; + } + } + +/**** refreshClock ****/ + + let Timer; + function refreshClock () { + activeLayout = null; + + g.setTheme({ + fg:(Settings.Foreground === 'Theme' ? Theme.fg : Settings.Foreground || '#000000'), + bg:(Settings.Background === 'Theme' ? Theme.bg : Settings.Background || '#FFFFFF') + }); + g.clear(true); // also installs the current theme + + Bangle.drawWidgets(); + renderClock(); + + let Period = (Settings.withSeconds ? 1000 : 60000); + + let Pause = Period - (Date.now() % Period); + Timer = setTimeout(refreshClock,Pause); + } + +/**** renderClock ****/ + + function renderClock () { + g.setColor (Settings.Foreground === 'Theme' ? Theme.fg : Settings.Foreground || '#000000'); + g.setBgColor(Settings.Background === 'Theme' ? Theme.bg : Settings.Background || '#FFFFFF'); + + switch (Settings.Face) { + case 'none': + break; + case '3,6,9,12': + g.setFont('Vector', 22); + + g.setFontAlign(0,-1); + g.drawString('12', CenterX,CenterY-outerRadius); + + g.setFontAlign(1,0); + g.drawString('3', CenterX+outerRadius,CenterY); + + g.setFontAlign(0,1); + g.drawString('6', CenterX,CenterY+outerRadius); + + g.setFontAlign(-1,0); + g.drawString('9', CenterX-outerRadius,CenterY); + break; + case '1-12': + let innerRadius = outerRadius * 0.9 - 10; + + for (let i = 0; i < 60; i++) { + let Phi = i * twoPi/60; + + let x = CenterX + outerRadius * sin(Phi); + let y = CenterY - outerRadius * cos(Phi); + + if (Settings.colored) { + let Color = E.HSBtoRGB(i/60,1,1, true); + g.setColor(Color[0]/255,Color[1]/255,Color[2]/255); + } + + g.fillCircle(x,y, 1); + } + + g.setFont('Vector', 20); + g.setFontAlign(0,0); + + for (let i = 0; i < 12; i++) { + let Phi = i * twoPi/12; + + let Radius = innerRadius; + if (i >= 10) { Radius -= 4; } + + let x = CenterX + Radius * sin(Phi); + let y = CenterY - Radius * cos(Phi); + + if (Settings.colored) { + let Color = E.HSBtoRGB(i/12,1,1, true); + g.setColor(Color[0]/255,Color[1]/255,Color[2]/255); + } + + g.drawString(i == 0 ? '12' : '' + i, x,y); + } + } + + let now = new Date(); + + let Hours = now.getHours() % 12; + let Minutes = now.getMinutes(); + + let HoursAngle = (Hours+(Minutes/60))/12 * twoPi - Pi; + let MinutesAngle = (Minutes/60) * twoPi - Pi; + + g.setColor(Settings.Foreground === 'Theme' ? Theme.fg : Settings.Foreground || '#000000'); + + switch (Settings.Hands) { + case 'simple': + transformPolygon(simpleHourHandPolygon, CenterX,CenterY, HoursAngle); + g.fillPoly(transformedPolygon); + + transformPolygon(simpleMinuteHandPolygon, CenterX,CenterY, MinutesAngle); + g.fillPoly(transformedPolygon); + break; + case 'rounded': + transformPolygon(roundedHourHandPolygon, CenterX,CenterY, HoursAngle); + g.fillPoly(transformedPolygon); + + transformPolygon(roundedMinuteHandPolygon, CenterX,CenterY, MinutesAngle); + g.fillPoly(transformedPolygon); + +// g.setColor(Settings.Foreground === 'Theme' ? Theme.fg || '#000000'); + g.fillCircle(CenterX,CenterY, outerBoltRadius); + + g.setColor(Settings.Background === 'Theme' ? Theme.bg : Settings.Background || '#FFFFFF'); + g.drawCircle(CenterX,CenterY, outerBoltRadius); + g.fillCircle(CenterX,CenterY, innerBoltRadius); + break; + case 'hollow': + transformPolygon(hollowHourHandPolygon, CenterX,CenterY, HoursAngle); + g.drawPoly(transformedPolygon,true); + + transformPolygon(hollowMinuteHandPolygon, CenterX,CenterY, MinutesAngle); + g.drawPoly(transformedPolygon,true); + + g.drawCircle(CenterX,CenterY, BoltRadius); + } + + if (Settings.withSeconds) { + g.setColor(Settings.Seconds === 'Theme' ? Theme.fgH : Settings.Seconds || '#FF0000'); + + let Seconds = now.getSeconds(); + let SecondsAngle = (Seconds/60) * twoPi - Pi; + + let sPhi = Math.sin(SecondsAngle), cPhi = Math.cos(SecondsAngle); + + g.drawLine( + CenterX + SecondHandOffset*sPhi, + CenterY - SecondHandOffset*cPhi, + CenterX - SecondHandLength*sPhi, + CenterY + SecondHandLength*cPhi + ); + } + } + + +/**** MainScreen Logic ****/ + + let Changes = {}, KeysToChange; + + let fullScreen = { + x:0,y:0, w:ScreenWidth,h:ScreenHeight, x2:ScreenWidth-1,y2:ScreenHeight-1 + }; + let AppRect; + + function openMainScreen () { + if (Timer != null) { clearTimeout(Timer); Timer = undefined; } + if (AppRect == null) { AppRect = Bangle.appRect; Bangle.appRect = fullScreen; } + + KeysToChange = 'Face colored Hands withSeconds Foreground Background Seconds'; + + g.setTheme({ fg:'#000000', bg:'#FFFFFF' }); + g.clear(true); // also installs the current theme + + (activeLayout = MainScreen).render(); + } + + function applySettings () { saveSettings(); Bangle.appRect = AppRect; refreshClock(); } + function withdrawSettings () { readSettings(); Bangle.appRect = AppRect; refreshClock(); } + +/**** FacesScreen Logic ****/ + + function openFacesScreen () { + KeysToChange = 'Face colored'; + Bangle.appRect = fullScreen; + refreshFacesScreen(); + } + + function refreshFacesScreen () { + activeLayout = FacesScreen; + activeLayout['none'].checked = ((Changes.Face || Settings.Face) === 'none'); + activeLayout['3,6,9,12'].checked = ((Changes.Face || Settings.Face) === '3,6,9,12'); + activeLayout['1-12'].checked = ((Changes.Face || Settings.Face) === '1-12'); + activeLayout['colored'].checked = (Changes.colored == null ? Settings.colored : Changes.colored); + activeLayout.render(); + } + + function chooseFace (Control) { Changes.Face = Control.id; refreshFacesScreen(); } + function toggleColored () { Changes.colored = ! Changes.colored; refreshFacesScreen(); } + +/**** HandsScreen Logic ****/ + + function openHandsScreen () { + KeysToChange = 'Hands withSeconds'; + Bangle.appRect = fullScreen; + refreshHandsScreen(); + } + + function refreshHandsScreen () { + activeLayout = HandsScreen; + activeLayout['simple'].checked = ((Changes.Hands || Settings.Hands) === 'simple'); + activeLayout['rounded'].checked = ((Changes.Hands || Settings.Hands) === 'rounded'); + activeLayout['hollow'].checked = ((Changes.Hands || Settings.Hands) === 'hollow'); + activeLayout['withSeconds'].checked = (Changes.withSeconds == null ? Settings.withSeconds : Changes.withSeconds); + activeLayout.render(); + } + + function chooseHand (Control) { Changes.Hands = Control.id; refreshHandsScreen(); } + function toggleSeconds () { Changes.withSeconds = ! Changes.withSeconds; refreshHandsScreen(); } + +/**** ColorsScreen Logic ****/ + + function openColorsScreen () { + KeysToChange = 'Foreground Background Seconds'; + Bangle.appRect = fullScreen; + refreshColorsScreen(); + } + + function refreshColorsScreen () { + let Foreground = (Changes.Foreground == null ? Settings.Foreground : Changes.Foreground); + let Background = (Changes.Background == null ? Settings.Background : Changes.Background); + let Seconds = (Changes.Seconds == null ? Settings.Seconds : Changes.Seconds); + + activeLayout = ColorsScreen; + activeLayout['Foreground'].bgCol = (Foreground === 'Theme' ? Theme.fg : Foreground); + activeLayout['Background'].bgCol = (Background === 'Theme' ? Theme.bg : Background); + activeLayout['Seconds'].bgCol = (Seconds === 'Theme' ? Theme.fgH : Seconds); + activeLayout.render(); + } + + function selectForegroundColor () { ColorToChange = 'Foreground'; openColorChoiceScreen(); } + function selectBackgroundColor () { ColorToChange = 'Background'; openColorChoiceScreen(); } + function selectSecondsColor () { ColorToChange = 'Seconds'; openColorChoiceScreen(); } + +/**** ColorChoiceScreen Logic ****/ + + let ColorToChange, chosenColor; + + function openColorChoiceScreen () { + chosenColor = ( + Changes[ColorToChange] == null ? Settings[ColorToChange] : Changes[ColorToChange] + ); + Bangle.appRect = fullScreen; + refreshColorChoiceScreen(); + } + + function refreshColorChoiceScreen () { + activeLayout = ColorChoiceScreen; + activeLayout['#000000'].selected = (chosenColor === '#000000'); + activeLayout['#FF0000'].selected = (chosenColor === '#FF0000'); + activeLayout['#00FF00'].selected = (chosenColor === '#00FF00'); + activeLayout['#0000FF'].selected = (chosenColor === '#0000FF'); + activeLayout['#FFFF00'].selected = (chosenColor === '#FFFF00'); + activeLayout['#FF00FF'].selected = (chosenColor === '#FF00FF'); + activeLayout['#00FFFF'].selected = (chosenColor === '#00FFFF'); + activeLayout['#FFFFFF'].selected = (chosenColor === '#FFFFFF'); + activeLayout['Theme'].selected = (chosenColor === 'Theme'); + activeLayout.render(); + } + + function chooseColor (Control) { chosenColor = Control.id; refreshColorChoiceScreen(); } + function chooseThemeColor () { chosenColor = 'Theme'; refreshColorChoiceScreen(); } + + function applyColor () { + Changes[ColorToChange] = chosenColor; + openColorsScreen(); + } + + function withdrawColor () { + openColorsScreen(); + } + +/**** common logic for multiple screens ****/ + + function applyChanges () { + Settings = Object.assign(Settings,Changes); + Changes = {}; + openMainScreen(); + } + + function withdrawChanges () { + Changes = {}; + openMainScreen(); + } + + + g.setFont12x20(); // does not seem to be respected in layout! + + let OkCancelWidth = Math.max( + g.stringWidth('Ok'), g.stringWidth('Cancel') + ) + 2*10; + + let StdFont = { font:'12x20' }; + let legible = Object.assign({ col:'#000000', bgCol:'#FFFFFF' }, StdFont); + let leftAligned = Object.assign({ halign:-1, valign:0 }, legible); + let ColorView = Object.assign({ width:30, border:1, BorderColor:'#000000' }, StdFont); + let ColorChoice = Object.assign({ DrawableWidth:30, DrawableHeight:30, onTouch:chooseColor }, StdFont); + +/**** MainScreen ****/ + + let MainScreen = new Layout({ + type:'v', c:[ + Label('Settings', { common:legible, bold:true, filly:1 }), + { height:4 }, + { type:'h', c:[ + Label('Faces', { common:leftAligned, fillx:1 }), + Image(Caret, { common:leftAligned }), + ], filly:1, onTouch:openFacesScreen }, + { type:'h', c:[ + Label('Hands', { common:leftAligned, fillx:1 }), + Image(Caret, { common:leftAligned }), + ], filly:1, onTouch:openHandsScreen }, + { type:'h', c:[ + Label('Colors', { common:leftAligned, fillx:1 }), + Image(Caret, { common:leftAligned }), + ], filly:1, onTouch:openColorsScreen }, + { height:4 }, + { type:'h', c:[ + Button('Ok', { common:legible, width:OkCancelWidth, onTouch:applySettings }), + { width:4 }, + Button('Cancel', { common:legible, width:OkCancelWidth, onTouch:withdrawSettings }), + ], filly:1 }, + ], bgCol:'#FFFFFF' + }); + + +/**** FacesScreen ****/ + + let FacesScreen = new Layout({ + type:'v', c:[ + Label('Clock Faces', { common:legible, bold:true, filly:1 }), + { height:4 }, + { type:'h', c:[ + Radiobutton({ id:'none', GroupName:'Faces', common:legible, onChange:chooseFace }), + Label(' no Face', { common:leftAligned, pad:4, fillx:1 }), + ], filly:1, onTouch:checkInnerRadiobutton }, + { type:'h', c:[ + Radiobutton({ id:'3,6,9,12', GroupName:'Faces', common:legible, onChange:chooseFace }), + Label(' 3, 6, 9 and 12', { common:leftAligned, pad:4, fillx:1 }), + ], filly:1, onTouch:checkInnerRadiobutton }, + { type:'h', c:[ + Radiobutton({ id:'1-12', GroupName:'Faces', common:legible, onChange:chooseFace }), + Label(' numbers 1...12', { common:leftAligned, pad:4, fillx:1 }), + ], filly:1, onTouch:checkInnerRadiobutton }, + { type:'h', c:[ + { width:30 }, + Checkbox({ id:'colored', common:legible, onChange:toggleColored }), + Label(' colorful', { common:leftAligned, pad:4, fillx:1 }), + ], filly:1, onTouch:toggleInnerCheckbox }, + { height:4 }, + { type:'h', c:[ + Button('Ok', { common:legible, width:OkCancelWidth, onTouch:applyChanges }), + { width:4 }, + Button('Cancel', { common:legible, width:OkCancelWidth, onTouch:withdrawChanges }), + ], filly:1 }, + ], bgCol:'#FFFFFF' + }); + + +/**** HandsScreen ****/ + + let HandsScreen = new Layout({ + type:'v', c:[ + Label('Clock Hands', { common:legible, bold:true, filly:1 }), + { height:4 }, + { type:'h', c:[ + Radiobutton({ id:'simple', GroupName:'Faces', common:legible, onChange:chooseHand }), + Label(' simple', { common:leftAligned, pad:4, fillx:1 }), + ], filly:1, onTouch:checkInnerRadiobutton }, + { type:'h', c:[ + Radiobutton({ id:'rounded', GroupName:'Faces', common:legible, onChange:chooseHand }), + Label(' rounded + Bolt', { common:leftAligned, pad:4, fillx:1 }), + ], filly:1, onTouch:checkInnerRadiobutton }, + { type:'h', c:[ + Radiobutton({ id:'hollow', GroupName:'Faces', common:legible, onChange:chooseHand }), + Label(' hollow + Bolt', { common:leftAligned, pad:4, fillx:1 }), + ], filly:1, onTouch:checkInnerRadiobutton }, + { type:'h', c:[ + Checkbox({ id:'withSeconds', common:legible, onChange:toggleSeconds }), + Label(' show Seconds', { common:leftAligned, pad:4, fillx:1 }), + ], filly:1, onTouch:toggleInnerCheckbox }, + { height:4 }, + { type:'h', c:[ + Button('Ok', { common:legible, width:OkCancelWidth, onTouch:applyChanges }), + { width:4 }, + Button('Cancel', { common:legible, width:OkCancelWidth, onTouch:withdrawChanges }), + ], filly:1 }, + ], bgCol:'#FFFFFF' + }); + + +/**** ColorsScreen ****/ + + let ColorsScreen = new Layout({ + type:'v', c:[ + Label('Clock Colors', { common:legible, bold:true, filly:1 }), + { height:4 }, + { type:'h', c:[ + Label('Foreground', { common:leftAligned, pad:4, fillx:1 }), + Label('', { id:'Foreground', common:ColorView, bgCol:Theme.fg }), + ], filly:1, onTouch:selectForegroundColor }, + { type:'h', c:[ + Label('Background', { common:leftAligned, pad:4, fillx:1 }), + Label('', { id:'Background', common:ColorView, bgCol:Theme.bg }), + ], filly:1, onTouch:selectBackgroundColor }, + { type:'h', c:[ + Label('Seconds', { common:leftAligned, pad:4, fillx:1 }), + Label('', { id:'Seconds', common:ColorView, bgCol:Theme.fgH }), + ], filly:1, onTouch:selectSecondsColor }, + { height:4 }, + { type:'h', c:[ + Button('Ok', { common:legible, width:OkCancelWidth, onTouch:applyChanges }), + { width:4 }, + Button('Cancel', { common:legible, width:OkCancelWidth, onTouch:withdrawChanges }), + ], filly:1 }, + ], bgCol:'#FFFFFF' + }); + + +/**** ColorChoiceScreen ****/ + + function drawColorChoice (x,y, Width,Height, Details) { + let selected = Details.selected; + if (selected) { + g.setColor('#FF0000'); + g.fillPoly([ + x,y, x+Width-1,y, x+Width-1,y+Height-1, x,y+Height-1, x,y, + x+3,y+3, x+3,y+Height-4, x+Width-4,y+Height-4, x+Width-4,y+3, x+3,y+3 + ]); + } else { + g.setColor('#000000'); + g.drawRect(x+3,y+3, x+Width-4,y+Height-4); + } + + g.setColor(Details.col); + g.fillRect(x+4,y+4, x+Width-5,y+Height-5); + } + + let ColorChoiceScreen = new Layout({ + type:'v', c:[ + Label('Choose Color', { common:legible, bold:true, filly:1 }), + { height:4 }, + { type:'h', c:[ + Drawable(drawColorChoice, { id:'#000000', common:ColorChoice, col:'#000000' }), + { width:8 }, + Drawable(drawColorChoice, { id:'#FF0000', common:ColorChoice, col:'#FF0000' }), + { width:8 }, + Drawable(drawColorChoice, { id:'#00FF00', common:ColorChoice, col:'#00FF00' }), + { width:8 }, + Drawable(drawColorChoice, { id:'#0000FF', common:ColorChoice, col:'#0000FF' }), + ], filly:1 }, + { type:'h', c:[ + Drawable(drawColorChoice, { id:'#FFFFFF', common:ColorChoice, col:'#FFFFFF' }), + { width:8 }, + Drawable(drawColorChoice, { id:'#FFFF00', common:ColorChoice, col:'#FFFF00' }), + { width:8 }, + Drawable(drawColorChoice, { id:'#FF00FF', common:ColorChoice, col:'#FF00FF' }), + { width:8 }, + Drawable(drawColorChoice, { id:'#00FFFF', common:ColorChoice, col:'#00FFFF' }), + ], filly:1 }, + { type:'h', c:[ + Label('use Theme:', { id:'Theme', common:leftAligned, pad:4 }), + { width:10 }, + Drawable(drawColorChoice, { id:'Theme', common:ColorChoice, col:Theme.fg }), + ], filly:1, onTouch:chooseThemeColor }, + { height:4 }, + { type:'h', c:[ + Button('Ok', { common:legible, width:OkCancelWidth, onTouch:applyColor }), + { width:4 }, + Button('Cancel', { common:legible, width:OkCancelWidth, onTouch:withdrawColor }), + ], filly:1 }, + ], bgCol:'#FFFFFF' + }); + + + + readSettings(); + + Bangle.on('swipe', (Direction) => { + if (Direction === 0) { openMainScreen(); } + }); + + setTimeout(refreshClock, 500); // enqueue first draw request + + Bangle.on('lcdPower', (on) => { + if (on) { + if (Timer != null) { clearTimeout(Timer); Timer = undefined; } + refreshClock(); + } + }); + + Bangle.setUI('clock'); From 56a25fb3f6230e9559ef0065490c89da72045828 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 6 Jan 2022 06:33:20 +0100 Subject: [PATCH 05/86] Create app-screenshot.png --- apps/configurable_clock/app-screenshot.png | Bin 0 -> 3218 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/configurable_clock/app-screenshot.png diff --git a/apps/configurable_clock/app-screenshot.png b/apps/configurable_clock/app-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..5287217593fe6c4482120906e42c36c0d8860ee9 GIT binary patch literal 3218 zcmb7{*H;th7RA2=LP)4$=vr=t-aRyJ)QHgQ>-kExsW1A005WCRYRNKPWnge zY`RC4QOb2SC^=SP7-ltl1}V2o z^Ez&A^*)6D@0#H_F|`b}4_&cw@YB#xqArNJ2duAU8cp2q1I?DFO_g*nYrrV?b;WLS zVk2P|6N%fA2-?jvm`icjl!f);;SYEOra)k{$m)QEyL?C`MF;=UA-tXCyYth0sDI%) zm69p5jkvad*V#DX%5k`2hbC-Vcd889XG>EIPdB;3^1WSakq;~Dq%&&*$TZSY;c@vj%L&LY<_C_F6z#g;GrNdA59HmB=n}|0F zB4O0MuX)Q{5RAi}BJ$&^=kt3g(U_mX2}wfrOa1AON(9-XhiDGyp$P}$)jkfEsDzvd z(E;1<#h?qnAl77eTf%f5Mp@B<@CesF3!bA_w>mg}rpPyY@6PaHFzTN3HNHFkkXbDcdo&=0{Pdh}zy*3Ir$pQZC+i&FKMV#;8 z2$I#eW2Y%I;%Z5JJ-~DiiV00Luk9$`)2@Q*p}m4s1G=A^A%8qKf3Hca3s^7K-j zk8ZIL5V~gnTa%#rE)*1YeuNG~gP5%25K} z?bwXu1X%=D!tOc$|Cr!gNS(X@=SLJi*4F8L_csG~3RqmaYvY~rQ#ss2eKPT004R>n ze4qf4+OL}S=tK1&xl;<4I~(U1O%@p_{Ur>L`{Cl~>X+%?m`ddU6Gwmesy6oAO|DYG+!SHFh-lsXrEczZ56!?j?%{qyUW@ zsA;OP>LRzMa<=uOe(4uGYg0 z%E2SG41CP$q4aX@hrc#Oog`OB=UR4Kjl7!s$4?k96_iCkM;gt*W}>boFQ?Z6_*FXc zRU#CA)$El|ShC~dA6BJLhxy8f)z*;P(XU&|p?ck-?Xm1nMS2r)S%jg5cZi@~hea+= z7X4s}r%RiTrl;*>D=U?ZgjdoQK=4KNze<;`r#>8ikY^QlFc(vU>}HD6wFI-i$dpak zEuOd%v*Z2;GQP6P!>FcuhM;93eDYkVW5PL^)q{&OkRFqjj7f9WVtbgv7dxb)(XG3# zvt(Sh-F2GvpIv{o&ipdvHT6G@Rtj5ke!;8SMYf>|6{E+hkph+jgHw<#lM0auYOlD~G z9GdZ}XTD>nTj$Dv_WnJ~5TUY+pbA1+afP2>1QLE(G^f{=-~Jzpx#O5Xd=#KGlI9+JccpsX$Y`xo( znU$eav)!^dmh<^2cVPEL{*G~X;KpH)lJ(8FvWE%3G}BE6HY<>U{A6MW8XSe(@=jxL zS7=chB9u_%Po7x-ygXy=aIc;AFjrwG@hv73m$e%Ez2gzBn%0)+vx|t#XQeV zrslnj+#g!y)BM`V3g!pi4#;Joae*hP`4{xslU{=GNCH!n;#MvRnsI5}Px4XICi-P7 zv>M2!m@lYi4bbKUF_9$({cr+=R12rxz&f9Obfu~z^8oKZc10>!w%QJ^D~{j@-?tCY ze>{++@~xC2LA7IYOg6{Pi^DLPW%zC0wxrmA+R;cwjZbcJDh2mrwtov`yzI6^~gNi)oL2Abz1G2hd>Q+k-*0Rj3n&PANUi6y| z#17#;cTPN7=y)|`wz@0AI+(W5cJ5|+(N+;kA6rkZqVFuSKCw#pTGP8kZsH;dQ}V~* z6Cw`JD3#;=xFGPu5QJSVubxO6S6(@%phHNV;Mh=kW{^zQ(&nL1%jDO8=s7YC*xP_u zncyt_ri++U@TZMc$n>{K`LhE;tDW_SjiHc!{;=ckef zYB$OvNd4LtFNEnVN3Ey_#Egi_so6MXM5&PiU5&vIv&(eEb{f(gUFJhdZ|QW=2C^n9i)f;h-+s5Wf~c(4QhU?X{kg zQ|9I%_*vI$t@^132I$<6<|b4@qOEANb_+-}s#zrS9RL~5nLgeyQg8X_Arw1Im;x<% zks0-nZK*hykf$Jg@=aia0%$iWvUipOE~*W=)f^y*@2hP#f?)sPyVN?AlFJ$~=?SIT iO1v6u1OIaE7d%+S$$YPr_s8#&0Zfc63~TkV_x=x}ck>Yd literal 0 HcmV?d00001 From 9eaf501ce7b91ba1b171360bb775097d0cba9c4c Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 6 Jan 2022 06:33:24 +0100 Subject: [PATCH 06/86] Create app-icon.png --- apps/configurable_clock/app-icon.png | Bin 0 -> 4369 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/configurable_clock/app-icon.png diff --git a/apps/configurable_clock/app-icon.png b/apps/configurable_clock/app-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..58f50365d4ed18b6b1f5e006a3e2a4398452cbbb GIT binary patch literal 4369 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 D06kr; literal 0 HcmV?d00001 From a499ad279a3c95a54fbde1736f46399594907ed4 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 6 Jan 2022 06:33:27 +0100 Subject: [PATCH 07/86] Create app-icon.js --- apps/configurable_clock/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/configurable_clock/app-icon.js diff --git a/apps/configurable_clock/app-icon.js b/apps/configurable_clock/app-icon.js new file mode 100644 index 000000000..b0cf74241 --- /dev/null +++ b/apps/configurable_clock/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgZC/AB1RgkQsAQMyUKAYMIkAPJgNFiEBgACBg0YCRMogEJkGSAwMSEZNAAQMAEAMGgBKHgXAlECwMgzcAmkAhgRGilRssUgMEEYcBwARFiBHBgQKB7AjCawIQEgoCCigDBjEBwwEBEwIAGlmSEYYABI4PAEYhEBNYIjCAYVtwCSElG2xdoAwQjDhpZEEAMUqAHDCIaPBEYlAiwjItkAgYjFqJHDCIdhI4j1CAAhlEZoTUEAAcGEYZKEEYWgCIgjEWYkBoqwCCITLBgcMmPXhgjCgUB2iFDm3pw0YLAMygEgc4QjF49cmA3BbQQjDgGkI5OwNZZ9FEYoRLEYxmBCI5jBEYQACyQRHgmAEYsEEZEka4kAhEEEY8BCIMJCIYjKgGChAFDCwKzDNYyKEJgUDlgRBAoPDRQQjEZQZzEjScIhgjBEwQjEH4aXEgIjBjYCBjQCBMYYADmAjDFIjcGKocAjBKCgJRCAAwaCEARQBmARIhBrEgSMEAApEBmHAAQJrCABUCjFhwwQMI4oA7")) \ No newline at end of file From db5cb644fd36460d61d76ce9014bd5a6a542c118 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 6 Jan 2022 06:33:32 +0100 Subject: [PATCH 08/86] Create LICENSE --- apps/configurable_clock/LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 apps/configurable_clock/LICENSE diff --git a/apps/configurable_clock/LICENSE b/apps/configurable_clock/LICENSE new file mode 100644 index 000000000..7487dd5da --- /dev/null +++ b/apps/configurable_clock/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Andreas Rozek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 54ee423106d32237a7c8738d319458c3888c9730 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 6 Jan 2022 06:33:34 +0100 Subject: [PATCH 09/86] Create Screenshot-01.png --- apps/configurable_clock/Screenshot-01.png | Bin 0 -> 1621 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/configurable_clock/Screenshot-01.png diff --git a/apps/configurable_clock/Screenshot-01.png b/apps/configurable_clock/Screenshot-01.png new file mode 100644 index 0000000000000000000000000000000000000000..b2367784c76e682019d944c899f572357ab0fded GIT binary patch literal 1621 zcmds2+f!3_5dNKn1PDh61|{ez7gLK=g^1M#L2e=enMn|^PJs|+6icN-0E4kf@B|Q| zLji?BsS1kIf^9+UfJu?dNzH(j78EO?f^Z1bl%`;Ua%ne1ATkR8*(EkAB1x1s_k5~g zY&VQPUa@#}20v{4DfSC_4fJ+Z_8I^89!R>LySlqAr(ea%z9e~q_q&7o3j+Yt zp~VS|n@osjIyu=LC>IxlLNK`99|-jNd=cuA$piR^MrQy!A9Vt(<@V4NbnLniLR0t+ z_lZA->j^;76Iy0}SvEof*;1*q3zPU?7F?-CFZGUQ2PyfKcDt_BjcS8G=^3GvjxV7; zrOHK`s5>;rcizbZH&0kL_q>V&OCM<0uIEZ=mmt`9%ba6vjDt#*-TkvUcpmCgzx$Di zbjc3R&8ki;>)navR85kZYE6`6 zD@NtJ80Ww~$#%8E4mJv@lk07Pa7h+MU1m$fHjIYb!luTPnV6SGH}rJzBy4!n9Wm~* z1LM!b+B7*dp$w3ly~!e7tM|N&j_1rfY9}k{cyVyi$|(j}gco{y%3tq`1D>#pF}+!v z0bI!TB4&~?5cMtE7vlPLrXN;)!>1mu?Lu&x%qP@!`|M`W0Ndz84H-{${L21|%q|CGoEFg@ep_^ z^-A$6)bcrK4n;(Mk+}(F$61Dj`b3fHj<8N_4Ka=VfCc46qwIGr3%iEoiqJ?g$;efO z9C$+$Xm*}<$~_rOe1(7@ zuhS7s)eSj2Qv@gC(JZl;V82Xev6_AV?egLqAWcWwsRcXdPv&Pg((?swwo^sdLLmu$ z1#2+bUdXvTh(*Cw@r(i6v~KsvI93nr`w)a=NN>K70V)Al&@2V}RK6%XV2EZH-e)i2)AmC*M zZ?+})e04!c0mb=r6(K&no}` literal 0 HcmV?d00001 From d89f1eef84e353336078f1a7243e90ec5ec38d2a Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 6 Jan 2022 06:33:37 +0100 Subject: [PATCH 10/86] Create Screenshot-02.png --- apps/configurable_clock/Screenshot-02.png | Bin 0 -> 1959 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/configurable_clock/Screenshot-02.png diff --git a/apps/configurable_clock/Screenshot-02.png b/apps/configurable_clock/Screenshot-02.png new file mode 100644 index 0000000000000000000000000000000000000000..909a2a04a3559d66b724b7c265ee61a68b4a17d2 GIT binary patch literal 1959 zcmb7FYc!kL8vcCq;iGXTg1A@2y{@H2qljxFh>mpH6iuVr6NYLSv&c~L9hWvmqpYS? zf_9G4o>Ro2bk)(%4AnC_X-S8=PTYz?C(1OYZYQ(W{5yYU_FC_L-}UV0+56qkpI2~< zPSMde(FOoOCyW{#t;&+$1J+RO%^h!NzIl3Kr=opIN*2|YgIg*K1;x8 zR4MZor#cx6Io&|uE(Slg`>1js%xnMDEv#ZhwUmbbSePa+L<1ZtWBw4^})>HZF{-jk3>ZS&v)HN7U5xr_|Q(5OKiB2EbF)S=;b?b%G|XaQ_2#u-ezpS7hR2Va{qJ*m{8rdeVc~R`vs1##2$rmopo93&t{Z4Wc)bQvlfPaqdzpMZTfktHDQGmT&rH|AhlZ7Sa(#Xw7@a zTsd2I$sg(8*L50)QyO{>lwd)tG`#s%vquR^oj5ar@d(uF3h&w(==RR9Sxv^+DRRSB zipTqYa3elIQyknEN4uZCR7oDA{}#foZn);A#GMZ!tdU@y)}^|knlV!kh0f&QT=kzvAo;?hOl{D6TlTgBCv*^{!cm${9bDd5e1C?K>>08RabG@=9Bf zKrKOUkSy2MZ9?UtrJjNg3qR_7rMs1+#U&%b>R!)x*v^ldS%D*qL6Ewwa*Y|CAZ9X;uEJ7gvWe8D9Xxz1}lULIAw zHnxuGo4lY`%3Ky>YH1>E^`?5$>RPDZjpt(o5h=|U;gARho3e{cyx;|=uM$cntR`fPr!ry_hhls+VRS7BO^5g zl+;?6i7Vtw)`vgD9u~ZvKwp$)o{`2lKAKh4d0=Wz2IQhB9LVr@1*RD3wIfhoX8D6G5OQ()WrQ- z8pp&(rWU68aH8zNamldgep^V^-rn?^)UUI?Z|5B0qu(Fcefmuoj>GdB*SSB5cW*-* zO{>Q5`5uz|YLs+X5Z>@frr#EgqzLl8U4EibZ}QYL2g5CXh%Pe@N>&=UR(YC%#o71c4 zud%mD7$jfD2;8m%U{t}2p%E>D;)|l-TT}qC`^82qa3%T=OOz{xGgF z{xDDZC}S4ix7)AVSv#8NA$_+$oi)C0+2_>GJ;W*lQnbdt-0prpER4{^zv{F} zTuuwnPEvVSx8WQRE8G`NHC1_5->emreS5M6g?b3+K&o6Zvo)P8q)L_ r5PmQp*46`Iv)s5M8IJrXp4?Vb#?4qzK6hiPCNB^cLJw{VWdGxT>q%q& literal 0 HcmV?d00001 From 350458f9e0e53bf105234238d24e0c2a29c276b1 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 6 Jan 2022 06:33:39 +0100 Subject: [PATCH 11/86] Create Screenshot-03.png --- apps/configurable_clock/Screenshot-03.png | Bin 0 -> 2814 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/configurable_clock/Screenshot-03.png diff --git a/apps/configurable_clock/Screenshot-03.png b/apps/configurable_clock/Screenshot-03.png new file mode 100644 index 0000000000000000000000000000000000000000..80407c84f0b4d317b0fca562ff3eaec1c396d188 GIT binary patch literal 2814 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 O1&${Owh!^-wEqH%A`7|z literal 0 HcmV?d00001 From ea0104878867a101755eedd82617e1be795ec44f Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 6 Jan 2022 06:33:42 +0100 Subject: [PATCH 12/86] Create Screenshot-04.png --- apps/configurable_clock/Screenshot-04.png | Bin 0 -> 3302 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/configurable_clock/Screenshot-04.png diff --git a/apps/configurable_clock/Screenshot-04.png b/apps/configurable_clock/Screenshot-04.png new file mode 100644 index 0000000000000000000000000000000000000000..175476c81ba153ec1b69e9537484a232d1706259 GIT binary patch literal 3302 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 Date: Thu, 6 Jan 2022 06:33:46 +0100 Subject: [PATCH 13/86] Create Screenshot-11.png --- apps/configurable_clock/Screenshot-11.png | Bin 0 -> 1570 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/configurable_clock/Screenshot-11.png diff --git a/apps/configurable_clock/Screenshot-11.png b/apps/configurable_clock/Screenshot-11.png new file mode 100644 index 0000000000000000000000000000000000000000..bca534613173b18345c9c900cb584f6e2bdee4fe GIT binary patch literal 1570 zcmeHH?N3v882#Or-mc{WRhTWdg2nNovDk_tSVKioUUZ1)bQ+*c9gt|CP=(8&aA^Tc z6p7PWGtgo(qBCk0U#PQ`%e=EjEGWc*Qs5Sy1ff#p)dFQK+4d*w(>^@UNltRkNuHBD z6$$atZp_6@0DxO;OjP1L-u!DmgXg!d;Z4dsK=Q=sP2ff=Zx8^QB{nK@H=1JW>DeWjm0m7#5m?#=0`J40z@x#PB+`v&RE&f1KUb=ZmCnuEn&fK%E| z1HlS~yN8fk=L(V>4xUdc9LEOwvGMQ?IC3@^$OebxDCQlM49ND*0Xqmu_yyo~x;876 zR(lk}wn?=QsZTc!Qh>%7ah!g>x-!Lj3G=LrA(>0qGigsKa=QTNVY~*e?kKz+50qRy3|KVm>0zbyXfEC4IjIUF9!v#I#=f!jGyB9;b*Yf z;M3m$m7@aUvJ3KIy?Tc$r++O=yI4q!FVN0Q?=GMYH_3tp98xzl+V|qcQN(U;j7;(n z;ga`A|9&-OluKEik%(ROK&gihU|NeOVTwlVC&bFBE;W>?_f>QKW}h#_xDPj5I4knK z@ycc>6Zye_kf%si9uc>nDND~#i&eB$babhZpgvdnK&Wsfp|S=@VEd_B)`)uD;7%;B zycA8xFH}(tA>>3D;pyjo3ZOzun`!AquX;IxUugCb(9y)lts;;I7u@6ZSBSXLkcD&g zm^X2~?(H=y8gI(l6-sC(tD1^t@(a3GPkZhJr249~Z@a~>JUn0xE=pcC(#=H+Mtcnv zjgc^KJDmHIN0P?LO3af@mX_9 z#4Wbn1{<5vi(FE}n`T>RGvkYlMVBUI<}b+)`{>oqobG&rB!XOF#%NCPw9AL>)?!4oozl1=^P>|xwS^nauuX7LU6%qZs%^74a!e3 z+A~ll@v{EfdUDUaVMdTX%^$B4`Z9DQC4tT_bMEM#1voQ~`~0zt_-Sb0xJ|r#M;8YR ztfT!~$Q>RT%NLt~#Ty}Gn*%B#G%+UYA8NQar*GqSbyygMY?cY64quzNgCTim-3m5X z;|dGUv$AC_xXNlM2`sG^Qb@*v#*)A&9uKmohGmfqYrsi>rbqQ{97gn`*;pQIh;Vw= zXDtmVQ;1-)rZtzb0>~1+J}75`nvR#jku>1WJbWY`!sP3_{jUH#@|#NYav+OOf8g>t z2n)J)E1U*e2ajlKDS%$KHuN&U!!Ott?gnJ-%|~y&K-lHm$x0^RdHvp1LjeOv?`=zf mFx9V%t9OC_!~Q#fmxh?8^Mp2eDh?qi$?URsIQ;s<7Pv literal 0 HcmV?d00001 From 9cc680155ccea5bdf513c94e11e5174ac22586e3 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 6 Jan 2022 06:33:48 +0100 Subject: [PATCH 14/86] Create Screenshot-12.png --- apps/configurable_clock/Screenshot-12.png | Bin 0 -> 1682 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/configurable_clock/Screenshot-12.png diff --git a/apps/configurable_clock/Screenshot-12.png b/apps/configurable_clock/Screenshot-12.png new file mode 100644 index 0000000000000000000000000000000000000000..973b6da5e62b45e5d55918ed7878b65da00c10d4 GIT binary patch literal 1682 zcmd^A>r+#A5dGcUkOT-2u$4CngD+YMiP9+wrXkRYhy_F|s5EMQq!2O$`UF=ur!Uj?`LeRsCsShi!8auRV?)WaDsv&b3tt7C<)sZqYe43V;sJdN>nYsM z{?Ao1ym-FAAiOwV$PP!9cS6WUKS?d(O;80Nkb2XbVgG@YAg2FeWLUoF%bWED_lg3~ zJ`DBO2O!?8faQswBduKY6J8Jeu~fv{-hEv&b_MaKAK&nNApr{YNRDnWKezC)+Qtvv zaGvTF=PwQtk^fzH1a2p2uq}69_++zIe*=VyS?X>m&m1pR;K?5{DN(jA`V?B38$&(i z80Fxi@0CK+cEitdpzI5sGw+UVCYTe1loz37lct?kb=Czd$_$AoGSQ@?RwwM#AgSG2 zzaWKlC64MwM_9|CO5Hhg*PIad+;b}C_5E~M#S~e{+|ULDmV|nc#$?+ddxG5wMh%rt zG_z3(m1Hx@=101*wo6#@*UPdTR7;Yk8RTI4ADByX=0F|IxUAR;;Za5 zkdTy6J?Qx(GIM$Cvc168>daBHvsmN?Z2^A-8Hr_C&iDivZzPHrlu<|?2FZD*TQ5IANP6s z5d>nTmX{6<;tn9M*VHI|_-wKXpx;N*PV(N33EGjF?7b6a#qm?TzDYr)oIOc?-#@c> zvg%dcN~~ Date: Thu, 6 Jan 2022 06:33:50 +0100 Subject: [PATCH 15/86] Create Screenshot-13.png --- apps/configurable_clock/Screenshot-13.png | Bin 0 -> 1739 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/configurable_clock/Screenshot-13.png diff --git a/apps/configurable_clock/Screenshot-13.png b/apps/configurable_clock/Screenshot-13.png new file mode 100644 index 0000000000000000000000000000000000000000..b87d977124e6ce8a9c16202362d61aba3cd02c4b GIT binary patch literal 1739 zcmd^=`#)597{|{XU(C_cn5kUTRC8f->$MfTu2aL9Xo#*W*X^?8GVVt$Ii?h=8)e#J zD8#lC)5V%iypC-ODWp}3I7C)0Gl(RYo!$Lu|AGBwe|VnH`}O(Zd4735uP4(-z|+++ z)`1{Mm+!&#Rjcf;B5SF8W%WRyT1aueyp2#ri|H@~X&vKpIor^{kym|*#txskg`f+^ z1qSQhQ>}xOEn6E0Uh|%Z$3-ZfRs8fr*vpCG_?fSgSIW$>FEE3V{F{}4>~*vhp`gQ4 z782Za*F^{uM-}!XkFfv9oF(wVLW?`DV_%CP47r=}qs=vjie@Y5OUP&0V$W|(@=Jjl z#4Obn^c#h7Kmtrdb^QVqlaozIcf-5#+q7xjWa^62eX}Wu7a_OO%mpkV$LcjxUta&v zP+vTJf`K959Zd>T@`K^Brg()rV5#(bN^9AehWX=ql83e%*%b07pc2t4pqIuLLhT%V zSi3&go*X`8h>38-6ja4!;~WC$rN8{rozNo~qiI!s=kVo4NH^(VnK|a*N|S3m6KsW( z(pfQVSyK$01ha(yhG@vEU$>2AwNj-e13ge=I~9(GJc)lScNwFHY@KX`*}+VeyRfO5 zd{^HbvrG33bSFqf46`)x?Q^&W9dU$g!YnXtS1Jkxw)?`1(-~uQynYav0S|(cCTd0; z$!Bm8q%EeQ6gs9&(z9l(=y-E1mF?Os*HjOz334aE36pBNdJ7OhVwomJqZ_Zzp+|LQ z;3h>*{-N0(@QYt`F$b(Ri)N4P9ohg!!IZV2pL?PHI@uH~&D6KwXkoXB;7Wkts8M$o z&hdF-m|0vB8w*C;;2hg-Ip6CpJFLJN#-n^MKZ*mxrBo%WXVAk}9f zux8F~;?9Lj4LykC>5=XIN`H!r^_%YVjUoZzn77b1oT%e+xI8Aet041+76r}j?dnj1 zIxEKbE)BBd0~>}afmP@D2+d`U|LjgdO{(8qYdBnIg%uVwmPCctnd$WIG#-(0^YI;+ z(yi`s12^??0UpDy$!V3`ar5qL=n}r!2PZX&_03WuW~1hQ?=dQ@d}t;h_yvt;q|C9> z_r0kmr|@H%btkDx?%c@4T8vH3kC}1K>!4OmP9iIADe{1%EyD=r*$nKj`vA7x^QWSQ zeXY9lb92X)L6Y^w7f&y!@9hfi9bK?xR*?Oyvu);3KhGs%4a~lLBw^L)81InhZ%*MJ zzjoH@Vl`)-f`ldb*^hE&GBx8>^-3XiTnFy`el~n+e%)DQ7K0bAerf;$ioAWeW^jH? z>cB+4z2r}kXO=H7w^Wt2Hh`#4FTA95RauJ~-@ee3GKBHYf%~L%VOQ(^(Dj&0m>T_B z6N9&7E+K!r)tMcGC-Wav-ze_i#R-NN=&Df;?>?_xokTylmCI5USuPbHc}O118X1|` zo&rXI*=)erFuYT8#HLFB0xkll0t5tU{<<=&9PMyc#dumXRj&T2_oi*r4v0&E8SX`p zP`;-+AUU{(DkqPMQU;0@OO@yKQWfpZNPe57%c=cc*IRDUOk? Date: Thu, 6 Jan 2022 06:33:53 +0100 Subject: [PATCH 16/86] Create Screenshot-21.png --- apps/configurable_clock/Screenshot-21.png | Bin 0 -> 2678 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/configurable_clock/Screenshot-21.png diff --git a/apps/configurable_clock/Screenshot-21.png b/apps/configurable_clock/Screenshot-21.png new file mode 100644 index 0000000000000000000000000000000000000000..46d799e6d2aa1296d73600ee22a335ac60756964 GIT binary patch literal 2678 zcmcJRc{mh$7sr1yjAe$`O-4vusg$uRiV+D}!dyFpNv=zbEv}4pMhmTOWJ#7>*V62E zvP~%2360&5tYL1}tgrjLf4~2|?;q!!=X;)W&R^f>^PGnmt82n=DL4Q?*v!<(=CCsV z2?4&t%&44pKP-?Cn`?%E-X%Q`09?(?=!#vq`%>0q#$RWJj4LM&aw8jtCB07^|7gi8 z9JIiIB){@}VrLc|9UB{a(8LcrW6wbl6*{E@4hjL_Y3zpsZvT7}0X!hRK?2U3zW7xO zu)Dr)-#I;IoVq$ns}|FJ&vz;seqAI8F@E)t?oX7Sb77C3szy6m3v-dhg`7Q{nmVd=fMQ;UIgIe;;~Ykkbi?8s7Nos>2Gq%89mkp-07Wpm zv5SYxug0k3H(#IH?D+9wNdx30yNap~t5PbX-_w8Xlk#>mb>#YPoHjtl=EQNk2nBpw z4J(buEquz`zM2(f_`L5z1fedY9%zbbIyxbi=OGSq6@YT0^1}%zDh%K!=k)7&S?2AW z=LHqg+Eb5(5W7Cu*B^8ve|HzZk*~o{s)e$0B&Zt;39-K=RPqict5FPp^OvJa3{>@- z@28IS1FRW$G{#Sm*#%(*=I$)kwu2})lhS}3+UX)m7Xj%i%KVWG|vK-WC>Bk0|x%zlKUe>a6U)p&Q5OVgK18aD(so;-^XwfdVmiT)Jg`x zyHhBp72f~zexD(R0bYKl$rW#kL$}a)qkUr$=RBhzxGH!Q!nQW0Y_atAR#uOhOh7;!Uh`~mdVtO$2Rn+>euyhEj#y^7SLt8_QT zK;j0XZH_jc!It;xu13$k-;jg_l>a0y4R)`K-nnccMa*MjTT4|m{Ln3{ialPEmP;h8 zUrF|bFS_j^1Y45#5!hQ0#YZlO2TN0;LuP-RS=LP3Za_MYBw(Jj78=lkzDIJRsvGm- zpg>5xPq7D&9pXd`*9LsK2m+HA_MrLv)pm)=p;=!AIO||6y~4hifxGswx5g>yrANnO5#2D?ZtctMb;(owz(_#(+0b;jReb zQ+194sKs@qJ+9g|;X{U3yQ)fJw26MIw_@yScBZ`imREPlV@WSZFBbJ+TYV3Hcs4z3 z`%ISIBhX?z;eq!qi*Zot;#=8IEzuR)YaVmFaJxG*#Ziu09jipGw$G35ehEQgU{!oR zi($BA!y$Jhah7l1a^>J=OAWl&H8}*&kb-TElFL+HYr|$nJ&^)DyAC+NtWBk~mN05Z z$7MqjR{0+6S{XTFrrfA_rsP8ix)KU9b@jv9nAhzZ!wE7~6kn9z01EuiB}pI1>O0ryHVYB4Im< zJ-mZ8#Sa}#z=q<3=*4F-b;%+Jk0F5XqYT`xhL-|G?JarOE`+48x!CB<#HUIzl^4p@ z%iZh0dWw)1Kg^y~ql_J-$E z8k?H%-75J=7Xic{y#Q+woEqD0+Tm=XsHV&kua)fu;iq&6Gy4=;WpNdd@ELBrgY9Qgus+_Bl~oL+k#{0wyH906$5wfG9F8RGyTc1FRv9IDHiu z7(9LK!;l!@;3eP5ra{5CB*Ygy90XN7;Uro>Kv?VjV68*)VNJL#`2f^RH(q>oXe4F% ztuHo!=yuy9)AG;+sYiB$4=<`zt92C|VyazWze)_;NOP6&wgtpeFWy*Jcon3=JtH(L z`ljdlY1<1%p?mo+932HYrB&lciv%+}>G5auX3{OS+i{FDmc*fJ?~-=d!3-<+$j-;> zRIw~Fh~=~OkH(zMIHy%#N)H_SBt+Dm!I5l>=jT3&+EznMro+cy-3)O=Ah3PqPNWIG zs&%87vJ2zC=~FX9Zm1HG!kP5C0QW~`{Cugf|-Z~8ynU8UFK9qBWI6U5rk^)1hU#F8OfA<;n})$;d%Op#M;>EvdUWvdbDK zuE-r3*sS_JEqe|*fgWh}eTBwE;2~8u_0;J%jy2G>kLKtSXr#e$FD#GKz*yUAm~!(v zf0wXy{|)iH;5&LBJGwQ8xU(I44^5KBVQxg|0b~7uB!z?3FduW|#u@XG9;FOZ2Rxc>8s(lY%~FHc}|Z zIp?2G3BaRb%5aehS5Juj1H5cGi!CR6KqPtk!a(@K+9Vn@vHIb=h>18{{DfuP$HPYw Nm>F9c(G73J{Tl;|?qmP} literal 0 HcmV?d00001 From b28719da164d9ccb2fce2e6ccb72f2b6caba1e40 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 6 Jan 2022 06:33:55 +0100 Subject: [PATCH 17/86] Create Screenshot-22.png --- apps/configurable_clock/Screenshot-22.png | Bin 0 -> 3508 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/configurable_clock/Screenshot-22.png diff --git a/apps/configurable_clock/Screenshot-22.png b/apps/configurable_clock/Screenshot-22.png new file mode 100644 index 0000000000000000000000000000000000000000..7ee02568ea7332cdcc302903eb0e8b2e54b84ed1 GIT binary patch literal 3508 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 i4R9g@awP?Z75D>?eJSBek!TA50000 Date: Thu, 6 Jan 2022 06:33:57 +0100 Subject: [PATCH 18/86] Create Screenshot-23.png --- apps/configurable_clock/Screenshot-23.png | Bin 0 -> 3506 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/configurable_clock/Screenshot-23.png diff --git a/apps/configurable_clock/Screenshot-23.png b/apps/configurable_clock/Screenshot-23.png new file mode 100644 index 0000000000000000000000000000000000000000..f3248993bafcf568d1bcc3b4b62b227fe33a8a3a GIT binary patch literal 3506 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

EGBAq8Mt^3+q)og)k|F}jMX IxQI>oKk(JLumAu6 literal 0 HcmV?d00001 From 59eb274eeb734c9178e3fea29b4aa606ed599be4 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 6 Jan 2022 06:34:00 +0100 Subject: [PATCH 19/86] Create Screenshot-24.png --- apps/configurable_clock/Screenshot-24.png | Bin 0 -> 3040 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/configurable_clock/Screenshot-24.png diff --git a/apps/configurable_clock/Screenshot-24.png b/apps/configurable_clock/Screenshot-24.png new file mode 100644 index 0000000000000000000000000000000000000000..8a7753bfc5dd89b2dbb0ee9b034900f5b3151889 GIT binary patch literal 3040 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 literal 0 HcmV?d00001 From 01d6e37f185ea9de7c22c50eb2250294c01daa04 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 6 Jan 2022 06:34:02 +0100 Subject: [PATCH 20/86] Create Screenshot-25.png --- apps/configurable_clock/Screenshot-25.png | Bin 0 -> 2775 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/configurable_clock/Screenshot-25.png diff --git a/apps/configurable_clock/Screenshot-25.png b/apps/configurable_clock/Screenshot-25.png new file mode 100644 index 0000000000000000000000000000000000000000..c2950d7b2ab4e1a58829bc51f2d0f739f4012f5a GIT binary patch literal 2775 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 Date: Thu, 6 Jan 2022 06:34:05 +0100 Subject: [PATCH 21/86] Create BangleApps__apps__variable_clock__README.md --- ...angleApps__apps__variable_clock__README.md | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 apps/configurable_clock/BangleApps__apps__variable_clock__README.md diff --git a/apps/configurable_clock/BangleApps__apps__variable_clock__README.md b/apps/configurable_clock/BangleApps__apps__variable_clock__README.md new file mode 100644 index 000000000..da5bed56d --- /dev/null +++ b/apps/configurable_clock/BangleApps__apps__variable_clock__README.md @@ -0,0 +1,27 @@ +# Variable Analog Clock # + +This app implements an analog clock with various faces, hands and colors to +choose from. + +You have the choice between: + +* 4 different clock faces ![](Screenshot_01.png) ![](Screenshot_02.png) ![](Screenshot_03.png) ![](Screenshot_04.png) and +* 3 different clock hands (optionally with or without second hands) ![](Screenshot_11.png) ![](Screenshot_12.png) ![](Screenshot_13.png) + +Additionally, you may use the currently configured global theme or configure +your own colors for clock fore- and background and second hands. + +Just swipe up or down to switch from clock display to configuration screen + +![](Screenshot_21.png) ![](Screenshot_22.png) ![](Screenshot_23.png) +![](Screenshot_24.png) ![](Screenshot_25.png) + +Chosen settings will be written to the Bangle.js's flash memory and restored +whenever the clock is started again. + +This clock also acts as an example for the building blocks found in the author's +[GitHub repository](https://github.com/rozek/banglejs-2-activities) + +## License ## + +[MIT License](LICENSE) From 4ffee250d7c9eb258fc8651e86704e456387869b Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 6 Jan 2022 06:36:08 +0100 Subject: [PATCH 22/86] Create README.md --- apps/configurable_clock/README.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 apps/configurable_clock/README.md diff --git a/apps/configurable_clock/README.md b/apps/configurable_clock/README.md new file mode 100644 index 000000000..fd7527d0b --- /dev/null +++ b/apps/configurable_clock/README.md @@ -0,0 +1,27 @@ +# Configurable Analog Clock # + +This app implements an analog clock with various faces, hands and colors to +choose from. + +You have the choice between: + +* 4 different clock faces ![](Screenshot_01.png) ![](Screenshot_02.png) ![](Screenshot_03.png) ![](Screenshot_04.png) and +* 3 different clock hands (optionally with or without second hands) ![](Screenshot_11.png) ![](Screenshot_12.png) ![](Screenshot_13.png) + +Additionally, you may use the currently configured global theme or configure +your own colors for clock fore- and background and second hands. + +Just swipe up or down to switch from clock display to configuration screen + +![](Screenshot_21.png) ![](Screenshot_22.png) ![](Screenshot_23.png) +![](Screenshot_24.png) ![](Screenshot_25.png) + +Chosen settings will be written to the Bangle.js's flash memory and restored +whenever the clock is started again. + +This clock also acts as an example for the building blocks found in the author's +[GitHub repository](https://github.com/rozek/banglejs-2-activities) + +## License ## + +[MIT License](LICENSE) From f495cddef5d30ad826f761ddf392ceb0e2c6c4a4 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 6 Jan 2022 06:49:46 +0100 Subject: [PATCH 23/86] Update app.js --- apps/configurable_clock/app.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/apps/configurable_clock/app.js b/apps/configurable_clock/app.js index 19dc363e4..5ed52b33b 100644 --- a/apps/configurable_clock/app.js +++ b/apps/configurable_clock/app.js @@ -1147,16 +1147,22 @@ Label('Settings', { common:legible, bold:true, filly:1 }), { height:4 }, { type:'h', c:[ + { width:4 }, Label('Faces', { common:leftAligned, fillx:1 }), Image(Caret, { common:leftAligned }), + { width:4 }, ], filly:1, onTouch:openFacesScreen }, { type:'h', c:[ + { width:4 }, Label('Hands', { common:leftAligned, fillx:1 }), Image(Caret, { common:leftAligned }), + { width:4 }, ], filly:1, onTouch:openHandsScreen }, { type:'h', c:[ + { width:4 }, Label('Colors', { common:leftAligned, fillx:1 }), Image(Caret, { common:leftAligned }), + { width:4 }, ], filly:1, onTouch:openColorsScreen }, { height:4 }, { type:'h', c:[ @@ -1175,14 +1181,17 @@ Label('Clock Faces', { common:legible, bold:true, filly:1 }), { height:4 }, { type:'h', c:[ + { width:4 }, Radiobutton({ id:'none', GroupName:'Faces', common:legible, onChange:chooseFace }), Label(' no Face', { common:leftAligned, pad:4, fillx:1 }), ], filly:1, onTouch:checkInnerRadiobutton }, { type:'h', c:[ + { width:4 }, Radiobutton({ id:'3,6,9,12', GroupName:'Faces', common:legible, onChange:chooseFace }), Label(' 3, 6, 9 and 12', { common:leftAligned, pad:4, fillx:1 }), ], filly:1, onTouch:checkInnerRadiobutton }, { type:'h', c:[ + { width:4 }, Radiobutton({ id:'1-12', GroupName:'Faces', common:legible, onChange:chooseFace }), Label(' numbers 1...12', { common:leftAligned, pad:4, fillx:1 }), ], filly:1, onTouch:checkInnerRadiobutton }, @@ -1208,18 +1217,22 @@ Label('Clock Hands', { common:legible, bold:true, filly:1 }), { height:4 }, { type:'h', c:[ + { width:4 }, Radiobutton({ id:'simple', GroupName:'Faces', common:legible, onChange:chooseHand }), Label(' simple', { common:leftAligned, pad:4, fillx:1 }), ], filly:1, onTouch:checkInnerRadiobutton }, { type:'h', c:[ + { width:4 }, Radiobutton({ id:'rounded', GroupName:'Faces', common:legible, onChange:chooseHand }), Label(' rounded + Bolt', { common:leftAligned, pad:4, fillx:1 }), ], filly:1, onTouch:checkInnerRadiobutton }, { type:'h', c:[ + { width:4 }, Radiobutton({ id:'hollow', GroupName:'Faces', common:legible, onChange:chooseHand }), Label(' hollow + Bolt', { common:leftAligned, pad:4, fillx:1 }), ], filly:1, onTouch:checkInnerRadiobutton }, { type:'h', c:[ + { width:4 }, Checkbox({ id:'withSeconds', common:legible, onChange:toggleSeconds }), Label(' show Seconds', { common:leftAligned, pad:4, fillx:1 }), ], filly:1, onTouch:toggleInnerCheckbox }, @@ -1240,16 +1253,22 @@ Label('Clock Colors', { common:legible, bold:true, filly:1 }), { height:4 }, { type:'h', c:[ + { width:4 }, Label('Foreground', { common:leftAligned, pad:4, fillx:1 }), Label('', { id:'Foreground', common:ColorView, bgCol:Theme.fg }), + { width:4 }, ], filly:1, onTouch:selectForegroundColor }, { type:'h', c:[ + { width:4 }, Label('Background', { common:leftAligned, pad:4, fillx:1 }), Label('', { id:'Background', common:ColorView, bgCol:Theme.bg }), + { width:4 }, ], filly:1, onTouch:selectBackgroundColor }, { type:'h', c:[ + { width:4 }, Label('Seconds', { common:leftAligned, pad:4, fillx:1 }), Label('', { id:'Seconds', common:ColorView, bgCol:Theme.fgH }), + { width:4 }, ], filly:1, onTouch:selectSecondsColor }, { height:4 }, { type:'h', c:[ From 8338c671c2d3e1572fb6192e617588eaf04019a6 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 6 Jan 2022 06:53:26 +0100 Subject: [PATCH 24/86] Update apps.json --- apps.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/apps.json b/apps.json index ebafa9c97..6021608e2 100644 --- a/apps.json +++ b/apps.json @@ -5427,5 +5427,22 @@ {"name":"puzzle15.img","url":"puzzle15.app-icon.js","evaluate":true} ], "data": [{"name":"puzzle15.json"}] + }, + { "id": "configurable_clock", + "name": "Configurable Analog Clock", + "shortName":"Configurable Clock", + "version":"0.01", + "description": "an analog clock with several kinds of faces, hands and colors to choose from", + "icon": "app-icon.png", + "type": "clock", + "tags": "clock", + "supports" : ["BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"app-screenshot.png"}], + "readme": "README.md", + "storage": [ + {"name":"configurable_clock.app.js","url":"app.js"}, + {"name":"configurable_clock.img","url":"app-icon.js","evaluate":true} + ] } ] From 4d4071e1514c29db60f6506f48335d4333f133b1 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 6 Jan 2022 07:05:49 +0100 Subject: [PATCH 25/86] Update README.md --- apps/configurable_clock/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/configurable_clock/README.md b/apps/configurable_clock/README.md index fd7527d0b..e1c2bb574 100644 --- a/apps/configurable_clock/README.md +++ b/apps/configurable_clock/README.md @@ -5,16 +5,16 @@ choose from. You have the choice between: -* 4 different clock faces ![](Screenshot_01.png) ![](Screenshot_02.png) ![](Screenshot_03.png) ![](Screenshot_04.png) and -* 3 different clock hands (optionally with or without second hands) ![](Screenshot_11.png) ![](Screenshot_12.png) ![](Screenshot_13.png) +* 4 different clock faces ![](Screenshot-01.png) ![](Screenshot-02.png) ![](Screenshot-03.png) ![](Screenshot-04.png) and +* 3 different clock hands (optionally with or without second hands) ![](Screenshot-11.png) ![](Screenshot-12.png) ![](Screenshot-13.png) Additionally, you may use the currently configured global theme or configure your own colors for clock fore- and background and second hands. Just swipe up or down to switch from clock display to configuration screen -![](Screenshot_21.png) ![](Screenshot_22.png) ![](Screenshot_23.png) -![](Screenshot_24.png) ![](Screenshot_25.png) +![](Screenshot-21.png) ![](Screenshot-22.png) ![](Screenshot-23.png) +![](Screenshot-24.png) ![](Screenshot-25.png) Chosen settings will be written to the Bangle.js's flash memory and restored whenever the clock is started again. From 3571435499e824ff600b6a47f1cb22672a969bad Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 6 Jan 2022 07:19:43 +0100 Subject: [PATCH 26/86] Update README.md --- apps/configurable_clock/README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/apps/configurable_clock/README.md b/apps/configurable_clock/README.md index e1c2bb574..faddd092a 100644 --- a/apps/configurable_clock/README.md +++ b/apps/configurable_clock/README.md @@ -5,16 +5,18 @@ choose from. You have the choice between: -* 4 different clock faces ![](Screenshot-01.png) ![](Screenshot-02.png) ![](Screenshot-03.png) ![](Screenshot-04.png) and -* 3 different clock hands (optionally with or without second hands) ![](Screenshot-11.png) ![](Screenshot-12.png) ![](Screenshot-13.png) +* 4 different clock faces
![](Screenshot-01.png)   ![](Screenshot-02.png)   ![](Screenshot-03.png)   ![](Screenshot-04.png) and +* 3 different clock hands (optionally with or without second hands)
![](Screenshot-11.png)   ![](Screenshot-12.png)   ![](Screenshot-13.png) Additionally, you may use the currently configured global theme or configure your own colors for clock fore- and background and second hands. -Just swipe up or down to switch from clock display to configuration screen +Just swipe up or down to switch from clock display to the first configuration +screen and continue from there -![](Screenshot-21.png) ![](Screenshot-22.png) ![](Screenshot-23.png) -![](Screenshot-24.png) ![](Screenshot-25.png) +![](Screenshot-21.png)   ![](Screenshot-22.png)   +![](Screenshot-23.png)   ![](Screenshot-24.png)   +![](Screenshot-25.png) Chosen settings will be written to the Bangle.js's flash memory and restored whenever the clock is started again. From e669138023cfb661bd599308c4b8b21e427c3cc1 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Tue, 11 Jan 2022 16:28:48 +0100 Subject: [PATCH 27/86] Update apps.json --- apps.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/apps.json b/apps.json index c93efd152..a62bb19cf 100644 --- a/apps.json +++ b/apps.json @@ -5538,5 +5538,22 @@ {"name":"limelight.settings.js","url":"limelight.settings.js"}, {"name":"limelight.img","url":"limelight.icon.js","evaluate":true} ] + }, + { "id": "configurable_clock", + "name": "Configurable Analog Clock", + "shortName":"Configurable Clock", + "version":"0.02", + "description": "an analog clock with several kinds of faces, hands and colors to choose from", + "icon": "app-icon.png", + "type": "clock", + "tags": "clock", + "supports" : ["BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"app-screenshot.png"}], + "readme": "README.md", + "storage": [ + {"name":"configurable_clock.app.js","url":"app.js"}, + {"name":"configurable_clock.img","url":"app-icon.js","evaluate":true} + ] } ] From 216610780f734f111704c99964f567fb2b8b24a0 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Tue, 11 Jan 2022 16:29:19 +0100 Subject: [PATCH 28/86] Create app.js --- apps/ac_ac/app.js | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 apps/ac_ac/app.js diff --git a/apps/ac_ac/app.js b/apps/ac_ac/app.js new file mode 100644 index 000000000..1d9b2e3c6 --- /dev/null +++ b/apps/ac_ac/app.js @@ -0,0 +1,2 @@ +let Clockwork = require('https://raw.githubusercontent.com/rozek/banglejs-2-simple-clockwork/main/Clockwork.js'); +Clockwork.windUp(); \ No newline at end of file From 0666181c8d8b83161364b54264de82d8fc774e5a Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Tue, 11 Jan 2022 16:29:24 +0100 Subject: [PATCH 29/86] Create README.md --- apps/ac_ac/README.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 apps/ac_ac/README.md diff --git a/apps/ac_ac/README.md b/apps/ac_ac/README.md new file mode 100644 index 000000000..0e0084b64 --- /dev/null +++ b/apps/ac_ac/README.md @@ -0,0 +1,34 @@ +# AC-AC - A Configurable Analog Clock # + +This app implements an analog clock with various faces, hands and complications +to choose from before uploading to a Bangle.js 2. + +It is based on the [Analog Clock Construction Kit (ACCK)](https://github.com/rozek/banglejs-2-analog-clock-construction-kit) +and makes most of the currently implemented parts available with a few mouse +clicks - just click on "Upload" and you will be directed to a web form where +you compose your very own, personal analog clock. + +You currently have the choice between + +* 2 different clock sizes, +* 4 different clock faces, +* 3 different clock hands and +* 4 different complications + +Alternatively, you may specify the GitHub URL of ACCK compatible modules for +external clock sizes, faces, hands or complications. + +Additionally, you may use the currently configured global theme or configure +your own colors for clock fore- and background and second hands. + +Consequently, even without external modules you already have the choice between +87552 combinations! + + + +## License ## + +[MIT License](LICENSE) From 16b50228bdaee15584a5c2b5e7a9b5d38ff1cdbe Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Tue, 11 Jan 2022 16:30:27 +0100 Subject: [PATCH 30/86] Update apps.json --- apps.json | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/apps.json b/apps.json index a62bb19cf..aa626a609 100644 --- a/apps.json +++ b/apps.json @@ -5555,5 +5555,23 @@ {"name":"configurable_clock.app.js","url":"app.js"}, {"name":"configurable_clock.img","url":"app-icon.js","evaluate":true} ] + }, + { "id": "ac_ac", + "name": "A Configurable Analog Clock", + "shortName":"Configurable Clock", + "version":"0.02", + "description": "a highly customizable analog clock", + "icon": "app-icon.png", + "type": "clock", + "tags": "clock", + "supports" : ["BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"app-screenshot.png"}], + "readme": "README.md", + "custom": "Customizer.html", + "storage": [ + {"name":"ac_ac.app.js","url":"app.js"}, + {"name":"ac_ac.img","url":"app-icon.js","evaluate":true} + ] } ] From 3715ae433a796088c1ac0444b507c42162329b7f Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Tue, 11 Jan 2022 16:30:48 +0100 Subject: [PATCH 31/86] Create Customizer.html --- apps/ac_ac/Customizer.html | 91 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 apps/ac_ac/Customizer.html diff --git a/apps/ac_ac/Customizer.html b/apps/ac_ac/Customizer.html new file mode 100644 index 000000000..6637b5df4 --- /dev/null +++ b/apps/ac_ac/Customizer.html @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + +

A Configurable Analog Clock

+ + Please customize your analog clock for the Bangle.js 2 according to your needs. + When finished, click on "Upload". + +

Clock Size Calculation

+ +
+
+ +  
+ +

Clock Face

+ +
+
+  
+
+  
+
+  
+ +

Clock Hands

+ +
+
+
+   Hand Fill Color
+ +

Complications

+ +

Settings

+ + Foreground Color:
+ + Background Color:
+ + Second Hand Color:
+ + + + + From fcfa78cb989f9b0823c69cc70367fe78932b5fb0 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 12 Jan 2022 08:50:21 +0100 Subject: [PATCH 32/86] Create none.png --- apps/ac_ac/none.png | Bin 0 -> 1430 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/ac_ac/none.png diff --git a/apps/ac_ac/none.png b/apps/ac_ac/none.png new file mode 100644 index 0000000000000000000000000000000000000000..6f8d8ae14912ac974d77928fd613c80692486969 GIT binary patch literal 1430 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v-}aF%}28J29*~C-ahlfi=L>#WAEJ z?(NKreX|WjT&Dm3pRp>oQ_HEdmiOBx=03iL^sPW(`mO0Skq@3{2jSlPg$`F}`FIh>(&$tZcyNVcu}y z(hmu_#zKc(j4acR9sj`5!+eQXVS|ZXn|p%Hggl1Er5_D#m>xHb8i_Y7qdE5E-mahY zd!O^yrH$9~_Wi%LR=%?FF5}q>>ACR*+KqS1rb~X3`(7|LA}S$V!}w^e`i9GaPGJds ze2-^Y@B1LeR9v#+^c%H}OAfr*SDJWUTkuC!`Q>#b%?4{{9O}IjSNBtP#$)G$w=N4U z=XLOVa8dRNPxhBz*W3%9-u`p>eEo8BrvCk3F0Yf&{jc+8xnq@e<$JsN>)ywfpV|EC zr){IQ{zH=r?mU&f%-NE>b-R`tF^9&%=>#} z)(YbfmznO>*11mT>e=f*^;Ge{Q&KE;wHK4w|7mAkd*+a!*r>fbo7LL7VChoVY`4?v z=gf@Gt~xLM^Sh*bhon%rRb)&4uiU3)4?gGbwp}0^vDftK{i5pq%<+OdK1G+UZ{BRW zch6IddEPN9Jb1$7w*4jBLfs92?1X^@ OErX}4pUXO@geCxFHD;9n literal 0 HcmV?d00001 From 4b4a4e117b4f436d22528cf0f8b2c5164e0beb66 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 12 Jan 2022 08:50:25 +0100 Subject: [PATCH 33/86] Create custom.png --- apps/ac_ac/custom.png | Bin 0 -> 1668 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/ac_ac/custom.png diff --git a/apps/ac_ac/custom.png b/apps/ac_ac/custom.png new file mode 100644 index 0000000000000000000000000000000000000000..14d797ba32005a45ae28d36b2f6775989a01836a GIT binary patch literal 1668 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v-}aF%}28J29*~C-ahlfz8g-#WAEJ z?(NNsMYr7qTrPh2Z$C@ZdYaeKh8K}e3TaO!hw~q}cU!!>wP^SK_uuRPv>ymyGH2q? z^?P%lg~O-iA`6GjF1v@EXBtOYGz$ZL(H~{IYt0Jw-`{$1#)0eW>W;p-bUl@+ob}R; zg{K#n-YJOUxbrmA?(l@ZrSg&K+rP#r6_|6lbNOEXw`FTtb@9H~2YC#W8r=W?UC#NZ z+kLrdtkwsAJFA+G`zzlp=6`(s_3kyV*E0Rj-JQSvZr1^J&XUS3e!b+EpXTp+rZ@Xy zs`ZEa1vNiTS{F>;y4Ux?V*fX`UoG2o zDF5Zwtp+un2ecPV;yC{vnP9V_&ZonV+U5By15-!?uFy9Z#dZS8V0qu%ac&r(RXb%fH#n z{`lrBjz0>|y(ad{b40Jd9g_9*`?oZ$Np)vJ&TqQ9bMfo7G4V4!g_iSO()%y_|K2x_ zK*0ijho`?n8~6W<(<;vnU&|F^`TU)%ecaA{n=)-aseR~c6lFXwQnC8N)P4)5`s4p* zy-#HScX-7v>vdi+wF273SIygGExPyH1Zuu`?W_GcUHn(h#HpV*%2q^9oUXSch5g>I zh6vmErJt`~tgp9mT4G-rTDEs@sr=dMFOBw9Z0qWT_oTeM7x?+#vG{ckb=$b#>+aDy zf6DgTzb{`Z=C^#fx%ZOuN1gm%yNg@hcO8GFHd&%(`;Phf7EJ%!7X`iO3Yf}Xxaq*l z-oj}c{#OUbs}?-vyl>@R7whnK<@z_v*4G>ft*?Lmbx+Zp9}&f-kFCodT;2XM(rN!& zo;|+;H*bA#>c7Pe=C2ihvpC)B?dPtZU&|gMH|12+r8B42&3aclZNv0;2iDhU?BQ;? zzf$;x();}R_bOX{^u_MzyZJY(QE;LHh^WG0rpn7)je z42{Oh!o8dVI|?lqr82Rc>+vxGDmeDEV;ZM`g|X4a84Qim)0Lw}H4Tw~_@IArAD4~) T%p(VY)e3{BtDnm{r-UW|FwpmH literal 0 HcmV?d00001 From 4039f71dd60df8137121de6631403d54544b9f66 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 12 Jan 2022 08:50:37 +0100 Subject: [PATCH 34/86] Create fourfoldClockFace.png --- apps/ac_ac/fourfoldClockFace.png | Bin 0 -> 2121 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/ac_ac/fourfoldClockFace.png diff --git a/apps/ac_ac/fourfoldClockFace.png b/apps/ac_ac/fourfoldClockFace.png new file mode 100644 index 0000000000000000000000000000000000000000..391303b31d4d1ce4b1bacdb4bd67501a22ab53a2 GIT binary patch literal 2121 zcmeHJ`#;oq7ytVD4qr|9&S+6)t*=WWCE>%CpR~m?kDEVN4gwrDvYkbNTK051t>+=Y2lsbzbMZU+28e>zuNn zKws4@JGKA-pz81E6(YyBe+sN5e_OjGG&v|74e|8=T81bu0RUF?_i_)*p)FjA&bn@i z5FTx6E$lVyEw=L8u)X?QYQscB*dpBPfAhtg4+T;JcA9(<5pvQ;|I)MbNM2E9-Gb?o zD-pYp#M5M6G9~4t*2VK>)}`Ak@KZNjs@ja1RGMLg89o#QY05gXMizK?UNekON_F~> zNCA_TOtK8%-=aLLOykDFW(S`{b(Sxd;r9vl+9kNp@!)Ci=h}tkzwh^?&yan-*J8!; z)+hGKKOuRN{L5=OPO}=%MgAqr)~T+l*cmG0v(=ffLoLI7K{KXKx-i2lft0i2mwfz( zQvBC&H@c(!z;(&&s3TZ8jDy(IM3~WU{8{%q!$pke^YK$7+J;<{ z94j$;HHSUm{B2!#{!{j!_GO60z=S2F8RAJtZ%xbTLKV12&_Ey3t-ZRox&72E|gOvqZ1$0_Ai2leKmb)&sr7QRp@bGmLzd)zBBJ?({wG4ouiR z2?nDFA7h?^T#vKkp6XcNTvRb43|Ra|w>7lnS{Q`3ff4z;z|w!InqX<~7NUpP{``7n zxg}es2eCU|mCFf~gpf|+TOt|gefoCr$?M%WzZEG zMo>Fa&RXRcp4(0CBasTbh2P zT)QkAl9D1Ducp2w5L`NV@axfF*R@077lUgHEnKDj%4132)~AuMVNoVY*m5;>mH_dq zcnq|_;Z;I?q`0Y!izg7TjgPp@G=MSTG>5jYy(b=OY$-ULOA_9^mOM5n>ABm@Kp8v! zOt|7F<_f6FocUYzxn!)B$!WrV|FX7(o$$Jvzz-dNP7xaXkh!Qu;5YF+8R(Eq^lF9( zK8>10Q>FvoEgosd4FvgXYP_!RWAaHig2cg+o;&z$@7h9XI*SPD`cFouqIoh4*Mdv^ zf~1~z3q#xmtD3Oss+3wY>C{jbcdSKeGD1AwdNE43_p2jzf#jTi^S&&T)IHK+pO{@~ z2kZh7?cBm}T@P_9m9oonn!h5Bg*IQY_5J9QjY*=KvGl9EX+^kzTWDa@fIpuSqL$N~ zCA?I#yIDtv;3L{xek=tWvuEhJp_OYN`L!t!*s4BYQ!#NK9L>zEXQ^Z3fbT{pb@+^T z!8XufsWA73E+0}7%@$bwq(g*CHu&8WG~T%7afqEk3GRBF`H5Q2ZcB9OorlYL*16Te z(dsX>2z5#4#uOWp*U38_EJ93|TLh{YYbBEQV`(b5#F_h}^+_cf zZ%o-I*3cS}jF=Da=V#KEXM4_f6)TCp^IHd0XcGVCp4b~87 zrV9jV)BYZ{dm4xkPWe>!oK-p%3cm?2cOhZat!`qohj6X;dvh(U!_t7M83kFOR2CV` z5R)Hn8`Lktqv8h5(IVXFqDhrEfOQC}qCEhNY8h&H8UPbmMqMWXu$q3;Pg4OJ(x;}V zC_omy`&ee6JSKaR48jLbT+)w%5c|_+zZgMCH)P}eGpr|1lTMX`O8luflAOWM5;o%Y z|Ahauq=C58m!rGieJI!&rk5^n24>MbF!if`y53y)Hc&Y&d60YFZCXzVQ;6ximkxw+ zG}@cH5;MdA-){%-SR2EAnDdD+<=?6=xHQndqFPjdV7LOq$c}k*yO&x~Pnnw-xcOhF z8fVLV2_RsgWHhUehcflojCE}6rs}TtEOGbH#Q+CUIQ>+kb7iB5s%;Bmifq2oxAP`n zyS;p7fY|#f4EjUdJ9@$t*>V_P#LMd~flP_mEKz Date: Wed, 12 Jan 2022 08:50:40 +0100 Subject: [PATCH 35/86] Create twelvefoldClockFace.png --- apps/ac_ac/twelvefoldClockFace.png | Bin 0 -> 2493 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/ac_ac/twelvefoldClockFace.png diff --git a/apps/ac_ac/twelvefoldClockFace.png b/apps/ac_ac/twelvefoldClockFace.png new file mode 100644 index 0000000000000000000000000000000000000000..fc04d865e38f930ea094d7e03dd4729eaae70a66 GIT binary patch literal 2493 zcmV;u2}1UXP)Px;cS%G+RCr$Poo$z^Dhx(%|NoEfUCy)}k5x!QKoa)(cGiRto@^s8Y9G(%^Z6hD zP#~xR4*(9DIl}%?0Du7@v;qL^kiN&`@$n*=k?rlbhLSc8VWxBez>R6uz<9Jhb`8k- zWB{;Uv){SbuIlbxlpq9Pqu7OJ0BqFsIBj_U{|eyJG($TDF@~J782}s8x8vu4n zsTN@1^${L`eRTY6tJS6ufa@gq%S}jtwev=;y+vY41)d4s5t>+Z)V2u+uoeQXy;i`t zy%ykFrMAW)X*Ws}Ni3~4VF1>id}-~Qg{R!x_g6z%yoLP)qjXzd3M<+iReY7(Xb zYsJ^v-$vEIjx%Z!2H=5trmH{-0C1pW5$d-B01OqO6#(GS=_7amhJnxu0C4E^5j+6H zKxhR3ICT059)MvWv;qJeI(-BWz%US60RRr2K7t2e7znKZ0EbRroZyd7!bxAot&PwH zVC`p8?4jS=C>Xq{*fVCgn+hjkh&|ZUypVoCo;FWVTz(=WTZ@8BJ?lqWo z(trO*x13oQV4nE~;QLt!6@g~aem1by_FskbX}ydNo~Xc~I5Y)oS-4-Vb*`q9+Q6v5 zTE!N$FKvZM>YsPj{pX^f0xw9UV#qVYyA6X1tVrf+rma(kAHZHee&aP|U=F+*g@*CA zR^4}(z2Uv30w1r$5rZ`3aM>na@E)sgNl?i=`l`Ko3Q;@bes_3w*l`t1%RrVT&S~JD z;GR|B6abg5O5k-O(cq>ByoNALP0SV8)EkYaQy?u*yq`iw z2RYl`u4a9aej6=wHD0yqF1HUXg?JMtN;L-FUyRdN;Ll`#_i9V+7Bw@(fctOumH}7` z@{AAz?|1204&a~LPQYpmyyy4LB>|39jRChj;aeKu*{d<|)>bPEE#hiYNT(H}=Ef`U z?bdR&+%}q25Glkxx7(dGM5^XFZqY7;#-S*}U`B4$_y91K_i(CKDHf+cPf@DCwZw_4 zPB2)n!mVksZ+EK84qm{$IFtb3{#T0>~Y}+ck!A2Y`XM4)12s4DgkcWA`NFJ0YLD7x2nxtyr1n zz;B<`Io`#&zDwkRoou=t=f7O+wuCkTeAZ>jp)JIOtqxmfz+29-bB~^X^SS44%7=XQ$RQUm5m0TQLc*y1H1Asl$r22ZOXz~HTCfRn4 zfVWk_ruG2bB;U`I*X%sBYS_>ofE&aE-WKtE+5&Kkj#S?k^<3HlaEpup+@hXKTL8Ao z2)tJ1T-yP#RZal5D(Bh`fGu(YuSK;kZ2;IJD*#(m>(T~*wXy=QR!pvGSwn3-Oq6W zZ&!GaQ_j}AbGIpk=T+8S(R~L1++A)@HktuWwTJ`W?(j}mf!`zUbyPS+(Z50Pp}wJl zw|C}Jf!o8FzysBHf+Xle0AQ-Go|=hT0PydmjH$y!P-;Q}U;x(eGMy~|1MqZEY61da zrVkokrn3cL0G-SQB8X zZ<^}@fYYRM&4GjjxcOC;MJsT#ZWCT3>jAtdyuSyI4-tZ`Z%K$caWVp6Cm|!a0pI{x zD!#6=aP{3+;7Ap=hFr)BTpCpACDYX(n=EQmBW2RRrvjMjTiG*x&4G^}*xOn~t;#6@ zK265r(+BAyE*i*d01Ui8rCG9w1K^wHN=zT>!b?5_7Hv9_rUJ8gs{<@q`~q;Bj;7XB zUz2SAH1hmfPJ1+R4=F0}tkw58=e&Dm? zX@_*GT!aUB##`U4084fv?z*^C)b5Pa06dHE5mx#szGL@-I6T1CE4Np>jK{UTwDRx^ zz#b~@Z)pjSYn>%>bqBz%a^^hka+b)|9RRz^3Bb;BR^0(`RU(~1ghiZgL~~mMuycMg z9u_!DyA%N6yOgJ27X|(YT-Iz_?m;3>00000NkvXX Hu0mjfm>s5V literal 0 HcmV?d00001 From d20f6ddd1e06370dadcf0afe7debc8bf0f563334 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 12 Jan 2022 08:50:43 +0100 Subject: [PATCH 36/86] Create RainbowClockFace.png --- apps/ac_ac/RainbowClockFace.png | Bin 0 -> 3493 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/ac_ac/RainbowClockFace.png diff --git a/apps/ac_ac/RainbowClockFace.png b/apps/ac_ac/RainbowClockFace.png new file mode 100644 index 0000000000000000000000000000000000000000..2defa759bc33a9c441c844e9f9950c6e0801ab5f GIT binary patch literal 3493 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 Date: Wed, 12 Jan 2022 08:50:48 +0100 Subject: [PATCH 37/86] Create simpleClockSize.png --- apps/ac_ac/simpleClockSize.png | Bin 0 -> 3203 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/ac_ac/simpleClockSize.png diff --git a/apps/ac_ac/simpleClockSize.png b/apps/ac_ac/simpleClockSize.png new file mode 100644 index 0000000000000000000000000000000000000000..49650586e01cdda1e25b2ac3aa464cb58f80d042 GIT binary patch literal 3203 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 Date: Wed, 12 Jan 2022 08:50:51 +0100 Subject: [PATCH 38/86] Create smartClockSize.png --- apps/ac_ac/smartClockSize.png | Bin 0 -> 3291 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/ac_ac/smartClockSize.png diff --git a/apps/ac_ac/smartClockSize.png b/apps/ac_ac/smartClockSize.png new file mode 100644 index 0000000000000000000000000000000000000000..6891acc89e7b1a3bbdd28e1d6e0944673e67aace GIT binary patch literal 3291 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 Z{{b@j@|O7s$qE1f002ovPDHLkV1h@MC+z?L literal 0 HcmV?d00001 From 4fcad7444e3d6bcf2334ecf48c520704a71f8632 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 12 Jan 2022 08:50:53 +0100 Subject: [PATCH 39/86] Create simpleClockHands.png --- apps/ac_ac/simpleClockHands.png | Bin 0 -> 1446 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/ac_ac/simpleClockHands.png diff --git a/apps/ac_ac/simpleClockHands.png b/apps/ac_ac/simpleClockHands.png new file mode 100644 index 0000000000000000000000000000000000000000..820606f27cc11a8cbce78c9d8ef2da401f61dc12 GIT binary patch literal 1446 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v-}aF%}28J29*~C-ahlfi=O?#WAEJ z?(N;zWs4$2S}%V3D}PHa?a8%HH> zcK*G_a6n;+G=qh$-9yGSg}V#~UVh}{H(-9r#^BfQU(q1xVa`xcRda~>jKeO*hRctI zpQFVAN_lJhh{_eLbUNg

zG{7^zIy>?kTHy4;|a4cR+f^ zi5MlYrYOq{nf0@GOs(bl{q3RhVa5DMe(#yB^FK&49bWX8V_Wmu>K)2Q*dO%U|4>wX zpYd9b>x2KEc9%Vy*H%j$*#1F|>to-?cmLGh$vyC9+->Xk=F5qK9kX|6c9gSMK9Bxx z;NG!b`u+FwnmaysDD3a$-&D%a{zLFYy=|rSe_OdeRI47I-~DiJ zl@!a5XkBNevXmd6U)mlBe>Ib-aV!@zV58R?Opr_w>HYJ$>w@;vwr5yUHpEJUq3bbzC7w*yynKyTE+?{|OoA_dD!zXfM9c^kC=Nzd!b6cjy=B$J^H{ z=YM;=t##A8m$?ja6|?5cCzrCmi=W<9bx(m|-u2sW-&gGqoc*o(LVdi Date: Wed, 12 Jan 2022 08:50:56 +0100 Subject: [PATCH 40/86] Create roundedClockHands.png --- apps/ac_ac/roundedClockHands.png | Bin 0 -> 1390 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/ac_ac/roundedClockHands.png diff --git a/apps/ac_ac/roundedClockHands.png b/apps/ac_ac/roundedClockHands.png new file mode 100644 index 0000000000000000000000000000000000000000..cbd48e856985e2cb0c840b2336394bcb719f788a GIT binary patch literal 1390 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v-}aF%}28J29*~C-ahlfmOrP#WAEJ z?(LnoeYYY6SS~#MD?dy0qLARU{%%9zU9X;`A8T8;PWd(46ib=@VF3?1;uUF*euUzCW1E zxZbW;abB;5)CaAk{|9DwTgVw4DK1>+6UTUCXGQCwGuf*cfGXy8KTlZ4yr&B&#`ehT zfWY|!JB?Cx6P`a3mAhZ>Yy05p@{PqG%ahoC?2ilEx3gI9pWP9L_!6d%-x+Jo1P_>- zZDG1O@sZ@(`9CcWlz-#-c%Gr=dn`lUhJ&I<&K-R(RP(;BVg4KbN8cN2f8{lZo9|(| zxwE2hrga?K2kz4?KU!1&URcVof5!`uYJI)0y{8%PZP+7vWP6|R^4~JXW;%Z^+HdJM z+f}*vyTbgis`uh+9QIV+HP8RTa&O1^@Q?HEKkK<&oc#FF`aI@}$8z$viSzfW>^X0? ziZH)zlAlFulsjz^0!~_ zx7SVD_<6_Uc)ka7wPRX$7Tx`t(I@v`pZkF<<9vIi>TlU`+aK&TPqWTyC}*juTIt^L zzSeHfXO7VLX$*U|&*MIFUH|W!lQorp=lQ?9{Cb()O2&T-58U;CzTlpazW7b26|2dC z^H*vfJpXRzeD71(+ZBxW7NxaU+xl~36M3W_ Date: Wed, 12 Jan 2022 08:50:59 +0100 Subject: [PATCH 41/86] Create hollowClockHands.png --- apps/ac_ac/hollowClockHands.png | Bin 0 -> 1669 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/ac_ac/hollowClockHands.png diff --git a/apps/ac_ac/hollowClockHands.png b/apps/ac_ac/hollowClockHands.png new file mode 100644 index 0000000000000000000000000000000000000000..2dce42ef598eece0c07beaf0fe57fb6b38555834 GIT binary patch literal 1669 zcmeHI`#02i82)@`%#g@V%E=5iO|eMGu`^OExisVwyRk8Ju*z)=a=%Rx$EnS#M2Fp3 zotW%oMvVI~-?hogEv6z3^W}(!#tf~?4#w)Vf5QH_KfKTLoacGZdEfK?@)r7dxoN87 z)d2vSlrzr0J6!jv)UZ3qZJr6}mg@z}G4K0r`BUqRB6e?SIK8-^pThVMX!I1LdOK0)lvn&z0o>K6uv)AR|)0ld#7B z>eCGn9>b!vZ*(Qyd_u3AYfLwVNxU^KVRA#@7+m0!)GYymt|+|!yVl^feT+D(vS$ki zOgUv(d53Lvyi0YT4O3m7HNu%lGql&5Hi6tKnXG}iEsB?F3x<^upEbr(5h)%Hlsq^# zBSg`%MzHaoPg$y>^s0aiR6xVPTy45KZ0@hVHhp1?1$}Tow>yG2E&=Vn&XF$zNJo&@ zX4f;8TFO`$Q9>2n0-GvQ=@h@$zF!|4Md1D@^hWMcLq&GA_`h1qH0ux5Ew|p2RSNt!}D{;xV&t6s1|tLT3vEq+GKHV7u8QlvyP7b*&g8hssb*G%xuk^P)3zMDh~_F z0x%obXp#CXW4kf_BU?x6=DnuINV#ka+vT;@9f9q_x4x7M?=;IjXm&5Jyf%j>YZ`KJ z;#Fn#=o_|pW^1F#p{t_`1L7#Mi7)}PWuo+`K~&PCI@Gnt}> zvzHjVq5L=clY8g*4_~eq9rjJ3lq{z7GD+l{!KXu z<0^`6(5TK*{f^MgHv7Fp!O>vwO!7s(ho7w?A<#^DlN`7TT8`9KHC_if2_Xh)$I<-# z^mF`6_xk~Q)9mW&=s$|RQ4n@L7FAo8A(+&V>%hjX_RhouIBR%#u_GHw8W((Q$0W|O ze1LMFJY2X&JzHC5?eMdvCCoIEFURBh0n1hSdqj2ISG+3kk`|}D>9_GX*mKIYIzgDP zb%Sbn;ZAO|%@gVo~yCyYv-V3~{%XtddMD zKx@#S_SQuMY-&J7aTf@7?_DvRo|D@EbSAmW90N8@PYF|Q)NqP02M`WYuZ3Q>Jtri+ z9ph|38gdT2I;n^B1&f6E()88 zETtPHa!52bGNRMq>bOHCR?R0!h?TYfccG|%CxXv8pof+<%`*YKWt|fG--U8j>OiIW U{v?a^oxcJoE?&+Yr;FGA0bv~;9{>OV literal 0 HcmV?d00001 From 657cf26dc54e0b94bac8baa9cd865493202e2a37 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 12 Jan 2022 09:43:39 +0100 Subject: [PATCH 42/86] Update Customizer.html --- apps/ac_ac/Customizer.html | 531 ++++++++++++++++++++++++++++++++++--- 1 file changed, 491 insertions(+), 40 deletions(-) diff --git a/apps/ac_ac/Customizer.html b/apps/ac_ac/Customizer.html index 6637b5df4..203235e3d 100644 --- a/apps/ac_ac/Customizer.html +++ b/apps/ac_ac/Customizer.html @@ -19,73 +19,524 @@ } + + + + + + + + + + - - - + + + -

A Configurable Analog Clock

- +

Please customize your analog clock for the Bangle.js 2 according to your needs. - When finished, click on "Upload". + When finished, click on "Upload" at the bottom of this form. +

-

Clock Size Calculation

+

Clock Size Calculation

-
-
- -  
+

+ Click on the desired clock size calculator (if you installed some widgets + on your Bangle.js 2, the smart one may produce larger clock faces than the + simple one): +

+ + + -

Clock Face

+ -
-
-  
-
-  
-
-  
+ + +
+
+ simple +
+
+ smart +
+
+ (custom) +
+

+ If you prefer a "custom" clock size calculator, please enter the URL + of its JavaScript module below: +

+ custom URL: +

-

Clock Hands

+

Clock Face

-
-
-
-   Hand Fill Color
+

+ Click on the desired clock face: +

+ + + -

Complications

+ -

Settings

+ - Foreground Color:
+ - Background Color:
+ + +
+
+ none +
+
+ four-fold +
+
+ twelve-fold +
+
+ "rainbow"
colored +
+
+ (custom) +
+

+ Clock faces are drawn in the configured foreground and background colors + (you may select them at the end of this form) +

+ The "twelve-fold" and "rainbow"-colored faces may be drawn with or without + dots marking the position of every minute. Which variant do you prefer? +

+ without dots
+ with dots +

+ If you prefer a "custom" clock face, please enter the URL + of its JavaScript module below: +

+ custom URL: +

- Second Hand Color:
+

Clock Hands

+

+ Click on the desired clock hands: +

+ + + + + + + + + + +
+
+ simple +
+
+ rounded +
+
+ hollow +
+
+ (custom) +
+

+ Clock hands are drawn in the configured foreground and background colors + (you may select them at the end of this form) +

+ Additionally, all clock hands may be drawn with or without second hands. + If you want them to be drawn, please click on their desired color below + (or choose "themed" to use your Bangle's configured theme) - if not, just + select "none": +

+ Second Hand Color:
+ + + + + + + + + + +

+ If you prefer "custom" clock hands, please enter the URL + of their JavaScript module below: +

+ custom URL: +

+ +

Complications

+ +

+ Complications are small displays for additional information. If you want + one or multiple complications to be added to your clock, you'll have to + specify which one to be loaded and where it should be placed. +

+ Up to 6 possible positions exist (top-left, top-right, left, right, + bottom-left and bottom-right). Alternatively, the positions "top-left" and + "top-right" may be traded for a slightly larger complication at position + "top" or "bottom-left" and "bottom-right" for one at the "bottom". +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
top-left:
  Complication: + +
custom URL:
top:
  Complication: + +
custom URL:
top-right:
  Complication: + +
custom URL:
left:
  Complication: + +
custom URL:
right:
  Complication: + +
custom URL:
bottom-left:
  Complication: + +
custom URL:
bottom:
  Complication: + +
custom URL:
bottom-right:
  Complication: + +
custom URL:
+

+ +

Settings

+ +

+ Color faces, hands and complications are often drawn using configurable + foreground and background colors. +

+ Here you may specify these colors. Click on a color to select it - or on + "themed" if you want the clock to use the currently configured theme on + your Bangle.js 2: +

+ Foreground Color:
+ +

+ +
+ + + + + + + + +

+ Background Color:
+ + + + + + + + + +

+ When you are satisfied with your configuration, just click on "Upload" in + order to generate the specified clock and upload it to your Bangle.js 2: +

+

From 10896c63ddb881ececcf1749c142989c07062dc0 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 12 Jan 2022 10:07:15 +0100 Subject: [PATCH 43/86] Create app-icon.png --- apps/ac_ac/app-icon.png | Bin 0 -> 4120 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/ac_ac/app-icon.png diff --git a/apps/ac_ac/app-icon.png b/apps/ac_ac/app-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b83541133fb2fcdcc215cf294baa7f5565215f58 GIT binary patch literal 4120 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 WA~L?Y2T6SZ0000 Date: Wed, 12 Jan 2022 10:07:18 +0100 Subject: [PATCH 44/86] Create app-icon.js --- apps/ac_ac/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/ac_ac/app-icon.js diff --git a/apps/ac_ac/app-icon.js b/apps/ac_ac/app-icon.js new file mode 100644 index 000000000..20caf2c8e --- /dev/null +++ b/apps/ac_ac/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgn/ABH+AQPvBpIAI/n8/3f5/PCp/v9oHF7w1CABffGxAYMH4f9z/514YDCxW/O4gFBxwHD/ZEL7/9GgX8GwQLCBQQXH/uP/Hf/2N44IBAgIXJ7oaD/3v/3uAYIIB9wQGAA2+/iRG5oSIM4f+1nrPYgAB3aHIAC77QYYRoCAAP676ICABXYFIntDoPf3+PC5f+BoPOX4vPNBn7IogEB/eu3QXC9wNEAAeKBIP+dgbSCDYMwgEApQVEygPCeRH8iAWBAAMHPwXDgoRGAonACwYABgN5uMAC4q8GC4U0DQsAggRF9gXFgggB/2hC4kdVAQCBVAX7xwXCVAnGCwUadAeeDYfr7IhEAAf93e+A4gpB9yRB/mqcgndRgQAHzqRE1gEC/KoCjLZEsgCB9evO4gOC/RyEgqdC2KnFO4S/KgFYsC/Ga5EBs1AX5bXHgx1C2YXEnp7GCARgB4AfE64WCnawFCgf9VAK/G/3M7zWDz4PF/maXJIAD7D8EVAP85QXN3OP/42DfoQXN/wvE/ySGABa8FAC37AgepVwQ9E1SfBAAJIEAAnrBQ39xgwJ7pRHFQX+3QECCAbyG9bPDzwXC9QMBdgQXIAAf41wEC5pLCJJBcF9fZQ5IAGYYn81q7RJQwWC/wXM9/tA4veCxooDIAPv55PEABwpB97rDAAw")) \ No newline at end of file From 54ad33318a382b741a41e9d5fce4ad9b869449ae Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 12 Jan 2022 10:08:42 +0100 Subject: [PATCH 45/86] Update README.md --- apps/ac_ac/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/ac_ac/README.md b/apps/ac_ac/README.md index 0e0084b64..05e5f4798 100644 --- a/apps/ac_ac/README.md +++ b/apps/ac_ac/README.md @@ -22,10 +22,10 @@ Additionally, you may use the currently configured global theme or configure your own colors for clock fore- and background and second hands. Consequently, even without external modules you already have the choice between -87552 combinations! +102144 combinations! From 797d5fbd8185f6459187c494b5433b12a5732f84 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 12 Jan 2022 10:57:10 +0100 Subject: [PATCH 46/86] Update Customizer.html --- apps/ac_ac/Customizer.html | 186 +++++++++++++++++++++---------------- 1 file changed, 106 insertions(+), 80 deletions(-) diff --git a/apps/ac_ac/Customizer.html b/apps/ac_ac/Customizer.html index 203235e3d..59c08f2cd 100644 --- a/apps/ac_ac/Customizer.html +++ b/apps/ac_ac/Customizer.html @@ -26,11 +26,12 @@ default-src 'self' 'unsafe-inline' 'unsafe-eval' file: https:; "> - + + - + @@ -279,23 +302,24 @@ (or choose "themed" to use your Bangle's configured theme) - if not, just select "none":

- Second Hand Color:
- - - - - - - - - - + Second Hand Color: +

+ + + + + + + + + +

If you prefer "custom" clock hands, please enter the URL of their JavaScript module below: @@ -504,33 +528,35 @@ "themed" if you want the clock to use the currently configured theme on your Bangle.js 2:

- Foreground Color:
- -

- -
- - - - - - - - + Foreground Color:

- Background Color:
- - - - - - - - - + + + + + + + + + +

+ Background Color: +

+ + + + + + + + +

When you are satisfied with your configuration, just click on "Upload" in order to generate the specified clock and upload it to your Bangle.js 2: From f878a336529815a2ea358361d9a748fb5599cda1 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 12 Jan 2022 10:58:21 +0100 Subject: [PATCH 47/86] Create app-screenshot.png --- apps/ac_ac/app-screenshot.png | Bin 0 -> 4042 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/ac_ac/app-screenshot.png diff --git a/apps/ac_ac/app-screenshot.png b/apps/ac_ac/app-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..e0e3bb0b95de844ed0656d16023e71708c117f96 GIT binary patch literal 4042 zcmV;*4>jPx^gh@m}RCr$Po!fS;APhxM|NoFiT-dcw9p(U+ z!2A1u9?j>(L23ghAJR5HMQdiT4sa3RQ(?I- zXR(D;dEs#ulz7E3E~&s49G$LFh<{5~mHB!Hc|=VDd`{BhquyCJ*1A&<1%|7`q9RLr z%gv$X;pQJ{J-sjtaDA~jKNNkBz!bQ4cFPKEeS&8gVA~3u0x4Bs>+5}8f%^)dnbsu= z%&B0Q8K|+2m{j1mx`o%uO#g5dIIUtBAD&s?PXm~{YAmkX#yrVxH#FG3w34d8BUQKe z?Z0>XSgeoFCj!i?G*AGB@YdcIe$-_NZx>S>Nm1aDPv9V2y%xKNbHr-Vq+7^DfceT- zf*7uixUWgt3z-yq62Mp4uWUV{+5oEt;M(kxf_++nDNy8WauBC!L;SnCUjs-RFnda0 zF$Eq~ZAhVte@_xfitCzerYUesuTzK*1%|LjMJ_)T0*R7b?ZpkdJ z5_zOa=iVw?{%iqo8X2yla_vL%1KtKs*EHnTMsV%5XmbT_^dz?`Ks{Y;Qimz<8~FAr z1hwCz?P5+mQh`V2#@!XT=emaSr0$#`mZxz~j3f#?8bs;&W+?E;>cjwm`PBw$u&}BG zHSOanHno2i>|B8@M4{4$T2;ao_*|yks}5`djqVCOVvxD2L~Ua}&w)ooWz0FY0Qjs5 z+@&IJPRq3)6B?bfxB~0=v3n~|fO%B~&w;y#r`ris6}V@`q2__BRQG%Aa2HGY@82;e zPS;Gp$H~`Dd5kJXx9A8OPS-%d$H~{qmkApI_Nq*50x*EJ0`dJ+tPHu<+6V!ADuOLpR)AQN?*MnZ5~in;I^*l9_(`!uZ!~oB#`AS0K`LM)m{f}{g z89sK18O|DH>Hsqw?Eo{JwUDVeg^-Ssn|eU|FUg_pZnmYxgyso zR0Yl{v=+cepC60hD*(sTq6E+=utuGS8_#Gj0WcMn_&0SzNC#MP+keXdr?B1*{W&)? zNhWpYg+QC^Nx^{Uur{I7f;S3EH-KB5pB`%k;F=1j6RG2_Lj_n{DXmr`a`2uPm?kat zw#W*s*(FN=Lx^j$e>nbHxlI$c+(o1r2aUF7*Mc2jkPFvT7p4-gI|@i4wA9x+ytBc* z;_b4@sCdPynu}G}$>Ir(Pl79i1|yesl!}9ywJ7)SyA$%LP~p zpJocexo9}Htb12EU#TJotS_E`ANXY#P-94cK4fdwxG_)IVI<+JO;QY@pb1aQrlt(6Gsg@OVc z4O)Pa0GulBBfkWyi~-60`~>J6HC0h-bzp8P;Q(K^+iOpjTDVbwH58Z&kp+8SdO0@= zDhfPz2y@Tw0PFd`=frf%Bu>vYeOq#f<^HWLeA1kRI>1Pb9AY}eRHZ%av>gTt>z=iqk~O%Ne5eCVc2(Zc62!Gzz4c|9(l9&#K6lWG zYuLR8Om*r^h^hH01>j@6X4Ut8x8m`5;sx+m*Z)#s&6ktLrV>{7$|3W*F}0`rzkLXWl}$f@6xI4rIv0&K@^YI*EJc(C}-sW7;CU{LU9E(|6Q3j-~{# z6>@DA#+Ds&RGBjVM|nytm4B_I%9}zgN8uqK>HwF%9lb?~(?D_p#}R8x#VBoQL0nQ^ z$=JE@#&L=-=)&#(Dm_M+6(CjwxV(x@qq@dV& zU4dH?BQ=17qkr<7R%`4p!37voFpj!lxAIbDBHiUDZ};2@ND@Ts7^wntQZ%d&cSYph zjHES73H{UC8!amE`@W#1z$GW;VAKYfn;+)Vo|YV*3J7+QaNFTr=%u!^6FNcqkSnFB z)q#5}Fmz6OtEDImb(4}30J(1}N^Rje&eGL0m5`<+TJP_eRDY?iX#Bi@QZdB`-eWv!Wwcm@NT0Zs{?B!$1mIlWJF60KD)Kh~zQ&qa z0}-c03Um1oUNwN@B<@~Mth*MX1$axxt^%=CeTx$|0J9dn8GwI*O2`s6sJLKtyvpRw z5{NB*nE^3357q#<#YfrnE3<||u@0=+-M!ng4zM+N0}ZtG!0igWH+p)b8x1j4flb02 z=MR_y>xIW#qIh5=#1w$7!dvsD>LiX5G`E@Kff~Rof*ZZ)0MFrR_*ruRuMDmOJRBiE zVGj?u0{8H$w>iuM4)8En`-ysZAOo=P(B8w*-e!Xb;F_%D`PvKMbJ2BtZZCTp*U(iz z)IIR_KxGN0E3gA&-vb;4wm%y0p?l!=fKTF_hNV5=052Ur@4N#H-j%cRWQz0d9>;b^ z+#O&;0COJqa%^`5m-HxEV@I78oHz3|qv#*bEBzeX75ty=W2N!{?GXj;w?6n;Z$7#- zujXtC;B+%;Y}+g|DFhKX>IFr80kjHm9|gvCN*oWe1%P2-IZ$$JsqnDv(vWI|ka$51 z&w*3rjf=YP#oZdC=Y^mIFm|iPKIiq~w&p;|v6c1*J+249=t)n5!2s7TE8-CRYs-*oV%e8)S%%2pGx~4;mkD{DZn`>TK>m{m;)upmfH{1zLX8_ z4Djugbd+`!7)vRzty)`iY7UefTNFr+K^m?};Tx>L@ylB7U1~<#Jx%bq9TuTi~n_7Qffpf502UsgdomGXXO}N5r zHc@BF1dW<%P?QhrAM7K?mU3>EO$k&DfCX(ZQV2ooFV9e_5dBp+7cd8yh%r{ikIhKJ zC_s!1u#N)9Cwud%5UF}m%T(|QS&tNgqpBQRB9?TsRRN}tux6QN{?Jx%`RR1ZThZ{q zr0|gySYwRgTQsgca-j_>uN(CCz;^&XAx`VRr6+W~ z{qF56dEi?BD>==ZS=$2&(2H|movOsz{`cNDdSE8N&s^5?*2YkN^YEDfy8?fcIcuX9 zrx4Z#;{Exi2OQvU#(kSnJHXq7@|y#3fWH~{ZAPsOu)?%*8`t_k9vy5=NOdkSF;HUSk8@pI)aAU_B{k*>dPaXKA(pd^_>VsJz4^+lcVc#3zS-I~_ zfNOPNS762KYDjK6A$@@GzH(5IQuI>c5~MxgHK6Dd6}b0Qb#nU93s8!NV5KyzDn#!P z62>|Y;NA*6JAF6+o;istL97LDTC&q@mjG@wnFlbVlS`Rm`R_59nd-chGx5$kz_^ci z77j4aUyar_0q&h%G&-$%`0PoX_Sg(e)M`Vr3GneKbn2TO4HQIxb7?{i?uJu#J+w#l zLb1a(0p3A@w*ffL)_&%^C5FIm6JW(Fba+#{De!Oy@=oXg^ZbQdm(qk4(+7OC(=8SS z*m#bNRU)jF(Tq>j7M#Q(7xoG{atUH<@P-r@ya;Nse-#{Dfv4XD4RpX2*gz1x3!n7B zq6%Dz)e7mwXw()~Sj<)X0le}<5G-2K&lk>du_5mVuq*I8=B~ilb+FjyJ3+oNoD{0| zQ((%dcY3I>(^x36OKiRia2)w!beid97iyvZ1)hzYJU|7GYz*rzCIkE;= zlr}!Duvn-Z;GBm@U=iLh#@fL?zaI1cb#nD|2cuE&xdSY4S~x@lK1v(X{(a;)2e@aT w9nhZM4Q)HX-CgV_=;;9mxTkl$?d~4<52ZQUd4@M?b^rhX07*qoM6N<$f<&x|X#fBK literal 0 HcmV?d00001 From bda5512db423bf6e2c9f7ceb0b622e874f0bf85e Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 12 Jan 2022 13:02:52 +0100 Subject: [PATCH 48/86] Update Customizer.html --- apps/ac_ac/Customizer.html | 335 ++++++++++++++++++++++++++++++------- 1 file changed, 279 insertions(+), 56 deletions(-) diff --git a/apps/ac_ac/Customizer.html b/apps/ac_ac/Customizer.html index 59c08f2cd..5c60c0aa4 100644 --- a/apps/ac_ac/Customizer.html +++ b/apps/ac_ac/Customizer.html @@ -26,13 +26,10 @@ default-src 'self' 'unsafe-inline' 'unsafe-eval' file: https:; "> - - + - - - - + + @@ -235,17 +212,17 @@ switch (ClockSize) { case 'simple': return "require('https://raw.githubusercontent.com/rozek/banglejs-2-simple-clock-size/main/ClockSize.js')" case 'smart': return "require('https://raw.githubusercontent.com/rozek/banglejs-2-smart-clock-size/main/ClockSize.js')" - case 'custom': return 'require(' + ClockSizeURL + ')' + case 'custom': return "require('" + ClockSizeURL + "')" } } function chosenClockFace () { switch (ClockFace) { - case 'none': return undefined + case 'none': return "undefined" case 'four-fold': return "require('https://raw.githubusercontent.com/rozek/banglejs-2-four-fold-clock-face/main/ClockFace.js')" case 'twelve-fold': return "require('https://raw.githubusercontent.com/rozek/banglejs-2-twelve-fold-clock-face/main/ClockFace.js')" case 'rainbow': return "require('https://raw.githubusercontent.com/rozek/banglejs-2-rainbow-clock-face/main/ClockFace.js')" - case 'custom': return 'require(' + ClockFaceURL + ')' + case 'custom': return "require('" + ClockFaceURL + "')" } } @@ -254,18 +231,18 @@ case 'simple': return "require('https://raw.githubusercontent.com/rozek/banglejs-2-simpled-clock-hands/main/ClockHands.js')" case 'rounded': return "require('https://raw.githubusercontent.com/rozek/banglejs-2-rounded-clock-hands/main/ClockHands.js')" case 'hollow': return "require('https://raw.githubusercontent.com/rozek/banglejs-2-hollow-clock-hands/main/ClockHands.js')" - case 'custom': return 'require(' + ClockHandsURL + ')' + case 'custom': return "require('" + ClockHandsURL + "')" } } function chosenComplication (Complication, customURL) { switch (Complication) { - case 'none': return undefined + case 'none': return "undefined" case 'date': return "require('https://raw.githubusercontent.com/rozek/banglejs-2-date-complication/main/Complication.js')" case 'weekday': return "require('https://raw.githubusercontent.com/rozek/banglejs-2-weekday-complication/main/Complication.js')" case 'calendar-week': return "require('https://raw.githubusercontent.com/rozek/banglejs-2-calendar-week-complication/main/Complication.js')" case 'moon-phase': return "require('https://raw.githubusercontent.com/rozek/banglejs-2-moon-phase-complication/main/Complication.js')" - case 'custom': return 'require(' + customURL + ')' + case 'custom': return "require('" + customURL + "')" } } function chosenComplicationAt (Position) { @@ -282,7 +259,7 @@ } function chosenColor (ColorChoice) { - return (ColorChoice === 'none' ? undefined : ColorChoice) + return (ColorChoice === 'none' ? 'undefined' : "'" + ColorChoice + '"') } function chosenForeground () { return chosenColor(Foreground) } @@ -290,7 +267,7 @@ function chosenSecondHand () { return chosenColor(SecondHand) } function chosenFillColor () { return chosenColor(FillColor) } - function chosenDots () { return (ClockFaceDots === 'with-dots') } + function chosenDots () { return (ClockFaceDots === 'with-dots' ? 'true' : 'false') } let AppSource = ` let Clockwork = require('https://raw.githubusercontent.com/rozek/banglejs-2-simple-clockwork/main/Clockwork.js'); From 8bd074131da4d9c09aa9521297d603018345e4f7 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 12 Jan 2022 15:55:00 +0100 Subject: [PATCH 55/86] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 1ef111b1d..fd0920156 100644 --- a/apps.json +++ b/apps.json @@ -32,7 +32,7 @@ { "id": "ac_ac", "name": "A Configurable Analog Clock", "shortName":"Configurable Clock", - "version":"0.01", + "version":"0.02", "description": "AC-AC, a highly customizable analog clock", "icon": "app-icon.png", "type": "clock", From 3636b32084fbfec92ff1db5ecfcbdacb71883adf Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 12 Jan 2022 15:58:20 +0100 Subject: [PATCH 56/86] Update Customizer.html --- apps/ac_ac/Customizer.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/ac_ac/Customizer.html b/apps/ac_ac/Customizer.html index 113f4279b..2bfab8d51 100644 --- a/apps/ac_ac/Customizer.html +++ b/apps/ac_ac/Customizer.html @@ -295,6 +295,9 @@ Clockwork.windUp({ FillColor: ${chosenFillColor()} }); ` +console.log('the configured AC-AC app looks as follows:') +console.log(AppSource) + sendCustomizedApp({ storage:[ {name:'ac-ac.app.js', url:'app.js', content:AppSource}, From 4429288362574ad7b23f3bb7b495dba4aa45207c Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 12 Jan 2022 16:02:28 +0100 Subject: [PATCH 57/86] Update Customizer.html --- apps/ac_ac/Customizer.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/ac_ac/Customizer.html b/apps/ac_ac/Customizer.html index 2bfab8d51..f2387f9dd 100644 --- a/apps/ac_ac/Customizer.html +++ b/apps/ac_ac/Customizer.html @@ -259,7 +259,7 @@ } function chosenColor (ColorChoice) { - return (ColorChoice === 'none' ? 'undefined' : "'" + ColorChoice + '"') + return (ColorChoice === 'none' ? 'undefined' : "'" + ColorChoice + "'") } function chosenForeground () { return chosenColor(Foreground) } From 40c8d69b1e64ee691eb69f66d579bcd4c260123f Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 12 Jan 2022 16:02:30 +0100 Subject: [PATCH 58/86] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index fd0920156..1ef111b1d 100644 --- a/apps.json +++ b/apps.json @@ -32,7 +32,7 @@ { "id": "ac_ac", "name": "A Configurable Analog Clock", "shortName":"Configurable Clock", - "version":"0.02", + "version":"0.01", "description": "AC-AC, a highly customizable analog clock", "icon": "app-icon.png", "type": "clock", From 116dec3cb98aa074e72cfa8a7cd1ab6e8be7c51e Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 12 Jan 2022 16:36:28 +0100 Subject: [PATCH 59/86] Update Customizer.html --- apps/ac_ac/Customizer.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/ac_ac/Customizer.html b/apps/ac_ac/Customizer.html index f2387f9dd..f50def79b 100644 --- a/apps/ac_ac/Customizer.html +++ b/apps/ac_ac/Customizer.html @@ -300,7 +300,7 @@ console.log(AppSource) sendCustomizedApp({ storage:[ - {name:'ac-ac.app.js', url:'app.js', content:AppSource}, + {name:'ac_ac.app.js', url:'app.js', content:AppSource}, ] }) } From f6b064d20f45be365b4463a981f6613638469701 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 12 Jan 2022 16:36:31 +0100 Subject: [PATCH 60/86] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 1ef111b1d..fd0920156 100644 --- a/apps.json +++ b/apps.json @@ -32,7 +32,7 @@ { "id": "ac_ac", "name": "A Configurable Analog Clock", "shortName":"Configurable Clock", - "version":"0.01", + "version":"0.02", "description": "AC-AC, a highly customizable analog clock", "icon": "app-icon.png", "type": "clock", From 276fdd647e757b60de647b9ae6b56ecda5172fc4 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 12 Jan 2022 16:45:28 +0100 Subject: [PATCH 61/86] Update Customizer.html --- apps/ac_ac/Customizer.html | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/apps/ac_ac/Customizer.html b/apps/ac_ac/Customizer.html index f50def79b..a2798b6bd 100644 --- a/apps/ac_ac/Customizer.html +++ b/apps/ac_ac/Customizer.html @@ -208,6 +208,14 @@ /**** createAndUploadApp ****/ function createAndUploadApp () { + function WidgetsOnBackground () { + return ( + ClockSize === 'smart' + ? "require('https://raw.githubusercontent.com/rozek/banglejs-2-widgets-on-background/main/drawWidgets.js');" + : '' + ) + } + function chosenClockSize () { switch (ClockSize) { case 'simple': return "require('https://raw.githubusercontent.com/rozek/banglejs-2-simple-clock-size/main/ClockSize.js')" @@ -270,6 +278,8 @@ function chosenDots () { return (ClockFaceDots === 'with-dots' ? 'true' : 'false') } let AppSource = ` +${WidgetsOnBackground()} + let Clockwork = require('https://raw.githubusercontent.com/rozek/banglejs-2-simple-clockwork/main/Clockwork.js'); Clockwork.windUp({ From 3fdbfd6b850c2f4c4bb616d550a66ac3c2dea3a7 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 12 Jan 2022 16:45:32 +0100 Subject: [PATCH 62/86] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index fd0920156..1ef111b1d 100644 --- a/apps.json +++ b/apps.json @@ -32,7 +32,7 @@ { "id": "ac_ac", "name": "A Configurable Analog Clock", "shortName":"Configurable Clock", - "version":"0.02", + "version":"0.01", "description": "AC-AC, a highly customizable analog clock", "icon": "app-icon.png", "type": "clock", From f0ebecdb7f59c7554240697374557ccd5fba9712 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 12 Jan 2022 16:50:37 +0100 Subject: [PATCH 63/86] Update Customizer.html --- apps/ac_ac/Customizer.html | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/apps/ac_ac/Customizer.html b/apps/ac_ac/Customizer.html index a2798b6bd..8552eaf70 100644 --- a/apps/ac_ac/Customizer.html +++ b/apps/ac_ac/Customizer.html @@ -777,7 +777,13 @@ console.log(AppSource)

-

 

+

+ This application is based on the author's + [Analog Clock Construction Kit (ACCK)](https://github.com/rozek/banglejs-2-analog-clock-construction-kit). + If you need a different "clockwork", clock size calculation or clock face, + or specific clock hands or complications, just follow the link to learn how to + implement your own clock parts. +

From 25285d524dad18685a6c904d96aa4d37bfea6b88 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 12 Jan 2022 17:18:29 +0100 Subject: [PATCH 64/86] Update Customizer.html --- apps/ac_ac/Customizer.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/ac_ac/Customizer.html b/apps/ac_ac/Customizer.html index 8552eaf70..2846352d6 100644 --- a/apps/ac_ac/Customizer.html +++ b/apps/ac_ac/Customizer.html @@ -779,7 +779,7 @@ console.log(AppSource)

This application is based on the author's - [Analog Clock Construction Kit (ACCK)](https://github.com/rozek/banglejs-2-analog-clock-construction-kit). + Analog Clock Construction Kit (ACCK). If you need a different "clockwork", clock size calculation or clock face, or specific clock hands or complications, just follow the link to learn how to implement your own clock parts. From 2ccc6b4f3b3e745289d087208db25af931635575 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 12 Jan 2022 19:33:22 +0100 Subject: [PATCH 65/86] Update app-screenshot.png --- apps/ac_ac/app-screenshot.png | Bin 4042 -> 3459 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/ac_ac/app-screenshot.png b/apps/ac_ac/app-screenshot.png index e0e3bb0b95de844ed0656d16023e71708c117f96..0aef3fa3815fe19d368bcf37f6afd3aa1f9e335c 100644 GIT binary patch delta 3444 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

P0Nr8KQ7MDGw1#ySt+-U>WBeK-J~ zIf*MltOajcveRsr0B$sy2QZ_POPON%?=hH}>b#UQ@y`9#V*bGe6YD2OK@bM^g>YE)66hwe?X+jO|hJRCbJ+w#lLb1a(0p3A@w*ffL z)_&%^C5FIm6JW(Fba+#{De!Oy@=oXg^ZbQdm(qk4(+7OC(=8SS*m#bNRU)jF(Tq>j z7M#Q(7xoG{atUH<@P-r@ya;Nse-#{Dfv4XD4RpX2*gz1x3!n7Bq6%Dz)e7mwXw()~ zSj<)X0e`&mLl7)l($5#paj_xq2e2#fJLayy*mbbj=Q}~ZF`N{t_ETWWsCRm(u+vy5 zu}f^e3ve9yVs+0~j9r1z?|v0r7mFWaN!2X%#b8*!slZquC^@nQSd=zCuCQ3B9N?UX zNMI4(Fvi-!KEEFG{&jNobO)nR@VNsla9TJ-135lQ8`A!Lp56^@JHXvt m>?i2y0SCCJcfIZI9{3NXIof%KH)?hO0000 From 5e4cd77313f3f25193d50365b4bde8c4bbc539d7 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 13 Jan 2022 06:41:37 +0100 Subject: [PATCH 66/86] Update apps.json --- apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index b90deb045..bef974af8 100644 --- a/apps.json +++ b/apps.json @@ -32,13 +32,13 @@ { "id": "ac_ac", "name": "A Configurable Analog Clock", "shortName":"Configurable Clock", - "version":"0.01", + "version":"0.02", "description": "AC-AC, a highly customizable analog clock", "icon": "app-icon.png", "type": "clock", "tags": "clock", "supports" : ["BANGLEJS2"], - "allow_emulator": true, + "allow_emulator": false, "screenshots": [{"url":"app-screenshot.png"}], "readme": "README.md", "custom": "Customizer.html", From ee02b17196fe4b62e8049ab619be3e55102ae21e Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 13 Jan 2022 06:42:13 +0100 Subject: [PATCH 67/86] Update Customizer.html --- apps/ac_ac/Customizer.html | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/apps/ac_ac/Customizer.html b/apps/ac_ac/Customizer.html index 2846352d6..8cddbb4da 100644 --- a/apps/ac_ac/Customizer.html +++ b/apps/ac_ac/Customizer.html @@ -101,7 +101,7 @@