Skip to content

Commit 36f3237

Browse files
committed
add rendering canceled post render output
1 parent 51ffbb5 commit 36f3237

5 files changed

Lines changed: 28 additions & 4 deletions

File tree

cli_output/render_summary.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,12 @@ def print_exit_summary(
1515
"""Print render outcome after the TUI exits (terminal restored)."""
1616
console.quiet = False
1717

18-
msg = "\n[#79FC96]✓ rendering completed\n\n" if run_state.render_succeeded else "[#FF6B6B]✗ rendering failed\n\n"
18+
if run_state.render_succeeded:
19+
msg = "\n[#79FC96]✓ rendering completed\n\n"
20+
elif run_state.render_cancelled:
21+
msg = "\n[#FFFFFF]— rendering canceled\n\n"
22+
else:
23+
msg = "\n[#FF6B6B]✗ rendering failed\n\n"
1924
msg += f" [#8E8F91]render id:\t\t\t[#FFFFFF]{run_state.render_id}\n"
2025
msg += f" [#8E8F91]input file:\t\t\t[#FFFFFF]{spec_filename}\n"
2126
msg += f" [#8E8F91]generated code folder:\t[#FFFFFF]{run_state.render_generated_code_path or '-'}\n\n"

plain2code.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ def render(args, run_state: RunState, event_bus: EventBus, default_log_level: st
181181
render_choices,
182182
system_config.client_version,
183183
run_state.render_id,
184+
on_cancel=run_state.set_render_cancelled,
184185
css_path="styles.css",
185186
)
186187
render_choice = app.run()
@@ -189,6 +190,7 @@ def render(args, run_state: RunState, event_bus: EventBus, default_log_level: st
189190
and render_choice.render_range is None
190191
and render_choice.choice_type == "quit"
191192
):
193+
run_state.set_render_cancelled()
192194
sys.exit(0)
193195
elif ask_user and args.headless:
194196
# ignore the default choice if it requires user input due to headless mode
@@ -217,7 +219,7 @@ def run_render():
217219
try:
218220
module_renderer.render_module()
219221
except RenderCancelledError:
220-
pass # TUI already closed, nothing to report
222+
run_state.set_render_cancelled() # TUI already closed, nothing to report
221223
except Exception as e:
222224
run_state.set_render_succeeded(False)
223225
render_error.append(e)
@@ -228,8 +230,7 @@ def run_render():
228230
try:
229231
module_renderer.render_module()
230232
except RenderCancelledError:
231-
run_state.set_render_succeeded(False)
232-
pass
233+
run_state.set_render_cancelled()
233234
return
234235
else:
235236
render_thread = threading.Thread(target=run_render, daemon=True)
@@ -242,6 +243,7 @@ def run_render():
242243
prepare_environment_script=args.prepare_environment_script,
243244
state_machine_version=system_config.client_version,
244245
enter_pause_event=enter_pause_event,
246+
on_cancel=run_state.set_render_cancelled,
245247
default_log_level=default_log_level,
246248
css_path="styles.css",
247249
)

plain2code_state.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class RunState:
1111
def __init__(self, spec_filename: str, replay_with: Optional[str] = None):
1212
self.replay: bool = replay_with is not None
1313
self.render_succeeded: bool = False
14+
self.render_cancelled: bool = False
1415
self.render_generated_code_path: Optional[str] = None
1516
self.rendered_functionalities: int = 0
1617
if replay_with:
@@ -32,6 +33,9 @@ def increment_unittest_batch_id(self):
3233
def set_render_succeeded(self, succeeded: bool):
3334
self.render_succeeded = succeeded
3435

36+
def set_render_cancelled(self):
37+
self.render_cancelled = True
38+
3539
def set_render_generated_code_path(self, generated_code_path: str):
3640
self.render_generated_code_path = generated_code_path
3741

tui/plain2code_tui.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ def __init__(
7070
prepare_environment_script: str,
7171
state_machine_version: str,
7272
enter_pause_event: threading.Event | None = None,
73+
on_cancel: Callable[[], None] | None = None,
7374
default_log_level: str = "INFO",
7475
**kwargs,
7576
):
@@ -83,6 +84,7 @@ def __init__(
8384
self.prepare_environment_script: Optional[str] = prepare_environment_script
8485
self.state_machine_version = state_machine_version
8586
self.enter_pause_event = enter_pause_event
87+
self._on_cancel = on_cancel
8688
self.default_log_level = default_log_level
8789
self._render_finished = False
8890

@@ -311,4 +313,6 @@ def action_quit(self) -> None:
311313
Note: Force exit may leave files partially written if interrupted during file I/O operations.
312314
This is acceptable since the folders in which we are writing are git versioned and are reset in the next render.
313315
"""
316+
if not self._render_finished and self._on_cancel:
317+
self._on_cancel()
314318
self.exit()

tui/plain_module_render_choice_tui.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from typing import Callable, Optional
2+
13
from textual import on
24
from textual.app import App, ComposeResult
35
from textual.binding import Binding
@@ -24,6 +26,7 @@ def __init__(
2426
render_choices: dict[str, RenderChoice],
2527
state_machine_version: str,
2628
render_id: str,
29+
on_cancel: Optional[Callable[[], None]] = None,
2730
**kwargs,
2831
):
2932
super().__init__(**kwargs)
@@ -33,6 +36,7 @@ def __init__(
3336
self.render_id = render_id
3437
self._expandable_labels: list[dict] = []
3538
self.render_choices = render_choices
39+
self._on_cancel = on_cancel
3640

3741
def get_msg_from_choice(self, render_choice: RenderChoice) -> str:
3842
if render_choice.choice_type == "module_start":
@@ -191,6 +195,11 @@ def _select_choice(self, key: str) -> None:
191195
self.selected_choice = self.render_choices[key]
192196
self.exit(self.selected_choice)
193197

198+
def action_quit(self) -> None:
199+
if self._on_cancel:
200+
self._on_cancel()
201+
self.exit()
202+
194203
async def action_copy_selection(self) -> None:
195204
"""Handle ctrl+c: copy selected text if any.
196205

0 commit comments

Comments
 (0)