fix for refreshing layout

This commit is contained in:
Will McGugan
2021-09-18 20:45:24 +01:00
parent c14c0fccc3
commit 4903e7c79f
8 changed files with 23 additions and 15 deletions

View File

@@ -1,4 +1,3 @@
from textual import events
from textual.app import App
from textual.widgets import Placeholder
@@ -6,7 +5,7 @@ from textual.widgets import Placeholder
class SimpleApp(App):
"""Demonstrates smooth animation"""
async def on_mount(self, event: events.Mount) -> None:
async def on_mount(self) -> None:
"""Build layout here."""
await self.view.dock(Placeholder(), edge="left", size=40)

View File

@@ -135,9 +135,10 @@ class App(MessagePump):
if self.log_file and verbosity <= self.log_verbosity:
output = f" ".join(str(arg) for arg in args)
if kwargs:
output += " " + " ".join(
key_values = " ".join(
f"{key}={value}" for key, value in kwargs.items()
)
output = " ".join((output, key_values))
self.log_file.write(output + "\n")
self.log_file.flush()
except Exception:
@@ -301,11 +302,6 @@ class App(MessagePump):
if self.log_file is not None:
self.log_file.close()
async def call_later(self, callback: Callable, *args, **kwargs) -> None:
await self.post_message(
events.Callback(self, partial(callback, *args, **kwargs))
)
def register(self, child: MessagePump, parent: MessagePump) -> bool:
if child not in self.children:
self.children.add(child)

View File

@@ -7,6 +7,7 @@ from abc import ABC, abstractmethod
from typing import TYPE_CHECKING
from . import events
from . import log
from ._types import MessageTarget
if TYPE_CHECKING:

View File

@@ -77,7 +77,7 @@ class Message:
"""
return False
def prevent_default(self, prevent: bool = True) -> None:
def prevent_default(self, prevent: bool = True) -> Message:
"""Suppress the default action.
Args:
@@ -85,14 +85,16 @@ class Message:
or False if the default actions should be performed. Defaults to True.
"""
self._no_default_action = prevent
return self
def stop(self, stop: bool = True) -> None:
def stop(self, stop: bool = True) -> Message:
"""Stop propagation of the message to parent.
Args:
stop (bool, optional): The stop flag. Defaults to True.
"""
self._stop_propagation = stop
return self
async def wait(self) -> None:
"""Wait for the message to be processed."""

View File

@@ -3,6 +3,7 @@ from __future__ import annotations
import asyncio
from asyncio import CancelledError
from asyncio import Queue, QueueEmpty, Task
from functools import partial
from typing import TYPE_CHECKING, Awaitable, Iterable, Callable
from weakref import WeakSet
@@ -144,10 +145,20 @@ class MessagePump:
self._child_tasks.add(asyncio.get_event_loop().create_task(timer.run()))
return timer
async def call_later(self, callback: Callable, *args, **kwargs) -> None:
"""Run a callback after processing all messages and refreshing the screen.
Args:
callback (Callable): A callable.
"""
await self.post_message(
events.Callback(self, partial(callback, *args, **kwargs))
)
def close_messages_no_wait(self) -> None:
self._message_queue.put_nowait(None)
async def close_messages(self, wait: bool = True) -> None:
async def close_messages(self) -> None:
"""Close message queue, and optionally wait for queue to finish processing."""
if self._closed:
return

View File

@@ -129,7 +129,6 @@ class Reactive(Generic[ReactiveType]):
except AttributeError:
continue
value = await invoke(compute_method)
# value = await compute_method()
setattr(obj, compute, value)

View File

@@ -106,13 +106,14 @@ class View(Widget):
assert isinstance(widget, Widget)
display_update = self.layout.update_widget(self.console, widget)
# self.log("UPDATE", widget, display_update)
if display_update is not None:
self.app.display(display_update)
async def handle_layout(self, message: messages.Layout) -> None:
await self.refresh_layout()
if self.is_root_view:
message.stop()
await self.refresh_layout()
self.app.refresh()
async def mount(self, *anon_widgets: Widget, **widgets: Widget) -> None:
@@ -142,9 +143,7 @@ class View(Widget):
return
hidden, shown, resized = self.layout.reflow(self, Size(*self.console.size))
assert self.layout.map is not None
# self.virtual_size = self.layout.map.virtual_size
for widget in hidden:
widget.post_message_no_wait(events.Hide(self))

View File

@@ -63,4 +63,5 @@ class Button(Widget):
return ButtonRenderable(self.label, style=self.button_style)
async def on_click(self, event: events.Click) -> None:
event.prevent_default().stop()
await self.emit(ButtonPressed(self))