Changed generic observer pattern and project dependency in plots to be a two-way selection-listener model.

The project listens to selections done in plot and broadcasts it back to all plots (including source) which allows them to redraw properly.
This commit is contained in:
2006-04-27 14:38:48 +00:00
parent c6ef6cdb07
commit 5bb93af6f0
2 changed files with 26 additions and 37 deletions

View File

@@ -12,35 +12,20 @@ class Project:
self.name = name
self.dim_names = []
self._observers = {}
self._selection_observers = []
self.current_data = None
self.datasets = []
self.sel_obj = dataset.Selection()
def attach(self,observer,key):
"""Attach observer for selection updates"""
if not self._observers.has_key(key):
self._observers[key]=[]
if not observer in self._observers[key]:
self._observers[key].append(observer)
def detach(self,observer,key):
"""Detach observer for selection updates"""
try:
self._observers[key].remove(observer)
except ValueError:
pass
def notify(self,key,modifier=None):
def notify_selection_listeners(self):
"""Notifies observers"""
for observer in self._observers[key]:
if modifier != observer:
observer.update(key)
for observer in self._selection_observers:
observer.selection_changed(self.get_selection())
def set_selection(self,dim_name,selection):
"""Sets a current selection and notify observers"""
self.sel_obj.current_selection[dim_name] = set(selection)
self.notify('selection_update')
self.notify_selection_listeners()
def get_selection(self):
"""Returns the current selection object"""
@@ -71,10 +56,9 @@ class Project:
self.add_dataset(d)
self.data_tree_insert(it, d.get_name(), d)
elif isinstance(d, plots.Plot):
# self.add_view(d)
self.data_tree_insert(it, d.get_title(), d)
d.set_project(self)
self.attach(d, 'selection_update')
d.set_selection_listener(self.set_selection)
self._selection_observers.append(d)
def data_tree_insert(self, parent, text, data):
tree = self.data_tree