From 876e5e18d63a516e0b30620d45dc6081064b5d7d Mon Sep 17 00:00:00 2001 From: Cooper Dalrymple Date: Tue, 5 Aug 2025 10:53:40 -0500 Subject: [PATCH 1/2] Use `launcher.conf.json` for user color palette configuration --- src/code.py | 45 +++++++++++++++++++-------------------------- src/settings.toml | 4 ---- 2 files changed, 19 insertions(+), 30 deletions(-) diff --git a/src/code.py b/src/code.py index 7e1f1ae..7fbc174 100644 --- a/src/code.py +++ b/src/code.py @@ -9,7 +9,6 @@ import atexit import json import math import displayio -import os import supervisor import sys import terminalio @@ -53,14 +52,6 @@ if args is not None and len(args) > 0: print(f"launching: {next_code_file}") supervisor.reload() -# read environment variables -color_palette = { - "bg": os.getenv("FRUIT_JAM_OS_BG", 0x222222), - "fg": os.getenv("FRUIT_JAM_OS_FG", 0xffffff), - "accent": os.getenv("FRUIT_JAM_OS_ACCENT", 0x008800), - "arrow": os.getenv("FRUIT_JAM_OS_ARROW", -1), -} - request_display_config(720, 400) display = supervisor.runtime.display @@ -68,6 +59,13 @@ scale = 1 if display.width > 360: scale = 2 +launcher_config = {} +if pathlib.Path("launcher.conf.json").exists(): + with open("launcher.conf.json", "r") as f: + launcher_config = json.load(f) +if "palette" not in launcher_config: + launcher_config["palette"] = {} + font_file = "/fonts/terminal.lvfontbin" font = bitmap_font.load_font(font_file) scaled_group = displayio.Group(scale=scale) @@ -79,7 +77,7 @@ display.root_group = main_group background_bmp = displayio.Bitmap(display.width, display.height, 1) bg_palette = displayio.Palette(1) -bg_palette[0] = color_palette["bg"] +bg_palette[0] = int(launcher_config["palette"].get("bg", "0x222222"), 16) bg_tg = displayio.TileGrid(bitmap=background_bmp, pixel_shader=bg_palette) scaled_group.append(bg_tg) @@ -97,11 +95,6 @@ mouse_tg.x = display.width // (2 * scale) mouse_tg.y = display.height // (2 * scale) # 046d:c52f -launcher_config = {} -if pathlib.Path("launcher.conf.json").exists(): - with open("launcher.conf.json", "r") as f: - launcher_config = json.load(f) - # mouse = usb.core.find(idVendor=0x046d, idProduct=0xc52f) DIR_IN = 0x80 @@ -193,7 +186,7 @@ menu_grid = GridLayout(x=40, y=16, width=WIDTH, height=HEIGHT, grid_size=(config divider_lines=False) scaled_group.append(menu_grid) -menu_title_txt = Label(font, text="Fruit Jam OS", color=color_palette["fg"]) +menu_title_txt = Label(font, text="Fruit Jam OS", color=int(launcher_config["palette"].get("fg", "0xffffff"), 16)) menu_title_txt.anchor_point = (0.5, 0.5) menu_title_txt.anchored_position = (display.width // (2 * scale), 2) scaled_group.append(menu_title_txt) @@ -277,7 +270,7 @@ def _create_cell_group(app): icon_tg.x = cell_width // 2 - icon_tg.tile_width // 2 title_txt = TextBox(font, text=app["title"], width=WIDTH // config["width"], height=18, - align=TextBox.ALIGN_CENTER, color=color_palette["fg"]) + align=TextBox.ALIGN_CENTER, color=int(launcher_config["palette"].get("fg", "0xffffff"), 16)) cell_group.append(title_txt) title_txt.anchor_point = (0, 0) title_txt.anchored_position = (0, icon_tg.y + icon_tg.tile_height) @@ -298,7 +291,7 @@ def _reuse_cell_group(app, cell_group): icon_tg.x = cell_width // 2 - icon_tg.tile_width // 2 # title_txt = TextBox(font, text=app["title"], width=WIDTH // config["width"], height=18, - # align=TextBox.ALIGN_CENTER, color=color_palette["fg"]) + # align=TextBox.ALIGN_CENTER, color=int(launcher_config["palette"].get("fg", "0xffffff"), 16)) # cell_group.append(title_txt) title_txt = cell_group[1] title_txt.text = app["title"] @@ -347,7 +340,7 @@ def display_page(page_index): print(f"{grid_index} | {grid_index % config["width"], grid_index // config["width"]}") -page_txt = Label(terminalio.FONT, text="", scale=2, color=color_palette["fg"]) +page_txt = Label(terminalio.FONT, text="", scale=2, color=int(launcher_config["palette"].get("fg", "0xffffff"), 16)) page_txt.anchor_point = (1.0, 1.0) page_txt.anchored_position = (display.width - 2, display.height - 2) main_group.append(page_txt) @@ -359,8 +352,8 @@ left_bmp, left_palette = adafruit_imageload.load("launcher_assets/arrow_left.bmp left_palette.make_transparent(0) right_bmp, right_palette = adafruit_imageload.load("launcher_assets/arrow_right.bmp") right_palette.make_transparent(0) -if color_palette["arrow"] >= 0: - left_palette[2] = right_palette[2] = color_palette["arrow"] +if "arrow" in launcher_config["palette"]: + left_palette[2] = right_palette[2] = int(launcher_config["palette"].get("arrow"), 16) left_tg = AnchoredTileGrid(bitmap=left_bmp, pixel_shader=left_palette) left_tg.anchor_point = (0, 0.5) @@ -383,8 +376,8 @@ if mouse: help_txt = Label(terminalio.FONT, text="[Arrow]: Move\n[E]: Edit\n[Enter]: Run\n[1-9]: Page", - color=color_palette["fg"]) -# help_txt = TextBox(terminalio.FONT, width=88, height=30, align=TextBox.ALIGN_RIGHT, background_color=color_palette["accent"], text="[E]: Edit\n[Enter]: Run") + color=int(launcher_config["palette"].get("fg", "0xffffff"), 16)) +# help_txt = TextBox(terminalio.FONT, width=88, height=30, align=TextBox.ALIGN_RIGHT, background_color=int(launcher_config["palette"].get("accent", "0x008800"), 16), text="[E]: Edit\n[Enter]: Run") help_txt.anchor_point = (0, 0) help_txt.anchored_position = (2, 2) @@ -421,10 +414,10 @@ def change_selected(new_selected): # tuple means an item in the grid is selected if isinstance(new_selected, tuple): - menu_grid.get_content(new_selected)[1].background_color = color_palette["accent"] + menu_grid.get_content(new_selected)[1].background_color = int(launcher_config["palette"].get("accent", "0x008800"), 16) # TileGrid means arrow is selected elif isinstance(new_selected, AnchoredTileGrid): - new_selected.pixel_shader[2] = color_palette["accent"] + new_selected.pixel_shader[2] = int(launcher_config["palette"].get("accent", "0x008800"), 16) selected = new_selected @@ -540,7 +533,7 @@ while True: handle_key_press(c) print("selected", selected) - # app_titles[selected].background_color = color_palette["accent"] + # app_titles[selected].background_color = int(launcher_config["palette"].get("accent", "0x008800"), 16) if mouse: try: diff --git a/src/settings.toml b/src/settings.toml index 766c38f..a5eb1f8 100755 --- a/src/settings.toml +++ b/src/settings.toml @@ -1,5 +1 @@ CIRCUITPY_PYSTACK_SIZE=4000 -# FRUIT_JAM_OS_BG=0x222222 -# FRUIT_JAM_OS_FG=0xffffff -# FRUIT_JAM_OS_ACCENT=0x008800 -# FRUIT_JAM_OS_ARROW=0x004abe From e53cd2e089b0fd350d9e19bf809db5f291300fe8 Mon Sep 17 00:00:00 2001 From: Cooper Dalrymple Date: Tue, 5 Aug 2025 13:44:58 -0500 Subject: [PATCH 2/2] Add `os` library back in --- src/code.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/code.py b/src/code.py index aada4e8..8059b07 100644 --- a/src/code.py +++ b/src/code.py @@ -9,6 +9,7 @@ import atexit import json import math import displayio +import os import supervisor import sys import terminalio