doc: Document the cola.qt module
[git-cola.git] / cola / observable.py
blob019ae5d1c6cc3110b66eefb8778ffb599de139d6
1 # Copyright (c) 2008 David Aguilar
2 """This module provides the Observable class"""
4 import types
5 from cola.compat import set
7 class Observable(object):
8 """Handles subject/observer notifications."""
9 def __init__(self):
10 self.observers = set()
11 self.message_observers = {}
12 self.notification_enabled = True
14 def add_observer(self, observer):
15 """Adds an observer to this model"""
16 self.observers.add(observer)
18 def add_message_observer(self, message, observer):
19 """Add an observer for a specific message."""
20 observers = self.message_observers.setdefault(message, set())
21 observers.add(observer)
23 def remove_observer(self, observer):
24 """Remove an observer."""
25 if observer in self.observers:
26 self.observers.remove(observer)
27 for message, observers in self.message_observers.items():
28 if observer in observers:
29 observers.remove(observer)
31 def notify_observers(self, *param):
32 """Notifies observers about attribute changes"""
33 if not self.notification_enabled:
34 return
35 for observer in self.observers:
36 observer.notify(*param)
38 def notify_message_observers(self, message, *args, **opts):
39 """Pythonic signals and slots."""
40 if not self.notification_enabled:
41 return
42 observers = self.message_observers.get(message, ())
43 for method in observers:
44 method(*args, **opts)