textual icon indicating copy to clipboard operation
textual copied to clipboard

DataTable not moving cursor into view when move_cursor invoked before scrollbar is visible in other screen

Open SkPhilipp opened this issue 1 year ago • 2 comments

This is a bug report for DataTable.move_cursor. When invoking add_row then move_cursor, the cursor doesn't move into view under the following conditions;

  • overflow-y is auto and the scrollbar is not yet visible.
  • The add_row and move_cursor is done during (or after?) dismissing a screen.

The result looks like so, with the cursor being 1 line below out of view:

Screenshot 2024-05-19 at 17 21 51

The code to reproduce:

#!/usr/bin/env python
from textual.app import App, ComposeResult
from textual.screen import ModalScreen
from textual.widgets import DataTable, Footer


class ModalScreenEmpty(ModalScreen):
    BINDINGS = [
        ("escape", "modal_cancel", "Cancel"),
    ]

    def action_modal_cancel(self):
        self.dismiss(123)


class MyApp(App):
    BINDINGS = [
        ("q", "quit", "Quit"),
        ("d", "duplicate", "Duplicate, then hit Escape"),
    ]

    def compose(self) -> ComposeResult:
        yield DataTable()
        yield Footer()

    def on_mount(self) -> None:
        table = self.query_one(DataTable)
        table.add_column("name")
        for _ in range(5):
            table.add_row("Alice")
            table.add_row("Bob")

    def action_duplicate(self):
        table = self.query_one(DataTable)

        def callback(_: any):
            row_key = table.add_row("Eve")
            row_index = table.get_row_index(row_key)
            table.move_cursor(row=row_index)

        self.push_screen(ModalScreenEmpty(), callback)


app = MyApp()
app.run()

To reproduce the issue, hit D followed by Escape repeatedly until a line is added that is just outside of view.

Workarounds;

  1. Including overflow-y: scroll; appears to move the cursor as expected:
    CSS = """
    DataTable {
        overflow-y: scroll;
    }
    """
  1. Placing the move_cursor behind a call_after_refresh.

SkPhilipp avatar May 19 '24 15:05 SkPhilipp

We found the following entry in the FAQ which you may find helpful:

Feel free to close this issue if you found an answer in the FAQ. Otherwise, please give us a little time to review.

This is an automated reply, generated by FAQtory

github-actions[bot] avatar May 19 '24 15:05 github-actions[bot]

I can't reproduce this. Can you test against the latest version?

willmcgugan avatar Jun 17 '24 14:06 willmcgugan

I'm also unable to reproduce, so closing this until we hear back or get another report.

darrenburns avatar Jul 15 '24 08:07 darrenburns

Don't forget to star the repository!

Follow @textualizeio for Textual updates.

github-actions[bot] avatar Jul 15 '24 08:07 github-actions[bot]