Add steps view

This isn't very useful yet without highlighting of the current step in playback.
This commit is contained in:
Isaiah Odhner 2023-09-10 12:17:07 -04:00
parent b590d807a7
commit 5e55846fb2

View File

@ -2,6 +2,7 @@
import os import os
from typing import Any, Callable from typing import Any, Callable
from rich.syntax import Syntax
from rich.text import Text from rich.text import Text
from textual.app import App from textual.app import App
@ -12,6 +13,7 @@ from textual.events import Event, Key, MouseDown, MouseMove, MouseUp
from textual.geometry import Offset from textual.geometry import Offset
from textual.pilot import Pilot from textual.pilot import Pilot
from textual.screen import Screen from textual.screen import Screen
from textual.widgets import Static
from textual_paint.paint import PaintApp from textual_paint.paint import PaintApp
@ -80,6 +82,10 @@ class PilotRecorder():
self.replaying: bool = False self.replaying: bool = False
self.output_file = unique_file("tests/test_paint_something.py") self.output_file = unique_file("tests/test_paint_something.py")
self.next_after_exit: Callable[[], None] | None = None self.next_after_exit: Callable[[], None] | None = None
self.steps_view = Static(id="pilot-recorder-steps")
self.steps_view.styles.dock = "right"
self.steps_view.styles.width = 40
self.steps_view.styles.height = "100%"
recorder = self recorder = self
async def on_event(self: App[Any], event: Event) -> None: async def on_event(self: App[Any], event: Event) -> None:
@ -135,9 +141,15 @@ class PilotRecorder():
self.steps_changed() self.steps_changed()
def steps_changed(self) -> None: def steps_changed(self) -> None:
"""Save the steps any time they change.""" """Update the steps view any time the steps change."""
# Could implement a debug view of the steps, but just saving to the file is good enough for now. assert self.app is not None, "app should be set if we're recording an event from it"
self.save_replay() if self.steps_view.parent is None:
self.app.mount(self.steps_view)
# self.steps_view.update("\n".join(
# (f"{step_index + 1}. {event!r}" + ("{offset!r}, {selector!r}, {index!r}" if isinstance(event, (MouseDown, MouseMove, MouseUp)) else ""))
# for step_index, (event, offset, selector, index) in enumerate(self.steps)
# ))
self.steps_view.update(Syntax(self.get_replay_code(), "python", line_numbers=True))
async def replay_steps(self, pilot: Pilot[Any]) -> None: async def replay_steps(self, pilot: Pilot[Any]) -> None:
"""Replay the recorded steps, in the current app instance.""" """Replay the recorded steps, in the current app instance."""