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:
@@ -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
|
||||
|
Reference in New Issue
Block a user