fix for events not sent on scroll

This commit is contained in:
Will McGugan
2023-02-17 22:35:00 +00:00
parent 31c8fb2818
commit 9e94046cc6
4 changed files with 36 additions and 23 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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):

View File

@@ -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)