diff --git a/apps/taglaunch/ChangeLog b/apps/taglaunch/ChangeLog index 6574fcb4d5..e088349ab0 100644 --- a/apps/taglaunch/ChangeLog +++ b/apps/taglaunch/ChangeLog @@ -7,3 +7,4 @@ 0.06: Fixed a crash if an app has no tags (app.tags is undefined) 0.07: Clear cached app list when updating showClocks setting 0.08: Add haptic feedback option when selecting app or category in menu, increase vector size limit in settings +0.09: Add option to set up to 3 shortcut apps that you can access straight from the tag menu for quicker access diff --git a/apps/taglaunch/README.md b/apps/taglaunch/README.md index cc32f54a1b..0b10ff9181 100644 --- a/apps/taglaunch/README.md +++ b/apps/taglaunch/README.md @@ -1,14 +1,15 @@ Tag Launcher ======== -Based on the default launcher but puts all applications in a submenu by their tag. +Based on the default launcher but puts all applications in a submenu by their tag. There are three customizable spots at the top of the launcher for quicker access to your favorite apps. + With many applications installed this can result in a faster applications selection than the linear access of the default launcher. Currently the following tags are supported: clock, game, tool, bluetooth, outdoors, health and misc. Settings -------- - +- `Shortcuts` - Change the app shortcuts at the top of the launcher. If no apps are set as the shortcut, the launcher will not have a section at the top, instead beginning with the first tag. (Default: No shortcuts) - `Font` - The font used (`4x6`, `6x8`, `12x20`, `6x15` or `Vector`). Default `12x20`. - `Vector Font Size` - The size of the font if `Font` is set to `Vector`. Default `10`. - `Haptic Feedback` - Whether or not to vibrate slightly when selecting an app or category in the launcher. Default `No`. diff --git a/apps/taglaunch/app.js b/apps/taglaunch/app.js index 3e322b5ba9..df187b3fd8 100644 --- a/apps/taglaunch/app.js +++ b/apps/taglaunch/app.js @@ -1,6 +1,5 @@ { // must be inside our own scope here so that when we are unloaded everything disappears let s = require("Storage"); - // TODO: Allow to change sortorder in settings let tags = {"clock": {name: /*LANG*/"Clocks", icon: () => atob("MDCEBERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERESIiIiIREREREREREREREREREREREREiIiIiIiIiIhERERERERERERERERERESIiIiIiIiIiIiIREREREREREREREREREiIiIiIiIiIiIiIhERERERERERERERESIiIiIgz//8ziIiIiIREREREREREREREiIiIg////////ziIiIhERERERERERERIiIiD//////////84iIiERERERERERESIiIg/////8A/////ziIiIRERERERERESIiI//////8A//////+IiIREREREREREiIiP//////8A///////4iIhERERERERIiIg///////8A///////ziIiERERERERIiIP///////8A////////OIiERERERESIiI////////8A////////+IiIRERERESIiD////////8A////////84iIRERERESIiP////////8A/////////4iIRERERESIiP////////8A/////////4iIREREREiIg/////////8A/////////ziIhEREREiIg/////////IAL////////ziIhEREREiIj////////yAAAv////////iIhEREREiIgiIv/////wCIAP/////yIiiIhEREREiIgiIv/////wCIAP/////yIiiIhEREREiIj////////yAAAD////////iIhEREREiIg/////////IAABP//////ziIhEREREiIg///////////IAE//////ziIhERERESIiP//////////8gAT/////4iIRERERESIiP///////////yABP////4iIRERERESIiD////////////IAL///84iIRERERESIiI////////////8i////+IiIRERERERIiIP/////////////////OIiERERERERIiIg////////////////ziIiEREREREREiIiP///////////////4iIhERERERERESIiI//////////////+IiIRERERERERESIiIg/////8i/////ziIiIRERERERERERIiIiD////8i////84iIiEREREREREREREiIiIg///8i///ziIiIhERERERERERERESIiIiIgz8i8ziIiIiIREREREREREREREREiIiIiIiIiIiIiIhERERERERERERERERESIiIiIiIiIiIiIREREREREREREREREREREiIiIiIiIiIhERERERERERERERERERERERESIiIiIRERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERA==")}, "game": {name: /*LANG*/"Games", sortorder: 1, icon: () => atob("MDCEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzMzMzMzMzMzMzMzMzMzMzMwAAAAAAAAAzMzMzMzMzMzMzMzMzMzMzMwAAAAAAAAAzIiIiIiIiIiIiIiIiIiIiMwAAAAAAAAAzL///IiIi////IiIi///yMwAAAAAAAAAzL///IiIi////IiIi///yMwAAAAAAAAAzL///IiIi////IiIi///yMwAAAAAAAAAzL///IiIi////IiIi///yMwAAAAAAAAAzL///IiIi////IiIi///yMwAAAAAAAAAzIiIi////IiIi////IiIiMwAAAAAAAAAzIiIi////IiIi////IiIiMwAAAAAAAAAzIiIi////IiIi////IiIiMwAAAAAAAAAzIiIi////IiIi////IiIiMwAAAAAAAAAzIiIi////IiIi////IiIiMwAAAAAAAAAzIiIi////IiIi////IiIiMwAAAAAAAAAzL///IiIi////IiIi///yMwAAAAAAAAAzL///IiIi////IiIi///yMwAAAAAAAAAzL///IiIi////IiIi8R/xERABEAAAAAAzL///IiIi////IiIi8R/xERABEAAAAAAzL///IiIi////IiIi8R/xERABEAAAAAAzL///IiIi////IiIi8RMxERABEAAAAAAzIiIi////IiIi////IREREREREAAAAAAzIiIi////IiIi////IREREREREAAAAAAzIiIi////IiIi////IREREREREAAAAAAzIiIi////IiIi////IhERERERAAAAAAAzIiIi////IiIi////IiMzMzMwAAAAAAAzIiIi////IiIi////IiMzMzMwAAAAAAAzL///IiIi////IiIi///xERAAAAAAAAAzL///IiIi////IiIi//8xERAAAAAAAAAzL///IiIi////IiIi//8hEREAAAAAAAAzL///IiIi////IiIi//8REREAAAAAAAAzL///IiIi////IiIi//MREREAAAAAAAAzIiIiIiIiIiIiIiIiIzMzMzMzMAAAAAAzMzMzMzMzMzMzMzMzMzMzMzMzMAAAAAAzMzMzMzMzMzMzMzMzMhEREREREAAAAAAAAAAAAAAAAAAAAAAAEREREREREQAAAAAAAAAAAAAAAAAAAAAAEREREREREQAAAAAAAAAAAAAAAAAAAAAAEREREREREQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==")}, @@ -18,7 +17,8 @@ let font = g.getFonts().includes("12x20") ? "12x20" : "6x8:2"; let settings = Object.assign({ showClocks: true, fullscreen: false, - buzz:false + buzz:false, + shortcuts:["","",""] }, s.readJSON("taglaunch.json", true) || {}); if ("vectorsize" in settings) vectorval = parseInt(settings.vectorsize); @@ -84,6 +84,15 @@ const unload = () => { Bangle.removeListener("lock", lockHandler); }; +let shortcuts=settings.shortcuts; +let noShortcuts=shortcuts[0]==""&&shortcuts[1]==""&&shortcuts[2]==""; + +let loadShortcut=function(idx){ + if(shortcuts[idx]!=""){ + const p = settings.buzz ? Bangle.buzz(25) : Promise.resolve(); + p.then(() => load(shortcuts[idx]+".app.js")); + } +}; // 10s of inactivity goes back to clock Bangle.setLocked(false); // unlock initially let lockTimeout; @@ -137,21 +146,46 @@ let showTagMenu = (tag) => { let showMainMenu = () => { E.showScroller({ - h : 64*scaleval, c : tagKeys.length, + h : 64*scaleval, c : noShortcuts ? tagKeys.length : tagKeys.length+1, draw : (i, r) => { - let tag = tagKeys[i]; g.clearRect((r.x),(r.y),(r.x+r.w-1), (r.y+r.h-1)); - g.setFont(font).setFontAlign(-1,0).drawString(tags[tag].name,64*scaleval,r.y+(32*scaleval)); + + if(!noShortcuts)i-=1; + if(i==-1){ + for(let j=0;j<3;j++){ + const img = s.read(shortcuts[j]+".img"); + if (img) { + try { + g.drawImage(img,8*scaleval+((g.getWidth()/3)*j), r.y+(8*scaleval), {scale: scaleval});} + catch(e){} + } + } + + + }else{ + let tag = tagKeys[i]; g.setFont(font).setFontAlign(-1,0).drawString(tags[tag].name,64*scaleval,r.y+(32*scaleval)); - const img = tags[tag].icon ? tags[tag].icon() : s.read("taglaunch." + tag + ".img"); - if (img) { - try {g.drawImage(img,8*scaleval, r.y+(8*scaleval), {scale: scaleval});} catch(e){} + const img = tags[tag].icon ? tags[tag].icon() : s.read("taglaunch." + tag + ".img"); + if (img) { + try {g.drawImage(img,8*scaleval, r.y+(8*scaleval), {scale: scaleval});} catch(e){} + } } }, - select : i => { - if(settings.buzz)Bangle.buzz(25); - let tag = tagKeys[i]; - showTagMenu(tag); + select : (i,e) => { + if(!noShortcuts)i-=1; + if(i==-1){ + if(e.x { + menu[a.name] = function(){ + E.showPrompt("Set "+a.name+" as the "+spotText+"?",{ + title:"Confirm", + buttons: {"Cancel":false,"Ok":true} + }).then(function(v){ + if(v)setShortcut(a.id,spot,bk); + else showAppList(spot,bk) + }) + } + }); + menu["< Back"] = bk; + + // Show it + E.showMenu(menu); + } + } + + function showSpotMenu(){ + E.showMenu({ + "":{ "title" : "Select Spot"}, // Title for the menu + "< Back":function(){ + eval(require("Storage").read("taglaunch.settings.js"))(()=>load()); + }, + "Left": function() { showAppList(0,showSpotMenu); }, + "Center": function() { showAppList(1,showSpotMenu); }, + "Right": function() { showAppList(2,showSpotMenu);} + }) + } const appMenu = { "": { "title": /*LANG*/"Tag Launcher" }, "< Back": back, + /*LANG*/"Shortcuts": function(){ + showSpotMenu() + }, /*LANG*/"Font": { value: fonts.includes(settings.font)? fonts.indexOf(settings.font) : fonts.indexOf("12x20"), min:0, max:fonts.length-1, step:1,wrap:true,