From 7311c12e5853434a39eb9d666aebd4643ea066f2 Mon Sep 17 00:00:00 2001
From: Paul McCarthy <pauld.mccarthy@gmail.com>
Date: Tue, 21 Jul 2015 12:18:02 +0100
Subject: [PATCH] 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.
---
 fsl/data/strings.py                           |  14 +-
 fsl/fslview/controls/__init__.py              |  11 +-
 fsl/fslview/controls/canvassettingspanel.py   | 123 ++++++++++++++++
 fsl/fslview/controls/lightboxsettingspanel.py |  68 ---------
 fsl/fslview/controls/lightboxtoolbar.py       |   4 +-
 fsl/fslview/controls/orthosettingspanel.py    |  65 ---------
 fsl/fslview/controls/orthotoolbar.py          |   4 +-
 fsl/fslview/displaycontext/displaycontext.py  |  51 ++++++-
 fsl/fslview/layouts.py                        | 131 ------------------
 fsl/fslview/views/canvaspanel.py              |   6 +-
 10 files changed, 193 insertions(+), 284 deletions(-)
 create mode 100644 fsl/fslview/controls/canvassettingspanel.py
 delete mode 100644 fsl/fslview/controls/lightboxsettingspanel.py
 delete mode 100644 fsl/fslview/controls/orthosettingspanel.py

diff --git a/fsl/data/strings.py b/fsl/data/strings.py
index 0ab677cef..4d0308f80 100644
--- a/fsl/data/strings.py
+++ b/fsl/data/strings.py
@@ -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',
diff --git a/fsl/fslview/controls/__init__.py b/fsl/fslview/controls/__init__.py
index a286401ff..5013b8029 100644
--- a/fsl/fslview/controls/__init__.py
+++ b/fsl/fslview/controls/__init__.py
@@ -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
diff --git a/fsl/fslview/controls/canvassettingspanel.py b/fsl/fslview/controls/canvassettingspanel.py
new file mode 100644
index 000000000..82c076ecf
--- /dev/null
+++ b/fsl/fslview/controls/canvassettingspanel.py
@@ -0,0 +1,123 @@
+#!/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))
diff --git a/fsl/fslview/controls/lightboxsettingspanel.py b/fsl/fslview/controls/lightboxsettingspanel.py
deleted file mode 100644
index e7853c2a1..000000000
--- a/fsl/fslview/controls/lightboxsettingspanel.py
+++ /dev/null
@@ -1,68 +0,0 @@
-#!/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))
diff --git a/fsl/fslview/controls/lightboxtoolbar.py b/fsl/fslview/controls/lightboxtoolbar.py
index 5ac3a9f8e..8508b33b2 100644
--- a/fsl/fslview/controls/lightboxtoolbar.py
+++ b/fsl/fslview/controls/lightboxtoolbar.py
@@ -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) 
diff --git a/fsl/fslview/controls/orthosettingspanel.py b/fsl/fslview/controls/orthosettingspanel.py
deleted file mode 100644
index c41cddb5c..000000000
--- a/fsl/fslview/controls/orthosettingspanel.py
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/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))
diff --git a/fsl/fslview/controls/orthotoolbar.py b/fsl/fslview/controls/orthotoolbar.py
index 3b79dee4c..53bad4874 100644
--- a/fsl/fslview/controls/orthotoolbar.py
+++ b/fsl/fslview/controls/orthotoolbar.py
@@ -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) 
diff --git a/fsl/fslview/displaycontext/displaycontext.py b/fsl/fslview/displaycontext/displaycontext.py
index 1804040ea..931b25acf 100644
--- a/fsl/fslview/displaycontext/displaycontext.py
+++ b/fsl/fslview/displaycontext/displaycontext.py
@@ -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.
diff --git a/fsl/fslview/layouts.py b/fsl/fslview/layouts.py
index d16cb5835..0365fac0c 100644
--- a/fsl/fslview/layouts.py
+++ b/fsl/fslview/layouts.py
@@ -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,
-    
 })
diff --git a/fsl/fslview/views/canvaspanel.py b/fsl/fslview/views/canvaspanel.py
index 3a559c243..ef25c835b 100644
--- a/fsl/fslview/views/canvaspanel.py
+++ b/fsl/fslview/views/canvaspanel.py
@@ -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
-- 
GitLab