From 73a6841c0859d4eae8c24e587fd976e4ce47a260 Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 30 May 2025 16:03:59 +0200 Subject: [PATCH] Initial commit --- harbour-labyrinth.desktop | 20 + harbour-labyrinth.pro | 59 + icons/108x108/harbour-labyrinth.png | Bin 0 -> 12199 bytes icons/128x128/harbour-labyrinth.png | Bin 0 -> 14118 bytes icons/256x256/harbour-labyrinth.png | Bin 0 -> 33895 bytes icons/86x86/harbour-labyrinth.png | Bin 0 -> 9176 bytes qml/JSONListModel/JSONGetUpdated.qml | 122 ++ qml/JSONListModel/JSONListModel.qml | 106 ++ qml/JSONListModel/JSONSimple.qml | 27 + qml/No-Image-.png | Bin 0 -> 9628 bytes qml/cover/CoverPage.qml | 73 ++ qml/delegates/ShowDelegate.qml | 425 +++++++ qml/harbour-labyrinth.png | Bin 0 -> 33895 bytes qml/harbour-labyrinth.qml | 62 + qml/js/favorites.js | 218 ++++ qml/js/jsonpath.js | 88 ++ qml/js/themoviedb.js | 1694 ++++++++++++++++++++++++++ qml/pages/About.qml | 84 ++ qml/pages/CastInfoPage.qml | 55 + qml/pages/CastPage.qml | 153 +++ qml/pages/Favorites.qml | 554 +++++++++ qml/pages/InfoPage.qml | 380 ++++++ qml/pages/PopularPage.qml | 73 ++ qml/pages/SearchPage.qml | 82 ++ qml/pages/SeasonNrPage.qml | 195 +++ qml/pages/SeasonsPage.qml | 156 +++ qml/pages/ShowImg.qml | 23 + qml/pages/WebViewer.qml | 58 + rpm/harbour-labyrinth.changes.in | 14 + rpm/harbour-labyrinth.spec | 71 ++ rpm/harbour-labyrinth.yaml | 47 + src/harbour-labyrinth.cpp | 53 + translations/harbour-labyrinth-de.ts | 86 ++ translations/harbour-labyrinth.ts | 86 ++ 34 files changed, 5064 insertions(+) create mode 100644 harbour-labyrinth.desktop create mode 100644 harbour-labyrinth.pro create mode 100644 icons/108x108/harbour-labyrinth.png create mode 100644 icons/128x128/harbour-labyrinth.png create mode 100644 icons/256x256/harbour-labyrinth.png create mode 100644 icons/86x86/harbour-labyrinth.png create mode 100644 qml/JSONListModel/JSONGetUpdated.qml create mode 100644 qml/JSONListModel/JSONListModel.qml create mode 100644 qml/JSONListModel/JSONSimple.qml create mode 100644 qml/No-Image-.png create mode 100644 qml/cover/CoverPage.qml create mode 100644 qml/delegates/ShowDelegate.qml create mode 100644 qml/harbour-labyrinth.png create mode 100644 qml/harbour-labyrinth.qml create mode 100644 qml/js/favorites.js create mode 100644 qml/js/jsonpath.js create mode 100644 qml/js/themoviedb.js create mode 100644 qml/pages/About.qml create mode 100644 qml/pages/CastInfoPage.qml create mode 100644 qml/pages/CastPage.qml create mode 100644 qml/pages/Favorites.qml create mode 100644 qml/pages/InfoPage.qml create mode 100644 qml/pages/PopularPage.qml create mode 100644 qml/pages/SearchPage.qml create mode 100644 qml/pages/SeasonNrPage.qml create mode 100644 qml/pages/SeasonsPage.qml create mode 100644 qml/pages/ShowImg.qml create mode 100644 qml/pages/WebViewer.qml create mode 100644 rpm/harbour-labyrinth.changes.in create mode 100644 rpm/harbour-labyrinth.spec create mode 100644 rpm/harbour-labyrinth.yaml create mode 100644 src/harbour-labyrinth.cpp create mode 100644 translations/harbour-labyrinth-de.ts create mode 100644 translations/harbour-labyrinth.ts diff --git a/harbour-labyrinth.desktop b/harbour-labyrinth.desktop new file mode 100644 index 0000000..4a60e84 --- /dev/null +++ b/harbour-labyrinth.desktop @@ -0,0 +1,20 @@ +[Desktop Entry] +Type=Application +X-Nemo-Application-Type=silica-qt5 +Icon=harbour-labyrinth +Exec=harbour-labyrinth +Name=Labyrinth +# translation example: +# your app name in German locale (de) +# +# Remember to comment out the following line, if you do not want to use +# a different app name in German locale (de). +Name[de]=Labyrinth + +[X-Sailjail] +# Replace with your organization as a reverse domain name +OrganizationName=org.nesnomis +# ApplicationName does not have to be identical to Name +ApplicationName=harbour-labyrinth +# Add the required permissions here +Permissions=WebView;Internet diff --git a/harbour-labyrinth.pro b/harbour-labyrinth.pro new file mode 100644 index 0000000..74cb4b3 --- /dev/null +++ b/harbour-labyrinth.pro @@ -0,0 +1,59 @@ +# NOTICE: +# +# Application name defined in TARGET has a corresponding QML filename. +# If name defined in TARGET is changed, the following needs to be done +# to match new name: +# - corresponding QML filename must be changed +# - desktop icon filename must be changed +# - desktop filename must be changed +# - icon definition filename in desktop file must be changed +# - translation filenames have to be changed + +# The name of your application +TARGET = harbour-labyrinth + +CONFIG += sailfishapp + +# App version +DEFINES += APP_VERSION=\"\\\"$${VERSION}\\\"\" + +SOURCES += src/harbour-labyrinth.cpp + +OTHER_FILES += qml/harbour-labyrinth.qml \ + qml/cover/CoverPage.qml \ + rpm/harbour-labyrinth.changes.in \ + rpm/harbour-labyrinth.spec \ + rpm/harbour-labyrinth.yaml \ + translations/*.ts \ + harbour-labyrinth.desktop + +SAILFISHAPP_ICONS = 86x86 108x108 128x128 256x256 + +# to disable building translations every time, comment out the +# following CONFIG line +CONFIG += sailfishapp_i18n + +# German translation is enabled as an example. If you aren't +# planning to localize your app, remember to comment out the +# following TRANSLATIONS line. And also do not forget to +# modify the localized app name in the the .desktop file. +TRANSLATIONS += translations/harbour-labyrinth-de.ts + +DISTFILES += \ + ../harbour-notes/qml/pages/OpenPage.qml \ + qml/pages/CastInfoPage.qml \ + qml/pages/CastPage.qml \ + qml/pages/Favorites.qml \ + qml/pages/InfoPage.qml \ + qml/pages/PopularPage.qml \ + qml/pages/SearchPage.qml \ + qml/pages/SeasonNrPage.qml \ + qml/pages/SeasonsPage.qml \ + qml/js/jsonpath.js \ + qml/js/favorites.js \ + qml/JSONListModel/JSONSimple.qml \ + qml/JSONListModel/JSONListModel.qml \ + qml/delegates/ShowDelegate.qml \ + qml/JSONListModel/JSONGetUpdated.qml \ + qml/pages/ShowImg.qml \ + qml/pages/WebViewer.qml diff --git a/icons/108x108/harbour-labyrinth.png b/icons/108x108/harbour-labyrinth.png new file mode 100644 index 0000000000000000000000000000000000000000..d1841cc5606d78f01f7cb39070e6ecb13be7f301 GIT binary patch literal 12199 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 literal 0 HcmV?d00001 diff --git a/icons/128x128/harbour-labyrinth.png b/icons/128x128/harbour-labyrinth.png new file mode 100644 index 0000000000000000000000000000000000000000..6eca6bc706c400f84585ef5895d996aa5c1725ab GIT binary patch literal 14118 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 literal 0 HcmV?d00001 diff --git a/icons/256x256/harbour-labyrinth.png b/icons/256x256/harbour-labyrinth.png new file mode 100644 index 0000000000000000000000000000000000000000..25f4b407c0ef4a1c954a495bafa3f9ef81c98a13 GIT binary patch literal 33895 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�{$^DNYhDIxk3LPB#uP5DZF{AGctQ} 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 literal 0 HcmV?d00001 diff --git a/icons/86x86/harbour-labyrinth.png b/icons/86x86/harbour-labyrinth.png new file mode 100644 index 0000000000000000000000000000000000000000..7227539d4b1cd66d668d0702db7317c24349628a GIT binary patch literal 9176 zcmV;}BPZO6P)EIvL1Kk23%OAOJ~3 zK~#9!-JN-yTveI(zt6e1s=B*+Pr9=&Ku919pn(?zQC1N!Q9u-N1o0hSMpSTg#*dDU zGtP^?IExH3qa!FHDubY)fWU|m5J*JUKuAbJ_LU@^ba#5My5~IaA9t

MU%^TW!H5 z1=DOq5HaBo0)Rm<;)SopAQ-~y42VRZXRi^w==?Y6co|qIZx&IPcKn`W#=Zl9<$IoP z25Av7Ckc!*Vony!bU}`ei6UYWVi`O{1VIu4850sQB(A|^&KC>_7(9#!MkFG*iAkHB z|3(q_4JYi=yB_1%wv!{`K5>c&Z!_YZCdi?JnJyxAA*lq!grpL|!y7@|UhHl`^1jla>BUNW8%&bWbxvKd_9lXZMh!V_N(Oe z;#VF#);V_#@U%lO2T)b4Dyj}poGMNOAbt;A^g8^^p(su*iW1*Laj25qBfUO6OL4gP ze#t!))M0VaJ+fm4DDF>_V;|jiKku4&4i9g;cU(?#S4JEH077YPPqB$1gSCehO2 z?{r&>NWx)R&NbpCqNAE6APJ|Z930B z=m_s`5{?!z35l{hCFN+T6o$$3X!6W&8e#9<_!IKRaQ3u|d0^A+rx}$WAaV{s&g7}D zuP0xd!?QkRTdLTK#M?C9x@5L%O#JNj%@CwQYfHRgRFx)$f&M_W{vblR5U%v5k-2crb*uBd5lNz}5wqJ1kly_sDO}IR^R9<&c z@bmRIllN+Q-_(n^d&7^;03HPLu_m?11vpe{bTk=N`guRmM*o zN3o`esEM{a(bjc|8K#leHxQkTL`CHecL*Yohn@empYq;>tk02@);zwSEcjoW!gj~6wg)=YXuJt#c=2UMt zBKg?Bc9Gdq9x7MWrCWa2#r4nL%%amD<%55*kW)@LjXK-NU}+F14iUkrO^EB%MK-9x zsl!M}I?<3z9S)-*rXU)AW+c_>C^)fr_>mgsCw)ymuW+*P0F$JgA&&Q+ZdRG;g`UpSAm-+ms>xnZ`mW|XMBb{Tuynr~B(nw%AP zvmhT$eQ+=FjsWsrp6vshx$(Lm@a%uBW~e(D^`3Q;@_gv4@8v^hf0X9h7Q~qf`7xY+)~QTAsh!S&4tB2V z1UvG+3&o+@{lBB?@Cp3N+WM9pU<>hRSe2d5IGiPw= zr!V3iZ#$8ip+<)6Kn5obO|MEU)~nR?B8VD_`3AbZT|Dr}z1;LKKVjA4^|=1gHOp}q z%;vLSxQf%}o=wp-64;;u?~QDT3e!!Zh=gQti-Q&gKV0>#aXFKFMvzH~IW!zx7B93E zGxlU`2Ic$$yGmQQ=Z^ch`}#!;Y#m)ZyIKR1(^p7VZjlhmS`Lg zk9@t)lC=->oojDo@z0-!-q9!Aeq1A;{mPYG^xjKop`EfT4>Re&H-0+0cz768;z)%g z@9&Gaql$tHt~%!nik^#vn_fkuiJ1h<7-kt&cuCe-8oXxaAA2mvEto?`c{_VHcN6rF zgy>v9tXZ;|MfX0;U~3oCrcI@x(1b>?U=~n`K^J2@#1l5{UCTdz_gen(%5Ss&@$FEm zKA)B;4V?FtGx(2h{X1vPdp}-~C(v>#W=H`U7hw{qcb;{HGxOeu>s$5RTULGRSP{7g zWWw;(^o*B@L8Y)@78i&O_&7q4^K&>a;PGc3;b;GO4=>%nxvKn)VWA`5GnEg2>I0m6 z%0ddIdP=sGjP2o3o3CT1-OQc8yo)=&^9!~QP;_bFHpX zJKR=;v>1+h&rB}=n@c!;`n%AQ;2EECZjeRK+{aB{`!Ci$ zwFTEVx{#ZB+GIZS_5Z_Jb3Q<=DPpayurOlp3?$v+nW%5#O3O&%#`g$yi@$%4y=mn) z=Yu?*hBY#PG-iZS5y^6ECM=R6IFLkD4MJ_c$i|^n{Oo&o^WaU7F|ciP`CHTG^MTKu z$)8>NQF?lM_}+hfpGR+gmY{cZcyH`c4P5&94|B;ym(p6ANXZRVD#R>tBhDrB?4Afh zR&RI_RvXSK3&8ZxIDeUi)1Sa`X0*{gGv1T>;Oqz zi;zow<0GD+;;;nRvc=Op>IW=&;dk76?JrpWyB+90A|%s}A4kvbe)g;xoy)zv;rNfw z=95=l!Ew{yi7i<)rxg4G1*st?HKI0oMKFd6A5E-u?iCK@e`REa&FAACW3mr z3fH%SV{cgTjTuJd<&*=nD`gTHlqIeog*0NK8{?7p3*b8jy8?O^Bj4!XDYvTN%e zc6IEeYj-!@yL#yB8o-t<-JAO9*)kBtvR(sf?+Ig%Y@~i{9r=P!Lu&&~ZS{;D)5e6c z6PYk=9PLxvm_B71hcwQj=$cR~1U3l$yiEQ9!{#bT2;h(gGLv0d5rX$ptl&G#zs8kw z{tiWNQO!h5#DW?SMbts$!zU}Jiq!z$%i(#UFTbO2J1@TcJkLI~oQ;p~qQ7H+!NEaF z{Q-7RiQa{aO|bM?Hh^PS~?e~RGUDI%?D0FDYFJv>82 zF!;t}An0fLisd}M==UtU|7CjD2fUSz=HqglaqcOcxA23Ubi}C?B?MuT5P8Ox9Ui=l zL+@EJ;$`w4_>UL=?k^4AKZ@YTnlRl4CW)A)GSuMbJ)U{~N$$JxVOBl53D?70`pA!m zlNX-A6`#JG(`TQHE0fyI8RB}zi|mI8vW&2ctn=iBME%=lRX&d}D>REMjq><)ysZod zzYgxX=N^9axqEr#`A)RNTmG=Uu>P4X{Q7|hsh?#y_Q(^^vPRf%26fYHWH}AkCovz1 zqO_{oqPRm?rd;?by3vkbn5(bu4<}K1?nJ z;#F;;Ae_2{zz&B^BF*9Z{&ma#MjV_3Ob^4tLFf#qqSy#E@?Gi%@JSP^_<~uBJ#`Qw{YkMH*V_DAX0GZOBv8SfHjMPqDs8F<(z1UyBLD zwOAWaDwpUh_0iYY$I#vqgFQp^bq&(j)lW}nAAMZ|4D|NX*WX89e?J4A0d8-^FdAjj z>_>t2Z64sp@7~D#e>#DB(-bN*z^RRrJHV>N;4tDx89E+Lz@Ye|h{KKpsf)uRiRO18 z5)#-&rijC_X7yUOJlC;b+^p%4S|(4O!jz-inR(dZ96IH2CQY13+k`g8Hnr2-&_Yp) z{6Vm%Y)PUG}B=W^;<-{r~$Utr*sDvUA& zPdvStfe-akYwAO9D>B1eL>m(&l30x*yW&M60vZ%OI!@QoB;`g?wPCiOI*8J5diuKA z@`pX6B2%Bg;R>#J#}~*^6Uj5p-1Copq$x+LjvRSDe(Y!Y+_x_uRr);p#Pf9bbcME& zX4QG5v@$SVsLVp-%vg2#M8hR%l2NWy=3$&Vawf;i8&{4RKbm#!ME?4Mzu!OW{D~b` zE&LLb-qloHi7kbfJC|ed6HCCVCCi8|BCf;XTu4KsYTpwEisQty%0#l5s7@VzKF8{% z>qmXS^UuG4X4(=t^Hw-im3DtJ3l_d_)N>ZEdWf1_ZJOApigPZ_vDGk-Hzlsa05eq6 z1m9S$ro`1GnOE~=wm;KZ9X}lhC!ToXTh3;UMbycsoD411&w261<>YdH1=B_QI8BO9 zG8seSnpo(Pxxi)QNW3ZrL$}>c_r`(hv7~Wr%$YIwE$bA_n{^az?bXG>rls2nq=a*! zgWw3cHWZ&Wbs#c?Hj37}$Y@q;hiBXsq5GSpq&%$j_}1SZI|QAKMU{S35B zf6z-`u$Lh_n1n!HuOl8uQOd4F*_D#e_^9J3Oer45xT)<`Kki;L$Sb-jdj6ES;Z9G* zKx}#`im&RMXOpw2{N*?N}YeMUfDffeqtmNz8~o(5xEjwb)g2>hQ$F zV)5`$6~qYrdk3(k>Jy(hZer-W4nwPr7*=#X!;e?}8$0^9hUSTAyk4M&2RGfx8B;#M z2M@g*R9;oFg%QKcdtc;-EB}R8dbeV=9LAs{_tlpi<7y{z(X3A~ujRNA#Puad^Q8K! z_bv}O_U!GzD|%qTYJiH5rzXl@BMeZQ&>vI4SmLS_hf^DIoMNL$W+-nR80gv4i!D{3 z^n`H}N1B2nys-NZT>rvX*wVKSD?vikFsuw}90RtGJ67Mwf3CQOvKu<+Y-%Hhr*=Kc zKRk6M8}`0TASKjfl#D24N^I(1$GM<{R53!FP2SSjTJ`?HP(XJ_7iwH4tv<-q z>1ZfQT?)*YSO~{HZ(0Koc@r9y2^po_8&H**1ezL}Dtvq+hHZTt_~EL5p{Lx9G2T9L zg}R!09@~09cW?L+R)d2g>asmga^s4xhp3Y0@AKS2H^9xSzQu~J=SIlf=1~ai0vH@D zfsn{kh&WeM956LmZI=m!t;+~wm)2Ir#;__P%HZDWic9iP*HBmCxd&>wf74Id+P9IM zmp>qT()V*b{>rb}(EIWMl2zDS>g0hWa(wLQSD2BLRfYp`ARp zYcV;KKVa??ggrw$d8zZ+3eMP<6}qu^E$jEL#+U=QEDC;s)t$>&)wQf5!MKnwj6zr_ zmjf`8<;sM(@p~>Iy7rowrHPz?(A!FV;5bLsB^80y2x~@g<@UafbeHx-kXR zCm@Qzs=6?%SwmN?DyPZFbn@PEPa?<<))yMEeFwy`s*b*LFZNZq&?3-Ts>BQPxqNjn z#(@n|&oq{+HdBs@Dgos%f`D6NLf<#8LCqAs4U-$O%&k5_MtoNAYLi-ngY(^moGBb& z-hZ0c@G91CgqZSk-l!#oF6+)_eumfj+E8abXi^t8B(6=w!SHyF?u!~Du-5T)ld1KJ zNd?M*9-c9btDAU0y#$OHT5H-4NI4E?SBGO#-612{c$7s5cWnwxWibMcfSEY@5;#{f z@gK2F3kw-Yz}v)*#f^$txYr3$4| z@M<`7>ID?Nh6ubkFvT^ebv}nT%{#!jmol+#I!BLv2kH)-uw`4~HkZ@?ixfwh*QfkJNQ4Q#FDHtY`9LKc2gL9`}3`pqm zRoiOOTLa|*rq&tE3Oti%U}$7i)RqGJOMT35KZ&c4x`xTcLk3=K?wwqI#20BUj2$+P(mzl=YAZg}6>CFqJE|Uw&C)C`t7yMdx1;Q=`l^Z( z7w0X9)|qojTBcQp5y7gGs~O#0?B3f`mCJm|vtZgsnbmX@4{W)e)txUeSRTLuIpZ^~ zbrPpeSin2SpGDrQc~#K|r;e6<8=so<_snjc&u_Q7}b938^?VLJk0jExS zKeb+66@&{q_g0TN8BfU7M2^4uNPr_}3Y<0h zLQWok4x9VduxDr&0<`4YnAR|p8m~6QK1La5$DUWJi<^Q+eRCbw1}UViVRm?k-x!># z3T~Yk(+S|msflEOZ6hABed~)45~5u-Ek0h(5CkJ1tfOmZR?=7HDnV#2jHS6SwnFs0 zUNN#*OV|2EW;Go>f+I&8M-Z$A?AlsA!5~-T(a_vL5Cj#?BjT1;s09%V=AoHQ^SYu4 zg3ZWO$8eb&BV5)7)Hc=N<*Uot9h*C_THdEF&ju!4vaMeKXs!+$BUCVMpBTjeJz+U$ zHNw_=wC5*K)>4!|kg)<1n(1DLeGXuC*D_2TT5z~bB3xzg+u?B5(a>BZSFA2)x4pQF z9y(vwhBa^6A+X(UV%vtD)otqu1zP-eg2*bc!z`)j^~yOd^B-B>`3y6g=aD!F8OleP zK~T{vrR)OgiwzXpsv|&K)^B4?_X^&MbOl(ob_E?B)vG95XBMf`rnH?^1mb9=n7b5U zPRsl#n3!M%njtRHkIfL*;stqH4=+|7ylY!O&piFiTQ*Aj)bF1r*irqnLyw-uP-!qK zv9A<0k#hdtoYwhkUflC^YDr`r07nMoPC^bb&<#TaWhNX`9c5<_?)%NX1PrCcA8&!f zh+%+U?tS=|qn>lryrbwJ>`%ej#Pf>fx4i*iZtJn>ebcr~nY@BHc_VQa!oP!ZnaM{^ z81(^ubH}4RwPo>JP8{6v)GaLidG!n*(++dT&!^-Dhqbv%^v|_{>e8hhODeC6PmHnH zEF6}$wbMjsH;-wgX+~{zcX0!J{wr6rY3SvB$MOH@x=NDgdvw!(^VO@r2BW0P&Ny*A zO?AzQ>ly|F5-erAs@{2A`#bG1V=J?OOp4ZIh#QH4^ky-VW2q_BGWl&|Mt$ht|L8>) zTy!=+Uv@JC^d=K9nSzlw({hLl=_dgOU9P8Y@V(-*wT9#=+o9Z%EbBD+`bqyDHDp1ox)&))J+n6c20MJV<(Pb z!k7t+ZEdHqv5|(RMv8?Zb@_T~{8|crff}!loR>=~&g0z`*b+l_h(S9*IT&KFJitJ? zpTS^|o}M0hy7$ttXE(3x*~X4-JK3?albsto=7t)a&sDK$40ttyUoiM}9)69%t1&XBy||NY%XYJSWiR?CTDWMMV8Z++jyURYX1{$Fvt}Q`r1r_w`9*BM1IkHf zF^4OmeE7`CA9(1&tv{pOziabe1ZN%P zp%MdwgS@hFC);1@VE5`?_HOE9pd+9>P$noj?2w}NjVS^VAN(4RT&+i;$){m*Ep2lf znS5kBhaGk})7uWCskVi>+9ElV53LT>if$QEQgjLA)b~!gaLEH3enM@&jZ-F`wf|UL zjAo^cY%Qon+#3=%PW}qTf(bKX3{juKh~vfK6vTyIO-*erb+tvtwTY{!C9+;fL_dUFV zhoAGv)#RwD%Ts8`Q*5iHv9(BZTNBM~jf`zEE!NsFO;rFjVftlUV61W1 zB2Z$c zLgbyGff58|2Kz%{wwbCld^lk|pY#3}U>{LE^u@n~li*KOG=eF%LJ?Z&WPICM6grcHfgaNiT}2|>Pm&eV$@dSKg6 z5$kc*lnW1d$N1UM2}u<`I4p+HJ>WrA0H7eS2ex{6p7nUZ}fVo;T#A%{&eACts96zhTrU$Qt2uyHYp+Azr^@*u+| z>1hQbnP+kteAz|0tx4i=h>LvH7w@u#hkUH_wx_NG->~4&j~=v)9}#B><);a`5f}E^ zQWMExNkv7{+CvhV8*W<{H8XRd9wL!btQx%^0_Y-&5Z0Y~QJ0DeTp$rEQAt!%nVyO) z)S}`=VZA8LG=3&D!<|Ic+2I#W#3?h_~G!XPC^a@=3OdaI+V zBjhrLVR6QHCioX3v?-USi5^kaUJ~!MnNrdeP)~Pve#^tjGBRAox?Ms)D1C% zu=B8opiz3JOF98-Vo4AyvbZ!yYzAi_+OF}e;+FdktD2x_p%-YPn7u{LiFd7{cYb8XC!YqmW9@f2|IkmoKIYyf550Sz zhGf#=J=4r{$WjhfGd zy}OdMCJlRF$6TeViLVnjT!^zxQh6T5NC7Y5=nzj1Wp~^zFSJa;4lM%KpnC;bspzGb z%)ELHz%8q-$AygD2iPkcR|)?$3|>(jx#juli>$oAp<3Y~m@|%pR*|_O*co`QwD>n3bFdGcsW1cZPM7+g< zc3v_2D_szF8~yVmzxbwL5k9aGxMzRFjpOM_mvs$+#8@my(oWx?;-YUPFi{(iC?5>P zr~z!!vo+4?3R~l+iYo@$O{f>K8g^_`)wPOy5HaPb2i6)99t27XJ%SDyr4P`*nEmBs iH-2~dHE$YG0scSOE*~W|*V`cg0000 y) ? -1 : ((x < y) ? 1 : 0)); + }); + } else { + return array.sort(function(a, b) { + var x = a[res[0]][res[1]]; var y = b[res[0]][res[1]]; + return ((x > y) ? -1 : ((x < y) ? 1 : 0)); + }); + } + } +} diff --git a/qml/JSONListModel/JSONSimple.qml b/qml/JSONListModel/JSONSimple.qml new file mode 100644 index 0000000..9c8bed8 --- /dev/null +++ b/qml/JSONListModel/JSONSimple.qml @@ -0,0 +1,27 @@ +import QtQuick 2.0 + +Item { + property string source: "" + property variant simple + property bool ready: true + + onSourceChanged: { + ready = false + request(source, function (o) { + //console.log(o.responseText); + simple = eval('new Object(' + o.responseText + ')');ready = true; + }); + + } + function request(url, callback) { + var xhr = new XMLHttpRequest(); + xhr.onreadystatechange = (function(myxhr) { + return function() { + if (myxhr.readyState === XMLHttpRequest.DONE && xhr.status == 200) {callback(myxhr);} + } + })(xhr); + xhr.open('get', url, true); + xhr.send(''); + } +} + diff --git a/qml/No-Image-.png b/qml/No-Image-.png new file mode 100644 index 0000000000000000000000000000000000000000..738b2635b8645b908df09934d0bb980a231e7885 GIT binary patch literal 9628 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%0ANF3Mg+_f>ZLx@pMX4!vmMmI$-vjNs+iQDXRL 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 literal 0 HcmV?d00001 diff --git a/qml/cover/CoverPage.qml b/qml/cover/CoverPage.qml new file mode 100644 index 0000000..ec085d9 --- /dev/null +++ b/qml/cover/CoverPage.qml @@ -0,0 +1,73 @@ +/* + Copyright (C) 2013 Jolla Ltd. + Contact: Thomas Perl + All rights reserved. + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Jolla Ltd nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +import QtQuick 2.0 +import Sailfish.Silica 1.0 + +CoverBackground { + Image{ + source: "../harbour-labyrinth.png" + //height: parent.height + //width: parent.width + anchors.fill: parent + anchors.margins: Theme.paddingSmall + fillMode: Image.PreserveAspectCrop + opacity: 0.1 + //anchors.horizontalCenter: parent.horizontalCenter + } + Column { + id: column1 + width: parent.width + anchors.centerIn: parent + spacing: Theme.paddingSmall + + + Label { + font.pixelSize: Theme.fontSizeExtraLarge + font.bold: true + text: "Labyrinth" + anchors.horizontalCenter: parent.horizontalCenter + opacity: 0.7 + + } + Label { + font.pixelSize: Theme.fontSizeExtraSmall + font.bold: false + text: "(version "+ Qt.application.version+")" + anchors.horizontalCenter: parent.horizontalCenter + opacity: 0.7 + + } + + } + + +} + diff --git a/qml/delegates/ShowDelegate.qml b/qml/delegates/ShowDelegate.qml new file mode 100644 index 0000000..aad4fc6 --- /dev/null +++ b/qml/delegates/ShowDelegate.qml @@ -0,0 +1,425 @@ +import QtQuick 2.0 +import Sailfish.Silica 1.0 +import "../JSONListModel" + +ListItem { + id: showDelegate + width: ListView.view.width + contentHeight: showImg.height + showName.height + (Theme.paddingLarge * 4) + + property bool favorite: getFav(model.id) + property string prev: "" + property string next: "" + property string nextse: "" + property string genretext: "" + + ListModel{id: sgenres} + + function getArrary(ent, model) { + if (ent) { + console.log("LEN: "+ent.count) + for (var i = 0; i < ent.count; i ++) { + console.log(ent.get(i)) + model.append(ent.get(i)) + } + } + } + + JSONSimple { + id: nextshow + onReadyChanged: { + if (ready) { + simple.airdate ? next = simple.airdate : next = "?" + next !== "" ? nextse = "S"+simple.season+"E"+simple.number : nextse = "" + } + } + } + + JSONSimple { + id: prevshow + onReadyChanged: { + if (ready) { + simple.airdate ? prev = simple.airdate : prev = "?" + if (model._links.nextepisode) { + nextshow.source = model._links.nextepisode.href + } else { + next = "?" + nextse = "" + } + } + } + } + + RemorseItem { + id: remorse + wrapMode: Text.WordWrap + } + + function showRemorseItem() { + var idx = index + remorseAction( "Removing "+name+" from favorites!", function() {delFav(model.id);favorite = false}) + } + + OpacityRampEffect { + sourceItem: showRect + direction: OpacityRamp.TopToBottom + offset: 0.0 + slope: 1.0 + } + + Rectangle { + id: showRect + anchors.left: parent.left + anchors.right: parent.right + width: parent.width + height: showName.height + Theme.paddingLarge + color: Theme.rgba(Theme.highlightBackgroundColor, Theme.highlightBackgroundOpacity) + } + + Image { + id: nextIcon + anchors.verticalCenter: showRect.verticalCenter + anchors.right: showRect.right + anchors.rightMargin: Theme.paddingMedium + source: "image://theme/icon-m-right" + } + + Image { + id: seenIcon + visible: false + anchors.right: parent.right + anchors.bottom: showImg.bottom + anchors.rightMargin: Theme.paddingMedium + source: "image://theme/icon-m-acknowledge" + } + + Text { + id: showName + text: model.name !== null ? model.name : "" + color: highlighted ? Theme.highlightColor : Theme.primaryColor + anchors.leftMargin: Theme.paddingMedium + anchors.rightMargin: Theme.paddingMedium + anchors.left: parent.left + anchors.right: nextIcon.left + anchors.verticalCenter: showRect.verticalCenter + wrapMode: Text.ElideRight + font.pixelSize: Theme.fontSizeLarge + maximumLineCount: 1 + } + + Component.onCompleted: { + // console.log("COMPLETED") + //sgenres.clear() + // getArrary(model.genres,sgenres) + //blahh = model.get(0).genres + //console.log("GENRES: "+blahh.get(1)) + if (model._links.previousepisode) { + prevshow.source = model._links.previousepisode.href + } else { + prev = ""; + next = ""; + nextse = "" + } + //sgenres = model.genres + //console.log("GENRE: "+sgenres.get(0)[0]) + //var temp = [] //model.genres.count + //temp = model.genres + //var genretext = "" + //console.log("LOG: "+ genres.get(1).modelData) + //var genre = temp.split(",") + // for(var i = 0; i < model.genres.count; i++) { + //fruitModel.get(0).attributes.get(1).value + //genretext = genretext + "|" + model.genres.get(i) //model.genres.sublist(i) + + + // } + //return genretext + + } + + Image { + id: showImg + anchors.top: showRect.bottom + anchors.margins: Theme.paddingLarge + anchors.left: parent.left + fillMode: Image.PreserveAspectFit + source: model.image ? model.image.medium : "../No-Image-.png" + width: height * 0.8 +// height: (showName.height + showStatus.height + showPrem.height + showRating.height + showNext.height + showPrev.height + Theme.paddingMedium) * showImg.scale + height: (showName.height + showS.height + showP.height + showR.height + showN.height + showPr.height + Theme.paddingLarge) * showImg.scale + scale: 1.1 + + BusyIndicator { + id: imgBysy + running: showImg.progress !== 1.0 + size: BusyIndicatorSize.Large + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + } + } + + Image { + id: favIcon + //visible: false + anchors.right: parent.right + anchors.top: showImg.top + //anchors.verticalCenter: showStatus.verticalCenter + height: showStatus.height + (showStatus.height/2) + width: height + anchors.rightMargin: Theme.paddingMedium + source: favorite ? "image://theme/icon-m-favorite-selected" : "image://theme/icon-m-favorite" + MouseArea { + anchors.fill: favIcon + onClicked: if (getFav(model.id)) {showRemorseItem()} else { + console.log("ID: "+model.id) + var network + model.webChannel ? network = model.webChannel.name : network = model.network.name + addFav(model.id, model.name, showImg.source, model.summary, model.status, model.premiered, model.rating.average, network, model.updated, prev, next, nextse, model.externals.imdb); + reloadFav() + favorite=true + } + } + BusyIndicator { + id: addBusy + running: false + size: BusyIndicatorSize.Medium + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + } + } + + Text { + id: showS + text: "Status:" + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.WordWrap + anchors.topMargin: Theme.paddingMedium + anchors.bottom: showP.top + anchors.left: showImg.right + //anchors.right: parent.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + } + + Text { + id: showStatus + text: model.status !== null ? model.status : "" + //color: highlighted ? Theme.highlightColor : Theme.primaryColor + color: {//highlighted ? Theme.highlightColor : running && f_next !== "?" ? Theme.primaryColor : ended ? Theme.errorColor : Theme.secondaryColor + if (highlighted) Theme.highlightColor; + else if (model.status === "Ended") Theme.errorColor; + else if (model.status === "Running" && next !== "?") Theme.highlightColor + else if (model.status === "Running" && next === "?") Theme.primaryColor + else Theme.secondaryColor + } + wrapMode: Text.WordWrap + anchors.topMargin: Theme.paddingMedium + anchors.bottom: showP.top + //anchors.left: showImg.right + anchors.left: showS.right + anchors.right: parent.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + font.bold: true + } + + Text { + id: showP + text: "Premiered:" + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.WordWrap + anchors.bottom: showR.top + anchors.left: showImg.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + } + + Text { + id: showPrem + text: model.premiered !== null ? model.premiered : "" + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.WordWrap + anchors.bottom: showR.top + anchors.left: showP.right + anchors.right: parent.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + font.bold: true + } + +/* Text { + id: showPrem + text: model.premiered !== null ? "Premiered: " + model.premiered + "" : "" + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.WordWrap + anchors.top: showStatus.bottom + anchors.left: showImg.right + anchors.right: parent.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + } +*/ + + Text { + id: showR + text: "Average rating:" + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.WordWrap + anchors.bottom: showN.top + anchors.left: showImg.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + } + + Text { + id: showRating + text: model.rating.average ? model.rating.average : "?" + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.WordWrap + anchors.bottom: showN.top + anchors.left: showR.right + anchors.right: parent.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + font.bold: true + } +/* + Text { + id: showRating + text: model.rating.average ? "Average rating: " + model.rating.average + "" : "Average rating: ?" + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.WordWrap + anchors.top: showPrem.bottom + anchors.left: showImg.right + anchors.right: parent.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + } +*/ + Text { + id: showN + text: "Network:" + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.ElideRight + maximumLineCount: 1 + anchors.bottom: showPr.top + anchors.left: showImg.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + } + + Text { + id: showNetwork + text: model.webChannel ? model.webChannel.name : model.network.name + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.ElideRight + maximumLineCount: 1 + anchors.bottom: showPr.top + anchors.left: showN.right + anchors.right: parent.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + font.bold: true + } +/* + Text { + id: showNetwork + text: model.webChannel ? "Network: " + model.webChannel.name + "" : "Network: " + model.network.name + "" + //enabled: model.network.name ? true : false + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.ElideRight + maximumLineCount: 1 + anchors.top: showRating.bottom + anchors.left: showImg.right + anchors.right: parent.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + } +*/ + Text { + id: showPr + text: "Previous:" + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.ElideRight + maximumLineCount: 1 + anchors.bottom: showNe.top + anchors.left: showImg.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + } + + Text { + id: showPrev + text: prev + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.ElideRight + maximumLineCount: 1 + anchors.bottom: showNe.top + anchors.left: showPr.right + anchors.right: parent.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + font.bold: prev !== "Unknown" ? true : false + } + + Text { + id: showNe + text: nextse !== "" ? "Next: ("+nextse+")" : "Next: " + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.ElideRight + maximumLineCount: 1 + anchors.bottom: showImg.bottom + anchors.bottomMargin: Theme.paddingSmall + anchors.left: showImg.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + } + + Text { + id: showNext + text: next + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.ElideRight + maximumLineCount: 1 + anchors.bottom: showImg.bottom + anchors.bottomMargin: Theme.paddingSmall + anchors.left: showNe.right + anchors.right: parent.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + font.bold: next !== "Unknown" ? true : false + } + + /* Text { + id: showGenre + text: ""//sgenres.get(1)[0]//genre() //model.network ? "Network: " + model.network.name + "" : "Network:" + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.ElideRight + maximumLineCount: 1 + anchors.top: showImg.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + } */ + + onPressAndHold: { + pageStack.push(Qt.resolvedUrl("../pages/ShowImg.qml"),{"img": model.image ? model.image.medium : "../No-Image-.png"}) + //pageStack.push(Qt.resolvedUrl("SeasonsPage.qml"),{"showid": model.id,"showname": model.name,"showimage": showImg.source} ) + } + + onClicked: { + //frompage === undefined ? + var network + model.webChannel ? network = model.webChannel.name : network = model.network.name + pageStack.push(Qt.resolvedUrl("../pages/InfoPage.qml"), + {"showid": model.id,"showname": model.name, "showimage": showImg.source, "summary": model.summary, "showstatus": model.status, "showprem": model.premiered, "showrating": model.rating.average, "shownetwork": network, "showupdated": model.updated, "showprev": model.previousepisode, "shownext": model.nextepisode, "simdb": model.externals.imdb, "sofficial": model.officialSite}) + + + //: + //pageStack.pop(frompage,PageStackAction.Immediate) + //frompage = undefined + //pageStack.push(Qt.resolvedUrl("../pages/InfoPage.qml"),{"showid": model.id,"showname": model.name, "showimage": showImg.source, "summary": model.summary, "showstatus": model.status, "showprem": model.premiered, "showrating": model.rating.average, "shownetwork": model.network.name, "showupdated": model.updated, "showprev": model.previousepisode, "shownext": model.nextepisode})//pageStack.clear();pageStack.push(Qt.resolvedUrl("SearchPage.qml")),{}; + } +} + diff --git a/qml/harbour-labyrinth.png b/qml/harbour-labyrinth.png new file mode 100644 index 0000000000000000000000000000000000000000..25f4b407c0ef4a1c954a495bafa3f9ef81c98a13 GIT binary patch literal 33895 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�{$^DNYhDIxk3LPB#uP5DZF{AGctQ} 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 literal 0 HcmV?d00001 diff --git a/qml/harbour-labyrinth.qml b/qml/harbour-labyrinth.qml new file mode 100644 index 0000000..0fbc6c3 --- /dev/null +++ b/qml/harbour-labyrinth.qml @@ -0,0 +1,62 @@ +import QtQuick 2.0 +import Sailfish.Silica 1.0 +import QtQuick.LocalStorage 2.0 + +import "JSONListModel" +import "pages" +import "js/favorites.js" as FavDb + +ApplicationWindow { + id: window + + + ListModel{id: favorites} + + function updateFav(showid, name, image, summary, status, prem, rating, network, updated, imdb, official) { + FavDb.update(showid, name, image, summary, status, prem, rating, network, updated, imdb, official) + } + + // DETTA SKA GÖRAS BÅDE VID UPPDATERING OCH LÄGGA TILL!!! + function updateNext(showid, next, nextse) { + FavDb.updateNext(showid, next, nextse) + } + + function updatePrev(showid, previous) { + FavDb.updatePrev(showid, previous) + } + // ------------------------------------------------------ + + function dropFav() { + FavDb.drop() + FavDb.initialize() + FavDb.load(favorites) + } + + function getFav(showid) { + return FavDb.getFav(showid) + } + + function reloadFav() { + FavDb.load(favorites) + } + + function addFav(showid, name, image, summary, status, prem, rating, network, updated, previous, next, nextse, imdb, official) { + FavDb.add(showid, name, image, summary, status, prem, rating, network, updated, previous, next, nextse,imdb,official) + } + + function delFav(showid) { + FavDb.del(showid) + } + + Component.onCompleted: { + FavDb.initialize() + FavDb.load(favorites) + } + + initialPage: Component { Favorites { } } + cover: Qt.resolvedUrl("cover/CoverPage.qml") + allowedOrientations: defaultAllowedOrientations//| Orientation.Landscape + +} + + diff --git a/qml/js/favorites.js b/qml/js/favorites.js new file mode 100644 index 0000000..04e4058 --- /dev/null +++ b/qml/js/favorites.js @@ -0,0 +1,218 @@ +// Database should be updated to contain location and section. + +var db = undefined; +function settings_db_open() { + if (db == undefined) + db = LocalStorage.openDatabaseSync("harbour-labyrinth-test1", "1.0", "StorageDatabase", 100000); + + /* db.transaction(function(tx) + { + tx.executeSql("DROP TABLE IF EXISTS favorites"); + }); */ + + + // drop() + /* property string showname + + property string showimage: "" + property string summary: "" + property string showid: "" + + property string showstatus: "" + property string showprem: "" + property string showrating: "" + property string shownetwork: "" */ + + return db; +} + +/* +showName.text = simple.name +showStatus.text = simple.status +showPrem.text = simple.premiered +showRating.text = simple.rating.average +showNetwork.text = simple.network.name +ssummary = simple.summary +imdb = simple.externals.imdb +*/ + +function initialize() { // klar + db = settings_db_open(); + db.transaction( + function(tx) { + + // tx.executeSql('ALTER TABLE favorites ADD seen INTEGER'); + tx.executeSql('CREATE TABLE IF NOT EXISTS favorites(showid INTEGER UNIQUE, name TEXT, image TEXT, summary TEXT, status TEXT, premiered TEXT, rating TEXT, network TEXT, updated INTEGER, previous TEXT, next TEXT,nextse TEXT, imdb TEXT, official TEXT, seen INTEGER)'); + tx.executeSql('CREATE TABLE IF NOT EXISTS seen(showid INTEGER UNIQUE, season INTEGER, episode INTEGER)'); + // tx.executeSql('CREATE TABLE IF NOT EXISTS next(showid INTEGER UNIQUE, next TEXT)'); + // tx.executeSql('CREATE TABLE IF NOT EXISTS previous(showid INTEGER UNIQUE, prev TEXT)'); + }); + +} +/* +function getCount(){ + db.transaction(function(tx) + { + var rs = tx.executeSql('SELECT * FROM favorites'); + dbcount = rs.rows.length + }) +} +*/ + +function getFavByNr(shids,nr) // klar +{ + db.transaction(function(tx) + { + var rs = tx.executeSql('SELECT * FROM favorites'); + // var shids = new Array(); + // var shids = [] + // var shid = "" + // var shupdated = "" + shids.push(rs.rows.item(nr).showid) + shids.push(rs.rows.item(nr).updated) + // shids = [rs.rows.item(nr).showid,rs.rows.item(nr).updated] + // console.log(" --- DB SHIDS; "+shids) + // return shids + }); +} + +function getFav(showid) { + var res = undefined + settings_db_open(); + db.transaction(function(tx) { + + res = tx.executeSql("SELECT * FROM favorites WHERE showid like ('"+ showid + "')");}) + try { + if (typeof res.rows.item(0).showid === 'number') + return true + } catch(a) { + return false + }} + +function getFav_(showid) { + settings_db_open(); + db.transaction(function(tx) + { + try { + tx.executeSql("SELECT * FROM favorites WHERE showid='"+showid+"'"); + console.log("SUCCESS") + } catch(a) { + console.log("ERROR") + } + + + + + // console.log("FAVDB: "+ result.item(0)) + + }); +} + +function loadWakeup(model,showid) // klar +{ + model.clear() + db.transaction(function(tx) + { + var rs = tx.executeSql('SELECT '+showid+' FROM favorites'); + //for(var i = 0; i < rs.rows.length; i++) + //{ model.id, model.name, showImg.source, model.summary, model.status, model.premiered, model.rating, model.network + model.append({"showid" : rs.rows.item(i).showid, "name" : rs.rows.item(i).name,"image" : rs.rows.item(i).image,"summary" : rs.rows.item(i).summary,"status" : rs.rows.item(i).status,"premiered" : rs.rows.item(i).premiered,"rating" : rs.rows.item(i).rating,"network" : rs.rows.item(i).network,"updated" : rs.rows.item(i).updated,"previous" : rs.rows.item(i).previous,"next" : rs.rows.item(i).next, "nextse" : rs.rows.item(i).nextse}) + //} + }); + +} + +function load(model) // klar +{ + model.clear() + db.transaction(function(tx) + { + var rs = tx.executeSql('SELECT * FROM favorites ORDER BY name ASC, next'); + for(var i = 0; i < rs.rows.length; i++) + { + model.append({"showid" : rs.rows.item(i).showid, "name" : rs.rows.item(i).name,"image" : rs.rows.item(i).image,"summary" : rs.rows.item(i).summary,"status" : rs.rows.item(i).status,"premiered" : rs.rows.item(i).premiered,"rating" : rs.rows.item(i).rating,"network" : rs.rows.item(i).network,"updated" : rs.rows.item(i).updated,"prev" : rs.rows.item(i).previous,"next" : rs.rows.item(i).next, "nextse" : rs.rows.item(i).nextse, "imdb" : rs.rows.item(i).imdb, "official" : rs.rows.item(i).official, "seen" : rs.rows.item(i).seen}) + } + }); +} + +// ADD FAVORITE +function add(showid, name, image, summary, status, prem, rating, network, updated, previous, next, nextse, imdb, official) // klar +{ + settings_db_open(); + try { + db.transaction(function(tx) + { + tx.executeSql('INSERT INTO favorites VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?);', [showid, name, image, summary, status, prem, rating, network, updated, previous, next, nextse, imdb, official]) + return true + }); + } + catch(a) + { + console.log("insert failed, probably already exists"); + return false; + } +} + +// -------------------------------------------- + +function update(showid, name, image, summary, status, prem, rating, network, updated, imdb, official) // klar +{ + settings_db_open(); + try { + db.transaction(function(tx) + { + tx.executeSql('UPDATE favorites SET name=?,image=?,summary=?,status=?,premiered=?,rating=?,network=?,updated=?,imdb=?,official=? WHERE showid='+showid+';', + [name, image, summary, status, prem, rating, network, updated, imdb, official]) + return true; + }); + } + catch(a) + { + console.log("insert failed, probably already exists"); + return false; + } +} + +// SKA GÖRAS BÅDE VID ADD OCH UPPDATE +function updateNext(showid, next, nextse) // klar +{ + settings_db_open(); + db.transaction(function(tx) + { + tx.executeSql('UPDATE favorites SET next=?,nextse=? WHERE showid='+showid+';', [next, nextse]) + console.log("*** DB UPDATE NEXT: "+showid+" / "+next) + }); +} + +function updatePrev(showid, prev) // klar +{ + settings_db_open(); + db.transaction(function(tx) + { + tx.executeSql('UPDATE favorites SET previous=? WHERE showid='+showid+';', [prev]) + console.log("*** DB UPDATE PREV: "+showid+" / "+prev) + + }); +} +// ------------------- + +function del(showid) // klar +{ + settings_db_open(); + db.transaction(function(tx) + { + tx.executeSql('DELETE FROM favorites WHERE showid = ?', [showid]) + }); +} + +function drop() // klar +{ + settings_db_open(); + db.transaction(function(tx) + { + tx.executeSql("DROP TABLE IF EXISTS favorites"); + }); +} + + + diff --git a/qml/js/jsonpath.js b/qml/js/jsonpath.js new file mode 100644 index 0000000..8107803 --- /dev/null +++ b/qml/js/jsonpath.js @@ -0,0 +1,88 @@ +/* JSONPath 0.8.5 - XPath for JSON + * + * Copyright (c) 2007 Stefan Goessner (goessner.net) + * Licensed under the MIT (MIT-LICENSE.txt) licence. + * + */ +function jsonPath(obj, expr, arg) { + var P = { + resultType: arg && arg.resultType || "VALUE", + result: [], + normalize: function(expr) { + var subx = []; + return expr.replace(/[\['](\??\(.*?\))[\]']|\['(.*?)'\]/g, function($0,$1,$2){return "[#"+(subx.push($1||$2)-1)+"]";}) /* http://code.google.com/p/jsonpath/issues/detail?id=4 */ + .replace(/'?\.'?|\['?/g, ";") + .replace(/;;;|;;/g, ";..;") + .replace(/;$|'?\]|'$/g, "") + .replace(/#([0-9]+)/g, function($0,$1){return subx[$1];}); + }, + asPath: function(path) { + var x = path.split(";"), p = "$"; + for (var i=1,n=x.length; i 0) { + for (option in myOptions) { + if (myOptions.hasOwnProperty(option) && option !== "id" && option !== "body") { + query = query + "&" + option + "=" + myOptions[option]; + } + } + } + return query; + }, + validateCallbacks: function (callbacks) { + 'use strict'; + if (typeof callbacks[0] !== "function" || typeof callbacks[1] !== "function") { + throw "Success and error parameters must be functions!"; + } + }, + validateRequired: function (args, argsReq, opt, optReq, allOpt) { + 'use strict'; + var i, allOptional; + + allOptional = allOpt || false; + + if (args.length !== argsReq) { + throw "The method requires " + argsReq + " arguments and you are sending " + args.length + "!"; + } + + if (allOptional) { + return; + } + + if (argsReq > 2) { + for (i = 0; i < optReq.length; i = i + 1) { + if (!opt.hasOwnProperty(optReq[i])) { + throw optReq[i] + " is a required parameter and is not present in the options!"; + } + } + } + }, + getImage: function (options) { + 'use strict'; + return theMovieDb.common.images_uri + options.size + "/" + options.file; + }, + client: function (options, success, error) { + 'use strict'; + var method, status, xhr; + + method = options.method || "GET"; + status = options.status || 200; + xhr = new XMLHttpRequest(); + + xhr.ontimeout = function () { + error('{"status_code":408,"status_message":"Request timed out"}'); + }; + + xhr.open(method, theMovieDb.common.base_uri + options.url, true); + + if(options.method === "POST") { + xhr.setRequestHeader("Content-Type", "application/json"); + xhr.setRequestHeader("Accept", "application/json"); + } + + xhr.timeout = theMovieDb.common.timeout; + + xhr.onload = function (e) { + if (xhr.readyState === 4) { + if (xhr.status === status) { + success(xhr.responseText); + } else { + error(xhr.responseText); + } + } else { + error(xhr.responseText); + } + }; + + xhr.onerror = function (e) { + error(xhr.responseText); + }; + if (options.method === "POST") { + xhr.send(JSON.stringify(options.body)); + } else { + xhr.send(null); + } + } +}; + +theMovieDb.configurations = { + getConfiguration: function (success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 2); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "configuration" + theMovieDb.common.generateQuery() + }, + success, + error + ); + } +}; + +theMovieDb.account = { + getInformation: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["session_id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "account" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getLists: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["session_id", "id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "account/" + options.id + "/lists" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getFavoritesMovies: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["session_id", "id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "account/" + options.id + "/favorite_movies" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + addFavorite: function (options, success, error) { + 'use strict'; + var body; + + theMovieDb.common.validateRequired(arguments, 3, options, ["session_id", "id", "movie_id", "favorite"]); + + theMovieDb.common.validateCallbacks([success, error]); + + body = { + "movie_id": options.movie_id, + "favorite": options.favorite + } + + + theMovieDb.common.client( + { + url: "account/" + options.id + "/favorite" + theMovieDb.common.generateQuery(options), + status: 201, + method: "POST", + body: body + }, + success, + error + ); + }, + getRatedMovies: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["session_id", "id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "account/" + options.id + "/rated_movies" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getWatchlist: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["session_id", "id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "account/" + options.id + "/movie_watchlist" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + addMovieToWatchlist: function (options, success, error) { + 'use strict'; + + var body; + + theMovieDb.common.validateRequired(arguments, 3, options, ["session_id", "id", "movie_id", "movie_watchlist"]); + + theMovieDb.common.validateCallbacks([success, error]); + + body = { + "movie_id": options.movie_id, + "movie_watchlist": options.movie_watchlist + } + + theMovieDb.common.client( + { + url: "account/" + options.id + "/movie_watchlist" + theMovieDb.common.generateQuery(options), + method: "POST", + status: 201, + body: body + }, + success, + error + ); + } +}; + +theMovieDb.authentication = { + generateToken: function (success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 2); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "authentication/token/new" + theMovieDb.common.generateQuery() + }, + success, + error + ); + }, + askPermissions: function(options){ + 'use strict'; + + window.open("https://www.themoviedb.org/authenticate/" + options.token + "?redirect_to=" + options.redirect_to); + + }, + validateUser: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["request_token", "username", "password"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "authentication/token/validate_with_login" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + generateSession: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["request_token"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "authentication/session/new" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + generateGuestSession: function (success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 2); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "authentication/guest_session/new" + theMovieDb.common.generateQuery() + }, + success, + error + ); + } +}; + +theMovieDb.certifications = { + getList: function (success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 2); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "certification/movie/list" + theMovieDb.common.generateQuery() + }, + success, + error + ); + } +}; + +theMovieDb.changes = { + getMovieChanges: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, "", "", true); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "movie/changes" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getPersonChanges: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, "", "", true); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "person/changes" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + } +}; + +theMovieDb.collections = { + getCollection: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "collection/" + options.id + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getCollectionImages: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "collection/" + options.id + "/images" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + } + +}; + +theMovieDb.companies = { + getCompany: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "company/" + options.id + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getCompanyMovies: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "company/" + options.id + "/movies" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + } + +}; + +theMovieDb.credits = { + getCredit: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "credit/" + options.id + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + } +}; + +theMovieDb.discover = { + getMovies: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, "", "", true); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "discover/movie" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getTvShows: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, "", "", true); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "discover/tv" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + } + +}; + +theMovieDb.find = { + getById: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id", "external_source"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "find/" + options.id + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + } +}; + +theMovieDb.genres = { + getList: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, "", "", true); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "genre/list" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getMovies: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "genre/" + options.id + "/movies" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + } + +}; + +theMovieDb.jobs = { + getList: function (success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 2); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "job/list" + theMovieDb.common.generateQuery() + }, + success, + error + ); + } +}; + +theMovieDb.keywords = { + getById: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "keyword/" + options.id + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getMovies: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "keyword/" + options.id + "/movies" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + } +}; + +theMovieDb.lists = { + getById: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "list/" + options.id + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getStatusById: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id", "movie_id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "list/" + options.id + "/item_status" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + addList: function (options, success, error) { + 'use strict'; + + var body; + + theMovieDb.common.validateRequired(arguments, 3, options, ["session_id", "name", "description"]); + + theMovieDb.common.validateCallbacks([success, error]); + + body = { + "name": options.name, + "description": options.description + }; + + delete options.name; + delete options.description; + + if(options.hasOwnProperty("language")) { + body["language"] = options.language; + + delete options.language; + } + + theMovieDb.common.client( + { + method: "POST", + status: 201, + url: "list" + theMovieDb.common.generateQuery(options), + body: body + }, + success, + error + ); + }, + addItem: function (options, success, error) { + 'use strict'; + + var body; + + theMovieDb.common.validateRequired(arguments, 3, options, ["session_id", "id", "media_id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + body = { + "media_id": options.media_id + }; + + theMovieDb.common.client( + { + method: "POST", + status: 201, + url: "list/" + options.id + "/add_item" + theMovieDb.common.generateQuery(options), + body: body + }, + success, + error + ); + }, + removeItem: function (options, success, error) { + 'use strict'; + + var body; + + theMovieDb.common.validateRequired(arguments, 3, options, ["session_id", "id", "media_id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + body = { + "media_id": options.media_id + }; + + theMovieDb.common.client( + { + method: "POST", + status: 201, + url: "list/" + options.id + "/remove_item" + theMovieDb.common.generateQuery(options), + body: body + }, + success, + error + ); + }, + removeList: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["session_id", "id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + method: "DELETE", + status: 204, + url: "list/" + options.id + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + clearList: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["session_id", "id", "confirm"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + method: "POST", + status: 204, + body: {}, + url: "list/" + options.id + "/clear" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + } +}; + +theMovieDb.movies = { + getById: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "movie/" + options.id + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getAlternativeTitles: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "movie/" + options.id + "/alternative_titles" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getCredits: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "movie/" + options.id + "/credits" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getImages: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "movie/" + options.id + "/images" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getKeywords: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "movie/" + options.id + "/keywords" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getReleases: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "movie/" + options.id + "/releases" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getTrailers: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "movie/" + options.id + "/trailers" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getVideos: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "movie/" + options.id + "/videos" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getTranslations: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "movie/" + options.id + "/translations" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getSimilarMovies: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "movie/" + options.id + "/similar_movies" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getReviews: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "movie/" + options.id + "/reviews" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getLists: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "movie/" + options.id + "/lists" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getChanges: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "movie/" + options.id + "/changes" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getLatest: function (success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 2); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "movie/latest" + theMovieDb.common.generateQuery() + }, + success, + error + ); + }, + getUpcoming: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, "", "", true); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "movie/upcoming" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getNowPlaying: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, "", "", true); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "movie/now_playing" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getPopular: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, "", "", true); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "movie/popular" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getTopRated: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, "", "", true); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "movie/top_rated" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getStatus: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["session_id", "id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "movie/" + options.id + "/account_states" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + rate: function (options, rate, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 4, options, ["session_id", "id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + method: "POST", + status: 201, + url: "movie/" + options.id + "/rating" + theMovieDb.common.generateQuery(options), + body: { "value": rate } + }, + success, + error + ); + }, + rateGuest: function (options, rate, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 4, options, ["guest_session_id", "id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + method: "POST", + status: 201, + url: "movie/" + options.id + "/rating" + theMovieDb.common.generateQuery(options), + body: { "value": rate } + }, + success, + error + ); + } +}; + +theMovieDb.networks = { + getById: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "network/" + options.id + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + } +}; + +theMovieDb.people = { + getById: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "person/" + options.id + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getMovieCredits: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "person/" + options.id + "/movie_credits" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getTvCredits: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "person/" + options.id + "/tv_credits" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getCredits: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "person/" + options.id + "/combined_credits" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getExternalIds: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "person/" + options.id + "/external_ids" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getImages: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "person/" + options.id + "/images" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getTaggedImages: function(options, sucess, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "person/" + options.id + "/tagged_images" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getChanges: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "person/" + options.id + "/changes" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getPopular: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, "", "", true); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "person/popular" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getLatest: function (success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 2); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "person/latest" + theMovieDb.common.generateQuery() + }, + success, + error + ); + } +}; + +theMovieDb.reviews = { + getById: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "review/" + options.id + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + } +}; + +theMovieDb.search = { + getMovie: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["query"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "search/movie" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getCollection: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["query"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "search/collection" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getTv: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["query"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "search/tv" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getPerson: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["query"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "search/person" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getList: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["query"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "search/list" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getCompany: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["query"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "search/company" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getKeyword: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["query"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "search/keyword" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getMulti: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["query"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "search/multi" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + } +}; + +theMovieDb.timezones = { + getList: function (success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 2); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "timezones/list" + theMovieDb.common.generateQuery() + }, + success, + error + ); + } +}; + +theMovieDb.tv = { + getById: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "tv/" + options.id + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getSimilar: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "tv/" + options.id + "/similar" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getCredits: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "tv/" + options.id + "/credits" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getExternalIds: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "tv/" + options.id + "/external_ids" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getImages: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "tv/" + options.id + "/images" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getTranslations: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "tv/" + options.id + "/translations" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getVideos: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "tv/" + options.id + "/videos" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getOnTheAir: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, "", "", true); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "tv/on_the_air" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getAiringToday: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, "", "", true); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "tv/airing_today" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getTopRated: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, "", "", true); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "tv/top_rated" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getPopular: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, "", "", true); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "tv/popular" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + } +}; + +theMovieDb.tvSeasons = { + getById: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["season_number", "id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "tv/" + options.id + "/season/" + options.season_number + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getCredits: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["season_number", "id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "tv/" + options.id + "/season/" + options.season_number + "/credits" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getExternalIds: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["season_number", "id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "tv/" + options.id + "/season/" + options.season_number + "/external_ids" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getImages: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["season_number", "id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "tv/" + options.id + "/season/" + options.season_number + "/images" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + } +}; + +theMovieDb.tvEpisodes = { + getById: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["episode_number", "season_number", "id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "tv/" + options.id + "/season/" + options.season_number + "/episode/" + options.episode_number + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getCredits: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["episode_number", "season_number", "id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "tv/" + options.id + "/season/" + options.season_number + "/episode/" + options.episode_number + "/credits" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getExternalIds: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["episode_number", "season_number", "id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "tv/" + options.id + "/season/" + options.season_number + "/episode/" + options.episode_number + "/external_ids" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + }, + getImages: function (options, success, error) { + 'use strict'; + + theMovieDb.common.validateRequired(arguments, 3, options, ["episode_number", "season_number", "id"]); + + theMovieDb.common.validateCallbacks([success, error]); + + theMovieDb.common.client( + { + url: "tv/" + options.id + "/season/" + options.season_number + "/episode/" + options.episode_number + "/images" + theMovieDb.common.generateQuery(options) + }, + success, + error + ); + } +}; diff --git a/qml/pages/About.qml b/qml/pages/About.qml new file mode 100644 index 0000000..37bb9b1 --- /dev/null +++ b/qml/pages/About.qml @@ -0,0 +1,84 @@ +import QtQuick 2.0 +import Sailfish.Silica 1.0 +Page { + Flickable { + id: flick + width:parent.width + height: parent.height - Theme.paddingLarge * 3 + anchors.top: parent.top + anchors.topMargin: Theme.paddingLarge * 3 + contentHeight: column1.height + + + + Column { + id: column1 + width: parent.width + spacing: Theme.paddingLarge + Row { + //width: parent.width + anchors.horizontalCenter: parent.horizontalCenter + spacing: Theme.paddingLarge * 2 + Image{ + source: "../harbour-labyrinth.png" + height: Theme.itemSizeExtraLarge + width: height + fillMode: Image.PreserveAspectFit + //anchors.horizontalCenter: parent.horizontalCenter + } + Column{ + id: column2 + anchors.verticalCenter: parent.verticalCenter + //width: parent.width + //spacing: Theme.paddingLarge + + Label { + font.pixelSize: Theme.fontSizeExtraLarge + font.bold: true + text: "Labyrinth v"+ Qt.application.version + //anchors.horizontalCenter: parent.horizontalCenter + + } + + Label { + text: "(License: WTFPL)" + font.pixelSize: Theme.fontSizeSmall + anchors.horizontalCenter: parent.horizontalCenter + } + } + } + + Separator { + width: parent.width + anchors.margins: Theme.paddingSmall + anchors.horizontalCenter: parent.horizontalCenter + //height: Theme.itemSizeSmall + } + + Text { + width: parent.width-(Theme.paddingLarge * 2) + font.pixelSize: Theme.fontSizeExtraSmall + text:"

DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE

+

Version 2, December 2004

+

Copyright (C) 2004 Sam Hocevar

+

Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed.

+

DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

+

0. You just DO WHAT THE FUCK YOU WANT TO.

" + color: Theme.primaryColor + anchors.horizontalCenter: parent.horizontalCenter + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignHCenter + wrapMode: Text.WordWrap + } + + Separator { + width: parent.width + anchors.margins: Theme.paddingSmall + anchors.horizontalCenter: parent.horizontalCenter + //height: Theme.itemSizeSmall + } + } + } +} diff --git a/qml/pages/CastInfoPage.qml b/qml/pages/CastInfoPage.qml new file mode 100644 index 0000000..aaf7d55 --- /dev/null +++ b/qml/pages/CastInfoPage.qml @@ -0,0 +1,55 @@ +import QtQuick 2.0 +import Sailfish.Silica 1.0 +import "../JSONListModel" +import "../delegates" + +Page { + id: page + property string showname: "" + property string showimage: "" + property string summary: "" + property string showid: "" + property string actorname: "" + property string filter: "" + //property string country: "DK" + //property string _country: country ? "?country="+country : "" + //property string jsonSource: "http://api.tvmaze.com/schedule"+_country + + SilicaListView { + id: listView + anchors.fill: parent + clip: true + + JSONListModel { + id: jsonModel1 + source: "http://api.tvmaze.com/people/"+showid+"/castcredits?embed=show" //"http://api.tvmaze.com/schedule?country=US&date="+Qt.formatDateTime(new Date(), "yyyy-MM-dd") //2016-07-16" //+filter + query: "$[*]._embedded.show." + } + + model: jsonModel1.model + + BusyIndicator { + id: busyIndicator + running: !jsonModel1.jsonready + size: BusyIndicatorSize.Large + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + } + + header: PageHeader { + id: pHeader + title: actorname + description: "Known for" + } + + delegate: ShowDelegate {} + + ViewPlaceholder { + enabled: listView.count == 0 && jsonModel1.jsonready + text: "No TVmaze data" + hintText: "no information about cast" + } + } +} + + diff --git a/qml/pages/CastPage.qml b/qml/pages/CastPage.qml new file mode 100644 index 0000000..95768c3 --- /dev/null +++ b/qml/pages/CastPage.qml @@ -0,0 +1,153 @@ +import QtQuick 2.0 +import Sailfish.Silica 1.0 +import "../JSONListModel" + +Page { + id: page + property string showname: "" + property string showimage: "" + property string summary: "" + property string showid: "" + property string jsonSource: "http://api.tvmaze.com/schedule"+_country //"date="+Qt.formatDateTime(new Date(), "yyyy-MM-dd") + + //property string filter: "" + property string country: "" + //property string date: "" + property string _country: country ? "?country="+country : "" + //property string _date: date ? "" + + SilicaListView { + id: listView + anchors.fill: parent + clip: true + + JSONListModel { + id: jsonModel1 + source: "http://api.tvmaze.com/shows/"+showid+"/cast" //"http://api.tvmaze.com/schedule?country=US&date="+Qt.formatDateTime(new Date(), "yyyy-MM-dd") //2016-07-16" //+filter + query: "$[*]" + } + + model: jsonModel1.model + + BusyIndicator { + id: busyIndicator + running: !jsonModel1.jsonready + size: BusyIndicatorSize.Large + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + } + + header: PageHeader { + id: pHeader + title: showname + description: "Main cast" + } + + delegate: BackgroundItem { + id: myListItem + width: ListView.view.width + height: (showImg.height + showRect.height ) * showImg.scale + + OpacityRampEffect { + sourceItem: showRect + direction: OpacityRamp.TopToBottom + offset: 0.0 + slope: 1.0 + } + + Rectangle { + id: showRect + anchors.left: parent.left + anchors.right: parent.right + width: parent.width + height: firstName.height + Theme.paddingLarge + color: Theme.rgba(Theme.highlightBackgroundColor, Theme.highlightBackgroundOpacity) + } + + Image { + id: nextIcon + anchors.verticalCenter: showRect.verticalCenter + anchors.right: showRect.right + anchors.rightMargin: Theme.paddingMedium + source: "image://theme/icon-m-right" + } + + Image { + id: seenIcon + visible: false + anchors.right: parent.right + anchors.bottom: showImg.bottom + anchors.rightMargin: Theme.paddingMedium + source: "image://theme/icon-m-acknowledge" + } + + Image { + id: showImg + property int errorCount: 0 + anchors.top: showRect.bottom + anchors.margins: Theme.paddingLarge + // anchors.topMargin: Theme.paddingLarge + // anchors.leftMargin: Theme.paddingLarge + anchors.left: parent.left + // width: parent.width * 0.4 + // height: parent.height + scale: 1.2 + fillMode: Image.PreserveAspectFit + source: model.person.image ? model.person.image.medium ? model.person.image.medium : "../No-Image-.png" : "../No-Image-.png" + } + + Text { + id: firstName + text: model.person.name !== null ? model.person.name : "" + color: highlighted ? Theme.highlightColor : Theme.primaryColor + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: showRect.verticalCenter + wrapMode: Text.ElideRight + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeLarge + } + + Text { + id: showType + text: model.character.name !== null ? "Character
" + model.character.name + "" : "" + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.WordWrap + anchors.bottomMargin: Theme.paddingLarge + anchors.bottom: showImg.bottom + anchors.left: showImg.right + anchors.right: parent.right + anchors.leftMargin: Theme.paddingLarge * showImg.scale + anchors.rightMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + } + + onPressAndHold: { + pageStack.push(Qt.resolvedUrl("ShowImg.qml"),{"img": model.person.image ? model.person.image.medium ? model.person.image.medium : "../No-Image-.png" : "../No-Image-.png"}) + + //window.pageStack.push(Qt.resolvedUrl("SeasonsPage.qml"),{"showid": model.id,"showname": showname,"showimage": showImg.source} ) + } + + onClicked: { + // frompage = pageStack.currentPage + pageStack.push(Qt.resolvedUrl("CastInfoPage.qml"), + {"showid": model.person.id,"actorname": model.person.name,"showname": showname, "showimage": showImg.source, "summary": model.summary}) + } + } + + PullDownMenu { + MenuItem { + text: qsTr("Show seasons") + onClicked: pageStack.replace(Qt.resolvedUrl("SeasonsPage.qml"),{"showid": showid,"showname": showname,"showimage": showimage},PageStackAction.Immediate ) + } + } + + ViewPlaceholder { + enabled: listView.count == 0 && jsonModel1.jsonready + text: "No TVmaze data" + hintText: "no information about cast" + } + } +} + + diff --git a/qml/pages/Favorites.qml b/qml/pages/Favorites.qml new file mode 100644 index 0000000..ee4b913 --- /dev/null +++ b/qml/pages/Favorites.qml @@ -0,0 +1,554 @@ +import QtQuick 2.0 +import Sailfish.Silica 1.0 +import "../JSONListModel" +import Nemo.Notifications 1.0 + +Page { + id: page + //property int ny: 0 + + SilicaListView { + id: listView + anchors.fill: parent + clip: true + + model: favorites + + header: PageHeader { + id: pHeader + title: "Favorites" + } + + delegate: ListItem { + id: showDelegate + width: ListView.view.width + + property string f_name: name ? name : "" + property string f_summary: summary ? summary : "" + property string f_stat: status ? status : "" + property string f_premiered: premiered ? premiered : "" + property string f_rating: rating ? rating : "" + property int f_updated: updated ? updated : "" + property string f_imdb: imdb ? imdb : "" + property string f_official: official ? official : "" + property string f_network: network ? network : "" + property string f_image: image ? image : "../No-Image-.png" + + property string f_next: next ? next : "" + property string f_nextse: nextse ? nextse : "" + property string f_prev: prev ? prev : "" + + property bool f_upd: false + property bool running: false + property bool ended: false + + property bool max: false + + + + contentHeight: showImg.height + showName.height + (Theme.paddingLarge * 4) + + Notification { + id: notification + category: "Update" + //summary: "Updated tv show" + //itemCount: favorites.count + + + //itemCount: favorites.count + //expireTimeout: 0 + //itemCount: favorites.count + } + + JSONSimple { + id: updateFavorite + + source: "http://api.tvmaze.com/shows/"+showid + + onReadyChanged: { + if (ready) { + if (updated !== simple.updated ) { + var ne + var nese + var pr + + f_upd = true + f_name = simple.name + f_summary = simple.summary + f_stat = simple.status + simple.premiered ? f_premiered = simple.premiered : f_premiered = "" + f_rating = simple.rating.average + f_updated = simple.updated + //officialSite ? sofficial = officialSite : "" + simple.externals.imdb ? f_imdb = simple.externals.imdb : f_imdb = "" + simple.officialSite ? f_official = simple.officialSite : f_official = "" + simple.webChannel ? f_network = simple.webChannel.name : f_network = simple.network.name + f_image = simple.image.medium + simple._links.previousepisode ? pr = simple._links.previousepisode.href : pr = "" + simple._links.nextepisode ? ne = simple._links.nextepisode.href : ne = "" + + // console.log(simple.officialSite) + + if (pr !== "") { + prevshow.showNlink = ne + prevshow.showPlink = pr + prevshow.source = pr + } else { + if (next !== ""){ + nextshow.source = ne + } else { + doneUdating = true + } + } + + updateFav(showid, f_name, f_image, f_summary, f_stat, f_premiered, f_rating, f_network, f_updated, f_imdb, f_official) + + } + //console.log("IMDB: "+f_imdb) + } + } + } + + JSONSimple { + id: nextshow + //property string showid: "" + property string showNlink: "" + property string ne: "" + property string nese: "" + onReadyChanged: { + if (ready) { + console.log(" ---- UPDATING NEXTSHOW") + simple.airdate ? ne = simple.airdate : ne = "?" + ne !== "?" ? nese = "S"+simple.season+"E"+simple.number : nese = "" + f_next = ne + f_nextse = nese + console.log(f_name+" has been updated. ") + updateNext(showid, ne, nese) + notification.summary = f_name + notification.subText = "Labyrinth" + notification.body = "Next episode: "+f_next + //notification.text = "Next episode: "+f_next + notification.publish() + //doneUdating = true + } + } + } + + JSONSimple { + id: prevshow + //property string showid: "" + property string showPlink: "" + property string showNlink: "" + property string pr: "" + onReadyChanged: { + if (ready) { + console.log(" ---- UPDATING PREVSHOW") + simple.airdate ? pr = simple.airdate : pr = "?" + f_prev = pr + updatePrev(showid, pr) + if (showNlink !== "") { + //nextshow.showid = showid + //nextShow.showNlink = showNlink + nextshow.source = showNlink + } else { + f_next = "?" + f_nextse = "" + updateNext(showid, "?", "") + //doneUdating = true + } + } + } + } + + function showRemorseItem() { + var idx = index + remorseAction("Removing "+name+" from favorites!", function() {delFav(showid);listView.model.remove(idx)}) + } + + OpacityRampEffect { + sourceItem: showRect + direction: OpacityRamp.TopToBottom + offset: 0.0 + slope: 1.0 + } + + Rectangle { + id: showRect + anchors.left: parent.left + anchors.right: parent.right + width: parent.width + height: showName.height + Theme.paddingLarge + color: Theme.rgba(Theme.highlightBackgroundColor, Theme.highlightBackgroundOpacity) + } + + Image { + id: nextIcon + anchors.verticalCenter: showRect.verticalCenter + anchors.right: showRect.right + anchors.rightMargin: Theme.paddingMedium + source: "image://theme/icon-m-right" + } + + Image { + id: seenIcon + visible: false + anchors.right: parent.right + anchors.bottom: showImg.bottom + anchors.rightMargin: Theme.paddingMedium + source: "image://theme/icon-m-acknowledge" + } + + Text { + id: showName + //text: "" + text: f_name + color: highlighted ? Theme.highlightColor : Theme.primaryColor + anchors.leftMargin: Theme.paddingMedium + anchors.rightMargin: Theme.paddingMedium + anchors.left: parent.left + anchors.right: nextIcon.left + anchors.verticalCenter: showRect.verticalCenter + wrapMode: Text.ElideRight + font.pixelSize: Theme.fontSizeLarge + maximumLineCount: 1 + } + + Image { + id: showImg + fillMode: Image.PreserveAspectFit + source: f_image + anchors.top: showRect.bottom + anchors.margins: Theme.paddingLarge + anchors.left: parent.left + width: height * 0.8 + height: (showName.height + showS.height + showP.height + showR.height + showN.height + showPr.height + Theme.paddingLarge) * showImg.scale + scale: 1.1 + BusyIndicator { + id: imgBysy + running: showImg.progress !== 1.0 + size: BusyIndicatorSize.Large + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + } + } + + Image { + id: favIcon + anchors.right: parent.right + anchors.top: showImg.top + anchors.topMargin: Theme.paddingSmall + height: showStatus.height + (showStatus.height/2) + width: height + //anchors.top: showImg.top + anchors.rightMargin: Theme.paddingMedium + source: getFav(showid) ? "image://theme/icon-m-favorite-selected" : "image://theme/icon-m-favorite" + MouseArea { + anchors.fill: favIcon + onClicked: showRemorseItem()//remorse.executeqsTr("Removing "+name+" from favorites!"), function() {delFav(model.showid)}, 5000) + } + } + + //icon-m-refresh + + Image { + id: updIcon + anchors.right: favIcon.left + anchors.top: showImg.top + anchors.topMargin: Theme.paddingSmall + height: showStatus.height + (showStatus.height/2) + width: height + //anchors.top: showImg.top + anchors.rightMargin: Theme.paddingMedium + mirror: true + source: f_upd ? "image://theme/icon-m-notifications" : "" + + } + + Text { + id: showS + text: "Status:" + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.WordWrap + anchors.topMargin: Theme.paddingMedium + anchors.bottom: showP.top + anchors.left: showImg.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + } + + Text { + id: showStatus + text: f_stat + color: {//highlighted ? Theme.highlightColor : running && f_next !== "?" ? Theme.primaryColor : ended ? Theme.errorColor : Theme.secondaryColor + if (highlighted) Theme.highlightColor; + else if (f_stat === "Ended") Theme.errorColor; + else if (f_stat === "Running" && f_next !== "?") Theme.highlightColor + else if (f_stat === "Running" && f_next === "?") Theme.primaryColor + else Theme.secondaryColor + } + wrapMode: Text.WordWrap + anchors.topMargin: Theme.paddingMedium + anchors.bottom: showP.top + anchors.left: showS.right + anchors.right: parent.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + font.bold: true + } + + Text { + id: showP + text: "Premiered:" + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.WordWrap + anchors.bottom: showR.top + anchors.left: showImg.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + } + + Text { + id: showPrem + text: f_premiered + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.WordWrap + anchors.bottom: showR.top + anchors.left: showP.right + anchors.right: parent.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + font.bold: true + } + + Text { + id: showR + text: "Average rating:" + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.WordWrap + anchors.bottom: showN.top + anchors.left: showImg.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + } + + Text { + id: showRating + text: f_rating + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.WordWrap + anchors.bottom: showN.top + anchors.left: showR.right + anchors.right: parent.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + font.bold: true + } + + Text { + id: showN + text: "Network:" + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.ElideRight + maximumLineCount: 1 + anchors.bottom: showPr.top + anchors.left: showImg.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + } + + Text { + id: showNetwork + text: f_network + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.ElideRight + maximumLineCount: 1 + anchors.bottom: showPr.top + anchors.left: showN.right + anchors.right: parent.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + font.bold: true + } + + Text { + id: showPr + text: "Previous:" + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.ElideRight + maximumLineCount: 1 + anchors.bottom: showNe.top + anchors.left: showImg.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + } + + Text { + id: showPrev + text: f_prev + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.ElideRight + maximumLineCount: 1 + anchors.bottom: showNe.top + anchors.left: showPr.right + anchors.right: parent.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + font.bold: f_prev !== "Unknown" ? true : false + } + + Text { + id: showNe + text: f_nextse ? "Next: ("+f_nextse+")" : "Next: " + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.ElideRight + maximumLineCount: 1 + anchors.bottom: showImg.bottom + anchors.bottomMargin: Theme.paddingSmall + anchors.left: showImg.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + } + + Text { + id: showNext + text: f_next + color: highlighted ? Theme.highlightColor : f_stat === "Running" && f_next !== "?" ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.ElideRight + maximumLineCount: 1 + anchors.bottom: showImg.bottom + anchors.bottomMargin: Theme.paddingSmall + anchors.left: showNe.right + anchors.right: parent.right + anchors.leftMargin: Theme.paddingSmall + font.pixelSize: Theme.fontSizeSmall + font.bold: text !== "Unknown" ? true : false + } + + onPressAndHold: pageStack.push(Qt.resolvedUrl("ShowImg.qml"),{"img": f_image}) + + + onClicked: { + //frompage === undefined ? + if (f_upd) f_upd = false + pageStack.push(Qt.resolvedUrl("../pages/InfoPage.qml"), + {"showid": showid,"showname": name, "showimage": showImg.source, "summary": summary, "showstatus": status, "showprem": showPrem.text, "showrating": showRating.text, + "shownetwork": showNetwork.text, "showupdated": model.updated, "showprev": showPrev.text, "shownext": showNext.text, "shownextse": nextse, "simdb": f_imdb, "sofficial": f_official}) + } + } + + PullDownMenu { + MenuItem { + text: qsTr("About Labyrinth") + onClicked: pageStack.push(Qt.resolvedUrl("About.qml")) + } + MenuItem { + text: qsTr("Popular shows by rating") + onClicked: pageStack.replace(Qt.resolvedUrl("PopularPage.qml"),{"showweight": false},PageStackAction.Immediate) + } + MenuItem { + text: qsTr("Popular shows by clicks") + onClicked: pageStack.replace(Qt.resolvedUrl("PopularPage.qml"),{"showweight": true},PageStackAction.Immediate) + } + /* MenuItem { + text: qsTr("Refresh Favorites") + onClicked: {//pageStack.replace(Qt.resolvedUrl("SearchPage.qml"),{},PageStackAction.Immediate) + favorites.clear() + pageStack.replace(Qt.resolvedUrl("Favorites.qml"),{},PageStackAction.Immediate) + } + } */ + MenuItem { + text: qsTr("Search TV show") + onClicked: pageStack.replace(Qt.resolvedUrl("SearchPage.qml"),{},PageStackAction.Immediate) + } + MenuItem { + text: qsTr("Notify") + onClicked: notification.publish() + } + } + } + + + Notification { + id: notifi + category: "x-nemo.example" + appName: "Example App" + appIcon: "/usr/share/example-app/icon-l-application" + summary: "Notification summary" + body: "Notification body" + previewSummary: "Notification preview summary" + previewBody: "Notification preview body" + itemCount: 5 + timestamp: "2013-02-20 18:21:00" + remoteActions: [ { + "name": "default", + "displayName": "Do something", + "icon": "icon-s-do-it", + "service": "org.nemomobile.example", + "path": "/example", + "iface": "org.nemomobile.example", + "method": "doSomething", + "arguments": [ "argument", 1 ] + },{ + "name": "ignore", + "displayName": "Ignore the problem", + "icon": "icon-s-ignore", + "input" : { + "label": "Please select", + "editable": true, + "choices": [ "Yes", "No", "Maybe" ] + }, + "service": "org.nemomobile.example", + "path": "/example", + "iface": "org.nemomobile.example", + "method": "ignore", + "arguments": [ "argument", 1 ] + } ] + onClicked: console.log("Clicked") + onClosed: console.log("Closed, reason: " + reason) + } + + + /* ViewPlaceholder { + enabled: !updateModel.ready || favorites.count === 0//listView.count === 0 //|| jsonModel1.jsonready + text: dbcount > 0 ? "Checking TVMAZE for updated TV-shows" : listView.count === 0 ? "Favorites empty" : "" + hintText: updateModel.ready === 0 ? "add shows from TVMAZE" : "" + + Image { + id: logo + anchors.horizontalCenter: parent.horizontalCenter + //anchors.verticalCenter: parent.verticalCenter + width: parent.width * 0.4 + height: width + anchors.bottom: parent.top + anchors.bottomMargin: Theme.paddingLarge + opacity: 0.2 + source: "../harbour-labyrinth.png" + } + BusyIndicator { + id: checking + running: !updateModel.ready + size: BusyIndicatorSize.Large + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.bottom + anchors.topMargin: Theme.paddingLarge + //anchors.centerIn: logo + //anchors.horizontalCenter: parent.horizontalCenter + //anchors.top: logo.bottom + //anchors.topMargin: Theme.paddingLarge + //anchors.verticalCenter: parent.verticalCenter + } */ + + /* Button { + text: "Search TVMaze" + anchors.horizontalCenter: parent.horizontalCenter + anchors.bottom: parent.bottom + anchors.bottomMargin: Theme.paddingLarge + onClicked: pageStack.replace(Qt.resolvedUrl("SearchPage.qml"),{},PageStackAction.Immediate) + } */ + + // } + + //} +} + + diff --git a/qml/pages/InfoPage.qml b/qml/pages/InfoPage.qml new file mode 100644 index 0000000..5f973db --- /dev/null +++ b/qml/pages/InfoPage.qml @@ -0,0 +1,380 @@ +import QtQuick 2.0 +import Sailfish.Silica 1.0 + +Page { + id:infoPage + property string showname + property string showimage: "" + property string summary: "" + property string showid: "" + property string showstatus: "" + property string showprem: "" + property string showrating: "" + property string shownetwork: "" + property string showupdated: "" + property string showprev: "" + property string shownext: "" + property string shownextse: "" + property string simdb: "" + property string sofficial: "" + property bool favorite: getFav(showid) + + SilicaFlickable { + id: flick + anchors.top: parent.top + clip: true + anchors.bottom: parent.bottom + width: parent.width// - (Theme.paddingLarge * 2) + height: (showImg.height * showImg.scale) + sumheader.height + Theme.paddingLarge + anchors.horizontalCenter: parent.horizontalCenter + contentHeight: showSummary.height + showImg.height + sumheader.height + seasonA.height + seasonB.height + (Theme.paddingLarge * 5) + PageHeader {id: sumheader; title: showname; } + + + RemorsePopup {id: remorse} + + Image { + id: favIcon + anchors.right: parent.right + anchors.top: showImg.top + anchors.topMargin: Theme.paddingSmall + //anchors.verticalCenter: showStatus.verticalCenter + height: showStatus.height + (showStatus.height/2) + width: height + anchors.rightMargin: Theme.paddingMedium + source: favorite ? "image://theme/icon-m-favorite-selected" : "image://theme/icon-m-favorite" + MouseArea { + anchors.fill: favIcon + onClicked: if (getFav(showid)) {favorite = false; delFav(showid)} else {favorite = true; addFav(showid, showname, showimage, summary, showstatus, showprem, showrating, shownetwork)} + } + } + + Text { + id: showStatus + text: "Status: " + showstatus + "" + color: Theme.primaryColor + wrapMode: Text.WordWrap + anchors.topMargin: Theme.paddingMedium + anchors.bottom: showPrem.top + anchors.left: showImg.right + anchors.right: parent.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + } + + /* Image { + id: showImg + + anchors.top: sumheader.bottom + anchors.topMargin: Theme.paddingMedium + anchors.left: parent.left + anchors.leftMargin: Theme.paddingLarge + fillMode: Image.PreserveAspectFit + source: showimage + //width: height * 0.8 + //height: parent.height + + } */ + Image { + id: showImg + property bool zoomed: false + /* anchors.top: sumheader.bottom + anchors.topMargin: Theme.paddingMedium + anchors.bottomMargin: Theme.paddingLarge + anchors.rightMargin: Theme.paddingMedium + anchors.leftMargin: Theme.paddingMedium + anchors.left: parent.left */ + + anchors.top: sumheader.bottom + anchors.margins: Theme.paddingLarge + anchors.left: parent.left + scale: 1.1 + + // x: 0 + // y: 0 + fillMode: Image.PreserveAspectFit + source: showimage ? showimage : "../No-Image-.png" + + // width: 210 + width: height * 0.8 + // height: showName.height + showS.height + showP.height + showR.height + showN.height + showPr.height + Theme.paddingMedium +// height: (showName.height + showS.height + showP.height + showR.height + showN.height + showPr.height + Theme.paddingLarge) * showImg.scale + height: (showPrem.height + showRating.height + showNetwork.height + showPrev.height + showNext.height + showStatus.height + Theme.itemSizeSmall) * showImg.scale + // scale: 1.1 + // height: showName.height + showStatus.height + showPrem.height + showRating.height + showNext.height + showPrev.height + BusyIndicator { + id: imgBysy + running: showImg.progress !== 1.0 + size: BusyIndicatorSize.Large + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + } + MouseArea { + anchors.fill: showImg + onClicked: { + //if (showImg.width !== Screen.width) {showImg.width = Screen.width; showImg.height = Screen.height;} else {showImg.height = showPrem.height + showRating.height + showNetwork.height + showPrev.height + showNext.height + showStatus.height} + } + } + } + + Text { + id: showPrem + text: showprem ? "Premiered: " + showprem + "" : "Premiered: ?" + color: Theme.primaryColor + wrapMode: Text.WordWrap + anchors.bottom: showRating.top + anchors.left: showImg.right + anchors.right: parent.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + } + + Text { + id: showRating + text: "Average rating: " + showrating + "" + color: Theme.primaryColor + wrapMode: Text.WordWrap + anchors.bottom: showNetwork.top + anchors.left: showImg.right + anchors.right: parent.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + } + + Text { + id: showNetwork + text: "Network: " + shownetwork + "" + color: Theme.primaryColor + wrapMode: Text.ElideRight + maximumLineCount: 1 + anchors.bottom: showPrev.top + anchors.left: showImg.right + anchors.right: parent.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + } + + Text { + id: showPrev + text: showprev !== "" ? "Previous: " + showprev+"" : "" + color: Theme.primaryColor + wrapMode: Text.ElideRight + maximumLineCount: 1 + anchors.bottom: showNext.top + anchors.left: showImg.right + anchors.right: parent.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + } + + Text { + id: showNext + text: shownext !== "" || shownext !== "Unknown" ? "Next: ("+shownextse + ") " + shownext + "" : "" //nextse !=="" ? "Next: ("+nextse+")" : "Next: " + next + color: Theme.primaryColor + wrapMode: Text.ElideRight + maximumLineCount: 1 + anchors.bottom: showImg.bottom + anchors.bottomMargin: Theme.paddingMedium + anchors.left: showImg.right + anchors.right: parent.right + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + } + + BackgroundItem { + id: seasonA + anchors.left: parent.left + anchors.right: parent.right + anchors.top: showImg.bottom + anchors.topMargin: Theme.paddingLarge + + OpacityRampEffect { + sourceItem: actorRect + direction: OpacityRamp.TopToBottom + offset: 0.0 + slope: 1.0 + } + + Rectangle { + id: actorRect + anchors.left: parent.left + anchors.right: parent.right + width: parent.width + height: actorName.height + Theme.paddingLarge + color: Theme.rgba(Theme.highlightBackgroundColor, Theme.highlightBackgroundOpacity) + } + + Image { + id: nextIconActor + anchors.verticalCenter: actorRect.verticalCenter + anchors.right: actorRect.right + anchors.rightMargin: Theme.paddingMedium + source: "image://theme/icon-m-right" + "?" + (seasonA.highlighted ? Theme.highlightColor : Theme.primaryColor) + + } + + Text { + id: actorName + text: "Show main cast" + color: seasonA.highlighted ? Theme.highlightColor : Theme.primaryColor + anchors.leftMargin: Theme.paddingMedium + anchors.rightMargin: Theme.paddingMedium + anchors.left: parent.left + anchors.right: nextIconActor.left + anchors.verticalCenter: actorRect.verticalCenter + wrapMode: Text.ElideRight + font.pixelSize: Theme.fontSizeLarge + maximumLineCount: 1 + } + + onClicked: pageStack.push(Qt.resolvedUrl("CastPage.qml"),{"showid": showid,"showname": showname,"showimage": showimage} ) + } + + /* IconButton { + anchors.bottom: showImg.bottom + anchors.bottomMargin: Theme.paddingLarge + anchors.right: parent.right + anchors.rightMargin: Theme.paddingLarge + //width: 200 + //height: 50 + icon.source: "../imdb.png" + onClicked: console.log("Delete!") + } */ + + BackgroundItem { + id: seasonB + anchors.left: parent.left + anchors.right: parent.right + anchors.top: seasonA.bottom + anchors.topMargin: Theme.paddingLarge + + OpacityRampEffect { + sourceItem: seasonRect + direction: OpacityRamp.TopToBottom + offset: 0.0 + slope: 1.0 + } + + Rectangle { + id: seasonRect + anchors.left: parent.left + anchors.right: parent.right + width: parent.width + height: seasonName.height + Theme.paddingLarge + color: Theme.rgba(Theme.highlightBackgroundColor, Theme.highlightBackgroundOpacity) + } + + Image { + id: nextIconSeason + anchors.verticalCenter: seasonRect.verticalCenter + anchors.right: seasonRect.right + anchors.rightMargin: Theme.paddingMediumIMDB + source: "image://theme/icon-m-right" + "?" + (seasonB.highlighted ? Theme.highlightColor : Theme.primaryColor) + } + + Text { + id: seasonName + text: "Show seasons" + color: seasonB.highlighted ? Theme.highlightColor : Theme.primaryColor + anchors.leftMargin: Theme.paddingMedium + anchors.rightMargin: Theme.paddingMedium + anchors.left: parent.left + anchors.right: nextIconSeason.left + anchors.verticalCenter: seasonRect.verticalCenter + wrapMode: Text.ElideRight + font.pixelSize: Theme.fontSizeLarge + maximumLineCount: 1 +// font.bold: true + } + + onClicked: pageStack.push(Qt.resolvedUrl("SeasonsPage.qml"),{"showid": showid,"showname": showname,"showimage": showimage} ) + } + + /* Text { + id: showSummaryH + anchors.top: seasonB.bottom + anchors.topMargin: Theme.paddingLarge + anchors.left: parent.left + anchors.leftMargin: Theme.paddingLarge + text: "Summary" + color: Theme.secondaryColor + font.pixelSize: Theme.fontSizeLarge + //font.underline: true + //font.bold: true + } */ + + Text { + id: showSummary + anchors.top: seasonB.bottom + //anchors.topMargin: Theme.paddingSmall + anchors.left: parent.left + anchors.right: parent.right + anchors.leftMargin: Theme.paddingLarge + anchors.rightMargin: Theme.paddingLarge + text: summary + textFormat: Text.StyledText + color: Theme.primaryColor + wrapMode: Text.WordWrap + font.pixelSize: Theme.fontSizeMedium + } + + + function fitToScreen() { + showImg.scale = Math.min(flick.width / showImg.width, flick.height / showImg.height, 1) + //pinchArea.minScale = scale + prevScale = scale + } + + /* Image { + id: showImg + + anchors.top: sumheader.bottom + anchors.topMargin: Theme.paddingMedium + anchors.left: parent.left + anchors.leftMargin: Theme.paddingLarge + fillMode: Image.PreserveAspectFit + source: showimage + //width: height * 0.8 + //height: parent.height + + property real prevScale + + + + MouseArea { + anchors.fill: parent + onClicked: { + scale = Math.min(flick.width / width, flick.height / height, 1) + //pinchArea.minScale = scale + //prevScale = scale + + } + + //transform: Scale { origin.x: 25; origin.y: 25; xScale: 3} + } + } */ + + + PullDownMenu { + + MenuItem { + visible: simdb !== "" ? true : false + text: qsTr("Open IMDB page") + onClicked: { //remorse.execute(qsTr("Opening webpage"), function() {Qt.openUrlExternally("http://m.imdb.com/title/"+simdb)}, 2000)//Qt.openUrlExternally("http://m.imdb.com/title/"+imdb)//pageStack.push(Qt.resolvedUrl("SeasonsPage.qml"),{"showid": showid,"showname": showname,"showimage": showimage} ) + //WebViewer {webPageAddress: defaultDevice } + console.log("IMDB: "+simdb) + pageStack.push(Qt.resolvedUrl("WebViewer.qml"),{"webPageAddress": "http://m.imdb.com/title/"+simdb} ) + } + } + MenuItem { + visible: sofficial !== "" ? true : false + text: qsTr("Official site") + onClicked: { //remorse.execute(qsTr("Opening webpage"), function() {Qt.openUrlExternally("http://m.imdb.com/title/"+simdb)}, 2000)//Qt.openUrlExternally("http://m.imdb.com/title/"+imdb)//pageStack.push(Qt.resolvedUrl("SeasonsPage.qml"),{"showid": showid,"showname": showname,"showimage": showimage} ) + //WebViewer {webPageAddress: defaultDevice } + console.log("Official: "+sofficial) + pageStack.push(Qt.resolvedUrl("WebViewer.qml"),{"webPageAddress": sofficial} ) + } + } + } + } +} diff --git a/qml/pages/PopularPage.qml b/qml/pages/PopularPage.qml new file mode 100644 index 0000000..1b75534 --- /dev/null +++ b/qml/pages/PopularPage.qml @@ -0,0 +1,73 @@ +import QtQuick 2.0 +import Sailfish.Silica 1.0 +import "../JSONListModel" +import "../delegates" + +Page { + id: page + //property string filter: "" + //property string country: "" + //property string _country: country ? "?country="+country : "" + //property string jsonSource: "http://api.tvmaze.com/schedule"+_country //"date="+Qt.formatDateTime(new Date(), "yyyy-MM-dd") + property string jsonSource: "http://api.tvmaze.com/shows" + property bool showweight: false + + SilicaListView { + id: listView + anchors.fill: parent + clip: true + + JSONListModel { + id: jsonModel1 + sortby: showweight ? "weight" : "rating.average" + source: jsonSource //"http://api.tvmaze.com/schedule?country=SE&date="+Qt.formatDateTime(new Date(), "yyyy-MM-dd") //2016-07-16" //+filter + query: showweight ? "$[?(@.weight>7)]" : "$[?(@.rating.average>7.9)]" + } + + model: jsonModel1.model + + BusyIndicator { + id: busyIndicator + running: !jsonModel1.jsonready + size: BusyIndicatorSize.Large + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + } + + header: PageHeader { + id: pHeader + title: showweight ? "Popular shows by clicks" : "Popular shows by rating" + } + + delegate: ShowDelegate {} + + PullDownMenu { + MenuItem { + visible: showweight + text: qsTr("Popular shows by rating") + onClicked: pageStack.replace(Qt.resolvedUrl("PopularPage.qml"),{"showweight": false},PageStackAction.Immediate) + } + MenuItem { + visible: !showweight + text: qsTr("Popular shows by clicks") + onClicked: pageStack.replace(Qt.resolvedUrl("PopularPage.qml"),{"showweight": true},PageStackAction.Immediate) + } + MenuItem { + text: qsTr("Favourites") + onClicked: pageStack.replace(Qt.resolvedUrl("Favorites.qml"),{},PageStackAction.Immediate) + } + MenuItem { + text: qsTr("Search shows") + onClicked: pageStack.replace(Qt.resolvedUrl("SearchPage.qml"),{},PageStackAction.Immediate) + } + } + + ViewPlaceholder { + visible: listView.count === 0 && jsonModel1.jsonready + text: "Unable to load TVmaze data!" + hintText: "Check your connection" + } + } +} + + diff --git a/qml/pages/SearchPage.qml b/qml/pages/SearchPage.qml new file mode 100644 index 0000000..5926323 --- /dev/null +++ b/qml/pages/SearchPage.qml @@ -0,0 +1,82 @@ +import QtQuick 2.0 +import Sailfish.Silica 1.0 +import "../JSONListModel" +import "../delegates" + +Page { + id: page + property string filter: "" + + SilicaListView { + id: listView + anchors.fill: parent + clip: true + + JSONListModel { + id: jsonModel1 + source: filter !=="" ? "http://api.tvmaze.com/search/shows?q="+filter : "" + query: "$[*].show" + } + + model: jsonModel1.model + + BusyIndicator { + id: busyIndicator + running: !jsonModel1.jsonready + size: BusyIndicatorSize.Large + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + } + + header: PageHeader { + id: pHeader + + SearchField { + id: searchField + width: parent.width + placeholderText: "Search" + inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhNoPredictiveText + EnterKey.iconSource: "image://theme/icon-m-enter-close" + EnterKey.onClicked: {filter = text;focus = false} + focus: true + onTextChanged: if (text.length > 1) filter = text; else {filter = "";focus=true;} + // onTextChanged: if (text.length > 1) jsonModel1.source = "http://www.radio-browser.info/webservice/json/stations/"+searchby+"/"+text; else {jsonModel1.source = "";focus=true;jsonModel1.model.clear()} + onClicked: {listView.currentIndex = -1} + } + } + + delegate: ShowDelegate {} + + PullDownMenu { + MenuItem { + text: qsTr("Popular shows by rating") + onClicked: pageStack.replace(Qt.resolvedUrl("PopularPage.qml"),{"showweight": false},PageStackAction.Immediate) + } + MenuItem { + text: qsTr("Popular shows by clicks") + onClicked: pageStack.replace(Qt.resolvedUrl("PopularPage.qml"),{"showweight": true},PageStackAction.Immediate) + } + MenuItem { + text: qsTr("Favorites") + onClicked: pageStack.replace(Qt.resolvedUrl("Favorites.qml"),{},PageStackAction.Immediate) + } + } + + ViewPlaceholder { + enabled: listView.count === 0 //|| jsonModel1.jsonready + text: "Search a TV Show" + hintText: "on TVMaze" + + Image { + id: logo + anchors.horizontalCenter: parent.horizontalCenter + anchors.bottom: parent.top + anchors.bottomMargin: Theme.paddingLarge + opacity: 0.2 + source: "../harbour-labyrinth.png" + } + } + } +} + + diff --git a/qml/pages/SeasonNrPage.qml b/qml/pages/SeasonNrPage.qml new file mode 100644 index 0000000..bbdb37a --- /dev/null +++ b/qml/pages/SeasonNrPage.qml @@ -0,0 +1,195 @@ +import QtQuick 2.0 +import Sailfish.Silica 1.0 +import "../JSONListModel" + +Page { + id: page + property string filter: "" + property string showid: "" + property string showname: "" + property string showimage: "" + property string number: "" + + SilicaListView { + id: listView + anchors.fill: parent + + clip: true + + JSONListModel { + id: jsonModel1 + source: "http://api.tvmaze.com/shows/"+showid+"/episodes" + query: "$[?(@.season==="+number+")]" + } + + model: jsonModel1.model + + BusyIndicator { + id: busyIndicator + running: !jsonModel1.jsonready + size: BusyIndicatorSize.Large + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + } + + header: PageHeader { + id: pHeader + title: showname + description: "Season: "+number + } + + delegate: BackgroundItem { + id: myListItem + + enabled: model.summary !== "" + width: ListView.view.width + height: showImg.height + showRect.height + showAirdate.height + showSummary.height + showSummaryIcon.height + Theme.paddingLarge//showImg.height > 20 ? showImg.height + showSummary.height + showAirdate.heigth + showRect.height + showSummaryIcon.height + (Theme.paddingLarge * 3) : firstName.height + showAirdate.height + showAirdate.heigth + showRuntime.height + showSummary.height + showRect.height + (Theme.paddingLarge * 3) + + OpacityRampEffect { + sourceItem: showRect + direction: OpacityRamp.TopToBottom + offset: 0.0 + slope: 1.0 + } + + Rectangle { + id: showRect + anchors.left: parent.left + anchors.right: parent.right + width: parent.width + height: firstName.height + Theme.paddingLarge + color: Theme.rgba(Theme.highlightBackgroundColor, Theme.highlightBackgroundOpacity) + } + + Image { + id: seenIcon + visible: false + anchors.right: parent.right + anchors.top: showImg.top + anchors.topMargin: Theme.paddingLarge + anchors.rightMargin: Theme.paddingMedium + source: "image://theme/icon-m-acknowledge" + } + + Image { + id: showImg + property int errorCount: 0 + anchors.top: showAirdate.bottom + //anchors.margins: Theme.paddingLarge + anchors.topMargin: Theme.paddingSmall + /* anchors.topMargin: Theme.paddingLarge + anchors.bottomMargin: Theme.paddingMedium + anchors.rightMargin: Theme.paddingMedium + anchors.leftMargin: Theme.paddingMedium */ + anchors.left: parent.left + // width: parent.width * 0.4 + // x: 0 + // y: 0 + // width: parent.width * 0.4 + // height: parent.width * 0.3 + height: width * 0.6 + width: page.width + //scale: 1.1 + // height: parent.height + fillMode: Image.PreserveAspectFit + source: model.image ? model.image.medium ? model.image.medium : "" : "" + } + + Text { + id: firstName + text: model.number + ": " + model.name + color: highlighted ? Theme.highlightColor : Theme.primaryColor + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: showRect.verticalCenter + wrapMode: Text.ElideRight + anchors.leftMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeLarge + } + + Text { + id: showSummary + //anchors.bottom: showSummaryIcon.top + anchors.top: showImg.bottom + anchors.topMargin: Theme.paddingLarge + anchors.leftMargin: Theme.paddingMedium + anchors.rightMargin: Theme.paddingMedium + anchors.bottomMargin: Theme.paddingLarge + anchors.left: parent.left + anchors.right: parent.right + text: "" + color: Theme.primaryColor + wrapMode: Text.WordWrap + width: parent.width + font.pixelSize: Theme.fontSizeSmall + } + + Image { + id: showSummaryIcon + anchors.top: showImg.bottom + anchors.bottomMargin: Theme.paddingLarge + //anchors.topMargin: Theme.paddingMedium + anchors.right: parent.right + anchors.rightMargin: Theme.paddingMedium + source: model.summary !== "" ? "image://theme/icon-lock-more" : "" + } + + Text { + id: showAirdate + text: "Air date: "+model.airdate+"" + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.WordWrap + //anchors.topMargin: Theme.paddingMedium + anchors.top: showRect.bottom + anchors.left: parent.left + anchors.leftMargin: Theme.paddingMedium + //anchors.right: parent.right + + anchors.rightMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + } + Text { + id: showRuntime + text: model.runtime !== null ? "(Runtime: " + model.runtime + " minutes)" : "" + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.WordWrap + anchors.top: showRect.bottom + //anchors.topMargin: Theme.paddingMedium + //anchors.left: showImg.right + anchors.right: parent.right + anchors.leftMargin: Theme.paddingMedium + anchors.rightMargin: Theme.paddingMedium + font.pixelSize: Theme.fontSizeSmall + } + + + + onClicked: { + showSummary.text !== "" ? showSummary.text = "" : showSummary.text = model.summary + } + } + + ViewPlaceholder { + enabled: listView.count == 0 && jsonModel1.jsonready + text: "No TVmaze data" + hintText: "no information about season" + } + } + + Component { + id: sectionDelegate + + Text { + id: sectionLabel + anchors.horizontalCenter: parent.horizontalCenter + font.pixelSize: Theme.fontSizeExtraLarge + color: Theme.highlightColor + text: "SEASON: "+section + } + + } +} + + + + diff --git a/qml/pages/SeasonsPage.qml b/qml/pages/SeasonsPage.qml new file mode 100644 index 0000000..c82a1cb --- /dev/null +++ b/qml/pages/SeasonsPage.qml @@ -0,0 +1,156 @@ +import QtQuick 2.0 +import Sailfish.Silica 1.0 +import "../JSONListModel" + +Page { + id: page + property string filter: "" + property string showid: "" + property string showname: "" + property string showimage: "" + + SilicaListView { + id: listView + anchors.fill: parent + clip: true + + JSONListModel { + id: jsonModel1 + source: "http://api.tvmaze.com/shows/"+showid+"/seasons" + query: "$[*]" + } + + model: jsonModel1.model + + BusyIndicator { + id: busyIndicator + running: !jsonModel1.jsonready + size: BusyIndicatorSize.Large + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + } + + header: PageHeader { + id: pHeader + title: showname + } + + delegate: BackgroundItem { + id: myListItem + width: ListView.view.width + height: (showImg.height * showImg.scale) + showRect.height + Theme.paddingLarge + OpacityRampEffect { + sourceItem: showRect + direction: OpacityRamp.TopToBottom + offset: 0.0 + slope: 1.0 + } + + Rectangle { + id: showRect + anchors.left: parent.left + anchors.right: parent.right + width: parent.width + height: firstName.height + Theme.paddingLarge + color: Theme.rgba(Theme.highlightBackgroundColor, Theme.highlightBackgroundOpacity) + } + + Image { + id: nextIcon + anchors.verticalCenter: showRect.verticalCenter + anchors.right: showRect.right + anchors.rightMargin: Theme.paddingMedium + source: "image://theme/icon-m-right" + } + + Image { + id: seenIcon + visible: false + anchors.right: parent.right + anchors.bottom: showImg.bottom + anchors.rightMargin: Theme.paddingMedium + source: "image://theme/icon-m-acknowledge" + } + + + Image { + id: showImg + property int errorCount: 0 + anchors.top: showRect.bottom + anchors.margins: Theme.paddingLarge + /* anchors.topMargin: Theme.paddingLarge + anchors.bottomMargin: Theme.paddingLarge + anchors.rightMargin: Theme.paddingMedium + anchors.leftMargin: Theme.paddingMedium */ + anchors.left: parent.left + scale: 1.2 + //height: parent.height + // width: parent.width * 0.4 + fillMode: Image.PreserveAspectFit + source: model.image ? model.image.medium ? model.image.medium : showimage : showimage + } + + Text { + id: firstName + text: "Season: "+model.number //!== null ? ""+model.name+"" : "" + color: highlighted ? Theme.highlightColor : Theme.primaryColor + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: showRect.verticalCenter + wrapMode: Text.ElideRight + anchors.leftMargin: Theme.paddingLarge + font.pixelSize: Theme.fontSizeLarge + } + Text { + id: showType + text: "Premiere
" + model.premiereDate + "" + color: highlighted ? Theme.highlightColor : Theme.primaryColor + wrapMode: Text.WordWrap + anchors.bottomMargin: Theme.paddingMedium + anchors.bottom: showImg.bottom + anchors.left: showImg.right + anchors.right: parent.right + anchors.leftMargin: Theme.paddingLarge + font.pixelSize: Theme.fontSizeSmall + } + + onPressAndHold: { + pageStack.push(Qt.resolvedUrl("ShowImg.qml"),{"img": model.image ? model.image.medium ? model.image.medium : showimage : showimage}) + + //window.pageStack.push(Qt.resolvedUrl("SeasonsPage.qml"),{"showid": model.id,"showname": showname,"showimage": showImg.source} ) + } + + onClicked: { + onClicked: pageStack.push(Qt.resolvedUrl("SeasonNrPage.qml"),{"showid": showid,"showname": showname,"showimage": showImg,"number": model.number} ) + } + } + + PullDownMenu { + MenuItem { + text: qsTr("Show cast") + onClicked: pageStack.replace(Qt.resolvedUrl("CastPage.qml"),{"showid": showid,"showname": showname,"showimage": showimage},PageStackAction.Immediate ) + } + } + + ViewPlaceholder { + enabled: listView.count == 0 && jsonModel1.jsonready + text: "No TVmaze data" + hintText: "no information about seasons" + } + } + + Component { + id: sectionDelegate + Text { + id: sectionLabel + anchors.horizontalCenter: parent.horizontalCenter + font.pixelSize: Theme.fontSizeExtraLarge + color: Theme.highlightColor + text: "SEASON: "+section + } + } +} + + + + diff --git a/qml/pages/ShowImg.qml b/qml/pages/ShowImg.qml new file mode 100644 index 0000000..6728f4d --- /dev/null +++ b/qml/pages/ShowImg.qml @@ -0,0 +1,23 @@ +import QtQuick 2.0 +import Sailfish.Silica 1.0 + +Page { + property string img: "" + Image { + id: showImg + fillMode: Image.PreserveAspectFit + source: img + anchors.fill: parent + + width: parent.width + height: parent.height + BusyIndicator { + id: imgBysy + running: showImg.progress !== 1.0 + size: BusyIndicatorSize.Large + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + } + + } +} diff --git a/qml/pages/WebViewer.qml b/qml/pages/WebViewer.qml new file mode 100644 index 0000000..e324643 --- /dev/null +++ b/qml/pages/WebViewer.qml @@ -0,0 +1,58 @@ +import QtQuick 2.0 +import Sailfish.Silica 1.0 +import Sailfish.WebView 1.0 + +WebViewPage { + id: webViewPage + allowedOrientations: Orientation.Portrait | Orientation.Landscape + + property string webPageAddress: "" + property bool webViewLoading: false + property int webViewLoadProgress: 0 + + WebView { + id: webView + + anchors.fill: parent + + active: true + url: webPageAddress + + onLoadingChanged: { + webViewPage.webViewLoading = loading + webViewPage.webViewLoadProgress = 0 + } + + onLoadProgressChanged: { + webViewPage.webViewLoadProgress = loadProgress + } + } + + Rectangle { + id: panel + color: Theme.highlightDimmerColor + anchors { + bottom: parent.bottom + left: parent.left + right: parent.right + //margins: Theme.padding + } + width: parent.width + height: opacity === 0.0 ? 0 : Theme.paddingLarge + radius: 5 + + opacity: (webViewPage.webViewLoading || loadStatusShowTimer.running) ? 0.75 : 0.0 + Behavior on opacity { FadeAnimator {} } + + Timer { + id: loadStatusShowTimer + } + + Rectangle { + anchors.left: parent.left + color: Theme.secondaryHighlightColor + width: webViewPage.webViewLoading ? parent.width * (webViewPage.webViewLoadProgress / 100) : 0 + height: parent.height + } + } +} diff --git a/rpm/harbour-labyrinth.changes.in b/rpm/harbour-labyrinth.changes.in new file mode 100644 index 0000000..d2a7354 --- /dev/null +++ b/rpm/harbour-labyrinth.changes.in @@ -0,0 +1,14 @@ +# Rename this file as harbour-labyrinth.changes to include changelog +# entries in your RPM file. +# +# Add new changelog entries following the format below. +# Add newest entries to the top of the list. +# Separate entries from eachother with a blank line. + +# * date Author's Name version-release +# - Summary of changes + +* Sun Apr 13 2014 Jack Tar 0.0.1-1 +- Scrubbed the deck +- Hoisted the sails + diff --git a/rpm/harbour-labyrinth.spec b/rpm/harbour-labyrinth.spec new file mode 100644 index 0000000..c3dfee5 --- /dev/null +++ b/rpm/harbour-labyrinth.spec @@ -0,0 +1,71 @@ +# +# Do NOT Edit the Auto-generated Part! +# Generated by: spectacle version 0.32 +# + +Name: harbour-labyrinth + +# >> macros +# << macros + +%{!?qtc_qmake:%define qtc_qmake %qmake} +%{!?qtc_qmake5:%define qtc_qmake5 %qmake5} +%{!?qtc_make:%define qtc_make make} +%{?qtc_builddir:%define _builddir %qtc_builddir} +Summary: Labyrinth +Version: 0.9.0 +Release: 1 +Group: Qt/Qt +License: LICENSE +URL: http://example.org/ +Source0: %{name}-%{version}.tar.bz2 +Source100: harbour-labyrinth.yaml +Requires: sailfishsilica-qt5 >= 0.10.9 +BuildRequires: pkgconfig(sailfishapp) >= 1.0.2 +BuildRequires: pkgconfig(Qt5Core) +BuildRequires: pkgconfig(Qt5Qml) +BuildRequires: pkgconfig(Qt5Quick) +BuildRequires: desktop-file-utils + +%description +Labyrinth is a simple app to keep track of your favorite TV-shows using TVMaze. + +%prep +%setup -q -n %{name}-%{version} + +# >> setup +# << setup + +%build +# >> build pre +# << build pre + +%qtc_qmake5 \ + VERSION='%{version}' + +%qtc_make %{?_smp_mflags} + +# >> build post +# << build post + +%install +rm -rf %{buildroot} +# >> install pre +# << install pre +%qmake5_install + +# >> install post +# << install post + +desktop-file-install --delete-original \ + --dir %{buildroot}%{_datadir}/applications \ + %{buildroot}%{_datadir}/applications/*.desktop + +%files +%defattr(-,root,root,-) +%{_bindir} +%{_datadir}/%{name} +%{_datadir}/applications/%{name}.desktop +%{_datadir}/icons/hicolor/*/apps/%{name}.png +# >> files +# << files diff --git a/rpm/harbour-labyrinth.yaml b/rpm/harbour-labyrinth.yaml new file mode 100644 index 0000000..4c62b29 --- /dev/null +++ b/rpm/harbour-labyrinth.yaml @@ -0,0 +1,47 @@ +Name: harbour-labyrinth +Summary: Labyrinth +Version: 0.9.0 +Release: 1 +# The contents of the Group field should be one of the groups listed here: +# http://gitorious.org/meego-developer-tools/spectacle/blobs/master/data/GROUPS +Group: Qt/Qt +URL: http://example.org/ +License: LICENSE +# This must be generated before uploading a package to a remote build service. +# Usually this line does not need to be modified. +Sources: +- '%{name}-%{version}.tar.bz2' +Description: Labyrinth is a simple app to keep track of your favorite TV-shows using TVMaze. +Configure: none +# The qtc5 builder inserts macros to allow QtCreator to have fine +# control over qmake/make execution +Builder: qtc5 + +QMakeOptions: + - VERSION='%{version}' + +# This section specifies build dependencies that are resolved using pkgconfig. +# This is the preferred way of specifying build dependencies for your package. +PkgConfigBR: + - sailfishapp >= 1.0.2 + - Qt5Core + - Qt5Qml + - Qt5Quick + +# Build dependencies without a pkgconfig setup can be listed here +# PkgBR: +# - package-needed-to-build + +# Runtime dependencies which are not automatically detected +Requires: + - sailfishsilica-qt5 >= 0.10.9 + +# All installed files +Files: + - '%{_bindir}' + - '%{_datadir}/%{name}' + - '%{_datadir}/applications/%{name}.desktop' + - '%{_datadir}/icons/hicolor/*/apps/%{name}.png' + +# For more information about yaml and what's supported in Sailfish OS +# build system, please see https://wiki.merproject.org/wiki/Spectacle diff --git a/src/harbour-labyrinth.cpp b/src/harbour-labyrinth.cpp new file mode 100644 index 0000000..6cc725f --- /dev/null +++ b/src/harbour-labyrinth.cpp @@ -0,0 +1,53 @@ +/* + Copyright (C) 2013 Jolla Ltd. + Contact: Thomas Perl + All rights reserved. + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Jolla Ltd nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef QT_QML_DEBUG +#include +#endif + +#include +#include + + +int main(int argc, char *argv[]) +{ + // SailfishApp::main() will display "qml/template.qml", if you need more + // control over initialization, you can use: + // + // - SailfishApp::application(int, char *[]) to get the QGuiApplication * + // - SailfishApp::createView() to get a new QQuickView * instance + // - SailfishApp::pathTo(QString) to get a QUrl to a resource file + // + // To display the view, call "show()" (will show fullscreen on device). + QScopedPointer app(SailfishApp::application(argc,argv)); + app->setApplicationVersion(QString(APP_VERSION)); + + return SailfishApp::main(argc, argv); +} diff --git a/translations/harbour-labyrinth-de.ts b/translations/harbour-labyrinth-de.ts new file mode 100644 index 0000000..3aa1067 --- /dev/null +++ b/translations/harbour-labyrinth-de.ts @@ -0,0 +1,86 @@ + + + + + CastPage + + Show seasons + + + + + Favorites + + About Labyrinth + + + + Popular shows by rating + + + + Popular shows by clicks + + + + Search TV show + + + + Notify + + + + + InfoPage + + Open IMDB page + + + + Official site + + + + + PopularPage + + Popular shows by rating + + + + Popular shows by clicks + + + + Favourites + + + + Search shows + + + + + SearchPage + + Popular shows by rating + + + + Popular shows by clicks + + + + Favorites + + + + + SeasonsPage + + Show cast + + + + diff --git a/translations/harbour-labyrinth.ts b/translations/harbour-labyrinth.ts new file mode 100644 index 0000000..3aa1067 --- /dev/null +++ b/translations/harbour-labyrinth.ts @@ -0,0 +1,86 @@ + + + + + CastPage + + Show seasons + + + + + Favorites + + About Labyrinth + + + + Popular shows by rating + + + + Popular shows by clicks + + + + Search TV show + + + + Notify + + + + + InfoPage + + Open IMDB page + + + + Official site + + + + + PopularPage + + Popular shows by rating + + + + Popular shows by clicks + + + + Favourites + + + + Search shows + + + + + SearchPage + + Popular shows by rating + + + + Popular shows by clicks + + + + Favorites + + + + + SeasonsPage + + Show cast + + + +