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