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:
|
async def on_mount(self) -> None:
|
||||||
"""Build layout here."""
|
"""Build layout here."""
|
||||||
|
|
||||||
await self.view.mount(
|
await self.view.mount(
|
||||||
header=Widget(),
|
header=Widget(),
|
||||||
content=Widget(),
|
content=Widget(),
|
||||||
footer=Widget(),
|
footer=Widget(),
|
||||||
sidebar=Widget(),
|
sidebar=Widget(),
|
||||||
)
|
)
|
||||||
self.panic(self.view.styles)
|
|
||||||
|
|
||||||
|
|
||||||
BasicApp.run(log="textual.log")
|
BasicApp.run(log="textual.log")
|
||||||
|
|||||||
@@ -319,15 +319,13 @@ class App(DOMNode):
|
|||||||
load_event = events.Load(sender=self)
|
load_event = events.Load(sender=self)
|
||||||
await self.dispatch_message(load_event)
|
await self.dispatch_message(load_event)
|
||||||
# Wait for the load event to be processed, so we don't go in to application mode beforehand
|
# 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 = self._driver = self.driver_class(self.console, self)
|
||||||
driver.start_application_mode()
|
driver.start_application_mode()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
mount_event = events.Mount(sender=self)
|
mount_event = events.Mount(sender=self)
|
||||||
await self.dispatch_message(mount_event)
|
await self.dispatch_message(mount_event)
|
||||||
await mount_event.wait()
|
|
||||||
|
|
||||||
self.title = self._title
|
self.title = self._title
|
||||||
self.refresh()
|
self.refresh()
|
||||||
@@ -371,20 +369,21 @@ class App(DOMNode):
|
|||||||
name_widgets: Iterable[tuple[str | None, Widget]]
|
name_widgets: Iterable[tuple[str | None, Widget]]
|
||||||
name_widgets = [*((None, widget) for widget in anon_widgets), *widgets.items()]
|
name_widgets = [*((None, widget) for widget in anon_widgets), *widgets.items()]
|
||||||
apply_stylesheet = self.stylesheet.apply
|
apply_stylesheet = self.stylesheet.apply
|
||||||
widget_events = []
|
|
||||||
for widget_id, widget in name_widgets:
|
for widget_id, widget in name_widgets:
|
||||||
if widget not in self.registry:
|
if widget not in self.registry:
|
||||||
if widget_id is not None:
|
if widget_id is not None:
|
||||||
widget.id = widget_id
|
widget.id = widget_id
|
||||||
self._register(parent, widget)
|
self._register(parent, widget)
|
||||||
apply_stylesheet(widget)
|
apply_stylesheet(widget)
|
||||||
mount_event = events.Mount(sender=parent)
|
|
||||||
widget_events.append((widget, mount_event))
|
|
||||||
# await widget.post_message(mount_event)
|
# await widget.post_message(mount_event)
|
||||||
# await mount_event.wait()
|
# await mount_event.wait()
|
||||||
for widget, event in widget_events:
|
for _widget_id, widget in name_widgets:
|
||||||
widget.post_message_no_wait(event)
|
widget.post_message_no_wait(events.Mount(sender=parent))
|
||||||
# await event.wait()
|
# await event.wait()
|
||||||
|
# for widget, _ in widget_events:
|
||||||
|
# apply_stylesheet(widget)
|
||||||
|
|
||||||
def is_mounted(self, widget: Widget) -> bool:
|
def is_mounted(self, widget: Widget) -> bool:
|
||||||
return widget in self.registry
|
return widget in self.registry
|
||||||
@@ -472,7 +471,7 @@ class App(DOMNode):
|
|||||||
|
|
||||||
async def on_event(self, event: events.Event) -> None:
|
async def on_event(self, event: events.Event) -> None:
|
||||||
# Handle input events that haven't been forwarded
|
# 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):
|
if isinstance(event, events.Mount):
|
||||||
view = DockView()
|
view = DockView()
|
||||||
await self.mount(self, view)
|
await self.mount(self, view)
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ from .match import match
|
|||||||
from .parse import parse_selectors
|
from .parse import parse_selectors
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
|
from ..dom import DOMNode
|
||||||
from ..widget import Widget
|
from ..widget import Widget
|
||||||
|
|
||||||
|
|
||||||
@@ -17,12 +18,12 @@ if TYPE_CHECKING:
|
|||||||
class DOMQuery:
|
class DOMQuery:
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
node: Widget | None = None,
|
node: DOMNode | None = None,
|
||||||
selector: str | None = None,
|
selector: str | None = None,
|
||||||
nodes: Iterable[Widget] | None = None,
|
nodes: Iterable[DOMNode] | None = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
|
|
||||||
self._nodes: list[Widget] = []
|
self._nodes: list[DOMNode] = []
|
||||||
if nodes is not None:
|
if nodes is not None:
|
||||||
self._nodes = list(nodes)
|
self._nodes = list(nodes)
|
||||||
elif node is not None:
|
elif node is not None:
|
||||||
@@ -34,7 +35,13 @@ class DOMQuery:
|
|||||||
selector_set = parse_selectors(selector)
|
selector_set = parse_selectors(selector)
|
||||||
self._nodes = [_node for _node in self._nodes if match(selector_set, _node)]
|
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)
|
return iter(self._nodes)
|
||||||
|
|
||||||
def __rich_repr__(self) -> rich.repr.Result:
|
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)]
|
query._nodes = [_node for _node in self._nodes if match(selector_set, _node)]
|
||||||
return query
|
return query
|
||||||
|
|
||||||
def first(self) -> Widget:
|
def first(self) -> DOMNode:
|
||||||
return self._nodes[0]
|
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)
|
return "\n".join(self.css_lines)
|
||||||
|
|
||||||
|
|
||||||
RULE_NAMES = {name[6:] 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 = {name for name in dir(Styles) if name.startswith("_rule_")}
|
INTERNAL_RULE_NAMES = [f"_rule_{name}" for name in RULE_NAMES]
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
styles = Styles()
|
styles = Styles()
|
||||||
|
|||||||
@@ -41,13 +41,6 @@ class StylesheetErrors:
|
|||||||
lines = Text(code, style="dim").split()
|
lines = Text(code, style="dim").split()
|
||||||
lines[line_no].stylize("bold not dim", col_no, col_no + length - 1)
|
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])
|
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")
|
return Panel(text, border_style="red")
|
||||||
|
|
||||||
def __rich__(self) -> RenderableType:
|
def __rich__(self) -> RenderableType:
|
||||||
|
|||||||
@@ -41,7 +41,6 @@ class Message:
|
|||||||
self._forwarded = False
|
self._forwarded = False
|
||||||
self._no_default_action = False
|
self._no_default_action = False
|
||||||
self._stop_propagation = False
|
self._stop_propagation = False
|
||||||
self.__done_event: Event | None = None
|
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
def __rich_repr__(self) -> rich.repr.Result:
|
def __rich_repr__(self) -> rich.repr.Result:
|
||||||
@@ -52,15 +51,6 @@ class Message:
|
|||||||
cls.bubble = bubble
|
cls.bubble = bubble
|
||||||
cls.verbosity = verbosity
|
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
|
@property
|
||||||
def is_forwarded(self) -> bool:
|
def is_forwarded(self) -> bool:
|
||||||
return self._forwarded
|
return self._forwarded
|
||||||
@@ -98,7 +88,3 @@ class Message:
|
|||||||
"""
|
"""
|
||||||
self._stop_propagation = stop
|
self._stop_propagation = stop
|
||||||
return self
|
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:
|
async def on_event(self, event: events.Event) -> None:
|
||||||
_rich_traceback_guard = True
|
_rich_traceback_guard = True
|
||||||
|
for method in self._get_dispatch_methods(f"on_{event.name}", event):
|
||||||
try:
|
log(event, ">>>", self, verbosity=event.verbosity)
|
||||||
for method in self._get_dispatch_methods(f"on_{event.name}", event):
|
await invoke(method, 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.bubble and self._parent and not event._stop_propagation:
|
||||||
if event.sender == self._parent:
|
if event.sender == self._parent:
|
||||||
@@ -262,14 +258,11 @@ class MessagePump:
|
|||||||
async def on_message(self, message: Message) -> None:
|
async def on_message(self, message: Message) -> None:
|
||||||
_rich_traceback_guard = True
|
_rich_traceback_guard = True
|
||||||
method_name = f"handle_{message.name}"
|
method_name = f"handle_{message.name}"
|
||||||
|
|
||||||
method = getattr(self, method_name, None)
|
method = getattr(self, method_name, None)
|
||||||
try:
|
|
||||||
if method is not None:
|
if method is not None:
|
||||||
log(message, ">>>", self, verbosity=message.verbosity)
|
log(message, ">>>", self, verbosity=message.verbosity)
|
||||||
await invoke(method, message)
|
await invoke(method, message)
|
||||||
finally:
|
|
||||||
message.set_done()
|
|
||||||
|
|
||||||
if message.bubble and self._parent and not message._stop_propagation:
|
if message.bubble and self._parent and not message._stop_propagation:
|
||||||
if message.sender == self._parent:
|
if message.sender == self._parent:
|
||||||
|
|||||||
Reference in New Issue
Block a user