1
2 """
3 File: signal.py
4 Author: Thiago Marcos P. Santos
5 Created: August 28, 2008
6
7 Purpose: A signal/slot implementation
8 Source: http://code.activestate.com/recipes/576477/
9
10 A Signal calls all the callbacks registered in its slots whenever it state
11 changes.
12 """
13 from rats import sig
14 import unittest
15
16 VERBOSE = False
17
19 """
20 Tests the signal/slot pattern.
21 """
23 class Model(object):
24 def __init__(self, value):
25 self._value = value
26 self.changed = sig.Signal()
27
28 def set_value(self, value):
29 self._value = value
30 self.changed()
31
32 def get_value(self):
33 return self._value
34
35 class View(object):
36 def __init__(self, model, test):
37 self.model = model
38 self.test = test
39 model.changed.connect(self.model_changed)
40
41 def model_changed(self):
42 self.new_value = self.model.get_value()
43 if VERBOSE:
44 print("New value : %d" % (self.new_value))
45
46
47 model = Model(10)
48 view1 = View(model, self)
49 view2 = View(model, self)
50 view3 = View(model, self)
51
52 model.set_value(20)
53
54 del view1
55 model.set_value(30)
56
57 model.changed.disconnect(view2.model_changed)
58 model.set_value(15)
59 if view2.new_value == 15:
60 self.fail("view2 slot should not have been triggered.")
61
62 model.changed.clear()
63 model.set_value(40)
64 if view3.new_value == 40:
65 self.fail("view3 slot should not have been triggered.")
66