2009-27-09 Mark Doffman <mark.doffman@codethink.co.uk>
[platform/core/uifw/at-spi2-atk.git] / tests / pyatspi / pasytest / Events.py
1 #C#-Style Events in Python
2 #Taken from http://code.activestate.com/recipes/410686/
3 #By Zoran Isailovski
4
5 class Events:
6         def __getattr__(self, name):
7                 if hasattr(self.__class__, '__events__'):
8                         assert name in self.__class__.__events__, \
9                                          "Event '%s' is not declared" % name
10                 self.__dict__[name] = ev = _EventSlot(name)
11                 return ev
12         def __repr__(self): return 'Events' + str(list(self))
13         __str__ = __repr__
14         def __len__(self): return NotImplemented
15         def __iter__(self):
16                 def gen(dictitems=self.__dict__.items()):
17                         for attr, val in dictitems:
18                                 if isinstance(val, _EventSlot):
19                                         yield val
20                 return gen()
21
22 #------------------------------------------------------------------------------
23
24 class _EventSlot:
25         def __init__(self, name):
26                 self.targets = []
27                 self.__name__ = name
28         def __repr__(self):
29                 return 'event ' + self.__name__
30         def __call__(self, *a, **kw):
31                 for f in self.targets: f(*a, **kw)
32         def __iadd__(self, f):
33                 self.targets.append(f)
34                 return self
35         def __isub__(self, f):
36                 while f in self.targets: self.targets.remove(f)
37                 return self
38
39 #------------------------------------------------------------------------------
40
41 if __name__ == '__main__':
42
43         class MyEvents(Events):
44                 __events__ = ('OnChange', )
45
46         class ValueModel(object):
47                 def __init__(self):
48                         self.events = MyEvents()
49                         self.__value = None
50                 def __set(self, value):
51                         if (self.__value == value): return
52                         self.__value = value
53                         self.events.OnChange()
54                         ##self.events.OnChange2() # would fail
55                 def __get(self):
56                         return self.__value
57                 Value = property(__get, __set, None, 'The actual value')
58
59         class SillyView(object):
60                 def __init__(self, model):
61                         self.model = model
62                         model.events.OnChange += self.DisplayValue
63                         ##model.events.OnChange2 += self.DisplayValue # would raise exeception
64                 def DisplayValue(self):
65                         print self.model.Value
66
67
68         model = ValueModel()
69         view = SillyView(model)
70
71         print '\n--- Events Demo ---'
72         # Events in action
73         for i in range(5):
74                 model.Value = 2*i + 1
75         # Events introspection
76         print model.events
77         for event in model.events:
78                 print event