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: async def on_mount(self) -> None:
"""Make a simple grid arrangement.""" """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(fraction=1, name="left", min_size=20)
grid.add_column(size=30, name="center") grid.add_column(size=30, name="center")

View File

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

View File

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

View File

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

View File

@@ -90,18 +90,20 @@ class View(Widget):
return super().check_layout() or self.layout.check_update() return super().check_layout() or self.layout.check_update()
async def message_update(self, message: UpdateMessage) -> None: async def message_update(self, message: UpdateMessage) -> None:
message.stop() if self.is_root_view:
widget = message.widget message.stop()
assert isinstance(widget, Widget) widget = message.widget
assert isinstance(widget, Widget)
display_update = self.root_view.layout.update_widget(self.console, widget) display_update = self.layout.update_widget(self.console, widget)
if display_update is not None: if display_update is not None:
self.app.display(display_update) self.app.display(display_update)
async def message_layout(self, message: LayoutMessage) -> None: async def message_layout(self, message: LayoutMessage) -> None:
message.stop() if self.is_root_view:
await self.root_view.refresh_layout() message.stop()
self.app.refresh() await self.refresh_layout()
self.app.refresh()
async def mount(self, *anon_widgets: Widget, **widgets: Widget) -> None: 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 ..layouts.vertical import VerticalLayout
from ..view import View from ..view import View
from ..message import Message from ..message import Message
from ..messages import UpdateMessage from ..messages import UpdateMessage, LayoutMessage
from ..widget import Widget from ..widget import Widget
from ..widgets import Static from ..widgets import Static
@@ -49,11 +49,11 @@ class WindowView(View, layout=VerticalLayout):
async def watch_scroll_x(self, value: int) -> None: async def watch_scroll_x(self, value: int) -> None:
self.layout.require_update() self.layout.require_update()
self.refresh(layout=True) self.refresh()
async def watch_scroll_y(self, value: int) -> None: async def watch_scroll_y(self, value: int) -> None:
self.layout.require_update() self.layout.require_update()
self.refresh(layout=True) self.refresh()
async def on_resize(self, event: events.Resize) -> None: async def on_resize(self, event: events.Resize) -> None:
await self.emit(WindowChange(self)) await self.emit(WindowChange(self))

View File

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