combine updates

This commit is contained in:
Will McGugan
2021-08-27 15:26:44 +01:00
parent c492df381e
commit 251de053ab
7 changed files with 22 additions and 20 deletions

View File

@@ -6,7 +6,7 @@ class GridTest(App):
async def on_mount(self) -> None:
"""Make a simple grid arrangement."""
grid = await self.view.dock_grid(edge="left", size=70, name="left")
grid = await self.view.dock_grid(edge="left", name="left")
grid.add_column(fraction=1, name="left", min_size=20)
grid.add_column(size=30, name="center")

View File

@@ -95,9 +95,6 @@ class Layout(ABC):
def reset(self) -> None:
self._cuts = None
# if self._require_update:
# self.regions.clear()
# self._layout_map = None
def reflow(
self, console: Console, width: int, height: int, scroll: Offset
@@ -176,6 +173,7 @@ class Layout(ABC):
yield widget, region.intersection(clip), region
def get_offset(self, widget: Widget) -> Offset:
"""Get the offset of a widget."""
try:
return self.map[widget].region.origin
except KeyError:

View File

@@ -25,7 +25,7 @@ class Message:
]
sender: MessageTarget
bubble: ClassVar[bool] = False
bubble: ClassVar[bool] = True
verbosity: ClassVar[int] = 1
def __init__(self, sender: MessageTarget) -> None:
@@ -47,7 +47,7 @@ class Message:
def __rich_repr__(self) -> rich.repr.Result:
yield self.sender
def __init_subclass__(cls, bubble: bool = False, verbosity: int = 1) -> None:
def __init_subclass__(cls, bubble: bool = True, verbosity: int = 1) -> None:
super().__init_subclass__()
cls.bubble = bubble
cls.verbosity = verbosity

View File

@@ -33,11 +33,11 @@ class UpdateMessage(Message, verbosity=3):
@rich.repr.auto
class LayoutMessage(Message, verbosity=3):
def can_replace(self, message: Message) -> bool:
return isinstance(message, LayoutMessage)
return isinstance(message, (LayoutMessage, UpdateMessage))
@rich.repr.auto
class CursorMoveMessage(Message, bubble=True):
class CursorMoveMessage(Message):
def __init__(self, sender: MessagePump, line: int) -> None:
self.line = line
super().__init__(sender)

View File

@@ -90,18 +90,20 @@ class View(Widget):
return super().check_layout() or self.layout.check_update()
async def message_update(self, message: UpdateMessage) -> None:
message.stop()
widget = message.widget
assert isinstance(widget, Widget)
if self.is_root_view:
message.stop()
widget = message.widget
assert isinstance(widget, Widget)
display_update = self.root_view.layout.update_widget(self.console, widget)
if display_update is not None:
self.app.display(display_update)
display_update = self.layout.update_widget(self.console, widget)
if display_update is not None:
self.app.display(display_update)
async def message_layout(self, message: LayoutMessage) -> None:
message.stop()
await self.root_view.refresh_layout()
self.app.refresh()
if self.is_root_view:
message.stop()
await self.refresh_layout()
self.app.refresh()
async def mount(self, *anon_widgets: Widget, **widgets: Widget) -> None:

View File

@@ -7,7 +7,7 @@ from ..geometry import Offset, Size
from ..layouts.vertical import VerticalLayout
from ..view import View
from ..message import Message
from ..messages import UpdateMessage
from ..messages import UpdateMessage, LayoutMessage
from ..widget import Widget
from ..widgets import Static
@@ -49,11 +49,11 @@ class WindowView(View, layout=VerticalLayout):
async def watch_scroll_x(self, value: int) -> None:
self.layout.require_update()
self.refresh(layout=True)
self.refresh()
async def watch_scroll_y(self, value: int) -> None:
self.layout.require_update()
self.refresh(layout=True)
self.refresh()
async def on_resize(self, event: events.Resize) -> None:
await self.emit(WindowChange(self))

View File

@@ -18,6 +18,7 @@ from rich.console import Console, RenderableType
from rich.panel import Panel
from rich.padding import Padding, PaddingDimensions
from rich.pretty import Pretty
from rich.segment import Segment
from rich.style import Style
from rich.styled import Styled
from rich.text import TextType
@@ -282,6 +283,7 @@ class Widget(MessagePump):
async def on_idle(self, event: events.Idle) -> None:
if self.check_layout():
self.render_cache = None
self.reset_check_repaint()
self.reset_check_layout()
await self.emit(LayoutMessage(self))