From 547b8531a15942fbf9d234be8b2163fb83e53727 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Fri, 29 Jul 2022 10:51:37 +0100 Subject: [PATCH] optimization --- src/textual/_arrange.py | 19 +++++++++++-------- src/textual/css/stylesheet.py | 4 ---- src/textual/widget.py | 12 +++++------- 3 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/textual/_arrange.py b/src/textual/_arrange.py index 7922f0843..8b8b72476 100644 --- a/src/textual/_arrange.py +++ b/src/textual/_arrange.py @@ -2,7 +2,8 @@ from __future__ import annotations from fractions import Fraction -from typing import TYPE_CHECKING +from operator import attrgetter +from typing import Sequence, TYPE_CHECKING from .geometry import Region, Size, Spacing from ._layout import DockArrangeResult, WidgetPlacement @@ -13,7 +14,9 @@ if TYPE_CHECKING: from .widget import Widget -def arrange(widget: Widget, size: Size, viewport: Size) -> DockArrangeResult: +def arrange( + widget: Widget, children: Sequence[Widget], size: Size, viewport: Size +) -> DockArrangeResult: """Arrange widgets by applying docks and calling layouts Args: @@ -24,13 +27,14 @@ def arrange(widget: Widget, size: Size, viewport: Size) -> DockArrangeResult: Returns: tuple[list[WidgetPlacement], set[Widget], Spacing]: Widget arrangement information. """ - display_children = [child for child in widget.children if child.display] + display_children = [child for child in children if child.display] arrange_widgets: set[Widget] = set() dock_layers: dict[str, list[Widget]] = {} + dock_layers_setdefault = dock_layers.setdefault for child in display_children: - dock_layers.setdefault(child.styles.layer or "default", []).append(child) + dock_layers_setdefault(child.styles.layer or "default", []).append(child) width, height = size @@ -45,12 +49,11 @@ def arrange(widget: Widget, size: Size, viewport: Size) -> DockArrangeResult: scroll_spacing = Spacing() + get_dock = attrgetter("styles.dock") + for widgets in dock_layers.values(): - layout_widgets, dock_widgets = partition( - (lambda widget: widget.styles.dock), widgets - ) - + layout_widgets, dock_widgets = partition(get_dock, widgets) arrange_widgets.update(dock_widgets) top = right = bottom = left = 0 diff --git a/src/textual/css/stylesheet.py b/src/textual/css/stylesheet.py index 156409c3d..ffc77557c 100644 --- a/src/textual/css/stylesheet.py +++ b/src/textual/css/stylesheet.py @@ -405,12 +405,8 @@ class Stylesheet: else: # Not animated, so we apply the rules directly get_rule = rules.get - from ..screen import Screen for key in modified_rule_keys: - if isinstance(node, Screen): - - print(node, key, get_rule(key)) setattr(base_styles, key, get_rule(key)) node.post_message_no_wait(messages.StylesUpdated(sender=node)) diff --git a/src/textual/widget.py b/src/textual/widget.py index e947b1171..2555f1121 100644 --- a/src/textual/widget.py +++ b/src/textual/widget.py @@ -10,7 +10,6 @@ from typing import ( Collection, Iterable, NamedTuple, - Tuple, ) import rich.repr @@ -25,7 +24,7 @@ from rich.text import Text from . import errors, events, messages from ._animator import BoundAnimator -from ._arrange import arrange +from ._arrange import arrange, DockArrangeResult from ._context import active_app from ._layout import ArrangeResult, Layout from ._segment_tools import line_crop @@ -115,7 +114,7 @@ class Widget(DOMNode): self._content_width_cache: tuple[object, int] = (None, 0) self._content_height_cache: tuple[object, int] = (None, 0) - self._arrangement: Tuple[ArrangeResult, Spacing] | None = None + self._arrangement: DockArrangeResult | None = None self._arrangement_cache_key: tuple[int, Size] = (-1, Size()) self._styles_cache = StylesCache() @@ -136,7 +135,7 @@ class Widget(DOMNode): show_vertical_scrollbar = Reactive(False, layout=True) show_horizontal_scrollbar = Reactive(False, layout=True) - def _arrange(self, size: Size) -> ArrangeResult: + def _arrange(self, size: Size) -> DockArrangeResult: """Arrange children. Args: @@ -152,10 +151,9 @@ class Widget(DOMNode): and arrange_cache_key == self._arrangement_cache_key ): return self._arrangement - self._arrangement_cache_key = (self.children._updates, size) - - self._arrangement = arrange(self, size, self.screen.size) + self._arrangement_cache_key = arrange_cache_key + self._arrangement = arrange(self, self.children, size, self.screen.size) return self._arrangement def _clear_arrangement_cache(self) -> None: