Add single-escape navigation: back from signup/lobby, leave room

- Single Esc: goes back one step (signup→login, lobby→connect, room→lobby)
- Double Esc: still quits the app
- Footer bar shows [Esc] Back and [Esc][Esc] Quit hints on all screens

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
adlee-was-taken 2026-02-24 20:17:10 -05:00
parent 13e98d330a
commit 7001232658
3 changed files with 22 additions and 10 deletions

View File

@ -75,12 +75,16 @@ class GolfApp(App):
handler(msg) handler(msg)
def action_esc_pressed(self) -> None: def action_esc_pressed(self) -> None:
"""Double-escape to hard quit. Single escape does nothing.""" """Single escape goes back, double-escape quits."""
now = time.monotonic() now = time.monotonic()
if now - self._last_escape < 0.5: if now - self._last_escape < 0.5:
self.exit() self.exit()
else: else:
self._last_escape = now self._last_escape = now
# Let the active screen handle single escape
handler = getattr(self.screen, "handle_escape", None)
if handler:
handler()
def _update_keymap(self) -> None: def _update_keymap(self) -> None:
"""Update the keymap bar based on current screen.""" """Update the keymap bar based on current screen."""
@ -89,11 +93,11 @@ class GolfApp(App):
if keymap: if keymap:
text = keymap text = keymap
elif screen_name == "ConnectScreen": elif screen_name == "ConnectScreen":
text = "[Tab] Navigate [Enter] Submit [Esc Esc] Quit" text = "[Tab] Navigate [Enter] Submit [Esc][Esc] Quit"
elif screen_name == "LobbyScreen": elif screen_name == "LobbyScreen":
text = "[Tab] Navigate [Enter] Submit [Esc Esc] Quit" text = "[Esc] Back [Tab] Navigate [Enter] Submit [Esc][Esc] Quit"
else: else:
text = "[Esc Esc] Quit" text = "[Esc][Esc] Quit"
try: try:
self.query_one("#keymap-bar", KeymapBar).update(text) self.query_one("#keymap-bar", KeymapBar).update(text)
except Exception: except Exception:
@ -104,8 +108,8 @@ class GolfApp(App):
Always appends [Esc Esc] Quit on the right for discoverability. Always appends [Esc Esc] Quit on the right for discoverability.
""" """
if "[Esc Esc]" not in text: if "[Esc]" not in text.replace("[Esc][Esc]", ""):
text = f"{text} [Esc Esc] Quit" text = f"{text} [Esc][Esc] Quit"
try: try:
self.query_one("#keymap-bar", KeymapBar).update(text) self.query_one("#keymap-bar", KeymapBar).update(text)
except Exception: except Exception:

View File

@ -85,7 +85,7 @@ class ConnectScreen(Screen):
self._set_status("") self._set_status("")
self._update_form_visibility() self._update_form_visibility()
def key_escape(self) -> None: def handle_escape(self) -> None:
"""Escape goes back to login if on signup form.""" """Escape goes back to login if on signup form."""
if self._mode == "signup": if self._mode == "signup":
self._mode = "login" self._mode = "login"

View File

@ -231,14 +231,22 @@ class LobbyScreen(Screen):
def _update_keymap(self) -> None: def _update_keymap(self) -> None:
try: try:
if self._in_room and self._is_host: if self._in_room and self._is_host:
self.app.set_keymap("[+] Add CPU [] Remove CPU [Enter] Start Game [Esc Esc] Quit") self.app.set_keymap("[Esc] Leave [+] Add CPU [] Remove [Enter] Start [Esc][Esc] Quit")
elif self._in_room: elif self._in_room:
self.app.set_keymap("Waiting for host to start... [Esc Esc] Quit") self.app.set_keymap("[Esc] Leave Waiting for host... [Esc][Esc] Quit")
else: else:
self.app.set_keymap("[Tab] Navigate [Enter] Create/Join [Esc Esc] Quit") self.app.set_keymap("[Esc] Back [Tab] Navigate [Enter] Create/Join [Esc][Esc] Quit")
except Exception: except Exception:
pass pass
def handle_escape(self) -> None:
"""Single escape: leave room → pre-room, or pre-room → back to connect."""
if self._in_room:
self.run_worker(self._send("leave_game"))
self.reset_to_pre_room()
else:
self.app.pop_screen()
def on_button_pressed(self, event: Button.Pressed) -> None: def on_button_pressed(self, event: Button.Pressed) -> None:
if event.button.id == "btn-create": if event.button.id == "btn-create":
self._create_room() self._create_room()