diff --git a/python_payload/apps/demo_worms4.py b/python_payload/apps/demo_worms4.py index ff383230ce821cf05c0ccbac3f3899b0eb6c2ef9..5aa6157684998aefe56ce84d9b5830ab2051e9a3 100644 --- a/python_payload/apps/demo_worms4.py +++ b/python_payload/apps/demo_worms4.py @@ -4,18 +4,19 @@ import time import math # flow3r imports -from st3m import application from st3m import Ctx, InputState +from st3m.application import Application from st3m.property import BLUE, WHITE from st3m.goose import Optional from st3m.utils import xy_from_polar +from st3m.ui.view import ViewManager tau = 2 * math.pi # Subclass Application -class AppWorms(application.Application): +class AppWorms(Application): def __init__(self, name: str) -> None: super().__init__(name) @@ -40,9 +41,9 @@ class AppWorms(application.Application): self.just_shown = True - def on_enter(self) -> None: + def on_enter(self, vm: Optional[ViewManager]) -> None: # print("on foreground") - super().on_enter() + super().on_enter(vm) self.just_shown = True def draw(self, ctx: Ctx) -> None: diff --git a/python_payload/apps/melodic_demo.py b/python_payload/apps/melodic_demo.py index 0462b9f688acde8554949f8273230daa42c61b16..2619e8c3a80c49ab6e1097fa7c9c79e651455ba0 100644 --- a/python_payload/apps/melodic_demo.py +++ b/python_payload/apps/melodic_demo.py @@ -3,8 +3,9 @@ from hardware import * import captouch import leds -from st3m.goose import List +from st3m.goose import List, Optional from st3m.input import InputState +from st3m.ui.view import ViewManager from st3m.ui.ctx import Ctx octave = 0 @@ -94,7 +95,7 @@ class MelodicApp(Application): scope_draw(ctx) ctx.fill() - def on_enter(self) -> None: + def on_enter(self, vm: Optional[ViewManager]) -> None: foreground() def think(self, ins: InputState, delta_ms: int) -> None: diff --git a/python_payload/main.py b/python_payload/main.py index 50b807db653d6238d2a31bb4e237845f5a94b6b8..56366dac0df718c23fccfd9743a8ca876c7d7780 100644 --- a/python_payload/main.py +++ b/python_payload/main.py @@ -54,18 +54,9 @@ from apps.nick import app as nick from apps.cap_touch_demo import app as captouch_demo from apps.scroll_demo import app as scroll_demo - -# Set the view_managers for the apps, otherwise leaving the app (back) will not work -worms._view_manager = vm -harmonic._view_manager = vm -melodic._view_manager = vm -nick._view_manager = vm -captouch_demo._view_manager = vm -scroll_demo._view_manager = vm - # Build menu structure -menu_settings = settings.build_menu(vm) +menu_settings = settings.build_menu() menu_music = SimpleMenu( [ @@ -76,7 +67,6 @@ menu_music = SimpleMenu( # MenuItemNoop("CrazySynth"), MenuItemNoop("NOOP Sequencer"), ], - vm, ) menu_apps = SimpleMenu( @@ -86,7 +76,6 @@ menu_apps = SimpleMenu( MenuItemForeground("worms", worms), MenuItemForeground("cap scroll", scroll_demo), ], - vm, ) @@ -95,7 +84,6 @@ menu_badge = SimpleMenu( MenuItemBack(), MenuItemForeground("nick", nick), ], - vm, ) menu_system = SimpleMenu( @@ -106,7 +94,6 @@ menu_system = SimpleMenu( MenuItemNoop("About"), MenuItemNoop("Reboot"), ], - vm, ) menu_main = SunMenu( @@ -116,7 +103,6 @@ menu_main = SunMenu( MenuItemForeground("Apps", menu_apps), MenuItemForeground("System", menu_system), ], - vm, ) diff --git a/python_payload/st3m/application.py b/python_payload/st3m/application.py index 0ea4e0372beebcce3f4d7caec117d09e8267290a..7f71101ae42f5c7209b2cc8ea4ed218e43a3f6c8 100644 --- a/python_payload/st3m/application.py +++ b/python_payload/st3m/application.py @@ -12,6 +12,10 @@ class Application(ViewWithInputState): def on_exit(self) -> None: pass + def on_enter(self, vm: Optional[ViewManager]) -> None: + self._view_manager = vm + super().on_enter(vm) + def think(self, ins: InputState, delta_ms: int) -> None: super().think(ins, delta_ms) diff --git a/python_payload/st3m/settings.py b/python_payload/st3m/settings.py index 9836c125b5db6bdfbb6eb6cade42e04c7d0a61bd..0e61d92ce9f44d67f540b3be6936bfa6e85a874c 100644 --- a/python_payload/st3m/settings.py +++ b/python_payload/st3m/settings.py @@ -334,7 +334,7 @@ def save_all() -> None: log.info("Saved settings to flash") -def build_menu(vm: ViewManager) -> SimpleMenu: +def build_menu() -> SimpleMenu: """ Return a SimpleMenu for all settings. """ @@ -342,4 +342,4 @@ def build_menu(vm: ViewManager) -> SimpleMenu: positions: List[MenuItem] = [ mib, ] + [SettingsMenuItem(t) for t in all_settings] - return SettingsMenu(positions, vm) + return SettingsMenu(positions) diff --git a/python_payload/st3m/ui/elements/menus.py b/python_payload/st3m/ui/elements/menus.py index 48170deebf190192d6d2de677447d9b43fa59333..c7617af741037688faf2ed3bbc4d4bf454d7ab2b 100644 --- a/python_payload/st3m/ui/elements/menus.py +++ b/python_payload/st3m/ui/elements/menus.py @@ -50,10 +50,10 @@ class SunMenu(MenuController): "_sun", ) - def __init__(self, items: List[MenuItem], vm: ViewManager) -> None: + def __init__(self, items: List[MenuItem]) -> None: self._ts = 0 self._sun = Sun() - super().__init__(items, vm) + super().__init__(items) def think(self, ins: InputState, delta_ms: int) -> None: super().think(ins, delta_ms) @@ -104,15 +104,13 @@ class FlowerMenu(MenuController): "_sun", ) - def __init__( - self, items: List[MenuItem], vm: ViewManager, name: str = "flow3r" - ) -> None: + def __init__(self, items: List[MenuItem], name: str = "flow3r") -> None: self._ts = 0 self.name = name self.ui = GroupRing(r=80) for item in items: self.ui.items_ring.append(FlowerIcon(label=item.label())) - super().__init__(items, vm) + super().__init__(items) self.icon = FlowerIcon(label=self.name) self.icon.rotation_time = -5000 diff --git a/python_payload/st3m/ui/menu.py b/python_payload/st3m/ui/menu.py index 5cc8c9c63ed5980214f36a494b342aca399d2a68..a3437f12d7315e12d8a74ed24a7d1afd9961d7e1 100644 --- a/python_payload/st3m/ui/menu.py +++ b/python_payload/st3m/ui/menu.py @@ -1,6 +1,7 @@ import st3m from st3m import Responder +from st3m import logging from st3m.goose import ABCBase, abstractmethod, List, Optional from st3m.input import InputState, InputController from st3m.ui.view import ( @@ -14,6 +15,9 @@ from st3m.ui.interactions import ScrollController from st3m.ui.ctx import Ctx +log = logging.Log(__name__) + + class MenuItem(Responder): """ An abstract MenuItem to be implemented by concrete impementations. @@ -62,6 +66,8 @@ class MenuItemForeground(MenuItem): def press(self, vm: Optional[ViewManager]) -> None: if vm is not None: vm.push(self._r, ViewTransitionSwipeLeft()) + else: + log.warning(f"Could not foreground {self._r} as no ViewManager is present") def label(self) -> str: return self._label @@ -90,6 +96,8 @@ class MenuItemBack(MenuItem): def press(self, vm: Optional[ViewManager]) -> None: if vm is not None: vm.pop(ViewTransitionSwipeRight()) + else: + log.warning(f"Could not go back as no ViewManager is present") def label(self) -> str: return "Back" @@ -115,14 +123,18 @@ class MenuController(ViewWithInputState): "_view_manager", ) - def __init__(self, items: List[MenuItem], vm: Optional[ViewManager]) -> None: + def __init__(self, items: List[MenuItem]) -> None: self._items = items self._scroll_controller = ScrollController() self._scroll_controller.set_item_count(len(items)) - self._view_manager = vm + self._view_manager: Optional[ViewManager] = None super().__init__() + def on_enter(self, vm: Optional["ViewManager"]) -> None: + self._view_manager = vm + super().on_enter(vm) + def _parse_state(self) -> None: left = self.input.left_shoulder.left right = self.input.left_shoulder.right diff --git a/python_payload/st3m/ui/view.py b/python_payload/st3m/ui/view.py index 752f9d63bc242590ca85db5ee313fc0df5fece75..7939670c5a63b39acee162daca496aab1a068e5d 100644 --- a/python_payload/st3m/ui/view.py +++ b/python_payload/st3m/ui/view.py @@ -13,7 +13,7 @@ class View(Responder): ViewWithInputState class. """ - def on_enter(self) -> None: + def on_enter(self, vm: Optional["ViewManager"]) -> None: """ Called when the View has just become active. This is guaranteed to be called before think(). @@ -36,7 +36,7 @@ class ViewWithInputState(View): def __init__(self) -> None: self.input = InputController() - def on_enter(self) -> None: + def on_enter(self, vm: Optional["ViewManager"]) -> None: self.input._ignore_pressed() def think(self, ins: InputState, delta_ms: int) -> None: @@ -181,7 +181,7 @@ class ViewManager(Responder): """ self._outgoing = self._incoming self._incoming = r - self._incoming.on_enter() + self._incoming.on_enter(self) self._overriden_vt = overide_vt if self._outgoing is None: return