Source code for fsleyes.controls.orthotoolbar
#
# orthotoolbar.py - The OrthoToolBar class.
#
# Author: Paul McCarthy <pauldmccarthy@gmail.com>
#
"""This module provides the :class:`OrthoToolBar` class, which is a
:class:`.ControlToolBar` for use with the :class:`.OrthoPanel`.
"""
import wx
import fsleyes_props as props
import fsleyes.controls.controlpanel as ctrlpanel
import fsleyes.views.orthopanel as orthopanel
import fsleyes.toolbar as fsltoolbar
import fsleyes.icons as fslicons
import fsleyes.tooltips as fsltooltips
import fsleyes.actions as actions
import fsleyes.strings as strings
[docs]class OrthoToolBar(ctrlpanel.ControlToolBar):
"""The ``OrthoToolBar`` is a :class:`.ControlToolBar` for use with the
:class:`.OrthoPanel`. An ``OrthoToolBar`` looks something like this:
.. image:: images/orthotoolbar.png
:scale: 50%
:align: center
The ``OrthoToolBar`` allows the user to control important parts of the
:class:`.OrthoPanel` display, and also to display a
:class:`.CanvasSettingsPanel`, which allows control over all aspects of
an ``OrthoPanel``.
The ``OrthoToolBar`` contains controls which modify properties, or run
actions, defined on the following classes:
.. autosummary::
:nosignatures:
~fsleyes.views.orthopanel.OrthoPanel
~fsleyes.displaycontext.orthoopts.OrthoOpts
~fsleyes.profiles.orthoviewprofile.OrthoViewProfile
"""
showCursorAndLabels = props.Boolean(default=True)
"""This property is linked to a button on the toolbar which allows the
user to simultaneously toggle the :attr:`.SceneOpts.showCursor` and
:attr:`.OrthoOpts.showLabels` properties.
"""
[docs] @staticmethod
def supportedViews():
"""Overrides :meth:`.ControlMixin.supportedViews`. The
``OrthoToolBar`` is only intended to be added to
:class:`.OrthoPanel` views.
"""
return [orthopanel.OrthoPanel]
[docs] def __init__(self, parent, overlayList, displayCtx, ortho):
"""Create an ``OrthoToolBar``.
:arg parent: The :mod:`wx` parent object.
:arg overlayList: The :class:`.OverlayList` instance.
:arg displayCtx: The :class:`.DisplayContext` instance.
:arg ortho: The :class:`.OrthoPanel` instance.
"""
ctrlpanel.ControlToolBar.__init__(self,
parent,
overlayList,
displayCtx,
ortho,
height=24,
kbFocus=True)
self.orthoPanel = ortho
# The toolbar has buttons bound to some actions
# on the Profile instance - when the profile
# changes (between 'view' and 'edit'), the
# Profile instance changes too, so we need
# to re-create these action buttons. I'm being
# lazy and just re-generating the entire toolbar.
ortho.events.register(self.name, self.__makeTools, 'profile')
self.addListener('showCursorAndLabels',
self.name,
self.__showCursorAndLabelsChanged)
self.__makeTools()
[docs] def destroy(self):
"""Must be called when this ``OrthoToolBar`` is no longer in use.
Removes some property listeners, and calls the base class
implementation.
"""
self.orthoPanel.events.deregister(self.name, 'profile')
self .removeListener('showCursorAndLabels', self.name)
ctrlpanel.ControlToolBar.destroy(self)
def __makeTools(self, *a):
"""Called by :meth:`__init__`, and whenever the
:attr:`.ViewPanel.profile` property changes.
Re-creates all tools shown on this ``OrthoToolBar``.
"""
ortho = self.orthoPanel
orthoOpts = ortho.sceneOpts
profile = ortho.currentProfile
coronalIcon = 'coronalSlice24'
coronalHighlightIcon = 'coronalSliceHighlight24'
icons = {
'screenshot' : fslicons.findImageFile('camera24'),
'resetDisplay' : fslicons.findImageFile('resetZoom24'),
'showCursorAndLabels' : [
fslicons.findImageFile('addHighlight24'),
fslicons.findImageFile('add24')],
'movieMode' : [
fslicons.findImageFile('movieHighlight24'),
fslicons.findImageFile('movie24')],
'showXCanvas' : [
fslicons.findImageFile('sagittalSliceHighlight24'),
fslicons.findImageFile('sagittalSlice24')],
'showYCanvas' : [
fslicons.findImageFile(coronalHighlightIcon),
fslicons.findImageFile(coronalIcon)],
'showZCanvas' : [
fslicons.findImageFile('axialSliceHighlight24'),
fslicons.findImageFile('axialSlice24')],
'CanvasSettingsPanel' : [
fslicons.findImageFile('spannerHighlight24'),
fslicons.findImageFile('spanner24')],
'layout' : {
'horizontal' : [
fslicons.findImageFile('horizontalLayoutHighlight24'),
fslicons.findImageFile('horizontalLayout24')],
'vertical' : [
fslicons.findImageFile('verticalLayoutHighlight24'),
fslicons.findImageFile('verticalLayout24')],
'grid' : [
fslicons.findImageFile('gridLayoutHighlight24'),
fslicons.findImageFile('gridLayout24')]}
}
tooltips = {
'screenshot' : fsltooltips.actions[ ortho, 'screenshot'],
'resetDisplay' : fsltooltips.actions[ profile, 'resetDisplay'],
'movieMode' : fsltooltips.properties[ortho, 'movieMode'],
'showCursorAndLabels' : fsltooltips.properties[
self, 'showCursorAndLabels'],
'zoom' : fsltooltips.properties[orthoOpts, 'zoom'],
'layout' : fsltooltips.properties[orthoOpts, 'layout'],
'showXCanvas' : fsltooltips.properties[orthoOpts, 'showXCanvas'],
'showYCanvas' : fsltooltips.properties[orthoOpts, 'showYCanvas'],
'showZCanvas' : fsltooltips.properties[orthoOpts, 'showZCanvas'],
'CanvasSettingsPanel' : fsltooltips.actions[ortho,
'CanvasSettingsPanel'],
}
targets = {'screenshot' : ortho,
'movieMode' : ortho,
'showCursorAndLabels' : self,
'resetDisplay' : profile,
'zoom' : orthoOpts,
'layout' : orthoOpts,
'showXCanvas' : orthoOpts,
'showYCanvas' : orthoOpts,
'showZCanvas' : orthoOpts,
'CanvasSettingsPanel' : ortho}
toolSpecs = [
actions.ToggleActionButton(
'CanvasSettingsPanel',
actionKwargs={'floatPane' : True},
icon=icons['CanvasSettingsPanel'],
tooltip=tooltips['CanvasSettingsPanel']),
actions.ActionButton('screenshot',
icon=icons['screenshot'],
tooltip=tooltips['screenshot']),
'div',
props .Widget( 'showXCanvas',
icon=icons['showXCanvas'],
tooltip=tooltips['showXCanvas']),
props .Widget( 'showYCanvas',
icon=icons['showYCanvas'],
tooltip=tooltips['showYCanvas']),
props .Widget( 'showZCanvas',
icon=icons['showZCanvas'],
tooltip=tooltips['showZCanvas']),
'div',
props .Widget( 'layout',
icons=icons['layout'],
tooltip=tooltips['layout']),
'div',
props .Widget( 'movieMode',
icon=icons['movieMode'],
tooltip=tooltips['movieMode']),
props .Widget( 'showCursorAndLabels',
icon=icons['showCursorAndLabels'],
tooltip=tooltips['showCursorAndLabels']),
actions.ActionButton('resetDisplay',
icon=icons['resetDisplay'],
tooltip=tooltips['resetDisplay']),
props.Widget( 'zoom',
spin=True,
slider=True,
showLimits=False,
spinWidth=5,
tooltip=tooltips['zoom']),
]
tools = []
nav = []
for spec in toolSpecs:
if spec == 'div':
tools.append(fsltoolbar.ToolBarDivider(self,
height=24,
orient=wx.VERTICAL))
continue
widget = props.buildGUI(self, targets[spec.key], spec)
navWidget = widget
if spec.key in ('zoom', ):
widget = self.MakeLabelledTool(
widget,
strings.properties[targets[spec.key], spec.key])
tools.append(widget)
nav .append(navWidget)
self.SetTools(tools, destroy=True)
self.setNavOrder(nav)
def __showCursorAndLabelsChanged(self, *a):
"""Called when the :attr:`showCursorAndLabels` property is changed.
Propagates the change on to the :attr:`.SceneOpts.showCursor` and
:attr:`.OrthoOpts.showLabels` properties.
"""
opts = self.orthoPanel.sceneOpts
opts.showCursor = self.showCursorAndLabels
opts.showLabels = self.showCursorAndLabels