fix for random rules names

This commit is contained in:
Will McGugan
2021-11-25 15:01:03 +00:00
parent 09544e172f
commit 4137d354f0
7 changed files with 42 additions and 52 deletions

View File

@@ -47,13 +47,13 @@ class BasicApp(App):
async def on_mount(self) -> None:
"""Build layout here."""
await self.view.mount(
header=Widget(),
content=Widget(),
footer=Widget(),
sidebar=Widget(),
)
self.panic(self.view.styles)
BasicApp.run(log="textual.log")

View File

@@ -319,15 +319,13 @@ class App(DOMNode):
load_event = events.Load(sender=self)
await self.dispatch_message(load_event)
# Wait for the load event to be processed, so we don't go in to application mode beforehand
await load_event.wait()
# await load_event.wait()
driver = self._driver = self.driver_class(self.console, self)
driver.start_application_mode()
try:
mount_event = events.Mount(sender=self)
await self.dispatch_message(mount_event)
await mount_event.wait()
self.title = self._title
self.refresh()
@@ -371,20 +369,21 @@ class App(DOMNode):
name_widgets: Iterable[tuple[str | None, Widget]]
name_widgets = [*((None, widget) for widget in anon_widgets), *widgets.items()]
apply_stylesheet = self.stylesheet.apply
widget_events = []
for widget_id, widget in name_widgets:
if widget not in self.registry:
if widget_id is not None:
widget.id = widget_id
self._register(parent, widget)
apply_stylesheet(widget)
mount_event = events.Mount(sender=parent)
widget_events.append((widget, mount_event))
# await widget.post_message(mount_event)
# await mount_event.wait()
for widget, event in widget_events:
widget.post_message_no_wait(event)
for _widget_id, widget in name_widgets:
widget.post_message_no_wait(events.Mount(sender=parent))
# await event.wait()
# for widget, _ in widget_events:
# apply_stylesheet(widget)
def is_mounted(self, widget: Widget) -> bool:
return widget in self.registry
@@ -472,7 +471,7 @@ class App(DOMNode):
async def on_event(self, event: events.Event) -> None:
# Handle input events that haven't been forwarded
# If the event has been forwaded it may have bubbled up back to the App
# If the event has been forwarded it may have bubbled up back to the App
if isinstance(event, events.Mount):
view = DockView()
await self.mount(self, view)

View File

@@ -10,6 +10,7 @@ from .match import match
from .parse import parse_selectors
if TYPE_CHECKING:
from ..dom import DOMNode
from ..widget import Widget
@@ -17,12 +18,12 @@ if TYPE_CHECKING:
class DOMQuery:
def __init__(
self,
node: Widget | None = None,
node: DOMNode | None = None,
selector: str | None = None,
nodes: Iterable[Widget] | None = None,
nodes: Iterable[DOMNode] | None = None,
) -> None:
self._nodes: list[Widget] = []
self._nodes: list[DOMNode] = []
if nodes is not None:
self._nodes = list(nodes)
elif node is not None:
@@ -34,7 +35,13 @@ class DOMQuery:
selector_set = parse_selectors(selector)
self._nodes = [_node for _node in self._nodes if match(selector_set, _node)]
def __iter__(self) -> Iterator[Widget]:
def __len__(self) -> int:
return len(self._nodes)
def __bool__(self) -> bool:
return bool(self._nodes)
def __iter__(self) -> Iterator[DOMNode]:
return iter(self._nodes)
def __rich_repr__(self) -> rich.repr.Result:
@@ -46,5 +53,17 @@ class DOMQuery:
query._nodes = [_node for _node in self._nodes if match(selector_set, _node)]
return query
def first(self) -> Widget:
def first(self) -> DOMNode:
return self._nodes[0]
def add_class(self, *class_names: str) -> None:
for node in self._nodes:
node.add_class(*class_names)
def remove_class(self, *class_names: str) -> None:
for node in self._nodes:
node.remove_class(*class_names)
def toggle_class(self, *class_names: str) -> None:
for node in self._nodes:
node.remove_class(*class_names)

View File

@@ -279,8 +279,8 @@ class Styles:
return "\n".join(self.css_lines)
RULE_NAMES = {name[6:] for name in dir(Styles) if name.startswith("_rule_")}
INTERNAL_RULE_NAMES = {name for name in dir(Styles) if name.startswith("_rule_")}
RULE_NAMES = [name[6:] for name in dir(Styles) if name.startswith("_rule_")]
INTERNAL_RULE_NAMES = [f"_rule_{name}" for name in RULE_NAMES]
if __name__ == "__main__":
styles = Styles()

View File

@@ -41,13 +41,6 @@ class StylesheetErrors:
lines = Text(code, style="dim").split()
lines[line_no].stylize("bold not dim", col_no, col_no + length - 1)
text = Text("\n").join(lines[max(0, line_no - 1) : line_no + 2])
# return Syntax(
# code,
# "",
# line_range=(line_no - 1, line_no + 1),
# line_numbers=True,
# indent_guides=True,
# )
return Panel(text, border_style="red")
def __rich__(self) -> RenderableType:

View File

@@ -41,7 +41,6 @@ class Message:
self._forwarded = False
self._no_default_action = False
self._stop_propagation = False
self.__done_event: Event | None = None
super().__init__()
def __rich_repr__(self) -> rich.repr.Result:
@@ -52,15 +51,6 @@ class Message:
cls.bubble = bubble
cls.verbosity = verbosity
def set_done(self) -> None:
self._done_event.set()
@property
def _done_event(self) -> Event:
if self.__done_event is None:
self.__done_event = Event()
return self.__done_event
@property
def is_forwarded(self) -> bool:
return self._forwarded
@@ -98,7 +88,3 @@ class Message:
"""
self._stop_propagation = stop
return self
async def wait(self) -> None:
"""Wait for the message to be processed."""
await self._done_event.wait()

View File

@@ -244,13 +244,9 @@ class MessagePump:
async def on_event(self, event: events.Event) -> None:
_rich_traceback_guard = True
try:
for method in self._get_dispatch_methods(f"on_{event.name}", event):
log(event, ">>>", self, verbosity=event.verbosity)
await invoke(method, event)
finally:
event.set_done()
if event.bubble and self._parent and not event._stop_propagation:
if event.sender == self._parent:
@@ -262,14 +258,11 @@ class MessagePump:
async def on_message(self, message: Message) -> None:
_rich_traceback_guard = True
method_name = f"handle_{message.name}"
method = getattr(self, method_name, None)
try:
if method is not None:
log(message, ">>>", self, verbosity=message.verbosity)
await invoke(method, message)
finally:
message.set_done()
if message.bubble and self._parent and not message._stop_propagation:
if message.sender == self._parent: