From 7693f336ba9a89d7cfa7c7b8c0e9a169cccbf608 Mon Sep 17 00:00:00 2001 From: einarr Date: Thu, 18 Jan 2007 15:45:48 +0000 Subject: [PATCH] Added a singleton project in the project module, so that the current project is easily accessible from anywhere in the code. As there is only one project at any given time this should not be a problem. The Gene Ontology browser needed this to be able to set the selection without passing the current project through several constructors. Added a context menu in the GO browser that allows the user to select all GO terms in the subgraph that starts on the current node. --- fluents/fluents.py | 11 ++++---- fluents/project.py | 5 ++++ workflows/go_workflow.py | 55 +++++++++++++++++++++++++++++++++++++++- 3 files changed, 65 insertions(+), 6 deletions(-) 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'