Move quit event handling to the interface and flatten the Action class hierarchy. There are no longer any actions that don't take an Actor. This has the happy side effect of resolving some pylint errors too. :)
55 lines
1.6 KiB
Python
55 lines
1.6 KiB
Python
# Eryn Wells <eryn@erynwells.me>
|
|
|
|
'''Defines event handling mechanisms.'''
|
|
|
|
from typing import NoReturn, TYPE_CHECKING
|
|
|
|
from tcod import event as tev
|
|
|
|
if TYPE_CHECKING:
|
|
from . import Interface
|
|
|
|
|
|
class InterfaceEventHandler(tev.EventDispatch[bool]):
|
|
'''The event handler for the user interface.'''
|
|
|
|
def __init__(self, interface: 'Interface'):
|
|
super().__init__()
|
|
self.interface = interface
|
|
|
|
self._handlers = []
|
|
self._refresh_handlers()
|
|
|
|
def _refresh_handlers(self):
|
|
self._handlers = [
|
|
self.interface.map_window.event_handler,
|
|
self.interface.message_window.event_handler,
|
|
self.interface.info_window.event_handler,
|
|
]
|
|
|
|
def ev_keydown(self, event: tev.KeyDown) -> bool:
|
|
return self._handle_event(event)
|
|
|
|
def ev_keyup(self, event: tev.KeyUp) -> bool:
|
|
return self._handle_event(event)
|
|
|
|
def ev_mousemotion(self, event: tev.MouseMotion) -> bool:
|
|
return self._handle_event(event)
|
|
|
|
def ev_mousebuttondown(self, event: tev.MouseButtonDown) -> bool:
|
|
return self._handle_event(event)
|
|
|
|
def ev_mousebuttonup(self, event: tev.MouseButtonUp) -> bool:
|
|
return self._handle_event(event)
|
|
|
|
def ev_quit(self, event: tev.Quit) -> NoReturn:
|
|
# TODO: Maybe show a "do you want to quit?" alert?
|
|
# TODO: Probably inform the engine that we're shutting down.
|
|
raise SystemExit()
|
|
|
|
def _handle_event(self, event: tev.Event) -> bool:
|
|
for handler in self._handlers:
|
|
if handler and handler.dispatch(event):
|
|
return True
|
|
|
|
return False
|