Skip to content
Snippets Groups Projects
Commit 7311c12e authored by Paul McCarthy's avatar Paul McCarthy
Browse files

1. Replaced OrthoSettingsPanel and LightBoxSettingsPanel with a

CanvasSettingsPanel, which uses WidgetList to display/organise
its controls.

2. DisplayContext (and CanvasPanel) has a new property,
'syncOverlayDisplay`, which syncs/unsyncs Display/DisplayOpts properties
to/from the parent instances.
parent a40539e7
No related branches found
No related tags found
No related merge requests found
......@@ -118,12 +118,11 @@ titles = TypeDict({
'AtlasPanel' : 'Atlases',
'LocationPanel' : 'Location',
'OverlayDisplayToolBar' : 'Display toolbar',
'CanvasSettingsPanel' : 'View settings',
'OverlayDisplayPanel' : 'Display settings',
'OrthoToolBar' : 'Ortho view toolbar',
'OrthoProfileToolBar' : 'Ortho view mode toolbar',
'OrthoSettingsPanel' : 'Ortho view settings',
'LightBoxToolBar' : 'Lightbox view toolbar',
'LightBoxSettingsPanel' : 'Lightbox view settings',
'LookupTablePanel' : 'Lookup tables',
'LutLabelDialog' : 'New LUT label',
'NewLutDialog' : 'New LUT',
......@@ -268,6 +267,10 @@ labels = TypeDict({
'OverlayDisplayPanel.ModelOpts' : 'Model settings',
'OverlayDisplayPanel.loadCmap' : 'Load colour map',
'CanvasSettingsPanel.scene' : 'Scene settings',
'CanvasSettingsPanel.ortho' : 'Ortho view settings',
'CanvasSettingsPanel.lightbox' : 'Lightbox settings',
})
......@@ -276,9 +279,10 @@ properties = TypeDict({
'Profile.mode' : 'Profile',
'CanvasPanel.syncLocation' : 'Sync location',
'CanvasPanel.syncOverlayOrder' : 'Sync overlay order',
'CanvasPanel.profile' : 'Mode',
'CanvasPanel.syncLocation' : 'Sync location',
'CanvasPanel.syncOverlayOrder' : 'Sync overlay order',
'CanvasPanel.syncOverlayDisplay' : 'Sync overlay display settings',
'CanvasPanel.profile' : 'Mode',
'SceneOpts.showCursor' : 'Show location cursor',
'SceneOpts.showColourBar' : 'Show colour bar',
......
......@@ -9,17 +9,16 @@ from atlaspanel import AtlasPanel
from overlaydisplaypanel import OverlayDisplayPanel
from overlaylistpanel import OverlayListPanel
from overlayselectpanel import OverlaySelectPanel
from lightboxsettingspanel import LightBoxSettingsPanel
from locationpanel import LocationPanel
from orthosettingspanel import OrthoSettingsPanel
from lookuptablepanel import LookupTablePanel
from timeserieslistpanel import TimeSeriesListPanel
from timeseriescontrolpanel import TimeSeriesControlPanel
from histogramlistpanel import HistogramListPanel
from histogramcontrolpanel import HistogramControlPanel
from clusterpanel import ClusterPanel
from canvassettingspanel import CanvasSettingsPanel
from orthotoolbar import OrthoToolBar
from orthoprofiletoolbar import OrthoProfileToolBar
from lightboxtoolbar import LightBoxToolBar
from overlaydisplaytoolbar import OverlayDisplayToolBar
from orthotoolbar import OrthoToolBar
from orthoprofiletoolbar import OrthoProfileToolBar
from lightboxtoolbar import LightBoxToolBar
from overlaydisplaytoolbar import OverlayDisplayToolBar
#!/usr/bin/env python
#
# canvassettingspanel.py -
#
# Author: Paul McCarthy <pauldmccarthy@gmail.com>
#
import wx
import props
import pwidgets.widgetlist as widgetlist
import fsl.data.strings as strings
import fsl.fslview.panel as fslpanel
_CANVASPANEL_PROPS = [
props.Widget(
'profile',
visibleWhen=lambda i: len(i.getProp('profile').getChoices(i)) > 1),
props.Widget('syncOverlayOrder'),
props.Widget('syncLocation'),
props.Widget('syncOverlayDisplay')
]
_SCENEOPTS_PROPS = [
props.Widget('showCursor'),
props.Widget('performance', spin=False, showLimits=False),
props.Widget('showColourBar'),
props.Widget('colourBarLabelSide', enabledWhen=lambda o: o.showColourBar),
props.Widget('colourBarLocation', enabledWhen=lambda o: o.showColourBar)
]
_ORTHOOPTS_PROPS = [
props.Widget('layout'),
props.Widget('zoom', spin=False, showLimits=False),
props.Widget('showLabels'),
props.Widget('showXCanvas'),
props.Widget('showYCanvas'),
props.Widget('showZCanvas')
]
_LIGHTBOXOPTS_PROPS = [
props.Widget('zax'),
props.Widget('zoom', showLimits=False, spin=False),
props.Widget('sliceSpacing', showLimits=False),
props.Widget('zrange', showLimits=False),
props.Widget('highlightSlice'),
props.Widget('showGridLines')
]
class CanvasSettingsPanel(fslpanel.FSLViewPanel):
def __init__(self, parent, overlayList, displayCtx, canvasPanel):
fslpanel.FSLViewPanel.__init__(self, parent, overlayList, displayCtx)
self.__widgets = widgetlist.WidgetList(self)
self.__sizer = wx.BoxSizer(wx.VERTICAL)
self.SetSizer(self.__sizer)
self.__sizer.Add(self.__widgets, flag=wx.EXPAND, proportion=1)
import fsl.fslview.views.orthopanel as orthopanel
import fsl.fslview.views.lightboxpanel as lightboxpanel
if isinstance(canvasPanel, orthopanel.OrthoPanel):
panelGroup = 'ortho'
panelProps = _ORTHOOPTS_PROPS
elif isinstance(canvasPanel, lightboxpanel.LightBoxPanel):
panelGroup = 'lightbox'
panelProps = _LIGHTBOXOPTS_PROPS
self.__widgets.AddGroup('scene' , strings.labels[self, 'scene'])
self.__widgets.AddGroup( panelGroup, strings.labels[self, panelGroup])
for dispProp in _CANVASPANEL_PROPS:
widget = props.buildGUI(self.__widgets,
canvasPanel,
dispProp,
showUnlink=False)
self.__widgets.AddWidget(
widget,
strings.properties[canvasPanel, dispProp.key],
groupName='scene')
opts = canvasPanel.getSceneOptions()
for dispProp in _SCENEOPTS_PROPS:
widget = props.buildGUI(self.__widgets,
opts,
dispProp,
showUnlink=False)
self.__widgets.AddWidget(
widget,
strings.properties[opts, dispProp.key],
groupName='scene')
for dispProp in panelProps:
widget = props.buildGUI(self.__widgets,
opts,
dispProp,
showUnlink=False)
self.__widgets.AddWidget(
widget,
strings.properties[opts, dispProp.key],
groupName=panelGroup)
self.__widgets.Expand('scene')
self.__widgets.Expand(panelGroup)
self.SetMinSize((21, 21))
#!/usr/bin/env python
#
# lightboxsettingspanel.py -
#
# Author: Paul McCarthy <pauldmccarthy@gmail.com>
#
import logging
import wx
import props
import fsl.fslview.panel as fslpanel
log = logging.getLogger(__name__)
class LightBoxSettingsPanel(fslpanel.FSLViewPanel):
def __init__(self, parent, overlayList, displayCtx, lb):
fslpanel.FSLViewPanel.__init__(self, parent, overlayList, displayCtx)
import fsl.fslview.layouts as layouts
self.panel = wx.ScrolledWindow(self)
self.panel.SetScrollRate(0, 5)
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.SetSizer(self.sizer)
self.sizer.Add(self.panel, flag=wx.EXPAND, proportion=1)
self.canvasSettings = props.buildGUI(
self.panel, lb, layouts.layouts['CanvasPanel'])
self.divider1 = wx.StaticLine(
self.panel, size=(-1, -1), style=wx.LI_HORIZONTAL)
self.sceneSettings = props.buildGUI(
self.panel,
lb.getSceneOptions(),
layouts.layouts['SceneOpts'])
self.divider2 = wx.StaticLine(
self.panel, size=(-1, -1), style=wx.LI_HORIZONTAL)
self.lightBoxSettings = props.buildGUI(
self.panel,
lb.getSceneOptions(),
layouts.layouts['LightBoxPanel'])
self.panelSizer = wx.BoxSizer(wx.VERTICAL)
self.panel.SetSizer(self.panelSizer)
flags = wx.wx.EXPAND | wx.ALIGN_CENTRE | wx.ALL
self.panelSizer.Add(self.canvasSettings, border=20, flag=flags)
self.panelSizer.Add(self.divider1, flag=flags)
self.panelSizer.Add(self.sceneSettings, border=20, flag=flags)
self.panelSizer.Add(self.divider2, flag=flags)
self.panelSizer.Add(self.lightBoxSettings, border=20, flag=flags)
self.sizer .Layout()
self.panelSizer.Layout()
size = self.panelSizer.GetMinSize()
self.SetMinSize((size[0], size[1] / 3.0))
......@@ -7,7 +7,6 @@
import fsl.fslview.toolbar as fsltoolbar
import lightboxsettingspanel
class LightBoxToolBar(fsltoolbar.FSLViewToolBar):
......@@ -50,7 +49,8 @@ class LightBoxToolBar(fsltoolbar.FSLViewToolBar):
def showMoreSettings(self, *a):
import canvassettingspanel
self.lightBoxPanel.togglePanel(
lightboxsettingspanel.LightBoxSettingsPanel,
canvassettingspanel.CanvasSettingsPanel,
True,
self.lightBoxPanel)
#!/usr/bin/env python
#
# orthosettingspanel.py -
#
# Author: Paul McCarthy <pauldmccarthy@gmail.com>
#
import logging
import wx
import props
import fsl.fslview.panel as fslpanel
log = logging.getLogger(__name__)
class OrthoSettingsPanel(fslpanel.FSLViewPanel):
def __init__(self, parent, overlayList, displayCtx, ortho):
fslpanel.FSLViewPanel.__init__(self, parent, overlayList, displayCtx)
import fsl.fslview.layouts as layouts
self.panel = wx.ScrolledWindow(self)
self.panel.SetScrollRate(0, 5)
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.SetSizer(self.sizer)
self.sizer.Add(self.panel, flag=wx.EXPAND, proportion=1)
self.canvasSettings = props.buildGUI(
self.panel, ortho, layouts.layouts['CanvasPanel'])
self.divider1 = wx.StaticLine(
self.panel, size=(-1, -1), style=wx.LI_HORIZONTAL)
self.sceneSettings = props.buildGUI(
self.panel, ortho.getSceneOptions(), layouts.layouts['SceneOpts'])
self.divider2 = wx.StaticLine(
self.panel, size=(-1, -1), style=wx.LI_HORIZONTAL)
self.orthoSettings = props.buildGUI(
self.panel, ortho.getSceneOptions(), layouts.layouts['OrthoPanel'])
self.panelSizer = wx.BoxSizer(wx.VERTICAL)
self.panel.SetSizer(self.panelSizer)
flags = wx.wx.EXPAND | wx.ALIGN_CENTRE | wx.ALL
self.panelSizer.Add(self.canvasSettings, border=20, flag=flags)
self.panelSizer.Add(self.divider1, flag=flags)
self.panelSizer.Add(self.sceneSettings, border=20, flag=flags)
self.panelSizer.Add(self.divider2, flag=flags)
self.panelSizer.Add(self.orthoSettings, border=20, flag=flags)
self.sizer .Layout()
self.panelSizer.Layout()
size = self.panelSizer.GetMinSize()
self.SetMinSize((size[0], size[1] / 3.0))
......@@ -7,7 +7,6 @@
import fsl.fslview.toolbar as fsltoolbar
import orthosettingspanel
class OrthoToolBar(fsltoolbar.FSLViewToolBar):
......@@ -38,5 +37,6 @@ class OrthoToolBar(fsltoolbar.FSLViewToolBar):
def showMoreSettings(self, *a):
import canvassettingspanel
self.orthoPanel.togglePanel(
orthosettingspanel.OrthoSettingsPanel, True, self.orthoPanel)
canvassettingspanel.CanvasSettingsPanel, True, self.orthoPanel)
......@@ -72,6 +72,16 @@ class DisplayContext(props.SyncableHasProperties):
"""
syncOverlayDisplay = props.Boolean(default=True)
"""If this ``DisplayContext`` instance has a parent (see
:mod:`props.syncable`), and this is ``True``, the properties of the
:class:`.Display` and :class:`.DisplayOpts` for every overlay managed
by this ``DisplayContext`` instance will be synchronised to those of
the parent instance. Otherwise, the display properties for every overlay
will be unsynchronised from the parent.
"""
def __init__(self, overlayList, parent=None):
"""Create a :class:`DisplayContext` object.
......@@ -81,9 +91,11 @@ class DisplayContext(props.SyncableHasProperties):
as the parent of this instance.
"""
props.SyncableHasProperties.__init__(self,
parent,
nounbind=['overlayGroups'])
props.SyncableHasProperties.__init__(
self,
parent,
nounbind=['overlayGroups'],
nobind=[ 'syncOverlayDisplay'])
self.__overlayList = overlayList
self.__name = '{}_{}'.format(self.__class__.__name__, id(self))
......@@ -103,6 +115,10 @@ class DisplayContext(props.SyncableHasProperties):
self.__name,
self.__overlayListChanged)
self.addListener('syncOverlayDisplay',
self.__name,
self.__syncOverlayDisplayChanged)
log.memory('{}.init ({})'.format(type(self).__name__, id(self)))
......@@ -164,6 +180,11 @@ class DisplayContext(props.SyncableHasProperties):
parent=dParent,
overlayType=overlayType)
self.__displays[overlay] = display
if (self.getParent() is not None) and \
(not self.syncOverlayDisplay):
display .unsyncAllFromParent()
display.getDisplayOpts().unsyncAllFromParent()
return display
......@@ -453,6 +474,30 @@ class DisplayContext(props.SyncableHasProperties):
self.location.xyz = newDispLoc
def __syncOverlayDisplayChanged(self, *a):
"""Called when the :attr:`syncOverlayDisplay` property
changes.
Synchronises or unsychronises the :class:`.Display` and
:class:`.DisplayOpts` instances for every overlay to/from their
parent instances.
"""
if self.getParent() is None:
return
for display in self.__displays.values():
opts = display.getDisplayOpts()
if self.syncOverlayDisplay:
display.syncAllToParent()
opts .syncAllToParent()
else:
display.unsyncAllFromParent()
opts .unsyncAllFromParent()
def __updateBounds(self, *a):
"""Called when the overlay list changes, or when any overlay display
transform is changed. Updates the :attr:`bounds` property.
......
......@@ -17,7 +17,6 @@ import fsl.fslview.actions as actions
from fsl.fslview.profiles.orthoviewprofile import OrthoViewProfile
from fsl.fslview.profiles.orthoeditprofile import OrthoEditProfile
from fsl.fslview.views import CanvasPanel
from fsl.fslview.views import OrthoPanel
from fsl.fslview.views import LightBoxPanel
......@@ -29,12 +28,9 @@ from fsl.fslview.displaycontext import Display
from fsl.fslview.displaycontext import VolumeOpts
from fsl.fslview.displaycontext import MaskOpts
from fsl.fslview.displaycontext import VectorOpts
from fsl.fslview.displaycontext import RGBVectorOpts
from fsl.fslview.displaycontext import LineVectorOpts
from fsl.fslview.displaycontext import ModelOpts
from fsl.fslview.displaycontext import LabelOpts
from fsl.fslview.displaycontext import SceneOpts
from fsl.fslview.displaycontext import OrthoOpts
from fsl.fslview.displaycontext import LightBoxOpts
......@@ -92,30 +88,6 @@ OrthoProfileToolBarEditLayout = [
enabledWhen=lambda p: p.mode == 'selint')]
CanvasPanelLayout = props.VGroup((
widget(CanvasPanel,
'profile',
visibleWhen=lambda i: len(i.getProp('profile').getChoices(i)) > 1),
widget(CanvasPanel, 'syncOverlayOrder'),
widget(CanvasPanel, 'syncLocation')))
SceneOptsLayout = props.VGroup((
widget(SceneOpts, 'showCursor'),
widget(SceneOpts, 'performance', spin=False, showLimits=False),
widget(SceneOpts, 'showColourBar'),
widget(SceneOpts, 'colourBarLabelSide'),
widget(SceneOpts, 'colourBarLocation')))
OrthoPanelLayout = props.VGroup((
widget(OrthoOpts, 'layout'),
widget(OrthoOpts, 'zoom', spin=False, showLimits=False),
widget(OrthoOpts, 'showLabels'),
props.HGroup((widget(OrthoOpts, 'showXCanvas'),
widget(OrthoOpts, 'showYCanvas'),
widget(OrthoOpts, 'showZCanvas')))))
#######################################
# LightBoxPanel control panels/toolbars
#######################################
......@@ -130,15 +102,6 @@ LightBoxToolBarLayout = [
actions.ActionButton(LightBoxToolBar, 'more')]
LightBoxPanelLayout = props.VGroup((
widget(LightBoxOpts, 'zax'),
widget(LightBoxOpts, 'zoom'),
widget(LightBoxOpts, 'sliceSpacing'),
widget(LightBoxOpts, 'zrange'),
widget(LightBoxOpts, 'highlightSlice'),
widget(LightBoxOpts, 'showGridLines')))
##########################################
# Overlay display property panels/toolbars
......@@ -181,93 +144,8 @@ LabelOptsToolBarLayout = [
actions.ActionButton(OverlayDisplayToolBar, 'more')]
DisplayLayout = [
widget(Display, 'name'),
widget(Display, 'overlayType'),
widget(Display, 'enabled'),
widget(Display, 'alpha', showLimits=False, editLimits=False),
widget(Display, 'brightness', showLimits=False, editLimits=False),
widget(Display, 'contrast', showLimits=False, editLimits=False)]
VolumeOptsLayout = [
widget(VolumeOpts, 'resolution', showLimits=False),
widget(VolumeOpts, 'transform'),
widget(VolumeOpts, 'volume', showLimits=False),
widget(VolumeOpts, 'interpolation'),
widget(VolumeOpts, 'cmap'),
widget(VolumeOpts, 'invert'),
widget(VolumeOpts, 'invertClipping'),
widget(VolumeOpts, 'displayRange', showLimits=False, slider=True),
widget(VolumeOpts, 'clippingRange', showLimits=False, slider=True)]
MaskOptsLayout = [
widget(MaskOpts, 'resolution', showLimits=False),
widget(MaskOpts, 'transform'),
widget(MaskOpts, 'volume', showLimits=False),
widget(MaskOpts, 'colour'),
widget(MaskOpts, 'invert'),
widget(MaskOpts, 'threshold', showLimits=False)]
RGBVectorOptsLayout = [
widget(RGBVectorOpts, 'resolution', showLimits=False),
widget(RGBVectorOpts, 'transform'),
widget(RGBVectorOpts, 'interpolation'),
widget(RGBVectorOpts, 'xColour'),
widget(RGBVectorOpts, 'yColour'),
widget(RGBVectorOpts, 'zColour'),
widget(RGBVectorOpts, 'suppressX'),
widget(RGBVectorOpts, 'suppressY'),
widget(RGBVectorOpts, 'suppressZ'),
widget(RGBVectorOpts, 'modulate'),
widget(RGBVectorOpts, 'modThreshold', showLimits=False, spin=False)]
LineVectorOptsLayout = [
widget(LineVectorOpts, 'resolution', showLimits=False),
widget(LineVectorOpts, 'transform'),
widget(LineVectorOpts, 'xColour'),
widget(LineVectorOpts, 'yColour'),
widget(LineVectorOpts, 'zColour'),
widget(LineVectorOpts, 'suppressX'),
widget(LineVectorOpts, 'suppressY'),
widget(LineVectorOpts, 'suppressZ'),
widget(LineVectorOpts, 'directed'),
widget(LineVectorOpts, 'lineWidth', showLimits=False),
widget(LineVectorOpts, 'modulate'),
widget(LineVectorOpts, 'modThreshold', showLimits=False, spin=False)]
ModelOptsLayout = [
widget(ModelOpts, 'colour'),
widget(ModelOpts, 'outline'),
widget(ModelOpts, 'outlineWidth', showLimits=False),
widget(ModelOpts, 'refImage'),
# widget(ModelOpts, 'showName'),
widget(ModelOpts, 'coordSpace',
visibleWhen=lambda o: o.refImage != 'none')]
LabelOptsLayout = [
widget(LabelOpts, 'lut'),
widget(LabelOpts, 'outline'),
widget(LabelOpts, 'outlineWidth', showLimits=False),
# widget(LabelOpts, 'showNames'),
widget(LabelOpts, 'resolution', showLimits=False),
widget(LabelOpts, 'transform'),
widget(LabelOpts, 'volume', showLimits=False)]
layouts = td.TypeDict({
'CanvasPanel' : CanvasPanelLayout,
'OrthoPanel' : OrthoPanelLayout,
'LightBoxPanel' : LightBoxPanelLayout,
'SceneOpts' : SceneOptsLayout,
('OverlayDisplayToolBar', 'Display') : DisplayToolBarLayout,
('OverlayDisplayToolBar', 'VolumeOpts') : VolumeOptsToolBarLayout,
('OverlayDisplayToolBar', 'MaskOpts') : MaskOptsToolBarLayout,
......@@ -275,14 +153,6 @@ layouts = td.TypeDict({
('OverlayDisplayToolBar', 'ModelOpts') : ModelOptsToolBarLayout,
('OverlayDisplayToolBar', 'LabelOpts') : LabelOptsToolBarLayout,
('OverlayDisplayPanel', 'Display') : DisplayLayout,
('OverlayDisplayPanel', 'VolumeOpts') : VolumeOptsLayout,
('OverlayDisplayPanel', 'MaskOpts') : MaskOptsLayout,
('OverlayDisplayPanel', 'RGBVectorOpts') : RGBVectorOptsLayout,
('OverlayDisplayPanel', 'LineVectorOpts') : LineVectorOptsLayout,
('OverlayDisplayPanel', 'ModelOpts') : ModelOptsLayout,
('OverlayDisplayPanel', 'LabelOpts') : LabelOptsLayout,
'OrthoToolBar' : OrthoToolBarLayout,
'LightBoxToolBar' : LightBoxToolBarLayout,
......@@ -296,5 +166,4 @@ locations = td.TypeDict({
'OverlayListPanel' : aui.AUI_DOCK_BOTTOM,
'AtlasPanel' : aui.AUI_DOCK_BOTTOM,
'ImageDisplayToolBar' : aui.AUI_DOCK_TOP,
})
......@@ -164,8 +164,9 @@ class CanvasPanel(viewpanel.ViewPanel):
"""
"""
syncLocation = props.Boolean(default=True)
syncOverlayOrder = props.Boolean(default=True)
syncLocation = props.Boolean(default=True)
syncOverlayOrder = props.Boolean(default=True)
syncOverlayDisplay = props.Boolean(default=True)
def __init__(self,
parent,
......@@ -209,6 +210,7 @@ class CanvasPanel(viewpanel.ViewPanel):
self.bindProps('syncOverlayOrder',
displayCtx,
displayCtx.getSyncPropertyName('overlayOrder'))
self.bindProps('syncOverlayDisplay', displayCtx)
# If the displayCtx instance does not
# have a parent, this means that it is
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment