From 26a388bc2959bc61bfb32299259dbce66760d2f4 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Mon, 10 May 2010 22:17:56 -0500 Subject: [PATCH] Adding an alternative play control while browsing the selection --- data/small_home.png | Bin 0 -> 2810 bytes data/small_next.png | Bin 0 -> 5606 bytes data/small_pause.png | Bin 0 -> 2626 bytes data/small_play.png | Bin 0 -> 2861 bytes data/small_prev.png | Bin 0 -> 5586 bytes data/small_stop.png | Bin 0 -> 2525 bytes hand_tests/fake_player.py | 4 ++ hand_tests/test_nav_control.py | 35 ++++++++++ src/imagestore.py | 8 +++ src/playcontrol.py | 151 ++++++++++++++++++++++++++++++++++++++-- src/player.py | 4 ++ 11 files changed, 197 insertions(+), 5 deletions(-) create mode 100644 data/small_home.png create mode 100644 data/small_next.png create mode 100644 data/small_pause.png create mode 100644 data/small_play.png create mode 100644 data/small_prev.png create mode 100644 data/small_stop.png create mode 100755 hand_tests/test_nav_control.py diff --git a/data/small_home.png b/data/small_home.png new file mode 100644 index 0000000000000000000000000000000000000000..81c2468194fc7572c798bc0ea98212a33e2cde28 GIT binary patch literal 2810 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igS- z0}maBNK@AU01A3ZL_t(&-tAdyj8x?re!lPA=A1M4ompTPmgQ<;K^v5iDuRNQZ35*7 zNn+cb=` zob&%}*|Nnh|Nch<(A?Y{5d`7)wr&6FaKHU58;9 z)AsG%yCzv(y=d_R58PQQmHq-C{k?kN#TQ?k37~b)o;~-&bpydrhy-;V;cytiU=X^l zBM=Bck|fU)z6Y4=!nQ0Jrio&)h+Hm*Y&MI0p@4j$z)jQ4H!fTDXHk;2Y}~l<%xwqo z^2;xSF;>SI``fPf-(RF^8jXZPBpQt(7Kx{CX=X6CJ~Rv5ef#OC<;X1>X%uD^K$5cQVLNJAW0GwKh!9ta5*R79A6$k z{`1)l4bI}liw`bYvc%fIfB&rm*uQ^2mMvShY4`5k%i+3uEEXflWD?0_646Kms;YYN zPKal1z*EkzQ25_bN+D1RNs=H+l2@%QsGIB0-Xg1ga7VghC-mvRtt^2f$tT^2>ksne)ms01!d&ye0^6IR|qblF#RZ zrBaDL_Sj>+`}XbYzR~^Yjb4aEB2OMTaNy2FRTYm$A_zyL&~+W6C|1fOb6vQMd2#MI zV2oY;*;nSeaD5PhC_>XT#G+9|J>@4)oM;S%LigX22R3isjHOGL&PyFR^7zouP)#fr zBk_0~kw^qeAW*3=S5x-}&%-|}=LZ0$!>JT5^!H!$ow9P*g(QklRTV)^Lr~Mu z-QB%79*@ttr4VvmcXpvrh%2&80;&p8l0XQll*DT(r4)NV{uoa@`6NP-2nGfQ;9Tc@ z*L48^vM53c1fT>0V2shezP<&mt*z3i0BqZ~ZQ`LrhvuoO3R#xD=0xcYFHb1N$De$H zjT<+jp`iiKKKm?!;V=dV2d@u;b5KEmEJ;vg8M>|`l}d?%AXJSQ!1nFiAqc|6ix)2{ zs&9Eg5Wu~12Zyn%Dxnl@?d{mOX%nK+Cr$ zNlgU-0;PlsLVayb4IfnqX`0q=m}ZIi4GI7lV{jbj3MGV~GjvIxcp@xnwpTT zuEx;N&{fZ2j8(cg@hC_*8jFoCi6fCnFLRvpWsXFcd;SQM?>*oJw9ejG-!# z!1~u-12~5$ig@Uuhad<7WLd@+Uwi=om^5jUSL*?YvW!3=0A17Iat^~ZkoPLTWrmnH}6PiXXiiq`udV>ZEe5SgFzlwRT7WKp{gp1#Uf18L_VMQ zN}+96JW|<4_%vAy1`!U0pzAsWK|rxkKsKA@>2#W`Tet4dx~^}XJ9lpGwr=K*A3u&e z?zm%jcXziciXv%mZ(pIvGLOY#Bp!<)9*?6`D#0>MuQ!+`Y}@uYJ|UIMtC|Ki5P&4h zV2mM`%ORak^P#~(bN%}De+`Gjt+Qv(9?@d!rT{cFG@!Gy6O$)T{@2;FXN%LOO&fgo z-FKhh07)bg&{P$2Bm%*=blLi4vPUTe@t0l9aZoIkkk93KS63IQt*PnU(9-hvOeV8q z=FFKFzSq@aS63INPoIviuC4`~^Tk`YZvE}Rz`&d-Q>H-kHgjB-WgXqg>-FB=UX61;Lz1L9XU?3NwR7jr zWtL@`mSqvwb$=m>B2g3tlu~fcVHievZusxSi4)0+6)TR`*4B0u3WeR1CQUlu)6;{x zy1E}`y?*Z8In>tH;{5sZgmW%aO7&ncsOY+G0FVHP`Fy^*t*x!jwr!D8iiHaoo{7a` z0|1Ks{rz(Q92!4Oz@Z0f2-7z;ux~O9+4z06=<WDR*FRcSTFz- zW=q650N5=6FiBTtNC2?60Km==3$g$R3;-}uh=nNt1bYBr$Ri_o0EC$U6h`t_Jn<{8 z5a%iY0C<_QJh>z}MS)ugEpZ1|S1ukX&Pf+56gFW3VVXcL!g-k)GJ!M?;PcD?0HBc- z5#WRK{dmp}uFlRjj{U%*%WZ25jX z{P*?XzTzZ-GF^d31o+^>%=Ap99M6&ogks$0k4OBs3;+Bb(;~!4V!2o<6ys46agIcq zjPo+3B8fthDa9qy|77CdEc*jK-!%ZRYCZvbku9iQV*~a}ClFY4z~c7+0P?$U!PF=S z1Au6Q;m>#f??3%Vpd|o+W=WE9003S@Bra6Svp>fO002awfhw>;8}z{#EWidF!3EsG z3;bXU&9EIRU@z1_9W=mEXoiz;4lcq~xDGvV5BgyU zp1~-*fe8db$Osc*A=-!mVv1NJjtCc-h4>-CNCXm#Bp}I%6j35eku^v$Qi@a{RY)E3 zJ#qp$hg?Rwkvqr$GJ^buyhkyVfwECO)C{#lxu`c9ghrwZ&}4KmnvWKso6vH!8a<3Q zq36)6Xb;+tK10Vaz~~qUGsJ8#F2=(`u{bOVlVi)VBCHIn#u~6ztOL7=^<&SmcLWlF zMZgI*1b0FpVIDz9SWH+>*hr`#93(Um+6gxa1B6k+CnA%mOSC4s5&6UzVlpv@SV$}* z))J2sFA#f(L&P^E5{W}HC%KRUNwK6<(h|}}(r!{C=`5+6G)NjFlgZj-YqAG9lq?`C z$c5yc>d>VnA`E_*3F2Qp##d8RZb=H01_mm@+|Cqnc9PsG(F5HIG_C zt)aG3uTh7n6Et<2In9F>NlT@zqLtGcXcuVrX|L#Xx)I%#9!{6gSJKPrN9dR61N3(c z4Tcqi$B1Vr8Jidf7-t!G7_XR2rWwr)$3XQ?}=hpK0&Z&W{| zep&sA23f;Q!%st`QJ}G3cbou<7-yIK2z4nfCCCtN2-XOGSWo##{8Q{ATurxr~;I`ytDs%xbip}RzP zziy}Qn4Z2~fSycmr`~zJ=lUFdFa1>gZThG6M+{g7vkW8#+YHVaJjFF}Z#*3@$J_By zLtVo_L#1JrVVB{Ak-5=4qt!-@Mh}c>#$4kh<88)m#-k<%CLtzEP3leVno>={htGUuD;o7bD)w_sX$S}eAxwzy?UvgBH(S?;#HZiQMoS*2K2 zT3xe7t(~nU*1N5{rxB;QPLocnp4Ml>u<^FZwyC!nu;thW+pe~4wtZn|Vi#w(#jeBd zlf9FDx_yoPJqHbk*$%56S{;6Kv~mM9!g3B(KJ}#RZ#@)!hR|78Dq|Iq-afF%KE1Brn_fm;Im z_u$xr8UFki1L{Ox>G0o)(&RAZ;=|I=wN2l97;cLaHH6leTB-XXa*h%dBOEvi`+x zi?=Txl?TadvyiL>SuF~-LZ;|cS}4~l2eM~nS7yJ>iOM;atDY;(?aZ^v+mJV$@1Ote z62cPUlD4IWOIIx&SmwQ~YB{nzae3Pc;}r!fhE@iwJh+OsDs9zItL;~pu715HdQEGA zUct(O!LkCy1<%NCg+}G`0PgpNm-?d@-hMgNe6^V+j6x$b<6@S<$+<4_1hi}Ti zncS4LsjI}fWY1>OX6feMEuLErma3QLmkw?X+1j)X-&VBk_4Y;EFPF_I+q;9dL%E~B zJh;4Nr^(LEJ3myURP{Rblsw%57T)g973R8o)DE9*xN#~;4_o$q%o z4K@u`jhx2fBXC4{U8Qn{*%*B$Ge=nny$HAYq{=vy|sI0 z_vss+H_qMky?OB#|JK!>IX&II^LlUh#rO5!7TtbwC;iULyV-Xq?ybB}ykGP{?LpZ? z-G|jbTmIbG@7#ZCz;~eY(cDM(28Dyq{*m>M4?_iynUBkc4TkHUI6gT!;y-fz>HMcd z&t%Ugo)`Y2{>!cx7B7DI)$7;J(U{Spm-3gBzioV_{p!H$8L!*M!p0uH$#^p{Ui4P` z?ZJ24cOCDe-w#jZd?0@)|7iKK^;6KN`;!@ylm7$*nDhK&GcDTy000JJOGiWi{{a60 z|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^RV1q%ZXHLB*yYybcY7)eAy zRA}DqS#4}v)fs+{@0Y)0JN`^sJ5j6#SPPl6Z1)5f1@EwmuCs-h~Tr3fZ5 z(MG_=CO{3+grE`<8e&w6hD101&@Kg3x~)xBny|DeAFWAkC$@7F`}*Tv-+Rw~kbC7Y zXlZC+lk!ThEZgTEzt4N#^SsYF29|8emTbv>NFz65(j7Z?2!s%x5Ml!WN@(-wJOW9oFRmadOV&#d%fO&27|$LKA+FM^2#f!G3N~j@Wc~O;KdhT z#N&@YUhi_bJcEOSTNOpw$@6@`?RLX%w^NSe2*WU_0YEiPBdV&>QmI7p`8;G<78!VX zt*~0HU>F7fplKRpSw^{Bh9pUlB#D+vC5WO(BuUEE*Vpg8?Y7&FPESuy9XxnYzhMCO z?AgPH!{LUHKKf|4uIqdJe!s=z@xbTv5ueXTeLf$ltE+?EZvR>U#bOb2b8`?ykv)SyV)oRsxdwZ`M8*{Y*2M!!SZ*MPpdU_%Q0|So$*cXjP^++UQ zX>M*tb8|C^MxzLYLhyRMa5x+g1OYtHgJoH;EDMg~z;PU`Rx4~a8|KTcc9jUjFuEj3 zYcF2BNZQ)khMs)#$^8EP`|;t2AAa{0IB?*AcVc4VCsR{X?<`-woNZ`mAWcn8G#ZVP zU@!=m%Vh>^WZif*j8bYclCJAe6b1Qw9+^xAi9~{4ym*l$lSw)`IjMU*o`+joTi@Tm ze}DEnt-uQ}ynxQmPR8f+H4Y9A{wWfP_!=4-NGujZEEXf7PzWxU3mnIRVHi+KO*aBH z-1yu8M+gDOamFeU0H{{0MAvnaPN&zeTD9u%x^?SjySuyfqeqV}4#3f)N3m_&Ht(@x z$F}o4|BJ@PMl?1yA{L90U@!=W!(ndJuLgWIHvm~I7O*S}08mwxDvAO{Q5<7qW97AL z*Ph+Idv|fsE7059YpGN!O%oFnziVu4^oGM>vTWHhGxNp|*Jl1&y|&ymO(U`_6IE5I zD2j2X)A^T;8#m4j3=DiDwX#!lu#hghvv5JJpMF2*RO zAcUB&R;v|tb#?Ihd~|MZ4mO)DluD)6tX;cy0)X^Q^H{F*BkR_!V{*CNFFhU)TrL;f zZZ|QQL)Uevs=8>`G!2@jK~+`gx(`ZUJ*bh zlkrQE^dpbQL+y4uG5DQQY6eoRR-vjY6h%R`T3z6prhV<_)oK;8EMsVB$V>#K6dcEy zH0yS|p(sjpWMm|?C;(4C{WQ*H2 zJn!N-j<75Xi^XD6qyfNgw`2G2-FWJ$r!X=yVwRV#>lhmw!vhaIfWE#yl*?sPRu~E3 zIBr210f5C~F&ZBc1i>YWqSt1#3D*pO=Xq996oF+~zE)X&U0KxE*JEU41pD^w!?Vvm zi)=Ovj^p5PIAFKi@!osyVcWKCIDGgpDwT>!0JZZOa~iC~Fbo)mVH8CXc%EmjnT1%E zr7X+pgb>}Jxp`f`fId}K1pwG=HUPlj;2=KvzW zKelh*jzAz_0#Q|U!OEF3;Y%QtVHkSN04x@Z=5o0zx~?mfQoeTS4eB%i7=f@Xi^j%A z#N%;vcXykhDW%|f9<8mdxb@as(bm?6&p-d%EXQiKY6fqV(|n((x?HX@!!YVK1K7NI zbG5&}Kl|yYpU&yJ?od^g7|il@0PJ=gv$h*@;b?Hi6?fB$G)~=QK1l;QssX$NKf_kxHeIOeP@+0yIrCpEp*Zmc>+6 zMWs^7Zrr#r6_3a1q5wD?jzTCDI+@SsS9!f&swm2Tb>X?WIqcfC3(;s4xm?c7tgh<_ z1Oj;Ox#z$z3??Qf7AVqNZn*_pwrnw*8X?5&C$cQld_GUSUhhy#OG{=^a{7Z0J^%pc z`Sa&HPM9K(a~{X zW@e`JO~GGPN<9Dk^N2(usoQVA{ncbLNlK*>DwPT~sIyi^8(_Yz*V3iY-DO#(#bObc zFJC6{c>K_c6)TeW-FF{dv=%yf@+5|ahKgIZY&mYRSpGgUGeaavf-K8a*LAZjYNf@u zabvvEdFMATl_UwGC=yEPsqNdh|Mj!aK9f$KJo(*^l&4Oea!Qiadg#!h_gh+80+C3B zcsw4;aU3xY>;}aenf~Z_UYW*9GRM$(l1=NFt>H<)_eSZ|G(SY z+Y48V&2qH?XV0ERTU(pt^?E0|ySpDuBodX`*;!qZB%)~=Wmy)rV$Y!1uj+mPU>F7* z$1NDIX&NmSizJ`V>xo1{-LPT9uVS&-XnT8m;q2M7*Y{pX6vfb+Z@&4n;o;#wwzRZx zfj|IGrxSu85Mw{oG@=D3F5~DpuWF@8qx01{oxhDEwb?hAr51o;nx>&#F4IDxfT^h|a_Q2g zTxVzJ!#zDc|9az%H_{t6Y{05jtFHge+{nlXZoc_uBoc}GOeWL(_SR2+71^u@9S@oBwv_op+|3PG|benKPv|Yu3<2B7tZ$`uzf!nwml=^yQKD(xpq* zXf(`IdbI46~`{wk}cVi{r}p309<@XOa&NVegFUf07*qoM6N<$g2qah A?*IS* literal 0 HcmV?d00001 diff --git a/data/small_pause.png b/data/small_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..7bdbfb83e8ef6acea14cc2b423bd3e9fb251fd2a GIT binary patch literal 2626 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 literal 0 HcmV?d00001 diff --git a/data/small_play.png b/data/small_play.png new file mode 100644 index 0000000000000000000000000000000000000000..c9a0fc7c20178d64d7ee53153679d6409def74a4 GIT binary patch literal 2861 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 literal 0 HcmV?d00001 diff --git a/data/small_stop.png b/data/small_stop.png new file mode 100644 index 0000000000000000000000000000000000000000..67a0d9e1051dfc7f467d90a3acabd29658c7ab8c GIT binary patch literal 2525 zcmV<32_p81P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igS- z0}lzDl834Q00~`5L_t(&-tAd`j1<)!|Gf8Rc6MiW=VovBZdvp|u?9@=A|WxRUZFXR zk`zr^6hmr(rb!JAng)9`M>V}zn@cEYiVcz!YpViQqiJeSXsxKkBccC5B%~A-@Yvhj za=Yi<{+QjFdGlWXxViOCTe#bU^hfTK>>oQj^PTtk{`!31TVM`zn8O_YFR*3HmM>k~ zym>R3&V93iausdGwr}6AwYIjZLqkK&!KCAC6md~wzjrHVPwQD@n=xwF_IfZjD=(m3-rkH-6;QYTpk>B8X_3 zWQ-BY7#L$9gg{CO;rsA~fX}(Cxh|>NHq=n)m3!{KyH^5(J9q9ZOxV4q1h#G42F^Kc zYipbT%E5!*EtX0>QC+9uNCc5^7~x0+VNF9Q6oSGSKq(*uxbMUBJUF!)s*^tDQVB*h z`pkxn8=tvw{(M$Z6o1E#9oL3HcXu~D&r{Or^n%|!|NM)pqTCsc#bnelh-sRLMx!tc z1L1HOs;Yu91{y@b7XqH^qUJcTZ5yRh3B_U&POz=MEN3WYJKstPSg zHA*Rjl!QpBpFDYT&B~Q4|5&Y7M^>#`h4z9EH2>G1DbzKz8WsDRGxHLSBk&zKp9p}g+k36#B;fEg{oOJ|x zdwa2B#R~o8i4$MXX0ty}Bob&zCXq-c5sSs3hC+3Z%V2R={7fQ27#oioV-Qlp=N#2) z^~QmLfsZzA+Vs)8@4oBIN(Z{TyV2Lz*Yw(}ul_QTNJy)xiI|oJ!!V#I3P1=P*F|=4 zaK_DC*LAd}QecV#UDpw}EO@R9k8_zF9Nc-^ZMVGzV65R3div?7;dx%T|AP;{eevSO zeXXsnNVT>ikw`!{jPbMq@ad(zSFbrMa{*5(j_QYbbvCW$|&pZNKw{FGD`}a3xGMNpgX-Y%ai5`hSRTMx7h>2YG zeJowN6nETl$FvEALLnSHZ~(sVL-;pI?k`|Zv> zd-muJ6)|HhIxsMBOC<0-V+@jzFL~S-0%R5u;J!bl#ZpS4CAGZeyje;i;D6yh;rorHkd$@re^DbSV_=jL%GeFp&7UtDihvc5OG1c6 z2q6DAxtYCZ%hY5LBUR>hY02w63jQ4bbU5OTz`I& z$jM3LM@Us0BjC6$0Z#w6$ zt@~f(V{a> ztp-2HRWYe`3eF)oZ(Ik0*+&F+h3}6yiQpZso{H4r>c83R)kNC2+u!nSRaN~K=v@9%f}`uZB{LY@ zH|23oBDxMmN_d_J?s*VG;FFI(MkE}b_Tp7lMY&W$B9W*ouc9b$YBjj7E34J2`{tW( z{+19jI;;Iae}6xY9XmGK+1dHSzrOR%D{;#LOcT1U*L5M$+>FDA5983GLo?nF5CGwD z7>2GxNQs)`pja%DTW`H}+wtSa$EIUvTCvaP^XYZ#*8NIRly6;s-F0ZPEC}C6sZ>Ix zQi0<*^+LSj3xmCJC=`NW7>JoBR7Jtq*cb-0S&WU29_v4LY#kwF@Tw3vapD9hrKG*R zec_!Q9e%%a$#>IuST^>J)t6SK{&b;*A?O9$wJac71Cqg;+ESAtfr6 z%6K%&WjKyAg-Ctj6Jv5T3NsdiVHjYH!LC$rX?R#>E?zACCUd#m&CfpjY?qYso9T2K@pxQnnnqMr1*LTS&?+F~c^(|ck;P(> zWHK2DA^yC6{rVltmoGn^OeS*^cCY#A^kif*8ERQptCTX?)6?@ntyWtlg!rnWC`8jV zP)Z@CM6Ff>=Nyc&zfnrx@9OIMeJYh2%;j>!ZEbD-Y}PQV{|5*mA{vbj0T{|=vzc@{ zy&FKdTrRg9J$iJ3=XnaH6dfHM=i~ACB>+w?m*ey1%^L-P!NEcN*C3b6P5E9Z6p+v7 nNj{$^m%DEcbC|;%{7y$n63Wsz00000NkvXXu0mjfve~qj literal 0 HcmV?d00001 diff --git a/hand_tests/fake_player.py b/hand_tests/fake_player.py index 1a215ba..c9b7ef0 100644 --- a/hand_tests/fake_player.py +++ b/hand_tests/fake_player.py @@ -57,6 +57,10 @@ class FakePlayer(gobject.GObject): return self._layout @property + def node(self): + return None + + @property def title(self): return self._title.get_text() diff --git a/hand_tests/test_nav_control.py b/hand_tests/test_nav_control.py new file mode 100755 index 0000000..e1649fa --- /dev/null +++ b/hand_tests/test_nav_control.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python + +import sys +import logging + +import gtk + +sys.path.append('../src') + +import imagestore +import playcontrol +import fake_player + + +if __name__ == "__main__": + logging.basicConfig(level=logging.DEBUG) + + store = imagestore.ImageStore("../data", ".") + + player = fake_player.FakePlayer() + sp = playcontrol.NavControl(player, store) + + layout = gtk.VBox() + layout.pack_start(player.toplevel) + layout.pack_start(sp.toplevel) + + window = gtk.Window() + window.set_title("Test") + window.add(layout) + window.connect("destroy", lambda w: gtk.main_quit()) + window.show_all() + + sp.refresh() + + gtk.main() diff --git a/src/imagestore.py b/src/imagestore.py index bf82efc..9ca9964 100644 --- a/src/imagestore.py +++ b/src/imagestore.py @@ -13,6 +13,14 @@ class ImageStore(object): "play": "play.png", "stop": "stop.png", "home": "home.png", + + "small_next": "small_next.png", + "small_prev": "small_prev.png", + "small_pause": "small_pause.png", + "small_play": "small_play.png", + "small_stop": "small_stop.png", + "small_home": "small_home.png", + "loading": "loading.gif", "radio_header": "radio_header.png", diff --git a/src/playcontrol.py b/src/playcontrol.py index c0fa3b5..f9bf348 100644 --- a/src/playcontrol.py +++ b/src/playcontrol.py @@ -1,15 +1,156 @@ import logging +import gobject import gtk import gtk_toolbox import hildonize import util.misc as misc_utils +import presenter + _moduleLogger = logging.getLogger(__name__) +class NavControl(gobject.GObject): + + + __gsignals__ = { + 'home' : ( + gobject.SIGNAL_RUN_LAST, + gobject.TYPE_NONE, + (), + ), + 'jump-to' : ( + gobject.SIGNAL_RUN_LAST, + gobject.TYPE_NONE, + (gobject.TYPE_PYOBJECT, ), + ), + } + + def __init__(self, player, store): + gobject.GObject.__init__(self) + + self._store = store + + self._player = player + self._player.connect("state-change", self._on_player_state_change) + self._player.connect("title-change", self._on_player_title_change) + + self._controlButton = store.get_image_from_store(store.STORE_LOOKUP["small_play"]) + + self._controlBox = presenter.NavigationBox() + self._controlBox.toplevel.add(self._controlButton) + self._controlBox.connect("action", self._on_nav_action) + self._controlBox.connect("navigating", self._on_navigating) + + self._titleButton = gtk.Label("") + + self._displayBox = presenter.NavigationBox() + self._displayBox.toplevel.add(self._titleButton) + self._displayBox.connect("action", self._on_nav_action) + self._displayBox.connect("navigating", self._on_navigating) + + self._layout = gtk.HBox() + self._layout.pack_start(self._controlBox.toplevel, False, False) + self._layout.pack_start(self._displayBox.toplevel, False, True) + + def refresh(self): + if not self._player.title: + self.toplevel.hide() + + @property + def toplevel(self): + return self._layout + + def set_orientation(self, orientation): + pass + + @misc_utils.log_exception(_moduleLogger) + def _on_player_state_change(self, player, newState): + if self._controlBox.is_active() or self._displayBox.is_active(): + return + + if newState == "play": + stateImage = self._store.STORE_LOOKUP["small_play"] + self._store.set_image_from_store(self._controlButton, stateImage) + self.toplevel.show() + elif newState == "pause": + stateImage = self._store.STORE_LOOKUP["small_pause"] + self._store.set_image_from_store(self._controlButton, stateImage) + self.toplevel.show() + elif newState == "stop": + self._titleButton.set_label("") + self.toplevel.hide() + else: + _moduleLogger.info("Unhandled player state %s" % newState) + stateImage = self._store.STORE_LOOKUP["small_pause"] + self._store.set_image_from_store(self._controlButton, stateImage) + + @misc_utils.log_exception(_moduleLogger) + def _on_player_title_change(self, player, newState): + self._titleButton.set_label(self._player.title) + + @misc_utils.log_exception(_moduleLogger) + def _on_navigating(self, widget, navState): + if navState == "down": + imageName = "small_home" + elif navState == "up": + imageName = "small_play" + elif navState == "clicking" or not self._player.can_navigate: + if widget is self._controlBox: + if self._player.state == "play": + imageName = "small_pause" + else: + imageName = "small_play" + elif widget is self._displayBox: + if self._player.state == "play": + imageName = "small_play" + else: + imageName = "small_pause" + else: + raise NotImplementedError() + elif navState == "left": + imageName = "small_next" + elif navState == "right": + imageName = "small_prev" + + imagePath = self._store.STORE_LOOKUP[imageName] + self._store.set_image_from_store(self._controlButton, imagePath) + + @misc_utils.log_exception(_moduleLogger) + def _on_nav_action(self, widget, navState): + if self._player.state == "play": + imageName = "small_play" + else: + imageName = "small_pause" + imagePath = self._store.STORE_LOOKUP[imageName] + self._store.set_image_from_store(self._controlButton, imagePath) + + if navState == "clicking": + if widget is self._controlBox: + if self._player.state == "play": + self._player.pause() + else: + self._player.play() + elif widget is self._displayBox: + self.emit("jump-to", self._player.node) + else: + raise NotImplementedError() + elif navState == "down": + self.emit("home") + elif navState == "up": + pass + elif navState == "left": + self._player.next() + elif navState == "right": + self._player.back() + + +gobject.type_register(NavControl) + + class PlayControl(object): def __init__(self, player, store): @@ -21,27 +162,27 @@ class PlayControl(object): self._player.connect("state-change", self._on_player_state_change) self._player.connect("title-change", self._on_player_nav_change) - img = store.get_image_from_store(store.STORE_LOOKUP["prev"]) + img = store.get_image_from_store(store.STORE_LOOKUP["small_prev"]) self._back = gtk.Button() self._back.set_image(img) self._back.connect("clicked", self._on_back_clicked) - img = store.get_image_from_store(store.STORE_LOOKUP["stop"]) + img = store.get_image_from_store(store.STORE_LOOKUP["small_stop"]) self._stop = gtk.Button() self._stop.set_image(img) self._stop.connect("clicked", self._on_stop_clicked) - img = store.get_image_from_store(store.STORE_LOOKUP["pause"]) + img = store.get_image_from_store(store.STORE_LOOKUP["small_pause"]) self._pause = gtk.Button() self._pause.set_image(img) self._pause.connect("clicked", self._on_pause_clicked) - img = store.get_image_from_store(store.STORE_LOOKUP["play"]) + img = store.get_image_from_store(store.STORE_LOOKUP["small_play"]) self._play = gtk.Button() self._play.set_image(img) self._play.connect("clicked", self._on_play_clicked) - img = store.get_image_from_store(store.STORE_LOOKUP["next"]) + img = store.get_image_from_store(store.STORE_LOOKUP["small_next"]) self._next = gtk.Button() self._next.set_image(img) self._next.connect("clicked", self._on_next_clicked) diff --git a/src/player.py b/src/player.py index 6197138..c4a06de 100644 --- a/src/player.py +++ b/src/player.py @@ -35,6 +35,10 @@ class Player(gobject.GObject): self.emit("title_change", self._state) @property + def node(self): + return self._node + + @property def title(self): if self._node is None: return "" -- 1.7.9.5