Source code for cytoflowgui.view_pane

#!/usr/bin/env python3.8
# coding: latin-1

# (c) Massachusetts Institute of Technology 2015-2018
# (c) Brian Teague 2018-2022
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

"""
cytoflowgui.view_pane
---------------------

Dock panes for modifying an `IWorkflowView`\s traits and the parameters
that are passed to `IView.plot`.

- `ViewDockPane` -- the dock pane to manipulate the traits of the currently
  selected view.
  
- `PlotParamsPane` -- the dock pane to manipulate the parameters passed to
  `IView.plot`. 
"""

from traits.api import Instance, List, Str, Dict, Tuple, observe
from pyface.tasks.api import TraitsDockPane, Task
from pyface.action.api import ToolBarManager
from pyface.tasks.action.api import TaskAction
from pyface.api import ImageResource
from pyface.qt import QtGui, QtCore

from .workflow_controller import WorkflowController
from .view_plugins import IViewPlugin
from .util import HintedMainWindow
    

[docs]class ViewDockPane(TraitsDockPane): """ A DockPane to manipulate the traits of the currently selected view. """ #### TaskPane interface ############################################### id = 'edu.mit.synbio.cytoflowgui.view_traits_pane' name = 'View Properties' # the Task that serves as the controller task = Instance(Task) # the IViewPlugins that the user can possibly choose. set by the controller # as we're instantiated view_plugins = List(IViewPlugin) # controller handler = Instance(WorkflowController) # the size of the toolbar icons IN INCHES image_size = Tuple((0.33, 0.33)) # task actions associated with views _actions = Dict(Str, TaskAction) # the default task action _default_action = Instance(TaskAction) _window = Instance(QtGui.QMainWindow)
[docs] def create_contents(self, parent): """ Create and return the toolkit-specific contents of the dock pane. """ dpi = self.control.physicalDpiX() image_size = (int(self.image_size[0] * dpi), int(self.image_size[1] * dpi)) self.toolbar = ToolBarManager(orientation = 'vertical', show_tool_names = False, image_size = image_size) self._default_action = TaskAction(name = "Setup View", on_perform = lambda: self.handler.activate_view('default'), image = ImageResource('setup'), style = 'toggle', visible = False) self.toolbar.append(self._default_action) for plugin in self.plugins: task_action = TaskAction(name = plugin.short_name, on_perform = lambda view_id=plugin.view_id: self.handler.activate_view(view_id), image = plugin.get_icon(), style = 'toggle') self._actions[plugin.view_id] = task_action self.toolbar.append(task_action) # see the comment in cytoflowgui.view_pane for an explanation of this # HintedMainWindow business. self._window = window = HintedMainWindow() window.addToolBar(QtCore.Qt.RightToolBarArea, self.toolbar.create_tool_bar(window)) self.ui = self.handler.edit_traits(view = 'selected_view_traits_view', context = self.model, kind = 'subpanel', parent = window) window.setCentralWidget(self.ui.control) window.setParent(parent) parent.setWidget(window) window.setEnabled(False) self.ui.control.setEnabled(False) return window
@observe('model.selected.status') def _selected_status_changed(self, event): if self.model.selected: if self._window: self._window.setEnabled(True) if self.ui: self.ui.control.setEnabled(True) else: if self._window: self._window.setEnabled(False) if self.ui: self.ui.control.setEnabled(False) @observe('model:selected.current_view') def _selected_view_changed(self, event): # is there a default view for this workflow item? if self.model.selected and self.model.selected.default_view: self._default_action.visible = True else: self._default_action.visible = False # untoggle everything on the toolbar self._default_action.checked = False for action in self._actions.values(): action.checked = False # toggle the right button if self.model.selected and self.model.selected.current_view: view_id = self.model.selected.current_view.id if self.model.selected.default_view and self.model.selected.default_view.id == view_id: self._default_action.checked = True else: self._actions[view_id].checked = True
[docs]class PlotParamsPane(TraitsDockPane): id = 'edu.mit.synbio.cytoflowgui.params_pane' name = "Plot Parameters" # controller handler = Instance(WorkflowController) closable = True dock_area = 'right' floatable = True movable = True visible = True
[docs] def create_contents(self, parent): """ Create and return the toolkit-specific contents of the dock pane. """ self.ui = self.handler.edit_traits(view = 'selected_view_params_view', context = self.model, kind='subpanel', parent=parent, scrollable = True) return self.ui.control