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)
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()
if now - self._last_escape < 0.5:
self.exit()
else:
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:
"""Update the keymap bar based on current screen."""
@ -89,11 +93,11 @@ class GolfApp(App):
if keymap:
text = keymap
elif screen_name == "ConnectScreen":
text = "[Tab] Navigate [Enter] Submit [Esc Esc] Quit"
text = "[Tab] Navigate [Enter] Submit [Esc][Esc] Quit"
elif screen_name == "LobbyScreen":
text = "[Tab] Navigate [Enter] Submit [Esc Esc] Quit"
text = "[Esc] Back [Tab] Navigate [Enter] Submit [Esc][Esc] Quit"
else:
text = "[Esc Esc] Quit"
text = "[Esc][Esc] Quit"
try:
self.query_one("#keymap-bar", KeymapBar).update(text)
except Exception:
@ -104,8 +108,8 @@ class GolfApp(App):
Always appends [Esc Esc] Quit on the right for discoverability.
"""
if "[Esc Esc]" not in text:
text = f"{text} [Esc Esc] Quit"
if "[Esc]" not in text.replace("[Esc][Esc]", ""):
text = f"{text} [Esc][Esc] Quit"
try:
self.query_one("#keymap-bar", KeymapBar).update(text)
except Exception:

View File

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

View File

@ -231,14 +231,22 @@ class LobbyScreen(Screen):
def _update_keymap(self) -> None:
try:
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:
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:
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:
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:
if event.button.id == "btn-create":
self._create_room()