Add mouse events, event demo.
from collections import OrderedDict
class Event:
"""Base class for events."""
def __init__(self, event_name=None, arg_names=(), arg_values=()):
self.name = event_name
self.args = OrderedDict(zip(arg_names, arg_values))
def __getattr__(self, item):
if item in self.args:
return self.args[item]
else:
raise AttributeError(item)
def __getitem__(self, key):
return self.args[key]
def __repr__(self):
return '{}({})'.format(self.__class__.__name__,
', '.join("%s=%r" % (k,v) for k,v
in self.args.items()))
class ResizeEvent(Event):
def __init__(self, w, h):
Event.__init__(self, 'resize', ('w', 'h'), (w, h))
class KeypressEvent(Event):
def __init__(self, keyname, char, mods):
Event.__init__(self, 'keypress',
('keyname', 'char', 'mods'),
(keyname, char, mods))
def mod_key(self, sep='+'):
"""Return combined key with modifiers.
E.g. "shift+tab"
Order of modifiers is fixed: ctrl, alt, meta, shift
"""
res = []
for mod in ('ctrl', 'alt', 'meta', 'shift'):
if mod in self.mods:
res.append(mod)
res.append(self.keyname or self.char)
return sep.join(res)
class MouseEvent(Event):
def __init__(self, name, button, pos, relpos=None):
Event.__init__(self, name,
('name', 'button', 'pos', 'relpos'),
(name, button, pos, relpos))
def rebase(self, zero_pos):
"""Return new MouseEvent with position rebased to zero_pos."""
pos = self.pos - zero_pos
return MouseEvent(self.name, self.button, pos, self.relpos)