Source code for fsleyes.controls.overlaydisplaytoolbar
#
# overlaydisplaytoolbar.py - The OverlayDisplayToolBar.
#
# Author: Paul McCarthy <pauldmccarthy@gmail.com>
"""This module provides the :class:`OverlyDisplyaToolBar`, a
:class:`.ControlToolBar` containing controls for changing the display settings
of the currently selected overlay.
"""
import logging
import os.path as op
import wx
import fsleyes_props as props
import fsleyes_widgets.utils.typedict as td
import fsleyes.controls.controlpanel as ctrlpanel
import fsleyes.icons as icons
import fsleyes.tooltips as fsltooltips
import fsleyes.actions as actions
import fsleyes.colourmaps as fslcm
import fsleyes.strings as strings
log = logging.getLogger(__name__)
[docs]class OverlayDisplayToolBar(ctrlpanel.ControlToolBar):
"""The ``OverlyDisplyaToolBar`` is a :class:`.ControlToolBar` containing
controls which allow the user to change the display settings of the
currently selected overlay (as defined by the
:attr:`.DisplayContext.selectedOverlay` property). The display settings
for an overlay are contained in the :class:`.Display` and
:class:`.DisplayOpts` instances that are associated with that overlay.
An ``OverlyDisplyaToolBar`` looks something like the following:
.. image:: images/overlaydisplaytoolbar.png
:scale: 50%
:align: center
The specific controls which are displayed are defined in the
:attr:`_TOOLBAR_PROPS` dictionary, and are created by the following
methods:
.. autosummary::
:nosignatures:
_OverlayDisplayToolBar__makeDisplayTools
_OverlayDisplayToolBar__makeVolumeOptsTools
_OverlayDisplayToolBar__makeMaskOptsTools
_OverlayDisplayToolBar__makeLabelOptsTools
_OverlayDisplayToolBar__makeVectorOptsTools
_OverlayDisplayToolBar__makeRGBVectorOptsTools
_OverlayDisplayToolBar__makeLineVectorOptsTools
_OverlayDisplayToolBar__makeMeshOptsTools
_OverlayDisplayToolBar__makeGiftiOptsTools
_OverlayDisplayToolBar__makeFreesurferOptsTools
_OverlayDisplayToolBar__makeTensorOptsTools
_OverlayDisplayToolBar__makeSHOptsTools
_OverlayDisplayToolBar__makeMIPOptsTools
"""
[docs] def __init__(self, parent, overlayList, displayCtx, frame, viewPanel):
"""Create an ``OverlyDisplyaToolBar``.
:arg parent: The :mod:`wx` parent object.
:arg overlayList: The :class:`.OverlayList` instance.
:arg displayCtx: The :class:`.DisplayContext` instance.
:arg frame: The :class:`.FSLeyesFrame` instance.
:arg viewPanel: The :class:`.ViewPanel` which this
``OverlayDisplayToolBar`` is owned by.
"""
ctrlpanel.ControlToolBar.__init__(self,
parent,
overlayList,
displayCtx,
frame,
height=24,
kbFocus=True)
self.__viewPanel = viewPanel
self.__currentOverlay = None
self.displayCtx.addListener(
'selectedOverlay',
self.name,
self.__selectedOverlayChanged)
self.overlayList.addListener(
'overlays',
self.name,
self.__selectedOverlayChanged)
self.__selectedOverlayChanged()
[docs] def destroy(self):
"""Must be called when this ``OverlyDisplyaToolBar`` is no longer
needed. Removes some property listeners, and calls the
:meth:`.ControlToolBar.destroy` method.
"""
self.overlayList.removeListener('overlays', self.name)
self.displayCtx .removeListener('selectedOverlay', self.name)
if self.__currentOverlay is not None and \
self.__currentOverlay in self.overlayList:
display = self.displayCtx.getDisplay(self.__currentOverlay)
display.removeListener('overlayType', self.name)
display.removeListener('enabled', self.name)
self.__currentOverlay = None
self.__viewPanel = None
ctrlpanel.ControlToolBar.destroy(self)
[docs] @staticmethod
def supportedViews():
"""Overrides :meth:`.ControlMixin.supportedViews`. The
``OverlayDisplayToolBar`` is only intended to be added to
:class:`.OrthoPanel`, :class:`.LightBoxPanel`, or
:class:`.Scene3DPanel` views.
"""
from fsleyes.views.orthopanel import OrthoPanel
from fsleyes.views.lightboxpanel import LightBoxPanel
from fsleyes.views.scene3dpanel import Scene3DPanel
return [OrthoPanel, LightBoxPanel, Scene3DPanel]
def __showTools(self, overlay):
"""Creates and shows a set of controls allowing the user to change
the display settings of the specified ``overlay``.
"""
oldTools = self.GetTools()
# See long comment at bottom
def destroyOldTools():
for t in oldTools:
t.Destroy()
for t in oldTools:
t.Show(False)
self.ClearTools(destroy=False, postevent=False)
log.debug('Showing tools for {}'.format(overlay))
display = self.displayCtx.getDisplay(overlay)
opts = display.opts
tools = []
nav = []
# Display tools
dispTools, dispNav = self.__makeDisplayTools(display)
tools.extend(dispTools)
nav .extend(dispNav)
# DisplayOpts tools
makeFunc = getattr(self, '_{}__make{}Tools'.format(
type(self).__name__, type(opts).__name__), None)
if makeFunc is not None:
optsTools, optsNav = makeFunc(opts)
tools.extend(optsTools)
nav .extend(optsNav)
self.SetTools( tools)
self.setNavOrder(nav)
# This method may have been called via an
# event handler an existing tool in the
# toolbar - in this situation, destroying
# that tool will result in nasty crashes,
# as the wx widget that generated the event
# will be destroyed while said event is
# being processed. So we destroy the old
# tools asynchronously, well after the event
# which triggered this method call will have
# returned.
wx.CallLater(1000, destroyOldTools)
def __overlayEnableChanged(self, *a):
"""Called when the :attr:`.Display.enabled` property for the currently
selected overlay changes. Enables/disables this
``OverlayDisplayToolBar`` accordingly.
"""
display = self.displayCtx.getDisplay(self.__currentOverlay)
self.Enable(display.enabled)
def __selectedOverlayChanged(self, *a):
"""Called when the :attr:`.DisplayContext.selectedOverlay` or
:class:`.OverlayList` changes. Ensures that controls for the currently
selected overlay are being shown.
"""
if self.__currentOverlay is not None and \
self.__currentOverlay in self.overlayList:
display = self.displayCtx.getDisplay(self.__currentOverlay)
display.removeListener('overlayType', self.name)
display.removeListener('enabled', self.name)
overlay = self.displayCtx.getSelectedOverlay()
self.__currentOverlay = overlay
if overlay is None:
self.ClearTools(destroy=True)
return
display = self.displayCtx.getDisplay(overlay)
display.addListener('enabled',
self.name,
self.__overlayEnableChanged)
display.addListener('overlayType',
self.name,
self.__selectedOverlayChanged)
self.__showTools(overlay)
self.Enable(display.enabled)
def __makeDisplayTools(self, display):
"""Creates and returns a collection of controls for editing properties
of the given :class:`.Display` instance.
"""
viewPanel = self.__viewPanel
# Display settings
nameSpec = _TOOLBAR_PROPS[display, 'name']
typeSpec = _TOOLBAR_PROPS[display, 'overlayType']
alphaSpec = _TOOLBAR_PROPS[display, 'alpha']
briSpec = _TOOLBAR_PROPS[display, 'brightness']
conSpec = _TOOLBAR_PROPS[display, 'contrast']
# Buttons which toggle overlay
# info and display panel
panelSpec = actions.ToggleActionButton(
'toggleDisplayPanel',
actionKwargs={'floatPane' : True},
icon=[icons.findImageFile('gearHighlight24'),
icons.findImageFile('gear24')],
tooltip=fsltooltips.actions[viewPanel, 'toggleDisplayPanel'])
infoSpec = actions.ToggleActionButton(
'toggleOverlayInfo',
actionKwargs={'floatPane' : True},
icon=[icons.findImageFile('informationHighlight24'),
icons.findImageFile('information24')],
tooltip=fsltooltips.actions[viewPanel, 'toggleOverlayInfo'])
# Name/overlay type and brightness/contrast
# are respectively placed together
nameTypePanel = wx.Panel(self)
briconPanel = wx.Panel(self)
nameTypeSizer = wx.BoxSizer(wx.VERTICAL)
briconSizer = wx.FlexGridSizer(2, 2, 0, 0)
briconSizer.AddGrowableCol(1)
nameTypePanel.SetSizer(nameTypeSizer)
briconPanel .SetSizer(briconSizer)
panelWidget = props.buildGUI(self, viewPanel, panelSpec)
infoWidget = props.buildGUI(self, viewPanel, infoSpec)
nameWidget = props.buildGUI(nameTypePanel, display, nameSpec)
typeWidget = props.buildGUI(nameTypePanel, display, typeSpec)
briWidget = props.buildGUI(briconPanel, display, briSpec)
conWidget = props.buildGUI(briconPanel, display, conSpec)
alphaWidget = props.buildGUI(self, display, alphaSpec)
briLabel = wx.StaticText(briconPanel)
conLabel = wx.StaticText(briconPanel)
briLabel.SetLabel(strings.properties[display, 'brightness'])
conLabel.SetLabel(strings.properties[display, 'contrast'])
# name/type panel
nameTypeSizer.Add(nameWidget, flag=wx.EXPAND)
nameTypeSizer.Add(typeWidget, flag=wx.EXPAND)
# opacity is given a label
alphaPanel = self.MakeLabelledTool(
alphaWidget, strings.properties[display, 'alpha'])
# bricon panel
briconSizer.Add(briLabel)
briconSizer.Add(briWidget)
briconSizer.Add(conLabel)
briconSizer.Add(conWidget)
tools = [panelWidget,
infoWidget,
nameTypePanel,
alphaPanel,
briconPanel]
nav = [panelWidget,
infoWidget,
nameWidget,
typeWidget,
alphaWidget,
briWidget,
conWidget]
return tools, nav
def __makeVolumeOptsTools(self, opts):
"""Creates and returns a collection of controls for editing properties
of the given :class:`.VolumeOpts` instance.
"""
rangeSpec = _TOOLBAR_PROPS[opts, 'displayRange']
resetSpec = _TOOLBAR_PROPS[opts, 'resetDisplayRange']
cmapSpec = _TOOLBAR_PROPS[opts, 'cmap']
negCmapSpec = _TOOLBAR_PROPS[opts, 'negativeCmap']
useNegCmapSpec = _TOOLBAR_PROPS[opts, 'useNegativeCmap']
cmapPanel = wx.Panel(self)
rangeWidget = props.buildGUI(self, opts, rangeSpec)
resetWidget = props.buildGUI(self, opts, resetSpec)
useNegCmapWidget = props.buildGUI(self, opts, useNegCmapSpec)
cmapWidget = props.buildGUI(cmapPanel, opts, cmapSpec)
negCmapWidget = props.buildGUI(cmapPanel, opts, negCmapSpec)
cmapSizer = wx.BoxSizer(wx.VERTICAL)
cmapPanel.SetSizer(cmapSizer)
cmapSizer.Add(cmapWidget)
cmapSizer.Add(negCmapWidget)
tools = [resetWidget, rangeWidget, useNegCmapWidget, cmapPanel]
nav = [resetWidget, rangeWidget, useNegCmapWidget, cmapWidget,
negCmapWidget]
return tools, nav
def __makeComplexOptsTools(self, opts):
"""Creates and returns a collection of controls for editing properties
of the given :class:`.ComplexOpts` instance.
"""
rangeSpec = _TOOLBAR_PROPS[opts, 'displayRange']
resetSpec = _TOOLBAR_PROPS[opts, 'resetDisplayRange']
cmapSpec = _TOOLBAR_PROPS[opts, 'cmap']
compSpec = _TOOLBAR_PROPS[opts, 'component']
ccpanel = wx.Panel(self)
rangeWidget = props.buildGUI(self, opts, rangeSpec)
resetWidget = props.buildGUI(self, opts, resetSpec)
cmapWidget = props.buildGUI(ccpanel, opts, cmapSpec)
compWidget = props.buildGUI(ccpanel, opts, compSpec)
ccsizer = wx.BoxSizer(wx.VERTICAL)
ccpanel.SetSizer(ccsizer)
ccsizer.Add(cmapWidget, flag=wx.EXPAND)
ccsizer.Add(compWidget, flag=wx.EXPAND)
tools = [resetWidget, rangeWidget, ccpanel]
nav = [resetWidget, rangeWidget, cmapWidget, compWidget]
return tools, nav
def __makeMaskOptsTools(self, opts):
"""Creates and returns a collection of controls for editing properties
of the given :class:`.MaskOpts` instance.
"""
thresSpec = _TOOLBAR_PROPS[opts, 'threshold']
colourSpec = _TOOLBAR_PROPS[opts, 'colour']
thresWidget = props.buildGUI(self, opts, thresSpec)
colourWidget = props.buildGUI(self, opts, colourSpec)
tools = [thresWidget, colourWidget]
return tools, tools
def __makeLabelOptsTools(self, opts):
"""Creates and returns a collection of controls for editing properties
of the given :class:`.LabelOpts` instance.
"""
lutSpec = _TOOLBAR_PROPS[opts, 'lut']
outlineSpec = _TOOLBAR_PROPS[opts, 'outline']
widthSpec = _TOOLBAR_PROPS[opts, 'outlineWidth']
# lut/outline width widgets
# are on a single panel
lutWidthPanel = wx.Panel(self)
lutWidthSizer = wx.FlexGridSizer(2, 2, 0, 0)
lutWidthPanel.SetSizer(lutWidthSizer)
lutWidget = props.buildGUI(lutWidthPanel, opts, lutSpec)
widthWidget = props.buildGUI(lutWidthPanel, opts, widthSpec)
outlineWidget = props.buildGUI(self, opts, outlineSpec)
lutLabel = wx.StaticText(lutWidthPanel)
widthLabel = wx.StaticText(lutWidthPanel)
lutLabel .SetLabel(strings.properties[opts, 'lut'])
widthLabel.SetLabel(strings.properties[opts, 'outlineWidth'])
lutWidthSizer.Add(lutLabel)
lutWidthSizer.Add(lutWidget, flag=wx.EXPAND)
lutWidthSizer.Add(widthLabel)
lutWidthSizer.Add(widthWidget, flag=wx.EXPAND)
tools = [lutWidthPanel, outlineWidget]
nav = [lutWidget, widthWidget, outlineWidget]
return tools, nav
def __makeVectorOptsTools(self, opts):
"""Creates and returns a collection of controls for editing properties
of the given :class:`.VectorOpts` instance.
"""
modSpec = _TOOLBAR_PROPS[opts, 'modulateImage']
clipSpec = _TOOLBAR_PROPS[opts, 'clipImage']
rangeSpec = _TOOLBAR_PROPS[opts, 'clippingRange']
panel = wx.Panel(self)
sizer = wx.GridBagSizer()
panel.SetSizer(sizer)
modWidget = props.buildGUI(panel, opts, modSpec)
clipWidget = props.buildGUI(panel, opts, clipSpec)
rangeWidget = props.buildGUI(panel, opts, rangeSpec)
modLabel = wx.StaticText(panel)
clipLabel = wx.StaticText(panel)
modLabel .SetLabel(strings.properties[opts, 'modulateImage'])
clipLabel.SetLabel(strings.properties[opts, 'clipImage'])
sizer.Add(modLabel, pos=(0, 0), span=(1, 1), flag=wx.EXPAND)
sizer.Add(modWidget, pos=(0, 1), span=(1, 1), flag=wx.EXPAND)
sizer.Add(clipLabel, pos=(1, 0), span=(1, 1), flag=wx.EXPAND)
sizer.Add(clipWidget, pos=(1, 1), span=(1, 1), flag=wx.EXPAND)
sizer.Add(rangeWidget, pos=(0, 2), span=(2, 1), flag=wx.EXPAND)
tools = [panel]
nav = [modWidget, clipWidget, rangeWidget]
return tools, nav
def __makeRGBVectorOptsTools(self, opts):
"""Creates and returns a collection of controls for editing properties
of the given :class:`.RGBVectorOpts` instance.
"""
return self.__makeVectorOptsTools(opts)
def __makeLineVectorOptsTools(self, opts):
"""Creates and returns a collection of controls for editing properties
of the given :class:`.LineVectorOpts` instance.
"""
widthSpec = _TOOLBAR_PROPS[opts, 'lineWidth']
widget = props.buildGUI(self, opts, widthSpec)
lblWidget = self.MakeLabelledTool(
widget, strings.properties[opts, 'lineWidth'])
tools, nav = self.__makeVectorOptsTools(opts)
return tools + [lblWidget], nav + [widget]
def __makeMeshOptsTools(self, opts):
"""Creates and returns a collection of controls for editing properties
of the given :class:`.MeshOpts` instance.
"""
colourSpec = _TOOLBAR_PROPS[opts, 'colour']
outlineSpec = _TOOLBAR_PROPS[opts, 'outline']
widthSpec = _TOOLBAR_PROPS[opts, 'outlineWidth']
colourWidget = props.buildGUI(self, opts, colourSpec)
outlineWidget = props.buildGUI(self, opts, outlineSpec)
widthWidget = props.buildGUI(self, opts, widthSpec)
lblWidthWidget = self.MakeLabelledTool(
widthWidget, strings.properties[opts, 'outlineWidth'])
tools = [colourWidget, outlineWidget, lblWidthWidget]
nav = [colourWidget, outlineWidget, widthWidget]
return tools, nav
def __makeGiftiOptsTools(self, opts):
"""Creates and returns a collection of controls for editing properties
of the given :class:`.GiftiOpts` instance.
"""
tools, nav = self.__makeMeshOptsTools(opts)
vertWidget = _TOOLBAR_PROPS[opts, 'vertexSet']
vdataWidget = _TOOLBAR_PROPS[opts, 'vertexData']
panel = wx.Panel(self)
sizer = wx.BoxSizer(wx.VERTICAL)
vertWidget = props.buildGUI(panel, opts, vertWidget)
vdataWidget = props.buildGUI(panel, opts, vdataWidget)
sizer.Add(vertWidget, flag=wx.EXPAND)
sizer.Add(vdataWidget, flag=wx.EXPAND)
panel.SetSizer(sizer)
tools += [panel]
nav += [vertWidget, vdataWidget]
return tools, nav
def __makeFreesurferOptsTools(self, opts):
"""Creates and returns a collection of controls for editing properties
of the given :class:`.FreesurferOpts` instance.
"""
return self.__makeGiftiOptsTools(opts)
def __makeTensorOptsTools(self, opts):
"""Creates and returns a collection of controls for editing properties
of the given :class:`.TensorOpts` instance.
"""
lightingSpec = _TOOLBAR_PROPS[opts, 'lighting']
lightingWidget = props.buildGUI(self, opts, lightingSpec)
tools, nav = self.__makeVectorOptsTools(opts)
return tools + [lightingWidget], nav + [lightingWidget]
def __makeSHOptsTools(self, opts):
"""Creates and returns a collection of controls for editing properties
of the given :class:`.SHOpts` instance.
"""
sizeSpec = _TOOLBAR_PROPS[opts, 'size']
radSpec = _TOOLBAR_PROPS[opts, 'radiusThreshold']
panel = wx.Panel(self)
sizer = wx.FlexGridSizer(2, 2, 0, 0)
sizeWidget = props.buildGUI(panel, opts, sizeSpec)
radWidget = props.buildGUI(panel, opts, radSpec)
sizeLabel = wx.StaticText(panel)
radLabel = wx.StaticText(panel)
sizeLabel.SetLabel(strings.properties[opts, 'size'])
radLabel .SetLabel(strings.properties[opts, 'radiusThreshold'])
sizer.Add(sizeLabel)
sizer.Add(sizeWidget)
sizer.Add(radLabel)
sizer.Add(radWidget)
panel.SetSizer(sizer)
tools, nav = self.__makeVectorOptsTools(opts)
tools.extend([panel])
nav.extend( [sizeWidget, radWidget])
return tools, nav
def __makeMIPOptsTools(self, opts):
"""Creates and returns a collection of controls for editing properties
of the given :class:`.MIPOpts` instance.
"""
rangeSpec = _TOOLBAR_PROPS[opts, 'displayRange']
resetSpec = _TOOLBAR_PROPS[opts, 'resetDisplayRange']
cmapSpec = _TOOLBAR_PROPS[opts, 'cmap']
cmapPanel = wx.Panel(self)
rangeWidget = props.buildGUI(self, opts, rangeSpec)
resetWidget = props.buildGUI(self, opts, resetSpec)
cmapWidget = props.buildGUI(cmapPanel, opts, cmapSpec)
cmapSizer = wx.BoxSizer(wx.VERTICAL)
cmapPanel.SetSizer(cmapSizer)
cmapSizer.Add(cmapWidget)
tools = [resetWidget, rangeWidget, cmapPanel]
nav = [resetWidget, rangeWidget, cmapWidget]
return tools, nav
[docs]def _imageLabel(img):
"""Used to generate labels for the :attr:`.VectorOpts.modulateImage`,
:attr:`.VectorOpts.clipImage`, and other :class:`.Image`-based
choice properties.
"""
if img is None: return 'None'
else: return img.name
_TOOLTIPS = td.TypeDict({
'Display.name' : fsltooltips.properties['Display.name'],
'Display.overlayType' : fsltooltips.properties['Display.overlayType'],
'Display.alpha' : fsltooltips.properties['Display.alpha'],
'Display.brightness' : fsltooltips.properties['Display.brightness'],
'Display.contrast' : fsltooltips.properties['Display.contrast'],
'ColourMapOpts.displayRange' :
fsltooltips.properties['ColourMapOpts.displayRange'],
'VolumeOpts.cmap' :
fsltooltips.properties['ColourMapOpts.cmap'],
'VolumeOpts.negativeCmap' :
fsltooltips.properties['ColourMapOpts.negativeCmap'],
'VolumeOpts.useNegativeCmap' :
fsltooltips.properties['ColourMapOpts.useNegativeCmap'],
'ComplexOpts.component' : fsltooltips.properties['ComplexOpts.component'],
'MaskOpts.threshold' : fsltooltips.properties['MaskOpts.threshold'],
'MaskOpts.colour' : fsltooltips.properties['MaskOpts.colour'],
'LabelOpts.lut' : fsltooltips.properties['LabelOpts.lut'],
'LabelOpts.outline' : fsltooltips.properties['LabelOpts.outline'],
'LabelOpts.outlineWidth' : fsltooltips.properties['LabelOpts.'
'outlineWidth'],
'VectorOpts.modulateImage' : fsltooltips.properties['VectorOpts.'
'modulateImage'],
'VectorOpts.clipImage' : fsltooltips.properties['VectorOpts.'
'clipImage'],
'VectorOpts.clippingRange' : fsltooltips.properties['VectorOpts.'
'clippingRange'],
'LineVectorOpts.lineWidth' : fsltooltips.properties['LineVectorOpts.'
'lineWidth'],
'MeshOpts.colour' : fsltooltips.properties['MeshOpts.colour'],
'MeshOpts.outline' : fsltooltips.properties['MeshOpts.outline'],
'MeshOpts.outlineWidth' : fsltooltips.properties['MeshOpts.'
'outlineWidth'],
'MeshOpts.vertexSet' : fsltooltips.properties['MeshOpts.vertexSet'],
'MeshOpts.vertexData' : fsltooltips.properties['MeshOpts.vertexData'],
'TensorOpts.lighting' : fsltooltips.properties['TensorOpts.'
'lighting'],
'SHOpts.lighting' : fsltooltips.properties['SHOpts.lighting'],
'SHOpts.size' : fsltooltips.properties['SHOpts.size'],
'SHOpts.radiusThreshold' : fsltooltips.properties['SHOpts.'
'radiusThreshold'],
})
"""This dictionary contains tooltips for :class:`.Display` and
:class:`.DisplayOpts` properties. It is referenced in the
:attr:`_TOOLBAR_PROPS` dictionary definition.
"""
_TOOLBAR_PROPS = td.TypeDict({
'Display.name' : props.Widget(
'name',
tooltip=_TOOLTIPS['Display.name']),
'Display.overlayType' : props.Widget(
'overlayType',
tooltip=_TOOLTIPS['Display.overlayType'],
labels=strings.choices['Display.overlayType']),
'Display.alpha' : props.Widget(
'alpha',
spin=False,
showLimits=False,
tooltip=_TOOLTIPS['Display.alpha']),
'Display.brightness' : props.Widget(
'brightness',
spin=False,
showLimits=False,
tooltip=_TOOLTIPS['Display.brightness']),
'Display.contrast' : props.Widget(
'contrast',
spin=False,
showLimits=False,
tooltip=_TOOLTIPS['Display.contrast']),
'VolumeOpts.resetDisplayRange' : actions.ActionButton(
'resetDisplayRange',
icon=icons.findImageFile('verticalReset32')
),
'VolumeOpts.displayRange' : props.Widget(
'displayRange',
slider=False,
showLimits=False,
spinWidth=10,
tooltip=_TOOLTIPS['ColourMapOpts.displayRange'],
labels=[strings.choices['ColourMapOpts.displayRange.min'],
strings.choices['ColourMapOpts.displayRange.max']]),
'VolumeOpts.cmap' : props.Widget(
'cmap',
labels=fslcm.getColourMapLabel,
tooltip=_TOOLTIPS['VolumeOpts.cmap']),
'VolumeOpts.useNegativeCmap' : props.Widget(
'useNegativeCmap',
icon=[icons.findImageFile('twocmaps24'),
icons.findImageFile('onecmap24')],
toggle=True,
tooltip=_TOOLTIPS['VolumeOpts.useNegativeCmap']),
'VolumeOpts.negativeCmap' : props.Widget(
'negativeCmap',
labels=fslcm.getColourMapLabel,
tooltip=_TOOLTIPS['VolumeOpts.negativeCmap'],
dependencies=['useNegativeCmap'],
enabledWhen=lambda i, unc : unc),
'ComplexOpts.component' : props.Widget(
'component',
labels=strings.choices['ComplexOpts.component'],
tooltip=_TOOLTIPS['ComplexOpts.component']),
'MaskOpts.threshold' : props.Widget(
'threshold',
showLimits=False,
spin=True,
tooltip=_TOOLTIPS['MaskOpts.threshold'],
labels=[strings.choices['MaskOpts.threshold.min'],
strings.choices['MaskOpts.threshold.max']]),
'MaskOpts.colour' : props.Widget(
'colour',
size=(24, 24),
tooltip=_TOOLTIPS['MaskOpts.colour']),
'LabelOpts.lut' : props.Widget(
'lut',
tooltip=_TOOLTIPS['LabelOpts.lut'],
labels=lambda l: l.name),
'LabelOpts.outline' : props.Widget(
'outline',
tooltip=_TOOLTIPS['LabelOpts.outline'],
icon=[icons.findImageFile('outline24'),
icons.findImageFile('filled24')],
toggle=True),
'LabelOpts.outlineWidth' : props.Widget(
'outlineWidth',
tooltip=_TOOLTIPS['LabelOpts.outlineWidth'],
showLimits=False,
spin=False),
'MeshOpts.colour' : props.Widget(
'colour',
size=(24, 24),
tooltip=_TOOLTIPS['MeshOpts.colour']),
'MeshOpts.outline' : props.Widget(
'outline',
tooltip=_TOOLTIPS['MeshOpts.outline'],
icon=[icons.findImageFile('outline24'),
icons.findImageFile('filled24')],
toggle=True),
'MeshOpts.outlineWidth' : props.Widget(
'outlineWidth',
showLimits=False,
spin=False,
tooltip=_TOOLTIPS['MeshOpts.outlineWidth'],
enabledWhen=lambda i: i.outline),
'MeshOpts.vertexSet' : props.Widget(
'vertexSet',
labels=_pathLabel,
tooltip=_TOOLTIPS['MeshOpts.vertexSet']
),
'MeshOpts.vertexData' : props.Widget(
'vertexData',
labels=_pathLabel,
tooltip=_TOOLTIPS['MeshOpts.vertexData']
),
'VectorOpts.modulateImage' : props.Widget(
'modulateImage',
labels=_imageLabel,
tooltip=_TOOLTIPS['VectorOpts.modulateImage']),
'VectorOpts.clipImage' : props.Widget(
'clipImage',
labels=_imageLabel,
tooltip=_TOOLTIPS['VectorOpts.clipImage']),
'VectorOpts.clippingRange' : props.Widget(
'clippingRange',
showLimits=False,
slider=True,
spin=False,
tooltip=_TOOLTIPS['VectorOpts.clippingRange'],
labels=[strings.choices['VectorOpts.clippingRange.min'],
strings.choices['VectorOpts.clippingRange.max']],
dependencies=['clipImage'],
enabledWhen=lambda o, ci: ci is not None),
'LineVectorOpts.lineWidth' : props.Widget(
'lineWidth',
showLimits=False,
spin=False,
tooltip=_TOOLTIPS['LineVectorOpts.lineWidth']),
'TensorOpts.lighting' : props.Widget(
'lighting',
icon=[icons.findImageFile('lightbulbHighlight24'),
icons.findImageFile('lightbulb24')],
tooltip=_TOOLTIPS['TensorOpts.lighting']),
'SHOpts.lighting' : props.Widget(
'lighting',
icon=[icons.findImageFile('lightbulbHighlight24'),
icons.findImageFile('lightbulb24')],
tooltip=_TOOLTIPS['SHOpts.lighting']),
'SHOpts.size' : props.Widget(
'size',
showLimits=False,
slider=True,
spin=False,
tooltip=_TOOLTIPS['SHOpts.size']),
'SHOpts.radiusThreshold' : props.Widget(
'radiusThreshold',
slider=True,
spin=False,
showLimits=False,
tooltip=_TOOLTIPS['SHOpts.radiusThreshold']),
'MIPOpts.resetDisplayRange' : actions.ActionButton(
'resetDisplayRange',
icon=icons.findImageFile('verticalReset32')
),
'MIPOpts.displayRange' : props.Widget(
'displayRange',
slider=False,
showLimits=False,
spinWidth=10,
tooltip=_TOOLTIPS['ColourMapOpts.displayRange'],
labels=[strings.choices['ColourMapOpts.displayRange.min'],
strings.choices['ColourMapOpts.displayRange.max']]),
'MIPOpts.cmap' : props.Widget(
'cmap',
labels=fslcm.getColourMapLabel,
tooltip=_TOOLTIPS['VolumeOpts.cmap']),
})
"""This dictionary defines specifications for all controls shown on an
:class:`OverlayDisplayToolBar`.
"""