From dfb52494c10b0cb7cb56eac88bb194bb6fb96418 Mon Sep 17 00:00:00 2001 From: Flavio Tordini Date: Fri, 11 Sep 2015 14:40:44 +0200 Subject: [PATCH] HiDPI support --- images/app@2x.png | Bin 0 -> 50687 bytes images/badge3@2x.png | Bin 0 -> 2223 bytes images/badge4@2x.png | Bin 0 -> 2252 bytes images/badge@2x.png | Bin 0 -> 2122 bytes images/channels@2x.png | Bin 0 -> 1200 bytes images/mark-watched@2x.png | Bin 0 -> 791 bytes images/refine-search.png | Bin 323 -> 571 bytes images/refine-search@2x.png | Bin 0 -> 1021 bytes images/search-duration@2x.png | Bin 0 -> 777 bytes images/search-quality@2x.png | Bin 0 -> 547 bytes images/search-sortBy@2x.png | Bin 0 -> 430 bytes images/search-time@2x.png | Bin 0 -> 673 bytes images/show-updated.png | Bin 376 -> 486 bytes images/show-updated@2x.png | Bin 0 -> 766 bytes images/sort@2x.png | Bin 0 -> 602 bytes images/unwatched@2x.png | Bin 0 -> 4459 bytes images/worldwide@2x.png | Bin 0 -> 1424 bytes resources.qrc | 15 ++++ src/aboutview.cpp | 3 +- src/channelitemdelegate.cpp | 5 +- src/downloadmanager.cpp | 3 +- src/iconutils.cpp | 22 +++++- src/iconutils.h | 4 ++ src/main.cpp | 5 +- src/mainwindow.cpp | 9 ++- src/mediaview.cpp | 4 +- src/painterutils.cpp | 15 ++-- src/playlistitemdelegate.cpp | 9 ++- .../qtsingleapplication.pri | 1 - src/refinesearchbutton.cpp | 23 +++---- src/refinesearchwidget.cpp | 8 ++- src/searchview.cpp | 5 +- src/segmentedcontrol.cpp | 6 +- src/segmentedcontrol.h | 2 +- src/video.cpp | 28 ++++---- src/video.h | 64 ++++++++++-------- src/videosourcewidget.cpp | 56 ++++++++++----- src/videosourcewidget.h | 8 ++- src/yt3listparser.cpp | 2 +- src/ytchannel.cpp | 13 ++-- 40 files changed, 190 insertions(+), 120 deletions(-) create mode 100644 images/app@2x.png create mode 100644 images/badge3@2x.png create mode 100644 images/badge4@2x.png create mode 100644 images/badge@2x.png create mode 100644 images/channels@2x.png create mode 100644 images/mark-watched@2x.png create mode 100644 images/refine-search@2x.png create mode 100644 images/search-duration@2x.png create mode 100644 images/search-quality@2x.png create mode 100644 images/search-sortBy@2x.png create mode 100644 images/search-time@2x.png create mode 100644 images/show-updated@2x.png create mode 100644 images/sort@2x.png create mode 100644 images/unwatched@2x.png create mode 100644 images/worldwide@2x.png diff --git a/images/app@2x.png b/images/app@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..38c2c3090068f5e446cd7bff4820e27a42e68541 GIT binary patch literal 50687 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 R$B!`pfv2mV%Q~loCICmRb^!nY literal 0 HcmV?d00001 diff --git a/images/badge3@2x.png b/images/badge3@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f516a47d043286346ad68fa08be03180de351bbb GIT binary patch literal 2223 zcmV;g2vGNlP)F2Br|GC|M0-TJ@fE9|MNfRJm&>|002@ZosEo)%(Ysr zD3bdJbJWinzkbx4nH%~ zJf^LPa5y~QVzK;DmgUWW`R)f@M-K$hgF%dF6m)&2F$%~slEs4TbRxT4Aj|iEjp@36 zG#ZWWP*wGt>A0UV5w*3o^7if9|6nqiYJnU8V{D9QXD6{6H_&=}G2-#*#F927lL=+s zJj@FgU@0v{ve^=!M&j}Kj$ONUeOy~xJEb0&5)p%ggYMki+@q2tRRI{`FyZs(iC(>m z5sOX5RmLEh%~%#MMqRlQNmT*RH0^JGzyGcL{QN-Le$s8|^Z5$r%$d_9%kmO{Xh#R5 zr%qvn!&44E8<12Ldu1h-7hV8B*Y(Q-0|V>4UT=R||4*k;S67$2sHo_)EX(B>2BW7= zG4|z`GYC6-uq|JX{nb}NlF)ViQg?Uv&q_*49;%FVh>&Bk*k4U1(|Qbp(DCC$uU^eS z$k~H+$r5tbuLmF=j~_Ri%^QJ9=ZuFDAq9iM-#HwPKLLz1H8J-2=NSn$+pxd(8frxa z0HILmw@#;XKVYP4KN%6yl`B`~En2jwU6y56w4;OIks}!nH;a%YoNvF4rL+`X*M~1$ zxUgu|s#U$DAY(EjlwdIUiNoR8VniYgee@B!-=CeJvjo}YBJaKTkZd+Wq0lEzr*kWy zC2gC+ht$~ESeTQO^J{=`OAGqoAZXgGGJR->@Y%Bf*zNY;G&D36kfQTVsmNTmY}v0Q zNm7kijM0{stQSeyLiqG))K^|XHk;KID^|P(d`uEmBqKrs%x<^)=YS}dg2C)Yn?>k> z0MW0$!dhOA+wJ}Zun)0 zf;KP!M#|-PRzU0T$B0CbtX2vN3SINVa_HO-)VR!h?kQ*=L0+X0cg{i|;0P^5n_xWJF9*ibn-mrr_W~%+EbXPfySF;^N}p18u+n6Ub0f zxKIGQs;bJ`wQE-?bLODmxkI$0LzLUI#2gzpl2cU$!0z3<|9tM;xqkzKH%=&z|E*4;gWE_!sZEMAOf-##RZg-e$%U0%9$>4yk4d`p@{ zfKWspP+C@2w&Kj0GatBIE|=!>;j5`Z^ZBxx#7v=hJQN;2jNxd_JGa@An5QD=U|pTrOFys33Cwyg0gh0^~o@%tb|b_V35^)KkRc z@z~a_TMwQ%apDrt4GfZGqD+Sf4Nxv#yckgwWpwrG)r*weTsi0U*NI)bM!dUQOrTGQ z*;cK>vwuH|$Ahlx+RmLj|FU=Q-m^d#&mZ;h{r^e(Cjk3jvJLQ9_@7N~pe`*tKg9ahF+`OG|OQ@dl1J-@JPP z+}GFVtEs6u(%jtq9|Q?EfPRupkoP04D?h-7s4a?tBB#??c;LW+wHr2USZ%RbEQyBk zTeled;tOKeuM_X>MbGe|uk3VUnmZTs^Uq^jxf0Ve_uhv@qtR%6ef>YSY}xWzFc|a! zw-7}1BdW=a6hSiL8PLSiI#xM-S7#<$>*VosdE-5Mb z5O{YywwK3awUhep<^fFQeS{2H05{@&)Q^Eez-=;_)S8-_1(lVR#S0fMeA?^v=DS=j zr=lnin}enVP1CeMAP~HL`}Upo_V)iaH#c|H)zx*!;zE#;i%?4rLOBXTMVWfJXCQi4L-h0rqSuEIMN$AkKw@W^ zHVMoyNC}asf>>E>fI9x$$~`g?#LWbW#1bS##x0CcMP&TjcW$uKMJ9Sny3b_pk&{hD xB$7@fK4k?=L`EN+PVkp$-w7Bge*b_>;Q!@n`e%{hn~4Ab002ovPDHLkV1ju0ErkF8 literal 0 HcmV?d00001 diff --git a/images/badge4@2x.png b/images/badge4@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4511b45504d112d9c58f5aa8a31582520085a6ed GIT binary patch literal 2252 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 At^fc4 literal 0 HcmV?d00001 diff --git a/images/channels@2x.png b/images/channels@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..abba86bf58f49915b68b7613006d71bb3caa9cee GIT binary patch literal 1200 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v-}au@pObhHwBu4M$1`kk47*5n0T@ zAiW-h8RMiT$^Zo=OI#yLg7ec#$`gxH8OqDc^)mCai<1)zQuXqS(r3T3kpdc|>*?Yc zQZeW4T}8iYUy0U_mn*-z@8VI}G;4#h&smklC$@|6NClpidbLqy>5JKaj=Cy(Se56s z8&}qGS3GaA5eV5maY@jrwM+i1-u3?F|N7UYl8%nrb3bo9QuwWJbmiaK?~n5*ZPT{@ zb6HcV%)7qh&3dyV|CanTe}1dq`%>AgWy{&hZ^Wl}{Pp}i|8Ja})SZNS+uwgZU;jV< zY4&V3^BeK!>*`Jn z>M#A7UHtaAYNoaC<=|%PH|vc-L2|xMpC9U=C13xi|2*s4Ed6GE`u_R;&l*jc+9*U@ zm;BtktmE;8r->+}J_n*Wk%f1Ji6oOsesLr*r`KS1@@TDL)dQMr&D<`SHbiMSG zi+{eVt@keNrF-;kkNxZ3D39j-1M@e4Q~$Gk+5Ojl-LL(v`cgpf_nglgk2-#fPg(JI z_WR@aRdU1Yek=#tGVPzh&G=kUQqMoPRet)CwdhY4h6u z`A^NwA!(t`ZYKLR4hc%pq-W=6y?VO&An&*9oA1w8k+tHh$b}?@ow32YI%J{0Dzv9wa|Lvc<|M?NYxBM0;AUs|DT-G@y GGywp%AQg!K literal 0 HcmV?d00001 diff --git a/images/mark-watched@2x.png b/images/mark-watched@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..73f8fb47c78022ec40c5ea95684cf18e958aea05 GIT binary patch literal 791 zcmV+y1L*vTP)O;HqvzcqWtj3_iBf-&(5iDZzSeGa!^;vEuE zn1({(5s45&L!ppJG(gh{iJ$go1)ZZeiw}r7%~HJLfPrbnaiR zz1F|h`uECyKnpFj@V`TvA(u*}o+L>&1M5_E9xxkF;Dd;~Nz?RRnx?nB_iz5GfG`X< z0>@N!%Or9XxFI4JqbR!bR|0|{SgxuUMWin${7hA=03xyySdzneAR5pVNUpZk|evm_qD9Etzj3ly1Kd^6f~!;t!;m{xwW>V zudlDYzV_aKQq_Zbxxfx%OxZa%D_4MXu3JPN0j{9H^Gc;st}lWh*lUdWQmfTI2SKo> z?vLa6F7Udbh7*xT&bjUh0z_m0m|u_x@VIVRYde5Tz*Jxwa5+1PEH?-9$9w%MfFIYV z8EApsRPIj!#+aQHj}Bl(-SFOzipXK027DEfL*;ULERUOmSL3~ahFf5*oo9?01eO&f zuOAv3x?f+^$DVB-hT$evy;YF^G)ajn%&T51 zm1d5OjaA4$OM^+0?DF1!$vTT(LJ7n0xT>B7rZmJ}0SB^^00@F$9dHF$(7^wus;A;O zzCg}d`R!9|tzFvQ-hN3{H{^t00M&7OC9pV$b30AbBg4bP&x(3X>N9fAZ4i+Yz@|y$ zsEFK5)AW2C$M^nJyQ%Lu48ysqx(!$ZbOUqvG1m9MTM>B(3`SA(u9>g4nS{#gJ3002ovPDHLkV1lMrWAp$3 literal 0 HcmV?d00001 diff --git a/images/refine-search.png b/images/refine-search.png index ea2cd3eca065b49ed4a16a7046e9874302f2123b..dd977aa7a6507e3389b1a40e8af0fda6114f547b 100644 GIT binary patch delta 547 zcmV+;0^I$>0=oo|BYyw{b3#c}2nYxWdZuoV$?8$H8~R=~nRgeT*|xei+NRoh&tMs1MXm z@Eo%L7k?^wd+OcX)TocG);D!s-KtsN)>IqFZFMsf)TBFYAZOJD|Gl50-m5p&M>XsB zV_xzE3lgteTP(bRA>&h@8Go|pS lLkka(=^XzS9w6hf{tJYb%4XkQgUSE^002ovPDHLkV1j1J_VEA! delta 297 zcmV+^0oMMz1j7Q5BYy!3Nkl!HHwASo( zZ}ME4UB82({#g10ZT$x+RcN(4K`DZ}EOcRo&@N)7KekXR4G|9Q>{q8-JAukLJd~=`geP`yJGxr;(0s@|s)FY`&(n?8-vd3ul_(jqWlCC@FCW`ck zE?^2COgZb=JZHc1ZeGQj+8PF-f;14QJ0=CACTF$k~5fQm=DvAm{7D z0=h|ej*uP$UjrL~CJ(0#*aQ5Qa z@KizeYT(Zr{Nh_Iu$b_U^J!uDe?49Vh66nYDSFre2Lj;BK%NDir_U?ERG`<^B2Wk1 z_5de?t98D7FHr@(o?J3Z}x1bS>!33Zb1{J_psIUf(2yMvOvw}r>YW3 zzk6yu7LZXPwrS@}Bn^6M?Le0WW>Dyd+f5S*=nb62r_1@Q+OHjW=;=2NEU^L?0{1+? zM?h!f0Otd5*tMe2Qvv98pgEHH*MNTly>=A^cMu*{eM8B?6tIf$J;yNMJCkxXI2V9J zI?pj3GBenlfYBQKHw&B3nzZIPm0h1lt+`K>+4J7b^A+)$bxi}9%$B2M7Y?^yyq zHin2kF)S_Mqaq=qOr2xMIk!*JXNF6b(y0HQLjn%xc=yi`Y2;rQ0Uyj;^A!Q_&s*~q r0q@N)e|BD(uL#&XZ_QT}+HL*?RoUH>^#@iw00000NkvXXu0mjfM4!b? literal 0 HcmV?d00001 diff --git a/images/search-duration@2x.png b/images/search-duration@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..daef48d7c1aaecc7a1162e6d38641eb40e17cfec GIT binary patch literal 777 zcmV+k1NQuhP)WvG9V@NrIKP5^XfL8jaXl zczFOjRHD%*(5UZVVj%@y;w9P|eE=0=A+a$55p44WIEE&oNsecU$bjL(F5fWShqm4E_)C7K~%A0&&`wa37nh zk`LlbiR3>TZK*@-2lSUEKZKcrBrBN273@VV`llwWiK}?gh)w^W#!#7_7m>fg;j%rz z5xgtNGo{T)Y{n<~Uf)N(0(piSZeTgd`B95CFp$qen*Gc42LyO#T>T6g`~2{ z63Hf__?;ySfR_o^xw@e3F`iaPSQTmR6LsNWi80Z|0@B>Wbqqu={s_|AEllHY^gK`( z7GZ{;!b0g5RvH```g)Rpc3ZC%`h<~-u_WxQBIG!JX+Gh~$Zos~irO+R7yP%OQEV1B zQ^(gRpclJK6wt}-)N!)l{T{@l{ID z7|1Gj#93jV=eAmkDq^!$(DD)C`ZgecJ^v(J&nL7#j+^ig{NzFJvfb4-00000NkvXX Hu0mjfp;BJm literal 0 HcmV?d00001 diff --git a/images/search-quality@2x.png b/images/search-quality@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..303515352a434224748fea144712e9759f99d29b GIT binary patch literal 547 zcmV+;0^I$HP)b*xfXX$IDvaL#&|`@S-4jZm+S23eT}9NZ$kqeS@n& zKYmxiStkKQZ@~$^#P{DGn18hVV9(*2P_mr`Ed{n&ka#n4E@jv@>M9%uc!!^%>=Dke zUr4|`jN>CdV+^afnOblI4?@gTV09t#JlAba*(+SnojX}@YQcIz0qZWeU`KWcS42-R z8`zJ60#dG5_^PSEN^%bMZ`g}~x9Ekk#|4QmT0b~?!6~)iZl?1700lh7oe(jXz$?*$ z_gL1P(zSxb7i}##mV;BTC8%n_25MJg7>)LUp|{|>W*XL*F}Ta1I^CIg}^PKMP;B?8@Bc6pu zjSiEGEhoF3zUX`_`d9DU+CTL^;tXzWL0!k{7Uya#jT2z$FO<12tHZ}2&2U4)^-rI) zE6>qhg=3GR1XmU6cGN!JthDUdb0?iiDm&M{{uN}CGwa!!_rH^GHa)L=zwUKiS9+kx z+EbhMsJG}?K7YQ+w&enQ@|#Fc(YA-oJbMbKrJ6fe-?n~v@7v7!XC9tQ3Uv-Jflz{? zwMt7&!8!lba*l=K$8KcLdmbJd8rxkSdwuSfT z`uveTE@3a~`tU!ufv9104Oh~)A9ftMg`zFre(1Gq+`*G*qo>3t_FraIiC-*DO!RT1;(FnAw6Hl-3Ef+Nwy2Pi0J~GXL-=P z21@8JNa_jRrRN!p7iAtWo^0VQ9v9f`wKz?nT<2{n*oRTr{t26}Nb$nukM%;FZCV<2(#=}LUv(vz=uxddkMFv!+p1kYthX)Sgpjy^p&f=Bor zbc5IwWYv9OA}VC7U;)Dgx+|$g3@4w?0^Nj~ePGRNpp`%@!Yw!xWE&EXU`NpHP8@yq zCq9K=1u?3~Ps6h8`ZbSl!J$pItSa~uba^#@5AqJ#Jzz#wa4~^)*@bmF7q(VGD}h-{ zi=~-ZNHMFcfb6GZ$m*cef>jip)lz&YGf^S}5POYYdKPdQ?a00000NkvXX Hu0mjfWp*JK literal 0 HcmV?d00001 diff --git a/images/show-updated.png b/images/show-updated.png index 732c556f34d6f8d2440ce7b9831ac0de47c789aa..9af84f2609fa2bc50c04971acdf01bd3f6458121 100644 GIT binary patch delta 386 zcmV-|0e$}X0_FpdZGQn{NklgWvD^?E#VsI_?2d&%aKn#3r#y4#n{(%0_@~4o(=^SE zR4TO}$MH6xrIat@@%X;gY7N%`gk@Q$LWoOXGjTQmu6*CW27mM-fXL_bH^AY_$U@wD zo_9QjsOf=aS!Y6s^W+7`ap?E^gkdZ`2_U7klRf8hIi!@!I@yY%Xb)ft$R;bQ)he}GZN+bpodM!F)~hO) zNY4O3_YZ*Xe0zchUvvJcUX@Z0Fd1X7*Bcv#@c|rs%cwPB7}9RH84ic@e#P^=M@TGE zp-`x6t&i5cUiW?fgybRt1VM0T7{)u02hz#dTI)))*}P!MD$i6b7SmA_*}%@kdR9s` gT-P0~N%wnw0vF?cdvIUZ6951J07*qoM6N<$g6c)LtN;K2 delta 276 zcmV+v0qg$e1NZ`vZGQmuNkl-@25Zu#bhF-L^N9V=`{D3EJt{JDptU{`(HQ_l^Tn&c+0000U0+fA}d6GiBQ zg`Jtl_kR1$?lQoc{;?RuY?|h%Qfd~!G|3SWNdN%JeG#buSkqdsmP)0seFd;>+XS!# z;D*n-pS9N6QmORmQ~(nb6X%D9hF$=;*URf65s_C~>&0@pd>9yDYHBKabaeEV!%EFYO7YOW%l;=e!CZxm%Gt+U*XYc6k}s!7#<$(X1f{= zhnGFG+!K~%StMV>=bqzJpjxeBcXzj&)r!aCA1al~LF?p+4v<{(6CQ~~kj-Xc z+qNH0G-^I`Po8TXOioT-(OP$H{oLFfY}-aMnS@~&e!~F(B9bvpbF}q8(bj=_y*|^c z$oTj;QmItn@Z&(GZncivIzTeht3WQ7Lnssi0Ho7t%+JpU0uYgD0M9)E09@)-z;T@8 z`$QrUC>#Jtwq>|q!i#|`2G>Y80Qn05x*Na&1}u_4Is%Y%Fkp#DTZVEi<_8Txa;+l( z$#;VW5RvyC0d{tFz5`evR5;0eu~_`p5dZ*0n2f#)j!q*MMnDIId0UigErX0ul6^q5* zD5Wj{un_!EssXHoLZQ2xo0~s7nS2#BO*5sGdJ5pCA3w=F$;aE<+h2Nm{S<5}olajC wky#O$R!SvAB;HusZ(MnjtBue3O#g@e04IUL$)AW?VE_OC07*qoM6N<$f(G?U^8f$< literal 0 HcmV?d00001 diff --git a/images/sort@2x.png b/images/sort@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..74753259086e316c17da142633c402ba932c8d28 GIT binary patch literal 602 zcmV-g0;T>@ea9sxN%F$c9H0$62OeY@ z0O~ohW0V#Jt#uc;ms4|JYkhN-CQBPI##~WKz2$`AR7$<^egA5q2HNem2lN4NiMq4a z+J3XyJXe^3$z<{jI0KAlPZsldsa!5UJ*|PvPi>5`E?q=&f6uCQ$A)mzYz=G;I9Ks1 z7-L=odrRaUy%GB&au*8t0@Z5uF>uJA8<2Mg=J7O5(kr4{ z@ipN3Lg>Bcd5>H*xqJO@Xti4B(=-i%OEc-qbUO7%qtRDae&KsyFc^GON_Bx>z@bv= oMppB+qP6a6t$Q19yyc(cH=4YN|Lj=e0RR9107*qoM6N<$f{Dod^Z)<= literal 0 HcmV?d00001 diff --git a/images/unwatched@2x.png b/images/unwatched@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..573c25e78398f512cb42ee214fddf85023ed8642 GIT binary patch literal 4459 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 literal 0 HcmV?d00001 diff --git a/images/worldwide@2x.png b/images/worldwide@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2393b389579d60b8fb4437588b7d336679650680 GIT binary patch literal 1424 zcmV;B1#kL^P)AGB0M+ZmoHrXZA-((vUs$d@p0 z=D2wGk!kx1g}_SBX6`%Z{?Gq^&)m89JovAhTnWe+Gs$(`DPb5^1EkaGLs1kR@qPb~ zYbGF@&DQ4g`DVv)mZ<97lF3ANsp@A@6s^tWa=lkYKtn^rWMHMLJ_)1~p&p<|L_}3< zfx1L2RMj= z!?14W&Yiy{F{u)HR$6kkz&EWw1P~F7F{^>&s(Q})%2ait#gNbEeGy4+SOqH6>GTR< z`G^(BX0x?X6zv8ij^n#UF^7(wT zh@@5Z{T(}Y_<#?r1IT1D2SsGM<2cLWIF5lT5h(+(l{hXUDOG)2Rr`V5GbAb?B6^KThgp&~l>yv=_^XD&&p=JWruw z-N07h3{X7j$|+Q25pcVR*(Bev+c1?%y`0bIn}JGI9ROZY)o)$b zoujHB0mppbUp^FP#cu-;k)@8~?1|&}o;Z%57m?|}@i>lG4aE#=NNf++1e~+LdR5(< zPN%onDl~eYS2+~7V8MckKo$tYFx*mIUAR<+|?X zFbr=Jkv3qA>$)vNF<}@!L7{1BbsVRc6D`qIug$%+j7tIZb+q4D^&GqAbCLT7m*$S zRjmVR6S4EE`c53jt4fvqvIG<@lgZ4q&BRhh?v8pyWSy$6O@3-uML^Q*eLgk$*9images/badge3.png images/badge4.png sounds/snapshot.wav + images/app@2x.png + images/sort@2x.png + images/unwatched@2x.png + images/badge@2x.png + images/badge3@2x.png + images/channels@2x.png + images/mark-watched@2x.png + images/show-updated@2x.png + images/worldwide@2x.png + images/badge4@2x.png + images/refine-search@2x.png + images/search-duration@2x.png + images/search-quality@2x.png + images/search-time@2x.png + images/search-sortBy@2x.png diff --git a/src/aboutview.cpp b/src/aboutview.cpp index 8548e86..19c5ee5 100644 --- a/src/aboutview.cpp +++ b/src/aboutview.cpp @@ -31,6 +31,7 @@ $END_LICENSE */ #include "mac_startup.h" #endif #include "fontutils.h" +#include "iconutils.h" AboutView::AboutView(QWidget *parent) : View(parent) { @@ -40,7 +41,7 @@ AboutView::AboutView(QWidget *parent) : View(parent) { hLayout->setSpacing(30); QLabel *logo = new QLabel(this); - logo->setPixmap(QPixmap(":/images/app.png")); + logo->setPixmap(IconUtils::pixmap(":/images/app.png")); hLayout->addWidget(logo, 0, Qt::AlignTop); QBoxLayout *layout = new QVBoxLayout(); diff --git a/src/channelitemdelegate.cpp b/src/channelitemdelegate.cpp index 4c13dfe..16f3a53 100644 --- a/src/channelitemdelegate.cpp +++ b/src/channelitemdelegate.cpp @@ -24,6 +24,7 @@ $END_LICENSE */ #include "fontutils.h" #include "channelaggregator.h" #include "painterutils.h" +#include "iconutils.h" static const int ITEM_WIDTH = 128; static const int ITEM_HEIGHT = 128; @@ -62,7 +63,7 @@ void ChannelItemDelegate::paintAggregate(QPainter* painter, painter->translate(option.rect.topLeft()); const QRect line(0, 0, option.rect.width(), option.rect.height()); - static const QPixmap thumbnail = QPixmap(":/images/channels.png"); + static const QPixmap thumbnail = IconUtils::pixmap(":/images/channels.png"); QString name = tr("All Videos"); @@ -80,7 +81,7 @@ void ChannelItemDelegate::paintUnwatched(QPainter* painter, painter->translate(option.rect.topLeft()); const QRect line(0, 0, option.rect.width(), option.rect.height()); - static const QPixmap thumbnail = QPixmap(":/images/unwatched.png"); + static const QPixmap thumbnail = IconUtils::pixmap(":/images/unwatched.png"); QString name = tr("Unwatched Videos"); diff --git a/src/downloadmanager.cpp b/src/downloadmanager.cpp index 2a7ac2e..9375bb0 100644 --- a/src/downloadmanager.cpp +++ b/src/downloadmanager.cpp @@ -32,6 +32,7 @@ $END_LICENSE */ #endif #include "datautils.h" #include "compatibility/pathsservice.h" +#include "iconutils.h" static DownloadManager *downloadManagerInstance = 0; @@ -73,7 +74,7 @@ void DownloadManager::addItem(Video *video) { if (!Activation::instance().isActivated()) { if (video->duration() >= 60*4) { QMessageBox msgBox(MainWindow::instance()); - msgBox.setIconPixmap(QPixmap(":/images/app.png").scaled(64, 64, Qt::KeepAspectRatio, Qt::SmoothTransformation)); + msgBox.setIconPixmap(IconUtils::pixmap(":/images/app.png").scaled(64, 64, Qt::KeepAspectRatio, Qt::SmoothTransformation)); msgBox.setText(tr("This is just the demo version of %1.").arg(Constants::NAME)); msgBox.setInformativeText( tr("It can only download videos shorter than %1 minutes so you can test the download functionality.") diff --git a/src/iconutils.cpp b/src/iconutils.cpp index 6b0f61e..b975411 100644 --- a/src/iconutils.cpp +++ b/src/iconutils.cpp @@ -33,9 +33,9 @@ QIcon IconUtils::fromTheme(const QString &name) { QIcon IconUtils::fromResources(const QString &name) { QIcon icon = QIcon(QString(":/images/%1.png").arg(name)); if (!icon.isNull()) { - icon.addPixmap(QString(":/images/%1_active.png").arg(name), QIcon::Active); - icon.addPixmap(QString(":/images/%1_selected.png").arg(name), QIcon::Selected); - icon.addPixmap(QString(":/images/%1_disabled.png").arg(name), QIcon::Disabled); + icon.addPixmap(IconUtils::pixmap(QString(":/images/%1_active.png").arg(name)), QIcon::Active); + icon.addPixmap(IconUtils::pixmap(QString(":/images/%1_selected.png").arg(name)), QIcon::Selected); + icon.addPixmap(IconUtils::pixmap(QString(":/images/%1_disabled.png").arg(name)), QIcon::Disabled); } return icon; } @@ -110,3 +110,19 @@ void IconUtils::setupAction(QAction *action) { action->shortcut().toString(QKeySequence::NativeText) + ")"); } + +QPixmap IconUtils::pixmap(const QString &name) { + // Check if a "@2x" file exists + QString fileName = name; + if (qApp->devicePixelRatio() > 1.0) { + int dotIndex = fileName.lastIndexOf(QLatin1Char('.')); + if (dotIndex != -1) { + QString at2xfileName = fileName; + at2xfileName.insert(dotIndex, QStringLiteral("@2x")); + if (QFile::exists(at2xfileName)) + fileName = at2xfileName; + } + } + + return QPixmap(fileName); +} diff --git a/src/iconutils.h b/src/iconutils.h index 398fc4c..8518412 100644 --- a/src/iconutils.h +++ b/src/iconutils.h @@ -35,6 +35,10 @@ public: static QIcon tintedIcon(const QString &name, const QColor &color, const QSize &size); static void setupAction(QAction *action); + // HiDPI stuff + static QPixmap pixmap(const QString &name); + static qreal maxSupportedPixelRatio() { return 2.0; } + private: IconUtils() { } static QImage grayscaled(const QImage &image); diff --git a/src/main.cpp b/src/main.cpp index 6515067..ea695ec 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -64,7 +64,7 @@ int main(int argc, char **argv) { #ifdef Q_OS_MAC mac::MacMain(); - QFont::insertSubstitution(".Helvetica Neue DeskInterface", "Helvetica Neue"); + // QFont::insertSubstitution(".Helvetica Neue DeskInterface", "Helvetica Neue"); #endif QtSingleApplication app(argc, argv); @@ -81,9 +81,8 @@ int main(int argc, char **argv) { app.setOrganizationDomain(Constants::ORG_DOMAIN); app.setApplicationVersion(Constants::VERSION); app.setAttribute(Qt::AA_DontShowIconsInMenus); -#ifndef APP_WIN app.setWheelScrollLines(1); -#endif + app.setAttribute(Qt::AA_UseHighDpiPixmaps); #ifdef APP_EXTRA Extra::appSetup(&app); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 5a50548..aba8d47 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -992,6 +992,8 @@ void MainWindow::showWidget(QWidget* widget, bool transition) { else title += QLatin1String(" - ") + Constants::NAME; setWindowTitle(title); + statusToolBar->setUpdatesEnabled(false); + // dynamic view actions foreach (QAction* action, viewActions) showActionInStatusBar(action, false); @@ -1004,6 +1006,8 @@ void MainWindow::showWidget(QWidget* widget, bool transition) { adjustStatusBarVisibility(); messageLabel->hide(); + statusToolBar->setUpdatesEnabled(true); + /* QString desc = metadata.value("description").toString(); if (!desc.isEmpty()) showMessage(desc); @@ -1081,7 +1085,7 @@ void MainWindow::showEvent(QShowEvent *e) { bool MainWindow::confirmQuit() { if (DownloadManager::instance()->activeItems() > 0) { QMessageBox msgBox(this); - msgBox.setIconPixmap(QPixmap(":/images/app.png").scaled(64, 64, Qt::KeepAspectRatio, Qt::SmoothTransformation)); + msgBox.setIconPixmap(IconUtils::pixmap(":/images/app.png").scaled(64, 64, Qt::KeepAspectRatio, Qt::SmoothTransformation)); msgBox.setText(tr("Do you want to exit %1 with a download in progress?").arg(Constants::NAME)); msgBox.setInformativeText(tr("If you close %1 now, this download will be cancelled.").arg(Constants::NAME)); msgBox.setModal(true); @@ -1187,7 +1191,6 @@ void MainWindow::resizeEvent(QResizeEvent *e) { #ifdef APP_MAC if (initialized && mac::CanGoFullScreen(winId())) { bool isFullscreen = mac::IsFullScreen(winId()); - qDebug() << __PRETTY_FUNCTION__ << isFullscreen << fullscreenFlag; if (isFullscreen != fullscreenFlag) { if (compactViewAct->isChecked()) { compactViewAct->setChecked(false); @@ -1725,7 +1728,7 @@ void MainWindow::gotNewVersion(const QString &version) { void MainWindow::simpleUpdateDialog(const QString &version) { QMessageBox msgBox(this); msgBox.setIconPixmap( - QPixmap(":/images/app.png") + IconUtils::pixmap(":/images/app.png") .scaled(64, 64, Qt::KeepAspectRatio, Qt::SmoothTransformation)); msgBox.setText(tr("%1 version %2 is now available.").arg(Constants::NAME, version)); msgBox.setModal(true); diff --git a/src/mediaview.cpp b/src/mediaview.cpp index 7100009..0744321 100644 --- a/src/mediaview.cpp +++ b/src/mediaview.cpp @@ -400,6 +400,8 @@ void MediaView::stop() { QSlider *slider = MainWindow::instance()->getSlider(); slider->setEnabled(false); slider->setValue(0); +#else + Phonon::SeekSlider *slider = MainWindow::instance()->getSeekSlider(); #endif if (snapshotSettings) { @@ -796,7 +798,7 @@ void MediaView::demoMessage() { #endif QMessageBox msgBox(this); - msgBox.setIconPixmap(QPixmap(":/images/app.png").scaled(64, 64, Qt::KeepAspectRatio, Qt::SmoothTransformation)); + msgBox.setIconPixmap(IconUtils::pixmap(":/images/app.png").scaled(64, 64, Qt::KeepAspectRatio, Qt::SmoothTransformation)); msgBox.setText(tr("This is just the demo version of %1.").arg(Constants::NAME)); msgBox.setInformativeText(tr("It allows you to test the application and see if it works for you.")); msgBox.setModal(true); diff --git a/src/painterutils.cpp b/src/painterutils.cpp index 7e3be42..9281b0d 100644 --- a/src/painterutils.cpp +++ b/src/painterutils.cpp @@ -20,6 +20,7 @@ $END_LICENSE */ #include "painterutils.h" #include "fontutils.h" +#include "iconutils.h" PainterUtils::PainterUtils() { } @@ -63,10 +64,9 @@ void PainterUtils::topShadow(QWidget *widget) { } void PainterUtils::paintBadge(QPainter *painter, const QString &text, bool center) { - static const QPixmap badge1 = QPixmap(":/images/badge.png"); - static const QPixmap badge3 = QPixmap(":/images/badge3.png"); - static const QPixmap badge4 = QPixmap(":/images/badge4.png"); - static const int size = badge1.height(); + const QPixmap badge1 = IconUtils::pixmap(":/images/badge.png"); + const QPixmap badge3 = IconUtils::pixmap(":/images/badge3.png"); + const QPixmap badge4 = IconUtils::pixmap(":/images/badge4.png"); const int textSize = text.size(); @@ -75,10 +75,13 @@ void PainterUtils::paintBadge(QPainter *painter, const QString &text, bool cente else if (textSize == 3) badge = badge3; else badge = badge4; + const int w = badge.width() / badge.devicePixelRatio(); + const int h = badge.height() / badge.devicePixelRatio(); + int x = 0; - if (center) x -= badge.width() / 2; + if (center) x -= w / 2; - QRect rect(x, 0, badge.width(), size); + QRect rect(x, 0, w, h); painter->drawPixmap(rect, badge); QFont f = painter->font(); diff --git a/src/playlistitemdelegate.cpp b/src/playlistitemdelegate.cpp index 7639a50..e3383f6 100644 --- a/src/playlistitemdelegate.cpp +++ b/src/playlistitemdelegate.cpp @@ -55,10 +55,13 @@ PlaylistItemDelegate::~PlaylistItemDelegate() { } void PlaylistItemDelegate::createPlayIcon() { - playIcon = QPixmap(THUMB_WIDTH, THUMB_HEIGHT); + qreal maxRatio = IconUtils::maxSupportedPixelRatio(); + playIcon = QPixmap(THUMB_WIDTH * maxRatio, THUMB_HEIGHT * maxRatio); + playIcon.setDevicePixelRatio(maxRatio); playIcon.fill(Qt::transparent); - QPixmap tempPixmap(THUMB_WIDTH, THUMB_HEIGHT); + QPixmap tempPixmap(THUMB_WIDTH * maxRatio, THUMB_HEIGHT * maxRatio); + tempPixmap.setDevicePixelRatio(maxRatio); tempPixmap.fill(Qt::transparent); QPainter painter(&tempPixmap); painter.setRenderHints(QPainter::Antialiasing, true); @@ -135,7 +138,7 @@ void PlaylistItemDelegate::paintBody( QPainter* painter, // play icon overlayed on the thumb if (isActive) - painter->drawPixmap(playIcon.rect(), playIcon); + painter->drawPixmap(0, 0, playIcon); // time if (video->duration() > 0) diff --git a/src/qtsingleapplication/qtsingleapplication.pri b/src/qtsingleapplication/qtsingleapplication.pri index 6f2bced..1d85285 100755 --- a/src/qtsingleapplication/qtsingleapplication.pri +++ b/src/qtsingleapplication/qtsingleapplication.pri @@ -1,4 +1,3 @@ -include(../common.pri) INCLUDEPATH += $$PWD DEPENDPATH += $$PWD QT *= network diff --git a/src/refinesearchbutton.cpp b/src/refinesearchbutton.cpp index eeb4fe1..361fe3a 100644 --- a/src/refinesearchbutton.cpp +++ b/src/refinesearchbutton.cpp @@ -19,21 +19,17 @@ along with Minitube. If not, see . $END_LICENSE */ #include "refinesearchbutton.h" - -static const int refineButtonSize = 48; +#include "iconutils.h" RefineSearchButton::RefineSearchButton(QWidget *parent) : QPushButton(parent) { hovered = false; + const int refineButtonSize = 48; setMinimumSize(refineButtonSize, refineButtonSize); setMaximumSize(refineButtonSize, refineButtonSize); setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - setStyleSheet( - "background: red url(:/images/refine-search.png) no-repeat center;" - "border: 0;" - ); } void RefineSearchButton::paintBackground() const { @@ -41,19 +37,18 @@ void RefineSearchButton::paintBackground() const { } void RefineSearchButton::paintEvent(QPaintEvent *) { - // QPushButton::paintEvent(event); QPainter painter(this); painter.setRenderHints(QPainter::Antialiasing, true); + painter.setPen(Qt::NoPen); painter.setBrush(QColor(0,0,0, hovered ? 192 : 170)); - QPen pen(Qt::white); - pen.setWidth(2); - painter.setPen(pen); painter.drawEllipse(QPoint(width(), height()), width()-2, height()-2); - QPixmap icon = QPixmap(":/images/refine-search.png"); - painter.drawPixmap(width() - icon.width() - 6, height() - icon.height() - 6, - icon.width(), icon.height(), - icon); + QPixmap pixmap = IconUtils::pixmap(":/images/refine-search.png"); + int pw = pixmap.width() / pixmap.devicePixelRatio(); + int ph = pixmap.height() / pixmap.devicePixelRatio(); + painter.drawPixmap(width() - pw - 6, height() - ph - 6, + pw, ph, + pixmap); } void RefineSearchButton::enterEvent(QEvent *) { diff --git a/src/refinesearchwidget.cpp b/src/refinesearchwidget.cpp index ddd0999..5948f2d 100644 --- a/src/refinesearchwidget.cpp +++ b/src/refinesearchwidget.cpp @@ -23,6 +23,7 @@ $END_LICENSE */ #ifdef APP_EXTRA #include "extra.h" #endif +#include "iconutils.h" namespace The { QHash* globalActions(); @@ -155,7 +156,8 @@ void RefineSearchWidget::setupLabel(const QString &text, QBoxLayout *layout, con QLabel *icon = new QLabel(this); icon->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); QString resource = paramName; - QPixmap pixmap = QPixmap(":/images/search-" + resource + ".png"); + QPixmap pixmap = IconUtils::pixmap(":/images/search-" + resource + ".png"); + /* QPixmap translucentPixmap(pixmap.size()); translucentPixmap.fill(Qt::transparent); QPainter painter; @@ -163,11 +165,11 @@ void RefineSearchWidget::setupLabel(const QString &text, QBoxLayout *layout, con painter.setOpacity(0.5); painter.drawPixmap(0, 0, pixmap); painter.end(); - icon->setPixmap(translucentPixmap); + */ + icon->setPixmap(pixmap); hLayout->addWidget(icon); QLabel *label = new QLabel(text, this); - label->setStyleSheet("color: rgba(0, 0, 0, 128);"); hLayout->addWidget(label); icon->setMaximumHeight(label->height()); diff --git a/src/searchview.cpp b/src/searchview.cpp index aa0038a..6f3280e 100644 --- a/src/searchview.cpp +++ b/src/searchview.cpp @@ -37,6 +37,7 @@ $END_LICENSE */ #endif #include "mainwindow.h" #include "painterutils.h" +#include "iconutils.h" namespace The { QHash* globalActions(); @@ -70,7 +71,7 @@ SearchView::SearchView(QWidget *parent) : View(parent) { mainLayout->addLayout(hLayout); QLabel *logo = new QLabel(this); - logo->setPixmap(QPixmap(":/images/app.png")); + logo->setPixmap(IconUtils::pixmap(":/images/app.png")); hLayout->addWidget(logo, 0, Qt::AlignTop); hLayout->addSpacing(PADDING); @@ -257,7 +258,7 @@ void SearchView::updateRecentKeywords() { itemLabel->setAttribute(Qt::WA_DeleteOnClose); itemLabel->setProperty("recentItem", true); itemLabel->setMaximumWidth(queryEdit->toWidget()->width() + watchButton->width()); - // itemLabel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + itemLabel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); // Make links navigable with the keyboard too itemLabel->setTextInteractionFlags(Qt::LinksAccessibleByKeyboard | Qt::LinksAccessibleByMouse); if (needStatusTip) diff --git a/src/segmentedcontrol.cpp b/src/segmentedcontrol.cpp index e27ff64..88172ab 100644 --- a/src/segmentedcontrol.cpp +++ b/src/segmentedcontrol.cpp @@ -173,7 +173,7 @@ QAction *SegmentedControl::hoveredAction(const QPoint& pos) const { return(d->actionList[buttonIndex]); } -int SegmentedControl::calculateButtonWidth (void) const { +int SegmentedControl::calculateButtonWidth() const { QFontMetrics fontMetrics(font()); int tmpItemWidth, itemWidth = 0; foreach (QAction *action, d->actionList) { @@ -195,7 +195,6 @@ void SegmentedControl::drawButton (QPainter *painter, void SegmentedControl::drawUnselectedButton (QPainter *painter, const QRect& rect, const QAction *action) { - painter->setPen(QPen(QColor(0, 0, 0, 128), 1)); paintButton(painter, rect, action); } @@ -216,7 +215,6 @@ void SegmentedControl::drawSelectedButton (QPainter *painter, painter->fillRect(0, 0, width, height, QBrush(gradient)); painter->restore(); - painter->setPen(QPen(QColor(0, 0, 0, 232), 1)); paintButton(painter, rect, action); } @@ -228,7 +226,7 @@ void SegmentedControl::paintButton(QPainter *painter, const QRect& rect, const Q const int width = rect.width(); painter->save(); - painter->setPen(borderColor); + painter->setPen(QPen(borderColor, 1.0 / qApp->devicePixelRatio())); #if defined(APP_MAC) | defined(APP_WIN) painter->drawRect(-1, -1, width, height); #else diff --git a/src/segmentedcontrol.h b/src/segmentedcontrol.h index bab83b1..4f3ec85 100644 --- a/src/segmentedcontrol.h +++ b/src/segmentedcontrol.h @@ -62,7 +62,7 @@ private: const QRect& rect, const QAction *action); QAction *hoveredAction(const QPoint& pos) const; - int calculateButtonWidth(void) const; + int calculateButtonWidth() const; class Private; Private *d; diff --git a/src/video.cpp b/src/video.cpp index 03edbda..2a05f07 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -94,21 +94,19 @@ void Video::loadThumbnail() { connect(reply, SIGNAL(data(QByteArray)), SLOT(setThumbnail(QByteArray))); } -void Video::setThumbnail(QByteArray bytes) { +void Video::setThumbnail(const QByteArray &bytes) { loadingThumbnail = false; + qreal ratio = qApp->devicePixelRatio(); m_thumbnail = QPixmap(); m_thumbnail.loadFromData(bytes); - if (m_thumbnail.width() > 160) - m_thumbnail = m_thumbnail.scaledToWidth(160, Qt::SmoothTransformation); + m_thumbnail.setDevicePixelRatio(ratio); + const int thumbWidth = 160 * ratio; + if (m_thumbnail.width() > thumbWidth) + m_thumbnail = m_thumbnail.scaledToWidth(thumbWidth, Qt::SmoothTransformation); + qDebug() << __PRETTY_FUNCTION__ << m_thumbnail.size(); emit gotThumbnail(); } -void Video::loadMediumThumbnail() { - if (m_mediumThumbnailUrl.isEmpty()) return; - QObject *reply = The::http()->get(m_mediumThumbnailUrl); - connect(reply, SIGNAL(data(QByteArray)), SIGNAL(gotMediumThumbnail(QByteArray))); -} - void Video::loadStreamUrl() { if (loadingStreamUrl) { qDebug() << "Already loading stream URL for" << this->title(); @@ -156,8 +154,8 @@ void Video::getVideoInfo() { // see you in gotVideoInfo... } -void Video::gotVideoInfo(QByteArray data) { - QString videoInfo = QString::fromUtf8(data); +void Video::gotVideoInfo(const QByteArray &bytes) { + QString videoInfo = QString::fromUtf8(bytes); // qDebug() << "videoInfo" << videoInfo; // get video token @@ -292,8 +290,8 @@ void Video::errorVideoInfo(QNetworkReply *reply) { emit errorStreamUrl(tr("Network error: %1 for %2").arg(reply->errorString(), reply->url().toString())); } -void Video::scrapeWebPage(QByteArray data) { - QString html = QString::fromUtf8(data); +void Video::scrapeWebPage(const QByteArray &bytes) { + QString html = QString::fromUtf8(bytes); QRegExp ageGateRE(JsFunctions::instance()->ageGateRE()); if (ageGateRE.indexIn(html) != -1) { @@ -347,7 +345,7 @@ void Video::scrapeWebPage(QByteArray data) { } } -void Video::parseJsPlayer(QByteArray bytes) { +void Video::parseJsPlayer(const QByteArray &bytes) { QString js = QString::fromUtf8(bytes); // qWarning() << "jsPlayer" << js; @@ -393,7 +391,7 @@ void Video::parseJsPlayer(QByteArray bytes) { parseFmtUrlMap(fmtUrlMap, true); } -void Video::parseDashManifest(QByteArray bytes) { +void Video::parseDashManifest(const QByteArray &bytes) { QFile file(Temporary::filename() + ".mpd"); if (!file.open(QIODevice::WriteOnly)) qWarning() << file.errorString() << file.fileName(); diff --git a/src/video.h b/src/video.h index d502cb2..f612d90 100644 --- a/src/video.h +++ b/src/video.h @@ -42,65 +42,68 @@ public: LicenseCC }; - const QString & title() const { return m_title; } - void setTitle(const QString &title) { m_title = title; } + const QString &title() const { return m_title; } + void setTitle(const QString &value) { m_title = value; } - const QString & description() const { return m_description; } - void setDescription(const QString &description) { m_description = description; } + const QString &description() const { return m_description; } + void setDescription(const QString &value) { m_description = value; } - const QString & channelTitle() const { return m_channelTitle; } + const QString &channelTitle() const { return m_channelTitle; } void setChannelTitle(const QString &value) { m_channelTitle = value; } - const QString & channelId() const { return m_channelId; } + const QString &channelId() const { return m_channelId; } void setChannelId(const QString &value ) { m_channelId = value; } - const QString & webpage(); + const QString &webpage(); void setWebpage(const QString &value); void loadThumbnail(); - const QPixmap & thumbnail() const { return m_thumbnail; } + const QPixmap &thumbnail() const { return m_thumbnail; } - const QString & thumbnailUrl() { return m_thumbnailUrl; } - void setThumbnailUrl(const QString &url) { m_thumbnailUrl = url; } + const QString &thumbnailUrl() { return m_thumbnailUrl; } + void setThumbnailUrl(const QString &value) { m_thumbnailUrl = value; } - void loadMediumThumbnail(); - const QString & mediumThumbnailUrl() { return m_mediumThumbnailUrl; } - void setMediumThumbnailUrl(const QString &url) { m_mediumThumbnailUrl = url; } + const QString &mediumThumbnailUrl() { return m_mediumThumbnailUrl; } + void setMediumThumbnailUrl(const QString &value) { m_mediumThumbnailUrl = value; } + + const QString &largeThumbnailUrl() { return m_largeThumbnailUrl; } + void setLargeThumbnailUrl(const QString &value) { m_largeThumbnailUrl = value; } int duration() const { return m_duration; } - void setDuration( int duration ) { m_duration = duration; } + void setDuration(int value) { m_duration = value; } QString formattedDuration() const; int viewCount() const { return m_viewCount; } - void setViewCount( int viewCount ) { m_viewCount = viewCount; } + void setViewCount(int viewCount) { m_viewCount = viewCount; } - const QDateTime & published() const { return m_published; } - void setPublished(const QDateTime &published ) { m_published = published; } + const QDateTime &published() const { return m_published; } + void setPublished(const QDateTime &value) { m_published = value; } int getDefinitionCode() const { return definitionCode; } void loadStreamUrl(); - const QUrl & getStreamUrl() { return m_streamUrl; } + const QUrl &getStreamUrl() { return m_streamUrl; } void setId(const QString &value) { videoId = value; } - const QString & id() const { return videoId; } + const QString &id() const { return videoId; } - void setLicense(License license) { m_license = license; } + void setLicense(License value) { m_license = value; } License license() const { return m_license; } signals: void gotThumbnail(); - void gotMediumThumbnail(QByteArray bytes); - void gotStreamUrl(QUrl streamUrl); - void errorStreamUrl(QString message); + void gotMediumThumbnail(const QByteArray &bytes); + void gotLargeThumbnail(const QByteArray &bytes); + void gotStreamUrl(const QUrl &streamUrl); + void errorStreamUrl(const QString &message); private slots: - void setThumbnail(QByteArray bytes); - void gotVideoInfo(QByteArray); - void errorVideoInfo(QNetworkReply*); - void scrapeWebPage(QByteArray); - void parseJsPlayer(QByteArray bytes); - void parseDashManifest(QByteArray bytes); + void setThumbnail(const QByteArray &bytes); + void gotVideoInfo(const QByteArray &bytes); + void errorVideoInfo(QNetworkReply *reply); + void scrapeWebPage(const QByteArray &bytes); + void parseJsPlayer(const QByteArray &bytes); + void parseDashManifest(const QByteArray &bytes); private: void getVideoInfo(); @@ -108,7 +111,7 @@ private: void captureFunction(const QString &name, const QString &js); void captureObject(const QString &name, const QString &js); QString decryptSignature(const QString &s); - void saveDefinitionForUrl(const QString& url, const VideoDefinition& definition); + void saveDefinitionForUrl(const QString &url, const VideoDefinition &definition); QString m_title; QString m_description; @@ -119,6 +122,7 @@ private: QPixmap m_thumbnail; QString m_thumbnailUrl; QString m_mediumThumbnailUrl; + QString m_largeThumbnailUrl; int m_duration; QDateTime m_published; int m_viewCount; diff --git a/src/videosourcewidget.cpp b/src/videosourcewidget.cpp index ccd2a0f..ce1a92f 100644 --- a/src/videosourcewidget.cpp +++ b/src/videosourcewidget.cpp @@ -22,16 +22,21 @@ $END_LICENSE */ #include "videosource.h" #include "video.h" #include "fontutils.h" +#include "iconutils.h" +#include "networkaccess.h" + +namespace The { +NetworkAccess* http(); +} VideoSourceWidget::VideoSourceWidget(VideoSource *videoSource, QWidget *parent) : GridWidget(parent), - videoSource(videoSource) { + videoSource(videoSource), + lastPixelRatio(0) { setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - connect(videoSource, SIGNAL(gotVideos(QList)), - SLOT(previewVideo(QList)), Qt::UniqueConnection); - videoSource->loadVideos(1, 1); + loadPreview(); connect(this, SIGNAL(activated()), SLOT(activate())); } @@ -40,26 +45,38 @@ void VideoSourceWidget::activate() { emit activated(videoSource); } -void VideoSourceWidget::previewVideo(QList videos) { +void VideoSourceWidget::previewVideo(const QList