Skip to content

Commit 0a39699

Browse files
committed
optimize layout
1 parent 48b0f13 commit 0a39699

File tree

5 files changed

+58
-5
lines changed

5 files changed

+58
-5
lines changed

src/textual/_profile.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,17 @@
1010

1111

1212
@contextlib.contextmanager
13-
def timer(subject: str = "time") -> Generator[None, None, None]:
14-
"""print the elapsed time. (only used in debugging)"""
13+
def timer(subject: str = "time", threshold: float = 0) -> Generator[None, None, None]:
14+
"""print the elapsed time. (only used in debugging).
15+
16+
Args:
17+
subject: Text shown in log.
18+
threshold: Time in second after which the log is written.
19+
20+
"""
1521
start = perf_counter()
1622
yield
1723
elapsed = perf_counter() - start
18-
elapsed_ms = elapsed * 1000
19-
log(f"{subject} elapsed {elapsed_ms:.4f}ms")
24+
if elapsed >= threshold:
25+
elapsed_ms = elapsed * 1000
26+
log(f"{subject} elapsed {elapsed_ms:.4f}ms")

src/textual/layout.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ def arrange(
226226
An iterable of widget location
227227
"""
228228

229+
# @timer("get_content_width")
229230
def get_content_width(self, widget: Widget, container: Size, viewport: Size) -> int:
230231
"""Get the optimal content width by arranging children.
231232
@@ -247,6 +248,7 @@ def get_content_width(self, widget: Widget, container: Size, viewport: Size) ->
247248
width = arrangement.total_region.right
248249
return width
249250

251+
# @timer("get_content_height")
250252
def get_content_height(
251253
self, widget: Widget, container: Size, viewport: Size, width: int
252254
) -> int:

src/textual/layouts/stream.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
from textual.widget import Widget
1111

1212

13+
from textual._profile import timer
14+
15+
1316
class StreamLayout(Layout):
1417
"""A cut down version of the vertical layout.
1518
@@ -31,9 +34,11 @@ class StreamLayout(Layout):
3134

3235
name = "stream"
3336

37+
@timer("arrange STREAM")
3438
def arrange(
3539
self, parent: Widget, children: list[Widget], size: Size, greedy: bool = True
3640
) -> ArrangeResult:
41+
print(parent)
3742
parent.pre_layout(self)
3843
if not children:
3944
return []
@@ -81,3 +86,39 @@ def arrange(
8186
y += height
8287

8388
return placements
89+
90+
@timer("STREAM.get_content_width")
91+
def get_content_width(self, widget: Widget, container: Size, viewport: Size) -> int:
92+
"""Get the optimal content width by arranging children.
93+
94+
Args:
95+
widget: The container widget.
96+
container: The container size.
97+
viewport: The viewport size.
98+
99+
Returns:
100+
Width of the content.
101+
"""
102+
return widget.scrollable_content_region.width
103+
104+
@timer("STREAM.get_content_height")
105+
def get_content_height(
106+
self, widget: Widget, container: Size, viewport: Size, width: int
107+
) -> int:
108+
"""Get the content height.
109+
110+
Args:
111+
widget: The container widget.
112+
container: The container size.
113+
viewport: The viewport.
114+
width: The content width.
115+
116+
Returns:
117+
Content height (in lines).
118+
"""
119+
if widget._nodes:
120+
arrangement = widget._arrange(Size(width, 0))
121+
height = arrangement.total_region.height
122+
else:
123+
height = 0
124+
return height

src/textual/layouts/vertical.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,15 @@
1111
from textual.geometry import Spacing
1212
from textual.widget import Widget
1313

14+
from textual._profile import timer
15+
1416

1517
class VerticalLayout(Layout):
1618
"""Used to layout Widgets vertically on screen, from top to bottom."""
1719

1820
name = "vertical"
1921

22+
@timer("arrange VERTICAL")
2023
def arrange(
2124
self, parent: Widget, children: list[Widget], size: Size, greedy: bool = True
2225
) -> ArrangeResult:

src/textual/widget.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -717,10 +717,10 @@ def _cover(self, widget: Widget) -> None:
717717
self._uncover()
718718
self._cover_widget = widget
719719
widget._parent = self
720+
widget._start_messages()
720721
widget._post_register(self.app)
721722
self.app.stylesheet.apply(widget)
722723
self.refresh(layout=True)
723-
widget._start_messages()
724724

725725
def _uncover(self) -> None:
726726
"""Remove any widget, previously set via [`_cover`][textual.widget.Widget._cover]."""

0 commit comments

Comments
 (0)