From b72de7fb0481e104e0b21798550a4d0e25e19aad Mon Sep 17 00:00:00 2001 From: Stuff-etc Date: Fri, 22 Mar 2024 06:24:39 +0100 Subject: [PATCH] initial commit of counter2 app --- apps/counter2/ChangeLog | 2 + apps/counter2/README.md | 24 ++++++ apps/counter2/app-icon.js | 1 + apps/counter2/app.js | 96 ++++++++++++++++++++++ apps/counter2/counter2-icon.png | Bin 0 -> 2417 bytes apps/counter2/counter2-screenshot.png | Bin 0 -> 1809 bytes apps/counter2/counter2dark-screenshot.png | Bin 0 -> 1704 bytes apps/counter2/metadata.json | 17 ++++ apps/counter2/settings.js | 55 +++++++++++++ 9 files changed, 195 insertions(+) create mode 100644 apps/counter2/ChangeLog create mode 100644 apps/counter2/README.md create mode 100644 apps/counter2/app-icon.js create mode 100644 apps/counter2/app.js create mode 100644 apps/counter2/counter2-icon.png create mode 100644 apps/counter2/counter2-screenshot.png create mode 100644 apps/counter2/counter2dark-screenshot.png create mode 100644 apps/counter2/metadata.json create mode 100644 apps/counter2/settings.js diff --git a/apps/counter2/ChangeLog b/apps/counter2/ChangeLog new file mode 100644 index 000000000..d7b228c2c --- /dev/null +++ b/apps/counter2/ChangeLog @@ -0,0 +1,2 @@ +0.01: New App! +0.02: Added Settings & readme \ No newline at end of file diff --git a/apps/counter2/README.md b/apps/counter2/README.md new file mode 100644 index 000000000..dc8e6d350 --- /dev/null +++ b/apps/counter2/README.md @@ -0,0 +1,24 @@ +# Counter2 by Michael + +I needed an HP/XP-Tracker for a game, so i made one. +The counter state gets saved. Best to use this with pattern launcher or ClockCal + +- Colored Text Mode +- ![color text](https://foostuff.github.io/BangleApps/apps/counter2/counter2-screenshot.png) +- Colored Background Mode +- ![color background](https://foostuff.github.io/BangleApps/apps/counter2/counter2dark-screenshot.png) + +## Howto + - Tap top side or swipe up to increase counter + - Tap top side or swipe down to decrease counter + - Hold (600ms) to reset to default value (configurable) + - Press button to exit + +## Configurable Features +- Default value Counter 1 +- Default value Counter 2 +- Buzz on interact +- Colored Text/Background + +## Feedback +If something isn't working, please tell me: https://github.com/Stuff-etc/BangleApps/issues diff --git a/apps/counter2/app-icon.js b/apps/counter2/app-icon.js new file mode 100644 index 000000000..fda8d1e21 --- /dev/null +++ b/apps/counter2/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwcAyVJkgCFAwwCBAgd5CI+eCI2T/IRH/wR7n//AAPyCIdPBAX8CKpr/CLTpSCOipB8gRFXoPJCIknCJAIBOoYRCagLNCa4f8Q4gREI4tP8mT/41HCKJHFGoQRG+QKBLI4RHLIx9CCJ7zBGpxZCPoyhQYpIIBYor7kCP4R8YoX/WY69DAIM/BAT+BdIYICeYQRTGqKP/CNIA==")) \ No newline at end of file diff --git a/apps/counter2/app.js b/apps/counter2/app.js new file mode 100644 index 000000000..053f6bfe6 --- /dev/null +++ b/apps/counter2/app.js @@ -0,0 +1,96 @@ +Bangle.loadWidgets(); + +var s = Object.assign({ + counter0:10, + counter1:20, + max0:15, + max1:25, + buzz: true, + colortext: true, +}, require('Storage').readJSON("counter2.json", true) || {}); + +f1 = (s.colortext) ? "#f00" : "#fff"; +f2 = (s.colortext) ? "#00f" : "#fff"; +b1 = (s.colortext) ? "#000" : "#f00"; +b2 = (s.colortext) ? "#000" : "#00f"; + +var counter = 0; +var drag; + +screenwidth = g.getWidth(); +screenheight = g.getHeight(); +halfwidth = screenwidth / 2; +halfheight = screenheight / 2; + +counter = []; +counter[0] = s.counter0; +counter[1] = s.counter1; +defaults = []; +defaults[0] = s.max0; +defaults[1] = s.max1; + +function saveSettings() { + s.counter0 = counter[0]; + s.counter1 = counter[1]; + s.max0 = defaults[0]; + s.max1 = defaults[1]; + require('Storage').writeJSON("counter2.json", s); +} + +ignoreonce = false; +var dragtimeout; + +function updateScreen() { + g.setBgColor(b1); + g.clearRect(0, 0, halfwidth, screenheight); + g.setBgColor(b2); + g.clearRect(halfwidth, 0, screenwidth, screenheight); + g.setFont("Vector", 60).setFontAlign(0, 0); + g.setColor(f1); + g.drawString(Math.floor(counter[0]), halfwidth * 0.5, halfheight); + g.setColor(f2); + g.drawString(Math.floor(counter[1]), halfwidth * 1.5, halfheight); + saveSettings(); + if (s.buzz) Bangle.buzz(50,.5); + Bangle.drawWidgets(); +} + +Bangle.on("drag", e => { + c = (e.x < halfwidth) ? 0 : 1; + if (!drag) { + if (ignoreonce) { + ignoreonce = false; + return; + } + drag = { x: e.x, y: e.y }; + dragtimeout = setTimeout(function () { resetcounter(c); }, 600); //if dragging for 500ms, reset counter + } + else if (drag && !e.b) { // released + adjust = 0; + const dx = e.x - drag.x, dy = e.y - drag.y; + if (Math.abs(dy) > Math.abs(dx) + 30) { + adjust = (dy > 0) ? -1 : 1; + } else { + adjust = (e.y > halfwidth) ? -1 : 1; + } + counter[c] += adjust; + updateScreen(); + drag = undefined; + clearTimeout(dragtimeout); + } +}); + +function resetcounter(which) { + counter[which] = defaults[which]; + console.log("resetting counter ", which); + updateScreen(); + drag = undefined; + ignoreonce = true; +} + + +updateScreen(); + +setWatch(function() { + load(); +}, BTN1, {repeat:true, edge:"falling"}); \ No newline at end of file diff --git a/apps/counter2/counter2-icon.png b/apps/counter2/counter2-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c16e9c0c7ff1e4732ec28aa90c061cf595486a37 GIT binary patch literal 2417 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 literal 0 HcmV?d00001 diff --git a/apps/counter2/counter2dark-screenshot.png b/apps/counter2/counter2dark-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..2f0fd07c1b8ad514a9b42dce820f08ae38920f3f GIT binary patch literal 1704 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v-}aF%}28J29*~C-ahlfi20?#WAEJ z?(OWrqDKY-tdoDsTSW&P6)QB5x~ZHgWj?=C(*Aq4_Mta*^|iHsYkp2*m~vn{lk;rj zZ*v=%w3%i#FfD$)TK3=b=ilFb`Tcv@?fc3I0M^~L#d^A-cPOV_t4xTfCH;wvtvprO0>Ua9R;(qSY zQV#8cXN$tqrZMraPBMuKf0!*eZy%HUhi%&!B#qndEcPGUc39`P-!|d29DX^XMMg`}tVnJX6cr9^dxV@Lgt+YfZXxr{>CH^*$xTtUSJc zA*T5JrDrtXf1gsmXs+U#1Lfxyf9MNnv@8}$1je~$c?%Q&Q5&xJ7cQ)LxR_%%Q~BBh zx-oTu8_UBrKV0~_tkqoWo!OI_{p!y86~8`+JzU%vb#_hef+N8li!0flhnextXdT-affLWrynzj;YtqeBEN7#{IBt(bp||!?$(p z*=zjy`iXv#3fpUc79|NQUvdq5bYhOw`DQP!J5DkOZ_g4GZmI}r@q1RfRyEe|fkvN) z@5RWOrR(O4Do&nRr2908>HDIL(5u$^o3Cx%9F<~pdF|2|w+D+QqC#co&W`-}CsJ2y zX6H2_J;e`_ENfStJ9BPL<=Hi2b9+LvIkgMi+MlNPh(tE}*M7XPDoyuZR@(NA+|O>; zwr_1w<_wP7@l1TK<_k8S%+5bLspmH`FEVq}`cU(1gR$0!y$0b4Gq(SKthIqD_-?LQ zx%C0t51K4nueZ;97WX+nrqlMr#orN?^YbSNnz)@gvv=ik&O5i*zkA(rx^1m5{(4oW zu9j{6yXehX0(zy5{d44U+FAbqi$=$*UL0Zjn@yn`;>KAgX0L$Db9d(#5)4 z+@GGVx&K@^POD(riLTp|{;fGt$~j%&$BGlB8@IJYef=Fb@wG6}`j98TBEmVPZ1cTS z_#RGTa?k!?!Ktxzopr04ZGt AN&o-= literal 0 HcmV?d00001 diff --git a/apps/counter2/metadata.json b/apps/counter2/metadata.json new file mode 100644 index 000000000..a580251e5 --- /dev/null +++ b/apps/counter2/metadata.json @@ -0,0 +1,17 @@ +{ + "id": "counter2", + "name": "Counter2", + "version": "0.01", + "description": "Dual Counter", + "icon": "counter2-icon.png", + "tags": "tool", + "supports": ["BANGLEJS2"], + "screenshots": [{"url":"counter2-screenshot.png"}], + "allow_emulator": true, + "storage": [ + {"name":"counter2.app.js","url":"app.js"}, + {"name":"counter2.settings.js","url":"settings.js"}, + {"name":"counter2.img","url":"app-icon.js","evaluate":true} + ], + "data": [{"name":"counter2.json"}] +} diff --git a/apps/counter2/settings.js b/apps/counter2/settings.js new file mode 100644 index 000000000..f5cbd2fbc --- /dev/null +++ b/apps/counter2/settings.js @@ -0,0 +1,55 @@ +(function (back) { + var FILE = "counter2.json"; + defaults={ + counter0:12, + counter1:0, + max0:12, + max1:0, + buzz: true, + colortext: true, + }; + settings = Object.assign(defaults, require('Storage').readJSON(FILE, true) || {}); + + function writeSettings() { + require('Storage').writeJSON(FILE, settings); + } + + menu = { + "": { "title": "Counter2" }, + "< Back": () => back(), + 'Default C1': { + value: settings[0], + min: -99, max: 99, + onchange: v => { + settings.max0 = v; + writeSettings(); + } + }, + 'Default C2': { + value: settings[2], + min: -99, max: 99, + onchange: v => { + settings.max1 = v; + writeSettings(); + } + }, + 'Color Text': { + value: settings[colortext], + format: v => v?"Text":"Background", + onchange: v => { + settings.colortext = v; + writeSettings(); + } + }, + 'Buzz': { + value: settings.buzz, + format: v => v?"On":"Off", + onchange: v => { + settings.buzz = v; + writeSettings(); + } + } + }; + // Show the menu + E.showMenu(menu); +});