mirror of
https://github.com/Textualize/textual.git
synced 2025-10-17 02:38:12 +03:00
restore css bases
This commit is contained in:
@@ -406,7 +406,7 @@ class Stylesheet:
|
|||||||
)
|
)
|
||||||
self.replace_rules(node, node_rules, animate=animate)
|
self.replace_rules(node, node_rules, animate=animate)
|
||||||
|
|
||||||
component_classes = DOMNode._get_component_classes(type(node))
|
component_classes = node._get_component_classes()
|
||||||
if component_classes:
|
if component_classes:
|
||||||
old_component_styles = node._component_styles.copy()
|
old_component_styles = node._component_styles.copy()
|
||||||
node._component_styles.clear()
|
node._component_styles.clear()
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import re
|
import re
|
||||||
from functools import lru_cache
|
|
||||||
from inspect import getfile
|
from inspect import getfile
|
||||||
from typing import (
|
from typing import (
|
||||||
TYPE_CHECKING,
|
TYPE_CHECKING,
|
||||||
ClassVar,
|
ClassVar,
|
||||||
Iterable,
|
Iterable,
|
||||||
|
Iterator,
|
||||||
Sequence,
|
Sequence,
|
||||||
Type,
|
Type,
|
||||||
TypeVar,
|
TypeVar,
|
||||||
@@ -219,18 +219,18 @@ class DOMNode(MessagePump):
|
|||||||
styles = self._component_styles[name]
|
styles = self._component_styles[name]
|
||||||
return styles
|
return styles
|
||||||
|
|
||||||
def _post_mount(self) -> None:
|
def _post_mount(self):
|
||||||
"""Called after the object has been mounted."""
|
"""Called after the object has been mounted."""
|
||||||
Reactive._initialize_object(self)
|
Reactive._initialize_object(self)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def _node_bases(self) -> Iterable[Type[DOMNode]]:
|
def _node_bases(self) -> Iterator[Type[DOMNode]]:
|
||||||
"""The DOMNode bases classes (including self.__class__)"""
|
"""The DOMNode bases classes (including self.__class__)"""
|
||||||
# Node bases are in reversed order so that the base class is lower priority
|
# Node bases are in reversed order so that the base class is lower priority
|
||||||
return self._css_bases(self.__class__)
|
return self._css_bases(self.__class__)
|
||||||
|
|
||||||
@staticmethod
|
@classmethod
|
||||||
def _css_bases(base: Type[DOMNode]) -> Iterable[Type[DOMNode]]:
|
def _css_bases(cls, base: Type[DOMNode]) -> Iterator[Type[DOMNode]]:
|
||||||
"""Get the DOMNode base classes, which inherit CSS.
|
"""Get the DOMNode base classes, which inherit CSS.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@@ -240,10 +240,8 @@ class DOMNode(MessagePump):
|
|||||||
An iterable of DOMNode classes.
|
An iterable of DOMNode classes.
|
||||||
"""
|
"""
|
||||||
_class = base
|
_class = base
|
||||||
node_classes: list[Type[DOMNode]] = []
|
|
||||||
add_class = node_classes.append
|
|
||||||
while True:
|
while True:
|
||||||
add_class(_class)
|
yield _class
|
||||||
if not _class._inherit_css:
|
if not _class._inherit_css:
|
||||||
break
|
break
|
||||||
for _base in _class.__bases__:
|
for _base in _class.__bases__:
|
||||||
@@ -252,7 +250,6 @@ class DOMNode(MessagePump):
|
|||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
break
|
break
|
||||||
return node_classes
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _merge_bindings(cls) -> Bindings:
|
def _merge_bindings(cls) -> Bindings:
|
||||||
@@ -317,8 +314,7 @@ class DOMNode(MessagePump):
|
|||||||
|
|
||||||
return css_stack
|
return css_stack
|
||||||
|
|
||||||
@staticmethod
|
def _get_component_classes(self) -> set[str]:
|
||||||
def _get_component_classes(node_type: type[DOMNode]) -> Iterable[str]:
|
|
||||||
"""Gets the component classes for this class and inherited from bases.
|
"""Gets the component classes for this class and inherited from bases.
|
||||||
|
|
||||||
Component classes are inherited from base classes, unless
|
Component classes are inherited from base classes, unless
|
||||||
@@ -327,13 +323,14 @@ class DOMNode(MessagePump):
|
|||||||
Returns:
|
Returns:
|
||||||
A set with all the component classes available.
|
A set with all the component classes available.
|
||||||
"""
|
"""
|
||||||
component_classes: list[str] = []
|
|
||||||
for base in DOMNode._css_bases(node_type):
|
component_classes: set[str] = set()
|
||||||
component_classes.extend(base.__dict__.get("COMPONENT_CLASSES", ()))
|
for base in self._node_bases:
|
||||||
|
component_classes.update(base.__dict__.get("COMPONENT_CLASSES", set()))
|
||||||
if not base.__dict__.get("_inherit_component_classes", True):
|
if not base.__dict__.get("_inherit_component_classes", True):
|
||||||
break
|
break
|
||||||
|
|
||||||
return sorted(component_classes)
|
return component_classes
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def parent(self) -> DOMNode | None:
|
def parent(self) -> DOMNode | None:
|
||||||
|
|||||||
@@ -143,27 +143,27 @@ def test_component_classes_inheritance():
|
|||||||
COMPONENT_CLASSES = {"f-1"}
|
COMPONENT_CLASSES = {"f-1"}
|
||||||
|
|
||||||
node = DOMNode()
|
node = DOMNode()
|
||||||
node_cc = DOMNode._get_component_classes(type(node))
|
node_cc = node._get_component_classes()
|
||||||
a = A()
|
a = A()
|
||||||
a_cc = DOMNode._get_component_classes(type(a))
|
a_cc = a._get_component_classes()
|
||||||
b = B()
|
b = B()
|
||||||
b_cc = DOMNode._get_component_classes(type(b))
|
b_cc = b._get_component_classes()
|
||||||
c = C()
|
c = C()
|
||||||
c_cc = DOMNode._get_component_classes(type(c))
|
c_cc = c._get_component_classes()
|
||||||
d = D()
|
d = D()
|
||||||
d_cc = DOMNode._get_component_classes(type(d))
|
d_cc = d._get_component_classes()
|
||||||
e = E()
|
e = E()
|
||||||
e_cc = DOMNode._get_component_classes(type(e))
|
e_cc = e._get_component_classes()
|
||||||
f = F()
|
f = F()
|
||||||
f_cc = DOMNode._get_component_classes(type(f))
|
f_cc = f._get_component_classes()
|
||||||
|
|
||||||
assert node_cc == []
|
assert node_cc == set()
|
||||||
assert a_cc == ["a-1", "a-2"]
|
assert a_cc == {"a-1", "a-2"}
|
||||||
assert b_cc == ["b-1"]
|
assert b_cc == {"b-1"}
|
||||||
assert c_cc == ["b-1", "c-1", "c-2"]
|
assert c_cc == {"b-1", "c-1", "c-2"}
|
||||||
assert d_cc == c_cc
|
assert d_cc == c_cc
|
||||||
assert e_cc == ["b-1", "c-1", "c-2", "e-1"]
|
assert e_cc == {"b-1", "c-1", "c-2", "e-1"}
|
||||||
assert f_cc == ["f-1"]
|
assert f_cc == {"f-1"}
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
|
|||||||
Reference in New Issue
Block a user