mirror of https://github.com/espruino/BangleApps
Merge pull request #3613 from thyttan/quicklaunch
quicklaunch: do fewer storage interactions and let the foreground app load firstpull/3664/head
commit
a1d140f5b8
|
@ -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.
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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[trace+"app"].src){
|
if (!settings) settings = storage.readJSON("quicklaunch.json", true) || {};
|
||||||
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"].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;
|
||||||
|
|
||||||
|
|
|
@ -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",
|
||||||
|
|
Loading…
Reference in New Issue