From cd6d19c3e9a71f2e19d13beaf119554905803a12 Mon Sep 17 00:00:00 2001 From: jakub Date: Fri, 18 Feb 2011 15:28:01 +0100 Subject: [PATCH 1/1] bi change + completer in line edit --- data/button/buttonCenterDisabled.png | Bin 1265 -> 1297 bytes data/button/buttonCenterPushed.png | Bin 1297 -> 1265 bytes data/button/buttonLeftDisabled.png | Bin 4350 -> 4497 bytes data/button/buttonLeftPushed.png | Bin 4497 -> 4350 bytes data/button/buttonRightDisabled.png | Bin 4240 -> 4435 bytes data/button/buttonRightPushed.png | Bin 4435 -> 4240 bytes data/button/checkboxCheckedDis.png | Bin 0 -> 1958 bytes data/button/checkboxDis.png | Bin 0 -> 1508 bytes data/button/down_enable.png | Bin 315 -> 317 bytes data/button/down_enable2.png | Bin 0 -> 312 bytes data/button/up_enable.png | Bin 317 -> 315 bytes data/button/up_enable2.png | Bin 0 -> 314 bytes data/gui.qrc | 2 + src/include/ComboBoxModel.cpp | 1 - src/mdictionary/gui/SearchBarWidget.cpp | 105 ++++++-- src/mdictionary/gui/SearchBarWidget.h | 14 +- src/mdictionary/qml/AboutWidget.qml | 9 - src/mdictionary/qml/Button.qml | 22 +- src/mdictionary/qml/Checkbox.qml | 28 ++- src/mdictionary/qml/ComboBox.qml | 19 +- src/mdictionary/qml/GoogleDialog.qml | 179 +++++++++++++- src/mdictionary/qml/MySpinBox.qml | 46 ++-- src/mdictionary/qml/MyTextLineEdit.qml | 67 +++++- src/mdictionary/qml/SearchBarWidget.qml | 17 +- src/mdictionary/qml/SettingsWidget.qml | 2 +- src/mdictionary/qml/TableWidget.qml | 371 +++++++++++++++++++---------- src/mdictionary/qml/WordListWidget.qml | 3 +- src/plugins/xdxf/XdxfDictSelectDialog.cpp | 55 ++++- src/plugins/xdxf/XdxfDictSelectDialog.h | 7 + src/plugins/xdxf/xdxf.pro | 4 +- 30 files changed, 745 insertions(+), 206 deletions(-) create mode 100644 data/button/checkboxCheckedDis.png create mode 100644 data/button/checkboxDis.png create mode 100644 data/button/down_enable2.png create mode 100644 data/button/up_enable2.png diff --git a/data/button/buttonCenterDisabled.png b/data/button/buttonCenterDisabled.png index 262138178b2ebdf871d2d0705a0a5f0f29039c3c..58203c003da001c492303d2abb18eb031c519b1b 100644 GIT binary patch delta 1215 zcmV;w1VH=o36TnrVt*evoyM9$000D$Nkl~a+^z`%{F8sLX=jR_q1SD~V zbbtKyH!fB9^Dn>RQkQ=E{m*L^PQoC3h8mc>K2g zS_B~PlmJ8oYmCVEKm4@&I;P=nHrBrcNcZ9K5hE0mgeHq~h0dC~D{B^1UWg#P5?npR zeR+8~jkww#RsgEHwU9W!51VTULUpC^^Xuy=3xY;%C@g@c_Li!8+NI%ILE)SCFwy6^ zyvL`s4_)Gg!hgQ){*dWM?o#FXH9P>Q&9F88E{^GF`^}U>ZQGfm#A>+6~-8-E@dy5&M3`5DPTyVN=a*YA)aR% zBS>G*Gk_{+nhGn6EZk8zO;a%?Kjcy`yD7%5g&}5{z<>O?T%lE2k|F#U!B$S&P!&;1 z81eA|HyPL>+?<@gmX!VL#ErN~-V~CAPY+(nR(R5e>x&8}Kf#EBQWx?_`87Xm2Lt(* zP$rj79yEliE@b|I(mrj;y`bQf08~+wNLGZkeXmTrCijR_RWSZzE$98XbNz@+u|s0? za4lf4qkp=}`E+67y%psO*F;jMwoauBN>=xM0+HVzrR@;bDXM6 zOKb5S2}vvyXigwwU8*t4n-~nNwZ|;%&D#x_hDYT$Be$qrAKQJrGg*~JzOo`)e_w!iSVuC6PgP?Z?fN8hTl!7sCh%IYqzhu zvVW*xBSR^#s^iB9goMIX1KT(;_H?)Kh=uFC$kiJIJ)NjfTjU@z#srjBiultCjbKql z5uv&szJ?3*5_JpZV1;|Q6$a_Eu)6*+%};BW5-Vp0&7K4R#V){Vj2XLzA_+8{+tIEo zmFEGZ%57W*b`C5J+Pyf*n!N-^yL8o47JrOG=?yJ1HxvW{hfxMH@9f_?(ZgJ-*`S1R zt|uT|4_~$rI@4O#R~-(TP3vnYXqeGX%xs2HTj_;{D=bZVx)h$8az8jbRN>}4jWMRH z!foESn)obStf8}}JhwO?iTVqb1~<;Shxn^KDG#DF<~Qz}2X`&CIe+Ia z+xR3Khd%~&3;=zMqmg4{gSJJ&XD2g7 zmxfUgaPL-hMWM%N;4D&%FK^TChQ1e|77Bd~luAJ237?b_gsFG!;J`r{r!*!_*O=W9 z4ibdFZ9HF?uAi4-Tu(7@)9cGFN;oHx&3yl;+;!=H|Nc`=g3fmJ*G-{W;cuTlo^Ben dOSUb!e+AU9L*}=abO`_e002ovPDHLkV1oW(L8brz delta 1183 zcmV;Q1YrA-3h@b$Vt*hVjvQn<000DWNkl+Iay$s;Z7V6Rb5q|;bpxjmX(+}gUp|;BH z*I$0#y>z&SUhZJZo>H+^Uc$oyH4KjPL4;ghaH*I} z9ZrL$rL4$9xqmU`$$3hwab-1qS6H~=p@YULETQyK31Tl=i^O*-w{!K>{5nLL9Y7H@ zAx-I!nnot_iGkj?1YnToA=dIN)8b)VmH=iLSQ2}-?%&s`qIXi$W>mGG`Be;+}UmZ_Qe%Z*W{_R?E>Oy>VXOSMouNhXuLLM`W5Z!(d9#m#0COCi=`n zQ1gIWjbX2hw#?=};b0Eq_IWDg5tBO?qgP@G3J$=u#L$c|6)y3#x%UVk9FwkrRU|zU^M6)9O=Q=}r8H$I)wa!lS*rg1-0mw` zFt9!!UQsLPa@?3SazPtAZs-<;YlBrU!0ln}wT)?7hz;aEaaA8z^um$S0Z;%;p#Qug zaYh2r6b*m?s=#Hxk$fwN)Z!l0RU3@Ghb!?YK)h>huzOM6htMtdR8<0;#hR#4ir7TP<| z(5Guc$TV?*(&f@7Peb9Q?`)(74_hv4p_sF>WerNeh#u&-qsVAx08J0M*)ngnc_W5C zaaQ4I!>WZcOZ{A|f#r#XqD*vx=GBD>lYdM&5Hw{s8#&Ix(t(C5EFGaw;fd^RZ|p3x zO?`PkYn*s`OTk8?94Qy2y-lI>#$g$!gi15KcImWOc)YuQO=13-O+4GmGwxt_JW!;? zG)*H}u-%uwO#_KvV8Bp?CF0uKgnKj1#G7AH>H$sj*%U8M-e>N$t5KMH;9`Z%m48b~ zVb_|5$A4fNiBcwYEWBSTbx+rainTq3WNmZhR=*TX&0GCFL=7SSQz_c6mU;IL5cViM znOPnd^ZFo~3lqQJ6=#uH3hEVM^=lL7)-MSt5B(+Hjc-7ho*(|Lg6(s|c@we!9KR;_ xWBC5>z8|VD2E3p!>zBO3uV21kd>E>U*LT^F8KS-G9dG~u002ovPDHLkV1l3sNFV?J diff --git a/data/button/buttonCenterPushed.png b/data/button/buttonCenterPushed.png index 58203c003da001c492303d2abb18eb031c519b1b..262138178b2ebdf871d2d0705a0a5f0f29039c3c 100644 GIT binary patch delta 1183 zcmV;Q1YrA-3h@b$Vt*hVjvQn<000DWNkl+Iay$s;Z7V6Rb5q|;bpxjmX(+}gUp|;BH z*I$0#y>z&SUhZJZo>H+^Uc$oyH4KjPL4;ghaH*I} z9ZrL$rL4$9xqmU`$$3hwab-1qS6H~=p@YULETQyK31Tl=i^O*-w{!K>{5nLL9Y7H@ zAx-I!nnot_iGkj?1YnToA=dIN)8b)VmH=iLSQ2}-?%&s`qIXi$W>mGG`Be;+}UmZ_Qe%Z*W{_R?E>Oy>VXOSMouNhXuLLM`W5Z!(d9#m#0COCi=`n zQ1gIWjbX2hw#?=};b0Eq_IWDg5tBO?qgP@G3J$=u#L$c|6)y3#x%UVk9FwkrRU|zU^M6)9O=Q=}r8H$I)wa!lS*rg1-0mw` zFt9!!UQsLPa@?3SazPtAZs-<;YlBrU!0ln}wT)?7hz;aEaaA8z^um$S0Z;%;p#Qug zaYh2r6b*m?s=#Hxk$fwN)Z!l0RU3@Ghb!?YK)h>huzOM6htMtdR8<0;#hR#4ir7TP<| z(5Guc$TV?*(&f@7Peb9Q?`)(74_hv4p_sF>WerNeh#u&-qsVAx08J0M*)ngnc_W5C zaaQ4I!>WZcOZ{A|f#r#XqD*vx=GBD>lYdM&5Hw{s8#&Ix(t(C5EFGaw;fd^RZ|p3x zO?`PkYn*s`OTk8?94Qy2y-lI>#$g$!gi15KcImWOc)YuQO=13-O+4GmGwxt_JW!;? zG)*H}u-%uwO#_KvV8Bp?CF0uKgnKj1#G7AH>H$sj*%U8M-e>N$t5KMH;9`Z%m48b~ zVb_|5$A4fNiBcwYEWBSTbx+rainTq3WNmZhR=*TX&0GCFL=7SSQz_c6mU;IL5cViM znOPnd^ZFo~3lqQJ6=#uH3hEVM^=lL7)-MSt5B(+Hjc-7ho*(|Lg6(s|c@we!9KR;_ xWBC5>z8|VD2E3p!>zBO3uV21kd>E>U*LT^F8KS-G9dG~u002ovPDHLkV1l3sNFV?J delta 1215 zcmV;w1VH=o36TnrVt*evoyM9$000D$Nkl~a+^z`%{F8sLX=jR_q1SD~V zbbtKyH!fB9^Dn>RQkQ=E{m*L^PQoC3h8mc>K2g zS_B~PlmJ8oYmCVEKm4@&I;P=nHrBrcNcZ9K5hE0mgeHq~h0dC~D{B^1UWg#P5?npR zeR+8~jkww#RsgEHwU9W!51VTULUpC^^Xuy=3xY;%C@g@c_Li!8+NI%ILE)SCFwy6^ zyvL`s4_)Gg!hgQ){*dWM?o#FXH9P>Q&9F88E{^GF`^}U>ZQGfm#A>+6~-8-E@dy5&M3`5DPTyVN=a*YA)aR% zBS>G*Gk_{+nhGn6EZk8zO;a%?Kjcy`yD7%5g&}5{z<>O?T%lE2k|F#U!B$S&P!&;1 z81eA|HyPL>+?<@gmX!VL#ErN~-V~CAPY+(nR(R5e>x&8}Kf#EBQWx?_`87Xm2Lt(* zP$rj79yEliE@b|I(mrj;y`bQf08~+wNLGZkeXmTrCijR_RWSZzE$98XbNz@+u|s0? za4lf4qkp=}`E+67y%psO*F;jMwoauBN>=xM0+HVzrR@;bDXM6 zOKb5S2}vvyXigwwU8*t4n-~nNwZ|;%&D#x_hDYT$Be$qrAKQJrGg*~JzOo`)e_w!iSVuC6PgP?Z?fN8hTl!7sCh%IYqzhu zvVW*xBSR^#s^iB9goMIX1KT(;_H?)Kh=uFC$kiJIJ)NjfTjU@z#srjBiultCjbKql z5uv&szJ?3*5_JpZV1;|Q6$a_Eu)6*+%};BW5-Vp0&7K4R#V){Vj2XLzA_+8{+tIEo zmFEGZ%57W*b`C5J+Pyf*n!N-^yL8o47JrOG=?yJ1HxvW{hfxMH@9f_?(ZgJ-*`S1R zt|uT|4_~$rI@4O#R~-(TP3vnYXqeGX%xs2HTj_;{D=bZVx)h$8az8jbRN>}4jWMRH z!foESn)obStf8}}JhwO?iTVqb1~<;Shxn^KDG#DF<~Qz}2X`&CIe+Ia z+xR3Khd%~&3;=zMqmg4{gSJJ&XD2g7 zmxfUgaPL-hMWM%N;4D&%FK^TChQ1e|77Bd~luAJ237?b_gsFG!;J`r{r!*!_*O=W9 z4ibdFZ9HF?uAi4-Tu(7@)9cGFN;oHx&3yl;+;!=H|Nc`=g3fmJ*G-{W;cuTlo^Ben dOSUb!e+AU9L*}=abO`_e002ovPDHLkV1oW(L8brz diff --git a/data/button/buttonLeftDisabled.png b/data/button/buttonLeftDisabled.png index ef89fb8c084905902005a93c8288ac1ac0a705db..976abd6cf34b2268b2cd2d9607fbae989dd0b6d0 100644 GIT binary patch delta 4440 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 mz~(X$<*&y)+*dVcEiFamcZ;&h@EcbMG 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 T4dl^L00000NkvXXu0mjfY{jYd delta 4180 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 T4dl^L00000NkvXXu0mjfY{jYd diff --git a/data/button/checkboxCheckedDis.png b/data/button/checkboxCheckedDis.png new file mode 100644 index 0000000000000000000000000000000000000000..33472af254258cf6102b36290c63acd43d6f1adc GIT binary patch literal 1958 zcmV;X2U+-uP)500001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipP) z3IZwILyB+!00$;XL_t(o!?jpTa~oL|{?2{0T58Fb+_v%}aWXR`6O&1%CJ>T9K~)Bd zfntCx*t44rJ2q_i18iUeRqUr&u!1TUP!z*sSPY3%lVtEv#KDQ2IF28ZEK6$j>)yjc zYDIDEI1h8Gr0Of(zUQm&ob#R2P1wa&R@atPs&HYb|ZvFN8>v z)EtiE_)L--3jl&(rIZb=^+GH5FUN6QzH#%DpPo7W#vc>_%+JridF|sH@73-t zox8vM5UH^sA~=qN-p2a1ptJb^FJKGX{3ew4a+T_(C^1;5-A9_F7laT$xO2C*C;{Nz z?_U1N{KB1YEU&EP<0OTY5=F0o&4>3th+A+AAF~mX$SDNkOHtQn4Wb zVEN(7nT^(FC5&Q7rJUzC#LHzy0e|)*s zYE6exOsTPOa}Eye--m9u6Yn*I*d%U{^u}Y8xBx(cV2nX8jPmtH^MFc{=0 z6ogXI!&G$=pMKnl_7X@t?)WRc^|vfr*Oj@IBc(%E#GnvTYY|0}tF+ct%T`$i9LGT+ z?;__opr;7Q3j#T7+2#NsGO-T;j#eH4>}?lC3>frcGY z0g%j0g8KOqh9T%BS!u@|->@lU>v3o7zmC-5lWNR>;9(LA049qGQD20*LGZ$G+HuEU z?bY8L&6BD8#KN|l2OzSpuB^2&@CRJ^f9 zB{t0sN-~l{rn|8+TE^A9f4$@s>(2v55D}4(L(yZl00EsO@Yloo8 z7k6VqN&%(RV_ z^>{Uruu@8legMGJ`PKoidNnWI<!KR$dZu#`By6_CAYoV zkvjBL;eNJG*?66#J3Z71l0i8)w*1VxA_-D!km&mp%*;eYj#h9S2ae;wb(|d!@ZHLS z7P>Vuhp0#8T)O)_YAvLKk^*utWCG&R{sQ&)dgxu4|N1aI~_eqSqA{ zFP#6m=j9h1)u&5q4bLmMZ-4Lm-yW+>csm_5=~h0?rbGb9D|hvI!6>B@-H%ASTrS@h z05CZ*G3z?20k*K#f`kMS;o{fcxpd^U;|F(Q$9F6L5+uT+F4TOt^2{M3BKp!h?|wa( z&mY!;Q1lA-eZTT&1pw2B5B*|ubMu&Ow!Ya5x{ykP!7!F_{PbIAOXZ2m-0Vkl+az<% zcPq8$VWU*8cxS)*_NAa3z{C;CW5oyirlx*-`qZi44+Z7Q)!FYXJy`zHYQ6E5cF<$D zP-Mq(D0_?n0o?yWe^TV9zJietJU%!6*_^*y0Ju>&0 zy3NkcexcrIzPG%(c4?*FETzVlNJuHA>;nOa*@%&sMYK%_n3-vi)I0!3)>>w3Ac?G( s&+-0hb+I}%`F?eB;{BPKncD#HKQ1y#APw$4lmGw#07*qoM6N<$f{f&@uK)l5 literal 0 HcmV?d00001 diff --git a/data/button/checkboxDis.png b/data/button/checkboxDis.png new file mode 100644 index 0000000000000000000000000000000000000000..a5b8e5ce37ef4faac286e770289cad24418d15ab GIT binary patch literal 1508 zcmV500001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipP) z3Ih)pRX)rB00m@8L_t(o!@XEdj~vw%J@?-Cs;j5F@$~deV{q&tQe?r{cn}a`I}wqb zL_radSW))bv0;}@Hu(eDBpZ;}BNnVcVgW*YBxDg_tY9KG9&1d4?eTa#Jzw3`)%EJV z%c8nwY%oRwcOR)rs!~U25_-up#WZ4>l3Gp`ZRg%ARL{ds0~ zF87DCEL(KB4*H*=leve4&IMADI&3xRNX};BJwO&28@KEQr zWZr%6{nMRJ=fxz=9$LGxVRw6d8fFe5g#DFNK|~;;Z?&eXLRG=cd)FmI1dUo%=YMoa z58Z#?>+QMOf1Lc;6CVJ8DIfaphaa6?x%By8Z*1)>etBgTnagiBJ)$T=C9*KW0P%N{ zvDTv1Y$6#X*xuenFG=8>gZCbr+q=|HE>e=FXR|DuKL6?e|Gs$Q;WrHcEH5uVa_)cU zpX+>i<%!Fy*O2=FB0>~J7;N1*m-Ke7;(K7_Huu=rTBX@OGjtv+oy*8weu|m@eChMf z7Xkp!{Qm6UmRBzQc6DvNnzzE>C*Pw$?b}gPP!j5vImH zje3^>VD;MC;@0*~GaY6SV_`&68tned4bwix0@cC#mA8Y-*8772wzhZLH#WMb_}?G= z=NH@C+w2I;W6(cQd{opX;5(qWwE zIfMy~dJS{!S@e3n;oT-fL`p>3cgaklKSd(sAz(Nh#>QIP4jN2QAc`VPRby152y_P_ z`5`cDG9hsQ5Lp8cDx?5vSXC_%QK<_o2HyLz5Ghf!Q{B={r9=>j`0H94LclO{7$=xG z6ftzOoU1Z`F!Cot2yo6J%QB4BH2Z0epk*l_7*(~3LcT)?7^Xv{l@ya;<3j+LK%=-Z zB2uN1yS(>Evkb{#fJwmn90b~{kOqLLDlrxDlBOwW5^miAZ7r*^a)WRLj5F} z44n~)vZ|X9LZ;Yna#R(;drZhUw`SQWn{Hitl<|{>0l-8=#Ih%Ps$nA8M8qi91pq@t z!UQUbFf%kv#u6e7Hs%&Gq3q^F1VmIuGc<%dc62|O3^R!LyG8@RgE)u?Bot|;WxW_9 z5ddH@5Mv4>Fu?#YTma>vBOMxd)UXuZC=LmX&wM(#BmIr5SdCGdo~7Pln^b6IOqt4+nf`oo`|zNa};8*9uM>#Pw(*6dDCPhVsJn4OtfiX+p7 z280kmTqyDBUq5x`$WM;mKZcQoe*V-mzo}HKhbz2h!KSx(CRnX7A|eG5fK)x-v{^*A zn;KP>MjgMFV{HgQHFyY7s8uU^u-*QmJvaMudv@mKg@uKS0Pq!9$8u@6$zdb_0000< KMNUMnLSTY8_N`n1 literal 0 HcmV?d00001 diff --git a/data/button/down_enable.png b/data/button/down_enable.png index 8cae7837ca15d8eb9c2a4c2d1c85d372f7e50609..0bbb98bb8ba7893890ecaeface25ad8df9d7c38f 100644 GIT binary patch delta 97 zcmdnZw3lguA$NO#Pl)UP|Nj{n7$({`vdHLexi|5Mr85&3m!N*g`Mm2uaV1X|#}JO| z$q6YbDGZDTybm2(9YlP@jx-obN=%sHz&C@1f#n&4%q;_EHK1w+Pgg&ebxsLQ079l7 APyhe` delta 95 zcmdnXw3}&yAzxR3Pl#()MhXK1!~g&PC)zZ!thBFBn0V0Aj**2^&qC{W(KMixtfz}( y2*>s01Q!N2HWjrwhYv73H!wJ0$y30P$i%?*he0)x-LDs@kipZ{&t;ucLK6W0ejUyL diff --git a/data/button/down_enable2.png b/data/button/down_enable2.png new file mode 100644 index 0000000000000000000000000000000000000000..44d756a0f8503bc37befc9e316b936801c57efb8 GIT binary patch literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^+(696!3-po-b^_Kq!^2X+?^QKos)S9A3uHi#Kgq(@83TI0|QY}(Sm{k8Qm@SK<+CE@(X5gcy=QV z#7XjYcVXyYmGuB}I14-?i-A5824O~qS#usi@64e1PG(fx!Vwo&ttMCI+@Y462dre!W1244$rjF6*2UngCPKX`285 literal 0 HcmV?d00001 diff --git a/data/button/up_enable.png b/data/button/up_enable.png index a82da534a2bd8c16e910310947b4e36f930b8e8d..63db5dd8b17a41ae067ab200e70ca20a02b64e14 100644 GIT binary patch delta 95 zcmdnXw3}&yA$NO#Pl)UP|Nj{n7$({`vdHLexi|5Mr6Us;mndJ&solLmaRpBo#}JO| y$q5XMZfq6_DJd>Vhb$D>rZ6u&pyDIt!OXzy#2|BR)8-hUS_V&7KbLh*2~7a>Ivv&k delta 97 zcmdnZw3lguAzxR3Pl#()MhXK1!~g&PC)zZ!thBFBn0V0Afsut%M?_1s<~vYI-qXb~ zgyVX00t2HPn?*uOic8WVi=LhWK4s-OhdUS;n71&fy1aU}8K{)O)78&qol`;+05td? AssI20 diff --git a/data/button/up_enable2.png b/data/button/up_enable2.png new file mode 100644 index 0000000000000000000000000000000000000000..0f8a4f49de7c73016b1bcd406845fc6d98caf488 GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^+(696!3-po-b^_Kq!^2X+?^QKos)S9A3uHi#Kgq(@83TI0|QY}(Sm{k8Qm@SK<+CE@(X5gcy=QV z#7XjYcVXyYmGuB}I14-?i-A5824O~qS#ubutton/up_enable.png button/down_enable.png button/revert.png + button/checkboxCheckedDis.png + button/checkboxDis.png diff --git a/src/include/ComboBoxModel.cpp b/src/include/ComboBoxModel.cpp index 56e5dfe..56963e1 100644 --- a/src/include/ComboBoxModel.cpp +++ b/src/include/ComboBoxModel.cpp @@ -34,7 +34,6 @@ ComboBoxModel::ComboBoxModel(QList contents, QObject *parent) : roles[ContentRole] = "content"; roles[NumberRole] = "number"; setRoleNames(roles); - setContents(contents); } diff --git a/src/mdictionary/gui/SearchBarWidget.cpp b/src/mdictionary/gui/SearchBarWidget.cpp index 9dc1450..338b87a 100644 --- a/src/mdictionary/gui/SearchBarWidget.cpp +++ b/src/mdictionary/gui/SearchBarWidget.cpp @@ -33,7 +33,13 @@ SearchBarWidget::SearchBarWidget(QWidget *parent) : QWidget(parent) { - qDebug()<<"test1"; + + completerModel = new QStringList; + lineEditCompleter = new QCompleter(this); + lineEditCompleter->setModel(new QStringListModel(*completerModel)); + lineEditCompleter->setCaseSensitivity(Qt::CaseInsensitive); + lineEditCompleter->setCompletionMode(QCompleter::InlineCompletion); + #ifndef Q_WS_MAEMO_5 this->setMaximumHeight(50); busyTimer=new QTimer; @@ -45,6 +51,8 @@ SearchBarWidget::SearchBarWidget(QWidget *parent) : QWidget(parent) { progressBar->hide(); view= new QDeclarativeView(); + ctxt = view->rootContext(); + view->setSource(QUrl::fromLocalFile("/usr/share/mdictionary/qml/SearchBarWidget.qml")); view->setResizeMode(QDeclarativeView::SizeRootObjectToView); view->setAlignment(Qt::AlignCenter); @@ -66,6 +74,12 @@ SearchBarWidget::SearchBarWidget(QWidget *parent) : QWidget(parent) { this, SIGNAL(historyPrev())); connect(rootObject, SIGNAL(historyShowToolButtonClicked()), this, SLOT(showHistoryButtonClicked())); + connect(rootObject, SIGNAL(textChange(QString)), + this, SLOT(textChange(QString))); + connect(rootObject, SIGNAL(nextCompleter()), + this, SLOT(nextCompleter())); + connect(rootObject, SIGNAL(prevCompleter()), + this, SLOT(prevCompleter())); connect(this, SIGNAL(progresSetMax(QVariant)), rootObject2, SLOT(setMax(QVariant))); @@ -89,6 +103,9 @@ SearchBarWidget::SearchBarWidget(QWidget *parent) : QWidget(parent) { connect(this, SIGNAL(setLineEditEnables(QVariant)), rootObject, SLOT(setEnableLineEdit(QVariant))); + connect(this, SIGNAL(setCompleterText(QVariant)), + rootObject, SLOT(setCompleterText(QVariant))); + connect(busyTimer, SIGNAL(timeout()), this, SLOT(updateBusyTimer())); @@ -96,7 +113,6 @@ SearchBarWidget::SearchBarWidget(QWidget *parent) : QWidget(parent) { emit setEnableHistoryShow(false); emit setEnableHistoryPrev(false); - completerModel = new QStringListModel(this); connect(&delayTimer, SIGNAL(timeout()), this, SLOT(delaySearchTimeout())); @@ -119,7 +135,6 @@ SearchBarWidget::SearchBarWidget(QWidget *parent) : QWidget(parent) { connect(&delayTimer, SIGNAL(timeout()), this, SLOT(delaySearchTimeout())); - searchWordLineEdit->setFocus(); #endif @@ -132,6 +147,71 @@ SearchBarWidget::~SearchBarWidget() { } +void SearchBarWidget::textChange(QString text){ + QLineEdit line; + QString toSend=""; + QString tempString; + actualString=text; + completerActualList.clear(); + + line.setCompleter(lineEditCompleter); + line.completer()->setCompletionPrefix(text); + for (int i = 0; lineEditCompleter->setCurrentRow(i); i++) + completerActualList.append(lineEditCompleter->currentCompletion()); + + completerActualList.sort(); + if(completerActualList.contains(preferedCompliter)){ + tempString = preferedCompliter; + toSend = tempString.remove(0,text.size()); + emit setCompleterText(toSend); + } + else if(completerActualList.size()>0 && text.size()>0){ + toSend = completerActualList.at(0); + preferedCompliter= toSend; + toSend=toSend.remove(0,text.size()); + if(toSend.size()>0) + emit setCompleterText(toSend); + else if(completerActualList.size()>1){ + toSend = completerActualList.at(1); + preferedCompliter= toSend; + toSend=toSend.remove(0,text.size()); + emit setCompleterText(toSend); + } + } + else{ + preferedCompliter=""; + emit setCompleterText(toSend); + } +} + +void SearchBarWidget::prevCompleter(){ + QString tempString; + if(!preferedCompliter.isEmpty()){ + int index = completerActualList.indexOf(preferedCompliter); + qDebug()<<"index"<index+1){ + preferedCompliter = completerActualList.at(index+1); + tempString=preferedCompliter; + QString toSend = tempString.remove(0,actualString.size()); + emit setCompleterText(toSend); + } + } +} + +void SearchBarWidget::nextCompleter(){ + QString tempString; + if(!preferedCompliter.isEmpty()){ + int index = completerActualList.indexOf(preferedCompliter); + if(index>0){ + preferedCompliter = completerActualList.at(index-1); + tempString=preferedCompliter; + QString toSend = tempString.remove(0,actualString.size()); + emit setCompleterText(toSend); + } + } +} + + QIcon SearchBarWidget::generateIcon(QIcon original, qreal rotation) { qDebug()<<"test2"; QPixmap p = original.pixmap(64); @@ -192,12 +272,6 @@ void SearchBarWidget::initializeUI() { searchWordLineEdit = new QLineEdit; searchWordLineEdit->setMinimumWidth(250); - completerModel = new QStringListModel(this); - - lineEditCompleter = new QCompleter(searchWordLineEdit); - lineEditCompleter->setModel(completerModel); - lineEditCompleter->setCaseSensitivity(Qt::CaseInsensitive); - lineEditCompleter->setCompletionMode(QCompleter::InlineCompletion); searchWordLineEdit->setCompleter(lineEditCompleter); #ifndef Q_WS_MAEMO_5 @@ -306,13 +380,14 @@ void SearchBarWidget::searchPushButtonClicked() { } void SearchBarWidget::search(QString word) { - qDebug()<<"test7"; - qDebug()<insertRow(completerModel->rowCount()); - QModelIndex index=completerModel->index(completerModel->rowCount() -1); - completerModel->setData(index, word); - + while(word.lastIndexOf(" ")==word.size()-1 && word.size()>0) + word=word.remove(word.size()-1,1); + if(!completerModel->contains(word)) + completerModel->append(word); + QAbstractItemModel *temp=lineEditCompleter->model(); + lineEditCompleter->setModel(new QStringListModel(*completerModel)); + delete temp; #ifndef Q_WS_MAEMO_5 emit setLineEditText(word); #else diff --git a/src/mdictionary/gui/SearchBarWidget.h b/src/mdictionary/gui/SearchBarWidget.h index 427eb53..0e84bee 100644 --- a/src/mdictionary/gui/SearchBarWidget.h +++ b/src/mdictionary/gui/SearchBarWidget.h @@ -60,6 +60,7 @@ Q_SIGNALS: void progresSetMin(QVariant); void progresSetValue(QVariant); void progresSetValue2(QVariant); + void setCompleterText(QVariant); //! Requests to search for a list of words matching a word passed as //! a parameter @@ -148,6 +149,11 @@ private Q_SLOTS: //! shows history void showHistoryButtonClicked(); + void textChange(QString text); + + void nextCompleter(); + + void prevCompleter(); private: @@ -156,10 +162,14 @@ private: QDeclarativeView *progressBar; QTimer *busyTimer; bool progressMax; + QDeclarativeContext *ctxt; + QStringList* completerModel; + QCompleter* lineEditCompleter; + QString preferedCompliter; + QString actualString; + QStringList completerActualList; QLineEdit* searchWordLineEdit; - QCompleter* lineEditCompleter; - QStringListModel* completerModel; QToolButton* clearSearchWordToolButton; QPushButton* searchPushButton; QToolButton* historyPrevToolButton; diff --git a/src/mdictionary/qml/AboutWidget.qml b/src/mdictionary/qml/AboutWidget.qml index a600d1b..92c6d07 100644 --- a/src/mdictionary/qml/AboutWidget.qml +++ b/src/mdictionary/qml/AboutWidget.qml @@ -52,13 +52,4 @@ Rectangle { anchors.horizontalCenterOffset: 0 onLinkActivated: linkClicked(link); } - - /* MySpinBox { - id: test01 - y:20; - x:20; - width: 40 - height: 20; - } - */ } diff --git a/src/mdictionary/qml/Button.qml b/src/mdictionary/qml/Button.qml index 831e007..dd94a40 100644 --- a/src/mdictionary/qml/Button.qml +++ b/src/mdictionary/qml/Button.qml @@ -3,8 +3,14 @@ import Qt 4.7 BorderImage { id: button property alias textInButton: buttonText.text - signal clicked - opacity: 1 + property bool checkable: false + property bool checked: false + + height: 20; + width: 60; + + signal clicked; + signal changeCheck; function setText(string) { textInButton = qsTr(string); } function press() { mouseArea.pressed } @@ -17,13 +23,19 @@ BorderImage { height: parent.height; onClicked: { button.clicked(); + if(checkable){ + button.checked=!button.checked; + button.changeCheck(); + } } } Text { z:1 id: buttonText + width: parent.width; anchors.centerIn: parent; + horizontalAlignment: Text.AlignHCenter font.pixelSize: parent.height * .5 elide: Text.ElideRight; style: Text.Sunken; color: "white"; styleColor: "black"; smooth: true @@ -31,7 +43,7 @@ BorderImage { Image { id: image1 - width: (35*parent.height)/107 +1 + width: (image1.sourceSize.width*parent.height)/image1.sourceSize.height +1 //(35*parent.height)/107 +1 height: parent.height anchors.left: parent.left source: "qrc:/button/buttonLeft.png" @@ -54,7 +66,7 @@ BorderImage { Image { id: image2 smooth: true - width: (35*parent.height)/107 +1 + width: (image1.sourceSize.width*parent.height)/image1.sourceSize.height +1//(35*parent.height)/107 +1 height: parent.height anchors.right: parent.right source: "qrc:/button/buttonR.png" @@ -64,7 +76,7 @@ BorderImage { states: [ State { name: "pressed"; - when: (mouseArea.pressed == true && button.enabled == true); + when: ((button.enabled) && (mouseArea.pressed || (button.checkable && button.checked) ) ) PropertyChanges { target: image1; source: "qrc:/button/buttonLeftPushed.png" } PropertyChanges { target: image3; source: "qrc:/button/buttonCenterPushed.png" } diff --git a/src/mdictionary/qml/Checkbox.qml b/src/mdictionary/qml/Checkbox.qml index 3ef0fc3..7e96512 100644 --- a/src/mdictionary/qml/Checkbox.qml +++ b/src/mdictionary/qml/Checkbox.qml @@ -29,6 +29,8 @@ Image { property bool selected property string pathToCheckedImage: "qrc:/button/checkboxChecked.png" property string pathToUncheckedImage: "qrc:/button/checkbox.png" + property string pathToCheckedDicImage: "qrc:/button/checkboxCheckedDis.png" + property string pathToUncheckedDicImage: "qrc:/button/checkboxDis.png" signal changed height: { var aspectRatio = sourceSize.height / sourceSize.width @@ -38,24 +40,38 @@ Image { smooth: true states: [ State { - name: "checked"; - when: (checkbox.selected == true); + name: "checkeEn"; + when: (checkbox.selected && checkbox.enabled); PropertyChanges { target: checkbox; source: pathToCheckedImage } }, State { - name: "unchecked"; - when: (checkbox.selected == false); + name: "uncheckeEn"; + when: ( !checkbox.selected && checkbox.enabled); PropertyChanges { target: checkbox; source: pathToUncheckedImage } + }, + State { + name: "checkeDi"; + when: (checkbox.selected && !checkbox.enabled); + + PropertyChanges { target: checkbox; source: pathToCheckedDicImage } + }, + State { + name: "uncheckeDi"; + when: ( !checkbox.selected && !checkbox.enabled); + + PropertyChanges { target: checkbox; source: pathToUncheckedDicImage } } ] MouseArea{ id: area anchors.fill: parent onClicked: { - checkbox.selected = !checkbox.selected - changed() + if(checkbox.enabled){ + checkbox.selected = !checkbox.selected + changed() + } } } } diff --git a/src/mdictionary/qml/ComboBox.qml b/src/mdictionary/qml/ComboBox.qml index b863e3c..b20aa0f 100644 --- a/src/mdictionary/qml/ComboBox.qml +++ b/src/mdictionary/qml/ComboBox.qml @@ -12,7 +12,9 @@ Rectangle { property int expandedHeight property int basicHeight property string startValue - height: basicHeight + height: 20 + + property variant parentField : rectangle1 function show(Boolean){ expanded = Boolean @@ -77,9 +79,7 @@ Rectangle { ElementsListView{ id: list1 - width: parent.width visible: false - z: 0 property string selected: rectangle1.startValue function selectedValue(nr, value) { @@ -88,10 +88,13 @@ Rectangle { rectangle1.show(false) } - anchors.left: parent.left - anchors.verticalCenter: parent.verticalCenter - highlightResizeSpeed: 1000 + anchors.rightMargin: 5 + anchors.leftMargin: 5 + anchors.bottomMargin: 10 + anchors.topMargin: 10 + anchors.fill: parent + highlightResizeSpeed: 1000 delegate: Component{ id: list1Delegate Item { @@ -118,6 +121,7 @@ Rectangle { id: contentText anchors.verticalCenter: parent.verticalCenter anchors.leftMargin: 5 + elide: Text.ElideRight; text: content } } @@ -142,10 +146,11 @@ Rectangle { when: (rectangle1.expanded == true && rectangle1.disabled == false) PropertyChanges { target: list1; z: 10; visible: true } PropertyChanges { target: text1; z: 10; visible: false } - PropertyChanges { target: rectangle1; border.width: 0} + PropertyChanges { target: rectangle1; border.width: 1} PropertyChanges { target: rectangle1; height: rectangle1.expandedHeight} PropertyChanges { target: imageDown; height: 0.5 * rectangle1.basicHeight} PropertyChanges { target: shadeDisable; visible: false; z: -1} + PropertyChanges { target: rectangle1; anchors.fill: parentField} }, State { name: "disabled"; diff --git a/src/mdictionary/qml/GoogleDialog.qml b/src/mdictionary/qml/GoogleDialog.qml index 13e9526..d27cec6 100644 --- a/src/mdictionary/qml/GoogleDialog.qml +++ b/src/mdictionary/qml/GoogleDialog.qml @@ -26,12 +26,185 @@ Rectangle{ signal saveButtonClicked(string langFrom, string langTo); + + id:rectangle1 height: infoLabel.height + fromLabel.height + toLabel.height + saveButton.height + 50 width: 200 + color : myPalette.window; - id:rectangle1 + SystemPalette { + id: myPalette; + colorGroup:SystemPalette.Active + } + + Item { + id: comboField + anchors.bottomMargin: 6 + anchors.rightMargin: 0 + anchors.left: fromLabel.right + anchors.right: revertButton.left + anchors.bottom: saveButton.top + anchors.top: parent.top + anchors.leftMargin: 2 + z:2; + } + + Text { + id: infoLabel + height: paintedHeight+5; + anchors.right: parent.right + anchors.left: parent.left + anchors.top: parent.top + wrapMode: Text.Wrap; + transformOrigin: Item.Left + font.pixelSize: 12 + } + + + Text { + id: fromLabel + text: qsTr("From: ") + height: paintedHeight+5; + anchors.top: infoLabel.bottom + anchors.left: parent.left + wrapMode: Text.Wrap; + transformOrigin: Item.Left + font.pixelSize: 12 + } + + Text { + id: toLabel + text: qsTr("To: ") + anchors.topMargin: 3 + height: paintedHeight+5; + anchors.top: fromLabel.bottom + anchors.left: parent.left + wrapMode: Text.Wrap; + transformOrigin: Item.Left + font.pixelSize: 12 + } + + ComboBox{ + id: comboFrom + model: comboBoxModel + anchors.right: revertButton.left + anchors.rightMargin: 5 + anchors.left: fromLabel.right + anchors.leftMargin: 10 + anchors.verticalCenter: fromLabel.verticalCenter + + parentField: comboField + expanded: false + basicHeight: fromLabel.height + onExpandedChanged: { + if(expanded==true) + z=2; + else + z=0; + } + } + + ComboBox{ + id: comboTo + model: comboBoxModel + anchors.right: revertButton.left + anchors.rightMargin: 5 + anchors.left: fromLabel.right + anchors.leftMargin: 10 + anchors.verticalCenter: toLabel.verticalCenter + + parentField: comboField; + expanded: false + basicHeight: fromLabel.height + + onExpandedChanged: { + if(expanded==true) + z=2; + else + z=0; + } + } + + IconButton{ + id: revertButton + width: height + height: fromLabel.height + anchors.top: fromLabel.bottom + anchors.topMargin: -8 + anchors.right: parent.right + pathToIcon: "qrc:/button/revert.png" + onClicked: { rectangle1.revertLang() } + } + + Button { + id: saveButton + height: 30 + anchors.bottom: parent.bottom + anchors.right: parent.right + anchors.left: parent.left + onClicked: { + rectangle1.saveButtonClicked(comboFrom.value, comboTo.value); + } + } + + MouseArea { + id: mouse_area1 + anchors.fill: parent + z:-1 + onClicked: { + comboTo.expanded=false; + comboFrom.expanded=false; + } + } + + + + states: [ + State { + name: "new" + when: newPlugin==true + PropertyChanges { target: saveButton; textInButton: qsTr("Add") } + }, + State { + name: "edit" + when: newPlugin==false + PropertyChanges { target: saveButton; textInButton: qsTr("Save settings") } + } + ] +} + + +/* +Rectangle{ + property bool newPlugin:false; + + function setInfo(string){ + infoLabel.text = string; + } + function setStartValues(startFrom, startTo, startFromIndex, startToIndex){ + comboFrom.setStartValue(startFrom, startFromIndex) + comboTo.setStartValue(startTo, startToIndex) + } + function revertLang(){ + var tmpidx = comboFrom.index + comboFrom.index = comboTo.index + comboTo.index = tmpidx + var tmpval = comboFrom.value + comboFrom.value = comboTo.value + comboTo.value = tmpval + } + function setNew(bool){ + newPlugin=bool; + } + + signal saveButtonClicked(string langFrom, string langTo); + + + id:rectangle1 + height: infoLabel.height + fromLabel.height + toLabel.height + saveButton.height + 50 + width: 200 SystemPalette { id: myPalette; colorGroup: SystemPalette.Active } color : myPalette.window; @@ -72,6 +245,8 @@ Rectangle{ } ComboBox{ + //parentField: rectangle1 + id: comboFrom model: comboBoxModel anchors.left: parent.left @@ -96,6 +271,7 @@ Rectangle{ } ComboBox{ + //parentField: rectangle1; id: comboTo model: comboBoxModel anchors.left: parent.left @@ -155,4 +331,5 @@ Rectangle{ } ] } +*/ diff --git a/src/mdictionary/qml/MySpinBox.qml b/src/mdictionary/qml/MySpinBox.qml index 9f0d47c..54fe47d 100644 --- a/src/mdictionary/qml/MySpinBox.qml +++ b/src/mdictionary/qml/MySpinBox.qml @@ -7,16 +7,22 @@ Rectangle { property int maxValue:500; property int minValue:0; property alias value:text_input1.text + property bool isTextInMinValue:true; + property string textInMinValue:"inf"; + property int singleStep: 2; signal valueChange(int intiger); function stringToInt(string){ var value=0; var pow10=1; - for (var i=string.length-1;i>=0;i--){ - value+=(string.charCodeAt(i)-48)*pow10; - pow10= pow10*10; - } + if(isTextInMinValue && textInMinValue==string) + value=minValue; + else + for (var i=string.length-1;i>=0;i--){ + value+=(string.charCodeAt(i)-48)*pow10; + pow10= pow10*10; + } if(value>maxValue) return maxValue; if(valuemaxValue)?(maxValue):(stringToInt(text_input1.text)+1); + text_input1.text=((stringToInt(text_input1.text)+singleStep)>maxValue)?(maxValue):(stringToInt(text_input1.text)+singleStep); else running=false; } @@ -62,8 +73,11 @@ Rectangle { running: false; repeat: true onTriggered:{ - if(mouseAreaDown.pressedButtons==Qt.LeftButton) - text_input1.text=((stringToInt(text_input1.text)-1)maxValue)?(maxValue):(stringToInt(text_input1.text)+1); + onClicked: text_input1.text=((stringToInt(text_input1.text)+singleStep)>maxValue)?(maxValue):(stringToInt(text_input1.text)+singleStep); onPressAndHold:{ timerUp.restart; timerUp.running=true; @@ -124,19 +138,15 @@ Rectangle { height: rectangle1.height/2; anchors.right: parent.right anchors.bottom: parent.bottom - onClicked: text_input1.text=((stringToInt(text_input1.text)-1)0) + text_input1.text=text_input1.text+completerItemText.text.charAt(0); + } + + function addAllChars(){ + text_input1.text=text_input1.text+completerItemText.text; + completerItemText.text=""; + } TextInput { id: text_input1 @@ -19,11 +36,57 @@ Rectangle { anchors.centerIn: parent selectByMouse: true; font.pixelSize: rectangle1.height * .5; - onCursorPositionChanged: moveCursorSelection(cursorPosition); + onCursorPositionChanged: { + moveCursorSelection(cursorPosition); + if(cursorPosition==text.length && useCompleter) + completerItem.visible=true; + else + completerItem.visible=false; + } focus: rectangle1.focus; + Keys.priority : Keys.AfterItem Keys.onPressed: { - if ((event.key == Qt.Key_Enter) || (event.key == Qt.Key_Return)) + if ((event.key == Qt.Key_Enter) || (event.key == Qt.Key_Return)){ rectangle1.enterPressed(text_input1.text) + completerItem.visible=false; + } + if(useCompleter){ + if (event.key == Qt.Key_Up) + rectangle1.nextCompleter(); + if (event.key == Qt.Key_Down) + rectangle1.prevCompleter(); + if ((event.key == Qt.Key_Right) && (cursorPosition==text.length)) + addOneChar(); + if(Qt.ControlModifier){ + if (event.key == Qt.Key_Space){ + if(completerItem.visible=false) + completerItem.visible=true + else + addAllChars() + } + } + if(event.key == Qt.Key_Escape) + completerItem.visible=false; + } + } + onTextChanged: rectangle1.textChange(text); + } + + + Rectangle { + id: completerItem + x: text_input1.x + text_input1.positionToRectangle(text_input1.cursorPosition).x +1 + y: text_input1.y + width: completerItemText.paintedWidth; + visible: false; + height: text_input1.height + color: (completerItemText.text.length>0)?"#5e71fb":"#FFFFFF" + opacity: 0.5 + Text { + id: completerItemText + anchors.fill: parent + text:"" + font.pixelSize: text_input1.font.pixelSize; } } diff --git a/src/mdictionary/qml/SearchBarWidget.qml b/src/mdictionary/qml/SearchBarWidget.qml index 689480d..2210de8 100644 --- a/src/mdictionary/qml/SearchBarWidget.qml +++ b/src/mdictionary/qml/SearchBarWidget.qml @@ -12,13 +12,19 @@ Rectangle { function setEnableHistoryNext(Boolean) { historyNextToolButton.enabled = Boolean } function setEnableHistoryShow(Boolean) { historyShowToolButton.enabled = Boolean } function setEnableLineEdit(Boolean) { enableLineEdit = Boolean } - function setLineEditText(string) { inputSearchText.setText(string) } function clear() { inputSearchText.setText("") } + function setLineEditText(string) { inputSearchText.setText(string) } + function setCompleterText(string) { inputSearchText.setCompleter(string) } + signal searchButtonClicked(string text); signal historyNextToolButtonClicked; signal historyShowToolButtonClicked; signal historyPrevToolButtonClicked; + signal textChange(string text); + + signal nextCompleter(); + signal prevCompleter(); MyTextLineEdit{ id: inputSearchText @@ -28,6 +34,7 @@ Rectangle { anchors.verticalCenter: parent.verticalCenter onEnterPressed: searchBarWidget.searchButtonClicked(text); focus: searchBarWidget.focus + useCompleter: true; IconButton { id: clearButton; width: inputSearchText.height-6; @@ -39,6 +46,9 @@ Rectangle { pathToIcon: "qrc:/button/go-clear.png"; onClicked: clear(); } + onTextChange: searchBarWidget.textChange(text) + onNextCompleter: searchBarWidget.nextCompleter(); + onPrevCompleter: searchBarWidget.prevCompleter(); } Item { @@ -56,7 +66,10 @@ Rectangle { anchors.right: historyPrevToolButton.left anchors.verticalCenter: parent.verticalCenter textInButton: qsTr("Search") - onClicked: searchBarWidget.searchButtonClicked(inputSearchText.textInLineEdit); + onClicked:{ + searchBarWidget.searchButtonClicked(inputSearchText.textInLineEdit); + inputSearchText.hideCompleter(); + } } IconButton { diff --git a/src/mdictionary/qml/SettingsWidget.qml b/src/mdictionary/qml/SettingsWidget.qml index 74d3a9f..b51f788 100644 --- a/src/mdictionary/qml/SettingsWidget.qml +++ b/src/mdictionary/qml/SettingsWidget.qml @@ -149,6 +149,6 @@ Rectangle { anchors.right: parent.right anchors.rightMargin: 5 textInButton: qsTr("Save") - onClicked: rectangle1.saveButtonClicked(); + //onClicked: rectangle1.saveButtonClicked(); } } diff --git a/src/mdictionary/qml/TableWidget.qml b/src/mdictionary/qml/TableWidget.qml index c07d8a5..5957c85 100644 --- a/src/mdictionary/qml/TableWidget.qml +++ b/src/mdictionary/qml/TableWidget.qml @@ -10,160 +10,273 @@ Rectangle { anchors.fill: parent signal dictLink(string link); + signal fromChange(string value); + signal toChange(string value) - ScrollBar2 { - id: horizontalScrollBar1 - z:2; - width: parent.width-12; - windowHeight: parent.height - anchors.left: parent.left - orientation: Qt.Horizontal - position: 100 + + function setFromStartValues(startFrom, startTo, startFromIndex, startToIndex){ + comboFrom.setStartValue(startFrom, startFromIndex) + comboTo.setStartValue(startTo, startToIndex) + } + + function setToStartValues(startFrom, startTo, startFromIndex, startToIndex){ + comboFrom.setStartValue(startFrom, startFromIndex) + comboTo.setStartValue(startTo, startToIndex) } - ScrollBar2 { - id: horizontalScrollBar2 - z:2; - width: parent.width-12; - windowHeight: parent.height - anchors.left: horizontalScrollBar1.left - anchors.leftMargin: horizontalScrollBar1.position - orientation: Qt.Horizontal - position: 100 + + MouseArea { + id: mouse_area1 + anchors.fill: parent + z:-1 + onClicked: { + comboTo.expanded=false; + comboFrom.expanded=false; + } } - ScrollBar2 { - id: horizontalScrollBar3 - z:2; - width: parent.width-12; - windowHeight: parent.height - anchors.left: horizontalScrollBar2.left - anchors.leftMargin: horizontalScrollBar2.position - orientation: Qt.Horizontal - position: 100 + + ComboBox { + id: comboFrom + model: fromModell + anchors.right: comboFromField.right + anchors.left: comboFromField.left + parentField: comboFromField + expanded: false + height: 20 + basicHeight:20 + index: 1 + onExpandedChanged: { + if(expanded==true){ + z=2; + mouse_area1.z=1; + } + else{ + z=0; + mouse_area1.z=-1; + } + } + onValueSelected: rectangle1.fromChange(value) } - ElementsListView{ - id: dictList - width: rectangle1.width + ComboBox { + id: comboTo + model: fromModell + anchors.right: comboToField.right + anchors.left: comboToField.left + parentField: comboToField + expanded: false + height: 20 + basicHeight:20 + index: 1 + onExpandedChanged: { + if(expanded==true){ + z=2; + mouse_area1.z=1; + } + else{ + z=0; + mouse_area1.z=-1; + } + } + onValueSelected: rectangle1.toChange(value) + } + + Item { + id: comboFromField + width: 120 + anchors.left: fromLabel.right + anchors.leftMargin: 5 + anchors.bottom: parent.bottom + anchors.bottomMargin: 10 anchors.top: parent.top + } + + Item { + id: comboToField + width: 120 + anchors.left: toLabel.right + anchors.leftMargin: 5 anchors.bottom: parent.bottom - highlightResizeSpeed: 1000 - - header: Component{ - id: dictListHeader - Item { - width: rectangle1.width - height: 20 - Row { - anchors.fill: parent - Rectangle { - id: fromRecHeader - width: horizontalScrollBar1.position - height: parent.height - radius: 1 - gradient: Gradient { GradientStop { position: 0.3; color: "#a0cbec" } GradientStop { position: 0.99; color: "#35a0f1" } } + anchors.bottomMargin: 10 + anchors.top: parent.top + } - Text { - id: fromTextHeader - text: qsTr("From"); - elide: Text.ElideRight - font.pixelSize: 12 - anchors.centerIn: parent + Text { + id: fromLabel + text: qsTr("From: "); + anchors.top: parent.top + anchors.topMargin: 3 + font.pixelSize: 12 + } + + Text { + id: toLabel + text: qsTr("To: "); + anchors.left: comboFrom.right + anchors.leftMargin: 15 + anchors.verticalCenterOffset: 0 + anchors.verticalCenter: fromLabel.verticalCenter + font.pixelSize: 12 + } + + Item { + id: item1 + anchors.topMargin: 30 + anchors.fill: parent + ScrollBar2 { + id: horizontalScrollBar1 + z:2; + width: parent.width-12; + windowHeight: parent.height + anchors.left: parent.left + orientation: Qt.Horizontal + position: 100 + } + ScrollBar2 { + id: horizontalScrollBar2 + z:2; + width: parent.width-12; + windowHeight: parent.height + anchors.left: horizontalScrollBar1.left + anchors.leftMargin: horizontalScrollBar1.position + orientation: Qt.Horizontal + position: 100 + } + ScrollBar2 { + id: horizontalScrollBar3 + z:2; + width: parent.width-12; + windowHeight: parent.height + anchors.left: horizontalScrollBar2.left + anchors.leftMargin: horizontalScrollBar2.position + orientation: Qt.Horizontal + position: 100 + } + + ElementsListView{ + id: dictList + width: rectangle1.width + anchors.topMargin: 0 + anchors.top: parent.top + anchors.bottom: parent.bottom + highlightResizeSpeed: 1000 + + header: Component{ + id: dictListHeader + Item { + width: rectangle1.width + height: 20 + Row { + anchors.fill: parent + Rectangle { + id: fromRecHeader + width: horizontalScrollBar1.position + height: parent.height + radius: 1 + gradient: Gradient { GradientStop { position: 0.3; color: "#a0cbec" } GradientStop { position: 0.99; color: "#35a0f1" } } + + Text { + id: fromTextHeader + text: qsTr("From"); + elide: Text.ElideRight + font.pixelSize: 12 + anchors.centerIn: parent + } } - } - Rectangle { - id: toRecHeader - width: horizontalScrollBar2.position - height: parent.height - radius: 1 - gradient: Gradient { GradientStop { position: 0.3; color: "#a0cbec" } GradientStop { position: 0.99; color: "#35a0f1" } } + Rectangle { + id: toRecHeader + width: horizontalScrollBar2.position + height: parent.height + radius: 1 + gradient: Gradient { GradientStop { position: 0.3; color: "#a0cbec" } GradientStop { position: 0.99; color: "#35a0f1" } } - Text { - id: toTextHeader - text: qsTr("To"); - elide: Text.ElideRight - font.pixelSize: 12 - anchors.centerIn: parent + Text { + id: toTextHeader + text: qsTr("To"); + elide: Text.ElideRight + font.pixelSize: 12 + anchors.centerIn: parent + } } - } - Rectangle { - id: nameRecHeader - width: horizontalScrollBar3.position - height: parent.height - radius: 1 - gradient: Gradient { GradientStop { position: 0.3; color: "#a0cbec" } GradientStop { position: 0.99; color: "#35a0f1" } } + Rectangle { + id: nameRecHeader + width: horizontalScrollBar3.position + height: parent.height + radius: 1 + gradient: Gradient { GradientStop { position: 0.3; color: "#a0cbec" } GradientStop { position: 0.99; color: "#35a0f1" } } - Text { - id: nameTextHeader - text: qsTr("Title"); - elide: Text.ElideRight - font.pixelSize: 12 - anchors.centerIn: parent + Text { + id: nameTextHeader + text: qsTr("Title"); + elide: Text.ElideRight + font.pixelSize: 12 + anchors.centerIn: parent + } } - } - Rectangle { - id: sizeRecHeader - width: 100; - height: parent.height - radius: 1 - gradient: Gradient { GradientStop { position: 0.3; color: "#a0cbec" } GradientStop { position: 0.99; color: "#35a0f1" } } + Rectangle { + id: sizeRecHeader + width: 100; + height: parent.height + radius: 1 + gradient: Gradient { GradientStop { position: 0.3; color: "#a0cbec" } GradientStop { position: 0.99; color: "#35a0f1" } } - Text { - id: sizeTextHeader - text: qsTr("Size"); - elide: Text.ElideRight - font.pixelSize: 12 - anchors.centerIn: parent + Text { + id: sizeTextHeader + text: qsTr("Size"); + elide: Text.ElideRight + font.pixelSize: 12 + anchors.centerIn: parent + } } } } } - } - delegate: Component{ - id: dictListDelegate - Item { - width: rectangle1.width - height:nameText.height - MouseArea{ - anchors.fill: parent - onClicked: { - dictList.currentIndex = index - } - onDoubleClicked: { - rectangle1.dictLink(link) - } - } - Row { - anchors.fill: parent - Text { - id: fromText - text: " "+from+" "; - width: horizontalScrollBar1.position - elide: Text.ElideRight + delegate: Component{ + id: dictListDelegate + Item { + width: rectangle1.width + height:nameText.height + MouseArea{ + anchors.fill: parent + onClicked: { + dictList.currentIndex = index + } + onDoubleClicked: { + rectangle1.dictLink(link) + } } + Row { + anchors.fill: parent + Text { + id: fromText + text: " "+from+" "; + width: horizontalScrollBar1.position + elide: Text.ElideRight + } - Text { - id: toText - text: " "+to+" "; - width: horizontalScrollBar2.position - elide: Text.ElideRight - } + Text { + id: toText + text: " "+to+" "; + width: horizontalScrollBar2.position + elide: Text.ElideRight + } - Text { - id: nameText - text: " "+name+" "; - width: horizontalScrollBar3.position - elide: Text.ElideRight - } - Text { - id: sizeText - text: " "+size+" "; - width: 100 - elide: Text.ElideRight + Text { + id: nameText + text: " "+name+" "; + width: horizontalScrollBar3.position + elide: Text.ElideRight + } + Text { + id: sizeText + text: " "+size+" "; + width: 100 + elide: Text.ElideRight + } } } } + model: dictModel } - model: dictModel } } diff --git a/src/mdictionary/qml/WordListWidget.qml b/src/mdictionary/qml/WordListWidget.qml index 07cf206..288cbaf 100644 --- a/src/mdictionary/qml/WordListWidget.qml +++ b/src/mdictionary/qml/WordListWidget.qml @@ -91,7 +91,8 @@ Rectangle { pathToUncheckedImage: UncheckedPath anchors.right: parent.right anchors.rightMargin: 5 - + pathToCheckedDicImage: CheckedPath + pathToUncheckedDicImage: UncheckedPath anchors.verticalCenter: parent.verticalCenter onChanged: rectangle1.changeWordState(number, selected) visible: { diff --git a/src/plugins/xdxf/XdxfDictSelectDialog.cpp b/src/plugins/xdxf/XdxfDictSelectDialog.cpp index d1575e4..42c1ca8 100644 --- a/src/plugins/xdxf/XdxfDictSelectDialog.cpp +++ b/src/plugins/xdxf/XdxfDictSelectDialog.cpp @@ -32,9 +32,7 @@ XdxfDictSelectDialog::XdxfDictSelectDialog(QList dicts, QWidget *parent) : QDialog(parent) { - setWindowTitle(tr("Select dictionary")); - //here removing already added dictionary for (int i = 0; i < dicts.size(); i++){ if(QFile::exists(QDir::homePath() + "/.mdictionary/" + dicts[i].title() + ".xdxf")){ @@ -46,11 +44,37 @@ XdxfDictSelectDialog::XdxfDictSelectDialog(QList dicts, #ifndef Q_WS_MAEMO_5 model2 = new DictsListModel(dicts, this); proxyModel2 = new DictsProxyListModel; - proxyModel2->setSourceModel(model2); - proxyModel2->setTo("Polish"); + proxyModel2->setSourceModel(model2);; view= new QDeclarativeView(); QDeclarativeContext* ctxt=view->rootContext(); ctxt->setContextProperty("dictModel", proxyModel2); + + QSet languagesFrom; + for(int i=0; i < model2->rowCount(QModelIndex()); i++) + languagesFrom.insert(model2->data(model2->index(i, 0),DictsListModel::FromRole).toString()); + languagesFrom.remove(QString()); + QStringList langFromList = languagesFrom.toList(); + qSort(langFromList); + QList langListFrom; + langListFrom.append(tr("Any")); + foreach(QString lang,langFromList) + langListFrom.append(lang); + fromModel = new ComboBoxModel(langListFrom); + ctxt->setContextProperty("fromModell", fromModel); + + QSet languagesTo; + for(int i=0; i < model2->rowCount(QModelIndex()); i++) + languagesTo.insert(model2->data(model2->index(i, 0),DictsListModel::ToRole).toString()); + languagesTo.remove(QString()); + QStringList langToList = languagesTo.toList(); + qSort(langToList); + QList langListTo; + langListTo.append(tr("Any")); + foreach(QString lang,langToList) + langListTo.append(lang); + toModel = new ComboBoxModel(langListTo); + ctxt->setContextProperty("toModell", toModel); + view->setSource(QUrl::fromLocalFile("/usr/share/mdictionary/qml/TableWidget.qml")); view->setResizeMode(QDeclarativeView::SizeRootObjectToView); view->setAlignment(Qt::AlignCenter); @@ -58,12 +82,16 @@ XdxfDictSelectDialog::XdxfDictSelectDialog(QList dicts, mainLayout = new QVBoxLayout; mainLayout->addWidget(view); this->setLayout(mainLayout); - proxyModel2->setTo("English"); QGraphicsObject *rootObject = view->rootObject(); connect(rootObject,SIGNAL(dictLink(QString)), this,SLOT(itemClicked(QString))); + connect(rootObject,SIGNAL(fromChange(QString)), + this,SLOT(fromChange(QString))); + connect(rootObject,SIGNAL(toChange(QString)), + this,SLOT(toChange(QString))); + #else layout = new QVBoxLayout; @@ -135,6 +163,19 @@ XdxfDictSelectDialog::XdxfDictSelectDialog(QList dicts, #endif } +void XdxfDictSelectDialog::toChange(QString lang){ + if(lang!=tr("Any")) + proxyModel2->setTo(lang); + else + proxyModel2->setTo(""); +} + +void XdxfDictSelectDialog::fromChange(QString lang){ + if(lang!=tr("Any")) + proxyModel2->setFrom(lang); + else + proxyModel2->setFrom(""); +} void XdxfDictSelectDialog::initializeDicts() { //scan of all languages of dictionaries, using QSet to get only distinct languages @@ -202,7 +243,9 @@ void XdxfDictSelectDialog::itemClicked(QString link) { } void XdxfDictSelectDialog::itemClicked(QModelIndex index) { -#ifdef Q_WS_MAEMO_5 +#ifndef Q_WS_MAEMO_5 + index; +#else _link = index.model()->data(index, Qt::UserRole).toString(); accept(); #endif diff --git a/src/plugins/xdxf/XdxfDictSelectDialog.h b/src/plugins/xdxf/XdxfDictSelectDialog.h index cbf0d04..fad43b5 100644 --- a/src/plugins/xdxf/XdxfDictSelectDialog.h +++ b/src/plugins/xdxf/XdxfDictSelectDialog.h @@ -35,12 +35,14 @@ #include #include #include +#include #include "DownloadDict.h" #include "DictsListModel.h" #include "DictsModel.h" #include "DictsProxyModel.h" #include "DictsProxyListModel.h" +#include "../../include/ComboBoxModel.h" /*! @@ -77,11 +79,16 @@ private Q_SLOTS: void itemClicked(QString link); + void toChange(QString lang); + void fromChange(QString lang); + private: QVBoxLayout* mainLayout; QDeclarativeView *view; DictsListModel* model2; DictsProxyListModel *proxyModel2; + ComboBoxModel *fromModel; + ComboBoxModel *toModel; QTreeView* treeView; DictsModel* model; diff --git a/src/plugins/xdxf/xdxf.pro b/src/plugins/xdxf/xdxf.pro index d285b44..1c52b1d 100644 --- a/src/plugins/xdxf/xdxf.pro +++ b/src/plugins/xdxf/xdxf.pro @@ -29,7 +29,8 @@ SOURCES += xdxfplugin.cpp \ XdxfDictDownloadProgressDialog.cpp \ DictsModel.cpp \ HttpDownloader.cpp \ - DictsListModel.cpp + DictsListModel.cpp \ + ../../include/ComboBoxModel.cpp HEADERS += xdxfplugin.h \ TranslationXdxf.h \ @@ -38,6 +39,7 @@ HEADERS += xdxfplugin.h \ ../../include/translation.h \ ../../include/settings.h \ ../../include/CommonDictInterface.h \ + ../../include/ComboBoxModel.h \ XdxfCachingDialog.h \ XdxfDialog.h \ XdxfDictDownloader.h \ -- 1.7.9.5