mirror of
https://github.com/Textualize/textual.git
synced 2025-10-17 02:38:12 +03:00
optimization
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user