111
|
1 |
from collections import OrderedDict
|
|
2 |
|
|
3 |
|
|
4 |
class Event:
|
|
5 |
|
|
6 |
"""Base class for events."""
|
|
7 |
|
|
8 |
def __init__(self, event_name=None, arg_names=(), arg_values=()):
|
|
9 |
self.name = event_name
|
|
10 |
self.args = OrderedDict(zip(arg_names, arg_values))
|
|
11 |
|
|
12 |
def __getattr__(self, item):
|
|
13 |
if item in self.args:
|
|
14 |
return self.args[item]
|
|
15 |
else:
|
|
16 |
raise AttributeError(item)
|
|
17 |
|
|
18 |
def __getitem__(self, key):
|
|
19 |
return self.args[key]
|
|
20 |
|
|
21 |
def __repr__(self):
|
|
22 |
return '{}({})'.format(self.__class__.__name__,
|
|
23 |
', '.join("%s=%r" % (k,v) for k,v
|
|
24 |
in self.args.items()))
|
|
25 |
|
|
26 |
|
|
27 |
class ResizeEvent(Event):
|
|
28 |
|
|
29 |
def __init__(self, w, h):
|
|
30 |
Event.__init__(self, 'resize', ('w', 'h'), (w, h))
|
|
31 |
|
|
32 |
|
|
33 |
class KeypressEvent(Event):
|
|
34 |
|
|
35 |
def __init__(self, keyname, char, mods):
|
|
36 |
Event.__init__(self, 'keypress',
|
|
37 |
('keyname', 'char', 'mods'),
|
|
38 |
(keyname, char, mods))
|
|
39 |
|
|
40 |
def mod_key(self, sep='+'):
|
|
41 |
"""Return combined key with modifiers.
|
|
42 |
|
|
43 |
E.g. "shift+tab"
|
|
44 |
|
|
45 |
Order of modifiers is fixed: ctrl, alt, meta, shift
|
|
46 |
|
|
47 |
"""
|
|
48 |
res = []
|
|
49 |
for mod in ('ctrl', 'alt', 'meta', 'shift'):
|
|
50 |
if mod in self.mods:
|
|
51 |
res.append(mod)
|
|
52 |
res.append(self.keyname or self.char)
|
|
53 |
return sep.join(res)
|