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.app import App
from textual.widgets import Placeholder from textual.widgets import Placeholder
@@ -6,7 +5,7 @@ from textual.widgets import Placeholder
class SimpleApp(App): class SimpleApp(App):
"""Demonstrates smooth animation""" """Demonstrates smooth animation"""
async def on_mount(self, event: events.Mount) -> None: async def on_mount(self) -> None:
"""Build layout here.""" """Build layout here."""
await self.view.dock(Placeholder(), edge="left", size=40) 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: if self.log_file and verbosity <= self.log_verbosity:
output = f" ".join(str(arg) for arg in args) output = f" ".join(str(arg) for arg in args)
if kwargs: if kwargs:
output += " " + " ".join( key_values = " ".join(
f"{key}={value}" for key, value in kwargs.items() f"{key}={value}" for key, value in kwargs.items()
) )
output = " ".join((output, key_values))
self.log_file.write(output + "\n") self.log_file.write(output + "\n")
self.log_file.flush() self.log_file.flush()
except Exception: except Exception:
@@ -301,11 +302,6 @@ class App(MessagePump):
if self.log_file is not None: if self.log_file is not None:
self.log_file.close() 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: def register(self, child: MessagePump, parent: MessagePump) -> bool:
if child not in self.children: if child not in self.children:
self.children.add(child) self.children.add(child)

View File

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

View File

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

View File

@@ -3,6 +3,7 @@ from __future__ import annotations
import asyncio import asyncio
from asyncio import CancelledError from asyncio import CancelledError
from asyncio import Queue, QueueEmpty, Task from asyncio import Queue, QueueEmpty, Task
from functools import partial
from typing import TYPE_CHECKING, Awaitable, Iterable, Callable from typing import TYPE_CHECKING, Awaitable, Iterable, Callable
from weakref import WeakSet from weakref import WeakSet
@@ -144,10 +145,20 @@ class MessagePump:
self._child_tasks.add(asyncio.get_event_loop().create_task(timer.run())) self._child_tasks.add(asyncio.get_event_loop().create_task(timer.run()))
return timer 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: def close_messages_no_wait(self) -> None:
self._message_queue.put_nowait(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.""" """Close message queue, and optionally wait for queue to finish processing."""
if self._closed: if self._closed:
return return

View File

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

View File

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