EMF_Camp_Badge/speedlauncher/main.py

119 lines
3.2 KiB
Python

"""Launcher for apps currently installed"""
___name___ = "Speed Launcher"
___license___ = "WTFPL"
___categories___ = ["System", "Launcher"]
___dependencies___ = ["app", "ugfx_helper"]
___launchable___ = False
___bootstrapped___ = False
import ugfx_helper, ugfx, math, buttons
from app import *
from tilda import Buttons
APPS_PER_PAGE = 12
EMF_PURPLE = 0x800080
ugfx_helper.init()
ugfx.clear(ugfx.html_color(EMF_PURPLE))
ugfx.set_default_font(ugfx.FONT_SMALL)
style = ugfx.Style()
style.set_enabled([ugfx.WHITE, ugfx.html_color(EMF_PURPLE), ugfx.html_color(EMF_PURPLE), ugfx.html_color(EMF_PURPLE)])
style.set_background(ugfx.html_color(EMF_PURPLE))
ugfx.set_default_style(style)
loadMsg = ugfx.Label(0, 90, ugfx.width(), 20, "Loading apps...", justification=ugfx.Label.CENTER)
# Load apps in a colourList
all_apps = [{"title": a.title, "app": a} for a in get_apps()]
# Sort apps by alphabetical order
all_apps.sort(key=lambda a: a['title'])
total_pages = math.ceil(len(all_apps) / APPS_PER_PAGE)
ugfx.clear(ugfx.html_color(EMF_PURPLE))
keypad = [
Buttons.BTN_1,
Buttons.BTN_2,
Buttons.BTN_3,
Buttons.BTN_4,
Buttons.BTN_5,
Buttons.BTN_6,
Buttons.BTN_7,
Buttons.BTN_8,
Buttons.BTN_9,
Buttons.BTN_Star,
Buttons.BTN_0,
Buttons.BTN_Hash
]
keypadLabels = [
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"*",
"0",
"#"
]
def showPage():
global current_page
# avoid out of bounds errors
current_page = max(1, min(current_page, total_pages))
start = (current_page - 1) * APPS_PER_PAGE
end = start + APPS_PER_PAGE
apps_on_current_page = all_apps[start:end]
# Refresh page
ugfx.clear(ugfx.html_color(EMF_PURPLE))
# Write current page number and arrows
ugfx.Label(0, 20, ugfx.width(), 20, "Page {} of {}".format(current_page, total_pages), justification=ugfx.Label.CENTER)
if current_page > 1:
ugfx.fill_polygon(10, 16, [[0, 10], [15, 20], [15, 0]], ugfx.WHITE)
if current_page < total_pages:
ugfx.fill_polygon(ugfx.width() - 30, 16, [[0, 0], [15, 10], [0, 20]], ugfx.WHITE)
# Write app numbers and names
i = 0
yOffset = 45
xOffset = 0
for a in apps_on_current_page:
# xOffset = (i % 3) * 8 # offset lines to match the physical layout of the keypad
ugfx.area(20 + xOffset, yOffset + 2, 20, 20, ugfx.WHITE)
ugfx.text(23 + xOffset, yOffset + 3, keypadLabels[i] + " ", EMF_PURPLE)
ugfx.Label(46 + xOffset, yOffset + 3, ugfx.width(), 20, a['title'], justification=ugfx.Label.LEFT)
yOffset = yOffset + 22
i = i + 1
while True:
for key in keypad:
keyIndex = keypad.index(key)
if buttons.is_pressed(key) and (keyIndex < len(apps_on_current_page)):
apps_on_current_page[keyIndex]['app'].boot()
break
if buttons.is_triggered(Buttons.JOY_Right) and (current_page is not total_pages):
current_page = current_page + 1
return
if buttons.is_triggered(Buttons.JOY_Left) and (current_page is not 1):
current_page = current_page - 1
return
current_page = 1
while True:
showPage()