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