1 # -*- coding: utf-8 -*- |
1 # -*- coding: utf-8 -*- |
2 |
2 |
3 class EventSource: |
3 class Emitter: |
4 |
|
5 '''Event source base class.''' |
|
6 |
4 |
7 def __init__(self): |
5 '''Event emitter mixin class.''' |
8 self.event = dict() |
|
9 |
6 |
10 def addevents(self, *events): |
7 def add_events(self, *event_names): |
11 '''Create new events with empty handler list.''' |
8 '''Add event names which may be registered by user. |
12 for event in events: |
|
13 self.event[event] = [] |
|
14 |
9 |
15 def connect(self, event, handler): |
10 This should be called only by subclasses. |
16 '''Add handler to handler list of the event.''' |
11 This serves also as initializer, other methods of Emitter |
17 if event in list(self.event.keys()): |
12 will not work if add_events was not called. |
18 self.event[event].append(handler) |
13 |
|
14 ''' |
|
15 if not hasattr(self, '_event_handlers'): |
|
16 self._event_handlers = dict() |
|
17 for event_name in event_names: |
|
18 self._event_handlers[event_name] = [] |
|
19 |
|
20 def connect(self, event_name, handler): |
|
21 '''Connect event handler to event name. |
|
22 |
|
23 Add handler to the end of handler list. |
|
24 |
|
25 ''' |
|
26 if event_name in list(self._event_handlers.keys()): |
|
27 self._event_handlers[event_name].append(handler) |
19 else: |
28 else: |
20 raise KeyError('Event %s not known.', event) |
29 raise KeyError('Unknown event: %s', event_name) |
21 |
30 |
22 def disconnect(self, event, handler=None): |
31 def disconnect(self, event_name, handler=None): |
23 '''Remove handler from event's handler list. |
32 '''Remove event handler from the list. |
24 |
33 |
25 If no handler is given, remove all handlers. |
34 If no handler is given, remove all handlers. |
26 |
35 |
27 ''' |
36 ''' |
28 if event in list(self.event.keys()): |
37 if event_name in list(self._event_handlers.keys()): |
29 if handler: |
38 if handler: |
30 self.event[event].remove(handler) |
39 self._event_handlers[event_name].remove(handler) |
31 else: |
40 else: |
32 self.event[event] = [] |
41 self._event_handlers[event_name][:] = [] |
33 else: |
42 else: |
34 raise KeyError('Event %s not known.', event) |
43 raise KeyError('Unknown event: %s', event_name) |
35 |
44 |
36 def handle(self, event, *args, **kwargs): |
45 def handle(self, event_name, *args, **kwargs): |
37 '''Call all handlers from event's handler list. |
46 '''Emit the event. |
38 |
47 |
39 This is used when user defined handlers are to be called. |
48 Call all handlers from event's handler list, |
|
49 starting from first added handler. |
|
50 |
|
51 Return True when one of the handlers returns True, |
|
52 False otherwise. |
40 |
53 |
41 ''' |
54 ''' |
42 handled = False |
55 handled = False |
43 for handler in self.event[event]: |
56 for handler in self._event_handlers[event_name]: |
44 res = handler(*args, **kwargs) |
57 res = handler(*args, **kwargs) |
45 if res: |
58 if res: |
46 handled = True |
59 handled = True |
47 return handled |
60 return handled |
48 |
61 |