Added screenshot display in app list (automatic screenshots should follow soonish)

master
Gordon Williams 2021-10-26 13:15:21 +01:00
parent 8b9d43dece
commit 0161b1a8d2
6 changed files with 113 additions and 50 deletions

View File

@ -220,6 +220,7 @@ and which gives information about the app for the Launcher.
"version": "0v01", // the version of this app "version": "0v01", // the version of this app
"description": "...", // long description (can contain markdown) "description": "...", // long description (can contain markdown)
"icon": "icon.png", // icon in apps/ "icon": "icon.png", // icon in apps/
"screenshots" : [ { url:"screenshot.png" } ], // optional screenshot for app
"type":"...", // optional(if app) - "type":"...", // optional(if app) -
// 'app' - an application // 'app' - an application
// 'widget' - a widget // 'widget' - a widget

View File

@ -10,9 +10,7 @@
"supports": ["BANGLEJS","BANGLEJS2"], "supports": ["BANGLEJS","BANGLEJS2"],
"custom": "custom.html", "custom": "custom.html",
"customConnect": true, "customConnect": true,
"storage": [ "storage": [],
],
"sortorder": -20 "sortorder": -20
}, },
{ {
@ -65,7 +63,6 @@
], ],
"sortorder": -8 "sortorder": -8
}, },
{ {
"id": "moonphase", "id": "moonphase",
"name": "Moonphase", "name": "Moonphase",
@ -456,10 +453,11 @@
"version": "0.15", "version": "0.15",
"description": "An Analog Clock", "description": "An Analog Clock",
"icon": "clock-analog.png", "icon": "clock-analog.png",
"screenshots": [{"url":"screenshot_analog.png"}],
"type": "clock", "type": "clock",
"tags": "clock", "tags": "clock",
"readme": "README.md",
"supports": ["BANGLEJS","BANGLEJS2"], "supports": ["BANGLEJS","BANGLEJS2"],
"readme": "README.md",
"allow_emulator": true, "allow_emulator": true,
"storage": [ "storage": [
{"name":"aclock.app.js","url":"clock-analog.js"}, {"name":"aclock.app.js","url":"clock-analog.js"},
@ -472,10 +470,11 @@
"version": "0.05", "version": "0.05",
"description": "This is a simple clock using minimalist 2x3 pixel numerical digits", "description": "This is a simple clock using minimalist 2x3 pixel numerical digits",
"icon": "clock2x3.png", "icon": "clock2x3.png",
"screenshots": [{"url":"screenshot_pixel.png"}],
"type": "clock", "type": "clock",
"tags": "clock", "tags": "clock",
"readme": "README.md",
"supports": ["BANGLEJS","BANGLEJS2"], "supports": ["BANGLEJS","BANGLEJS2"],
"readme": "README.md",
"allow_emulator": true, "allow_emulator": true,
"storage": [ "storage": [
{"name":"clock2x3.app.js","url":"clock2x3-app.js"}, {"name":"clock2x3.app.js","url":"clock2x3-app.js"},
@ -504,9 +503,10 @@
"version": "0.04", "version": "0.04",
"description": "T-Rex game in the style of Chrome's offline game", "description": "T-Rex game in the style of Chrome's offline game",
"icon": "trex.png", "icon": "trex.png",
"screenshots": [{"url":"screenshot_trex.png"}],
"tags": "game", "tags": "game",
"readme": "README.md",
"supports": ["BANGLEJS","BANGLEJS2"], "supports": ["BANGLEJS","BANGLEJS2"],
"readme": "README.md",
"allow_emulator": true, "allow_emulator": true,
"storage": [ "storage": [
{"name":"trex.app.js","url":"trex.js"}, {"name":"trex.app.js","url":"trex.js"},
@ -691,6 +691,7 @@
"version": "0.10", "version": "0.10",
"description": "Show Gadgetbridge weather report", "description": "Show Gadgetbridge weather report",
"icon": "icon.png", "icon": "icon.png",
"screenshots": [{"url":"screenshot.png"}],
"tags": "widget,outdoors", "tags": "widget,outdoors",
"supports": ["BANGLEJS"], "supports": ["BANGLEJS"],
"readme": "readme.md", "readme": "readme.md",
@ -797,6 +798,7 @@
"version": "0.02", "version": "0.02",
"description": "Show a warning when the battery runs low.", "description": "Show a warning when the battery runs low.",
"icon": "widget.png", "icon": "widget.png",
"screenshots": [{"url":"screenshot.png"}],
"type": "widget", "type": "widget",
"tags": "tool,battery", "tags": "tool,battery",
"supports": ["BANGLEJS"], "supports": ["BANGLEJS"],
@ -876,14 +878,15 @@
{"name":"widhrm.wid.js","url":"widget.js"} {"name":"widhrm.wid.js","url":"widget.js"}
] ]
}, },
{ "id": "bthrm", {
"id": "bthrm",
"name": "Bluetooth Heart Rate Monitor", "name": "Bluetooth Heart Rate Monitor",
"shortName": "BT HRM", "shortName": "BT HRM",
"version": "0.01", "version": "0.01",
"description": "Overrides Bangle.js's build in heart rate monitor with an external Bluetooth one.", "description": "Overrides Bangle.js's build in heart rate monitor with an external Bluetooth one.",
"icon": "app.png", "icon": "app.png",
"tags": "health,bluetooth",
"type": "boot", "type": "boot",
"tags": "health,bluetooth",
"supports": ["BANGLEJS","BANGLEJS2"], "supports": ["BANGLEJS","BANGLEJS2"],
"readme": "README.md", "readme": "README.md",
"storage": [ "storage": [
@ -1094,10 +1097,11 @@
"version": "0.03", "version": "0.03",
"description": "A simple 7 segment Clock with date", "description": "A simple 7 segment Clock with date",
"icon": "icon.png", "icon": "icon.png",
"screenshots": [{"url":"screenshot_s7segment.png"}],
"type": "clock", "type": "clock",
"tags": "clock", "tags": "clock",
"readme": "README.md",
"supports": ["BANGLEJS","BANGLEJS2"], "supports": ["BANGLEJS","BANGLEJS2"],
"readme": "README.md",
"allow_emulator": true, "allow_emulator": true,
"storage": [ "storage": [
{"name":"s7clk.app.js","url":"app.js"}, {"name":"s7clk.app.js","url":"app.js"},
@ -1315,9 +1319,10 @@
"version": "0.05", "version": "0.05",
"description": "A Flappy Bird game clone", "description": "A Flappy Bird game clone",
"icon": "app.png", "icon": "app.png",
"screenshots": [{"url":"screenshot1_flappy.png"},{"url":"screenshot2_flappy.png"}],
"tags": "game", "tags": "game",
"readme": "README.md",
"supports": ["BANGLEJS","BANGLEJS2"], "supports": ["BANGLEJS","BANGLEJS2"],
"readme": "README.md",
"allow_emulator": true, "allow_emulator": true,
"storage": [ "storage": [
{"name":"flappy.app.js","url":"app.js"}, {"name":"flappy.app.js","url":"app.js"},
@ -1348,9 +1353,7 @@
"tags": "tool,outdoors,agps", "tags": "tool,outdoors,agps",
"supports": ["BANGLEJS"], "supports": ["BANGLEJS"],
"custom": "custom.html", "custom": "custom.html",
"storage": [ "storage": []
]
}, },
{ {
"id": "pomodo", "id": "pomodo",
@ -1389,10 +1392,11 @@
"version": "0.05", "version": "0.05",
"description": "Simple, readable and practical clock", "description": "Simple, readable and practical clock",
"icon": "bold_clock.png", "icon": "bold_clock.png",
"screenshots": [{"url":"screenshot_bold.png"}],
"type": "clock", "type": "clock",
"tags": "clock", "tags": "clock",
"readme": "README.md",
"supports": ["BANGLEJS","BANGLEJS2"], "supports": ["BANGLEJS","BANGLEJS2"],
"readme": "README.md",
"allow_emulator": true, "allow_emulator": true,
"storage": [ "storage": [
{"name":"boldclk.app.js","url":"bold_clock.js"}, {"name":"boldclk.app.js","url":"bold_clock.js"},
@ -1626,6 +1630,7 @@
"version": "0.08", "version": "0.08",
"description": "A simple digital clock showing seconds as a bar", "description": "A simple digital clock showing seconds as a bar",
"icon": "clock-bar.png", "icon": "clock-bar.png",
"screenshots": [{"url":"screenshot.png"},{"url":"screenshot_pm.png"}],
"type": "clock", "type": "clock",
"tags": "clock", "tags": "clock",
"supports": ["BANGLEJS"], "supports": ["BANGLEJS"],
@ -3229,45 +3234,43 @@
], ],
"data": [{"name":"speedalt.json"}] "data": [{"name":"speedalt.json"}]
}, },
{ "id": "speedalt2", {
"id": "speedalt2",
"name": "GPS Adventure Sports II", "name": "GPS Adventure Sports II",
"shortName": "GPS Adv Sport II", "shortName": "GPS Adv Sport II",
"icon": "app.png",
"version": "0.07", "version": "0.07",
"description": "GPS speed, altitude and distance to waypoint display. Designed for easy viewing and use during outdoor activities such as para-gliding, hang-gliding, sailing, cycling etc.", "description": "GPS speed, altitude and distance to waypoint display. Designed for easy viewing and use during outdoor activities such as para-gliding, hang-gliding, sailing, cycling etc.",
"icon": "app.png",
"type": "app",
"tags": "tool,outdoors", "tags": "tool,outdoors",
"supports": ["BANGLEJS"], "supports": ["BANGLEJS"],
"type":"app",
"allow_emulator":true,
"readme": "README.md", "readme": "README.md",
"allow_emulator": true,
"storage": [ "storage": [
{"name":"speedalt2.app.js","url":"app.js"}, {"name":"speedalt2.app.js","url":"app.js"},
{"name":"speedalt2.img","url":"app-icon.js","evaluate":true}, {"name":"speedalt2.img","url":"app-icon.js","evaluate":true},
{"name":"speedalt2.settings.js","url":"settings.js"} {"name":"speedalt2.settings.js","url":"settings.js"}
], ],
"data": [ "data": [{"name":"speedalt2.json"}]
{"name":"speedalt2.json"}
]
}, },
{ "id": "slomoclock", {
"id": "slomoclock",
"name": "SloMo Clock", "name": "SloMo Clock",
"shortName": "SloMo Clock", "shortName": "SloMo Clock",
"icon": "watch.png",
"version": "0.10", "version": "0.10",
"description": "Simple 24h clock face with large digits, hour above minute. Uses Layout library.", "description": "Simple 24h clock face with large digits, hour above minute. Uses Layout library.",
"icon": "watch.png",
"type": "clock",
"tags": "clock", "tags": "clock",
"supports": ["BANGLEJS"], "supports": ["BANGLEJS"],
"type":"clock",
"allow_emulator":true,
"readme": "README.md", "readme": "README.md",
"allow_emulator": true,
"storage": [ "storage": [
{"name":"slomoclock.app.js","url":"app.js"}, {"name":"slomoclock.app.js","url":"app.js"},
{"name":"slomoclock.img","url":"app-icon.js","evaluate":true}, {"name":"slomoclock.img","url":"app-icon.js","evaluate":true},
{"name":"slomoclock.settings.js","url":"settings.js"} {"name":"slomoclock.settings.js","url":"settings.js"}
], ],
"data": [ "data": [{"name":"slomoclock.json"}]
{"name":"slomoclock.json"}
]
}, },
{ {
"id": "de-stress", "id": "de-stress",
@ -3579,6 +3582,7 @@
"version": "0.05", "version": "0.05",
"description": "Control the music on your Gadgetbridge-connected phone", "description": "Control the music on your Gadgetbridge-connected phone",
"icon": "icon.png", "icon": "icon.png",
"screenshots": [{"url":"screenshot.png"},{"url":"screenshot_2.png"}],
"type": "app", "type": "app",
"tags": "tools,bluetooth,gadgetbridge,music", "tags": "tools,bluetooth,gadgetbridge,music",
"supports": ["BANGLEJS"], "supports": ["BANGLEJS"],
@ -3652,6 +3656,7 @@
"version": "0.02", "version": "0.02",
"description": "Automatically turn Quiet Mode on or off at set times", "description": "Automatically turn Quiet Mode on or off at set times",
"icon": "app.png", "icon": "app.png",
"screenshots": [{"url":"screenshot_edit.png"},{"url":"screenshot_main.png"},{"url":"screenshot_widget_alarms.png"},{"url":"screenshot_widget_silent.png"}],
"tags": "tool,widget", "tags": "tool,widget",
"supports": ["BANGLEJS"], "supports": ["BANGLEJS"],
"readme": "README.md", "readme": "README.md",
@ -3702,6 +3707,7 @@
"version": "0.01", "version": "0.01",
"description": "An Omnitrix Showpiece", "description": "An Omnitrix Showpiece",
"icon": "omnitrix.png", "icon": "omnitrix.png",
"screenshots": [{"url":"screenshot.png"}],
"tags": "game", "tags": "game",
"supports": ["BANGLEJS"], "supports": ["BANGLEJS"],
"readme": "README.md", "readme": "README.md",
@ -3717,6 +3723,7 @@
"version": "0.02", "version": "0.02",
"description": "Morphing Clock, with an awesome \"The Dark Knight\" themed logo.", "description": "Morphing Clock, with an awesome \"The Dark Knight\" themed logo.",
"icon": "bat-clock.png", "icon": "bat-clock.png",
"screenshots": [{"url":"screenshot.png"}],
"type": "clock", "type": "clock",
"tags": "clock", "tags": "clock",
"supports": ["BANGLEJS"], "supports": ["BANGLEJS"],
@ -3970,6 +3977,7 @@
"version": "0.02", "version": "0.02",
"description": "A simple clock using the bold Anton font.", "description": "A simple clock using the bold Anton font.",
"icon": "app.png", "icon": "app.png",
"screenshots": [{"url":"screenshot.png"}],
"type": "clock", "type": "clock",
"tags": "clock", "tags": "clock",
"supports": ["BANGLEJS","BANGLEJS2"], "supports": ["BANGLEJS","BANGLEJS2"],
@ -3985,10 +3993,11 @@
"version": "0.02", "version": "0.02",
"description": "A clock using a wave image by [Lillith May](https://www.instagram.com/_lilustrations_/). **Note: This requires firmware 2v11 or later Bangle.js 1**", "description": "A clock using a wave image by [Lillith May](https://www.instagram.com/_lilustrations_/). **Note: This requires firmware 2v11 or later Bangle.js 1**",
"icon": "app.png", "icon": "app.png",
"screenshots": [{"url":"screenshot.png"}],
"type": "clock", "type": "clock",
"tags": "clock", "tags": "clock",
"readme": "README.md",
"supports": ["BANGLEJS","BANGLEJS2"], "supports": ["BANGLEJS","BANGLEJS2"],
"readme": "README.md",
"allow_emulator": true, "allow_emulator": true,
"storage": [ "storage": [
{"name":"waveclk.app.js","url":"app.js"}, {"name":"waveclk.app.js","url":"app.js"},
@ -4001,10 +4010,11 @@
"version": "0.01", "version": "0.01",
"description": "A clock with a flower background by [Lillith May](https://www.instagram.com/_lilustrations_/). **Note: This requires firmware 2v11 or later Bangle.js 1**", "description": "A clock with a flower background by [Lillith May](https://www.instagram.com/_lilustrations_/). **Note: This requires firmware 2v11 or later Bangle.js 1**",
"icon": "app.png", "icon": "app.png",
"screenshots": [{"url":"screenshot_floral.png"}],
"type": "clock", "type": "clock",
"tags": "clock", "tags": "clock",
"readme": "README.md",
"supports": ["BANGLEJS","BANGLEJS2"], "supports": ["BANGLEJS","BANGLEJS2"],
"readme": "README.md",
"allow_emulator": true, "allow_emulator": true,
"storage": [ "storage": [
{"name":"floralclk.app.js","url":"app.js"}, {"name":"floralclk.app.js","url":"app.js"},
@ -4017,6 +4027,7 @@
"version": "0.01", "version": "0.01",
"description": "Score Tracker for sports that use plain numbers (e.g. Badminton, Volleyball, Soccer, Table Tennis, ...). Also supports tennis scoring.", "description": "Score Tracker for sports that use plain numbers (e.g. Badminton, Volleyball, Soccer, Table Tennis, ...). Also supports tennis scoring.",
"icon": "score.app.png", "icon": "score.app.png",
"screenshots": [{"url":"screenshot_score.png"}],
"type": "app", "type": "app",
"tags": "", "tags": "",
"supports": ["BANGLEJS","BANGLEJS2"], "supports": ["BANGLEJS","BANGLEJS2"],
@ -4048,10 +4059,11 @@
"version": "0.01", "version": "0.01",
"description": "A nifty clock with time and date", "description": "A nifty clock with time and date",
"icon": "app.png", "icon": "app.png",
"screenshots": [{"url":"screenshot_nifty.png"}],
"type": "clock", "type": "clock",
"tags": "clock", "tags": "clock",
"readme": "README.md",
"supports": ["BANGLEJS","BANGLEJS2"], "supports": ["BANGLEJS","BANGLEJS2"],
"readme": "README.md",
"allow_emulator": true, "allow_emulator": true,
"storage": [ "storage": [
{"name":"ffcniftya.app.js","url":"app.js"}, {"name":"ffcniftya.app.js","url":"app.js"},
@ -4064,6 +4076,7 @@
"version": "0.02", "version": "0.02",
"description": "A nifty clock (series B) with time, date and color configuration", "description": "A nifty clock (series B) with time, date and color configuration",
"icon": "app.png", "icon": "app.png",
"screenshots": [{"url":"screenshot.png"}],
"type": "clock", "type": "clock",
"tags": "clock", "tags": "clock",
"supports": ["BANGLEJS","BANGLEJS2"], "supports": ["BANGLEJS","BANGLEJS2"],
@ -4081,6 +4094,7 @@
"version": "0.01", "version": "0.01",
"description": "A touch based stop watch for Bangle JS 2", "description": "A touch based stop watch for Bangle JS 2",
"icon": "stopwatch.png", "icon": "stopwatch.png",
"screenshots": [{"url":"screenshot1.png"},{"url":"screenshot2.png"},{"url":"screenshot3.png"}],
"tags": "tools,app,b2", "tags": "tools,app,b2",
"supports": ["BANGLEJS2"], "supports": ["BANGLEJS2"],
"readme": "README.md", "readme": "README.md",
@ -4089,7 +4103,8 @@
{"name":"stopwatch.img","url":"stopwatch.icon.js","evaluate":true} {"name":"stopwatch.img","url":"stopwatch.icon.js","evaluate":true}
] ]
}, },
{ "id": "vernierrespirate", {
"id": "vernierrespirate",
"name": "Vernier Go Direct Respiration Belt", "name": "Vernier Go Direct Respiration Belt",
"shortName": "Respiration Belt", "shortName": "Respiration Belt",
"version": "0.01", "version": "0.01",
@ -4110,6 +4125,7 @@
"version": "0.01", "version": "0.01",
"description": "A touch based GPS watch, shows OS map reference", "description": "A touch based GPS watch, shows OS map reference",
"icon": "gpstouch.png", "icon": "gpstouch.png",
"screenshots": [{"url":"screenshot1.png"},{"url":"screenshot2.png"},{"url":"screenshot3.png"},{"url":"screenshot4.png"}],
"tags": "tools,app", "tags": "tools,app",
"supports": ["BANGLEJS2"], "supports": ["BANGLEJS2"],
"readme": "README.md", "readme": "README.md",

View File

@ -55,20 +55,31 @@ apps = apps.map((app,appIdx) => {
return app; return app;
}); });
// search for screenshots
apps = apps.map((app,appIdx) => {
if (app.screenshots) return app; // already sorted
var files = require("fs").readdirSync(__dirname+"/../apps/"+app.id);
var screenshots = files.filter(fn=>fn.startsWith("screenshot") && fn.endsWith(".png"));
if (screenshots.length)
app.screenshots = screenshots.map(fn => ({url:fn}));
return app;
});
var KEY_ORDER = [ var KEY_ORDER = [
"id","name","shortName","version","description","icon","type","tags","supports", "id","name","shortName","version","description","icon","screenshots","type","tags","supports",
"dependencies", "readme", "custom", "customConnect", "interface", "dependencies", "readme", "custom", "customConnect", "interface",
"allow_emulator", "storage", "data", "sortorder" "allow_emulator", "storage", "data", "sortorder"
]; ];
var JS = JSON.stringify; var JS = JSON.stringify;
var json = "[\n "+apps.map(app=>{ var json = "[\n "+apps.map(app=>{
/*var keys = KEY_ORDER.filter(k=>k in app); var keys = KEY_ORDER.filter(k=>k in app);
Object.keys(app).forEach(k=>{ Object.keys(app).forEach(k=>{
if (!KEY_ORDER.includes(k)) if (!KEY_ORDER.includes(k))
throw new Error(`Key named ${k} not known!`); throw new Error(`Key named ${k} not known!`);
});*/ });
var keys = Object.keys(app); // don't re-order //var keys = Object.keys(app); // don't re-order
return "{\n "+keys.map(k=>{ return "{\n "+keys.map(k=>{
var js = JS(app[k]); var js = JS(app[k]);

2
core

@ -1 +1 @@
Subproject commit 8bbdf699210ab4d265a29a2bb0fd823cb5bca78a Subproject commit df02cd0529d81439fb859b553576398a445ef1b8

View File

@ -29,12 +29,26 @@
.sort-nav { .sort-nav {
float: right; float: right;
} }
.app-tile {
position: relative;
border-bottom: 1px solid #EEE;
margin-bottom: 4px;
}
.tile-content { position: relative; } .tile-content { position: relative; }
.link-github { .link-github {
position:absolute; position:absolute;
top: 36px; top: 36px;
left: -24px; left: -24px;
} }
.tile-screenshot {
position:absolute;bottom:1em;right:1em;
width:4em;height:4em;
padding:2px;border:1px solid black;
cursor:pointer;
}
.btn.btn-favourite { color: red; } .btn.btn-favourite { color: red; }
.btn.btn-favourite:hover { color: red; } .btn.btn-favourite:hover { color: red; }
@ -53,4 +67,3 @@
.icon.icon-interface::before { .icon.icon-interface::before {
content: "\01F5AB"; content: "\01F5AB";
} }

View File

@ -161,3 +161,25 @@ window.addEventListener('load', (event) => {
}); });
}); });
}); });
function onAppJSONLoaded() {
return new Promise(resolve => {
httpGet("screenshots.json").then(screenshotJSON=>{
var screenshots = [];
try {
screenshots = JSON.parse(screenshotJSON);
} catch(e) {
console.error("Screenshot JSON Corrupted", e);
}
screenshots.forEach(s => {
var app = appJSON.find(a=>a.id==s.id);
if (!app) return;
if (!app.screenshots) app.screenshots = [];
app.screenshots.push({url:s.url});
})
}).catch(err=>{
console.log("No screenshots.json found");
resolve();
});
});
}