Add WindowManager, basic event handling.
from tuikit.core.buffer import Buffer
from tuikit.core.signal import Signal
from tuikit.core.container import Container
from tuikit.core.coords import Point
class Window(Container):
"""Window is rectangular part of screen containing widgets.
Widgets are drawn into window, events are routed to widgets through window.
"""
def __init__(self, buffer=None):
"""New buffer for the window will be created unless given existing
`buffer` as parameter."""
Container.__init__(self)
self.pos = Point()
self._buffer = None
self.sig_resized = Signal()
self.buffer = buffer or Buffer()
@property
def x(self):
return self.pos.x
@property
def y(self):
return self.pos.y
@property
def buffer(self):
return self._buffer
@buffer.setter
def buffer(self, buffer):
# disconnect signals from old buffer
if self._buffer:
self.sig_resized.disconnect(self._buffer.resize)
# replace the buffer
self._buffer = buffer
# resize buffer when window gets resized
self.sig_resized.connect(buffer.resize)
@property
def size(self):
return self.buffer.size.readonly()
def resize(self, w, h):
self.buffer.resize(w, h)
self.sig_resized(w, h)
self.redraw()
def redraw(self):
Container.draw(self, self.buffer)
self.buffer.puts(10, 5, '{0.w} {0.h}'.format(self.size))
self.buffer.frame()
def draw(self, buffer, x=0, y=0):
"""Draw this window into `buffer` at x/y coords."""
buffer.draw(self.buffer, x, y)
class WindowManager:
def __init__(self):
self.windows = []
def add(self, window):
self.windows.append(window)
def resize(self, w, h):
self.windows[0].resize(w, h)
def draw(self, buffer, x=0, y=0):
for window in self.windows:
window.draw(buffer,
x + window.x,
y + window.y)
def handle_event(self, event_name, *args):
"""Handle input event to managed windows."""
handler = getattr(self, event_name, None)
if handler:
handler(*args)
else:
raise Exception('Unknown event: %r %r' % (event_name, args))