Skip to content

Commit 2b90e77

Browse files
tjazerzenclaude
andcommitted
Add Enter key to exit TUI after render completes
Update footer to show render-finished keybindings and allow exiting with Enter once rendering is done. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent db3102e commit 2b90e77

File tree

3 files changed

+23
-2
lines changed

3 files changed

+23
-2
lines changed

tui/components.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,24 @@ class CustomFooter(Horizontal):
1414
"""A custom footer with keyboard shortcuts and render ID."""
1515

1616
FOOTER_TEXT = "ctrl+c: copy * ctrl+d: quit * ctrl+l: toggle logs"
17+
RENDER_FINISHED_TEXT = "enter: exit * ctrl+c: copy * ctrl+l: toggle logs"
1718

1819
def __init__(self, render_id: str = "", **kwargs):
1920
super().__init__(**kwargs)
2021
self.render_id = render_id
22+
self._footer_text_widget: Optional[Static] = None
2123

2224
def compose(self):
23-
yield Static(self.FOOTER_TEXT, classes="custom-footer-text")
25+
self._footer_text_widget = Static(self.FOOTER_TEXT, classes="custom-footer-text")
26+
yield self._footer_text_widget
2427
if self.render_id:
2528
yield Static(f"render id: {self.render_id}", classes="custom-footer-render-id")
2629

30+
def show_render_finished(self) -> None:
31+
"""Update footer text to show render-finished keybindings."""
32+
if self._footer_text_widget is not None:
33+
self._footer_text_widget.update(self.RENDER_FINISHED_TEXT)
34+
2735

2836
class ScriptOutputType(str, Enum):
2937
UNIT_TEST_OUTPUT_TEXT = "Unit tests output: "

tui/plain2code_tui.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ class Plain2CodeTUI(App):
5757
BINDINGS = [
5858
Binding("ctrl+c", "copy_selection", "Copy", show=False),
5959
Binding("ctrl+d", "quit", "Quit", show=False),
60+
Binding("enter", "enter_exit", "Exit", show=False),
6061
("ctrl+l", "toggle_logs", "Toggle Logs"),
6162
]
6263

@@ -80,6 +81,7 @@ def __init__(
8081
self.conformance_tests_script: Optional[str] = conformance_tests_script
8182
self.prepare_environment_script: Optional[str] = prepare_environment_script
8283
self.state_machine_version = state_machine_version
84+
self._render_finished = False
8385

8486
# Initialize state handlers
8587
self._state_handlers: dict[str, StateHandler] = {
@@ -278,6 +280,12 @@ def _handle_frid_state(
278280
def on_render_completed(self, event: RenderCompleted):
279281
"""Handle successful render completion."""
280282
self._render_success_handler.handle(event.rendered_code_path)
283+
self._render_finished = True
284+
try:
285+
footer = self.screen.query_one(CustomFooter)
286+
footer.show_render_finished()
287+
except NoMatches:
288+
pass
281289

282290
def on_render_failed(self, event: RenderFailed):
283291
"""Handle render failure."""
@@ -313,6 +321,11 @@ async def action_copy_selection(self) -> None:
313321
self.screen.clear_selection()
314322
self.notify("Copied to clipboard", timeout=2)
315323

324+
def action_enter_exit(self) -> None:
325+
"""Handle enter: exit the TUI only after rendering has finished."""
326+
if self._render_finished:
327+
self.action_quit()
328+
316329
def action_quit(self) -> None:
317330
"""Quit the application immediately.
318331

tui/widget_helpers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ def display_success_message(tui, rendered_code_path: str):
105105
rendered_code_path: The path to the rendered code
106106
"""
107107

108-
message = f"[#79FC96]✓ Rendering finished![/#79FC96] [#888888](ctrl+d to exit)[/#888888]\n[#888888]Generated code: {rendered_code_path}[/#888888] "
108+
message = f"[#79FC96]✓ Rendering finished![/#79FC96] [#888888](enter to exit)[/#888888]\n[#888888]Generated code: {rendered_code_path}[/#888888] "
109109

110110
widget: Static = tui.query_one(f"#{TUIComponents.RENDER_STATUS_WIDGET.value}", Static)
111111
widget.update(message)

0 commit comments

Comments
 (0)