diff --git a/python_payload/st3m/ui/elements/sun_menu.py b/python_payload/st3m/main_menu.py similarity index 75% rename from python_payload/st3m/ui/elements/sun_menu.py rename to python_payload/st3m/main_menu.py index 3110f05c4f6cbd1e4d3cc736ce1ad5ee5b34f897..b9627545617c9522a519197f9c3a680ab7d7212b 100644 --- a/python_payload/st3m/ui/elements/sun_menu.py +++ b/python_payload/st3m/main_menu.py @@ -7,14 +7,11 @@ from ctx import Context from st3m.goose import Optional, List, Set from st3m.ui.view import ViewManager, ViewTransitionDirection -from st3m.ui.elements.visuals import Sun from st3m import InputState from st3m import settings_menu as settings -from st3m.utils import lerp import st3m.wifi from st3m.ui import led_patterns from st3m.ui.menu import ( - MenuController, MenuItem, MenuItemBack, MenuItemForeground, @@ -27,7 +24,7 @@ from st3m.application import ( MenuItemAppLaunch, ) from st3m.about import About -from st3m.ui.elements.menus import SimpleMenu +from st3m.ui.elements.menus import SimpleMenu, SunMenu class ApplicationMenu(SimpleMenu): @@ -84,19 +81,8 @@ def _yeet_local_changes() -> None: machine.reset() -class SunMenu(MenuController): - """ - A circular menu with a rotating sun. - """ - - __slots__ = ( - "_ts", - "_sun", - ) - +class MainMenu(SunMenu): def __init__(self, bundles: Optional[list] = None) -> None: - self._ts = 0 - self._sun = Sun() if bundles: self._bundles = bundles else: @@ -148,41 +134,3 @@ class SunMenu(MenuController): self._items = categories # # self._scroll_controller = ScrollController() # self._scroll_controller.set_item_count(len(categories)) - - def think(self, ins: InputState, delta_ms: int) -> None: - super().think(ins, delta_ms) - self._sun.think(ins, delta_ms) - self._ts += delta_ms - - def _draw_item_angled( - self, ctx: Context, item: MenuItem, angle: float, activity: float - ) -> None: - size = lerp(20, 40, activity) - color = lerp(0, 1, activity) - if color < 0.01: - return - - ctx.save() - ctx.translate(-120, 0).rotate(angle).translate(140, 0) - ctx.font_size = size - ctx.rgba(1.0, 1.0, 1.0, color).move_to(0, 0) - item.draw(ctx) - ctx.restore() - - def draw(self, ctx: Context) -> None: - ctx.gray(0) - ctx.rectangle(-120, -120, 240, 240).fill() - - self._sun.draw(ctx) - - ctx.font_size = 40 - ctx.text_align = ctx.CENTER - ctx.text_baseline = ctx.MIDDLE - - angle_per_item = 0.4 - - current = self._scroll_controller.current_position() - - for ix, item in enumerate(self._items): - rot = (ix - current) * angle_per_item - self._draw_item_angled(ctx, item, rot, 1 - abs(rot)) diff --git a/python_payload/st3m/run.py b/python_payload/st3m/run.py index 15f8fbd7217aa42175197055f253218559636e40..55e465f07403d71956ffbd89912e43469535fe4f 100644 --- a/python_payload/st3m/run.py +++ b/python_payload/st3m/run.py @@ -2,7 +2,7 @@ from st3m.reactor import Reactor, Responder from st3m.goose import Optional from st3m.ui.elements import overlays from st3m.ui.view import View, ViewManager, ViewTransitionBlend -from st3m.ui.elements.sun_menu import SunMenu +from st3m.main_menu import MainMenu from st3m.application import ( BundleManager, ApplicationContext, @@ -197,7 +197,7 @@ def run_main() -> None: raise Exception(f"Requested bundle {override_main_app} not found") run_view(requested[0].load(), debug_vm=True) else: - menu_main = SunMenu(bundles) + menu_main = MainMenu(bundles) run_view(menu_main, debug_vm=False) diff --git a/python_payload/st3m/ui/elements/menus.py b/python_payload/st3m/ui/elements/menus.py index 898494ba821cad7a38a593dd91023adce95777bf..4b2a5d19e7d45ff170c8c9902a4266481e89c2d8 100644 --- a/python_payload/st3m/ui/elements/menus.py +++ b/python_payload/st3m/ui/elements/menus.py @@ -1,5 +1,5 @@ from st3m.goose import List -from st3m.ui.elements.visuals import GroupRing, FlowerIcon +from st3m.ui.elements.visuals import Sun, GroupRing, FlowerIcon from st3m.ui.menu import MenuController, MenuItem from st3m import InputState @@ -43,6 +43,60 @@ class SimpleMenu(MenuController): ctx.restore() +class SunMenu(MenuController): + """ + A circular menu with a rotating sun. + """ + + __slots__ = ( + "_ts", + "_sun", + ) + + def __init__(self, items: List[MenuItem]) -> None: + self._ts = 0 + self._sun = Sun() + super().__init__(items) + + def think(self, ins: InputState, delta_ms: int) -> None: + super().think(ins, delta_ms) + self._sun.think(ins, delta_ms) + self._ts += delta_ms + + def _draw_item_angled( + self, ctx: Context, item: MenuItem, angle: float, activity: float + ) -> None: + size = lerp(20, 40, activity) + color = lerp(0, 1, activity) + if color < 0.01: + return + + ctx.save() + ctx.translate(-120, 0).rotate(angle).translate(140, 0) + ctx.font_size = size + ctx.rgba(1.0, 1.0, 1.0, color).move_to(0, 0) + item.draw(ctx) + ctx.restore() + + def draw(self, ctx: Context) -> None: + ctx.gray(0) + ctx.rectangle(-120, -120, 240, 240).fill() + + self._sun.draw(ctx) + + ctx.font_size = 40 + ctx.text_align = ctx.CENTER + ctx.text_baseline = ctx.MIDDLE + + angle_per_item = 0.4 + + current = self._scroll_controller.current_position() + + for ix, item in enumerate(self._items): + rot = (ix - current) * angle_per_item + self._draw_item_angled(ctx, item, rot, 1 - abs(rot)) + + class FlowerMenu(MenuController): """ A circular menu with flowers.