mirror of
https://github.com/Textualize/textual.git
synced 2025-10-17 02:38:12 +03:00
fix for events not sent on scroll
This commit is contained in:
@@ -320,7 +320,7 @@ class Compositor:
|
||||
old_map = self.map
|
||||
map, widgets = self._arrange_root(parent, size, visible_only=True)
|
||||
|
||||
exposed_widgets = widgets - self.widgets
|
||||
exposed_widgets = map.keys() - old_map.keys()
|
||||
# Replace map and widgets
|
||||
self.map = map
|
||||
self.widgets = widgets
|
||||
@@ -394,6 +394,7 @@ class Compositor:
|
||||
|
||||
map: CompositorMap = {}
|
||||
widgets: set[Widget] = set()
|
||||
add_new_widget = widgets.add
|
||||
layer_order: int = 0
|
||||
|
||||
def add_widget(
|
||||
@@ -419,7 +420,7 @@ class Compositor:
|
||||
visible = visibility == "visible"
|
||||
|
||||
if visible:
|
||||
widgets.add(widget)
|
||||
add_new_widget(widget)
|
||||
styles_offset = widget.styles.offset
|
||||
layout_offset = (
|
||||
styles_offset.resolve(region.size, clip.size)
|
||||
|
||||
@@ -9,6 +9,7 @@ from rich.style import Style
|
||||
from . import errors, events, messages
|
||||
from ._callback import invoke
|
||||
from ._compositor import Compositor, MapGeometry
|
||||
from ._profile import timer
|
||||
from ._types import CallbackType
|
||||
from .css.match import match
|
||||
from .css.parse import parse_selectors
|
||||
@@ -434,18 +435,26 @@ class Screen(Widget):
|
||||
exposed_widgets = self._compositor.reflow_visible(self, size)
|
||||
if exposed_widgets:
|
||||
layers = self._compositor.layers
|
||||
for widget, (
|
||||
region,
|
||||
_order,
|
||||
_clip,
|
||||
virtual_size,
|
||||
container_size,
|
||||
_,
|
||||
) in layers:
|
||||
widget._size_updated(region.size, virtual_size, container_size)
|
||||
widget.post_message_no_wait(
|
||||
ResizeEvent(self, region.size, virtual_size, container_size)
|
||||
)
|
||||
with timer("size events"):
|
||||
for widget, (
|
||||
region,
|
||||
_order,
|
||||
_clip,
|
||||
virtual_size,
|
||||
container_size,
|
||||
_,
|
||||
) in layers:
|
||||
if widget in exposed_widgets:
|
||||
widget._size_updated(
|
||||
region.size,
|
||||
virtual_size,
|
||||
container_size,
|
||||
)
|
||||
widget.post_message_no_wait(
|
||||
ResizeEvent(
|
||||
self, region.size, virtual_size, container_size
|
||||
)
|
||||
)
|
||||
else:
|
||||
hidden, shown, resized = self._compositor.reflow(self, size)
|
||||
Hide = events.Hide
|
||||
|
||||
@@ -2142,6 +2142,7 @@ class Widget(DOMNode):
|
||||
size: Screen size.
|
||||
virtual_size: Virtual (scrollable) size.
|
||||
container_size: Container size (size of parent).
|
||||
refresh: Also refresh.
|
||||
"""
|
||||
if (
|
||||
self._size != size
|
||||
@@ -2149,11 +2150,13 @@ class Widget(DOMNode):
|
||||
or self._container_size != container_size
|
||||
):
|
||||
self._size = size
|
||||
self.virtual_size = virtual_size
|
||||
if self.virtual_size:
|
||||
self.virtual_size = virtual_size
|
||||
else:
|
||||
self._reactive_virtual_size = virtual_size
|
||||
self._container_size = container_size
|
||||
if self.is_scrollable:
|
||||
self._scroll_update(virtual_size)
|
||||
self.refresh()
|
||||
|
||||
def _scroll_update(self, virtual_size: Size) -> None:
|
||||
"""Update scrollbars visibility and dimensions.
|
||||
@@ -2291,8 +2294,7 @@ class Widget(DOMNode):
|
||||
repaint: Repaint the widget (will call render() again). Defaults to True.
|
||||
layout: Also layout widgets in the view. Defaults to False.
|
||||
"""
|
||||
|
||||
if layout:
|
||||
if layout and not self._layout_required:
|
||||
self._layout_required = True
|
||||
for ancestor in self.ancestors:
|
||||
if not isinstance(ancestor, Widget):
|
||||
|
||||
@@ -2,6 +2,7 @@ from __future__ import annotations
|
||||
|
||||
from itertools import cycle
|
||||
|
||||
from rich.console import RenderableType
|
||||
from typing_extensions import Literal
|
||||
|
||||
from .. import events
|
||||
@@ -61,10 +62,10 @@ class Placeholder(Widget):
|
||||
overflow: hidden;
|
||||
color: $text;
|
||||
}
|
||||
|
||||
Placeholder.-text {
|
||||
padding: 1;
|
||||
}
|
||||
|
||||
"""
|
||||
|
||||
# Consecutive placeholders get assigned consecutive colors.
|
||||
@@ -73,7 +74,7 @@ class Placeholder(Widget):
|
||||
|
||||
variant: Reactive[PlaceholderVariant] = reactive("default")
|
||||
|
||||
_renderables: dict[PlaceholderVariant, RenderResult]
|
||||
_renderables: dict[PlaceholderVariant, str]
|
||||
|
||||
@classmethod
|
||||
def reset_color_cycle(cls) -> None:
|
||||
@@ -119,7 +120,7 @@ class Placeholder(Widget):
|
||||
while next(self._variants_cycle) != self.variant:
|
||||
pass
|
||||
|
||||
def render(self) -> RenderResult:
|
||||
def render(self) -> RenderableType:
|
||||
return self._renderables[self.variant]
|
||||
|
||||
def cycle_variant(self) -> None:
|
||||
@@ -147,6 +148,6 @@ class Placeholder(Widget):
|
||||
|
||||
def on_resize(self, event: events.Resize) -> None:
|
||||
"""Update the placeholder "size" variant with the new placeholder size."""
|
||||
self._renderables["size"] = self._SIZE_RENDER_TEMPLATE.format(*self.size)
|
||||
self._renderables["size"] = self._SIZE_RENDER_TEMPLATE.format(*event.size)
|
||||
if self.variant == "size":
|
||||
self.refresh(layout=True)
|
||||
self.refresh(layout=False)
|
||||
|
||||
Reference in New Issue
Block a user