optimization

This commit is contained in:
Will McGugan
2022-07-29 10:51:37 +01:00
parent b514e9544b
commit 547b8531a1
3 changed files with 16 additions and 19 deletions

View File

@@ -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

View File

@@ -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))

View File

@@ -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: