From 4635a8d6577d78f10382844d14dd55bc0db0f051 Mon Sep 17 00:00:00 2001
From: Paul McCarthy <pauld.mccarthy@gmail.com>
Date: Mon, 10 Aug 2015 17:12:49 +0100
Subject: [PATCH] In process of refactoring overlay display toolbar for more
 fine grained control over tool layouts - not finished yet. Toolbar can no
 longer add labels - it is the responsibility of the user to provide labelled
 tools. Toolbar does have a utility method to label a tool though.

Little bugfixes to atlas panel and colour bar panel.
---
 fsl/__init__.py                               |   4 +-
 fsl/fslview/controls/atlaspanel.py            |   6 +-
 fsl/fslview/controls/orthotoolbar.py          |  15 +-
 fsl/fslview/controls/overlaydisplaytoolbar.py | 243 ++++++++++++++----
 fsl/fslview/icons/filled.png                  | Bin 0 -> 244 bytes
 fsl/fslview/icons/filled@2x.png               | Bin 0 -> 272 bytes
 fsl/fslview/icons/outline.png                 | Bin 0 -> 306 bytes
 fsl/fslview/icons/outline@2x.png              | Bin 0 -> 358 bytes
 fsl/fslview/icons/resetRange.png              | Bin 658 -> 0 bytes
 fsl/fslview/icons/resetRange@2x.png           | Bin 1444 -> 0 bytes
 fsl/fslview/icons/sources/filled.xcf          | Bin 0 -> 8514 bytes
 fsl/fslview/icons/sources/outline.xcf         | Bin 0 -> 10344 bytes
 fsl/fslview/icons/sources/thinLeftArrow.xcf   | Bin 3667 -> 5924 bytes
 fsl/fslview/icons/sources/thinRightArrow.xcf  | Bin 3374 -> 5946 bytes
 fsl/fslview/icons/sources/verticalReset.xcf   | Bin 0 -> 4597 bytes
 fsl/fslview/icons/thinLeftArrow.png           | Bin 357 -> 456 bytes
 fsl/fslview/icons/thinLeftArrow@2x.png        | Bin 562 -> 743 bytes
 fsl/fslview/icons/thinRightArrow.png          | Bin 358 -> 464 bytes
 fsl/fslview/icons/thinRightArrow@2x.png       | Bin 552 -> 733 bytes
 fsl/fslview/icons/verticalReset.png           | Bin 0 -> 675 bytes
 fsl/fslview/icons/verticalReset@2x.png        | Bin 0 -> 1192 bytes
 fsl/fslview/toolbar.py                        | 143 +++--------
 fsl/fslview/views/colourbarpanel.py           |   3 +-
 23 files changed, 248 insertions(+), 166 deletions(-)
 create mode 100644 fsl/fslview/icons/filled.png
 create mode 100644 fsl/fslview/icons/filled@2x.png
 create mode 100644 fsl/fslview/icons/outline.png
 create mode 100644 fsl/fslview/icons/outline@2x.png
 delete mode 100644 fsl/fslview/icons/resetRange.png
 delete mode 100644 fsl/fslview/icons/resetRange@2x.png
 create mode 100644 fsl/fslview/icons/sources/filled.xcf
 create mode 100644 fsl/fslview/icons/sources/outline.xcf
 create mode 100644 fsl/fslview/icons/sources/verticalReset.xcf
 create mode 100644 fsl/fslview/icons/verticalReset.png
 create mode 100644 fsl/fslview/icons/verticalReset@2x.png

diff --git a/fsl/__init__.py b/fsl/__init__.py
index dcd21e061..be8f9f4fd 100644
--- a/fsl/__init__.py
+++ b/fsl/__init__.py
@@ -59,9 +59,11 @@ import argparse
 import subprocess
 
 
-# make matplotlib quiet
+# make numpy/matplotlib quiet
 warnings.filterwarnings('ignore', module='matplotlib')
 warnings.filterwarnings('ignore', module='mpl_toolkits')
+warnings.filterwarnings('ignore', module='numpy')
+
 
 # My own custom logging level for tracing memory related events
 logging.MEMORY = 15
diff --git a/fsl/fslview/controls/atlaspanel.py b/fsl/fslview/controls/atlaspanel.py
index 9868a3c27..45e283801 100644
--- a/fsl/fslview/controls/atlaspanel.py
+++ b/fsl/fslview/controls/atlaspanel.py
@@ -209,11 +209,11 @@ class AtlasPanel(fslpanel.FSLViewPanel):
             #      of having to look up the LUT object by its
             #      display name
             if   atlasID == 'HarvardOxford-Cortical':
-                opts.lut = fslcm.getLookupTable('MGH Cortical')
+                opts.lut = fslcm.getLookupTable('harvard-oxford-cortical')
             elif atlasID == 'HarvardOxford-Subcortical':
-                opts.lut = fslcm.getLookupTable('MGH Sub-cortical')
+                opts.lut = fslcm.getLookupTable('harvard-oxford-subcortical')
             else:
-                opts.lut = fslcm.getLookupTable('Random')
+                opts.lut = fslcm.getLookupTable('random')
 
 
     def locateRegion(self, atlasID, labelIdx):
diff --git a/fsl/fslview/controls/orthotoolbar.py b/fsl/fslview/controls/orthotoolbar.py
index 87709981e..414086975 100644
--- a/fsl/fslview/controls/orthotoolbar.py
+++ b/fsl/fslview/controls/orthotoolbar.py
@@ -11,6 +11,7 @@ import props
 import fsl.fslview.toolbar as fsltoolbar
 import fsl.fslview.icons   as icons
 import fsl.fslview.actions as actions
+import fsl.data.strings    as strings
 
 
 class OrthoToolBar(fsltoolbar.FSLViewToolBar):
@@ -61,7 +62,19 @@ class OrthoToolBar(fsltoolbar.FSLViewToolBar):
                       'showZCanvas' : orthoOpts,
                       'more'        : self}
 
-        self.GenerateTools(toolSpecs, targets)
+        tools = []
+        
+        for spec in toolSpecs:
+            widget = props.buildGUI(self, targets[spec.key], spec)
+
+            if spec.key == 'zoom':
+                widget = self.MakeLabelledTool(
+                    widget,
+                    strings.properties[targets[spec.key], 'zoom'])
+            
+            tools.append(widget)
+
+        self.SetTools(tools)
 
         
     def showMoreSettings(self, *a):
diff --git a/fsl/fslview/controls/overlaydisplaytoolbar.py b/fsl/fslview/controls/overlaydisplaytoolbar.py
index 7223ea2f5..457524eeb 100644
--- a/fsl/fslview/controls/overlaydisplaytoolbar.py
+++ b/fsl/fslview/controls/overlaydisplaytoolbar.py
@@ -19,6 +19,7 @@ import fsl.fslview.toolbar as fsltoolbar
 import fsl.fslview.icons   as icons
 import fsl.fslview.actions as actions
 import fsl.utils.typedict  as td
+import fsl.data.strings    as strings
 import overlaydisplaypanel as overlaydisplay
 
 
@@ -27,43 +28,65 @@ log = logging.getLogger(__name__)
 
 
 _TOOLBAR_PROPS = td.TypeDict({
-    'Display' : [
-        props.Widget('name'),
-        props.Widget('overlayType'),
-        props.Widget('alpha',      spin=False, showLimits=False),
-        props.Widget('brightness', spin=False, showLimits=False),
-        props.Widget('contrast',   spin=False, showLimits=False)],
-
-    'VolumeOpts' : [
-        props.Widget('cmap'),
-        props.Widget('displayRange', showLimits=False),
-        actions.ActionButton('VolumeOpts',
-                             'resetDisplayRange',
-                             icon=icons.findImageFile('resetRange'))],
+
+    'Display' : {
+        'name'         : props.Widget('name'),
+        'overlayType'  : props.Widget('overlayType'),
+        'alpha'        : props.Widget('alpha',
+                                      spin=False,
+                                      showLimits=False),
+        'brightness'   : props.Widget('brightness',
+                                      spin=False,
+                                      showLimits=False),
+        'contrast'     : props.Widget('contrast',
+                                      spin=False,
+                                      showLimits=False)},
+
+    'VolumeOpts' : {
+        'displayRange' : props.Widget('displayRange',
+                                      slider=False,
+                                      showLimits=False),
+        'resetDisplayRange' : actions.ActionButton(
+            'VolumeOpts',
+            'resetDisplayRange',
+            icon=icons.findImageFile('verticalReset')), 
+        'cmap' : props.Widget('cmap')},
+
     
+    'MaskOpts' : {
+        'threshold' : props.Widget('threshold', showLimits=False, spin=False),
+        'colour'    : props.Widget('colour')},
 
-    'MaskOpts' : [
-        props.Widget('colour')],
-
-    'VectorOpts' : [
-        props.Widget('modulate'),
-        props.Widget('modThreshold', showLimits=False, spin=False)],
-
-    'LabelOpts' : [
-        props.Widget('lut'),
-        props.Widget('outline',
-                     enabledWhen=lambda i, sw: not sw,
-                     dependencies=[(lambda o: o.display, 'softwareMode')]),
-        props.Widget('outlineWidth',
-                     enabledWhen=lambda i, sw: not sw,
-                     dependencies=[(lambda o: o.display, 'softwareMode')],
-                     showLimits=False,
-                     spin=False)],
-
-    'ModelOpts' : [
-        props.Widget('colour'),
-        props.Widget('outline'),
-        props.Widget('outlineWidth', showLimits=False, spin=False)]
+    
+    'VectorOpts' : {
+        'modulate'     : props.Widget('modulate'),
+        'modThreshold' : props.Widget('modThreshold',
+                                      showLimits=False,
+                                      spin=False)},
+
+    'LabelOpts' : {
+        'lut'     : props.Widget('lut'),
+        'outline' : props.Widget(
+            'outline',
+            icon=[icons.findImageFile('outline'),
+                  icons.findImageFile('filled')],
+            style=wx.VERTICAL,
+            enabledWhen=lambda i, sw: not sw,
+            dependencies=[(lambda o: o.display, 'softwareMode')]),
+        
+        'outlineWidth' : props.Widget(
+            'outlineWidth',
+            enabledWhen=lambda i, sw: not sw,
+            dependencies=[(lambda o: o.display, 'softwareMode')],
+            showLimits=False,
+            spin=False)},
+
+    'ModelOpts' : {
+        'colour'       : props.Widget('colour'),
+        'outline'      : props.Widget('outline'),
+        'outlineWidth' : props.Widget('outlineWidth',
+                                      showLimits=False,
+                                      spin=False)}
 })
 
 
@@ -152,6 +175,129 @@ class OverlayDisplayToolBar(fsltoolbar.FSLViewToolBar):
         self.Enable(display.enabled)
 
 
+    def __makeDisplayTools(self, display):
+        """
+        """
+        
+        dispSpecs = _TOOLBAR_PROPS[display]
+
+        # Display settings
+        nameSpec  = dispSpecs['name']
+        typeSpec  = dispSpecs['overlayType']
+        alphaSpec = dispSpecs['alpha']
+        briSpec   = dispSpecs['brightness']
+        conSpec   = dispSpecs['contrast']
+
+        # 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)
+        
+        briconSizer.AddGrowableCol(1)
+
+        nameTypePanel.SetSizer(nameTypeSizer)
+        briconPanel  .SetSizer(briconSizer)
+
+        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)
+
+        return [nameTypePanel, alphaPanel, briconPanel]
+
+
+    def __makeVolumeOptsTools(self, opts):
+        """
+        """
+        rangeSpec = _TOOLBAR_PROPS[opts]['displayRange']
+        resetSpec = _TOOLBAR_PROPS[opts]['resetDisplayRange']
+        cmapSpec  = _TOOLBAR_PROPS[opts]['cmap']
+
+        rangeWidget = props.buildGUI(self, opts, rangeSpec)
+        resetWidget = props.buildGUI(self, opts, resetSpec)
+        cmapWidget  = props.buildGUI(self, opts, cmapSpec)
+
+        cmapWidget = self.MakeLabelledTool(
+            cmapWidget,
+            strings.properties[opts, 'cmap'])
+
+        return [rangeWidget, resetWidget, cmapWidget]
+
+
+    def __makeMaskOptsTools(self, opts):
+        """
+        """
+        thresSpec  = _TOOLBAR_PROPS[opts]['threshold']
+        colourSpec = _TOOLBAR_PROPS[opts]['colour']
+
+        thresWidget  = props.buildGUI(self, opts, thresSpec)
+        colourWidget = props.buildGUI(self, opts, colourSpec)
+
+        colourWidget = self.MakeLabelledTool(
+            colourWidget,
+            strings.properties[opts, 'colour'])
+
+        return [thresWidget, colourWidget]
+
+
+    def __makeLabelOptsTools(self, opts):
+        """
+        """
+
+        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)
+        lutWidthPanel.SetSizer(lutWidthSizer)
+        
+        lutWidget     = props.buildGUI(lutWidthPanel, opts, lutSpec)
+        widthWidget   = props.buildGUI(lutWidthPanel, opts, widthSpec)
+        outlineWidget = props.buildGUI(self,          opts, outlineSpec)
+
+        # lutWidget = self.MakeLabelledTool(
+        #     lutWidget, strings.properties[opts, 'lut'])
+
+        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)
+
+        return [lutWidthPanel, outlineWidget]
+
+
     def __showTools(self, overlay):
 
         oldTools = self.GetTools()
@@ -170,30 +316,27 @@ class OverlayDisplayToolBar(fsltoolbar.FSLViewToolBar):
 
         display   = self._displayCtx.getDisplay(overlay)
         opts      = display.getDisplayOpts()
-        
-        dispSpecs = _TOOLBAR_PROPS[display]
-        optsSpecs = _TOOLBAR_PROPS[opts]
 
-        dispTools, dispLabels = zip(*self.GenerateTools(
-            dispSpecs, display, add=False))
-        optsTools, optsLabels = zip(*self.GenerateTools(
-            optsSpecs, opts,    add=False))
+        # Display tools
+        tools     = self.__makeDisplayTools(display)
+
+        # DisplayOpts tools
+        makeFunc = getattr(self, '_{}__make{}Tools'.format(
+            type(self).__name__, type(opts).__name__), None)
 
-        tools  = list(dispTools)  + list(optsTools)
-        labels = list(dispLabels) + list(optsLabels)
+        if makeFunc is not None:
+            tools.extend(makeFunc(opts))
 
         # Button which opens the OverlayDisplayPanel
         more = props.buildGUI(
             self,
             self,
-            view=actions.ActionButton(self,
-                                      'more',
-                                      icon=icons.findImageFile('gear32')))
+            view=actions.ActionButton(
+                self, 'more', icon=icons.findImageFile('gear32')))
 
-        tools .append(more)
-        labels.append(None)
+        tools.insert(0, more)
 
-        self.SetTools(tools, labels)
+        self.SetTools(tools)
         
         # This method may have been called via an
         # event handler an existing tool in the
diff --git a/fsl/fslview/icons/filled.png b/fsl/fslview/icons/filled.png
new file mode 100644
index 0000000000000000000000000000000000000000..c8b4c4265504403cfbfbe82121a6fdfb96dd141c
GIT binary patch
literal 244
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b
z3=G`DAk4@xYmNj^kiEpy*OmP~2bTZ`&svL9Yk)#(nIRD+&iT2ysd*(pE(3#eQEFmI
zYKlU6W=V#EyQgn}LVlh?qJnQ?^3*5s(Le?Mo-U3d7N_4{UdY>Ez~FN6x|2Y~v?PvW
ziOwdoB)v42ac_}usV}lDy&rp^hc!}`Q9LL0&LmT%Om$cJmrZ&<+7pg6?=ImL{?x%-
deRwYW9Q`Y4lAn3M1l$2x?&<31vd$@?2>`m1OD6yT

literal 0
HcmV?d00001

diff --git a/fsl/fslview/icons/filled@2x.png b/fsl/fslview/icons/filled@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..b7f57f4885b69546f4993360af0f01162fd02a5a
GIT binary patch
literal 272
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_d#0*}aI
z1_o|n5N2eUHAey{$X?><>&kwggG+!zW<&q26F?!g%#er@=ltB<)VvZPmw~~#C^fMp
zHASI3vm`^o-P1QfAwN$cQNcGcdFqq+XrO{@PZ!6Kh{JC$Y~*Ef<Y75rSyANT<SgQ?
zdgP0PY`Omd+eJ+F2iHA0FuUT(v&pQ!xop3Trc0k|?PwI2i~cz0X_Sd<xy7Fjw}-!f
zx70B1R&8Kl;!uDS5AqqpWw_tZE4Vpr+jI7Ne35E<ql7t+f*j`Q>gTe~DWM4fp9NOx

literal 0
HcmV?d00001

diff --git a/fsl/fslview/icons/outline.png b/fsl/fslview/icons/outline.png
new file mode 100644
index 0000000000000000000000000000000000000000..4b2eb9af1a2396cc825dae40c8c9a8b51cd4354e
GIT binary patch
literal 306
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b
z3=G`DAk4@xYmNj^kiEpy*OmP~2bTc5tb@R}i9jK>%#er@=ltB<)VvZPmw~~#C^fMp
zHASI3vm`^o-P1QfAwN$cQNcGcdFqq+XrO{#PZ!4!i_>o}Z{$7Xz|;Cr|A|&rlv{#8
zTLSa7hTa=0rlLY7R~EF$oMm<8csc1pK*Gt^)ZgE==W(Ce=wPD96_YS|+VUq>3;d4g
zu4A5ZX2TJ_(if(D77NcZc&*vBh(BY}ESUwqoAoW@kIH}GZus!*tzNPH2f>2F$p<d7
reYacS%V*OcA}`3S^+tV9apz;<tWBEj^ArE91v%Z*)z4*}Q$iB}KUZpZ

literal 0
HcmV?d00001

diff --git a/fsl/fslview/icons/outline@2x.png b/fsl/fslview/icons/outline@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..b3ee8a63c0e3f0ae2cdc1ecef3d8c9a65af79f86
GIT binary patch
literal 358
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_d#0*}aI
z1_o|n5N2eUHAey{$X?><>&kwggG+#2H|^vxTcD6yW=KSdbAE1aYF-JD%fR4Vl$uzQ
znxasiS(2gP?&%w#ke{cJsNkEJJoQO@G*H1oPZ!6Kh{JEM8|E<?3b;Kyf11gw{nCL(
z3&!IoTTgffxmhyrWKiuo<RrNMi3{V>j=g7XGP!QI&Oa9X$8X<@iCa<+>^$GC8^){3
zw&!u`or=@5r@NIN`+Vcq#f$@M1XemaO=s0x>Tr_rIF}G-c21pj&C&FICE*|6&M!E`
z{;kNmZqt!Hhn{xF+-KWsY^W%}gg_VWd#qpC6!Sg2kyWn9>)-o;D&sfPHtun~+xv7f
l&qJ&F(@}=UlPyao7qZsf52%d!{6ie%T~Aj(mvv4FO#n@ohD-ne

literal 0
HcmV?d00001

diff --git a/fsl/fslview/icons/resetRange.png b/fsl/fslview/icons/resetRange.png
deleted file mode 100644
index f3f9bdf4f616bb5fc83caecea5540a0850a1da5c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 658
zcmV;D0&V??P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv0RI60
z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru-v|j2E;w8zc;o;80v}04
zK~z}7?bgqWPEi;K@XvkUdCiO;F@-`+lt$S|lk#K!1EDPV2e4ql#s+IPlI-l1joE0*
zf)t|+ij8Q}lu~S!-wVTdEj(AJckaFK9kcX)>vYaN=Q-zm&vTyVdoDfn(8C|BsTgZu
zGuEQjF*bzd$#*O4>tKD}*p4>(3XHO-@8f2)kKujHNy}sGsk!-4%weFBFkVqH;Ri<X
z1y^wqTd@(FunTW7g_-b76<YY5A9^%Su&TlX_rm5?Tm|%FNmBAdOor_Unk58|<70k(
z-3T<X7jF`GZ>U%t#>38H2sE)2mpb}Ky12JL>X+e-)RPPLz>$KJWHkeAEana;S2T}6
zqa)q2jx@S}GaZxLH3>{%7W<;kl0C9?(;UB&JI=8h6Ny_FifcHS5N~(x(U-7!7$lmw
zjdRieZ2_n5#B>BOJi=hCzcM9|<3;5A0PZBj8jDcaL41$)gHXRLl=W}S<v}=5us|C-
z3xcRFCUB!f3Fif25rHQ-6+!ebIDqQ~n$c3jy)B%^;Vv>=hLiXjZ$wu0(v@K@0%r!d
zIz*-lOG02S;|f0DXVru%Ark%Vkk>j`7Qy_iLbwWrs0^R51&2aj$7;C!Id(*rRi<#N
z17-Kr#_JfL4852Qk(rKE+l~FP`FWg;waZ-JjFQ1RJY7I=4dX=oq`V7q;~_XhHQ$SE
sxLd@k8?p*bXqNm{bz8589{zLu2K?J{guceirvLx|07*qoM6N<$f&n)u-~a#s

diff --git a/fsl/fslview/icons/resetRange@2x.png b/fsl/fslview/icons/resetRange@2x.png
deleted file mode 100644
index 041d1f2429cc998a11e6a70f45542ae63a0c0983..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1444
zcmV;V1zY-wP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00006VoOIv0RI60
z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru-v|j2F9{UjNuK}!1u;oP
zK~#9!?U`F>TvZf?zcWcDP1<^+rZrw#qgH}MsD*0P2bH2Pq9Q){BGUR&L8z#p^g#_O
zwU46cgR~D?5HAQK67Ygj#MWA@*lN8*NTVoLtH#(gO=iyVA^&z3CzE7m&OS4W`-frX
z>~m(Fz5jLDYpo3d0RaI40RaI40RaL3L$m>re%}Th2gVwZ69GkFC$J89&&YN6%I5jA
zfQy0EKrhe<{BG_S^__TJYXlU4O~4nD{g3?3W}s*$Un`2h?ZC8T^rU3;0QUf&oA*@v
z`~f^Ia*Cc853oz``6xBc%hFH+tPxZ760p%MWUa=p0X{Y3Wnf~C#ZLk!&GivrP;xpm
z65!UeABcfJ-FUlxOdB>z8CeEc4!i?w(83(P2S$Lsz_2vl39JMz1NwoBfDT{<@G$To
za6PbFE?dq(L|OBkC1aPENq~U{E#NMry(xV=m)HrM3oNRE#M6wdl9|`*Rfw+F0zQ^3
z7jFs$kA9Y<f-Asl((oqWXA!ax0TaLu{T|eJ3AhFLMDOu7Z=VFD<tD(*z*b<1tYRVa
zjrE+vV?ehw7Adxj=(*_ML_iE2OpQ&;5*`7@fiC%WBYxWh?9-yp1K#ju3BCv@$vlg|
zy}(dPOR;f_dNHN{UJe|R%$tBMlIsOof?$s!GyT6lZH4_F=Gd+vnkY`hdUr=FgWx&^
zw?q?)Qvq#MNyo4!E1LwamODkj6Ey_ZTr40miG@pSx|@)?yLo+Jw%Vnwuz(KWOeHT}
zB5<M!1UL(OTyrP`+gcF>r&K&SOW5i;cV7ta${otU4GNNlW)c8!w={AD_$6bC+6cCb
z^i|3p+kFvGYl1PL;$_5Wqgf~dFPYt;x6#tM8UYjY?5~cTv-RBt>}gRi<Cr0Rz1a=g
z=7}9~wY@dHxNVA(Nh;_K0k7)%9CPoh7A)SS%;PfuK6CGU;2~|BwkcCiJvWO0OlPPX
zHUc*SZz;ET7;BLQl#SL;HRF4LWm#Mxp5t>&`#$o0hea(SATsl}J%=HYQ?9axq!tUf
z7Wle~zZ^Gv{ZTW%vPFw80*iJ1gSmGnaK9F7U0_<h$~6lS@R!Uwo+FR|d}H!~wJji^
zpaATw?|{Z!0X9~Ju&U*Fd#a(~n3}4g(i&H@;}SEexJd+@1g<mJhqaceDm?|;pNM@X
zLNCY+S7%8?GT;F%>Zds@HrGtBgPHcVv!Yw8u%0KD1DDDY4k<R3vIwlV8f=sHN2#>3
zo9X}0nQCx-E2_b=Ca^<9l+^ml8|?~yn`MRHY2VM>AI#DbnlS(EZbDUfm`eNoiW=XS
zTSur<<)~|2kD4A{9*vOg%p9D!rpR7ju_x=n$SX!G`{v0pd_?_(%F$L-CxNppzy|?N
z+xv`+gC<ESWb}D}C#f_;6BRX`4Ombv1XxXs7&!@WRmOC8G4Q3_%gMYjgA3($H0BN|
zRsnBn>;&+ke04*rnNgH>-KQg^(H`JgrRDvyvT@)7{B)ST$AGjYY%%iOetiOXl$o>t
zWxy%Y@Dkt*HCgTeK1=;C0p2%37oQg39(d8bY#^iG7K|33r*g_`&;CoA#8Kc^k&~Ew
z-CYlBtE(sA)k45;X#xh#1XkeZ$jqJCECrqczNK<pKHuj@;BDYa<1#+VXV)u8G#7x#
z*30)XbH2Abrv#==MN_ZR*FJS}CRNWLP?9rd`VNuDG&=%LSG(*f5uKz>B(LLgC%eep
yXL$t^9LZ4$<dCQZ1Ox;G1Ox;G1Ox>9x9~TZ{g_Wx`l|5&0000<MNUMnLSTZJvW>|A

diff --git a/fsl/fslview/icons/sources/filled.xcf b/fsl/fslview/icons/sources/filled.xcf
new file mode 100644
index 0000000000000000000000000000000000000000..844f799c39ec2c6439a68976ea065f6fe023c1a1
GIT binary patch
literal 8514
zcmeHM(Q4FC5S>k>c6VE?)e54*^=&I`X-n&KsSl!1DE>h<o1_<alai#^K1KY1Qv3uz
zp)Y+EKfy<T=6WXHv?+}sMI=mf;V>t2XKpfg?(WQHLp?oEM_!-;J@JXCV*x?*fG=3{
z5SZIJC1PMa0`6Emwvz3ZVZR5t5MtS(7f+{tl;OHq_UY@ycQb#iKI&{=y?ML4r{YMt
zYS;DHWU=tkQ#bU7VWP*@twVz}JD&I|jVF4%(i;S!7f<3u4GJ+#!jY@iR@aJAL)Puo
z3S37uuI0S?Ghx@G^uYCW6sq;|UQiy_DXngJ80k#u$lLc*_K$-g^|OlyWbf;$-<qqg
zybpGC&P!HF6z_X~$MrshNqiU;+vZraSx8Qk0p=`c^RDF(^sK^r72dD#`3hgC@cZDr
zZaMCP@cnp{N2GifsGOvjxjbXAbxw$0yaZldopXK?%`O2Oz<WIM7n~}_SKtgs6If<^
z2YwJe0iKV5&j4(Q@|kyLi@HM4M$_C}A~&>Ux<Zi8Y@2-k8$LhRBtdU#^rij9{3i8`
z6mYy!V&OOh#zUK?Ck9d~RvSliD^{a(BczVrv>(V9(Ys#4R5<HJ)gnoCwT<OJ^?ZVA
z{Z0CoMt^q;`L*5daf5r8wm)e513~W>+P>i*_YG}-Am*)iT^-IHGIe@Mx?2;Y@LG;M
nQhpD>nXQrLZ{}s!hurB4f1`0rA{1S9kwgAV`I80nZ43GZ4;azx

literal 0
HcmV?d00001

diff --git a/fsl/fslview/icons/sources/outline.xcf b/fsl/fslview/icons/sources/outline.xcf
new file mode 100644
index 0000000000000000000000000000000000000000..63e730334379ac2eabfbe4a2bcdd006da4e82950
GIT binary patch
literal 10344
zcmeI2&ubGw6vtmvNt3kIia)5d!nD<z9wM!@9z-P6gIFvS1Wz8^ZZ_McNwy?gZBLs&
zK|Fg9{SQ2N5hN7x;L(FePa^&o<M(Z5<CdmUgiO=z4t#hoZ|2R9o!NcEOl+sRC3eiR
zC_5F4hz1l8MCbVjTP}di@=GEH=^{7-2Ek>ebGb_>zXmyKquPS$R;yOc!|$NliTicS
z@T`(};dmS3!Nb)x;nsv9Rt=Mjj0HYU)v&FCU3W^#ZGiF(Z?|HJhFft;bGdxkHr<L_
z7x_RG>h`)J=5Njisf)6pvgY8r-o-V{7l$kCy3^P)Os8gxg|ICcce@#tt*~8lJmJ*L
z4XeTaZn@mByiNz%`=F_9+3(8FL8XC@ZDne`EjyFN%J8ybZrXKsyB0jUl=4YK@>EHX
zQ92jTDjk9*BYG~P4@dNoh&~$8&q3#U!!!hi+v5~2ldvx^rJe^lf7cnxrd|<Et$-){
z^HM*E(&OMRc!n;&!OD6I-h(|X&(BzKU%+?pi|ER4qN_XLHE3~N{@{vSqHIh^M$^A@
ziMgRAne92_a+Z3}B;K5&^ha9VB>8FNrJLRILZ5wQ7AYs=0za3yjD^P$!|~9f%=H)@
z?;y94i%sl`OAJoNp*aR?h<3W(=KpC2k$4RI*nbeGXq1d4K075{b2)L!zYxhDA&JSF
zV{*Tpr=0RHK(a^B6>E}qPUik3*(1a~M*1m|$rw-mJ|LLKV~yv%KgGuw$v+FQW)H}r
zR{QMyh-Km(k^IzftWMhx&erJ|;c>>_Uf%_9{g_3*Zf+`AFDf89*YxKeTNTUn9Q^HJ
z)o5%Yt8-NzUeo)q9p#!HpO3(o>&D?=@J|eg@W!3ZDoy>2^Z@p0*z@?4M*eBLK-jzK
zN67mCJ^|dS&)g!q#@q&Xh^~WK<{nrky20#$uizWk<!9f~q@31(pKanR*_2T^A!kSj
zI>y(}ZQv|gGCH1hKey4(bEKnh$vS9%Z*)BC!`kpOMe>JQGAfVno$)gz4g*aE>qQ0q
E0Z~cET>t<8

literal 0
HcmV?d00001

diff --git a/fsl/fslview/icons/sources/thinLeftArrow.xcf b/fsl/fslview/icons/sources/thinLeftArrow.xcf
index d63bc2dcd44ac685a6ffabaf4dab310e856b1aaf..4e2a23e65a57dede15f3a0557e25fbc7d4935efb 100644
GIT binary patch
literal 5924
zcmeHLO=w(I6h1SVNiu)Q#M;D#g(q!n#%3mot@Wp^3)gm|i0gDZGd?=WgiO>1gjY8r
zxKPB6BI=?WML|(eP%(<2q6<M63NBo9;X<Sf7b4>IJMY~y_uQ9E{6Pd^E_`#&yXV}$
zbLW2dyw?fWHiC=IcF+#HEke0WlzEdClo=qC!OsC;@~)?H&oiK33*>+aVAksFcM$&9
zLsmQJwjQpnc3Sn$W_TV|1bc=S`di!GR?zQt!}GP`Lc7!Kb$gq^LM-Z=opY<fa$`9z
zdnhZ`R72Bqdo&e$FkIoL7yBEl&2YUFtjJiX+}^9w*3}<e54VDFz4<_^&+U8dcE7bX
zm>{>_U6s`MO*sy>WS$@@y_7s0e8pBigcxz~IhNNnyS?Ux#s=ou>}_lZhgaAs%ReaN
z0PlbSCaun`3RZ_8-U;^MQUpXVDZQ-piqfZ{bH5FM3-7eF*SjAZF|D&!krlu<yM`4$
z0z3{p<J+@u!2Ti87<_VQlYbOTdJ=dML%jyPkKsQ{mQ%Qb>0d=3aTigQ$V254MS}c&
zlr>8<X^v6R)TnHZ(v-Q;VxFqzh{a)=F$t<x@^fOBdhunc>xSv#Kiuxkn?9i54V@YM
zoTiL9V{sbGNaGZZ8NnTtGa9#3-e}xL<3{6FnlOTs2u~WfP{9aJAasJ`R5EGYjIat;
zsA2@m2y+@sG>z>@&_EakgAK#RxlK6&&-nq|#w8nA!DgmWHVc?df)X}dP&7AT6+R01
zQwS!_BBGFB!qgERALE#*AdeMj<giMOF+@Nki|7b4h+Z1l^y9qg@lWXemnA%P{5umQ
zAseRq{{MzAkL$Kc&qM1xuAY;7cJ2R;U3{zVB+H3br~S~bnGIX9n}wU1_H}j{*^i{N
zH?R|8^L2^RFuSh*b6=i^8;AXQ4pNusm3^ZV45A~g+^DXnq-Qr$+IK&@o{{TY_vOY(
z`=-a)&z|;8#u6G~nWh=0AWbPz>AArPvu918LOGo*H6;s^u@r_Asaa6iQA=S@mYQ9K
zb+y#YtXW$#y6D3AEYmlF+!iA59NZ=DR*AC4``gIcHDhTu(@ZD2Fd@q{Qwob}DJ;uU
zv#_wUmcrgFHM^(TpP%*Zpl=P<X9ichuZv$|zk#Cij*sF;6j@|(g#6aJSHGv^ve)(`
zp^zki<-AHhj^duGAsWYU?=0bdi1H^mojC=38|O7dhakIFpMpGTbxEl>y_@!vLiYHt
zGC@0=Ju^X`gDvIzts>J#CRlzLuLh3+PXjOb_VT;1e@;|^&(tNX5P5O+S>R>7f4mKR
zf>ih`yn-NuJ@6A=J$^+WoXvViH$KL4XRsV)f=NcGxrTMkLz<^V*F2{AP4l1V!i_97
zcc$r?pEZ5EE2HYswwy4Q`mCq9K=Xv?nnyIhX#Nph^ONSSG`I1y=04#=k(xJI*PP0_
za4k!H|A;P0;3yLuWSyKra0WWc1l=Lgxl*E!GC`q}G}VkU!T1}(C==YBpULg=Kh6X%
z+s}j3_qMvN=2qBS56-UkFK{x1EGsUO4MuqSE8hh<(d4$AT;g4u#sC!g#K+aP%q~Ka
z8K8dlZlXC<&EXT`+;!H;+Gk&d{dM3i;2q#SU<ddZ_!Rg8_!9UU_y+h6_#U_d`~dt2
wTm^mxegS^t{*mOF7zHc&`Jd?J9fS7(6HP4g=hJ%t$-!&Ty8suCL7apC0WN+TNdN!<

literal 3667
zcmeH}+int36owZRY)hdBdv2kf9w=a?2d(wcRugZ00xvabDIiLrDb=)B7`->%nHX=3
ziTCOY7~jH|arrNp1&b}dfOaPz|C*V-hdq1N+VdAnN5|e-uHY3)<vgLiAPRhw0Br;W
z0{9sPefQsnJ_v}%KnR4vgda=4arBQvhl{vvwsf>#%x8-yr9+$|Tn|vXc6wgUd$nr0
zbeM^x3&mWuTs`s94auGq5B9x{wT(vW5^VaHG8lT$WvE{F{vOECv)b`~u2d;{oBCfk
zdEV`$e=hsHQabfYmE4njO~zLXg<Af!H9;Bu=c(qI&Y`jneha+T2&#)NYZ%FutGQ=u
z$CaXV2+9xIB_J!#pwEw`cfTJ)NLF6@NQ(fC2TU9_am>U+h~>W8dJ*V&ecL)0Tng^_
z9d+jD8+=4GxDIx}gU;*0kGTGYs0V#QkC8Y}@kkik`wD;i29NO`Q~pde@Rca~jwtpC
zG}5p>Ow>W_CDoPiLkjXb_3<i2I73lR(IBt*Bx#tJ9hPW>T^8vwD+@HribrGYGEd{I
z%+Ul}5;Vz{c;~zW_vjbXUh8L<0=(z2i^oxRsE3t16k?a#6lUcXU1H@X^|H%0mPoll
z{cPF7(pj$409&qMS(QzSv9f_>c3Gz(ypASoSo+qB!V8<?_<xN}Vp$s@i*$6kigZ*~
zk&c!tNJ&cu>1atKC6yG?(Pag1KuOXxE6X&4Qt4!gW>G3l7AcMrX|g~Glt?EY&7oA<
z%+ox|q{$q4D3eYu@}gY}HZKyifGwm+oEA|rO=f9{l^I%QmuX6}GDRzFnWPk3CMeA=
z_PQObvEEzM{coL@s?J$epGVZq13A__5xvNZ?s;Kr%dI^**4h-+niX|xT8_2mMRhMw
zwflwcBUbHRWA`DuM`^5kn5f<3bnmmO-waXrn<C$vi@fNb7y2z$)$g>Z{f67`yT;Z7
zs5cOGy@MR9w-8m&A?kV(Iabf2s(wb)`klKiC)D;tji?^vw!{0Uje~WI)=6qCP7^LN
z`n{9L532hFeLw2@RQ0f`>Tgx82euwLY5a2vNtA&(Tt!l><K@-ETVm?r?&+uR?i0|m
K9}hyeCH@V7x#F4t

diff --git a/fsl/fslview/icons/sources/thinRightArrow.xcf b/fsl/fslview/icons/sources/thinRightArrow.xcf
index 09776f3b092416049316841864f75121924b041d..764c2917002f44c4c08ef81cf95e362720bf895e 100644
GIT binary patch
literal 5946
zcmeHL&2L*p5MMivV>{2WQyND|R6GbD3DizZNFe>-P>CZKs{R3qW4ljv;}D0cIlYP#
z0))5#7cPh*!I6(M4Lxw+z<~o22yx(mDh?cq)I$$le&gNAo8367RU{-Nuk`cG?#}Mc
z?#}N1{Mymw?eJ=&6}F;IQz2bfD)kj9NYg+ng`bCj+`0EM9}%D*2Qt7UP_a7M&A|Q<
z$Z{LqR-?=7?Pj&T6K$eMp+2SNd%Js`X4va?qRoZEe5>8)cDg&^d|y;|+8gWPQf;Z9
z1}Jq~wScA@1DbMuc(g)IulBar8_`xftn*kX+#6JA%c`$$MZ00N)wtN~QTuMI)obn^
zI7qDz7nu^bDXoJ|skgCwpP0<dzAe0hHKN6*wLI47bQ_my+wil|-QEl5>SUA!XyrAK
zvpQMltq!4R2grs}0breWi}gV0MWL6VQ@=HU(geV5c-N`Sru55JVb5WkMjTDX0L}12
zw?6&3QezhY*koP<ZYeeXKBo0C@CAmuf#Ki8bUuLV*MYy$N0<7D%L3U=mDX!2r&m-#
zFRMV;)s$YcSX5<QJHWKAs%e{-I@xf!YcJal*4bXRPxQQsi`QHT-=7ek4es6d(s(-j
zEd2I~XZN3RSud)R171~@bydV_CwLC4&sbKI*bNuYV}}?kDzBZj$(>U7v|1KFDRkf?
zjR6>A7@U#8mirio^NcLEm?6W5+>lsBATeH06PocNTKiZ-?~GFzopBmo`8Wfw8D}vo
ziI-^3X9xVm+1QC4p1=g+SR$uS!fk`Reil=5QP9s|<qanF0(Qk9(DT?a7e)OvcGO@>
zKZSE-P|{B#8eEh$MX<rNp2HcE`9vq1e^YPzJ>i~vI!EGcWe+?tqa~xeUb$W#wsq@e
z+rzUU+c`U~)Ol=Kc9cGxZ88qoo4!mL>yNstleyu>(-{$S9EVcMc;z@I$??t7KLdO|
zSn}B+DbE$_eEdnu>w&Kgl5$(ej#yrv_MqjLOU=t`qzqsVY?d7KEd7JQhlV5{CX)VP
zqdXr*lJcPP0hW?)D3bmSMz@>1t$3B>rOTHwN&mv8eDbiA`_CUe9#yO=l}nxNWZ6;r
zaJI=f{#d5pq<+|O0_Vu{-A|I=1eWsM@SYXU#)Y?39PA(9F>gVnQx7uXMZrVr2<v5p
z%?d(e4bH~dhgDp-=>Wv$H1IPq9HbLKr>`kB1-WW<W>>`YN-i%Xi?lWSugIYtZXh`%
zA8ZOXtitYt90qUTUjqI@%zOrX?bZk1DOKD7U^DeDW;zahiGLH{06*aG$gg0<pW@#L
zDDv@d(H_si%sbSFJTLKx9E$TV$)8UoO`gMiL=O95#E%wB`MB|eN78>3DbEikN%^44
zhn98u5KCf6`iLCfhdhqR;fNdx9`5twBv1UExwFv?DP(;_4$aqs5jg}y{GXCTd?xFE
zG%THOcAAadsJj)uvfjHyya<G=pO_fptK3ju4T*bFTjHA_S!xVG;tzmSY*XbN6!rk+
z6>z@U3h+2kvqrYQaufC7c$Mz~@VUy5z)!$0z;D3sz#qV$z+b>^;0|yXxQG7I0H!jF
vkD9Y^arPMX5ALV?$XiMI2hoFljlTvuo;XP#S6>B~mM=hOT25=Q3aEboy`CN3

literal 3374
zcmeH}%Tg0j5QaM;KnMwhOSlFY@B*j-B863y<;J~_-~vMurwoK5Xu-x<<<6B4;Kq$F
z;0sv3g%98ZxV1{#zsdaM%poqNTyUzs`FqZsGnX@cy1O1890jM9T2KocRY7|tlK5-}
z+89VAaF_t;$L~`g4A_$(1^U5MWZSp`#uuUaI&NDE5BBQSQvEpGN0;DwLe^R*XN_vm
zYBs|C^~_qWUTHR($HCgUl#c7q_JXaAt@GByC`XspG4)xGsk|Qi-LR>rt)sn4cvuh0
zd=@&-dUZy9rI&}{Ne~`Zo>yBozgerbswWpOXtOVOb$a4cZ5^VPcuNb)MYlD~R2t37
zi;bhhx(!I$0c`--iYrJ*wv8T&Y>3#(+ZbyZKzrD+vyPo}>`~ZuU$#LQoX@|_cfqCP
zqi7)C9AlGDMRIs<4jz$PiC<5C6zO{cFeVj(Z*ZRP_^clygTL?@_>K&`XLwm8y9r){
zpLUOS-eF*0lDaEt-I0uLOIFJ=qFWK0lGlw(jA==H#`T_%3B4<1QtyaQLDz*$>6*Aq
z>#B6gNIUl?j`QwCnbF%ZX7!ekIlU=9^Lj%_QCEa4=(6}MY9M4umxKhmC_c-&AY?_0
zay7)(CjCi%t8Dv+1pcW@Qt#t`cj&{vCMo=LpMKpGG5|kt{pPB^@qc}eyY{v=#vt~E
zPa6Az3}IimWUx0}hOsYPve+9WhkfBQ0`DiI@O+Yo=lhJo^T{|opG?5>eJ0`gE(Lf$
znS%HGT>C|Lzq@`hji^9o5EaO*&Lc{7nA15#sW|gGizwBhs56LCT^4j2k*dq0P9aLg
zaj&~`Y4hHu{<HaBRK7En-(%|gft}M&Ot1Z-w_mt>%inu;&b?{MJ!|UkX*=hhH)SlK
zy77W>#8o%exN*phQM4JuOx+mA*yk#9hN+)ZEZ_VazhM3~_4BixGk=>hubcXL-_BVV
zP+2pWx-|uB4OiWoq+7|X#;P1vJO$0hsvBlwDl@gIo5g!&di1q3@1&jmazXK;%<@Yx
zmS<F!ZdA9t>z06<PH9+1YT8En+Ch5TMM=>fn8owI#z3w45TGzUZwoj!B6|e-!0bQ3
CT#a)8

diff --git a/fsl/fslview/icons/sources/verticalReset.xcf b/fsl/fslview/icons/sources/verticalReset.xcf
new file mode 100644
index 0000000000000000000000000000000000000000..effa62ef5d007ca8b4ef8e6846a2daead18bd0b8
GIT binary patch
literal 4597
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
M6AIsYsHaf>0|tw2f&c&j

literal 0
HcmV?d00001

diff --git a/fsl/fslview/icons/thinLeftArrow.png b/fsl/fslview/icons/thinLeftArrow.png
index c855f9ad7e6d0fd1f2a84add8d58b38e438a99dd..7c9ed20ab587178a35122c5ea5bb3aa4c5bbe6dd 100644
GIT binary patch
delta 417
zcmV;S0bc&)0>}d)iBL{Q4GJ0x0000DNk~Le0000C0000W2nGNE045ums*xcwe+mvQ
zF$){mAOHXXRY^oaR5;6()Uj$*VGzaf-`(9LLRKtIVG2V`5fJeOBp4C}(Lw|ZQ!CLf
zzJL#);48#Ou#Tmjjn$^H5FrrIN)iMU*JhRsH{W-coa)cLXSiqP4ntWDdIdg%f_fD`
zr#{}`TZ<=OI~N7M;$4B&3dUGTe|)1W(!(&pqr^?E;1fO;xHy#_e&Pi#1wY4ZsbCh@
zBf=_{Q~rLf;iqBB+^NslEpSz1+>Tx{7vrplX^73>c?_~~kP04PAIG>KeAJ$QFCP5E
z8unVO)ObI=xRv;3*AJTs)0M=RyLSFBe&A)|S6$<5@Bv?1TwS^bk7FuBcRUH6udT(T
z`7st_@g_Xe7419T7r3hJH23Xk%QuImFfFC^zE(RkCpf@w+`(b+-Q0LCIK>}~uo31F
z?!~{U>RId)Y$a}{otcHiSErr85q1*4?us<PTl{LVY4>$l;EU@&o!(VbT@V(500000
LNkvXXu0mjfDZaL&

delta 318
zcmV-E0m1&r1LXoCiBL{Q4GJ0x0000DNk~Le000090000W2nGNE0KhU*?vWufe+d!+
zCbn?Hvj6}9@<~KNR5;6((=krNKokVf=d~df)LaD7kt1+{^xT0<a1tbXDq18iKpF~g
zNku`F;Lxn4&1%;UBe~es?ELZk|0$zE7!TnXQVAXIupS?Tg2E2hI5klQ27K0(_PC1V
zX3Enew&*kUgToiTQ&N}x)dkL@f09y8zqmx3XOtcW+&TjL_-#s_8Z2usLqfXA4X30g
z`dLl|*d~64lBW<aPfF?Lp0;?8Srth`RCtMFQdNQnEarl2YhmWSThEn)`#I7APf2D6
zGc;m{k2r8)YMy@ZHn(%IiskxR7n;OVUt6gWuW5@)d)MJPF2rp5Xa0jf6zmi?Z1a3d
Q3;+NC07*qoM6N<$f_K7&sQ>@~

diff --git a/fsl/fslview/icons/thinLeftArrow@2x.png b/fsl/fslview/icons/thinLeftArrow@2x.png
index e891c14139834bc0735d72c9e21c0d32e3f60cff..fbf853803c465b7b274881bd12904f7bd2d79a01 100644
GIT binary patch
delta 707
zcmV;!0zCb)1m^`IiBL{Q4GJ0x0000DNk~Le0000O0000$2nGNE0064DVv!*-e+mvR
z2!AsJ>i_@(bV)=(R9M61m_29|Q4q&}w|j}GjS&<fC;=scjh!MEY7wxp6|@pt(N0Kd
zXC;WGHUU2xK@gDy(gf5hAlQUJ5H*NmClWtm&Rv^X85Zun|7`5?Z*K2?+|0X~_vXzU
zY&DGly$CCU4o(4e2bNV2xMc>Ge*;W54)7LO16D;AcCcZqye_hkj+%iQ*cM>2?wWzG
zK_;sLegaQ}EW1rhV4ppY0<-p-WB=3_9E@8sd%#QJkHA8@XE7cGSt$NB@Fd8xDu6LF
zPyr|0HcT-&$$j90#kB`~a4}9X*}(>I68LTJKRF{Q7Sfu9;bD+T8gnJ!e|Uh&y6lX!
z!<k~TUIX8O_pQpAW7(73oXi7u4KCW}b%x0*-Ir?MtjI#T+KREtWWBR}y%J>EgH~8<
zCxCU}QL8)*W3q!1n6&5Zz$>dYITlLrB@01qh6;g&G;ao0gG_EunjLaYWTEgJb4Cue
z?%!cdPI3vH2Y%TV_|aX3e<>zA7yt)tXH;ga7Fg&P%mO>CM(uH>A;m&>@NO69Gp-n>
zSm!R{L6FJ1;|xWZR4PV*IcH$f#X7}g2Q~1<J|6(5U93~AQ#Y|bq+?DoSu=^Af98M8
z1Bcy~oCq*E@ui!)Zi+0dW^!B#GPyThu+p&KwJQpfb;QMbXKOJje-=_><aUtBTCf)V
zOOQ!97zLi$^WIj8PBGa*1-!5tgiVxvfpyNqjUbct+>Cq+GP%<@=T_?f)k-m0eLGCe
zC3DfmJ;lP!SOxq5?z`QRVqrbDRelaKSyPFjV`{SlNzvMpS40-h!-~avNo4YT+f0{>
pHWTa;Stm^=O2YJJ8Op^L)?cXz6VjE*8!!L>002ovPDHLkV1lxeG1mY9

delta 524
zcmV+n0`vXn1+oMoiBL{Q4GJ0x0000DNk~Le0000H0000$2nGNE0Q|q4sF5Kue+d!+
zI81;3&;S4dzez+vR9M5+m#a<$F%*Ws=?<5m5F`kaMIcD9Bv^3p1Q-O50WX2yAb0^l
zV8D_P1PX8n43JF_D?zZADdtSlOuExf&j_fQWTyT5_dBQU8ThYl2FR)}O+%4wz@|FL
zfD;jT(JbW&_yYQlaP)G@&MQFff9nt{(gBv_nIuvGM{R_5AYvmQlRPlk01LokU8j&p
z2k1^?5zAx*?6$$<Q<BV1V`3umV>vWS9{9EwV>QHN2l&zQcmu{ECZP~_waYnZBeeHo
z-=-|5{J0i7TRvrpM)Jd^GMPwd@g2%d+GB-9Efb%!Tm}@eBDrVluQs(^e`R8UEpd^h
zij09n4baSSW1E1@E3P(EW;Ye6`@m2mGL}@gS|>NaoF+?+T$PQ%n#y%KkiDZyHh{CH
zT#Tojy3&eRDP~L)Az#|}fp5*;DceOGhxB@Ch~0OuGN4FZP9eGS5t}o0m)EU?T-7#G
z4{AJlQ)r4DfQJ|^bt1FCV!0M<0o+BDAJJS?OaQL6HCqShX{yK4@^k1|2sxPm?+%+J
zk#gW=UEkOr$y05JjpJ&V8e;1d#uFc#SdmOh(s}3KC;9*QxUFsQhubfx3Xd#v3Z?o0
O0000<MNUMnLSTYH&E#DG

diff --git a/fsl/fslview/icons/thinRightArrow.png b/fsl/fslview/icons/thinRightArrow.png
index b8dbac6e2a63943b8bdb2c9e3cf4f38460271393..1508b1ba35514a7c81e1347f563dfef2c0687dee 100644
GIT binary patch
delta 425
zcmV;a0apIz0?-2?iBL{Q4GJ0x0000DNk~Le0000C0000W2nGNE045ums*xcwe+mvS
zALaYEZ2$lPT}ebiR5;6}l)Fj;K@^6+y+j)Y6$AwZEA3PQ3SI~pNHkh0K7>AiK8TNC
zYhht+kwOH8^ge)>7!WPJWY^{wkDHlY#RJQH#W^$oob&HQd`IZv9})hw03gtM0USBF
z=Y&*i6R2g_ZrF3mii!t;ig*BsfAi#}z>+qw?2RUH;$Uybw#}Ws*c&BaQb}cCN<0fh
zu6}ocTi{9B@5QS&&lV*5E`d$pRlEhf=Siy@?dyhvys4+ayy3Yb&$NI&!~4F1RFgfE
zcFSH_k!+FxW3ovCi~@1!vB#r!>jOICejo@v6K^Q-L0#(rcR)9Gbm>C{e=Xn**bpa0
zZLJ%w<qdAy3~Q!nZ~(`^wSxnnoHlSM_qKrpvD4n;y4*4_Azrlh&K9gma|x*aM*k^r
z?%>=<pz2^}|I11m1{TCa*=Hs+1-rlv@B-|JpR*GVm7M6eyb?FW<XK|G!T*m>d=y%T
TR&Wy900000NkvXXu0mjf-V3;Y

delta 319
zcmV-F0l@yy1LguDiBL{Q4GJ0x0000DNk~Le000090000W2nGNE0KhU*?vWufe+d!-
z5K`v_=>Px#^GQTOR5;6}(=krOFcbvP=Zzx@nuUUb3Ly$k0vv#2&~b}B4lP2I6d>+E
z!vPQltk?~WEvyhbNK9qL<C*c~yYqvE3KoAMbqHzwfMeXXl-9UN>rf;0IKpmnm?U*r
z;;?0xagDF>$L#-@a&707hIHtpf6TR*P~G6HMano&*3C>G<=&K1zz$AR#`^!l)m)}E
zF0*ot6tRZ`bS=9+Wec%F*x((n7-GZjIgzWu16Hjvhulxzi<LZ2bMrLdCf%;uc*K1<
zS8+lmznoCB>v20eFgbLq*7$DmnW~86kmc21@HT#&C25&d$})dt+4moO6$Ac4FCT{o
RTPXkl002ovPDHLkV1f=KizNU6

diff --git a/fsl/fslview/icons/thinRightArrow@2x.png b/fsl/fslview/icons/thinRightArrow@2x.png
index 6b33cae24bb3bbc5f1bdee51205a6967e30c8556..db09610f2e5509ba9d172f313745892966573e98 100644
GIT binary patch
delta 697
zcmV;q0!IC)1l<K8iBL{Q4GJ0x0000DNk~Le0000O0000$2nGNE0064DVv!*-e+mvS
zG)YHJEdT%lYDq*vR9M69m_2J0VHAa**?bB%f<h3%A_}67U?GAiVj+khMT!tByW}6(
zh+t<bI}3a5#7+xMun-#!f(9EcG>8xo6h(=eWNq%iW!Qb^oJ}X5W_EaX@64R{?!9+j
z_!m_HBLlFW>hw780w+^Ig;{zKe}QIAChIw{34Ax1q)}iB*oZqFPBxa9tYKhZ1n2@6
zBXAp&7kLAC7oXRF6Jbdk8+aX-O(yF?vch4KhQixA$T^W&|Ktwv3HS*-5t+2e#GP#d
zD-m!qj#Ue@HJz-e8aGp7mg*qWCX=-iK^9CVXVdLi%%&A3*1E`<Jp#7HfB9qtZev!j
z*qJitOlmeIX6su7x@R(3^M%qdztyra3LH*BvezXhEplC=--pk?fJ@OA+L%?B0RBV|
zSQMG98)3t5lgZkfyxwIn*`_M2=mOV8X6p^`19<DOj`0+afpK6rFqVE>VwR3HyzYo>
zp#E@8W$u+e#PPVv>?b&Fe=<pPDad%E?v$9EMT^nFR>Rs#U{Z0a$CU%|{a0xwEitRJ
zRmp<OBC|A8Xe={ZZ8`w2fpy@e$y)yh^<o{2g7zY1NQucB0rn>g&ZopEF-x;4NT)IA
zmYA%i2(WB2xgXcV)m4#MZ=A=H1&11Moc)-UMN=`75Z!8BWU`*df3&b_GP^v_nM~5D
z6l6yu1xrlUo$&Q@j~p*Cc@Fv*qsWrT`le#P3rs|9xhpbDM;ouHDwB0T0(>!<RUX!W
zTa5{>ACtEdhJZb(96w9zRAREmfU{}aY<s$i60`I$D&$v_$-6BR;rC6G$=e4bz?B}G
fuO;?hgX=FlNe(!~53dGE00000NkvXXu0mjf@e?kW

delta 514
zcmV+d0{#8n1*ileiBL{Q4GJ0x0000DNk~Le0000H0000$2nGNE0Q|q4sF5Kue+d!-
z9V}LPQ~&@0wMj%lR9M5+m%mEHKoG`%`E%zXB3K9_HWn6QV`n3X-V^u^B3N09oev{o
zE%*pFVy6~@AXbNnpeU%}lC{}|5R>d?rqO{VB<z07d^7W97XGqDK(EVzxaQpe8zn%I
zom-$?O*l^$<Wd7NvLGfjq`2X`e*;(p5-AA4H?Rey8ju7S0$);23cHM?PO3!*u&M!Z
zwxbEh02%P$OSR9F1enu;#J~Vpw%&<30oc=UVu0M&0&$?e0L(YFKq!a-mYVj5auQj6
z$)uc^iZqBlakf~;OIMIhEl37zhw{?INe+B!IdLrzYdHZp)TTHC?zEmHf4~ATQ9j!h
zBnBpdX)PyC8VW7Qx`tS{h8hs}eNZm{v||_r@M2SKq#zM+T@`IfijTDwTPsXm!WjcM
z+Ac1DE3GK?fwRzw(kIlB#*^F1Jl7e-0H>ONv0E#a7g36x`}a1@;yTIfNGkpVM!>#y
zJ~6;dTYdP#$$?kkt!+~XSjc1BycWVqKeY9IoJ{!+q@J#Q2R<}o`4~6}DTB5RJ>Wv1
z!@oG04Y_%x4ZY&V&S&X;XJns8(wk^vxj4{XuK%(903NTCuRv6HGynhq07*qoM6N<$
Ef)hU2;Q#;t

diff --git a/fsl/fslview/icons/verticalReset.png b/fsl/fslview/icons/verticalReset.png
new file mode 100644
index 0000000000000000000000000000000000000000..1e437d51f3eb56b86c6a1872b5ee35d6fece1e6f
GIT binary patch
literal 675
zcmV;U0$lxxP)<h;3K|Lk000e1NJLTq000aC001Be1^@s6CL5Wm00006VoOIv0RI60
z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru-v|m10tTRXFLeL_048Zv
zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj27Z*CxAAWdOomE>Pr00060Nkl<Z
zILnRH&x?&w7zgmrduQAkbGd$xiIfP*D2at8sVSw#f>IWwl+9#omKGKkLM)VjKpIQs
zN5YO0iNuDK!D5sW<;UgT_gZ*fo%?oWPQ9J;oO7P{dA`s0`<xzsMg@at<ChtX`M8K3
z|GU^5bB-^_!k&#*tTQwVySPxpc`U;#^hJ6t4B#^EBI`{s{J=vzj!Sts&BD95*G?UB
zTnmSPj-JF}9;WayIj=;Nj*ViT8;1)pj&%`rFZKl9tddk~ZA7VJHR^G;Jid+y1z}(D
z4UL#ZG1_Gw3i3wr9vc!8x8h~lp%I%SL0|*hun9|WGooZ!!e(DotrmxcV=cgcFPC@~
z#u9rR_prMgAN@FiV__e`1MJ5OY$;<Hh|--4dla{DC8V({6!4dag7rMsb-YOm(qE47
z8BcH$&jaYAB)!S9L`3MbxPk4lSH%S^?$$^v6MHbUCA77)tkxQiMrwJiKVTXMum(@l
z2Fe0xHGWbLB4JKaj1DcelCPQcbgP^A@@V`+k;>*!@-TMdP8ma<fQ8riiAB-Rw*yZ$
zlQ*l1jRn?9sk8@iD$&j`u7@xwh1iGVk?#=RVtueYSq@vnX&erFBBVW1{&6J%-^R1B
zr*IYblb-J=YZD7`DN<PxV8<f*nUH!%iw?yzlP4*(Bl<Kx!EZ5rbd;e7G~)mO002ov
JPDHLkV1k>E8b$yB

literal 0
HcmV?d00001

diff --git a/fsl/fslview/icons/verticalReset@2x.png b/fsl/fslview/icons/verticalReset@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..0c5f836f9c2fc89a24a9386a8135ccb5a042313f
GIT binary patch
literal 1192
zcmV;Z1XufsP)<h;3K|Lk000e1NJLTq000*N002M;1^@s6@uBSR00006VoOIv0RI60
z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru-v|m10vRoEB7gt@048Zv
zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj27Z*CxAAWdOomE>Pr000C7Nkl<Z
zSi{YjU5Hgx6vuz(+%w~tU*l+ua0d-bLW4?BQVB*920{X#%7^A99}L2x2VX>AtLHH6
zt;Clid?^U2NRSE{1yfQ|u%Q&qnI!zU_v+k_<I8`;X0y+}`^?-C4;=P6`(v%O*T;XY
zz2PxEiP{~&IFMO=bAB?lCx8y{6p+q^pl|X2z%3x}m9%bOpW3!|5%aWNfwF>$IdE@2
zB+r4Rz&@ZAA$g*C-vc+gG5T5z%Di=8dyM1>FazwDM0tedP2ft5ioOA+d+FOgX_f#F
zd+jYPZL<|=&{9FP5?JMgeiDF#BnB$X;3)7WP?;;Xq#okSfTtb8!@xmcgNMd*z#*U-
zW8CAy7aO=X$yno_b-Oh7YK+dC^7Gt@S_+KYapnYxR|5JD^(8UHd-kMVyeD<$CDwl$
z*iA4(jV{|(^x69D#OORLAX)*|%dmA|t;VXrYGASc>-wi#Ot_HSab90vI~H=y_D%zf
zoJ^ExHyw{VR^+}@b1`t4@}y8teR>T-+JRIN4BN&V&~BQpQOf{RCT7FHE5HKa5^zy;
z@|Z0R14n@GgfAvy5q|sz)I{tb0a|oGy{&~`T38LR5col3lk%$n^#5KrO&IAu(}JoP
zngy=|4XI*<>{69l{s2Z|cJL$cmn5}`e<-H!I^qA8`ge4T&<q#^{<K2g80uNIXB=Pu
z+p<;AuMJqWoc<wToxbmQ@ZSq1si(M^0=5WOj2)IM8(r|!kb`RPhlrc+3FXiaEU9)&
z`k$SGDFwFbdpgF?2Z8I7{3LKnQu&OwShf5);F(xoe-XIm6q|dTc`5L@#twG{8joRL
z0{Z34E=nfAn6Tz@sC@P@%Pb<ZLQB_Ma{2Q{`LgL-C=XiUp)mw(v$9h#6P*;nMHcg|
z>f7sCx4S4pecSyPxamaUL$$thQcZ0mhIl3;CLUX)0oA5YOi?ti#5<mXCoec!Mi)i7
zn68o`>y`^HQ|en{8FP7=qUc*OsOi0LW&E~0#*E#w;31eS%(i}2Kr}3A41vTWVWPQH
zG1$^4wd9_;c>sqV^x~$Y=;<rU_(h%+bIKS1K9%7oOV@mXzNNrVQpad4(F*Xsvd~#2
zgXf*OBf{|<I1nSTQPWpi^gzc(<1Mdg{AE=EcYt?dqTLMc6w&i4?Z$MmGp+1DE=E^X
zg&Dm^N&T@Fzu=6&VeR4<<ylniMqiH{Q|9lteBN9*{O;6+Sy|v30Pd<yta`B_AiJ!D
z(r+>F-dcoi=NeW~ghf0N#<XU8J2wP;WS!PJQqhQf`xEPgmr9Lago4Nz^r#liNb;t2
z*-%p?&RBhIsc|$Ebq1I=18d}tMFO-v_lgt1?XqD%>*o>5?<Kx#3b&5{0000<MNUMn
GLSTX_d@7Xy

literal 0
HcmV?d00001

diff --git a/fsl/fslview/toolbar.py b/fsl/fslview/toolbar.py
index 7d59f7922..5b1082cb5 100644
--- a/fsl/fslview/toolbar.py
+++ b/fsl/fslview/toolbar.py
@@ -12,12 +12,9 @@ import wx.lib.newevent as wxevent
 
 import numpy as np
 
-import props
-
 import fsl.fslview.panel   as fslpanel
-import fsl.fslview.actions as actions
 import fsl.fslview.icons   as icons
-import fsl.data.strings    as strings
+
 
 log = logging.getLogger(__name__)
 
@@ -40,45 +37,6 @@ class FSLViewToolBar(fslpanel._FSLViewPanel, wx.PyPanel):
     """
 
 
-    class Tool(wx.Panel):
-
-        
-        def __init__(self, parent, tool, label, labelText):
-            wx.Panel.__init__(self, parent)
-            
-            self.tool      = tool
-            self.label     = label
-            self.labelText = labelText
-
-            tool.Reparent(self)
-
-            self.sizer = wx.BoxSizer(wx.VERTICAL)
-            self.SetSizer(self.sizer)
-            
-            if label is not None:
-                label.Reparent(self)
-                self.sizer.Add(label, flag=wx.ALIGN_CENTRE, proportion=1)
-                
-            self.sizer.Add(self.tool, flag=wx.EXPAND, proportion=1)
-            self.Layout()
-            self.SetMinSize(self.sizer.GetMinSize())
-            
-
-        def __str__(self):
-            return '{}: {} ({}, {})'.format(
-                type(self)      .__name__,
-                type(self.tool) .__name__,
-                type(self.label).__name__,
-                self.labelText)
-
-        def Enable(self, *args, **kwargs):
-            wx.Panel.Enable(self, *args, **kwargs)
-            self.tool.Enable(*args, **kwargs)
-            
-            if self.label is not None:
-                self.label.Enable(*args, **kwargs)
-
-            
     def __init__(self, parent, overlayList, displayCtx, actionz=None):
         wx.PyPanel.__init__(self, parent)
         fslpanel._FSLViewPanel.__init__(self, overlayList, displayCtx, actionz)
@@ -204,46 +162,35 @@ class FSLViewToolBar(fslpanel._FSLViewPanel, wx.PyPanel):
         self.Layout()
 
 
-    def Enable(self, *args, **kwargs):
-        wx.PyPanel.Enable(self, *args, **kwargs)
-        for t in self.__tools:
-            t.Enable(*args, **kwargs)
 
+    def MakeLabelledTool(self, tool, labelText, labelSide=wx.TOP):
 
-    def GenerateTools(self, toolSpecs, targets, add=True):
-        """
-        Targets may be a single object, or a dict of [toolSpec : target]
-        mappings.
-        """
+        if   labelSide in (wx.TOP,  wx.BOTTOM): orient = wx.VERTICAL
+        elif labelSide in (wx.LEFT, wx.RIGHT):  orient = wx.HORIZONTAL
         
-        tools  = []
-        labels = []
+        panel = wx.Panel(self)
+        sizer = wx.BoxSizer(orient)
 
-        if not isinstance(targets, dict):
-            targets = {s.key : targets for s in toolSpecs}
+        panel.SetSizer(sizer)
+        tool.Reparent(panel)
 
-        for toolSpec in toolSpecs:
-            tool = props.buildGUI(
-                self, targets[toolSpec.key], toolSpec, showUnlink=False)
-
-            # Assume that buttons  are self-describing
-            if isinstance(tool, wx.AnyButton):
-                label = None
-            else:
-                label = None
-                # label = strings.properties.get(
-                #     (targets[toolSpec.key], toolSpec.key), toolSpec.key)
+        label = wx.StaticText(panel)
+        label.SetLabel(labelText)
 
-            tools .append(tool)
-            labels.append(label)
+        if labelSide in (wx.TOP, wx.LEFT):
+            sizer.Add(label, flag=wx.ALIGN_CENTRE)
+            sizer.Add(tool,  flag=wx.EXPAND)
+        else:
+            sizer.Add(tool,  flag=wx.EXPAND)
+            sizer.Add(label, flag=wx.ALIGN_CENTRE) 
 
-            if add:
-                self.InsertTool(tool, label, postevent=False)
+        return panel
 
-        if add:
-            wx.PostEvent(self, ToolBarEvent())
 
-        return zip(tools, labels)
+    def Enable(self, *args, **kwargs):
+        wx.PyPanel.Enable(self, *args, **kwargs)
+        for t in self.__tools:
+            t.Enable(*args, **kwargs)
 
             
     def GetTools(self):
@@ -252,63 +199,39 @@ class FSLViewToolBar(fslpanel._FSLViewPanel, wx.PyPanel):
         return self.__tools[:]
 
 
-    def AddTool(self, tool, labelText=None):
-        self.InsertTool(tool, labelText)
+    def AddTool(self, tool):
+        self.InsertTool(tool)
 
         
-    def InsertTools(self, tools, labels=None, index=None):
+    def InsertTools(self, tools, index=None):
 
-        if labels is None:
-            labels = [None] * len(tools)
-
-        for i, (tool, label) in enumerate(zip(tools, labels), index):
-            self.InsertTool(tool, label, i, postevent=False)
+        for i, tool in enumerate(tools, index):
+            self.InsertTool(tool, i, postevent=False)
 
         wx.PostEvent(self, ToolBarEvent())
 
 
-    def SetTools(self, tools, labels=None, destroy=False):
-
-        if labels is None:
-            labels = [None] * len(tools)
+    def SetTools(self, tools, destroy=False):
 
         self.ClearTools(destroy, postevent=False)
 
-        for tool, label in zip(tools, labels):
-            self.InsertTool(tool, label, postevent=False)
+        for tool in tools:
+            self.InsertTool(tool, postevent=False)
 
         wx.PostEvent(self, ToolBarEvent())
         
 
-    def InsertTool(self, tool, labelText=None, index=None, postevent=True):
+    def InsertTool(self, tool, index=None, postevent=True):
 
         if index is None:
             index = len(self.__tools)
 
-        if labelText is None:
-            label = None
-            
-        else:
-            label = wx.StaticText(self,
-                                  label=labelText,
-                                  style=wx.ALIGN_CENTRE)
-            label.SetFont(label.GetFont().Smaller().Smaller())
-
-            # Mouse wheel on the label will scroll
-            # through the toolbar items. We don't
-            # bind on the tool widget, because it
-            # might already be intercepting mouse
-            # wheel events
-            label.Bind(wx.EVT_MOUSEWHEEL, self.__onMouseWheel)
-
         log.debug('{}: adding tool at index {}: {}'.format(
-            type(self).__name__, index, labelText))
+            type(self).__name__, index, type(tool).__name__))
 
-        toolPanel = FSLViewToolBar.Tool(self, tool, label, labelText)
-        
-        toolPanel.Bind(wx.EVT_MOUSEWHEEL, self.__onMouseWheel)
+        tool.Bind(wx.EVT_MOUSEWHEEL, self.__onMouseWheel)
 
-        self.__tools.insert(index, toolPanel)
+        self.__tools.insert(index, tool)
 
         self.InvalidateBestSize()
         self.__drawToolBar()
diff --git a/fsl/fslview/views/colourbarpanel.py b/fsl/fslview/views/colourbarpanel.py
index 3c9b684f7..86bba0998 100644
--- a/fsl/fslview/views/colourbarpanel.py
+++ b/fsl/fslview/views/colourbarpanel.py
@@ -184,7 +184,8 @@ class ColourBarPanel(fslpanel.FSLViewPanel):
         """
 
         if self._selectedOverlay is not None:
-            label = self._selectedOverlay.name
+            display = self._displayCtx.getDisplay(self._selectedOverlay)
+            label   = display.name
         else:
             label = ''
             
-- 
GitLab