From e0bbd9f6b27c02a546a1ec6de0d658a6d790c2ac Mon Sep 17 00:00:00 2001
From: Paul McCarthy <pauld.mccarthy@gmail.com>
Date: Mon, 24 Aug 2015 17:08:16 +0100
Subject: [PATCH] Movie mode icon button on ortho/lightbox toolbars. Movie rate
 is inverted, so high value -> fast rate.

---
 fsl/fsleyes/controls/lightboxtoolbar.py |  10 +++++++++-
 fsl/fsleyes/controls/orthotoolbar.py    |   6 ++++++
 fsl/fsleyes/icons/movie24.png           | Bin 0 -> 757 bytes
 fsl/fsleyes/icons/movie24@2x.png        | Bin 0 -> 1497 bytes
 fsl/fsleyes/icons/sources/movie.xcf     | Bin 0 -> 7586 bytes
 fsl/fsleyes/views/canvaspanel.py        |  14 ++++++++++++--
 6 files changed, 27 insertions(+), 3 deletions(-)
 create mode 100644 fsl/fsleyes/icons/movie24.png
 create mode 100644 fsl/fsleyes/icons/movie24@2x.png
 create mode 100644 fsl/fsleyes/icons/sources/movie.xcf

diff --git a/fsl/fsleyes/controls/lightboxtoolbar.py b/fsl/fsleyes/controls/lightboxtoolbar.py
index f9b6a4854..67b6f7b5b 100644
--- a/fsl/fsleyes/controls/lightboxtoolbar.py
+++ b/fsl/fsleyes/controls/lightboxtoolbar.py
@@ -31,6 +31,7 @@ class LightBoxToolBar(fsltoolbar.FSLEyesToolBar):
         
         icons = {
             'screenshot'  : fslicons.findImageFile('camera24'),
+            'movieMode'   : fslicons.findImageFile('movie24'),
             'more'        : fslicons.findImageFile('gear24'),
 
             'zax' : {
@@ -44,6 +45,7 @@ class LightBoxToolBar(fsltoolbar.FSLEyesToolBar):
 
             'more'         : fsltooltips.actions[   self,    'more'],
             'screenshot'   : fsltooltips.actions[   lb,      'screenshot'],
+            'movieMode'    : fsltooltips.properties[lb,      'movieMode'],
             'zax'          : fsltooltips.properties[lbOpts,  'zax'],
             'sliceSpacing' : fsltooltips.properties[lbOpts,  'sliceSpacing'],
             'zrange'       : fsltooltips.properties[lbOpts,  'zrange'],
@@ -60,6 +62,11 @@ class LightBoxToolBar(fsltoolbar.FSLEyesToolBar):
                 'screenshot',
                 icon=icons['screenshot'],
                 tooltip=tooltips['screenshot']),
+
+            'movieMode'    : props.Widget(
+                'movieMode',
+                icon=icons['movieMode'],
+                tooltip=tooltips['movieMode']), 
             
             'zax'          : props.Widget(
                 'zax',
@@ -94,6 +101,7 @@ class LightBoxToolBar(fsltoolbar.FSLEyesToolBar):
 
         more         = props.buildGUI(self,  self,   specs['more'])
         screenshot   = props.buildGUI(self,  lb,     specs['screenshot'])
+        movieMode    = props.buildGUI(self,  lb,     specs['movieMode'])
         zax          = props.buildGUI(self,  lbOpts, specs['zax'])
         zrange       = props.buildGUI(self,  lbOpts, specs['zrange'])
         zoom         = props.buildGUI(panel, lbOpts, specs['zoom'])
@@ -109,7 +117,7 @@ class LightBoxToolBar(fsltoolbar.FSLEyesToolBar):
         sizer.Add(spacingLabel)
         sizer.Add(spacing, flag=wx.EXPAND)
 
-        tools = [more, screenshot, zax, zrange, panel]
+        tools = [more, screenshot, zax, movieMode, zrange, panel]
         
         self.SetTools(tools) 
 
diff --git a/fsl/fsleyes/controls/orthotoolbar.py b/fsl/fsleyes/controls/orthotoolbar.py
index c9c18502a..7e5655dc8 100644
--- a/fsl/fsleyes/controls/orthotoolbar.py
+++ b/fsl/fsleyes/controls/orthotoolbar.py
@@ -46,6 +46,7 @@ class OrthoToolBar(fsltoolbar.FSLEyesToolBar):
 
         icons = {
             'screenshot'  : fslicons.findImageFile('camera24'),
+            'movieMode'   : fslicons.findImageFile('movie24'),
             'showXCanvas' : fslicons.findImageFile('sagittalSlice24'),
             'showYCanvas' : fslicons.findImageFile('coronalSlice24'),
             'showZCanvas' : fslicons.findImageFile('axialSlice24'),
@@ -63,6 +64,7 @@ class OrthoToolBar(fsltoolbar.FSLEyesToolBar):
 
         tooltips = {
             'screenshot'   : fsltooltips.actions[   ortho,     'screenshot'],
+            'movieMode'    : fsltooltips.properties[ortho,     'movieMode'],
             'zoom'         : fsltooltips.properties[orthoOpts, 'zoom'],
             'layout'       : fsltooltips.properties[orthoOpts, 'layout'],
             'showXCanvas'  : fsltooltips.properties[orthoOpts, 'showXCanvas'],
@@ -74,6 +76,7 @@ class OrthoToolBar(fsltoolbar.FSLEyesToolBar):
         }
         
         targets    = {'screenshot'   : ortho,
+                      'movieMode'    : ortho,
                       'zoom'         : orthoOpts,
                       'layout'       : orthoOpts,
                       'showXCanvas'  : orthoOpts,
@@ -104,6 +107,9 @@ class OrthoToolBar(fsltoolbar.FSLEyesToolBar):
             props  .Widget(      'layout',
                                  icons=icons['layout'],
                                  tooltip=tooltips['layout']),
+            props  .Widget(      'movieMode', 
+                                 icon=icons['movieMode'],
+                                 tooltip=tooltips['movieMode']), 
             actions.ActionButton('resetZoom',
                                  icon=icons['resetZoom'],
                                  tooltip=tooltips['resetZoom']),
diff --git a/fsl/fsleyes/icons/movie24.png b/fsl/fsleyes/icons/movie24.png
new file mode 100644
index 0000000000000000000000000000000000000000..b710e44d0c71ddb8f30f0f05ad7af3cf2b11fb22
GIT binary patch
literal 757
zcmV<R0t)?!P)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00006VoOIv0RI60
z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru-v}5FCLho1`3C?1048Zv
zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj27Z*CxAAWdOomE>Pr0006|Nkl<Z
zNXM<!+l$Rn6bJCnIcLV8si84$sWDRIk_U1rA}>Qy9x2QNFCLUqo~9`I1B3^ZOJqVy
zDKeB>a!HC@-WU%I%DB(COy_v8e)V%Y=Xd78s?|PwpZ(kGyVv)-*5<F}%Et2Fl`Q$c
zV2HL5T{wXSv6ip0H#u}KPGfh>>#_p0qZIxF^8#fh9~NUz?Ej9dS%)V`JJ5|W_*mn{
zb!fmFwBaN+SIcAa!643JS)l91YZNmAO~GP(!X2!SbBg6T8;tQ5-r^X}V=jJY1Sp~r
zTd)o-c%KET9p56i`)epFS$~PI=*KwJ%TURxK))u)6u~N42@^3HQ*k?xmnv~kk0xBk
zFU-U<e5pb9EcBr@WZN0%meL&LBhMQ`a@#}SlQ58xo;=1!Di`5YwHqfn>%rmJ(40|d
z$<5b>avq1gGdsZi(Ee&%h}(^b;N_mIKfos3$Mjk~<p{0^`VNc^A63DdV=UojaFEW#
zKgE^U5*&y=voG?RuR(AzTExTDylQ|(%n4#UgY04r^>kn*E>$Bp9bh;PhMvzwHD*=t
z3QWV@S`90)J{-cxm^Tce#jgrJZe%GaSv-zyaf_`(d=EZjMzj{G%CFc>$Ko9>1{b~2
zU-DHzmE!OgoWU#XNLO(hNg+_=@D#H#0ng*{87T99{KSX&rVD$bl0Rhe(G;jRM!I&^
zc$0J36>mlxu7p_Xvxr+71$QH^x;%mxB3<R4!?mcL67Ho1RH%TeCsNZIE#L`Wq;y{H
n1ssi6?NRLQ&T8{H|Iz*cxT%lLtz%F@00000NkvXXu0mjfH9||W

literal 0
HcmV?d00001

diff --git a/fsl/fsleyes/icons/movie24@2x.png b/fsl/fsleyes/icons/movie24@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..385ebdf90140af30fd8ce707936a9b1f4f89a8aa
GIT binary patch
literal 1497
zcmV;~1t$85P)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm00006VoOIv0RI60
z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru-v}5FCN&gLFwp=2048Zv
zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj27Z*CxAAWdOomE>Pr000FvNkl<Z
zXx`nKYiO2b7{`Cl-glc@X4%vd?erlwY^JS(FtaqpqJx;31f7t=KA35J2s)Sq71;+1
z4Jsl#h#kZdwZcJAlpSyqrmbi~p}EY~Tshb4ws%h-_P^=k;eEHg&wZ~CUhr`5xwl={
zeI4)rbv<wrQ>MUP`TrmzTMC0{0LFRXE}#O4fkVK@KpD^%=<rTPrQY`dU&>HDz5;gY
z;P%-Cj2=Y!p-^@J8K0Nxg+f#T90&dediCTaV2_lDJozJjokm8d_Pzl|`6_X#nB^2Q
zG4MXn1?=|Z9VrxNiEp3r!1G!+$P;C01!SazW4=niTcG!Q110i&pj#eTs=axVF<lB2
z^>#7soK>2DJG572;`apb7*Oq5naY3<faNk+Msm&qI)E)YN2b&&l%(B29nb<yHi|zC
zZ1t>6t{QCt&H;V_YK@G=z<OUd*UBq@0f&KgiMS2<^a1;UXMjI|y}nh?m9#@Zy9uQO
z!=ylLtiMAB8#mbD2BKK&Yl{2Rfg0ck;A~)%JmX6-a0M_4I3H*QjsYWq3BVDbL<6|J
zh_&hhLW?H~@b3f~d_54EzkLgs0*nX7O2JGZ1)Q<oQ?VGUkoAHtu1vP-b{;Rcu9k9>
z1L306fNxF6W`ND|z-7Jyrit;7I`A0bqMrkxRCg<1E*Z_hdB7>aZ@|}S&}fprOIW&D
z$+p%Ah&`;|2fQG|IBF6SxKm-9nq~{yZUrU+ZHby4>WOtL*XtgLr9{a+f=wuQ)yKe8
zp~%~YvHs6iI8M>~OdUQ-6GG*>+V{&s+krK}i^3`|3xxU71;8SKxt)S1n^pIxYd@d1
zoUKk+=!Dj_0h${3zv~k+j%$4=MCo)@p&WPs_}wI{Z`YJn(zXer06Y#HmGx_UUAs_+
zU1s*$fsF$+<fWF*YbE0b?VkbsX{t`-<JvD&eL8?QfTtv^*0hAa0I^X#TNO$#>HQL4
z>yOYS(yhKYHW%6G0MMa4(G&k;WV9#x<{?=kN!JK<?gQ=t<^oTvE_Vx`#GXprto3c+
zLtqB5!h~qvM}ca2;Ug*0B?WE-<^%$6Beeb`IiE>^H+3#A1?siVP!F(B@27?scO+=B
z?iI)Ph!VWlM*#<4uhirATI7uobgrsSo#`oTK6ufiVlqd$ut^upG@(SFXQb8*;(3!i
z@UDzBt`u}T*kyD;Wwg@_xpD!9TCqaJmC(bI5v8ri#h}D;CEHXZI3GxXNS0nEo(*XR
zx`QcjpV{lu6gebSn86vsS|yDVi~X^y0K0%Cg3#5#g#i!mtnJF@JQ-+Wh$Nn?1Zy;V
zIbfSEv8?GA(moCcJ!@kBApPGULV!hn)i7(4W<p&OI3_?SStzj=xJXs#n6ZBOP!p<H
zl07MSi>c97!1us&5|H;y<m-W3&3>E8cB6jhHRgy6*m_kBcH=O%ldk}00<S9vXNDLs
z-6G}-^nTSaDsaDKjMDoKmGDg3u}Ya@eLMYMQs&eDg~t8QCyLw1qiV!T)<<;M6}qAO
zB!8)TaIX)GvsCijCALcKWh@}(JJ<raF5!&_ftC7sQGouNcf@R^*;|un2h$3$GuIfn
z+x%{u`j4wal)NSb@apLwsrN`gLx8ec34A3P7i-j*lh==G{1T-#lxy!km4FVdJ$iae
zMUh3QN~22GTIOY-Zpo=8<yT8<sdWV^NV6bvh%tMm5;-YjU!iG8lp<bxb=gdih4N~2
zLXneEqkF+Y?-u_1Am~Mz0*Yq{ONC@)IT`6+q?Y@yP<nEF00000NkvXXu0mjf=}@mv

literal 0
HcmV?d00001

diff --git a/fsl/fsleyes/icons/sources/movie.xcf b/fsl/fsleyes/icons/sources/movie.xcf
new file mode 100644
index 0000000000000000000000000000000000000000..a0ee9daf4b901adb82218b4d1881761f11c8cdff
GIT binary patch
literal 7586
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
HVEKOmeHrAQ

literal 0
HcmV?d00001

diff --git a/fsl/fsleyes/views/canvaspanel.py b/fsl/fsleyes/views/canvaspanel.py
index c56dceeea..b422a36aa 100644
--- a/fsl/fsleyes/views/canvaspanel.py
+++ b/fsl/fsleyes/views/canvaspanel.py
@@ -44,9 +44,13 @@ class CanvasPanel(viewpanel.ViewPanel):
     syncOverlayOrder   = props.Boolean(default=True)
     syncOverlayDisplay = props.Boolean(default=True)
     movieMode          = props.Boolean(default=False)
+
+    # Movie update rate in milliseconds - this is
+    # inverted so that a high value corresponds to
+    # a fast rate.
     movieRate          = props.Int(minval=100,
                                    maxval=1000,
-                                   default=250,
+                                   default=750,
                                    clamped=True)
     
 
@@ -271,10 +275,16 @@ class CanvasPanel(viewpanel.ViewPanel):
 
         if not self.movieMode:
             return
+
+        rate    = self.movieRate
+        rateMin = self.getConstraint('movieRate', 'minval')
+        rateMax = self.getConstraint('movieRate', 'maxval')
+
+        rate = rateMin + (rateMax - rate) 
         
         self.__movieTimer = wx.Timer(self)
         self.Bind(wx.EVT_TIMER, self.__movieUpdate)
-        self.__movieTimer.Start(self.movieRate)
+        self.__movieTimer.Start(rate)
         
 
     def __movieRateChanged(self, *a):
-- 
GitLab