From 854d2f9ade63f8e6ca459d290caa6bc176254feb Mon Sep 17 00:00:00 2001 From: crazysaem Date: Fri, 10 Dec 2021 14:41:49 +0000 Subject: [PATCH 1/5] ptlaunch: Make tap to confirm new pattern more reliable. Also allow for easier creation of single circle patterns. --- apps.json | 2 +- apps/ptlaunch/ChangeLog | 1 + apps/ptlaunch/README.md | 1 + apps/ptlaunch/app.js | 13 +++++++++++++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index fd2e14e60..af47e5a48 100644 --- a/apps.json +++ b/apps.json @@ -4829,7 +4829,7 @@ "id": "ptlaunch", "name": "Pattern Launcher", "shortName": "Pattern Launcher", - "version": "0.02", + "version": "0.03", "description": "Directly launch apps from the clock screen with custom patterns.", "icon": "app.png", "tags": "tools", diff --git a/apps/ptlaunch/ChangeLog b/apps/ptlaunch/ChangeLog index f50936885..f93cedeab 100644 --- a/apps/ptlaunch/ChangeLog +++ b/apps/ptlaunch/ChangeLog @@ -1,2 +1,3 @@ 0.01: Initial creation of the pattern launch app 0.02: Turn on lcd when launching an app if the lock screen was disabled in the settings +0.03: Make tap to confirm new pattern more reliable. Also allow for easier creation of single circle patterns. diff --git a/apps/ptlaunch/README.md b/apps/ptlaunch/README.md index a69492782..af91658a5 100644 --- a/apps/ptlaunch/README.md +++ b/apps/ptlaunch/README.md @@ -18,6 +18,7 @@ From the main menu you can: - Add a new pattern and link it to an app (first entry) - To create a new pattern first select "Add Pattern" - Now draw any pattern you like, this will later launch the linked app from the clock screen + - You can also draw a single-circle pattern (meaning a single tap on one circle) instead of drawing a 'complex' pattern - If you don't like the pattern, simply re-draw it. The previous pattern will be discarded. - If you are happy with the pattern tap on screen or press the button to continue - Now select the app you want to launch with the pattern. diff --git a/apps/ptlaunch/app.js b/apps/ptlaunch/app.js index 8ba1adf81..f5fad7897 100644 --- a/apps/ptlaunch/app.js +++ b/apps/ptlaunch/app.js @@ -147,13 +147,26 @@ var createPattern = () => { setWatch(() => finishHandler(), BTN); setTimeout(() => Bangle.on("tap", finishHandler), 250); + positions = []; var dragHandler = (position) => { + log(position); positions.push(position); debounce().then(() => { if (isFinished) { return; } + + // This might actually be a 'tap' event. + // Use this check in addition to the actual tap handler to make it more reliable + if (pattern.length > 0 && positions.length === 2) { + if (positions[0].x === positions[1].x && positions[0].y === positions[1].y) { + finishHandler(); + positions = []; + return; + } + } + E.showMessage("Calculating..."); var t0 = Date.now(); From 31a4d05cb365b6e8b37d35f23848214de068b8ee Mon Sep 17 00:00:00 2001 From: crazysaem Date: Fri, 10 Dec 2021 17:48:25 +0000 Subject: [PATCH 2/5] ptlaunch: Improve the management of existing patterns: Draw the linked pattern on the left hand side of the app name within a scroller, similar to the default launcher. Slighlty clean up the code to make it less horrible. --- apps.json | 2 +- apps/ptlaunch/ChangeLog | 1 + apps/ptlaunch/README.md | 20 +- apps/ptlaunch/app.js | 314 +++++++++++++++++++++-------- apps/ptlaunch/main_menu.png | Bin 2840 -> 0 bytes apps/ptlaunch/main_menu_add.png | Bin 0 -> 3017 bytes apps/ptlaunch/main_menu_manage.png | Bin 0 -> 2955 bytes apps/ptlaunch/manage_patterns.png | Bin 0 -> 2670 bytes 8 files changed, 249 insertions(+), 88 deletions(-) delete mode 100644 apps/ptlaunch/main_menu.png create mode 100644 apps/ptlaunch/main_menu_add.png create mode 100644 apps/ptlaunch/main_menu_manage.png create mode 100644 apps/ptlaunch/manage_patterns.png diff --git a/apps.json b/apps.json index af47e5a48..65ef9bcea 100644 --- a/apps.json +++ b/apps.json @@ -4829,7 +4829,7 @@ "id": "ptlaunch", "name": "Pattern Launcher", "shortName": "Pattern Launcher", - "version": "0.03", + "version": "0.10", "description": "Directly launch apps from the clock screen with custom patterns.", "icon": "app.png", "tags": "tools", diff --git a/apps/ptlaunch/ChangeLog b/apps/ptlaunch/ChangeLog index f93cedeab..de38d715a 100644 --- a/apps/ptlaunch/ChangeLog +++ b/apps/ptlaunch/ChangeLog @@ -1,3 +1,4 @@ 0.01: Initial creation of the pattern launch app 0.02: Turn on lcd when launching an app if the lock screen was disabled in the settings 0.03: Make tap to confirm new pattern more reliable. Also allow for easier creation of single circle patterns. +0.10: Improve the management of existing patterns: Draw the linked pattern on the left hand side of the app name within a scroller, similar to the default launcher. Slighlty clean up the code to make it less horrible. \ No newline at end of file diff --git a/apps/ptlaunch/README.md b/apps/ptlaunch/README.md index af91658a5..8d61afece 100644 --- a/apps/ptlaunch/README.md +++ b/apps/ptlaunch/README.md @@ -8,12 +8,19 @@ Create patterns and link them to apps in the Pattern Launcher app. Then launch the linked apps directly from the clock screen by simply drawing the desired pattern. -## Screenshots and detailed steps +## Add Pattern Screenshots -![](main_menu.png) +![](main_menu_add.png) ![](add_pattern.png) ![](select_app.png) +## Manage Pattern Screenshots + +![](main_menu_manage.png) +![](manage_patterns.png) + +## Detailed Steps + From the main menu you can: - Add a new pattern and link it to an app (first entry) - To create a new pattern first select "Add Pattern" @@ -23,11 +30,10 @@ From the main menu you can: - If you are happy with the pattern tap on screen or press the button to continue - Now select the app you want to launch with the pattern. - Note, you can bind multiple patterns to the same app. -- Remove linked patterns (second entry) - - To remove a pattern first select "Remove Pattern" - - You will now see a list of apps that have patterns linked to them - - Simply select the app that you want to unlink. This will remove the saved pattern, but not the app itself! - - Note, that you can not actually preview the patterns. This makes removing patterns that are linked to the same app annoying. sorry! +- Manage created patterns (second entry) + - To manage your patterns first select "Manage Patterns" + - You will now see a scrollabe list of patterns + linked apps + - If you want to deletion a pattern (and unlink the app) simply tap on it, and confirm the deletion - Disable the lock screen on the clock screen from the settings (third entry) - To launch the app from the pattern on the clock screen the watch must be unlocked. - If this annoys you, you can disable the lock on the clock screen from the setting here diff --git a/apps/ptlaunch/app.js b/apps/ptlaunch/app.js index f5fad7897..1d3a07674 100644 --- a/apps/ptlaunch/app.js +++ b/apps/ptlaunch/app.js @@ -1,5 +1,3 @@ -var storage = require("Storage"); - var DEBUG = false; var log = (message) => { if (DEBUG) { @@ -7,20 +5,7 @@ var log = (message) => { } }; -var CIRCLE_RADIUS = 25; -var CIRCLE_RADIUS_2 = CIRCLE_RADIUS * CIRCLE_RADIUS; - -var CIRCLES = [ - { x: 25, y: 25, i: 0 }, - { x: 87, y: 25, i: 1 }, - { x: 150, y: 25, i: 2 }, - { x: 25, y: 87, i: 3 }, - { x: 87, y: 87, i: 4 }, - { x: 150, y: 87, i: 5 }, - { x: 25, y: 150, i: 6 }, - { x: 87, y: 150, i: 7 }, - { x: 150, y: 150, i: 8 }, -]; +var storage = require("Storage"); var showMainMenu = () => { log("loading patterns"); @@ -73,17 +58,32 @@ var showMainMenu = () => { }); }); }, - "Remove Pattern": () => { + "Manage Patterns": () => { log("selecting pattern through app"); - getStoredPatternViaApp(storedPatterns).then((pattern) => { - E.showMessage("Deleting..."); - delete storedPatterns[pattern]; - storage.writeJSON("ptlaunch.patterns.json", storedPatterns); - showMainMenu(); + showScrollerContainingAppsWithPatterns().then((selected) => { + var pattern = selected.pattern; + var appName = selected.appName; + if (pattern === "back") { + showMainMenu(); + } else { + E.showPrompt(appName + "\n\npattern:\n" + pattern, { + title: "Delete?", + buttons: { Yes: true, No: false }, + }).then((confirm) => { + if (confirm) { + E.showMessage("Deleting..."); + delete storedPatterns[pattern]; + storage.writeJSON("ptlaunch.patterns.json", storedPatterns); + showMainMenu(); + } else { + showMainMenu(); + } + }); + } }); }, Settings: () => { - var settings = storedPatterns["settings"] || {}; + var settings = storedPatterns.settings || {}; var settingsmenu = { "": { @@ -98,7 +98,7 @@ var showMainMenu = () => { if (settings.lockDisabled) { settingsmenu["Enable lock"] = () => { settings.lockDisabled = false; - storedPatterns["settings"] = settings; + storedPatterns.settings = settings; Bangle.setOptions({ lockTimeout: 1000 * 30 }); storage.writeJSON("ptlaunch.patterns.json", storedPatterns); showMainMenu(); @@ -106,7 +106,7 @@ var showMainMenu = () => { } else { settingsmenu["Disable lock"] = () => { settings.lockDisabled = true; - storedPatterns["settings"] = settings; + storedPatterns.settings = settings; storage.writeJSON("ptlaunch.patterns.json", storedPatterns); Bangle.setOptions({ lockTimeout: 1000 * 60 * 60 * 24 * 365 }); showMainMenu(); @@ -119,9 +119,7 @@ var showMainMenu = () => { E.showMenu(mainmenu); }; -var drawCircle = (circle) => { - g.fillCircle(circle.x, circle.y, CIRCLE_RADIUS); -}; +showMainMenu(); var positions = []; var createPattern = () => { @@ -160,13 +158,16 @@ var createPattern = () => { // This might actually be a 'tap' event. // Use this check in addition to the actual tap handler to make it more reliable if (pattern.length > 0 && positions.length === 2) { - if (positions[0].x === positions[1].x && positions[0].y === positions[1].y) { + if ( + positions[0].x === positions[1].x && + positions[0].y === positions[1].y + ) { finishHandler(); positions = []; return; } } - + E.showMessage("Calculating..."); var t0 = Date.now(); @@ -354,54 +355,217 @@ var getSelectedApp = () => { }); }; -var getStoredPatternViaApp = (storedPatterns) => { - E.showMessage("Loading patterns..."); - log("getStoredPatternViaApp"); +////// +// manage pattern related variables and functions +// - draws all saved patterns and their linked app names +// - uses the scroller to allow the user to browse through them +////// + +var scrollerFont = g.getFonts().includes("12x20") ? "12x20" : "6x8:2"; + +var drawBackButton = (r) => { + g.clearRect(r.x, r.y, r.x + r.w - 1, r.y + r.h - 1); + g.setFont(scrollerFont) + .setFontAlign(-1, 0) + .drawString("< Back", 64, r.y + 32); +}; + +var drawAppWithPattern = (i, r, storedPatterns) => { + log("draw app with pattern"); + log({ i: i, r: r, storedPatterns: storedPatterns }); + var storedPattern = storedPatterns[i]; + var pattern = storedPattern.pattern; + var app = storedPattern.app; + + g.clearRect(r.x, r.y, r.x + r.w - 1, r.y + r.h - 1); + + g.drawLine(r.x, r.y, 176, r.y); + + drawCirclesWithPattern(pattern, 0.33, { x: 1, y: 3 + r.y }); + + g.setColor(0, 0, 0); + var appName = g.wrapString(app.name, g.getWidth() - 64).join("\n"); + g.setFont(scrollerFont) + .setFontAlign(-1, 0) + .drawString(appName, 64, r.y + 32); +}; + +var showScrollerContainingAppsWithPatterns = () => { + var storedPatternsArray = getStoredPatternsArray(); + log("drawing scroller for stored patterns"); + log(storedPatternsArray); + log(storedPatternsArray.length); + + g.clear(); + + var c = Math.max(storedPatternsArray.length + 1, 3); + return new Promise((resolve) => { - var selectPatternMenu = { - "": { - title: "Select App", - }, - "< Cancel": () => { - log("cancel"); - showMainMenu(); - }, - }; - - log(storedPatterns); - var patterns = Object.keys(storedPatterns); - log(patterns); - - patterns.forEach((pattern) => { - if (pattern) { - if (storedPatterns[pattern]) { - var app = storedPatterns[pattern].app; - if (!!app && !!app.name) { - var appName = app.name; - var i = 0; - while (appName in selectPatternMenu[app.name]) { - appName = app.name + i; - i++; - } - selectPatternMenu[appName] = () => { - log("pattern via app selected"); - log(pattern); - log(app); - resolve(pattern); - }; - } + E.showScroller({ + h: 64, + c: c, + draw: (i, r) => { + log("draw"); + log({ i: i, r: r }); + if (i <= 0) { + drawBackButton(r); + } else if (i <= storedPatternsArray.length) { + drawAppWithPattern(i - 1, r, storedPatternsArray); } - } + }, + select: (i) => { + log("selected: " + i); + var pattern = "back"; + var appName = ""; + if (i > 0) { + var storedPattern = storedPatternsArray[i - 1]; + pattern = storedPattern.pattern.join(""); + appName = storedPattern.app.name; + } + resolve({ pattern: pattern, appName: appName }); + }, }); - - E.showMenu(selectPatternMenu); }); }; -showMainMenu(); +////// +// storage related functions: +// - stored patterns +// - stored settings +////// + +var getStoredPatternsMap = () => { + log("loading stored patterns map"); + var storedPatternsMap = storage.readJSON("ptlaunch.patterns.json", 1) || {}; + delete storedPatternsMap.settings; + log(storedPatternsMap); + return storedPatternsMap; +}; + +var getStoredPatternsArray = () => { + var storedPatternsMap = getStoredPatternsMap(); + log("converting stored patterns map to array"); + var patterns = Object.keys(storedPatternsMap); + var storedPatternsArray = []; + for (var i = 0; i < patterns.length; i++) { + var pattern = "" + patterns[i]; + storedPatternsArray.push({ + pattern: pattern + .split("") + .map((circleIndex) => parseInt(circleIndex, 10)), + app: storedPatternsMap[pattern].app, + }); + } + log(storedPatternsArray); + return storedPatternsArray; +}; ////// -// lib functions +// circle related variables and functions: +// - the circle array itself +// - the radius and the squared radius of the circles +// - circle draw function +////// + +var CIRCLE_RADIUS = 25; +var CIRCLE_RADIUS_2 = CIRCLE_RADIUS * CIRCLE_RADIUS; + +var CIRCLES = [ + { x: 25, y: 25, i: 0 }, + { x: 87, y: 25, i: 1 }, + { x: 150, y: 25, i: 2 }, + { x: 25, y: 87, i: 3 }, + { x: 87, y: 87, i: 4 }, + { x: 150, y: 87, i: 5 }, + { x: 25, y: 150, i: 6 }, + { x: 87, y: 150, i: 7 }, + { x: 150, y: 150, i: 8 }, +]; + +var drawCircle = (circle, drawBuffer, scale) => { + if (!drawBuffer) { + drawBuffer = g; + } + if (!scale) { + scale = 1; + } + + var x = circle.x * scale; + var y = circle.y * scale; + var r = CIRCLE_RADIUS * scale; + + log("drawing circle"); + log({ x: x, y: y, r: r }); + + drawBuffer.fillCircle(x, y, r); +}; + +var cachedCirclesDrawings = {}; +var drawCirclesWithPattern = (pattern, scale, offset) => { + if (!pattern || pattern.length === 0) { + pattern = []; + } + if (!scale) { + scale = 1; + } + if (!offset) { + offset = { x: 0, y: 0 }; + } + + log("drawing circles with pattern, scale and offset"); + log(pattern); + log(scale); + log(offset); + + // cache drawn patterns. especially useful for the manage pattern menu + var image = cachedCirclesDrawings[pattern.join("")]; + if (!image) { + var drawBuffer = Graphics.createArrayBuffer( + g.getWidth() * scale, + g.getHeight() * scale, + 1, + { msb: true } + ); + + drawBuffer.setColor(1); + CIRCLES.forEach((circle) => drawCircle(circle, drawBuffer, scale)); + + drawBuffer.setColor(0); + drawBuffer.setFontAlign(0, 0); + drawBuffer.setFont("6x8", 4 * scale); + pattern.forEach((circleIndex, patternIndex) => { + var circle = CIRCLES[circleIndex]; + drawBuffer.drawString( + patternIndex + 1, + circle.x * scale, + circle.y * scale + ); + }); + + image = { + width: drawBuffer.getWidth(), + height: drawBuffer.getHeight(), + bpp: 1, + buffer: drawBuffer.buffer, + }; + cachedCirclesDrawings[pattern.join("")] = image; + } + + g.drawImage(image, offset.x, offset.y); +}; + +var cloneCirclesArray = () => { + var circlesClone = Array(CIRCLES.length); + + for (var i = 0; i < CIRCLES.length; i++) { + circlesClone[i] = CIRCLES[i]; + } + + return circlesClone; +}; + +////// +// misc lib functions ////// var debounceTimeoutId; @@ -417,13 +581,3 @@ var debounce = (delay) => { }, delay || 500); }); }; - -var cloneCirclesArray = () => { - var circlesClone = Array(CIRCLES.length); - - for (var i = 0; i < CIRCLES.length; i++) { - circlesClone[i] = CIRCLES[i]; - } - - return circlesClone; -}; diff --git a/apps/ptlaunch/main_menu.png b/apps/ptlaunch/main_menu.png deleted file mode 100644 index a4ecebb0f4ba586eba902bf1699e9b5f9dbe683a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2840 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

BuR#Ni`xQKMeD4CN`aq@@yCr#EN| zXM3p(!XEXSM&}j~3WxF>c%s7`*=*O(m;jXCtaS$LbHvY}D=ubMpj0W9S4|C__ZD^X?b&Dl zf32~jlfV7s75is4?qTxkaVnq-&x1~V1Si930Q+8;h0DGQR<*1-FuGMQ;Ypo?KLmIi zP@xJ|CY%CfEqCvE$=qggrCPg7>gc3GJ)0(%4t)|eqVEh?M)pfUvjhb?zmfY X?!HdU=uwls-yE>EurV(+#oqrf=&qfN literal 0 HcmV?d00001 diff --git a/apps/ptlaunch/main_menu_manage.png b/apps/ptlaunch/main_menu_manage.png new file mode 100644 index 0000000000000000000000000000000000000000..a6aee1427079693d3389120a2f291c6b34c92dfe GIT binary patch literal 2955 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 literal 0 HcmV?d00001 diff --git a/apps/ptlaunch/manage_patterns.png b/apps/ptlaunch/manage_patterns.png new file mode 100644 index 0000000000000000000000000000000000000000..82b10ad43a60ea3b38c39c2bb1f4491235f0dabc GIT binary patch literal 2670 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 Date: Fri, 10 Dec 2021 17:53:58 +0000 Subject: [PATCH 3/5] ptlaunch: try to improve the code slightly --- apps/ptlaunch/app.js | 77 ++++++++++++++++++++++++++++--------------- apps/ptlaunch/boot.js | 76 ++++++++++++++++++------------------------ 2 files changed, 83 insertions(+), 70 deletions(-) diff --git a/apps/ptlaunch/app.js b/apps/ptlaunch/app.js index 1d3a07674..b5a3bf610 100644 --- a/apps/ptlaunch/app.js +++ b/apps/ptlaunch/app.js @@ -1,9 +1,4 @@ var DEBUG = false; -var log = (message) => { - if (DEBUG) { - console.log(JSON.stringify(message)); - } -}; var storage = require("Storage"); @@ -21,7 +16,7 @@ var showMainMenu = () => { }, "Add Pattern": () => { log("creating pattern"); - createPattern().then((pattern) => { + recognizeAndDrawPattern().then((pattern) => { log("got pattern"); log(pattern); log(pattern.length); @@ -119,10 +114,8 @@ var showMainMenu = () => { E.showMenu(mainmenu); }; -showMainMenu(); - var positions = []; -var createPattern = () => { +var recognizeAndDrawPattern = () => { return new Promise((resolve) => { E.showMenu(); g.clear(); @@ -283,18 +276,7 @@ var createPattern = () => { log("redrawing"); g.clear(); - g.setColor(0, 0, 0); - CIRCLES.forEach((circle) => drawCircle(circle)); - - g.setColor(1, 1, 1); - g.setFontAlign(0, 0); - g.setFont("6x8", 4); - pattern.forEach((circleIndex, patternIndex) => { - var circle = CIRCLES[circleIndex]; - g.drawString(patternIndex + 1, circle.x, circle.y); - }); - var t2 = Date.now(); - log(t2 - t0); + drawCirclesWithPattern(pattern); }); }; @@ -381,13 +363,23 @@ var drawAppWithPattern = (i, r, storedPatterns) => { g.drawLine(r.x, r.y, 176, r.y); - drawCirclesWithPattern(pattern, 0.33, { x: 1, y: 3 + r.y }); + drawCirclesWithPattern(pattern, { + enableCaching: true, + scale: 0.33, + offset: { x: 1, y: 3 + r.y }, + }); g.setColor(0, 0, 0); - var appName = g.wrapString(app.name, g.getWidth() - 64).join("\n"); + if (!storedPattern.wrappedAppName) { + storedPattern.wrappedAppName = g + .wrapString(app.name, g.getWidth() - 64) + .join("\n"); + } + log(g.getWidth()); + log(storedPattern.wrappedAppName); g.setFont(scrollerFont) .setFontAlign(-1, 0) - .drawString(appName, 64, r.y + 32); + .drawString(storedPattern.wrappedAppName, 64, r.y + 32); }; var showScrollerContainingAppsWithPatterns = () => { @@ -422,6 +414,7 @@ var showScrollerContainingAppsWithPatterns = () => { pattern = storedPattern.pattern.join(""); appName = storedPattern.app.name; } + clearCircleDrawingCache(); resolve({ pattern: pattern, appName: appName }); }, }); @@ -501,10 +494,24 @@ var drawCircle = (circle, drawBuffer, scale) => { }; var cachedCirclesDrawings = {}; -var drawCirclesWithPattern = (pattern, scale, offset) => { + +var clearCircleDrawingCache = () => { + cachedCirclesDrawings = {}; +}; + +var drawCirclesWithPattern = (pattern, options) => { if (!pattern || pattern.length === 0) { pattern = []; } + if (!options) { + options = {}; + } + var enableCaching = options.enableCaching; + var scale = options.scale; + var offset = options.offset; + if (!enableCaching) { + enableCaching = false; + } if (!scale) { scale = 1; } @@ -520,6 +527,7 @@ var drawCirclesWithPattern = (pattern, scale, offset) => { // cache drawn patterns. especially useful for the manage pattern menu var image = cachedCirclesDrawings[pattern.join("")]; if (!image) { + log("circle image not cached"); var drawBuffer = Graphics.createArrayBuffer( g.getWidth() * scale, g.getHeight() * scale, @@ -548,7 +556,12 @@ var drawCirclesWithPattern = (pattern, scale, offset) => { bpp: 1, buffer: drawBuffer.buffer, }; - cachedCirclesDrawings[pattern.join("")] = image; + + if (enableCaching) { + cachedCirclesDrawings[pattern.join("")] = image; + } + } else { + log("using cached circle image"); } g.drawImage(image, offset.x, offset.y); @@ -568,6 +581,12 @@ var cloneCirclesArray = () => { // misc lib functions ////// +var log = (message) => { + if (DEBUG) { + console.log(JSON.stringify(message)); + } +}; + var debounceTimeoutId; var debounce = (delay) => { if (debounceTimeoutId) { @@ -581,3 +600,9 @@ var debounce = (delay) => { }, delay || 500); }); }; + +////// +// run main function +////// + +showMainMenu(); diff --git a/apps/ptlaunch/boot.js b/apps/ptlaunch/boot.js index 14d390b13..a23607768 100644 --- a/apps/ptlaunch/boot.js +++ b/apps/ptlaunch/boot.js @@ -5,21 +5,6 @@ var log = (message) => { } }; -var CIRCLE_RADIUS = 25; -var CIRCLE_RADIUS_2 = CIRCLE_RADIUS * CIRCLE_RADIUS; - -var CIRCLES = [ - { x: 25, y: 25, i: 0 }, - { x: 87, y: 25, i: 1 }, - { x: 150, y: 25, i: 2 }, - { x: 25, y: 87, i: 3 }, - { x: 87, y: 87, i: 4 }, - { x: 150, y: 87, i: 5 }, - { x: 25, y: 150, i: 6 }, - { x: 87, y: 150, i: 7 }, - { x: 150, y: 150, i: 8 }, -]; - var storedPatterns; var positions = []; var dragHandler = (position) => { @@ -28,7 +13,20 @@ var dragHandler = (position) => { debounce().then(() => { log(positions.length); - var circlesClone = cloneCirclesArray(); + var CIRCLE_RADIUS = 25; + var CIRCLE_RADIUS_2 = CIRCLE_RADIUS * CIRCLE_RADIUS; + + var circles = [ + { x: 25, y: 25, i: 0 }, + { x: 87, y: 25, i: 1 }, + { x: 150, y: 25, i: 2 }, + { x: 25, y: 87, i: 3 }, + { x: 87, y: 87, i: 4 }, + { x: 150, y: 87, i: 5 }, + { x: 25, y: 150, i: 6 }, + { x: 87, y: 150, i: 7 }, + { x: 150, y: 150, i: 8 }, + ]; var pattern = []; var step = Math.floor(positions.length / 100) + 1; @@ -38,92 +36,92 @@ var dragHandler = (position) => { for (var i = 0; i < positions.length; i += step) { p = positions[i]; - circle = circlesClone[0]; + circle = circles[0]; if (circle) { a = p.x - circle.x; b = p.y - circle.y; if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { pattern.push(circle.i); - circlesClone.splice(0, 1); + circles.splice(0, 1); } } - circle = circlesClone[1]; + circle = circles[1]; if (circle) { a = p.x - circle.x; b = p.y - circle.y; if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { pattern.push(circle.i); - circlesClone.splice(1, 1); + circles.splice(1, 1); } } - circle = circlesClone[2]; + circle = circles[2]; if (circle) { a = p.x - circle.x; b = p.y - circle.y; if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { pattern.push(circle.i); - circlesClone.splice(2, 1); + circles.splice(2, 1); } } - circle = circlesClone[3]; + circle = circles[3]; if (circle) { a = p.x - circle.x; b = p.y - circle.y; if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { pattern.push(circle.i); - circlesClone.splice(3, 1); + circles.splice(3, 1); } } - circle = circlesClone[4]; + circle = circles[4]; if (circle) { a = p.x - circle.x; b = p.y - circle.y; if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { pattern.push(circle.i); - circlesClone.splice(4, 1); + circles.splice(4, 1); } } - circle = circlesClone[5]; + circle = circles[5]; if (circle) { a = p.x - circle.x; b = p.y - circle.y; if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { pattern.push(circle.i); - circlesClone.splice(5, 1); + circles.splice(5, 1); } } - circle = circlesClone[6]; + circle = circles[6]; if (circle) { a = p.x - circle.x; b = p.y - circle.y; if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { pattern.push(circle.i); - circlesClone.splice(6, 1); + circles.splice(6, 1); } } - circle = circlesClone[7]; + circle = circles[7]; if (circle) { a = p.x - circle.x; b = p.y - circle.y; if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { pattern.push(circle.i); - circlesClone.splice(7, 1); + circles.splice(7, 1); } } - circle = circlesClone[8]; + circle = circles[8]; if (circle) { a = p.x - circle.x; b = p.y - circle.y; if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { pattern.push(circle.i); - circlesClone.splice(8, 1); + circles.splice(8, 1); } } } @@ -163,16 +161,6 @@ var debounce = (delay) => { }); }; -var cloneCirclesArray = () => { - var circlesClone = Array(CIRCLES.length); - - for (var i = 0; i < CIRCLES.length; i++) { - circlesClone[i] = CIRCLES[i]; - } - - return circlesClone; -}; - (function () { var sui = Bangle.setUI; Bangle.setUI = function (mode, cb) { From 5ff04c50ac2660338e1c73640cc575a49d527802 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Fri, 10 Dec 2021 21:53:17 +0000 Subject: [PATCH 4/5] ptlaunch: add screenshot --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index 65ef9bcea..2206af8cb 100644 --- a/apps.json +++ b/apps.json @@ -4832,6 +4832,7 @@ "version": "0.10", "description": "Directly launch apps from the clock screen with custom patterns.", "icon": "app.png", + "screenshots": [{"url":"manage_patterns.png"}], "tags": "tools", "supports": ["BANGLEJS2"], "readme": "README.md", From 8f0d9f310cdc75402fc0de6b9aacc232cdccad82 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Fri, 10 Dec 2021 21:57:02 +0000 Subject: [PATCH 5/5] ptlaunch: add all screenshots --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 2206af8cb..24c1843a5 100644 --- a/apps.json +++ b/apps.json @@ -4832,7 +4832,7 @@ "version": "0.10", "description": "Directly launch apps from the clock screen with custom patterns.", "icon": "app.png", - "screenshots": [{"url":"manage_patterns.png"}], + "screenshots": [{"url":"main_menu_add.png"}, {"url":"add_pattern.png"}, {"url":"select_app.png"}, {"url":"main_menu_manage.png"}, {"url":"manage_patterns.png"}], "tags": "tools", "supports": ["BANGLEJS2"], "readme": "README.md",