|
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) |