narrow updates

This commit is contained in:
Will McGugan
2022-08-25 11:58:05 +01:00
parent abaa93b219
commit 9960bd139a
3 changed files with 16 additions and 7 deletions

View File

@@ -714,14 +714,17 @@ class App(Generic[ReturnType], DOMNode):
"""
return self.screen.get_child(id)
def update_styles(self) -> None:
def update_styles(self, node: DOMNode | None = None) -> None:
"""Request update of styles.
Should be called whenever CSS classes / pseudo classes change.
"""
self._require_stylesheet_update = True
self.check_idle()
if node is None:
self._require_stylesheet_update = True
self.check_idle()
else:
self.stylesheet.update(node, animate=True)
def update_visible_styles(self) -> None:
"""Update visible styles only."""

View File

@@ -27,6 +27,8 @@ from .types import Specificity3, Specificity6
from ..dom import DOMNode
from .. import messages
from .._profile import timer
class StylesheetParseError(StylesheetError):
def __init__(self, errors: StylesheetErrors) -> None:
@@ -354,7 +356,6 @@ class Stylesheet:
for name, specificity_rules in rule_attributes.items()
},
)
self.replace_rules(node, node_rules, animate=animate)
node._component_styles.clear()
@@ -433,6 +434,7 @@ class Stylesheet:
node.post_message_no_wait(messages.StylesUpdated(sender=node))
@timer("update")
def update(self, root: DOMNode, animate: bool = False) -> None:
"""Update styles on node and its children.
@@ -440,8 +442,10 @@ class Stylesheet:
root (DOMNode): Root note to update.
animate (bool, optional): Enable CSS animation. Defaults to False.
"""
self.update_nodes(root.walk_children())
print("update", root)
self.update_nodes(root.walk_children(), animate=animate)
@timer("update_nodes")
def update_nodes(self, nodes: Iterable[DOMNode], animate: bool = False) -> None:
"""Update styles for nodes.
@@ -450,6 +454,8 @@ class Stylesheet:
animate (bool, optional): Enable CSS animation. Defaults to False.
"""
apply = self.apply
nodes = list(nodes)
print(len(nodes), "NODES")
for node in nodes:
apply(node, animate=animate)
if isinstance(node, Widget) and node.is_scrollable:

View File

@@ -1227,11 +1227,11 @@ class Widget(DOMNode):
def watch_mouse_over(self, value: bool) -> None:
"""Update from CSS if mouse over state changes."""
self.app.update_visible_styles()
self.app.update_styles(self)
def watch_has_focus(self, value: bool) -> None:
"""Update from CSS if has focus state changes."""
self.app.update_styles()
self.app.update_styles(self)
def size_updated(
self, size: Size, virtual_size: Size, container_size: Size