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