fix for virtual nodes css

This commit is contained in:
Will McGugan
2023-02-21 17:01:07 +00:00
parent a7a14c9b24
commit 77025e3917
2 changed files with 26 additions and 5 deletions

View File

@@ -28,6 +28,25 @@ from .tokenizer import TokenError
from .types import Specificity3, Specificity6
class _VirtualDOMNode(DOMNode):
"""A DOM node that exists only to gether styles."""
def __init__(
self,
parent: DOMNode,
*,
name: str | None = None,
id: str | None = None,
classes: str | None = None,
) -> None:
self._virtual_parent = parent
super().__init__(name=name, id=id, classes=classes)
def refresh(self, *, repaint: bool = True, layout: bool = False) -> None:
"""Pass the refresh up to the parent, because this object will not exist during render."""
self._virtual_parent.refresh(repaint=repaint, layout=layout)
class StylesheetParseError(StylesheetError):
def __init__(self, errors: StylesheetErrors) -> None:
self.errors = errors
@@ -408,7 +427,7 @@ class Stylesheet:
node._component_styles.clear()
for component in node._get_component_classes():
virtual_node = DOMNode(classes=component)
virtual_node = _VirtualDOMNode(node, classes=component)
virtual_node._attach(node)
self.apply(virtual_node, animate=False)
node._component_styles[component] = virtual_node.styles

View File

@@ -1,6 +1,7 @@
from __future__ import annotations
import re
from functools import cache
from inspect import getfile
from typing import (
TYPE_CHECKING,
@@ -314,7 +315,9 @@ class DOMNode(MessagePump):
return css_stack
def _get_component_classes(self) -> set[str]:
@classmethod
@cache
def _get_component_classes(cls) -> set[str]:
"""Gets the component classes for this class and inherited from bases.
Component classes are inherited from base classes, unless
@@ -323,14 +326,13 @@ class DOMNode(MessagePump):
Returns:
A set with all the component classes available.
"""
component_classes: set[str] = set()
for base in self._node_bases:
for base in cls._css_bases(cls):
component_classes.update(base.__dict__.get("COMPONENT_CLASSES", set()))
if not base.__dict__.get("_inherit_component_classes", True):
break
return component_classes
return frozenset(component_classes)
@property
def parent(self) -> DOMNode | None: