tuikit/eventsource.py
changeset 32 088b92ffb119
parent 13 19ebde2fd594
equal deleted inserted replaced
31:629d5edb1602 32:088b92ffb119
     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