author | Radek Brich <radek.brich@devl.cz> |
Sat, 21 Feb 2015 12:01:57 +0100 | |
changeset 118 | 8c7970520632 |
parent 111 | b055add74b18 |
permissions | -rw-r--r-- |
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) |
|
118
8c7970520632
Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents:
111
diff
changeset
|
54 |
|
8c7970520632
Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents:
111
diff
changeset
|
55 |
|
8c7970520632
Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents:
111
diff
changeset
|
56 |
class MouseEvent(Event): |
8c7970520632
Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents:
111
diff
changeset
|
57 |
|
8c7970520632
Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents:
111
diff
changeset
|
58 |
def __init__(self, name, button, pos, relpos=None): |
8c7970520632
Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents:
111
diff
changeset
|
59 |
Event.__init__(self, name, |
8c7970520632
Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents:
111
diff
changeset
|
60 |
('name', 'button', 'pos', 'relpos'), |
8c7970520632
Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents:
111
diff
changeset
|
61 |
(name, button, pos, relpos)) |
8c7970520632
Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents:
111
diff
changeset
|
62 |
|
8c7970520632
Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents:
111
diff
changeset
|
63 |
def rebase(self, zero_pos): |
8c7970520632
Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents:
111
diff
changeset
|
64 |
"""Return new MouseEvent with position rebased to zero_pos.""" |
8c7970520632
Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents:
111
diff
changeset
|
65 |
pos = self.pos - zero_pos |
8c7970520632
Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents:
111
diff
changeset
|
66 |
return MouseEvent(self.name, self.button, pos, self.relpos) |