From e1c8ddf9c24bdcb02322f082830c7a7f3991131e Mon Sep 17 00:00:00 2001 From: Olivier Philippon Date: Wed, 11 May 2022 11:47:34 +0100 Subject: [PATCH] [scroll_to_widget] Add a quick sandbox to test the feature --- sandbox/scroll_to_widget.py | 72 +++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 sandbox/scroll_to_widget.py diff --git a/sandbox/scroll_to_widget.py b/sandbox/scroll_to_widget.py new file mode 100644 index 000000000..81b0bf83c --- /dev/null +++ b/sandbox/scroll_to_widget.py @@ -0,0 +1,72 @@ +from rich.console import RenderableType +from rich.text import Text + +from textual.app import App, ComposeResult +from textual.widget import Widget +from textual.widgets import Placeholder + +placeholders_count = 12 + + +class VerticalContainer(Widget): + CSS = """ + VerticalContainer { + layout: vertical; + overflow: hidden auto; + background: darkblue; + } + + VerticalContainer Placeholder { + margin: 1 0; + height: 5; + border: solid lime; + align: center top; + } + """ + + +class Introduction(Widget): + CSS = """ + Introduction { + background: indigo; + color: white; + height: 3; + padding: 1 0; + } + """ + + def render(self) -> RenderableType: + return Text( + "Press keys 0 to 9 to scroll to the Placeholder with that ID.", + justify="center", + ) + + +class MyTestApp(App): + def compose(self) -> ComposeResult: + placeholders = [ + Placeholder(id=f"placeholder_{i}", name=f"Placeholder #{i}") + for i in range(placeholders_count) + ] + + yield VerticalContainer(Introduction(), *placeholders, id="root") + + def on_mount(self): + self.bind("q", "quit") + self.bind("t", "tree") + for widget_index in range(placeholders_count): + self.bind(str(widget_index), f"scroll_to('placeholder_{widget_index}')") + + def action_tree(self): + self.log(self.tree) + + async def action_scroll_to(self, target_placeholder_id: str): + target_placeholder = self.query(f"#{target_placeholder_id}").first() + target_placeholder_container = self.query("#root").first() + target_placeholder_container.scroll_to_widget(target_placeholder, animate=True) + + +app = MyTestApp() + +if __name__ == "__main__": + app.run()