idle events disable

This commit is contained in:
Will McGugan 2021-05-30 13:59:47 +01:00
parent 6d4227bb53
commit d13b133a37
4 changed files with 31 additions and 20 deletions

View file

@ -108,6 +108,7 @@ if __name__ == "__main__":
from logging import FileHandler
from .widgets.header import Header
from .widgets.placeholder import Placeholder
logging.basicConfig(
level="NOTSET",
@ -124,6 +125,7 @@ if __name__ == "__main__":
async def on_startup(self, event: events.Startup) -> None:
await self.view.mount(Header(self.title), slot="header")
await self.view.mount(Placeholder(), slot="body")
self.refresh()
MyApp.run()

View file

@ -126,16 +126,19 @@ class MessagePump:
self, message: Message, priority: int = 0
) -> Optional[bool]:
if isinstance(message, events.Event):
method_name = f"on_{message.name}"
dispatch_function: MessageHandler = getattr(self, method_name, None)
if dispatch_function is not None:
await dispatch_function(message)
if message.bubble and self._parent:
await self._parent.post_message(message, priority)
await self.on_event(message, priority)
else:
return await self.on_message(message)
return False
async def on_event(self, event: events.Event, priority: int) -> None:
method_name = f"on_{event.name}"
dispatch_function: MessageHandler = getattr(self, method_name, None)
if dispatch_function is not None:
await dispatch_function(event)
if event.bubble and self._parent:
await self._parent.post_message(event, priority)
async def on_message(self, message: Message) -> None:
pass

View file

@ -127,5 +127,5 @@ class LayoutView(View):
finally:
self.mouse_over = widget
await widget.post_message(
events.MouseMove(self, event.x - region.x, event.y - region.x)
events.MouseMove(self, event.x - region.x, event.y - region.y)
)

View file

@ -1,11 +1,13 @@
from logging import getLogger
from typing import ClassVar, NamedTuple, Optional, TYPE_CHECKING
from rich.align import Align
from rich.console import Console, ConsoleOptions, RenderResult, RenderableType
from rich.pretty import Pretty
from rich.panel import Panel
from rich.repr import rich_repr, RichReprResult
from typing import ClassVar, NamedTuple, Optional, TYPE_CHECKING
from . import events
from ._context import active_app
from .message_pump import MessagePump
@ -13,22 +15,14 @@ from .message_pump import MessagePump
if TYPE_CHECKING:
from .app import App
log = getLogger("rich")
class WidgetDimensions(NamedTuple):
width: int
height: int
class WidgetPlaceholder:
def __init__(self, widget: "Widget") -> None:
self.widget = widget
def __rich__(self) -> Panel:
return Panel(
Align.center(Pretty(self.widget), vertical="middle"), title="Widget"
)
@rich_repr
class Widget(MessagePump):
_count: ClassVar[int] = 0
@ -41,6 +35,7 @@ class Widget(MessagePump):
Widget._count += 1
self.size = WidgetDimensions(0, 0)
self.size_changed = False
self.mouse_over = False
super().__init__()
if not self.mouse_events:
self.disable_messages(events.MouseMove)
@ -64,7 +59,11 @@ class Widget(MessagePump):
def render(
self, console: Console, options: ConsoleOptions, new_size: WidgetDimensions
) -> RenderableType:
return WidgetPlaceholder(self)
return Panel(
Align.center(Pretty(self), vertical="middle"),
title=self.__class__.__name__,
border_style="green" if self.mouse_over else "blue",
)
def __rich_console__(
self, console: Console, options: ConsoleOptions
@ -73,3 +72,10 @@ class Widget(MessagePump):
renderable = self.render(console, options, new_size)
self.size = new_size
yield renderable
async def on_event(self, event: events.Event, priority: int) -> None:
if isinstance(event, (events.MouseEnter, events.MouseLeave)):
self.mouse_over = isinstance(event, events.MouseEnter)
log.debug("%r", self.mouse_over)
await self.refresh()
await super().on_event(event, priority)