diff --git a/fluents/fluents.py b/fluents/fluents.py index cf1b859..64fe361 100644 --- a/fluents/fluents.py +++ b/fluents/fluents.py @@ -197,12 +197,13 @@ class FluentApp: tb = ViewFrameToolButton() self['toolbar'].add(tb) - def set_project(self, project): + def set_project(self, proj): logger.log('notice', 'Creating a new project') - self.project = project - self.workflow.add_project(self.project) - self.navigator_view.add_project(self.project) - self.dimlistcontroller.set_project(project) + self.project = proj + project.project = proj + self.workflow.add_project(proj) + self.navigator_view.add_project(proj) + self.dimlistcontroller.set_project(proj) def set_workflow(self, workflow): self.workflow = workflow diff --git a/fluents/project.py b/fluents/project.py index 555393b..ab75992 100644 --- a/fluents/project.py +++ b/fluents/project.py @@ -135,3 +135,8 @@ class Project: def set_current_data(self, obj): self.current_data = obj + +## Singleton project. +## This is the current and only project in the application. +project = None + diff --git a/workflows/go_workflow.py b/workflows/go_workflow.py index 00615ea..d5a8b99 100644 --- a/workflows/go_workflow.py +++ b/workflows/go_workflow.py @@ -1,5 +1,5 @@ import gtk -from fluents import dataset, logger, plots, workflow, fluents +from fluents import dataset, logger, plots, workflow, fluents, project from fluents.lib import blmfuncs import geneontology #import gostat @@ -77,6 +77,11 @@ class GeneOntologyTree (gtk.HPaned): self._treemodel = treemodel self._tree_view = gtk.TreeView(treemodel) + # Set up context menu + self._context_menu = GoTermContextMenu(treemodel, self._tree_view) + self._tree_view.connect('popup_menu', self._popup_menu) + self._tree_view.connect('button_press_event', self._on_button_press) + renderer = gtk.CellRendererText() go_column = gtk.TreeViewColumn('GO ID', renderer, text=0) self._tree_view.insert_column(go_column, 0) @@ -102,6 +107,54 @@ class GeneOntologyTree (gtk.HPaned): self._desc_view.set_go_term(term) + ## + ## GTK Callback functions + ## + def _popup_menu(self, *rest): + self.menu.popup(None, None, None, 0, 0) + + def _on_button_press(self, widget, event): + path = widget.get_path_at_pos(int(event.x), int(event.y)) + iter = None + + if path: + iter = self._treemodel.get_iter(path[0]) + obj = self._treemodel.get_value(iter, 2) + else: + obj = None + + self._context_menu.set_current_term(obj) + + if event.button == 3: + self._context_menu.popup(None, None, None, event.button, event.time) + + +class GoTermContextMenu (gtk.Menu): + """Context menu for GO terms in the gene ontology browser""" + + def __init__(self, treemodel, treeview): + self._treemodel = treemodel + self._treeview = treeview + self._current_term = None + + gtk.Menu.__init__(self) + + # Popuplate tree + self._select_subtree_item = i = gtk.MenuItem('Select subtree') + i.connect('activate', self._on_select_subtree, treemodel, treeview) + self.append(i) + i.show() + + def set_current_term(self, term): + self._current_term = term + + def _on_select_subtree(self, item, treemodel, treeview): + logger.log('notice', 'Selecting subtree from GO id: %s (%s)' % + (self._current_term['id'], self._current_term['name'])) + ids = [x['id'] for x in networkx.bfs(go, self._current_term)] + project.project.set_selection('go-terms', set(ids)) + + class GoWorkflow (workflow.Workflow): name = 'Gene Ontology'