Source code for cytoflowgui.view_plugins.view_plugin_base
'''
Created on Jan 16, 2021
@author: brian
'''
import inspect, pathlib
from traits.api import HasTraits, observe, HTML, Instance
from traitsui.api import View, Item, HGroup, TextEditor, Controller, TupleEditor
from pyface.qt import QtGui
from ..editors import TabListEditor
[docs]class PluginHelpMixin(HasTraits):
"""
A mixin to get online HTML help for a class. It determines the HTML
path name from the class name.
"""
_cached_help = HTML
[docs] def get_help(self):
"""
Gets the HTML help for this class.
Returns
-------
string
The HTML help in a single string.
"""
# we name the help files the same as the module name for
# the plugin. so, use the inspect module to figure that out.
if self._cached_help == "":
class_path = pathlib.PurePath(inspect.getfile(self.__class__))
help_file = class_path.parents[1] / 'help' / 'views' / (class_path.stem + '.html')
with open(help_file, encoding = 'utf-8') as f:
self._cached_help = f.read()
return self._cached_help
[docs]class ViewHandler(Controller):
"""
Useful bits for view handlers.
"""
context = Instance('cytoflowgui.workflow.workflow_item.WorkflowItem')
# the view for the current plot (tab editor at the top of the plot window)
view_plot_name_view = \
View(HGroup(Item('context.plot_names_label',
editor = TextEditor(),
style = "readonly",
show_label = False),
Item('current_plot',
editor = TabListEditor(name = 'context.plot_names'),
style = 'custom',
show_label = False)))
@observe('context:plot_names,context:plot_names.items', post_init = True)
def _plot_names_changed(self, _):
if self.model and not self.context.plot_names:
self.model.current_plot = ""
@observe('context.view_error_trait', dispatch = 'ui', post_init = True)
def _view_trait_error(self, _):
# check if we're getting called on the local or remote process
if self.info is None or self.info.ui is None:
return
for ed in self.info.ui._editors:
if ed.name == self.context.view_error_trait:
err_state = True
else:
err_state = False
if not ed.label_control:
continue
item = ed.label_control
if not err_state and not hasattr(item, '_ok_color'):
continue
pal = QtGui.QPalette(item.palette())
if err_state:
setattr(item,
'_ok_color',
QtGui.QColor(pal.color(item.backgroundRole())))
pal.setColor(item.backgroundRole(), QtGui.QColor(255, 145, 145))
item.setAutoFillBackground(True)
item.setPalette(pal)
else:
pal.setColor(item.backgroundRole(), item._ok_color)
delattr(item, '_ok_color')
item.setAutoFillBackground(False)
item.setPalette(pal)
BasePlotParamsView = View(Item('title',
editor = TextEditor(auto_set = False,
placeholder = "None")),
Item('xlabel',
label = "X label",
editor = TextEditor(auto_set = False,
placeholder = "None")),
Item('ylabel',
label = "Y label",
editor = TextEditor(auto_set = False,
placeholder = "None")),
Item('huelabel',
label = "Hue label",
editor = TextEditor(auto_set = False,
placeholder = "None")),
Item('col_wrap',
label = "Columns",
editor = TextEditor(auto_set = False,
placeholder = "None",
format_func = lambda x: "" if x is None else str(x))),
Item('sns_style',
label = "Style"),
Item('sns_context',
label = "Context"),
Item('legend',
label = "Show legend?"),
Item('sharex',
label = "Share\nX axis?"),
Item('sharey',
label = "Share\nY axis?"),
Item('despine',
label = "Despine?"))
DataPlotParamsView = View(Item('min_quantile',
editor = TextEditor(auto_set = False,
placeholder = "None")),
Item('max_quantile',
editor = TextEditor(auto_set = False,
placeholder = "None")),
BasePlotParamsView.content)
Data1DPlotParamsView = View(Item('orientation'),
Item('lim',
label = "Data\nLimits",
editor = TupleEditor(editors = [TextEditor(auto_set = False,
evaluate = float,
placeholder = "None",
format_func = lambda x: "" if x is None else str(x)),
TextEditor(auto_set = False,
evaluate = float,
placeholder = "None",
format_func = lambda x: "" if x is None else str(x))],
labels = ["Min", "Max"],
cols = 1)),
DataPlotParamsView.content)
Data2DPlotParamsView = View(Item('xlim',
label = "X Limits",
editor = TupleEditor(editors = [TextEditor(auto_set = False,
evaluate = float,
placeholder = "None",
format_func = lambda x: "" if x is None else str(x)),
TextEditor(auto_set = False,
evaluate = float,
placeholder = "None",
format_func = lambda x: "" if x is None else str(x))],
labels = ["Min", "Max"],
cols = 1)),
Item('ylim',
label = "Y Limits",
editor = TupleEditor(editors = [TextEditor(auto_set = False,
evaluate = float,
placeholder = "None",
format_func = lambda x: "" if x is None else str(x)),
TextEditor(auto_set = False,
evaluate = float,
placeholder = "None",
format_func = lambda x: "" if x is None else str(x))],
labels = ["Min", "Max"],
cols = 1)),
DataPlotParamsView.content)
Stats1DPlotParamsView = View(Item('orientation'),
Item('lim',
label = "Limits",
editor = TupleEditor(editors = [TextEditor(auto_set = False,
evaluate = float,
placeholder = "None",
format_func = lambda x: "" if x is None else str(x)),
TextEditor(auto_set = False,
evaluate = float,
placeholder = "None",
format_func = lambda x: "" if x is None else str(x))],
labels = ["Min", "Max"],
cols = 1)),
BasePlotParamsView.content)
Stats2DPlotParamsView = View(Item('xlim',
label = "X Limits",
editor = TupleEditor(editors = [TextEditor(auto_set = False,
evaluate = float,
placeholder = "None",
format_func = lambda x: "" if x is None else str(x)),
TextEditor(auto_set = False,
evaluate = float,
placeholder = "None",
format_func = lambda x: "" if x is None else str(x))],
labels = ["Min", "Max"],
cols = 1)),
Item('ylim',
label = "Y Limits",
editor = TupleEditor(editors = [TextEditor(auto_set = False,
evaluate = float,
placeholder = "None",
format_func = lambda x: "" if x is None else str(x)),
TextEditor(auto_set = False,
evaluate = float,
placeholder = "None",
format_func = lambda x: "" if x is None else str(x))],
labels = ["Min", "Max"],
cols = 1)),
BasePlotParamsView.content)