Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Writing to a hidden RichLog breaks table alignment #4118

Closed
geoff-va opened this issue Feb 5, 2024 · 7 comments · Fixed by #4223
Closed

Writing to a hidden RichLog breaks table alignment #4118

geoff-va opened this issue Feb 5, 2024 · 7 comments · Fixed by #4223
Assignees

Comments

@geoff-va
Copy link

geoff-va commented Feb 5, 2024

I've got a RichLog that is often hidden and I write text to it. I'm using a Rich.Table to left/right justify two pieces of text on a single line.

This works as expected while the widget is shown.

If the widget has either visible=False or display=False set, then any text written during that time is collapsed together into a single string.

I'm not sure if this is a side effect of not having the widget displayed (no space is calculated for it so it doesn't know what sizes to use when writing the Table?) or not. If this is working as expected, might there be any way to write to the widget while it's hidden but preserve the appropriate sizing?

The following is an example of writing to the widget both while it is shown, has visible=False and display=False.

hidden-width

Example Code (same that produced gif above).

from __future__ import annotations

import random

from rich.align import Align
from rich.table import Table
from rich.text import Text
from textual.app import App, ComposeResult
from textual.widgets import RichLog


class Example(App):
    BINDINGS = [
        ("w", "write_line", "Write Line"),
        ("h", "toggle_visible", "Toggle Visibility"),
        ("d", "toggle_display", "Toggle Display"),
        ("q", "quit", "Quit"),
    ]

    DEFAULT_CSS = """
    #one  {
        border: round white;
        height: 1fr;
    }
    #two  {
        border: round white;
        height: 1fr;
    }
    """

    def compose(self) -> ComposeResult:
        log1 = RichLog(id="one")
        log1.border_title = "Log 1"
        log2 = RichLog(id="two")
        log2.border_title = "Log 2"
        yield log1
        yield log2

    def action_toggle_visible(self) -> None:
        log1 = self.query_one("#one", RichLog)
        log2 = self.query_one("#two", RichLog)

        log2.visible = not log2.visible
        log1.write(f"log2 visibility={log2.visible}")

    def action_toggle_display(self) -> None:
        log1 = self.query_one("#one", RichLog)
        log2 = self.query_one("#two", RichLog)

        log2.display = not log2.display
        log1.write(f"log2 display={log2.display}")

    def action_write_line(self) -> None:
        """Write a line to log 2"""
        log1 = self.query_one("#one", RichLog)
        log2 = self.query_one("#two", RichLog)

        left = Text("something: text on the left")
        right = Text("Stuff on the right")
        table = Table.grid(expand=True)
        table.add_row(left, Align.right(right))

        log2.write(table, expand=True)
        log1.write("Wrote to log2")


if __name__ == "__main__":
    app = Example()
    app.run()

Textual Diagnostics

Versions

Name Value
Textual 0.46.0
Rich 13.7.0

Python

Name Value
Version 3.8.10
Implementation CPython
Compiler Clang 14.0.3 (clang-1403.0.22.14.1)
Executable /Users/geoff/Documents/projects/kafka-tui/venv/bin/python

Operating System

Name Value
System Darwin
Release 23.3.0
Version Darwin Kernel Version 23.3.0: Wed Dec 20 21:30:27 PST 2023; root:xnu-10002.81.5~7/RELEASE_ARM64_T8103

Terminal

Name Value
Terminal Application vscode (1.86.0)
TERM xterm-256color
COLORTERM truecolor
FORCE_COLOR Not set
NO_COLOR Not set

Rich Console options

Name Value
size width=115, height=40
legacy_windows False
min_width 1
max_width 115
is_terminal True
encoding utf-8
max_height 40
justify None
overflow None
no_wrap False
highlight None
markup None
height None

Feel free to add screenshots and / or videos. These can be very helpful!

Copy link

github-actions bot commented Feb 5, 2024

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

@TomJGooding
Copy link
Contributor

TomJGooding commented Feb 5, 2024

I'm not sure if this is a side effect of not having the widget displayed (no space is calculated for it so it doesn't know what sizes to use when writing the Table?) or not. If this is working as expected, might there be any way to write to the widget while it's hidden but preserve the appropriate sizing?

I think you're right about Rich.Table not knowing how to calculate the column width.

Perhaps you could set table.width = log2.scrollable_content_region.width as a workaround?

@geoff-va
Copy link
Author

Gave it a whirl but unfortunately that doesn't seem to be working either. Looks to be writing empty lines in that case when it's not displayed. The width reported while it's hidden is 0.

image

Copy link

Don't forget to star the repository!

Follow @textualizeio for Textual updates.

@geoff-va
Copy link
Author

geoff-va commented Mar 10, 2024

Just tried my example out with the latest textual (0.52.1) but unfortunately I appear to be getting the same results as before.

image

@willmcgugan
Copy link
Collaborator

The fix is in main. It will be in next week's release.

@geoff-va
Copy link
Author

Ah - thanks for pointing that out. I should have checked instead of assumed :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants