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.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] def __init__(self, parent, overlayList, displayCtx, frame, ortho):
"""Create an ``OrthoToolBar``.
: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 ortho: The :class:`.OrthoPanel` instance.
"""
ctrlpanel.ControlToolBar.__init__(self,
parent,
overlayList,
displayCtx,
frame,
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.addListener('profile', self.name, self.__makeTools)
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.removeListener('profile', self.name)
self .removeListener('showCursorAndLabels', self.name)
ctrlpanel.ControlToolBar.destroy(self)
[docs] @staticmethod
def supportedViews():
"""Overrides :meth:`.ControlMixin.supportedViews`. The
``OrthoToolBar`` is only intended to be added to
:class:`.OrthoPanel` views.
"""
from fsleyes.views.orthopanel import OrthoPanel
return [OrthoPanel]
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.getCurrentProfile()
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')],
'toggleCanvasSettingsPanel' : [
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'],
'toggleCanvasSettingsPanel' : fsltooltips.actions[
ortho, 'toggleCanvasSettingsPanel'],
}
targets = {'screenshot' : ortho,
'movieMode' : ortho,
'showCursorAndLabels' : self,
'resetDisplay' : profile,
'zoom' : orthoOpts,
'layout' : orthoOpts,
'showXCanvas' : orthoOpts,
'showYCanvas' : orthoOpts,
'showZCanvas' : orthoOpts,
'toggleCanvasSettingsPanel' : ortho}
toolSpecs = [
actions.ToggleActionButton(
'toggleCanvasSettingsPanel',
actionKwargs={'floatPane' : True},
icon=icons['toggleCanvasSettingsPanel'],
tooltip=tooltips['toggleCanvasSettingsPanel']),
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