Merge pull request #3613 from thyttan/quicklaunch

quicklaunch: do fewer storage interactions and let the foreground app load first
pull/3664/head
Rob Pilling 2024-11-13 21:46:57 +00:00 committed by GitHub
commit a1d140f5b8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 48 additions and 38 deletions

View File

@ -7,12 +7,10 @@
0.07: Revert version 0.06. This version is the same as 0.05. 0.07: Revert version 0.06. This version is the same as 0.05.
0.08: Respect appRect on touch events 0.08: Respect appRect on touch events
0.09: Do not react if clkinfo is focused 0.09: Do not react if clkinfo is focused
0.10: Extend the functionality via a quicklaunch.app.js file that can be launched 0.10: Extend the functionality via a quicklaunch.app.js file that can be launched with quicklaunch itself.
with quicklaunch itself.
0.11: Add hints to the extension app. Tweak remove function. 0.11: Add hints to the extension app. Tweak remove function.
0.12: Stackable extension screens. After updating, please visit the quicklaunch 0.12: Stackable extension screens. After updating, please visit the quicklaunch settings page to prompt an automatic update of the quicklaunch.json settings file with new key names.
settings page to prompt an automatic update of the quicklaunch.json settings file with
new key names.
0.13: Touch and hold to pause the timeout to clock temporarily. 0.13: Touch and hold to pause the timeout to clock temporarily.
0.14: Extension: Don't go down a path if nothing waits at the end. Revisit the current intersection instead. 0.14: Extension: Don't go down a path if nothing waits at the end. Revisit the current intersection instead.
0.15: Extension: Compatibility with "Fastload Utils" app history feature. 0.15: Extension: Compatibility with "Fastload Utils" app history feature.
0.16: Snappier. Fewer storage interactions.

View File

@ -1,31 +1,40 @@
{ {
const R = Bangle.appRect;
g.clearRect(R); // clear immediately to increase perceived snappiness.
const storage = require("Storage"); const storage = require("Storage");
let settings = storage.readJSON("quicklaunch.json", true) || {}; let settings = storage.readJSON("quicklaunch.json", true) || {};
let trace = (settings[settings.trace+"app"].src=="quicklaunch.app.js") ? settings.trace : settings.trace.substring(0, settings.trace.length-1); // If the stored trace leads beyond extension screens, walk back to the last extension screen. Compatibility with "Fastload Utils" App History feature.
let reset = function(name){ const draw = () => {
if (!settings[name]) settings[name] = {"name":"(none)"}; // Draw app hints
if (!storage.read(settings[name].src)) settings[name] = {"name":"(none)"}; g.reset().clearRect(R).setFont("Vector", 11)
storage.write("quicklaunch.json", settings); .setFontAlign(0,1,3).drawString(settings[trace+"lapp"].name, R.x2, R.y+R.h/2)
.setFontAlign(0,1,1).drawString(settings[trace+"rapp"].name, R.x, R.y+R.h/2)
.setFontAlign(0,1,0).drawString(settings[trace+"uapp"].name, R.x+R.w/2, R.y2)
.setFontAlign(0,-1,0).drawString(settings[trace+"dapp"].name, R.x+R.w/2, R.y)
.setFontAlign(0,0,0).drawString(settings[trace+"tapp"].name, R.x+R.w/2, R.y+R.h/2);
}; };
draw(); // draw asap to increase perceived snappiness.
let leaveTrace = function(trace) { let leaveTrace = function(trace) {
if (settings[trace+"app"].name != "") { if (settings[trace+"app"].name != "") {
settings.trace = trace; settings.trace = trace;
storage.writeJSON("quicklaunch.json", settings);
} else { trace = trace.substring(0, trace.length-1); } } else { trace = trace.substring(0, trace.length-1); }
return trace; return trace;
}; };
let launchApp = function(trace) { let launchApp = function(trace) {
if (settings[trace+"app"]) { if (settings[trace+"app"] && settings[trace+"app"].src) {
if (settings[trace+"app"].src){ if (settings[trace+"app"].name == "Extension") draw();
if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); else if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher();
} else if (!storage.read(settings[trace+"app"].src)) {
E.showMessage(settings[trace+"app"].src+"\n"+/*LANG*/"was not found"+".", "Quick Launch");
settings[trace+"app"] = {"name":"(none)"}; // reset entry.
} else load(settings[trace+"app"].src);
} }
}; };
let trace = (settings[settings.trace+"app"].src=="quicklaunch.app.js") ? settings.trace : settings.trace.substring(0, settings.trace.length-1); // If the stored trace leads beyond extension screens, walk back to the last extension screen. Compatibility with "Fastload Utils" App History feature.
let touchHandler = (_,e) => { let touchHandler = (_,e) => {
if (e.type == 2) return; if (e.type == 2) return;
let R = Bangle.appRect; let R = Bangle.appRect;
@ -47,15 +56,22 @@
if (e.b == 0 && !timeoutToClock) updateTimeoutToClock(); if (e.b == 0 && !timeoutToClock) updateTimeoutToClock();
}; };
let saveAndClear = ()=> {
storage.writeJSON("quicklaunch.json", settings);
E.removeListener("kill", saveAndClear);
if (timeoutToClock) clearTimeout(timeoutToClock); // Compatibility with Fastload Utils.
}
Bangle.setUI({ Bangle.setUI({
mode: "custom", mode: "custom",
touch: touchHandler, touch: touchHandler,
swipe : swipeHandler, swipe : swipeHandler,
drag : onLongTouchDoPause, drag : onLongTouchDoPause,
remove: ()=>{if (timeoutToClock) clearTimeout(timeoutToClock);} // Compatibility with Fastload Utils. remove: saveAndClear
}); });
g.clearRect(Bangle.appRect); E.on("kill", saveAndClear)
"Bangle.loadWidgets()"; // Hack: Fool Fastload Utils that we call Bangle.loadWidgets(). This way we get the fastest possibe loading in whichever environment we find ourselves. "Bangle.loadWidgets()"; // Hack: Fool Fastload Utils that we call Bangle.loadWidgets(). This way we get the fastest possibe loading in whichever environment we find ourselves.
// taken from Icon Launcher with some alterations // taken from Icon Launcher with some alterations
@ -67,13 +83,4 @@
}; };
updateTimeoutToClock(); updateTimeoutToClock();
let R = Bangle.appRect;
// Draw app hints
g.setFont("Vector", 11)
.setFontAlign(0,1,3).drawString(settings[trace+"lapp"].name, R.x2, R.y+R.h/2)
.setFontAlign(0,1,1).drawString(settings[trace+"rapp"].name, R.x, R.y+R.h/2)
.setFontAlign(0,1,0).drawString(settings[trace+"uapp"].name, R.x+R.w/2, R.y2)
.setFontAlign(0,-1,0).drawString(settings[trace+"dapp"].name, R.x+R.w/2, R.y)
.setFontAlign(0,0,0).drawString(settings[trace+"tapp"].name, R.x+R.w/2, R.y+R.h/2);
} }

View File

@ -1,24 +1,29 @@
{ {
const storage = require("Storage"); const storage = require("Storage");
let settings = storage.readJSON("quicklaunch.json", true) || {}; let settings;
let reset = function(name){
if (!settings[name]) settings[name] = {"name":"(none)"};
if (!storage.read(settings[name].src)) settings[name] = {"name":"(none)"};
storage.write("quicklaunch.json", settings);
};
let leaveTrace = function(trace) { let leaveTrace = function(trace) {
if (!settings) settings = storage.readJSON("quicklaunch.json", true) || {};
settings.trace = trace; settings.trace = trace;
storage.writeJSON("quicklaunch.json", settings); storage.writeJSON("quicklaunch.json", settings);
return trace; return trace;
}; };
let launchApp = function(trace) { let launchApp = function(trace) {
if (!settings) settings = storage.readJSON("quicklaunch.json", true) || {};
if (settings[trace+"app"].src) { if (settings[trace+"app"].src) {
if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); if (settings[trace+"app"].name == "Show Launcher") {
} Bangle.showLauncher();
} else if (!storage.read(settings[trace+"app"].src)) {
E.showMessage(settings[trace+"app"].src+"\n"+/*LANG*/"was not found"+".", "Quick Launch");
settings[trace+"app"] = {"name":"(none)"}; // reset entry.
storage.write("quicklaunch.json", settings);
setTimeout(load, 2000);
} else {load(settings[trace+"app"].src);}
} }
};
let trace; let trace;

View File

@ -2,7 +2,7 @@
"id": "quicklaunch", "id": "quicklaunch",
"name": "Quick Launch", "name": "Quick Launch",
"icon": "app.png", "icon": "app.png",
"version": "0.15", "version": "0.16",
"description": "Tap or swipe left/right/up/down on your clock face to launch up to five apps of your choice. Configurations can be accessed through Settings->Apps.", "description": "Tap or swipe left/right/up/down on your clock face to launch up to five apps of your choice. Configurations can be accessed through Settings->Apps.",
"type": "bootloader", "type": "bootloader",
"tags": "tools, system", "tags": "tools, system",