Compare commits
1497 Commits
release-0.
...
release-1.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fdff493568 | ||
|
|
11276174c1 | ||
|
|
05948e2edf | ||
|
|
c9c4f7001a | ||
|
|
6cd185d0d5 | ||
|
|
063219cbe7 | ||
|
|
e324f3792b | ||
|
|
0267ecc342 | ||
|
|
e53c7aaea6 | ||
|
|
3e90e56266 | ||
|
|
1c1b8acd67 | ||
|
|
811846e5fa | ||
|
|
3ba28885b9 | ||
|
|
8ed1c57c29 | ||
|
|
af5d24c5bc | ||
|
|
9dcd572d60 | ||
|
|
e024a3ff35 | ||
|
|
37342e0f0c | ||
|
|
bfbbc1f497 | ||
|
|
5d31dcdb15 | ||
|
|
6f89b1f131 | ||
|
|
9d35bda43c | ||
|
|
e780d83fd0 | ||
|
|
7a59d5e47c | ||
|
|
f2ea524be9 | ||
|
|
a33094519c | ||
|
|
e313ae808f | ||
|
|
dc9802fe1e | ||
|
|
64f1d306f4 | ||
|
|
f3af4867fd | ||
|
|
4fe22dbc57 | ||
|
|
1d9b524b77 | ||
|
|
63761afd0a | ||
|
|
8da148ffa1 | ||
|
|
e2dc2207d8 | ||
|
|
6e87d6655a | ||
|
|
d72485a955 | ||
|
|
04c6760892 | ||
|
|
382f3e3c86 | ||
|
|
c1378450fc | ||
|
|
4e10a8dbf7 | ||
|
|
4f7b4c2a55 | ||
|
|
f98f076335 | ||
|
|
b148a93a8f | ||
|
|
37cf23fe33 | ||
|
|
87f43123c6 | ||
|
|
11dd2d81b8 | ||
|
|
d18d07efed | ||
|
|
518a120c07 | ||
|
|
290bc8b7a6 | ||
|
|
0ede09efb5 | ||
|
|
15de12f6dd | ||
|
|
ef95d6df81 | ||
|
|
f382ba4fd0 | ||
|
|
01d504d992 | ||
|
|
cdd894a6a1 | ||
|
|
d7b2d3497f | ||
|
|
5dbd5c4326 | ||
|
|
9a14c4c599 | ||
|
|
3fa14cd47f | ||
|
|
941d9b9bd9 | ||
|
|
3d88b7b05c | ||
|
|
8d39e2a776 | ||
|
|
4a1c8a7279 | ||
|
|
b8d8862562 | ||
|
|
40e9105ee5 | ||
|
|
0984b8b8e1 | ||
|
|
3dd7dcc58f | ||
|
|
6ba5df3ec8 | ||
|
|
1560b4ca3b | ||
|
|
68d8a9ed47 | ||
|
|
ca00f3084d | ||
|
|
39c16b20ae | ||
|
|
666d4622b9 | ||
|
|
27388643b1 | ||
|
|
90d17d16a4 | ||
|
|
df0f01cd71 | ||
|
|
480d00d747 | ||
|
|
a0923741a4 | ||
|
|
8e2efc2950 | ||
|
|
91dee6058e | ||
|
|
f5c1343722 | ||
|
|
d4d0a08390 | ||
|
|
d02aca7323 | ||
|
|
fd81567ecd | ||
|
|
8e5f5b5d65 | ||
|
|
215d561b82 | ||
|
|
dc18780a97 | ||
|
|
06fb19e8be | ||
|
|
3550e31871 | ||
|
|
46c6c4fc9a | ||
|
|
e126de8ff5 | ||
|
|
f2d2e70967 | ||
|
|
48b14d1066 | ||
|
|
725700420c | ||
|
|
480df1f5dc | ||
|
|
2fa43dd973 | ||
|
|
b9f1586068 | ||
|
|
07dbe388f4 | ||
|
|
b2af40c95b | ||
|
|
05569a5011 | ||
|
|
73dbce45b2 | ||
|
|
fdaeafc701 | ||
|
|
9ca4e2f1f6 | ||
|
|
2b53aa7e81 | ||
|
|
8e79e918c5 | ||
|
|
687842a949 | ||
|
|
645ee86860 | ||
|
|
f50762dfa8 | ||
|
|
7e252d3fbd | ||
|
|
2dc9f10bf4 | ||
|
|
bca03706a0 | ||
|
|
e7663e7b6b | ||
|
|
2b0e05b453 | ||
|
|
4d67170d3e | ||
|
|
538c028f8a | ||
|
|
2cbbd6ef50 | ||
|
|
955d8069e2 | ||
|
|
25d998f1b5 | ||
|
|
462f6c41cd | ||
|
|
298f1e6a9a | ||
|
|
2926745102 | ||
|
|
c6003c7403 | ||
|
|
66e5a6672a | ||
|
|
c35500dd29 | ||
|
|
f80bd42361 | ||
|
|
0b9c05d41b | ||
|
|
2477dc1fc0 | ||
|
|
706362333d | ||
|
|
6fcf25af52 | ||
|
|
c8e8306e0a | ||
|
|
e429126934 | ||
|
|
7e71de558a | ||
|
|
09d8a4797d | ||
|
|
1bcb8b1ed8 | ||
|
|
d132d50f4d | ||
|
|
e619b6977a | ||
|
|
2742a54d6e | ||
|
|
360a327d7d | ||
|
|
b659303419 | ||
|
|
43108712be | ||
|
|
a038616fe5 | ||
|
|
81e5c295b6 | ||
|
|
08d079a563 | ||
|
|
454c8dc2bc | ||
|
|
337fc72ee6 | ||
|
|
b1e9c1ccf5 | ||
|
|
64806cb199 | ||
|
|
8e8e7cd3e7 | ||
|
|
27a18e01e2 | ||
|
|
fc9e7d74a3 | ||
|
|
037a1875f9 | ||
|
|
66baa4d3dc | ||
|
|
9e522a8a6c | ||
|
|
cfa4edd140 | ||
|
|
9e9134cd44 | ||
|
|
83a798b07e | ||
|
|
baee85684c | ||
|
|
88afb0f0e7 | ||
|
|
6f212f18f5 | ||
|
|
f04e600340 | ||
|
|
5140886567 | ||
|
|
0aa59694fd | ||
|
|
66d31b5ca1 | ||
|
|
47135932a4 | ||
|
|
40d0e44f15 | ||
|
|
16c30a2f10 | ||
|
|
7f2639fcbd | ||
|
|
8ad987a672 | ||
|
|
b24194068a | ||
|
|
f4e9b00ce3 | ||
|
|
5c0a24d58b | ||
|
|
c4aa23c86b | ||
|
|
96911a2c48 | ||
|
|
85abb80f43 | ||
|
|
2372f434cf | ||
|
|
ee6bc3c2e9 | ||
|
|
b6c6637c3b | ||
|
|
d358987316 | ||
|
|
6f28711f9e | ||
|
|
7b4b568859 | ||
|
|
c3aa2906bb | ||
|
|
9509bbaed4 | ||
|
|
b7c7245fb5 | ||
|
|
0153b03160 | ||
|
|
ca83fdecff | ||
|
|
bca898d8b6 | ||
|
|
c877c9c412 | ||
|
|
4dfd1f229b | ||
|
|
0d63f46035 | ||
|
|
106f7cdd32 | ||
|
|
0308825c11 | ||
|
|
8c21ef5c04 | ||
|
|
53c2fe4a60 | ||
|
|
64fef21a86 | ||
|
|
f6f4b5f219 | ||
|
|
f809b8a014 | ||
|
|
cf8dbf22f8 | ||
|
|
00d9f7c36b | ||
|
|
9a314db530 | ||
|
|
7db2ffc09f | ||
|
|
9a02c12ec9 | ||
|
|
2a77de686c | ||
|
|
a79b294885 | ||
|
|
13c670b96d | ||
|
|
65c4da6f0e | ||
|
|
bf9dc052d3 | ||
|
|
0ea6ee32be | ||
|
|
019bd476db | ||
|
|
baf5cb31af | ||
|
|
fc3c123f5b | ||
|
|
7dfdebd593 | ||
|
|
9835af4962 | ||
|
|
04cbd91f04 | ||
|
|
66db20cb47 | ||
|
|
2e0707bc0c | ||
|
|
e9c12cbf78 | ||
|
|
031de096f5 | ||
|
|
b85ed8ff38 | ||
|
|
00c5127ba1 | ||
|
|
714bf4f2ab | ||
|
|
c2244f746e | ||
|
|
8214d87ce5 | ||
|
|
e8454596ea | ||
|
|
1cc039c147 | ||
|
|
fe455970f1 | ||
|
|
36871a34ad | ||
|
|
4ea6ca75ca | ||
|
|
9e46c6c047 | ||
|
|
a2e9210665 | ||
|
|
aaf79add0b | ||
|
|
55743021e8 | ||
|
|
a8d627e1df | ||
|
|
eead11427f | ||
|
|
bec1388ba5 | ||
|
|
1542ff98bc | ||
|
|
0e9fd2dc3f | ||
|
|
cd618150b0 | ||
|
|
a2bcfa9192 | ||
|
|
1421f1450c | ||
|
|
288300d264 | ||
|
|
5e41a64c8b | ||
|
|
f4502367f3 | ||
|
|
273526b414 | ||
|
|
5b7b4b2cf3 | ||
|
|
ee99df0ba9 | ||
|
|
aec32db565 | ||
|
|
3894452840 | ||
|
|
54bfb7cda9 | ||
|
|
aa18f19ab7 | ||
|
|
3ae783e9cb | ||
|
|
83cac18690 | ||
|
|
3b09203937 | ||
|
|
a12621e1c0 | ||
|
|
60c3ccac7f | ||
|
|
1fbf7d42a1 | ||
|
|
4b73172105 | ||
|
|
ada5d2665b | ||
|
|
f1ca41a5c5 | ||
|
|
17e0700a52 | ||
|
|
cc77b2f578 | ||
|
|
85463e3910 | ||
|
|
7bd0dff802 | ||
|
|
4bc043146d | ||
|
|
fd78e0b5ce | ||
|
|
8565f1e61e | ||
|
|
4c6d6a35f3 | ||
|
|
fc79b7dc56 | ||
|
|
da11488ba1 | ||
|
|
968c3e1c3e | ||
|
|
68e30de763 | ||
|
|
573f00c66c | ||
|
|
ae81dbe088 | ||
|
|
2edbe66d91 | ||
|
|
f9f912906e | ||
|
|
7b4eee7a7d | ||
|
|
e799ac57ed | ||
|
|
30c93b9a4a | ||
|
|
03dc617874 | ||
|
|
bc29577a7b | ||
|
|
5509e94778 | ||
|
|
89330e11de | ||
|
|
c016c4bf66 | ||
|
|
3f1081b621 | ||
|
|
e3ae03c8a8 | ||
|
|
fbe292d06e | ||
|
|
1d294e43f1 | ||
|
|
d883ef27be | ||
|
|
be934837e5 | ||
|
|
956f97f6d6 | ||
|
|
de38ca3e23 | ||
|
|
1efaea46e3 | ||
|
|
2694a0947f | ||
|
|
f61d9d23f5 | ||
|
|
60dda258b3 | ||
|
|
c79a4a746f | ||
|
|
942b579d8e | ||
|
|
93bc6dca95 | ||
|
|
f36052351c | ||
|
|
d40c646561 | ||
|
|
9412ced722 | ||
|
|
7037b53ff8 | ||
|
|
adc72fb9a6 | ||
|
|
f0ca99ed6c | ||
|
|
e443aa75b7 | ||
|
|
282d0a4af6 | ||
|
|
25adf6b061 | ||
|
|
88f0ffe86d | ||
|
|
c786c42bb1 | ||
|
|
36bc2e96ba | ||
|
|
f9bf485ed7 | ||
|
|
c18103539c | ||
|
|
727f59f73f | ||
|
|
5d2d1dfa94 | ||
|
|
cf694d14f3 | ||
|
|
ec24fe2f49 | ||
|
|
a0b4e54410 | ||
|
|
c97bce4d61 | ||
|
|
afbfe1a96d | ||
|
|
2651ec5f0b | ||
|
|
330905da5e | ||
|
|
4c6359276c | ||
|
|
ff1fc527e0 | ||
|
|
d79cb6b66e | ||
|
|
0ac2554060 | ||
|
|
1d31e049a4 | ||
|
|
d5a4794610 | ||
|
|
29886acc01 | ||
|
|
f1ed7f06b9 | ||
|
|
a848538d66 | ||
|
|
b58046b1fc | ||
|
|
fe95e90e05 | ||
|
|
1544300616 | ||
|
|
028041f874 | ||
|
|
81f2d7ee4a | ||
|
|
66874fbd2f | ||
|
|
f47b3be0be | ||
|
|
87eee7029d | ||
|
|
713c80451e | ||
|
|
60889cac79 | ||
|
|
d398679c7e | ||
|
|
2e5330e54b | ||
|
|
1499138b9b | ||
|
|
2433a87445 | ||
|
|
d0de11909f | ||
|
|
3f5340523f | ||
|
|
cc5015773b | ||
|
|
cd260198f9 | ||
|
|
71e3061c18 | ||
|
|
6369401150 | ||
|
|
fa05441e74 | ||
|
|
81aac9ebcc | ||
|
|
7a1af536b6 | ||
|
|
45efcfce13 | ||
|
|
cddc3a0a43 | ||
|
|
c38a8a2bec | ||
|
|
1225d16413 | ||
|
|
384f3b23ee | ||
|
|
a3cfa6bba1 | ||
|
|
51638eddcc | ||
|
|
41c6a847b9 | ||
|
|
d57062a45a | ||
|
|
32f478a8c2 | ||
|
|
61dae1444b | ||
|
|
8ed40cc856 | ||
|
|
941b8c8d2a | ||
|
|
4f2a2dfab9 | ||
|
|
4a6ab376af | ||
|
|
1e37858cc4 | ||
|
|
668268b6b5 | ||
|
|
cfcd9b7eaf | ||
|
|
6a3dddd0cc | ||
|
|
dfb2046f82 | ||
|
|
3ae55b6a6f | ||
|
|
7e53d23e33 | ||
|
|
ce2294ee96 | ||
|
|
14646d0f9e | ||
|
|
717a4b00e1 | ||
|
|
fca3b66a25 | ||
|
|
1a861ef240 | ||
|
|
1590d9a98f | ||
|
|
112bcd7255 | ||
|
|
af29228cc9 | ||
|
|
b8c79e0b5f | ||
|
|
0d078f660a | ||
|
|
e7f89f256a | ||
|
|
cb693a0795 | ||
|
|
7b57345c4f | ||
|
|
90879386d5 | ||
|
|
3678aa4d23 | ||
|
|
e497789ec7 | ||
|
|
2134d404a5 | ||
|
|
e0707f6907 | ||
|
|
816f35cbab | ||
|
|
a73d3132df | ||
|
|
368c122dce | ||
|
|
c41d17043c | ||
|
|
3c17a1410b | ||
|
|
078110851d | ||
|
|
70725bdfe2 | ||
|
|
3c0a610a34 | ||
|
|
d5b74eecd0 | ||
|
|
1faf183c73 | ||
|
|
a1773a7cfd | ||
|
|
1af3515b00 | ||
|
|
70e2a5d3b3 | ||
|
|
78409570a9 | ||
|
|
5133931302 | ||
|
|
8326cebf5c | ||
|
|
ab46f11af2 | ||
|
|
91acb1a6ec | ||
|
|
c721fad54b | ||
|
|
2aea2a0032 | ||
|
|
3164337c3c | ||
|
|
b984c309ff | ||
|
|
cfbd06225b | ||
|
|
b0a0abd764 | ||
|
|
9618056b4e | ||
|
|
8b40e43432 | ||
|
|
01bc15d3f4 | ||
|
|
3282e1bcc9 | ||
|
|
e5b6a5605a | ||
|
|
9b67807926 | ||
|
|
f3729fbae6 | ||
|
|
0538c9c3e8 | ||
|
|
53a0e85b8d | ||
|
|
453dd93abf | ||
|
|
669cc2395a | ||
|
|
82706141cf | ||
|
|
c536f24d55 | ||
|
|
764b4e72ca | ||
|
|
19dd21062b | ||
|
|
2d24b468b6 | ||
|
|
2dc75cb98d | ||
|
|
5e3be25916 | ||
|
|
49e8bad7cc | ||
|
|
796aea19e6 | ||
|
|
dd35f1723b | ||
|
|
0177e1fee4 | ||
|
|
949eb2b5f5 | ||
|
|
2d59fe37bf | ||
|
|
b6f81c199e | ||
|
|
c2964dc340 | ||
|
|
8aebb93424 | ||
|
|
96c38f7be4 | ||
|
|
cf2abe45de | ||
|
|
88ac8adb30 | ||
|
|
b331478179 | ||
|
|
bfaa82ccba | ||
|
|
77f407724d | ||
|
|
2f5c2e6404 | ||
|
|
fbb2cdd1a9 | ||
|
|
63a4e06556 | ||
|
|
3d934b4a9c | ||
|
|
697c275d83 | ||
|
|
25b9601613 | ||
|
|
276dfd9df6 | ||
|
|
19f05f0a97 | ||
|
|
293aaefefe | ||
|
|
57cdf4ebd1 | ||
|
|
c4a0c8f100 | ||
|
|
306991e776 | ||
|
|
de2384e4a7 | ||
|
|
236dbcfb4a | ||
|
|
a1b133d883 | ||
|
|
4f8825e371 | ||
|
|
1aa0936c91 | ||
|
|
d5e22c523e | ||
|
|
6618e61a42 | ||
|
|
26283ec228 | ||
|
|
ed12f5c77e | ||
|
|
8e074a571a | ||
|
|
e2c7c973fd | ||
|
|
eec04761ef | ||
|
|
f73256e0ea | ||
|
|
fec1de6383 | ||
|
|
db35a7efb8 | ||
|
|
36eae88a5a | ||
|
|
c01fd75c92 | ||
|
|
103f2d0720 | ||
|
|
037c46b587 | ||
|
|
0879f2c0ca | ||
|
|
a65cd5c39c | ||
|
|
d219e7afeb | ||
|
|
892bb4c432 | ||
|
|
45b9c6335c | ||
|
|
78e643039c | ||
|
|
04e993c674 | ||
|
|
c3132fc1b0 | ||
|
|
b1c73cb401 | ||
|
|
ac6eb8c6bc | ||
|
|
8a64412cb5 | ||
|
|
56885cc914 | ||
|
|
cdd1f9b86c | ||
|
|
139360cf76 | ||
|
|
2931d51add | ||
|
|
aa0bec41b4 | ||
|
|
b32b42b53e | ||
|
|
06c4c717bd | ||
|
|
a3ed44baec | ||
|
|
0cbb4a7074 | ||
|
|
af2e487ef5 | ||
|
|
28fdfdfef1 | ||
|
|
c95cca6436 | ||
|
|
86024c6c74 | ||
|
|
75290cf715 | ||
|
|
321b76a72a | ||
|
|
95ecaec11e | ||
|
|
0e7c16901c | ||
|
|
43dcbf776b | ||
|
|
e21c28e9d2 | ||
|
|
918c1507d3 | ||
|
|
a189e4403d | ||
|
|
563291a2e8 | ||
|
|
9156c9ac8f | ||
|
|
f0049f1dae | ||
|
|
a622152747 | ||
|
|
8440e9982f | ||
|
|
602d73fa82 | ||
|
|
c32ebb8d9f | ||
|
|
deeead4008 | ||
|
|
937a491409 | ||
|
|
79d5ae18a6 | ||
|
|
5cce0c53bf | ||
|
|
681b8c14ad | ||
|
|
443567486e | ||
|
|
c10ebc3086 | ||
|
|
42a2acefd3 | ||
|
|
c781545609 | ||
|
|
ba06affec7 | ||
|
|
6140d69fcb | ||
|
|
71a81fd1b7 | ||
|
|
4e05b62bbe | ||
|
|
9d366c8c7d | ||
|
|
940744b0bf | ||
|
|
6c2518a704 | ||
|
|
ef51fabf63 | ||
|
|
1aedd97d4d | ||
|
|
ff26ea94f5 | ||
|
|
c7a289d183 | ||
|
|
2a70c8f4d8 | ||
|
|
e27b08d970 | ||
|
|
48ec57604f | ||
|
|
db1bbea26a | ||
|
|
7bbb2f542b | ||
|
|
5563e24781 | ||
|
|
f131f6210f | ||
|
|
0356fa4538 | ||
|
|
b9c4a434c9 | ||
|
|
a4318cc060 | ||
|
|
d6e7161eff | ||
|
|
e428489ebc | ||
|
|
fa4cffe3d4 | ||
|
|
a355a87ec5 | ||
|
|
39749620a4 | ||
|
|
e7674bfaf8 | ||
|
|
3e8ad9eb83 | ||
|
|
6a95f9170c | ||
|
|
cc4a542e9d | ||
|
|
fed63b0b85 | ||
|
|
bf7b11d87d | ||
|
|
bb959ba465 | ||
|
|
b77e28fb12 | ||
|
|
261f981a9a | ||
|
|
93ad7e889e | ||
|
|
b79e2906e8 | ||
|
|
99e8ac3d36 | ||
|
|
badd36e81e | ||
|
|
c835502692 | ||
|
|
4fe7fd537d | ||
|
|
88ea548eaf | ||
|
|
360c8500bb | ||
|
|
7a925f15ba | ||
|
|
15ce9a7369 | ||
|
|
4b8532ea2d | ||
|
|
8e7d0f4dc1 | ||
|
|
de0ac5cda4 | ||
|
|
9a9fd4e2d1 | ||
|
|
4be0cbd2e4 | ||
|
|
5fef86ec18 | ||
|
|
1acd05794a | ||
|
|
5a61b7543b | ||
|
|
b6b74752a5 | ||
|
|
27a71ba123 | ||
|
|
20ae3d997c | ||
|
|
b73d0548c8 | ||
|
|
ca118697e9 | ||
|
|
600308aaa1 | ||
|
|
9b1ea66659 | ||
|
|
d29cc3325b | ||
|
|
9f6e28b741 | ||
|
|
4c5f349f49 | ||
|
|
9a321adfb1 | ||
|
|
e233f27d1c | ||
|
|
1cadf73a40 | ||
|
|
77c97b5b43 | ||
|
|
0054a330fb | ||
|
|
8ba05c57b0 | ||
|
|
284b1c7f87 | ||
|
|
8bc470e427 | ||
|
|
8e5190ffc8 | ||
|
|
a8298b6c9a | ||
|
|
b5928aa2e3 | ||
|
|
0a9462aa63 | ||
|
|
7b8be9e15c | ||
|
|
2a41223ce1 | ||
|
|
214151b57b | ||
|
|
ba8afb6bdc | ||
|
|
dbc00a66f0 | ||
|
|
8dfc68e196 | ||
|
|
2dee67edbd | ||
|
|
f6cc600b94 | ||
|
|
de334d32b1 | ||
|
|
44c86053ca | ||
|
|
efebf8e0c3 | ||
|
|
06dd495915 | ||
|
|
5b0857c01d | ||
|
|
523b86e28e | ||
|
|
4e28aa1031 | ||
|
|
166c5b252e | ||
|
|
112ca10f32 | ||
|
|
649a8e0418 | ||
|
|
c9631c2a3f | ||
|
|
7b65998c72 | ||
|
|
6a1db644de | ||
|
|
fcf430eb7b | ||
|
|
d916bfd73e | ||
|
|
949678a4d3 | ||
|
|
322e9e3ccf | ||
|
|
6098bfebf8 | ||
|
|
3758c98d5e | ||
|
|
dca80c3006 | ||
|
|
95bad03321 | ||
|
|
cecd1e11b1 | ||
|
|
c6fd400fa5 | ||
|
|
2711794770 | ||
|
|
505baf4eed | ||
|
|
0e09ce1dd3 | ||
|
|
6f13325e76 | ||
|
|
adda3a2d34 | ||
|
|
f22c2f8c7b | ||
|
|
981d7fd5ce | ||
|
|
80cd14e730 | ||
|
|
a28de2fa21 | ||
|
|
f143596b91 | ||
|
|
d32813ed1f | ||
|
|
7f44ef75c4 | ||
|
|
478c9a871c | ||
|
|
296bd07e52 | ||
|
|
7ced943b88 | ||
|
|
1d235b2953 | ||
|
|
516f4dad48 | ||
|
|
edc04292f7 | ||
|
|
cb7e48b2e8 | ||
|
|
56d80118b7 | ||
|
|
711699e200 | ||
|
|
fc931d8c88 | ||
|
|
d26bebfbe2 | ||
|
|
7463552dcd | ||
|
|
ec5325ed3c | ||
|
|
8b814c724c | ||
|
|
ce627de39d | ||
|
|
5c054223e8 | ||
|
|
133007c451 | ||
|
|
b17c8b84d1 | ||
|
|
f6210d5857 | ||
|
|
6926b3f7a0 | ||
|
|
1a56141430 | ||
|
|
ffa10adecf | ||
|
|
b69a8a0709 | ||
|
|
4dece85483 | ||
|
|
8deb18fa9d | ||
|
|
5af8bddc16 | ||
|
|
0dd84c37a1 | ||
|
|
1be6333601 | ||
|
|
20552ea157 | ||
|
|
71a92bbb63 | ||
|
|
e9865c42bd | ||
|
|
9172985173 | ||
|
|
54bf7e61f7 | ||
|
|
8422cb395a | ||
|
|
313b9b9bc0 | ||
|
|
9d3fcb10d5 | ||
|
|
34725dc26b | ||
|
|
8b576fcc50 | ||
|
|
1b7449ef4e | ||
|
|
596ec6ae4c | ||
|
|
569b69689a | ||
|
|
07c195f475 | ||
|
|
5e86c8a14d | ||
|
|
85796d9c2c | ||
|
|
f4120088c6 | ||
|
|
8d1f1512b0 | ||
|
|
c6abdacadd | ||
|
|
fa00d745b2 | ||
|
|
1e1313dffc | ||
|
|
00b3677867 | ||
|
|
8a9a23866f | ||
|
|
91328de30f | ||
|
|
204d9ff496 | ||
|
|
5d64373798 | ||
|
|
699d4b1161 | ||
|
|
0fe9d68be1 | ||
|
|
b2f9394d6e | ||
|
|
56965d444a | ||
|
|
07d7a44731 | ||
|
|
f85aa72c72 | ||
|
|
2f5b4a190e | ||
|
|
aada4f3c03 | ||
|
|
9540d45c1d | ||
|
|
cfd7a1bf0b | ||
|
|
3e13bd1381 | ||
|
|
3af23ae8a9 | ||
|
|
f1aa1f993d | ||
|
|
82b1b29906 | ||
|
|
14882fe38f | ||
|
|
82f60f1b89 | ||
|
|
dab617458a | ||
|
|
1832d518d6 | ||
|
|
5ed8517cde | ||
|
|
b2950afd5c | ||
|
|
a84c686090 | ||
|
|
efb8315a38 | ||
|
|
56b018fb95 | ||
|
|
731438a19a | ||
|
|
fd4ce53eb1 | ||
|
|
b4f0fbdbc4 | ||
|
|
26ae2af198 | ||
|
|
bdb625a615 | ||
|
|
f68c5114b2 | ||
|
|
83282bf835 | ||
|
|
054351e3a4 | ||
|
|
a5dac03956 | ||
|
|
a760913482 | ||
|
|
f3c8889865 | ||
|
|
b24a1e9123 | ||
|
|
c4b7622a17 | ||
|
|
f7fa66c65d | ||
|
|
a91d2028d8 | ||
|
|
adea644c04 | ||
|
|
31679f0d6d | ||
|
|
0d90ad8f7c | ||
|
|
8ab6aeafcc | ||
|
|
a56baf5b58 | ||
|
|
61eb921e44 | ||
|
|
8ecf79e91c | ||
|
|
349e58fa22 | ||
|
|
436f5bbd7e | ||
|
|
64bfdf930c | ||
|
|
8858518a14 | ||
|
|
def19ef88b | ||
|
|
4f989b674f | ||
|
|
f0ef21e409 | ||
|
|
6b0ae4f575 | ||
|
|
3926b0d787 | ||
|
|
a721e6d943 | ||
|
|
9c05148a24 | ||
|
|
725ef52cfe | ||
|
|
7982011d0b | ||
|
|
0a3bb0cfcd | ||
|
|
f75501f781 | ||
|
|
70f8a00c20 | ||
|
|
2691677650 | ||
|
|
be34bed61a | ||
|
|
721ef1d236 | ||
|
|
c8b944508b | ||
|
|
f3f3f2822b | ||
|
|
3ef0c82a8c | ||
|
|
b8200fd7b2 | ||
|
|
9e62780a6d | ||
|
|
58c78fa6f6 | ||
|
|
5484ec923d | ||
|
|
54225cd42f | ||
|
|
dc651ffed3 | ||
|
|
476a7d7be0 | ||
|
|
c580285fe8 | ||
|
|
5b6166ee15 | ||
|
|
18ee43225e | ||
|
|
b47073901f | ||
|
|
d45c44868e | ||
|
|
4401b60d51 | ||
|
|
0ce114a7f8 | ||
|
|
38ca306499 | ||
|
|
6cb636f85d | ||
|
|
7563b09ead | ||
|
|
76783c819c | ||
|
|
42312b982b | ||
|
|
a329a59719 | ||
|
|
82e548a2fd | ||
|
|
5bbdb9e119 | ||
|
|
68cbcaeab9 | ||
|
|
3c88657e0f | ||
|
|
f836be6736 | ||
|
|
85fe900afe | ||
|
|
052ccf2302 | ||
|
|
ae384da609 | ||
|
|
0fc2d289eb | ||
|
|
9ca02aad88 | ||
|
|
8ea34135e4 | ||
|
|
b66be5b64b | ||
|
|
ebc738e3a5 | ||
|
|
713474bc43 | ||
|
|
265a8cada8 | ||
|
|
138af31ef9 | ||
|
|
a5f6663e65 | ||
|
|
1519bca46d | ||
|
|
03719cbb87 | ||
|
|
98825613fa | ||
|
|
47abadfc67 | ||
|
|
a220e01e2e | ||
|
|
dea9237aa0 | ||
|
|
6099544da5 | ||
|
|
902116cbc8 | ||
|
|
96a6f450d0 | ||
|
|
6ed565a06b | ||
|
|
1fbbee794c | ||
|
|
bfab6389b5 | ||
|
|
26a4040003 | ||
|
|
e7ac721b3c | ||
|
|
48f5436f6f | ||
|
|
f754e34e35 | ||
|
|
9bb18e1a07 | ||
|
|
0245bbf5ab | ||
|
|
0a0c1f3529 | ||
|
|
be94c86350 | ||
|
|
a26333bc65 | ||
|
|
4c862597ae | ||
|
|
937d45d850 | ||
|
|
20b6579392 | ||
|
|
4f25e6c769 | ||
|
|
ce3b8733d1 | ||
|
|
b0140fbdbe | ||
|
|
abcd2b7600 | ||
|
|
f9998957cd | ||
|
|
acb8d5679f | ||
|
|
c3d3156ec7 | ||
|
|
09abd303bd | ||
|
|
0678e2e2bd | ||
|
|
00dbf7ba38 | ||
|
|
42cacabccd | ||
|
|
3d04a944b6 | ||
|
|
b02e2c2f9b | ||
|
|
5c0f17bf31 | ||
|
|
ac9a81985f | ||
|
|
a46c63d883 | ||
|
|
09a696fc27 | ||
|
|
dedc54d26f | ||
|
|
c0ffb8fa5c | ||
|
|
3e350c5935 | ||
|
|
da244d7ef2 | ||
|
|
2fc7039cc7 | ||
|
|
654497cd4a | ||
|
|
bdf50483df | ||
|
|
8a0681744e | ||
|
|
2699c76afd | ||
|
|
773064a081 | ||
|
|
7718403419 | ||
|
|
26b4d31810 | ||
|
|
f8dfda0893 | ||
|
|
e8897ae159 | ||
|
|
2f71f9f51a | ||
|
|
fc595f49d8 | ||
|
|
92444fccf4 | ||
|
|
6d0aebe9cb | ||
|
|
ef7af6bad6 | ||
|
|
c1a8a58080 | ||
|
|
76047f4ef2 | ||
|
|
9062266a84 | ||
|
|
9cdcd53234 | ||
|
|
419b94f042 | ||
|
|
3cb34ed7ee | ||
|
|
925ecb3464 | ||
|
|
488bd90303 | ||
|
|
c478ba59ac | ||
|
|
fe7c0db425 | ||
|
|
b2bf7047d9 | ||
|
|
e943449b42 | ||
|
|
69e2355ff4 | ||
|
|
b7ea2fb51a | ||
|
|
4c880fea09 | ||
|
|
a0e895641c | ||
|
|
484f1c36c9 | ||
|
|
982ce5c0ad | ||
|
|
7ac5da0acc | ||
|
|
9733716136 | ||
|
|
eebdc26e5a | ||
|
|
1f8b9378a3 | ||
|
|
b99b838827 | ||
|
|
c4d143c2c0 | ||
|
|
db1bd53f44 | ||
|
|
07dc182053 | ||
|
|
563055e891 | ||
|
|
b3de2ccc72 | ||
|
|
f4d5ceb3c4 | ||
|
|
70beef9f94 | ||
|
|
47c1908519 | ||
|
|
e1ead940be | ||
|
|
862d24ac48 | ||
|
|
078c80c81d | ||
|
|
6ba4588e62 | ||
|
|
cd70843ee9 | ||
|
|
cb8ecb74bf | ||
|
|
9f36d521a4 | ||
|
|
2c2c1093c3 | ||
|
|
0e81f3731f | ||
|
|
f1114387ae | ||
|
|
54516ac231 | ||
|
|
913f93ba82 | ||
|
|
11c7255da6 | ||
|
|
69fa916e26 | ||
|
|
d86335a58e | ||
|
|
24dced2411 | ||
|
|
1b71a4a4a4 | ||
|
|
ffedffcead | ||
|
|
1f64e14195 | ||
|
|
d6a5b1d321 | ||
|
|
792101731f | ||
|
|
3e783873ec | ||
|
|
ffb262f0a1 | ||
|
|
4727c1bdca | ||
|
|
1f1e37ce76 | ||
|
|
f40337d2e3 | ||
|
|
ecc5106f07 | ||
|
|
1b93f4eaf1 | ||
|
|
685ceafc5b | ||
|
|
cf6128a222 | ||
|
|
f78c74c1b5 | ||
|
|
faeee49517 | ||
|
|
1918969e28 | ||
|
|
fa9e3bf564 | ||
|
|
8eac154c05 | ||
|
|
ff12c76a62 | ||
|
|
2c27f952e2 | ||
|
|
e3214a9b6a | ||
|
|
4a02d171b4 | ||
|
|
7a16a1d8f1 | ||
|
|
ecc41fbc60 | ||
|
|
0125a2b521 | ||
|
|
d328b93c1a | ||
|
|
ab588b741e | ||
|
|
1588cd5d3d | ||
|
|
a597f067e2 | ||
|
|
0778f2a19e | ||
|
|
6c0d4b9439 | ||
|
|
98d91f7697 | ||
|
|
f7ac4ec652 | ||
|
|
43b96ea4f2 | ||
|
|
91bd5f1d8e | ||
|
|
f0edd7dcf7 | ||
|
|
e3f2480fe5 | ||
|
|
26e5785754 | ||
|
|
db12fb292a | ||
|
|
798ee52de1 | ||
|
|
b1f562d7c0 | ||
|
|
41daeb4c19 | ||
|
|
d66b788e5f | ||
|
|
ff4ab915a2 | ||
|
|
b7fd7d9837 | ||
|
|
89670af7c9 | ||
|
|
10a13195b3 | ||
|
|
0f34a98350 | ||
|
|
59279aa43a | ||
|
|
11198208eb | ||
|
|
4a2c7efb27 | ||
|
|
3ea344cb2e | ||
|
|
dff33dbfb1 | ||
|
|
ed6cad6d1b | ||
|
|
b582ec9480 | ||
|
|
b5ccf05541 | ||
|
|
b3c5e6cfa2 | ||
|
|
229927bbe9 | ||
|
|
495d6f2bab | ||
|
|
a9f1bd4f74 | ||
|
|
73c247fe10 | ||
|
|
bd84cb197f | ||
|
|
57309c7d82 | ||
|
|
27e76962d1 | ||
|
|
db6180b737 | ||
|
|
6918aba90c | ||
|
|
17b8f76dda | ||
|
|
ea3a635d49 | ||
|
|
2ddcaf008b | ||
|
|
99268bfc06 | ||
|
|
19c606e067 | ||
|
|
057029787a | ||
|
|
06cb5ff4c6 | ||
|
|
f67eb47f8c | ||
|
|
7921adbcf9 | ||
|
|
63334ea6fb | ||
|
|
cdfaed4fb4 | ||
|
|
21908e0a03 | ||
|
|
105563ac5a | ||
|
|
c064e5877c | ||
|
|
29a290264e | ||
|
|
08a57d267b | ||
|
|
01df4d3c81 | ||
|
|
6ecb45d661 | ||
|
|
c6b25e5f79 | ||
|
|
39feb335a4 | ||
|
|
b90012e431 | ||
|
|
71599c0f9f | ||
|
|
20a8b3f418 | ||
|
|
3b03b385f3 | ||
|
|
c7592a6dc8 | ||
|
|
8f7de730cc | ||
|
|
e4795cd64b | ||
|
|
fd2ee35e92 | ||
|
|
8404eec301 | ||
|
|
cc252fc70a | ||
|
|
89ecdca5e7 | ||
|
|
1bfc181cb2 | ||
|
|
124fa3c8ed | ||
|
|
28294efadf | ||
|
|
829c358f10 | ||
|
|
35a9fab3b4 | ||
|
|
4e2ebe5a69 | ||
|
|
366d5108c4 | ||
|
|
7dc7cea31b | ||
|
|
32c330092a | ||
|
|
36e2cb6f68 | ||
|
|
cebb5fc1fe | ||
|
|
1ad2495896 | ||
|
|
e82cb2188e | ||
|
|
680f6409d8 | ||
|
|
cfacac7dbf | ||
|
|
8ce1a4c3df | ||
|
|
6ee9152b21 | ||
|
|
d8dd509a7b | ||
|
|
4c5c1d49c2 | ||
|
|
8ba1cb329d | ||
|
|
a28160bcaa | ||
|
|
c9925eddb6 | ||
|
|
5946f20783 | ||
|
|
a4a98e3ada | ||
|
|
a01c7e2c60 | ||
|
|
2bf0aba48a | ||
|
|
7030f85826 | ||
|
|
5066819c58 | ||
|
|
5231f5a22b | ||
|
|
de8c3158fe | ||
|
|
04352cce3c | ||
|
|
5315ba7894 | ||
|
|
2ce097ec77 | ||
|
|
d025a2ea36 | ||
|
|
a4d24fd4a7 | ||
|
|
b2867e97bf | ||
|
|
98159eaa1b | ||
|
|
b4fbaaa47c | ||
|
|
df8c591edd | ||
|
|
13f21ef6cd | ||
|
|
55834ba5db | ||
|
|
417d8a777b | ||
|
|
38b008a2ac | ||
|
|
38283882e9 | ||
|
|
85055c1ef9 | ||
|
|
36e87952fa | ||
|
|
d5fa6cefe4 | ||
|
|
12fd87ab85 | ||
|
|
47b42c1c90 | ||
|
|
31abae33a1 | ||
|
|
7b8722df34 | ||
|
|
eda115249a | ||
|
|
aa4c53ec43 | ||
|
|
44d61e0b9d | ||
|
|
c51abd9096 | ||
|
|
320c125d17 | ||
|
|
8b26b7fd48 | ||
|
|
f9c357b52d | ||
|
|
3494702437 | ||
|
|
3100c4afc9 | ||
|
|
60923e81c6 | ||
|
|
06a2f2ad1f | ||
|
|
d02edebb58 | ||
|
|
a9692dbe60 | ||
|
|
bee1dbeea4 | ||
|
|
9ba0c7ebba | ||
|
|
b702bea806 | ||
|
|
ff756a2b1f | ||
|
|
8e6b1be322 | ||
|
|
d74a095186 | ||
|
|
037fc69c34 | ||
|
|
969d9d5f69 | ||
|
|
db9bc24b5f | ||
|
|
86d38efcb2 | ||
|
|
533aeb3f8b | ||
|
|
dcb6642394 | ||
|
|
2589d4e682 | ||
|
|
b2eec9a765 | ||
|
|
e569fdd2c0 | ||
|
|
fff4ad529c | ||
|
|
ab63fa62ea | ||
|
|
30fef7d1fc | ||
|
|
6d7c15aa33 | ||
|
|
be11acb31b | ||
|
|
a9cd4fd3f4 | ||
|
|
1c0e890252 | ||
|
|
190dc793ac | ||
|
|
0c18f44a34 | ||
|
|
0280158138 | ||
|
|
265458ae98 | ||
|
|
a98a21196f | ||
|
|
66c8a21a66 | ||
|
|
4ce1a7eda2 | ||
|
|
83b0cd5706 | ||
|
|
1a1219448a | ||
|
|
f4465dcea2 | ||
|
|
fc0a41e7f8 | ||
|
|
7469f97953 | ||
|
|
80fa44f8bb | ||
|
|
6eae7bd201 | ||
|
|
5879df7d5f | ||
|
|
57b4a7150a | ||
|
|
58dc75fbcf | ||
|
|
d04b9a7f02 | ||
|
|
c2450cd41e | ||
|
|
4922eb3dc5 | ||
|
|
34d94cd2bb | ||
|
|
9bd3647f36 | ||
|
|
79e2d253d4 | ||
|
|
9b08b0ff8c | ||
|
|
b0f3cdad5d | ||
|
|
0561206d91 | ||
|
|
99530728c5 | ||
|
|
99a58b9208 | ||
|
|
816a3c8784 | ||
|
|
570296c29e | ||
|
|
5518144b26 | ||
|
|
e66af5b271 | ||
|
|
7b9da8d941 | ||
|
|
05a7ba4e38 | ||
|
|
f07b0eed61 | ||
|
|
8fdc59c37c | ||
|
|
58b5d4378d | ||
|
|
bd8ec01add | ||
|
|
c0e4b0bbff | ||
|
|
b0bbbf0305 | ||
|
|
6dd78d33ab | ||
|
|
d2983fa5aa | ||
|
|
d680be3626 | ||
|
|
0043edc85f | ||
|
|
a00ea9af99 | ||
|
|
57376ae875 | ||
|
|
7f89b30190 | ||
|
|
6951619c04 | ||
|
|
c19937cf98 | ||
|
|
dbc084dd66 | ||
|
|
3cb0612cc6 | ||
|
|
c6285d8f67 | ||
|
|
0a144708d8 | ||
|
|
410bbcf003 | ||
|
|
c4a1f30b70 | ||
|
|
269b59f8a2 | ||
|
|
ffc1479b1f | ||
|
|
9683916d88 | ||
|
|
74b2b955c9 | ||
|
|
620deb3b6a | ||
|
|
e4fbf2107d | ||
|
|
1db4af50dd | ||
|
|
a5ac742c1f | ||
|
|
183544b959 | ||
|
|
897ab4d782 | ||
|
|
3e36cd3c46 | ||
|
|
f839d6fe41 | ||
|
|
ff9b9d7148 | ||
|
|
b4537c52c1 | ||
|
|
9cbab8d63e | ||
|
|
676f30d9a1 | ||
|
|
d3f917b408 | ||
|
|
faf6f155ca | ||
|
|
4e4b0ed9ff | ||
|
|
95fc9e3a72 | ||
|
|
3ba3e12f93 | ||
|
|
2ab7f6f923 | ||
|
|
d43d68122b | ||
|
|
03fae3953f | ||
|
|
102c5ee81e | ||
|
|
f27e913f67 | ||
|
|
4ef72c6c8f | ||
|
|
a370503eb3 | ||
|
|
e9126aedc3 | ||
|
|
e493776a73 | ||
|
|
a0e32fefd7 | ||
|
|
e606d04098 | ||
|
|
5713af7375 | ||
|
|
1e64d0a3e4 | ||
|
|
e4ab5ceb43 | ||
|
|
ce5baa93b7 | ||
|
|
042323a1a8 | ||
|
|
93938d8597 | ||
|
|
0db60065c0 | ||
|
|
c8c53e2812 | ||
|
|
737bdadbd0 | ||
|
|
53d2bc34fc | ||
|
|
5cc6e6e8f4 | ||
|
|
a27e7e1b9e | ||
|
|
2ba45ef9ad | ||
|
|
59d35b9f8a | ||
|
|
cf6a91e850 | ||
|
|
4e0ed1ec4c | ||
|
|
2ad1c56933 | ||
|
|
4f17339820 | ||
|
|
c019b0d72c | ||
|
|
0fb78727d5 | ||
|
|
2c48968a31 | ||
|
|
f4adf173a2 | ||
|
|
c086558597 | ||
|
|
7c48afd6eb | ||
|
|
e6554db498 | ||
|
|
d25776ddda | ||
|
|
325a588526 | ||
|
|
8c05caba3a | ||
|
|
d3793d180c | ||
|
|
e1e28fa9ff | ||
|
|
e3e559d857 | ||
|
|
708e802570 | ||
|
|
a74dc5ee35 | ||
|
|
7edc89638f | ||
|
|
e4915260e7 | ||
|
|
92ae8de58e | ||
|
|
f81e431032 | ||
|
|
2789316e38 | ||
|
|
f4250d812f | ||
|
|
1fb848e9ed | ||
|
|
2fd0de082c | ||
|
|
7c8677d787 | ||
|
|
347b03d699 | ||
|
|
4c9d1db9d5 | ||
|
|
8fdd614673 | ||
|
|
0bdb10cdbe | ||
|
|
60c0049bef | ||
|
|
a40c2bfc8f | ||
|
|
a6b037d663 | ||
|
|
e079c87f5c | ||
|
|
22a80fe1c3 | ||
|
|
d762f094f2 | ||
|
|
e916300a6e | ||
|
|
99959b1aa3 | ||
|
|
38c6c63924 | ||
|
|
3d7540dafe | ||
|
|
86a0e68f46 | ||
|
|
eb3db365e7 | ||
|
|
2dea5f2ff8 | ||
|
|
766be4b381 | ||
|
|
d0bf8b5b04 | ||
|
|
8df61db644 | ||
|
|
f0353e50b2 | ||
|
|
28ea505088 | ||
|
|
8c5d38400a | ||
|
|
eed49c10ce | ||
|
|
0a2ab16e4c | ||
|
|
dda4ffed08 | ||
|
|
54f9375b32 | ||
|
|
8d667310e3 | ||
|
|
a4371e7f55 | ||
|
|
a5b8d3c730 | ||
|
|
09c97decb6 | ||
|
|
c2fc03b0d7 | ||
|
|
5622fd0991 | ||
|
|
1712a7c776 | ||
|
|
9f3b9da24a | ||
|
|
18ec98c3fb | ||
|
|
c8e4894d85 | ||
|
|
4657ee9087 | ||
|
|
97aed61fc8 | ||
|
|
c11e5e8b12 | ||
|
|
3a727dea28 | ||
|
|
107d2c8e7b | ||
|
|
b1ed521d6b | ||
|
|
e2427a4ce2 | ||
|
|
d12e510fad | ||
|
|
9bde00b7de | ||
|
|
611b9424ee | ||
|
|
0ec6af03c0 | ||
|
|
80f61880b7 | ||
|
|
92541b779c | ||
|
|
f5a4190e4b | ||
|
|
6ae1564136 | ||
|
|
e361ef5543 | ||
|
|
dfa9965ed3 | ||
|
|
dcc54a7f35 | ||
|
|
478a275bb5 | ||
|
|
8c30ee3403 | ||
|
|
cf002e5ab2 | ||
|
|
09ca6e97b8 | ||
|
|
dfa58f909b | ||
|
|
d925efb928 | ||
|
|
1910ee20dd | ||
|
|
faaa700270 | ||
|
|
d0e2e9c85f | ||
|
|
55538934e0 | ||
|
|
ee4a4c81bf | ||
|
|
568b2ddf75 | ||
|
|
8755ebba01 | ||
|
|
18b41d07bd | ||
|
|
614606e3be | ||
|
|
0aa4651657 | ||
|
|
841e6549c0 | ||
|
|
3ec647cfda | ||
|
|
e6fca96d0d | ||
|
|
5e73539393 | ||
|
|
68b867e480 | ||
|
|
4a671dba9e | ||
|
|
ef1f030076 | ||
|
|
341225aff4 | ||
|
|
2d9f688d56 | ||
|
|
3b63d34f34 | ||
|
|
c39da36cca | ||
|
|
c4b49a6d96 | ||
|
|
68e78a7d24 | ||
|
|
8b9a15d4f2 | ||
|
|
71dd59f5bc | ||
|
|
4b03220064 | ||
|
|
7fad742e99 | ||
|
|
fe70d5ecaa | ||
|
|
89022a5065 | ||
|
|
a0d107a0e8 | ||
|
|
e71252306a | ||
|
|
f86037865d | ||
|
|
1cff97f65d | ||
|
|
e3228a9699 | ||
|
|
407ae8d01b | ||
|
|
b3b1bcc60c | ||
|
|
2196fcc911 | ||
|
|
2985fa921a | ||
|
|
9808e5a37a | ||
|
|
ff70dc7c83 | ||
|
|
9093f8e44a | ||
|
|
f8eea3b779 | ||
|
|
85fa92ca12 | ||
|
|
44bfb1e376 | ||
|
|
06378e09be | ||
|
|
2c6b66a834 | ||
|
|
9a4466e74f | ||
|
|
f482496a61 | ||
|
|
6802e22f7e | ||
|
|
79253c76f1 | ||
|
|
5fc754520a | ||
|
|
43bced2e04 | ||
|
|
65468d7826 | ||
|
|
1a553b00b0 | ||
|
|
79a3d2e81b | ||
|
|
4ed6f12374 | ||
|
|
4d6afaacfd | ||
|
|
7d8d4e7ee5 | ||
|
|
3fa88436c3 | ||
|
|
191ac5eeac | ||
|
|
2ce51400aa | ||
|
|
d5aea98f80 | ||
|
|
85fd33a619 | ||
|
|
ada614a956 | ||
|
|
45d51e1d44 | ||
|
|
9c83c195e3 | ||
|
|
ec3f878372 | ||
|
|
9885169baf | ||
|
|
00afd6b635 | ||
|
|
ff3575c7ac | ||
|
|
66201a2853 | ||
|
|
eb85389c0a | ||
|
|
f7c4411c9a | ||
|
|
36d073d597 | ||
|
|
658771612a | ||
|
|
7f7fb2354f | ||
|
|
c146f6d0d9 | ||
|
|
923bba95b4 | ||
|
|
ee594400dc | ||
|
|
77b998c438 | ||
|
|
cf2bc1e980 | ||
|
|
ab4ad0b114 | ||
|
|
dc4acc83a5 | ||
|
|
7263867f14 | ||
|
|
cfe979c8dd | ||
|
|
762df4b914 | ||
|
|
4a57037c47 | ||
|
|
bfe7010350 | ||
|
|
76708c96df | ||
|
|
e0261295db | ||
|
|
953a99ee90 | ||
|
|
e3f3293461 | ||
|
|
8e8ffae57a | ||
|
|
30d328774f | ||
|
|
e1660e592b | ||
|
|
6428fd4ae0 | ||
|
|
b08d08512f | ||
|
|
a25cc14af4 | ||
|
|
30aa59f582 | ||
|
|
3933d78da2 | ||
|
|
a9ed013ca3 | ||
|
|
b198494900 | ||
|
|
216e9a9785 | ||
|
|
c627c9b540 | ||
|
|
359dcd3b99 | ||
|
|
0eaa592086 | ||
|
|
62b61750d1 | ||
|
|
3e1f7d2193 | ||
|
|
8980905c24 | ||
|
|
f3f71e5d14 | ||
|
|
2a9d2a4910 | ||
|
|
59c6f469a0 | ||
|
|
4473b7917b | ||
|
|
3dbb958bde | ||
|
|
f81481c50f | ||
|
|
485c6b80af | ||
|
|
b8d5793ab7 | ||
|
|
933957282b | ||
|
|
381ae195b9 | ||
|
|
d323dcd4e0 | ||
|
|
1ae635a8b5 | ||
|
|
d3eda2e8be | ||
|
|
adf91c95d3 | ||
|
|
eddee2a0d5 | ||
|
|
ff0dd88ee1 | ||
|
|
81d05a67b3 | ||
|
|
a0743c0713 | ||
|
|
8c9ce5dd45 | ||
|
|
4727cd57ed | ||
|
|
775afd6ac2 | ||
|
|
a615038498 | ||
|
|
cd70dcc3ba | ||
|
|
5c53c457e5 | ||
|
|
6d0b550f5d | ||
|
|
37027c0480 | ||
|
|
13aa2cfa6e | ||
|
|
c832d91f79 | ||
|
|
c6c4bc1277 | ||
|
|
2ab2e5a40f | ||
|
|
732cc41be4 | ||
|
|
2f0bee3b19 | ||
|
|
ab1d664f07 | ||
|
|
95bc8e513a | ||
|
|
da2602a632 | ||
|
|
178a2046dc | ||
|
|
d90e4286e3 | ||
|
|
5d0e466d6d | ||
|
|
622fb85f60 | ||
|
|
0ebdd34df3 | ||
|
|
81eee7bba2 | ||
|
|
5ddc3467f8 | ||
|
|
76d9a230c0 | ||
|
|
b3e6f341ff | ||
|
|
6c8f0bff13 | ||
|
|
456f57e32f | ||
|
|
4ca852c2b3 | ||
|
|
3ff075c048 | ||
|
|
ebc9d62f69 | ||
|
|
fd3e60bce1 | ||
|
|
3f01be8d6e | ||
|
|
3ea7685405 | ||
|
|
fa2815df49 | ||
|
|
01dd57a5fb | ||
|
|
a5ebc85bdb | ||
|
|
04a716ac91 | ||
|
|
fc10f3c4cd | ||
|
|
682196543f | ||
|
|
2772a41917 | ||
|
|
0dc4bdd646 | ||
|
|
78916bba41 | ||
|
|
e8e40c7bcf | ||
|
|
47db3386aa | ||
|
|
92f840519c | ||
|
|
e0a0a0beb1 | ||
|
|
d778766e29 | ||
|
|
371dcb0a45 | ||
|
|
9408e8006d | ||
|
|
2e4b7b375b | ||
|
|
868d7cee4a | ||
|
|
e8cc751f22 | ||
|
|
26e0c5d4ea | ||
|
|
ef71b122df | ||
|
|
98ecb97790 | ||
|
|
86cfe82b89 | ||
|
|
1502bcb5d4 | ||
|
|
d2d3968b8b | ||
|
|
1256da9bd5 | ||
|
|
1f6948d260 | ||
|
|
ab18594e00 | ||
|
|
3467d68020 | ||
|
|
db7c7bd21a | ||
|
|
f785888213 | ||
|
|
a346d49b60 | ||
|
|
5dacf4755e | ||
|
|
3e5f36dc97 | ||
|
|
db55b72d87 | ||
|
|
95844ce045 | ||
|
|
4bf4ed0f00 | ||
|
|
1d2d91d091 | ||
|
|
40239f5cb2 | ||
|
|
488e9d77b8 | ||
|
|
85a5041a35 | ||
|
|
fd2d2ddc0b | ||
|
|
f8e7687551 | ||
|
|
5140f42cb1 | ||
|
|
59e1e0bbf0 | ||
|
|
d53e85a232 | ||
|
|
cf36db16ba | ||
|
|
5adf3f023d | ||
|
|
a0e49f8162 | ||
|
|
92eed29ded |
85
AUTHORS
@@ -1 +1,84 @@
|
|||||||
Christophe Dumez <chris@qbittorrent.org>
|
Author:
|
||||||
|
* Christophe Dumez <chris@qbittorrent.org>
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
* Arnaud Demaizière <arnaud@qbittorrent.org>
|
||||||
|
* Ishan Arora <ishan@qbittorrent.org>
|
||||||
|
* Grigis Gaëtan <cipher16@gmail.com>
|
||||||
|
|
||||||
|
Code from other projects:
|
||||||
|
* files src/ico.cpp src/ico.h
|
||||||
|
copyright: Malte Starostik <malte@kde.org>
|
||||||
|
license: LGPL
|
||||||
|
|
||||||
|
Images Authors:
|
||||||
|
* files: src/Icons/*.png
|
||||||
|
copyright: Gnome Icon Theme
|
||||||
|
license: GPLv2
|
||||||
|
url: http://ftp.acc.umu.se/pub/GNOME/sources/gnome-icon-theme
|
||||||
|
|
||||||
|
* files: src/oxygen/*.png
|
||||||
|
copyright: Oxygen Icon Theme (KDE)
|
||||||
|
license: LGPL
|
||||||
|
url: http://www.oxygen-icons.org
|
||||||
|
|
||||||
|
* files: src/Icons/flags/*.png
|
||||||
|
copyright: Open Clip Art Library
|
||||||
|
license: Creative Commons Public Domain Dedication
|
||||||
|
url: http://www.openclipart.org
|
||||||
|
|
||||||
|
* files: src/Icons/skin/*.png
|
||||||
|
files: src/menuicons/YYxYY/*.png
|
||||||
|
copyright: Mateusz Tobola <tobejodok@qbittorrent.org>
|
||||||
|
license: GPLv2
|
||||||
|
|
||||||
|
* file: src/Icons/skin/tabs.gif
|
||||||
|
copyright: Greg Houston <gregory.houston@gmail.com>
|
||||||
|
license: MIT
|
||||||
|
|
||||||
|
* file: src/search_engine/engines/btjunkie.png
|
||||||
|
copyright: Downloaded from btjunkie.org
|
||||||
|
|
||||||
|
* file: src/search_engine/engines/isohunt.png
|
||||||
|
copyright: Downloaded from isohunt.com
|
||||||
|
|
||||||
|
* file: src/search_engine/engines/mininova.png
|
||||||
|
copyright: Downloaded from mininova.org
|
||||||
|
|
||||||
|
* file: src/search_engine/engines/piratebay.png
|
||||||
|
copyright: Downloaded from thepiratebay.org
|
||||||
|
|
||||||
|
* file: src/search_engine/engines/torrentreactor.png
|
||||||
|
copyright: Downloaded from torrentreactor.net
|
||||||
|
|
||||||
|
Translations authors:
|
||||||
|
* files: src/lang/*.ts
|
||||||
|
copyright:
|
||||||
|
- Brazilian: Nick Marinho (nickmarinho@gmail.com)
|
||||||
|
- Bulgarian: Tsvetan & Boiko Bankov (emerge_life@users.sourceforge.net)
|
||||||
|
- Catalan: Gekko Dam Beer (gekko04@users.sourceforge.net)
|
||||||
|
- Chinese (Simplified): Guo Yue (yue.guo0418@gmail.com)
|
||||||
|
- Chinese (Traditional): Yi-Shun Wang (dnextstep@gmail.com)
|
||||||
|
- Czech: Jirka Vilim (web@tets.cz)
|
||||||
|
- Danish: Mathias Nielsen (comoneo@gmail.com)
|
||||||
|
- Dutch: Joost Schipper (heavyjoost@users.sourceforge.net)
|
||||||
|
- English: Christophe Dumez (chris@qbittorrent.org)
|
||||||
|
- Finnish: Niklas Laxström (nikerabbit@users.sourceforge.net)
|
||||||
|
- French: Christophe Dumez (chris@qbittorrent.org)
|
||||||
|
- German: Niels Hoffmann (zentralmaschine@users.sourceforge.net)
|
||||||
|
- Greek: Tsvetan Bankov (emerge_life@users.sourceforge.net)
|
||||||
|
- Hungarian: Majoros Péter (majoros.j.p@t-online.hu)
|
||||||
|
- Italian: Mirko Ferrari (mirkoferrari@gmail.com) and Ferraro Luciano (luciano.ferraro@gmail.com)
|
||||||
|
- Japanese: Nardog (nardog@e2umail.com)
|
||||||
|
- Korean: Jin Woo Sin (jin828sin@users.sourceforge.net)
|
||||||
|
- Norwegian: Lars-Erik Labori (hamil@users.sourceforge.net)
|
||||||
|
- Polish: Jarek Smieja (ajep9691@wp.pl)
|
||||||
|
- Portuguese: Nick Marinho (nickmarinho@gmail.com)
|
||||||
|
- Romanian: Obada Denis (obadadenis@users.sourceforge.net)
|
||||||
|
- Russian: Nick Khazov (m2k3d0n at users.sourceforge.net)
|
||||||
|
- Slovak: helix84
|
||||||
|
- Spanish: Vicente Raul Plata Fonseca (silverxnt@users.sourceforge.net)
|
||||||
|
- Swedish: Daniel Nylander (po@danielnylander.se)
|
||||||
|
- Turkish: Erdem Bingöl (erdem84@gmail.com)
|
||||||
|
- Ukrainian: Andrey Shpachenko (masterfix@users.sourceforge.net)
|
||||||
|
license: GPLv2
|
||||||
|
|||||||
14
COPYING
@@ -1,3 +1,17 @@
|
|||||||
|
qBittorrent is licensed under the GNU General Public License version 2 with the
|
||||||
|
addition of the following special exception:
|
||||||
|
|
||||||
|
In addition, as a special exception, the copyright holders give permission to
|
||||||
|
link this program with the OpenSSL project's "OpenSSL" library (or with
|
||||||
|
modified versions of it that use the same license as the "OpenSSL" library),
|
||||||
|
and distribute the linked executables. You must obey the GNU General Public
|
||||||
|
License in all respects for all of the code used other than "OpenSSL". If you
|
||||||
|
modify file(s), you may extend this exception to your version of the file(s),
|
||||||
|
but you are not obligated to do so. If you do not wish to do so, delete this
|
||||||
|
exception statement from your version.
|
||||||
|
|
||||||
|
----------
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
Version 2, June 1991
|
Version 2, June 1991
|
||||||
|
|
||||||
|
|||||||
293
Changelog
@@ -1,4 +1,291 @@
|
|||||||
* Unknown - Christophe Dumez <chris@qbittorrent.org> - v0.9.0
|
* Unknown - Christophe Dumez <chris@qbittorrent.org> - v1.5.0
|
||||||
|
- FEATURE: Added Magnet URI support
|
||||||
|
- FEATURE: Search engine supports category-based requests
|
||||||
|
- FEATURE: Make use of torrent enclosure in RSS feeds for direct download
|
||||||
|
- FEATURE: Implemented a RSS feed downloader with filter support
|
||||||
|
- FEATURE: Save old RSS item to hard disk to remember them on start up
|
||||||
|
- FEATURE: Display free disk space in torrent addition dialog
|
||||||
|
- FEATURE: In torrent addition from URL, paste clipboard content if it contains an URL
|
||||||
|
- FEATURE: RSS feeds URLs can now be copied to clipboard
|
||||||
|
- FEATURE: RSS feeds can now be grouped into folders
|
||||||
|
- FEATURE: Added "Unread" item to RSS feed list to display all unread news
|
||||||
|
- FEATURE: If a torrent contains a torrent file, process downloaded torrent file too
|
||||||
|
- FEATURE: A random listening port can be chosen automatically
|
||||||
|
- BUGFIX: torrent resume code rewrited
|
||||||
|
- BUGFIX: Greatly improved column sorting code
|
||||||
|
- BUGFIX: Possibility to create trackerless torrents
|
||||||
|
- BUGFIX: Better item coloring in torrent content filtering dialog
|
||||||
|
- COSMETIC: Redesigned search tab to improve usability
|
||||||
|
- COSMETIC: Redesigned RSS tab to improve usability
|
||||||
|
|
||||||
|
* Sun Aug 21 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.4.1
|
||||||
|
- BUGFIX: Fix problems when changing save path (if using temporary download folder)
|
||||||
|
- BUGFIX: Display real save path instead of the temporary one in torrent properties
|
||||||
|
- BUGFIX: Catching invalid_handle exception to avoid rare crashes
|
||||||
|
- BUGFIX: Fixed popup menu position in RSS feeds list
|
||||||
|
- BUGFIX: Don't save RSS feed state if it could not be updated
|
||||||
|
|
||||||
|
* Thu Aug 13 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.4.0
|
||||||
|
- FEATURE: Display swarm information in lists
|
||||||
|
- FEATURE: Allow to define temporary download folder
|
||||||
|
- FEATURE: Display total amount of uploaded data in finished list
|
||||||
|
- FEATURE: Resizing a column in a search results tab affects all tabs
|
||||||
|
- FEATURE: Search results tab columns are now remembered upon startup
|
||||||
|
- FEATURE: Added right click menu in search engine to clear completion history
|
||||||
|
- FEATURE: Allow to set a different port for DHT (UDP) than the one used for Bittorrent
|
||||||
|
- FEATURE: Updated spoofing code to avoid trackers ban
|
||||||
|
- BUGFIX: Provide more helpful explanation when an I/O error occured
|
||||||
|
- BUGFIX: Stop enforcing UTF-8 and use system locale instead
|
||||||
|
- COSMETIC: Redesigned program preferences
|
||||||
|
- COSMETIC: Updated icons set
|
||||||
|
|
||||||
|
* Fri Jul 24 2009 - Christophe DUMEZ <chris@qbittorrent.org> - 1.3.5
|
||||||
|
- BUGFIX: Made IP filter parser more robust
|
||||||
|
- BUGFIX: Fixed torrent creation tool
|
||||||
|
- BUGFIX: Fixed possible overflow in progress calculation in arborescence.h
|
||||||
|
- BUGFIX: Save properties window size, position, columns width and restore them
|
||||||
|
- BUGFIX: Set a minimum default width for NAME column in properties
|
||||||
|
- BUGFIX: Remember visual indexes of columns in transfer lists
|
||||||
|
|
||||||
|
* Sun Jul 12 2009 - Christophe DUMEZ <chris@qbittorrent.org> - v1.3.4
|
||||||
|
- BUGFIX: Fixed IP filter file parsing on 64bits
|
||||||
|
- BUGFIX: Suppressed QLayout: Attempting to add QLayout "" to properties "properties" warning message when opening a properties dialog
|
||||||
|
- BUGFIX: Fixed a little bug in search engine plugins helper file
|
||||||
|
- BUGFIX: Fixed compilation problems with Qt 4.3
|
||||||
|
- BUGFIX: Percentages no longer disapear with default cleanlooks style
|
||||||
|
- BUGFIX: Cleanly fixed popup menus position in lists (no more workarounds)
|
||||||
|
- BUGFIX: Fixed memory leak in search engine
|
||||||
|
- BUGFIX: Torrents with an infinite ratio are no longer affected by ratio_limit set in program preferences
|
||||||
|
- BUGFIX: Display a ratio of 0.0 if total_upload and total_download are both 0
|
||||||
|
- BUGFIX: Remove last separator in top tool bar
|
||||||
|
- BUGFIX: Tuned lists properties to make sure display is correct
|
||||||
|
- COSMETIC: Display date as well as time in log window
|
||||||
|
|
||||||
|
* Sun Apr 5 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.3.3
|
||||||
|
- BUGFIX: Fixed Web UI torrent upload form
|
||||||
|
- BUGFIX: Fixed unicode support in search engine
|
||||||
|
- BUGFIX: Fixed search engine bug that prevented a torrent from appearing more than once among all tabs
|
||||||
|
- LICENSE: Added an exception to the license regarding OpenSSL.
|
||||||
|
- I18N: Updated Finnish translation
|
||||||
|
|
||||||
|
* Sat Mar 7 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.3.2
|
||||||
|
- BUGFIX: Fix top toolbar disabling
|
||||||
|
- BUGFIX: Fix building with Qt 4.5
|
||||||
|
- BUGFIX: RSS items read status is now remembered upon restart
|
||||||
|
|
||||||
|
* Mon Jan 26 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.3.1
|
||||||
|
- BUGFIX: Torrents paused due to an I/O error were displayed as queued
|
||||||
|
- BUGFIX: qBittorrent now prints backtrace in terminal when segfaulting
|
||||||
|
- BUGFIX: Fixed files progress display in torrent properties
|
||||||
|
- BUGFIX: Improved torrent ratio calculation
|
||||||
|
- BUGFIX: Fixed possible crash when parsing filter file
|
||||||
|
- BUGFIX: Made some code optimization
|
||||||
|
- BUGFIX: Fixed download/upload speed decrease problems
|
||||||
|
- I18N: Updated Finnish, Bulgarian and Greek translations
|
||||||
|
|
||||||
|
* Fri Jan 9 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.3.0
|
||||||
|
- FEATURE: Based on libtorrent-rasterbar v0.14.2
|
||||||
|
- FEATURE: Improved ratio calculation system
|
||||||
|
- FEATURE: Torrent creation code cleanup
|
||||||
|
- FEATURE: Allow to set maximum number of active seeds (queueing)
|
||||||
|
- FEATURE: Now seeds priorities are handled automatically by libtorrent-rasterbar (queueing)
|
||||||
|
- FEATURE: Code cleanup and optimization (save memory and cpu)
|
||||||
|
- FEATURE: ETA calculation now relies on average speed over all sessions
|
||||||
|
- FEATURE: Allow to force rechecking torrents
|
||||||
|
- FEATURE: Added support for 2 new extensions (uTorrent metadata and smart ban plugin)
|
||||||
|
- FEATURE: Allow to change the save path of torrents after addition
|
||||||
|
- FEATURE: Got rid of libmagick++ dependency
|
||||||
|
- FEATURE: Updated Web interface to MochaUI v0.9.5
|
||||||
|
- FEATURE: Added notification in WebUI when qBittorrent is not reachable
|
||||||
|
- FEATURE: Rewrote folder scanning code (Now uses a filesystem watcher)
|
||||||
|
- FEATURE: Added torrent deletion from hard drive function in Web UI
|
||||||
|
- FEATURE: Added queueing priority actions in Web UI
|
||||||
|
- FEATURE: Display progress using progress bars in Web UI
|
||||||
|
- BUGFIX: Made usage of fastresume data more reliable
|
||||||
|
- BUGFIX: qBittorrent shutdown is now faster
|
||||||
|
- BUGFIX: Fixed several memory leaks
|
||||||
|
- BUGFIX: WebUI is now working with IE7
|
||||||
|
- BUGFIX: Fixed spacing problem in toolbar when toggling its visibility
|
||||||
|
- BUGFIX: Fixed some compilation and Qt4 warnings
|
||||||
|
- BUGFIX: Do not use an addition dialog for torrents from folder scanning
|
||||||
|
- BUGFIX: Catch SIGTERM to exit cleanly (e.g. computer shutdown)
|
||||||
|
- BUGFIX: Improved proxy support code
|
||||||
|
- BUGFIX: Fixed systray icon tooltip on Windows
|
||||||
|
- BUGFIX: Proxy settings are now saved even if disabled
|
||||||
|
|
||||||
|
* Sun Nov 9 2008 - Christophe Dumez <chris@qbittorrent.org> - v1.2.1
|
||||||
|
- BUGFIX: Fixed possible crash when deleting a torrent permanently
|
||||||
|
- BUGFIX: Queued_for_checking torrents were not displayed as checking in seeding list
|
||||||
|
- BUGFIX: Speed up startup time when having a lot of torrents
|
||||||
|
|
||||||
|
* Wed Oct 29th 2008 - Christophe Dumez <chris@qbittorrent.org> - v1.2.0
|
||||||
|
- FEATURE: Torrent queueing system (with priorities)
|
||||||
|
- FEATURE: The number of DHT nodes is displayed
|
||||||
|
- FEATURE: RSS can now be disabled from program preferences
|
||||||
|
- FEATURE: Added collapse/expand all buttons in addition and properties dialogs
|
||||||
|
- FEATURE: Can have different proxies for Bittorrent and search engine
|
||||||
|
- FEATURE: Allow multiple item selection in Web UI transfer list
|
||||||
|
- FEATURE: Moved uploads to a separate list in Web UI
|
||||||
|
- BUGFIX: Totally rewritten Web UI list refresh system (fixed memory leak)
|
||||||
|
- BUGFIX: Disable ETA calculation when ETA column is hidden
|
||||||
|
- BUGFIX: Removed "disconnected" connection state, detection was far from perfect
|
||||||
|
- BUGFIX: Torrents are no longer starting from scratch when changing default save path (when torrent addition dialog is disabled)
|
||||||
|
- BUGFIX: Single instance code is now more reliable on Qt >= 4.4
|
||||||
|
- COSMETIC: Transfer speed, ratio, connection status and DHT nodes are displayed in status bar
|
||||||
|
- COSMETIC: RSS Tab is now hidden as a default
|
||||||
|
- COSMETIC: Allow to hide or display top toolbar
|
||||||
|
- COSMETIC: Log is now in a separate dialog
|
||||||
|
|
||||||
|
* Sun Sept 14 2008 - Christophe Dumez <chris@qbittorrent.org> - v1.1.4
|
||||||
|
- FEATURE: DHT is no longer used as fallback only
|
||||||
|
- FEATURE: Ported WebUI to Mootools v1.2
|
||||||
|
- BUGFIX: Fixed 'start seeding after torrent creation' feature
|
||||||
|
- BUGFIX: Fixed compilation with boost v1.36
|
||||||
|
- BUGFIX: Some code optimization
|
||||||
|
- BUGFIX: Fixed memory leak in Web UI
|
||||||
|
- BUGFIX: Fixed problems with column sorting
|
||||||
|
- BUGFIX: Improved code for pausing torrents on startup
|
||||||
|
- BUGFIX: Torrent addition dialog is now disabled for downloads from WebUI
|
||||||
|
- BUGFIX: Give focus to input field in WebUI download dialog
|
||||||
|
|
||||||
|
* Tue Aug 26 2008 - Christophe Dumez <chris@qbittorrent.org> - v1.1.3
|
||||||
|
- BUGFIX: Fixed ratio saving for seeding torrents
|
||||||
|
- I18N: Added czech and traditional chinese translations
|
||||||
|
|
||||||
|
* Sun Aug 17 2008 - Christophe Dumez <chris@qbittorrent.org> - v1.1.2
|
||||||
|
- BUGFIX: Fixed progress calculation
|
||||||
|
- BUGFIX: Fixed finished torrent detection
|
||||||
|
|
||||||
|
* Fri Aug 01 2008 - Christophe Dumez <chris@qbittorrent.org> - v1.1.1
|
||||||
|
- BUGFIX: Fixed bad resource file for icons
|
||||||
|
|
||||||
|
* Fri Aug 01 2008 - Christophe Dumez <chris@qbittorrent.org> - v1.1.0
|
||||||
|
- FEATURE: Web interface to control qbittorrent (Ishan Arora)
|
||||||
|
- FEATURE: Can spoof Azureus peer id to avoid ban
|
||||||
|
- FEATURE: Allow to hide/show some columns in download and seeding lists
|
||||||
|
- FEATURE: Option to start qBittorrent minimized in systray
|
||||||
|
- FEATURE: Multi-tab support in search engine (Grigis Gaëtan)
|
||||||
|
- FEATURE: Allow to define double-click actions in torrents lists
|
||||||
|
- FEATURE: Allow to open torrent destination folder
|
||||||
|
- FEATURE: Real progress bar in torrent properties that displays downloaded pieces
|
||||||
|
- FEATURE: Allow to buy downloads using ShareMonkey
|
||||||
|
- FEATURE: Display if UPnP/NAT-PMP was successful or not
|
||||||
|
- FEATURE: Threadified torrent creation
|
||||||
|
- FEATURE: Improved eMule DAT ip filter parser
|
||||||
|
- FEATURE: Added support for PeerGuardian p2p filters (text)
|
||||||
|
- FEATURE: Added support for PeerGuardian p2b filters (binary)
|
||||||
|
- FEATURE: Allow to customize folder scan interval
|
||||||
|
- FEATURE: Allow to add several trackers at once
|
||||||
|
- BUGFIX: Allow to run one instance of qBittorrent per user
|
||||||
|
- BUGFIX: Do not display seeds number in seeding list (always 0)
|
||||||
|
- BUGFIX: Threadified IP filter file parser to avoid GUI freeze
|
||||||
|
- BUGFIX: Ask if we want to redownload if content was deleted from hard drive
|
||||||
|
- BUGFIX: Added missing copyright/licensing information for some files
|
||||||
|
- BUGFIX: qBittorrent is no longer conflicting with rTorrent (libtorrent renamed to libtorrent-rasterbar)
|
||||||
|
- COSMETIC: Do not display progress bar in seeding list (always 100%)
|
||||||
|
- COSMETIC: Added a progress bar for torrent creation
|
||||||
|
- COSMETIC: Display tracker errors in a cleaner way
|
||||||
|
- COSMETIC: Display "unpaused/total_torrent" in download/upload tabs
|
||||||
|
- COSMETIC: Allow to resize RSS column
|
||||||
|
- COSMETIC: Global UP/DL speeds and ratio are displayed above tabs
|
||||||
|
- COSMETIC: Use infinity symbol for ETA when time is infinite
|
||||||
|
|
||||||
|
* Fri Apr 11 2008 - Christophe Dumez <chris@qbittorrent.org> - v1.0.0
|
||||||
|
- FEATURE: Based on new libtorrent v0.13
|
||||||
|
- FEATURE: Added UPnP / NAT-PMP port forwarding support
|
||||||
|
- FEATURE: Added encryption support (compatible with Azureus)
|
||||||
|
- FEATURE: Bittorrent FAST extension support
|
||||||
|
- FEATURE: Added RSS support
|
||||||
|
- FEATURE: Support files prioritizing in a torrent
|
||||||
|
- FEATURE: Brand new search engine plugins system
|
||||||
|
- FEATURE: Filtered files don't appear on hard disk anymore
|
||||||
|
- FEATURE: Finished torrents are now moved to another tab for seeding
|
||||||
|
- FEATURE: Display more infos about the torrent in its properties
|
||||||
|
- FEATURE: Allow the user to edit torrents' trackers
|
||||||
|
- FEATURE: Allow user to change qBT's style (Plastique, Cleanlooks, Motif, CDE, MacOSX, WinXP)
|
||||||
|
- FEATURE: Allow the user to disable system tray integration
|
||||||
|
- FEATURE: Search engine is now using one thread per website for faster results
|
||||||
|
- FEATURE: Improved a lot the torrent creation module
|
||||||
|
- FEATURE: Allow to set upload/download limit per torrent (right click)
|
||||||
|
- FEATURE: Ask for exit confirmation only if download list is not empty
|
||||||
|
- FEATURE: Allow to use a proxy for trackers / web seeds / peers / DHT connections
|
||||||
|
- FEATURE: Supports SOCKS5 proxies as well as HTTP ones
|
||||||
|
- FEATURE: Better systems integration (buttons, dialogs...)
|
||||||
|
- FEATURE: Filtered files are not allocated on the hard-drive anymore (sparse file support)
|
||||||
|
- FEATURE: IPs blocked by filter are now logged in GUI
|
||||||
|
- FEATURE: Added a way to link against static libtorrent (useful for deb packages)
|
||||||
|
- FEATURE: Allow to set global upload/download limits from tray icon menu
|
||||||
|
- FEATURE: IPv6 is now fully supported
|
||||||
|
- FEATURE: Real torrent share ratio is now displayed in transfer list
|
||||||
|
- FEATURE: Added keyboard shortcuts for main actions (see wiki)
|
||||||
|
- FEATURE: Added a popup menu to set priority for multiple files at once
|
||||||
|
- FEATURE: Improved a lot downloading from urls (using libcommoncpp2 instead of libcurl)
|
||||||
|
- FEATURE: A search request can now be terminated by another
|
||||||
|
- FEATURE: User is now warned when fast resume data was rejected
|
||||||
|
- FEATURE: Url seeds are now displayed in torrent properties and are editable
|
||||||
|
- FEATURE: Allow to drag 'n drop urls on the main window
|
||||||
|
- FEATURE: Improved search engine (multipage support in all plugins)
|
||||||
|
- FEATURE: Added BTJunkie search engine plugin
|
||||||
|
- FEATURE: Added an option to force full disk allocation for all torrents
|
||||||
|
- FEATURE: Added an option to add torrents in paused state
|
||||||
|
- FEATURE: Added an option to set the max number of connections per torrent
|
||||||
|
- FEATURE: Added an option to set the max number of uploads per torrent
|
||||||
|
- FEATURE: Added an option to automatically delete torrents when they reach a given ratio (>= 1.0)
|
||||||
|
- FEATURE: Added an option to display current transfer speeds in title bar
|
||||||
|
- FEATURE: Torrent content is now displayed as a tree
|
||||||
|
- I18N: Added Hungarian translation
|
||||||
|
- I18N: Added Brazilian translation
|
||||||
|
- BUGFIX: Progress of paused torrents is now correct on restart
|
||||||
|
- BUGFIX: Progress column gets sorted on restart it is was during last execution
|
||||||
|
- BUGFIX: Made ETA more reliable using stats instead of instant values
|
||||||
|
- BUGFIX: Remove torrent from hard drive used to delete parent folder if empty
|
||||||
|
- BUGFIX: Fixed a crash when filtering all the files in a torrent
|
||||||
|
- BUGFIX: Reload torrent only when necessary (properties)
|
||||||
|
- BUGFIX: qBittorrent is not exiting anymore when a dialog is closed and main window is hidden
|
||||||
|
- BUGFIX: Search plugin update is not making the GUI freeze anymore (moved to a thread)
|
||||||
|
- BUGFIX: DHT settings were not saved correctly
|
||||||
|
- BUGFIX: Workaround to build on Fedora system (pkg-config problem)
|
||||||
|
- BUGFIX: search plugin update - do not display only last version changelog
|
||||||
|
- BUGFIX: Search plugin update - fixed missing new lines in changelog
|
||||||
|
- BUGFIX: The number of search results was not reset when clicking on 'Clear' button
|
||||||
|
- BUGFIX: Update torrent progress when its content changed (filtered files)
|
||||||
|
- BUGFIX: Improved the way menu icons are installed to avoid problems on some systems
|
||||||
|
- BUGFIX: Improved incremental download
|
||||||
|
- BUGFIX: Improved unicode support
|
||||||
|
- BUGFIX: Made torrent deletion from hard-drive safer
|
||||||
|
- BUGFIX: Prevent downloadFromUrl flooding
|
||||||
|
- BUGFIX: ETA was wrong for torrents with filtered files
|
||||||
|
- BUGFIX: Fixed drag'n drop on non-KDE systems
|
||||||
|
- BUGFIX: Removed build dependency on Python
|
||||||
|
- BUGFIX: Catching DHT exception in case there is a problem
|
||||||
|
- COSMETIC: Redesigned torrent properties a little
|
||||||
|
- COSMETIC: Totally redesigned program preferences
|
||||||
|
- COSMETIC: Display more logs messages concerning features
|
||||||
|
- COSMETIC: Improved lists renderers
|
||||||
|
- COSMETIC: Use a different icon for torrents being checked and for connecting ones
|
||||||
|
- COSMETIC: Improved some icons
|
||||||
|
- COSMETIC: Improved systray tooltip style
|
||||||
|
|
||||||
|
* Mon May 07 2007 - Christophe Dumez <chris@qbittorrent.org> - v0.9.3
|
||||||
|
- BUGFIX: Fixed pause toggle on double-click in download list
|
||||||
|
- BUGFIX: The torrent size displayed now only takes unfiltered files into account
|
||||||
|
- BUGFIX: Fixed compiling errors with libtorrent svn (future v0.13 with UPnP enabled)
|
||||||
|
- BUGFIX: Remember sorted column in download list on restart
|
||||||
|
- BUGFIX: Small fix in the german translation
|
||||||
|
- BUGFIX: Some fixes in slovak translation
|
||||||
|
|
||||||
|
* Tue Apr 10 2007 - Christophe Dumez <chris@qbittorrent.org> - v0.9.2
|
||||||
|
- BUGFIX: Window can now stay maximized on exit
|
||||||
|
- BUGFIX: Use PKGCONFIG again for configuring libtorrent
|
||||||
|
- BUGFIX: Allow to compile with libtorrent v0.11
|
||||||
|
- BUGFIX: Disabled main window context menu (annoying)
|
||||||
|
- I18N: Added Japanese translation
|
||||||
|
- I18N: Updated Turkish translation
|
||||||
|
|
||||||
|
* Wed Apr 04 2007 - Christophe Dumez <chris@qbittorrent.org> - v0.9.1
|
||||||
|
- BUGFIX: A lot of fixes in configure file
|
||||||
|
|
||||||
|
* Sun Apr 01 2007 - Christophe Dumez <chris@qbittorrent.org> - v0.9.0
|
||||||
- FEATURE: Based on libtorrent v0.12
|
- FEATURE: Based on libtorrent v0.12
|
||||||
- FEATURE: Based on Qt4.2
|
- FEATURE: Based on Qt4.2
|
||||||
- FEATURE: Brand new trayicon from Qt4.2
|
- FEATURE: Brand new trayicon from Qt4.2
|
||||||
@@ -12,6 +299,7 @@
|
|||||||
- FEATURE: Added Autocompletion to search engine
|
- FEATURE: Added Autocompletion to search engine
|
||||||
- FEATURE: Splitted BT & GUI parts (huge code rewriting & optimization)
|
- FEATURE: Splitted BT & GUI parts (huge code rewriting & optimization)
|
||||||
- FEATURE: New parameters for configure file to point to custom locations for libtorrent/libcurl
|
- FEATURE: New parameters for configure file to point to custom locations for libtorrent/libcurl
|
||||||
|
- FEATURE: Update application style according to the system (WindowsXP, MacOS, X11)
|
||||||
- BUGFIX: Two torrents can now have the same name although they are different (use their hash)
|
- BUGFIX: Two torrents can now have the same name although they are different (use their hash)
|
||||||
- BUGFIX: Fixed download from url that would fail sometimes
|
- BUGFIX: Fixed download from url that would fail sometimes
|
||||||
- BUGFIX: Save directory was reset to default when filtering files in torrent
|
- BUGFIX: Save directory was reset to default when filtering files in torrent
|
||||||
@@ -25,6 +313,9 @@
|
|||||||
- BUGFIX: Create Options object only when necessary (to save memory)
|
- BUGFIX: Create Options object only when necessary (to save memory)
|
||||||
- BUGFIX: Let libtorrent store the torrent handles (save memory)
|
- BUGFIX: Let libtorrent store the torrent handles (save memory)
|
||||||
- BUGFIX: Set DHT Port only when DHT is enabled
|
- BUGFIX: Set DHT Port only when DHT is enabled
|
||||||
|
- BUGFIX: Made ipfilter.dat parser less sensitive to errors
|
||||||
|
- BUGFIX: Bring main window to foreground when asking for exit confirmation
|
||||||
|
- I18N: Added Danish translation
|
||||||
- I18N: Better internationalization thanks to dynamic text support
|
- I18N: Better internationalization thanks to dynamic text support
|
||||||
- COSMETIC: Replaced OSD messages by Qt4.2 systray messages
|
- COSMETIC: Replaced OSD messages by Qt4.2 systray messages
|
||||||
|
|
||||||
|
|||||||
29
INSTALL
@@ -1,4 +1,4 @@
|
|||||||
qBittorrent - A BitTorrent client in C++ / Qt4.2
|
qBittorrent - A BitTorrent client in C++ / Qt4
|
||||||
------------------------------------------
|
------------------------------------------
|
||||||
|
|
||||||
*** Necessary if qt3 is default on your system ***
|
*** Necessary if qt3 is default on your system ***
|
||||||
@@ -14,23 +14,32 @@ qbittorrent
|
|||||||
will install and execute qBittorrent hopefully without any problems.
|
will install and execute qBittorrent hopefully without any problems.
|
||||||
|
|
||||||
Dependencies:
|
Dependencies:
|
||||||
- Qt >= 4.2 (libqt-devel, libqtgui, libqtcore, libqtnetwork)
|
- Qt >= 4.3.0 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml)
|
||||||
|
Qt >= 4.4.0 is advised
|
||||||
|
|
||||||
- libtorrent by Arvid Norberg (>= v0.12 REQUIRED)
|
- libtorrent-rasterbar by Arvid Norberg (>= v0.14.0 REQUIRED)
|
||||||
-> http://libtorrent.sf.net
|
-> http://www.qbittorrent.org/download.php (advised)
|
||||||
Be carefull: another library (the one used by rtorrent) use the same name.
|
-> http://www.libtorrent.net
|
||||||
These are TWO different libraries and qBittorrent will only work with the one provided
|
Be careful: another library (the one used by rTorrent) uses a similar name.
|
||||||
on sourceforge (created by Arvid Norberg). The two libraries conflicts with each other.
|
|
||||||
|
|
||||||
- libboost: libboost-filesystem, libboost-date-time, libboost-thread, libboost-serialization
|
- libboost: libboost-filesystem, libboost-date-time, libboost-thread, libboost-serialization
|
||||||
|
|
||||||
- libcurl
|
- libcurl
|
||||||
|
|
||||||
- python >= 2.3 (previous might work - not tested): needed by search engine.
|
- python >= 2.3 (needed by search engine)
|
||||||
|
|
||||||
NOTE FOR GNOME USERS:
|
- libmagick++ (advised, not required)
|
||||||
- qt4-qtconfig package is advised or qBittorrent interface will be ugly
|
* Needed for favicons support (RSS / Search plugins)
|
||||||
|
|
||||||
|
- libzzip (advised, not required)
|
||||||
|
* Needed for zip support (Search plugins)
|
||||||
|
|
||||||
|
NOTE FOR NON-KDE USERS:
|
||||||
|
- qt4-qtconfig package is advised when using other systems than KDE.
|
||||||
|
You can also change qBittorrent style to Cleanlooks (GNOME like)
|
||||||
|
|
||||||
|
DOCUMENTATION:
|
||||||
|
Please note that there is a documentation with a "compiling howto" at http://wiki.qbittorrent.org.
|
||||||
|
|
||||||
------------------------------------------
|
------------------------------------------
|
||||||
Christophe Dumez <chris@qbittorrent.org>
|
Christophe Dumez <chris@qbittorrent.org>
|
||||||
|
|||||||
16
README
@@ -1,32 +1,32 @@
|
|||||||
qBittorrent - A BitTorrent client in Qt4.2
|
qBittorrent - A BitTorrent client in Qt4
|
||||||
------------------------------------------
|
------------------------------------------
|
||||||
|
|
||||||
Description:
|
Description:
|
||||||
********************************
|
********************************
|
||||||
qBittorrent is a bittorrent client programmed in C++ / Qt4.2 that use
|
qBittorrent is a bittorrent client programmed in C++ / Qt4 that uses
|
||||||
libtorrent (sometimes called rb_libtorrent) by Arvid Norberg.
|
libtorrent (sometimes called rblibtorrent) by Arvid Norberg.
|
||||||
|
|
||||||
It aims to be a good alternative to all other bittorrent clients
|
It aims to be a good alternative to all other bittorrent clients
|
||||||
out there. qBittorrent is fast, stable and provides unicode
|
out there. qBittorrent is fast, stable and provides unicode
|
||||||
support.
|
support as well as many features.
|
||||||
|
|
||||||
Installation:
|
Installation:
|
||||||
********************************
|
********************************
|
||||||
For installation follow the instructions from INSTALL file, but simple
|
For installation, follow the instructions from INSTALL file, but simple:
|
||||||
|
|
||||||
./configure
|
./configure
|
||||||
make && make install
|
make && make install
|
||||||
qbittorrent
|
qbittorrent
|
||||||
|
|
||||||
will install and execute qBittorrent hopefully without any problems.
|
will install and execute qBittorrent hopefully without any problem.
|
||||||
|
|
||||||
For more information please visit:
|
For more information please visit:
|
||||||
http://www.qbittorrent.org
|
http://www.qbittorrent.org
|
||||||
|
|
||||||
Please report any bug (or feature requests) to:
|
Please report any bug (or feature request) to:
|
||||||
http://bugs.qbittorrent.org
|
http://bugs.qbittorrent.org
|
||||||
|
|
||||||
You can also meet me on IRC:
|
You can also meet me (chris-qBT) on IRC:
|
||||||
#qbittorrent on irc.freenode.net
|
#qbittorrent on irc.freenode.net
|
||||||
|
|
||||||
------------------------------------------
|
------------------------------------------
|
||||||
|
|||||||
42
TODO
@@ -1,42 +1,2 @@
|
|||||||
// Easy
|
See https://blueprints.launchpad.net/qbittorrent/
|
||||||
- Write documentation
|
|
||||||
- Translations into as many languages as possible
|
|
||||||
- Improve man page
|
|
||||||
- Add more keyboard shortcuts
|
|
||||||
|
|
||||||
// Intermediate
|
|
||||||
- Port on MacOS, Windows (and create an installer for Windows) - Progressing
|
|
||||||
- Add some transparency (menus,...)
|
|
||||||
- Add upnp port forwarding support
|
|
||||||
|
|
||||||
// Harder
|
|
||||||
- Allow user to organize the downloads into categories/folders
|
|
||||||
- Display new searches in new tabs
|
|
||||||
- Display a progress bar that really displays the pieces we have (like in eMule)
|
|
||||||
|
|
||||||
// Waiting for libtorrent
|
|
||||||
- Encryption support (v0.13?)
|
|
||||||
- File selection in a torrent in compact mode
|
|
||||||
- Allow to prioritize files within a torrent
|
|
||||||
- Allow to prioritize torrents
|
|
||||||
|
|
||||||
// Unsure
|
|
||||||
- Azureus spoofing to prevent ban from trackers?
|
|
||||||
- Web interface?
|
|
||||||
- Use downloader class to download search plugin updates
|
|
||||||
- Allow to set upload limit for each torrent
|
|
||||||
- Option to shutdown computer when downloads are finished
|
|
||||||
- Add a torrent scheduler
|
|
||||||
|
|
||||||
// in v1.0.0 (partial)
|
|
||||||
- Download from RSS feeds (WIP by gtsoul)
|
|
||||||
- Move finished torrent to another tab and keep on seeding them even after restart
|
|
||||||
- Allow to edit the trackers for a torrent
|
|
||||||
- Improve torrent creation dialog (look & features)
|
|
||||||
- Add IPv6 support (at least start working on it)
|
|
||||||
- UPnP support?
|
|
||||||
|
|
||||||
// In v0.9.0
|
|
||||||
- Update translations (FR, SV, NB, PL, RU, DE done)
|
|
||||||
- Bug squashing
|
|
||||||
- Wait for libtorrent v0.12 official release
|
|
||||||
480
configure
vendored
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
#
|
#
|
||||||
# Generated by qconf 1.3 ( http://delta.affinix.com/qconf/ )
|
# Generated by qconf 1.4 ( http://delta.affinix.com/qconf/ )
|
||||||
#
|
#
|
||||||
|
|
||||||
show_usage() {
|
show_usage() {
|
||||||
@@ -18,10 +18,12 @@ Main options:
|
|||||||
--help This help text.
|
--help This help text.
|
||||||
|
|
||||||
Dependency options:
|
Dependency options:
|
||||||
--with-libtorrent-inc=[path] Path to libtorrent include files
|
--with-libboost-inc=[path] Path to libboost include files
|
||||||
--with-libtorrent-lib=[path] Path to libtorrent library files
|
--with-libcurl-inc=[path] Path to libcurl include files
|
||||||
--with-libcurl-inc=[path] Path to libcurl include files
|
--with-libcurl-lib=[path] Path to libcurl library files
|
||||||
--with-libcurl-lib=[path] Path to libcurl library files
|
--disable-libzzip Disable use of libzzip
|
||||||
|
--with-libzzip-inc=[path] Path to libzzip++ include files
|
||||||
|
--with-libzzip-lib=[path] Path to libzzip++ library files
|
||||||
|
|
||||||
EOT
|
EOT
|
||||||
}
|
}
|
||||||
@@ -138,13 +140,8 @@ while [ $# -gt 0 ]; do
|
|||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
|
|
||||||
--with-libtorrent-inc=*)
|
--with-libboost-inc=*)
|
||||||
QC_WITH_LIBTORRENT_INC=$optarg
|
QC_WITH_LIBBOOST_INC=$optarg
|
||||||
shift
|
|
||||||
;;
|
|
||||||
|
|
||||||
--with-libtorrent-lib=*)
|
|
||||||
QC_WITH_LIBTORRENT_LIB=$optarg
|
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@@ -158,8 +155,23 @@ while [ $# -gt 0 ]; do
|
|||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
--disable-libzzip)
|
||||||
|
QC_DISABLE_libzzip="Y"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
|
||||||
|
--with-libzzip-inc=*)
|
||||||
|
QC_WITH_LIBZZIP_INC=$optarg
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
|
||||||
|
--with-libzzip-lib=*)
|
||||||
|
QC_WITH_LIBZZIP_LIB=$optarg
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
|
||||||
--verbose)
|
--verbose)
|
||||||
QC_DEBUG="Y"
|
QC_VERBOSE="Y"
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
--help) show_usage; exit ;;
|
--help) show_usage; exit ;;
|
||||||
@@ -173,46 +185,67 @@ DATADIR=${DATADIR:-$PREFIX/share}
|
|||||||
|
|
||||||
echo "Configuring qbittorrent ..."
|
echo "Configuring qbittorrent ..."
|
||||||
|
|
||||||
if [ "$QC_DEBUG" = "Y" ]; then
|
if [ "$QC_VERBOSE" = "Y" ]; then
|
||||||
echo
|
echo
|
||||||
echo PREFIX=$PREFIX
|
echo PREFIX=$PREFIX
|
||||||
echo BINDIR=$BINDIR
|
echo BINDIR=$BINDIR
|
||||||
echo DATADIR=$DATADIR
|
echo DATADIR=$DATADIR
|
||||||
echo EX_QTDIR=$EX_QTDIR
|
echo EX_QTDIR=$EX_QTDIR
|
||||||
echo QC_WITH_LIBTORRENT_INC=$QC_WITH_LIBTORRENT_INC
|
echo QC_WITH_LIBBOOST_INC=$QC_WITH_LIBBOOST_INC
|
||||||
echo QC_WITH_LIBTORRENT_LIB=$QC_WITH_LIBTORRENT_LIB
|
|
||||||
echo QC_WITH_LIBCURL_INC=$QC_WITH_LIBCURL_INC
|
echo QC_WITH_LIBCURL_INC=$QC_WITH_LIBCURL_INC
|
||||||
echo QC_WITH_LIBCURL_LIB=$QC_WITH_LIBCURL_LIB
|
echo QC_WITH_LIBCURL_LIB=$QC_WITH_LIBCURL_LIB
|
||||||
|
echo QC_DISABLE_libzzip=$QC_DISABLE_libzzip
|
||||||
|
echo QC_WITH_LIBZZIP_INC=$QC_WITH_LIBZZIP_INC
|
||||||
|
echo QC_WITH_LIBZZIP_LIB=$QC_WITH_LIBZZIP_LIB
|
||||||
echo
|
echo
|
||||||
fi
|
fi
|
||||||
|
|
||||||
printf "Verifying Qt 4 build environment ... "
|
printf "Verifying Qt 4 build environment ... "
|
||||||
|
|
||||||
if [ "$QC_DEBUG" = "Y" ]; then
|
# run qmake -v and check version
|
||||||
|
qmake_check_v4() {
|
||||||
|
if [ -x "$1" ]; then
|
||||||
|
if echo `$1 -v 2>&1` | grep "Qt version 4\." >/dev/null 2>&1; then
|
||||||
|
return 0
|
||||||
|
elif [ "$QC_VERBOSE" = "Y" ]; then
|
||||||
|
echo "Warning: $1 not for Qt 4"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ "$QC_VERBOSE" = "Y" ]; then
|
||||||
echo
|
echo
|
||||||
fi
|
fi
|
||||||
|
|
||||||
qm=""
|
qm=""
|
||||||
|
names="qmake-qt4 qmake4 qmake"
|
||||||
|
|
||||||
# qt4 check: --qtdir
|
# qt4 check: --qtdir
|
||||||
if [ -z "$qm" ]; then
|
if [ -z "$qm" ] && [ ! -z "$EX_QTDIR" ]; then
|
||||||
qstr=$EX_QTDIR/bin/qmake
|
for n in $names; do
|
||||||
if [ -x "$qstr" ]; then
|
qstr=$EX_QTDIR/bin/$n
|
||||||
qm=$qstr
|
if qmake_check_v4 "$qstr"; then
|
||||||
fi
|
qm=$qstr
|
||||||
|
break;
|
||||||
|
fi
|
||||||
|
done
|
||||||
fi
|
fi
|
||||||
if [ -z "$qm" ] && [ "$QC_DEBUG" = "Y" ]; then
|
if [ -z "$qm" ] && [ "$QC_VERBOSE" = "Y" ]; then
|
||||||
echo "Warning: qmake not found via --qtdir"
|
echo "Warning: qmake not found via --qtdir"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# qt4 check: QTDIR
|
# qt4 check: QTDIR
|
||||||
if [ -z "$qm" ]; then
|
if [ -z "$qm" ] && [ ! -z "$QTDIR" ]; then
|
||||||
qstr=$QTDIR/bin/qmake
|
for n in $names; do
|
||||||
if [ -x "$qstr" ]; then
|
qstr=$QTDIR/bin/$n
|
||||||
qm=$qstr
|
if qmake_check_v4 "$qstr"; then
|
||||||
fi
|
qm=$qstr
|
||||||
|
break;
|
||||||
|
fi
|
||||||
|
done
|
||||||
fi
|
fi
|
||||||
if [ -z "$qm" ] && [ "$QC_DEBUG" = "Y" ]; then
|
if [ -z "$qm" ] && [ "$QC_VERBOSE" = "Y" ]; then
|
||||||
echo "Warning: qmake not found via \$QTDIR"
|
echo "Warning: qmake not found via \$QTDIR"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -220,121 +253,107 @@ fi
|
|||||||
if [ -z "$qm" ]; then
|
if [ -z "$qm" ]; then
|
||||||
str=`pkg-config QtCore --variable=exec_prefix 2>/dev/null`
|
str=`pkg-config QtCore --variable=exec_prefix 2>/dev/null`
|
||||||
if [ ! -z "$str" ]; then
|
if [ ! -z "$str" ]; then
|
||||||
qstr=$str/bin/qmake
|
for n in $names; do
|
||||||
if [ -x "$qstr" ]; then
|
qstr=$str/bin/$n
|
||||||
qm=$qstr
|
if qmake_check_v4 "$qstr"; then
|
||||||
fi
|
qm=$qstr
|
||||||
|
break;
|
||||||
|
fi
|
||||||
|
done
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
if [ -z "$qm" ] && [ "$QC_DEBUG" = "Y" ]; then
|
if [ -z "$qm" ] && [ "$QC_VERBOSE" = "Y" ]; then
|
||||||
echo "Warning: qmake not found via pkg-config"
|
echo "Warning: qmake not found via pkg-config"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# qt4 check: PATH
|
# qt4 check: PATH
|
||||||
if [ -z "$qm" ]; then
|
if [ -z "$qm" ]; then
|
||||||
qstr=`$WHICH qmake 2>/dev/null`
|
for n in $names; do
|
||||||
if [ -x "$qstr" ]; then
|
qstr=`$WHICH $n 2>/dev/null`
|
||||||
qm=$qstr
|
if qmake_check_v4 "$qstr"; then
|
||||||
fi
|
qm=$qstr
|
||||||
|
break;
|
||||||
|
fi
|
||||||
|
done
|
||||||
fi
|
fi
|
||||||
if [ -z "$qm" ] && [ "$QC_DEBUG" = "Y" ]; then
|
if [ -z "$qm" ] && [ "$QC_VERBOSE" = "Y" ]; then
|
||||||
echo "Warning: qmake not found via \$PATH"
|
echo "Warning: qmake not found via \$PATH"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -z "$qm" ]; then
|
if [ -z "$qm" ]; then
|
||||||
if [ "$QC_DEBUG" = "Y" ]; then
|
if [ "$QC_VERBOSE" = "Y" ]; then
|
||||||
echo " -> fail"
|
echo " -> fail"
|
||||||
else
|
else
|
||||||
echo "fail"
|
echo "fail"
|
||||||
fi
|
fi
|
||||||
printf "\n"
|
printf "\n"
|
||||||
printf "Reason: Unable to find the 'qmake' tool.\n"
|
printf "Reason: Unable to find the 'qmake' tool for Qt 4.\n"
|
||||||
printf "\n"
|
printf "\n"
|
||||||
show_qt_info
|
show_qt_info
|
||||||
exit 1;
|
exit 1;
|
||||||
fi
|
fi
|
||||||
if [ "$QC_DEBUG" = "Y" ]; then
|
if [ "$QC_VERBOSE" = "Y" ]; then
|
||||||
echo qmake found in $qm
|
echo qmake found in $qm
|
||||||
fi
|
fi
|
||||||
|
|
||||||
gen_files() {
|
gen_files() {
|
||||||
cat >$1/modules.cpp <<EOT
|
cat >$1/modules.cpp <<EOT
|
||||||
#line 1 "qt42.qcm"
|
#line 1 "qt4.qcm"
|
||||||
/*
|
/*
|
||||||
-----BEGIN QCMOD-----
|
-----BEGIN QCMOD-----
|
||||||
name: Qt >= 4.2
|
name: Qt >= 4.3
|
||||||
-----END QCMOD-----
|
-----END QCMOD-----
|
||||||
*/
|
*/
|
||||||
class qc_qt42 : public ConfObj
|
class qc_qt4 : public ConfObj
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
qc_qt42(Conf *c) : ConfObj(c) {}
|
qc_qt4(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "Qt >= 4.2"; }
|
QString name() const { return "Qt >= 4.3"; }
|
||||||
QString shortname() const { return "qt42"; }
|
QString shortname() const { return "Qt 4.3"; }
|
||||||
bool exec()
|
bool exec()
|
||||||
{
|
{
|
||||||
return(QT_VERSION >= 0x040200);
|
if(QT_VERSION >= 0x040400) {
|
||||||
|
conf->addDefine("QT_4_4");
|
||||||
|
}
|
||||||
|
return(QT_VERSION >= 0x040300);
|
||||||
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#line 1 "libtorrent.qcm"
|
#line 1 "libtorrent-rasterbar.qcm"
|
||||||
/*
|
/*
|
||||||
-----BEGIN QCMOD-----
|
-----BEGIN QCMOD-----
|
||||||
name: libtorrent
|
name: libtorrent-rasterbar
|
||||||
arg: with-libtorrent-inc=[path], Path to libtorrent include files
|
|
||||||
arg: with-libtorrent-lib=[path], Path to libtorrent library files
|
|
||||||
-----END QCMOD-----
|
-----END QCMOD-----
|
||||||
*/
|
*/
|
||||||
class qc_libtorrent : public ConfObj
|
// see Conf::findPkgConfig
|
||||||
|
class qc_libtorrent_rasterbar : public ConfObj
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
qc_libtorrent(Conf *c) : ConfObj(c) {}
|
qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "libtorrent >= 0.12"; }
|
QString name() const { return "libtorrent-rasterbar >= 0.14.0 (>= 0.14.4 advised)"; }
|
||||||
QString shortname() const { return "libtorrent"; }
|
QString shortname() const { return "libtorrent-rasterbar"; }
|
||||||
bool exec(){
|
bool exec(){
|
||||||
QString s;
|
QStringList incs;
|
||||||
s = conf->getenv("QC_WITH_LIBTORRENT_INC");
|
QString req_ver = "0.14.0";
|
||||||
if(!s.isEmpty()) {
|
QString adv_ver = "0.14.4";
|
||||||
if(!conf->checkHeader(s, "libtorrent/extensions/ut_pex.hpp")) {
|
QString version, libs, other;
|
||||||
qWarning("libtorrent v0.12 includes not found!\nYou can download it at http://www.libtorrent.net");
|
VersionMode mode = VersionMin;
|
||||||
return false;
|
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, req_ver, &version, &incs, &libs, &other))
|
||||||
}
|
return false;
|
||||||
conf->addIncludePath(s);
|
for(int n = 0; n < incs.count(); ++n)
|
||||||
}else{
|
conf->addIncludePath(incs[n]);
|
||||||
QStringList sl;
|
if(!libs.isEmpty())
|
||||||
sl << "/usr/include/";
|
conf->addLib(libs);
|
||||||
sl << "/usr/local/include";
|
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, adv_ver, &version, &incs, &libs, &other))
|
||||||
if(!conf->findHeader("libtorrent/extensions/ut_pex.hpp", sl, &s)) {
|
printf("\nWarning: libtorrent-rasterbar v%s was detected. Although it will compile and run, you will probably experience some bugs. Please consider updating to v%s!\n", version.toUtf8().data(), adv_ver.toUtf8().data());
|
||||||
qWarning("libtorrent v0.12 includes not found!\nYou can download it at http://www.libtorrent.net");
|
return true;
|
||||||
return false;
|
|
||||||
}
|
|
||||||
conf->addIncludePath(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
s = conf->getenv("QC_WITH_LIBTORRENT_LIB");
|
|
||||||
if(!s.isEmpty()) {
|
|
||||||
if(!conf->checkLibrary(s, "torrent")) {
|
|
||||||
qWarning("libtorrent library not found!");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
conf->addLib(QString("-L") + s);
|
|
||||||
}else{
|
|
||||||
if(!conf->findLibrary("torrent", &s)) {
|
|
||||||
qWarning("libtorrent library not found!");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!s.isEmpty())
|
|
||||||
conf->addLib(QString("-L") + s);
|
|
||||||
}
|
|
||||||
|
|
||||||
conf->addLib("-ltorrent");
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#line 1 "libboost.qcm"
|
#line 1 "libboost.qcm"
|
||||||
/*
|
/*
|
||||||
-----BEGIN QCMOD-----
|
-----BEGIN QCMOD-----
|
||||||
name: libboost
|
name: libboost
|
||||||
|
arg: with-libboost-inc=[path], Path to libboost include files
|
||||||
-----END QCMOD-----
|
-----END QCMOD-----
|
||||||
*/
|
*/
|
||||||
class qc_libboost : public ConfObj
|
class qc_libboost : public ConfObj
|
||||||
@@ -344,38 +363,53 @@ public:
|
|||||||
QString name() const { return "libboost"; }
|
QString name() const { return "libboost"; }
|
||||||
QString shortname() const { return "libboost"; }
|
QString shortname() const { return "libboost"; }
|
||||||
bool exec(){
|
bool exec(){
|
||||||
QString s;
|
QString s;
|
||||||
QStringList sl;
|
s = conf->getenv("QC_WITH_LIBBOOST_INC");
|
||||||
sl += "/usr/include";
|
if(!s.isEmpty()) {
|
||||||
sl += "/usr/local/include";
|
if(!conf->checkHeader(s, "boost/format.hpp")) {
|
||||||
sl += "/sw/include";
|
return false;
|
||||||
if(!conf->findHeader("boost/format.hpp", sl, &s)) {
|
}
|
||||||
qWarning("libboost includes not found!");
|
if(!conf->checkHeader(s, "boost/date_time/posix_time/posix_time.hpp")) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
conf->addIncludePath(s);
|
if(!conf->checkHeader(s, "boost/filesystem/path.hpp")) {
|
||||||
if(!conf->findHeader("boost/date_time/posix_time/posix_time.hpp", sl, &s)) {
|
return false;
|
||||||
qWarning("libboost-date-time includes not found!");
|
}
|
||||||
return false;
|
if(!conf->checkHeader(s, "boost/thread.hpp")) {
|
||||||
}
|
return false;
|
||||||
conf->addIncludePath(s);
|
}
|
||||||
if(!conf->findHeader("boost/filesystem/path.hpp", sl, &s)) {
|
}else{
|
||||||
qWarning("libboost-filesystem includes not found!");
|
QStringList sl;
|
||||||
return false;
|
sl << "/usr/include";
|
||||||
}
|
sl << "/usr/local/include";
|
||||||
if(!conf->findHeader("boost/thread.hpp", sl, &s)) {
|
bool found = false;
|
||||||
qWarning("libboost-thread includes not found!");
|
foreach(s, sl){
|
||||||
return false;
|
if(conf->checkHeader(s, "boost/format.hpp")){
|
||||||
}
|
found = true;
|
||||||
conf->addIncludePath(s);
|
break;
|
||||||
|
}
|
||||||
return true;
|
}
|
||||||
|
if(!found) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(!conf->checkHeader(s, "boost/date_time/posix_time/posix_time.hpp")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(!conf->checkHeader(s, "boost/filesystem/path.hpp")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(!conf->checkHeader(s, "boost/thread.hpp")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
conf->addIncludePath(s);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#line 1 "libcurl.qcm"
|
#line 1 "libcurl.qcm"
|
||||||
/*
|
/*
|
||||||
-----BEGIN QCMOD-----
|
-----BEGIN QCMOD-----
|
||||||
name: libcurl
|
name: libcommoncpp2
|
||||||
arg: with-libcurl-inc=[path], Path to libcurl include files
|
arg: with-libcurl-inc=[path], Path to libcurl include files
|
||||||
arg: with-libcurl-lib=[path], Path to libcurl library files
|
arg: with-libcurl-lib=[path], Path to libcurl library files
|
||||||
-----END QCMOD-----
|
-----END QCMOD-----
|
||||||
@@ -387,73 +421,132 @@ public:
|
|||||||
QString name() const { return "libcurl"; }
|
QString name() const { return "libcurl"; }
|
||||||
QString shortname() const { return "libcurl"; }
|
QString shortname() const { return "libcurl"; }
|
||||||
bool exec(){
|
bool exec(){
|
||||||
QString s;
|
QString s;
|
||||||
s = conf->getenv("QC_WITH_LIBCURL_INC");
|
s = conf->getenv("QC_WITH_LIBCURL_INC");
|
||||||
if(!s.isEmpty()) {
|
if(!s.isEmpty()) {
|
||||||
if(!conf->checkHeader(s, "curl/curl.h")) {
|
if(!conf->checkHeader(s, "curl/curl.h")) {
|
||||||
qWarning("libcurl includes not found!");
|
return false;
|
||||||
return false;
|
}
|
||||||
}
|
}else{
|
||||||
conf->addIncludePath(s);
|
QStringList sl;
|
||||||
}else{
|
sl << "/usr/include";
|
||||||
QStringList sl;
|
sl << "/usr/local/include";
|
||||||
sl += "/usr/include";
|
bool found = false;
|
||||||
sl += "/usr/local/include";
|
foreach(s, sl){
|
||||||
if(!conf->findHeader("curl/curl.h", sl, &s)) {
|
if(conf->checkHeader(s, "curl/curl.h")){
|
||||||
qWarning("libcurl includes not found!");
|
found = true;
|
||||||
return false;
|
break;
|
||||||
}
|
}
|
||||||
conf->addIncludePath(s);
|
}
|
||||||
}
|
if(!found) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
conf->addIncludePath(s);
|
||||||
|
|
||||||
s = conf->getenv("QC_WITH_LIBCURL_LIB");
|
s = conf->getenv("QC_WITH_LIBCURL_LIB");
|
||||||
if(!s.isEmpty()) {
|
if(!s.isEmpty()) {
|
||||||
if(!conf->checkLibrary(s, "curl")) {
|
if(!QFile::exists(s+QString("/libcurl.so")))
|
||||||
qWarning("libcurl library not found!");
|
return false;
|
||||||
return false;
|
conf->addLib(QString("-L") + s);
|
||||||
}
|
}else{
|
||||||
conf->addLib(QString("-L") + s);
|
QStringList sl;
|
||||||
}else{
|
sl << "/usr/lib/";
|
||||||
if(!conf->findLibrary("curl", &s)) {
|
sl << "/usr/lib64/";
|
||||||
qWarning("libcurl library not found!");
|
sl << "/usr/local/lib/";
|
||||||
return false;
|
sl << "/usr/local/lib64/";
|
||||||
}
|
bool found = false;
|
||||||
if (!s.isEmpty())
|
foreach(s, sl){
|
||||||
conf->addLib(QString("-L") + s);
|
if(QFile::exists(s+QString("libcurl.so"))){
|
||||||
}
|
found = true;
|
||||||
|
break;
|
||||||
conf->addLib("-lcurl");
|
}
|
||||||
|
}
|
||||||
return true;
|
if(!found) return false;
|
||||||
|
conf->addLib(QString("-L") + s);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#line 1 "python.qcm"
|
#line 1 "libzzip.qcm"
|
||||||
/*
|
/*
|
||||||
-----BEGIN QCMOD-----
|
-----BEGIN QCMOD-----
|
||||||
name: python
|
name: libzzip
|
||||||
|
arg: with-libzzip-inc=[path], Path to libzzip++ include files
|
||||||
|
arg: with-libzzip-lib=[path], Path to libzzip++ library files
|
||||||
-----END QCMOD-----
|
-----END QCMOD-----
|
||||||
*/
|
*/
|
||||||
class qc_python : public ConfObj
|
#include <QProcess>
|
||||||
|
class qc_libzzip : public ConfObj
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
qc_python(Conf *c) : ConfObj(c) {}
|
qc_libzzip(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "python >= 2.3"; }
|
QString name() const { return "Zzip library (libzzip)"; }
|
||||||
QString shortname() const { return "python"; }
|
QString shortname() const { return "libzzip"; }
|
||||||
|
QString checkString() const {
|
||||||
|
if(!conf->getenv("QC_DISABLE_LIBZZIP").isEmpty())
|
||||||
|
return "";
|
||||||
|
return ConfObj::checkString();
|
||||||
|
}
|
||||||
bool exec(){
|
bool exec(){
|
||||||
int r = conf->doCommand("python testpython.py");
|
if(!conf->getenv("QC_DISABLE_LIBZZIP").isEmpty())
|
||||||
if(r == 0)
|
return false;
|
||||||
return true;
|
QString s;
|
||||||
else
|
s = conf->getenv("QC_WITH_LIBZZIP_INC");
|
||||||
return false;
|
if(!s.isEmpty()) {
|
||||||
|
if(!conf->checkHeader(s, "zzip/zzip.h")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
QStringList sl;
|
||||||
|
sl << "/usr/include";
|
||||||
|
sl << "/usr/local/include";
|
||||||
|
bool found = false;
|
||||||
|
foreach(s, sl){
|
||||||
|
if(conf->checkHeader(s, "zzip/zzip.h")){
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!found)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
conf->addIncludePath(s);
|
||||||
|
|
||||||
|
s = conf->getenv("QC_WITH_LIBZZIP_LIB");
|
||||||
|
if(!s.isEmpty()) {
|
||||||
|
if(!QFile::exists(s+QString("/libzzip.so"))){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
QStringList sl;
|
||||||
|
sl << "/usr/lib/";
|
||||||
|
sl << "/usr/lib64/";
|
||||||
|
sl << "/usr/local/lib/";
|
||||||
|
sl << "/usr/local/lib64/";
|
||||||
|
bool found = false;
|
||||||
|
foreach(s, sl){
|
||||||
|
if(QFile::exists(s+QString("libzzip.so"))){
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!found)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
conf->addLib(QString("-L") + s);
|
||||||
|
conf->addLib("-lzzip");
|
||||||
|
conf->addDefine("HAVE_ZZIP");
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
EOT
|
EOT
|
||||||
cat >$1/modules_new.cpp <<EOT
|
cat >$1/modules_new.cpp <<EOT
|
||||||
o = new qc_qt42(conf);
|
o = new qc_qt4(conf);
|
||||||
o->required = true;
|
o->required = true;
|
||||||
o->disabled = false;
|
o->disabled = false;
|
||||||
o = new qc_libtorrent(conf);
|
o = new qc_libtorrent_rasterbar(conf);
|
||||||
o->required = true;
|
o->required = true;
|
||||||
o->disabled = false;
|
o->disabled = false;
|
||||||
o = new qc_libboost(conf);
|
o = new qc_libboost(conf);
|
||||||
@@ -462,12 +555,14 @@ cat >$1/modules_new.cpp <<EOT
|
|||||||
o = new qc_libcurl(conf);
|
o = new qc_libcurl(conf);
|
||||||
o->required = true;
|
o->required = true;
|
||||||
o->disabled = false;
|
o->disabled = false;
|
||||||
o = new qc_python(conf);
|
o = new qc_libzzip(conf);
|
||||||
o->required = true;
|
o->required = false;
|
||||||
o->disabled = false;
|
o->disabled = false;
|
||||||
|
|
||||||
EOT
|
EOT
|
||||||
cat >$1/conf4.h <<EOT
|
cat >$1/conf4.h <<EOT
|
||||||
|
// For license information, see the COPYING file in the qconf base directory.
|
||||||
|
|
||||||
#ifndef QC_CONF4_H
|
#ifndef QC_CONF4_H
|
||||||
#define QC_CONF4_H
|
#define QC_CONF4_H
|
||||||
|
|
||||||
@@ -572,6 +667,8 @@ private:
|
|||||||
|
|
||||||
EOT
|
EOT
|
||||||
cat >$1/conf4.cpp <<EOT
|
cat >$1/conf4.cpp <<EOT
|
||||||
|
// For license information, see the COPYING file in the qconf base directory.
|
||||||
|
|
||||||
#include "conf4.h"
|
#include "conf4.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -722,6 +819,18 @@ void qc_splitcflags(const QString &cflags, QStringList *incs, QStringList *other
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString qc_escapeArg(const QString &str)
|
||||||
|
{
|
||||||
|
QString out;
|
||||||
|
for(int n = 0; n < (int)str.length(); ++n) {
|
||||||
|
if(str[n] == '-')
|
||||||
|
out += '_';
|
||||||
|
else
|
||||||
|
out += str[n];
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
// ConfObj
|
// ConfObj
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
@@ -838,14 +947,14 @@ bool Conf::exec()
|
|||||||
// if this was a disabled-by-default option, check if it was enabled
|
// if this was a disabled-by-default option, check if it was enabled
|
||||||
if(o->disabled)
|
if(o->disabled)
|
||||||
{
|
{
|
||||||
QString v = QString("QC_ENABLE_") + o->shortname();
|
QString v = QString("QC_ENABLE_") + qc_escapeArg(o->shortname());
|
||||||
if(getenv(v) != "Y")
|
if(getenv(v) != "Y")
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// and the opposite?
|
// and the opposite?
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QString v = QString("QC_DISABLE_") + o->shortname();
|
QString v = QString("QC_DISABLE_") + qc_escapeArg(o->shortname());
|
||||||
if(getenv(v) == "Y")
|
if(getenv(v) == "Y")
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -1272,7 +1381,7 @@ int main()
|
|||||||
# include"modules_new.cpp"
|
# include"modules_new.cpp"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
conf->debug_enabled = (qc_getenv("QC_DEBUG") == "Y") ? true: false;
|
conf->debug_enabled = (qc_getenv("QC_VERBOSE") == "Y") ? true: false;
|
||||||
if(conf->debug_enabled)
|
if(conf->debug_enabled)
|
||||||
printf(" -> ok\n");
|
printf(" -> ok\n");
|
||||||
else
|
else
|
||||||
@@ -1328,6 +1437,9 @@ int main()
|
|||||||
var = qc_getenv("BINDIR");
|
var = qc_getenv("BINDIR");
|
||||||
if(!var.isEmpty())
|
if(!var.isEmpty())
|
||||||
str += QString("BINDIR = %1\n").arg(var);
|
str += QString("BINDIR = %1\n").arg(var);
|
||||||
|
var = qc_getenv("INCDIR");
|
||||||
|
if(!var.isEmpty())
|
||||||
|
str += QString("INCDIR = %1\n").arg(var);
|
||||||
var = qc_getenv("LIBDIR");
|
var = qc_getenv("LIBDIR");
|
||||||
if(!var.isEmpty())
|
if(!var.isEmpty())
|
||||||
str += QString("LIBDIR = %1\n").arg(var);
|
str += QString("LIBDIR = %1\n").arg(var);
|
||||||
@@ -1391,11 +1503,13 @@ export PREFIX
|
|||||||
export BINDIR
|
export BINDIR
|
||||||
export DATADIR
|
export DATADIR
|
||||||
export EX_QTDIR
|
export EX_QTDIR
|
||||||
export QC_WITH_LIBTORRENT_INC
|
export QC_WITH_LIBBOOST_INC
|
||||||
export QC_WITH_LIBTORRENT_LIB
|
|
||||||
export QC_WITH_LIBCURL_INC
|
export QC_WITH_LIBCURL_INC
|
||||||
export QC_WITH_LIBCURL_LIB
|
export QC_WITH_LIBCURL_LIB
|
||||||
export QC_DEBUG
|
export QC_DISABLE_libzzip
|
||||||
|
export QC_WITH_LIBZZIP_INC
|
||||||
|
export QC_WITH_LIBZZIP_LIB
|
||||||
|
export QC_VERBOSE
|
||||||
rm -rf .qconftemp
|
rm -rf .qconftemp
|
||||||
(
|
(
|
||||||
mkdir .qconftemp
|
mkdir .qconftemp
|
||||||
@@ -1408,7 +1522,7 @@ rm -rf .qconftemp
|
|||||||
|
|
||||||
if [ "$?" != "0" ]; then
|
if [ "$?" != "0" ]; then
|
||||||
rm -rf .qconftemp
|
rm -rf .qconftemp
|
||||||
if [ "$QC_DEBUG" = "Y" ]; then
|
if [ "$QC_VERBOSE" = "Y" ]; then
|
||||||
echo " -> fail"
|
echo " -> fail"
|
||||||
else
|
else
|
||||||
echo "fail"
|
echo "fail"
|
||||||
@@ -1417,7 +1531,7 @@ if [ "$?" != "0" ]; then
|
|||||||
printf "Reason: There was an error compiling 'conf'. See conf.log for details.\n"
|
printf "Reason: There was an error compiling 'conf'. See conf.log for details.\n"
|
||||||
printf "\n"
|
printf "\n"
|
||||||
show_qt_info
|
show_qt_info
|
||||||
if [ "$QC_DEBUG" = "Y" ]; then
|
if [ "$QC_VERBOSE" = "Y" ]; then
|
||||||
echo "conf.log:"
|
echo "conf.log:"
|
||||||
cat conf.log
|
cat conf.log
|
||||||
fi
|
fi
|
||||||
@@ -1441,7 +1555,7 @@ if [ "$ret" = "1" ]; then
|
|||||||
else
|
else
|
||||||
if [ "$ret" != "0" ]; then
|
if [ "$ret" != "0" ]; then
|
||||||
rm -rf .qconftemp
|
rm -rf .qconftemp
|
||||||
if [ "$QC_DEBUG" = "Y" ]; then
|
if [ "$QC_VERBOSE" = "Y" ]; then
|
||||||
echo " -> fail"
|
echo " -> fail"
|
||||||
else
|
else
|
||||||
echo "fail"
|
echo "fail"
|
||||||
|
|||||||
28
doc/qbittorrent.1
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
.\" This manpage has been automatically generated by docbook2man
|
||||||
|
.\" from a DocBook document. This tool can be found at:
|
||||||
|
.\" <http://shell.ipoline.com/~elmert/comp/docbook2X/>.
|
||||||
|
.TH "QBITTORRENT" "1" "September 1st 2007" "Bittorrent client written in C++ / Qt4" ""
|
||||||
|
|
||||||
|
.SH NAME
|
||||||
|
qBittorrent \- a Bittorrent client written in C++ / Qt4
|
||||||
|
.SH SYNOPSIS
|
||||||
|
|
||||||
|
\fBqbittorrent\fR [FILE | URL] [FILE | URL...]
|
||||||
|
|
||||||
|
\fBqbittorrent\fR \-\-help
|
||||||
|
|
||||||
|
\fBqbittorrent\fR \-\-version
|
||||||
|
.PP
|
||||||
|
.SH "DESCRIPTION"
|
||||||
|
|
||||||
|
\fBqBittorrent\fR is an advanced Bittorrent client written in C++ / Qt4,
|
||||||
|
using the \fBrblibtorrent\fR library by Arvid Norberg. qBittorrent aims
|
||||||
|
to be a good alternative to all other bittorrent clients out there. qBittorrent
|
||||||
|
is fast, stable, light, it supports unicode and it provides a good integrated search engine.
|
||||||
|
It also comes with UPnP port forwarding / NAT-PMP, encryption (Azureus compatible), FAST extension (mainline) and PeX support (utorrent compatible).
|
||||||
|
|
||||||
|
Please report any problem to http://bugs.qbittorrent.org
|
||||||
|
.PP
|
||||||
|
.SH "AUTHOR"
|
||||||
|
|
||||||
|
Christophe Dumez <chris@qbittorrent.org>
|
||||||
@@ -1,134 +0,0 @@
|
|||||||
qbittorrent (0.6.1-1) unstable; urgency=low
|
|
||||||
|
|
||||||
* Disabled debug mode
|
|
||||||
|
|
||||||
-- Christophe Dumez <chris@qbittorrent.org> Mon, 28 Aug 2006 21:22:48 +0200
|
|
||||||
|
|
||||||
qbittorrent (0.6.1-0) unstable; urgency=low
|
|
||||||
* BUGFIX: Fixed possible segfaults when using context menus
|
|
||||||
* BUGFIX: Cleanup up context menus code
|
|
||||||
* BUGFIX: Used best gzip compressing for manpage
|
|
||||||
|
|
||||||
-- Christophe Dumez <chris@qbittorrent.org> Thu, 24 Aug 2006 19:53:32 +0200
|
|
||||||
|
|
||||||
qbittorrent (0.6.0) unstable; urgency=low
|
|
||||||
* FEATURE: Rewritten the download list from scratch (more flexible)
|
|
||||||
* FEATURE: Rewritten the search results list from scratch (more flexible)
|
|
||||||
* FEATURE: Rewritten the torrent properties list from scratch (more flexible)
|
|
||||||
* FEATURE: Improved and cleaned up search engine code
|
|
||||||
* FEATURE: Search results are now displayed in real time (not sequentially)
|
|
||||||
* FEATURE: Added two command lines parameters (--version, --help)
|
|
||||||
* FEATURE: Added a popup menu for download list
|
|
||||||
* FEATURE: Double-click on an item now toggles the paused state of a download
|
|
||||||
* FEATURE: Improved code to be more portable (Windows & MacOS versions should arrive soon)
|
|
||||||
* FEATURE: Allow to toggle selected state of a file within a torrent using double-click
|
|
||||||
* FEATURE: Remember columns width in download and search results lists
|
|
||||||
* BUGFIX: Don't use pkg-config for libcurl anymore (easier to compile)
|
|
||||||
* BUGFIX: Fixed ETA calculation when downloading while connecting
|
|
||||||
* BUGFIX: Download progress is now displayed correctly during first seconds of execution (was 0% before)
|
|
||||||
* BUGFIX: Code cleanup & optimization
|
|
||||||
* BUGFIX: Fixed sorting in download list
|
|
||||||
* BUGFIX: Fixed sorting in search results list
|
|
||||||
* BUGFIX: Fixed Parameters passing between instances
|
|
||||||
* BUGFIX: Fixed missing icon for clear action in infoBar popup menu
|
|
||||||
* BUGFIX: Fixed truncated lines in search results
|
|
||||||
* BUGFIX: Don't refresh download list when user is in search tab (save CPU)
|
|
||||||
* BUGFIX: Don't update Progress/DL Speed/ETA for finished downloads (save CPU)
|
|
||||||
* BUGFIX: Save selected search engines only when they have changed (faster program exit)
|
|
||||||
* COSMETIC: Increased icon size in toolbar from 24px to 32px
|
|
||||||
* COSMETIC: Display a progress bar to visualize each download progress
|
|
||||||
* COSMETIC: Size of each result in search are displayed in user friendly units
|
|
||||||
* COSMETIC: Display a progress bar to visualize each file progress within a torrent
|
|
||||||
* COSMETIC: Renamed 'ratio' to 'Session ratio' (makes more sense)
|
|
||||||
* COSMETIC: Improved layout of torrent properties window when maximized
|
|
||||||
* COSMETIC: Now number of search results is updated in real time
|
|
||||||
* COSMETIC: Remember last window size
|
|
||||||
* COSMETIC: Improved splash screen look
|
|
||||||
* COSMETIC: Improved default width of columns in download and search results lists
|
|
||||||
|
|
||||||
-- Christophe Dumez <chris@qbittorrent.org> Wed, 22 Aug 2006 10:42:37 +0200
|
|
||||||
|
|
||||||
qbittorrent (0.5.0) unstable; urgency=low
|
|
||||||
* Improved "Download from url" feature (now supports https, ftp & redirections)
|
|
||||||
* Added a torrent creation tool
|
|
||||||
* Display progress for each file within a torrent
|
|
||||||
* Based on new libtorrent v0.10 (lot of improvements)
|
|
||||||
* Now possible to clear log textbox (popup menu)
|
|
||||||
* Added two search engines (isohunt, torrentreactor)
|
|
||||||
* Now Display share ratio on main window
|
|
||||||
* Use OSD (On Screen Display) when a download or a search is finished
|
|
||||||
* Allow only one instance of qBittorrent (and add new parameters to download list)
|
|
||||||
* Remember last selected search engines in search tab
|
|
||||||
* Improved search engines status output (Aborted, timed out, finished, no results)
|
|
||||||
* qBittorrent can now update search plugin from qbittorrent.org
|
|
||||||
* Added Slovak, Italian, Portuguese, Romanian and Traditional Chinese languages
|
|
||||||
* Fixed ThePirateBay parser for search engine (website had changed)
|
|
||||||
* Fixed filenames for results from ThePirateBay search engine
|
|
||||||
* Fixed unicode support for ThePirateBay search engine
|
|
||||||
* Now search results are sorted by seeds
|
|
||||||
* Overwrite nova.py search plugin only if it is outdated
|
|
||||||
* Fixed possible division by 0 in ETA calculation
|
|
||||||
* Improved ETA calculation precision
|
|
||||||
* Fixed default tab in options
|
|
||||||
* When saving options, reconnect only when listening ports changed
|
|
||||||
* qBittorrent has now its own new logo
|
|
||||||
* Display status "downloading" if DL Speed > 0 (even when tracker is down)
|
|
||||||
* Added a splashscreen
|
|
||||||
* qBittorrent has new cute icons
|
|
||||||
* Display number of results in search tab
|
|
||||||
* Added icons for each item in download list according to its state
|
|
||||||
* Redesigned Locale settings
|
|
||||||
* Fixed search engines names width (were cut on the right)
|
|
||||||
* Moved search engines to the left of the window (better ui)
|
|
||||||
|
|
||||||
-- Christophe Dumez <chris@qbittorrent.org> Wed, 2 Aug 2006 19:46:32 +0200
|
|
||||||
|
|
||||||
qbittorrent (0.4.1) unstable; urgency=low
|
|
||||||
* Not counting "protocol chatter" in UP/DL speed anymore
|
|
||||||
* Download speed is now 0 when download is finished
|
|
||||||
* Paused torrents remain paused when qbittorrent is re-started
|
|
||||||
* Added option "go to systray when minimizing"
|
|
||||||
* Added option "Clear finished downloads on exit"
|
|
||||||
* Added option "Ask user for confirmation on exit"
|
|
||||||
* Added "Stalled" status for downloads (colored in orange, paused are in red and finished in green)
|
|
||||||
* Fixed Search window layout on maximizing
|
|
||||||
* Fixed a bug that caused upload limit not to be always applied
|
|
||||||
* Added Bulgarian translation
|
|
||||||
* Updated Translations
|
|
||||||
* Code optimization
|
|
||||||
|
|
||||||
-- Christophe Dumez <chris@qbittorrent.org> Thu, 22 Jun 2006 20:14:27 +0200
|
|
||||||
|
|
||||||
qbittorrent (0.4.0) unstable; urgency=low
|
|
||||||
|
|
||||||
* Added a search engine (supports Mininova & thepiratebay websites)
|
|
||||||
* Fixed critical bug: some options were not applied correctly to BT session
|
|
||||||
* Possibility to download a torrent file from an URL
|
|
||||||
* Added confirmation dialog on qbittorrent exit
|
|
||||||
* Enabled sorting in Download list
|
|
||||||
* Added Ukrainian translation
|
|
||||||
* Support urls as program parameters
|
|
||||||
* Added more actions to trayicon menu
|
|
||||||
* Fixed exception catching when retrieving fastresume data
|
|
||||||
* use Binary prefix standards from IEC 60027-2 for units (B, KiB, MiB, GiB, TiB)
|
|
||||||
* Iconification to systray when minimizing
|
|
||||||
* Code Cleanup & optimization
|
|
||||||
|
|
||||||
-- Christophe Dumez <chris@qbittorrent.org> Wed, 14 Jun 2006 14:47:27 +0200
|
|
||||||
|
|
||||||
qbittorrent (0.3.1) unstable; urgency=low
|
|
||||||
|
|
||||||
* Fixed toolbar layout (spacing).
|
|
||||||
* Added Russian translation.
|
|
||||||
* Resume also finished files on startup (for seeding).
|
|
||||||
* Added colors corresponding to download state.
|
|
||||||
* Fixed a segfault when deleting a download (if no scan dir is set).
|
|
||||||
|
|
||||||
-- Christophe Dumez <chris@qbittorrent.org> Sat, 6 Jun 2006 21:36:27 +0200
|
|
||||||
|
|
||||||
|
|
||||||
qbittorrent (0.3) unstable; urgency=low
|
|
||||||
|
|
||||||
* Initial Release.
|
|
||||||
|
|
||||||
-- Christophe Dumez <chris@qbittorrent.org> Sat, 3 Jun 2006 21:57:27 +0200
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
4
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
Source: qbittorrent
|
|
||||||
Section: net
|
|
||||||
Priority: optional
|
|
||||||
Maintainer: Christophe Dumez <chris@qbittorrent.org>
|
|
||||||
Build-Depends: debhelper (>= 4.0.0), autotools-dev, libqt4-core (>= 4.1.0), libqt4-dev (>= 4.1.0), libqt4-gui (>= 4.1.0), rb-libtorrent (>= 0.10), libcurl3-dev
|
|
||||||
Standards-Version: 3.6.2
|
|
||||||
|
|
||||||
Package: qbittorrent
|
|
||||||
Architecture: any
|
|
||||||
Depends: ${shlibs:Depends}, ${misc:Depends}, rb-libtorrent (>= 0.10), python (>= 2.3)
|
|
||||||
Description: Bittorrent client in Qt4.1 / C++
|
|
||||||
qBittorrent is a bittorrent client programmed in C++ / Qt4.1
|
|
||||||
using rb_libtorrent by Arvid Norberg. It aims to be a good
|
|
||||||
alternative to other bittorrent client out there. It is fast,
|
|
||||||
stable and provides unicode support.
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
This is qbittorrent, written and maintained by Christophe Dumez <chris@qbittorrent.org>
|
|
||||||
on Sat, 3 Jun 2006 21:57:27 +0200.
|
|
||||||
|
|
||||||
The original source can always be found at:
|
|
||||||
ftp://ftp.debian.org/dists/unstable/main/source/
|
|
||||||
|
|
||||||
Copyright (C) 2006 Christophe Dumez
|
|
||||||
|
|
||||||
License:
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this package; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
On Debian systems, the complete text of the GNU General
|
|
||||||
Public License can be found in `/usr/share/common-licenses/GPL'.
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
usr/bin
|
|
||||||
usr/sbin
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
NEWS
|
|
||||||
README
|
|
||||||
TODO
|
|
||||||
@@ -1,107 +0,0 @@
|
|||||||
#!/usr/bin/make -f
|
|
||||||
# -*- makefile -*-
|
|
||||||
# Sample debian/rules that uses debhelper.
|
|
||||||
# This file was originally written by Joey Hess and Craig Small.
|
|
||||||
# As a special exception, when this file is copied by dh-make into a
|
|
||||||
# dh-make output file, you may use that output file without restriction.
|
|
||||||
# This special exception was added by Craig Small in version 0.37 of dh-make.
|
|
||||||
|
|
||||||
# Uncomment this to turn on verbose mode.
|
|
||||||
#export DH_VERBOSE=1
|
|
||||||
|
|
||||||
|
|
||||||
# These are used for cross-compiling and for saving the configure script
|
|
||||||
# from having to guess our platform (since we know it already)
|
|
||||||
DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
|
|
||||||
DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
|
|
||||||
|
|
||||||
|
|
||||||
CFLAGS = -Wall
|
|
||||||
|
|
||||||
ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
|
|
||||||
CFLAGS += -O0
|
|
||||||
else
|
|
||||||
CFLAGS += -O2
|
|
||||||
endif
|
|
||||||
|
|
||||||
config.status: configure
|
|
||||||
dh_testdir
|
|
||||||
# Add here commands to configure the package.
|
|
||||||
CFLAGS="$(CFLAGS) -Wl,-z,defs" ./configure --prefix=/usr
|
|
||||||
|
|
||||||
|
|
||||||
build: build-stamp
|
|
||||||
|
|
||||||
build-stamp: config.status
|
|
||||||
dh_testdir
|
|
||||||
|
|
||||||
# Add here commands to compile the package.
|
|
||||||
$(MAKE)
|
|
||||||
#docbook-to-man debian/qbittorrent.sgml > qbittorrent.1
|
|
||||||
|
|
||||||
touch build-stamp
|
|
||||||
|
|
||||||
clean:
|
|
||||||
dh_testdir
|
|
||||||
dh_testroot
|
|
||||||
rm -f build-stamp
|
|
||||||
|
|
||||||
# Add here commands to clean up after the build process.
|
|
||||||
-$(MAKE) distclean
|
|
||||||
ifneq "$(wildcard /usr/share/misc/config.sub)" ""
|
|
||||||
cp -f /usr/share/misc/config.sub config.sub
|
|
||||||
endif
|
|
||||||
ifneq "$(wildcard /usr/share/misc/config.guess)" ""
|
|
||||||
cp -f /usr/share/misc/config.guess config.guess
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
dh_clean
|
|
||||||
|
|
||||||
install: build
|
|
||||||
dh_testdir
|
|
||||||
dh_testroot
|
|
||||||
dh_clean -k
|
|
||||||
dh_installdirs
|
|
||||||
|
|
||||||
# Add here commands to install the package into debian/qbittorrent.
|
|
||||||
$(MAKE) install INSTALL_ROOT=$(CURDIR)/debian/qbittorrent
|
|
||||||
|
|
||||||
|
|
||||||
# Build architecture-independent files here.
|
|
||||||
binary-indep: build install
|
|
||||||
# We have nothing to do by default.
|
|
||||||
|
|
||||||
# Build architecture-dependent files here.
|
|
||||||
binary-arch: build install
|
|
||||||
dh_testdir
|
|
||||||
dh_testroot
|
|
||||||
dh_installchangelogs Changelog
|
|
||||||
dh_installdocs
|
|
||||||
dh_installexamples
|
|
||||||
# dh_install
|
|
||||||
# dh_installmenu
|
|
||||||
# dh_installdebconf
|
|
||||||
# dh_installlogrotate
|
|
||||||
# dh_installemacsen
|
|
||||||
# dh_installpam
|
|
||||||
# dh_installmime
|
|
||||||
# dh_installinit
|
|
||||||
# dh_installcron
|
|
||||||
# dh_installinfo
|
|
||||||
dh_installman
|
|
||||||
dh_link
|
|
||||||
dh_strip
|
|
||||||
dh_compress
|
|
||||||
dh_fixperms
|
|
||||||
# dh_perl
|
|
||||||
# dh_python
|
|
||||||
# dh_makeshlibs
|
|
||||||
dh_installdeb
|
|
||||||
dh_shlibdeps
|
|
||||||
dh_gencontrol
|
|
||||||
dh_md5sums
|
|
||||||
dh_builddeb
|
|
||||||
|
|
||||||
binary: binary-indep binary-arch
|
|
||||||
.PHONY: build clean binary-indep binary-arch binary install
|
|
||||||
@@ -1,249 +0,0 @@
|
|||||||
|
|
||||||
%define name qbittorrent
|
|
||||||
%define major 0
|
|
||||||
%define minor 6
|
|
||||||
%define patch 1
|
|
||||||
%define version %{major}.%{minor}.%{patch}
|
|
||||||
%define release %mkrel 2
|
|
||||||
%define _iconsdir %{_datadir}/icons
|
|
||||||
%define _mandir %_datadir/man
|
|
||||||
|
|
||||||
Name: %{name}
|
|
||||||
Summary: A Bittorrent Client using C++ / Qt4
|
|
||||||
Version: %{version}
|
|
||||||
Release: %{release}
|
|
||||||
Source0: http://sourceforge.net/projects/qbittorrent/%{name}-%{version}.tar.gz
|
|
||||||
URL: http://sourceforge.net/projects/qbittorrent
|
|
||||||
Vendor: http://qbittorrent.sourceforge.net/
|
|
||||||
Group: Internet/File Transfer
|
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
|
|
||||||
License: GPL
|
|
||||||
BuildRequires: libqt4-devel >= 4.1.2, libqtgui4 >= 4.1.2, libqtcore4 >= 4.1.2, libqtxml4 >= 4.1.2, libqtnetwork4 >= 4.1.2, rb_libtorrent-devel >= 0.10-3, libcurl3-devel
|
|
||||||
Requires: libqtgui4 >= 4.1.2, libqtcore4 >= 4.1.2, libqtxml4 >= 4.1.2, libqtnetwork4 >= 4.1.2, librb_libtorrent0 >= 0.10-3, python >= 2.3, libcurl3
|
|
||||||
|
|
||||||
%description
|
|
||||||
A Bittorrent client using C++ / libtorrent and a Qt4 Graphical User Interface.
|
|
||||||
It aims to be as fast as possible and to provide multi-OS, unicode support.
|
|
||||||
|
|
||||||
%prep
|
|
||||||
%setup
|
|
||||||
|
|
||||||
%build
|
|
||||||
# Export the Environment variables
|
|
||||||
export QTDIR=%_prefix/%_lib/qt4
|
|
||||||
export KDEDIR=%_prefix
|
|
||||||
export LD_LIBRARY_PATH=$QTDIR/%_lib:$KDEDIR/%_lib:$LD_LIBRARY_PATH
|
|
||||||
export PATH=$QTDIR/bin:$KDEDIR/bin:$PATH
|
|
||||||
|
|
||||||
|
|
||||||
# Change to the Source directory and configure
|
|
||||||
#cd src
|
|
||||||
CFLAGS="%optflags" CXXFLAGS="%optflags" \
|
|
||||||
./configure --prefix=%{buildroot}%{_prefix}
|
|
||||||
|
|
||||||
# Necessary to remove old compiled files.. if they exist
|
|
||||||
make clean
|
|
||||||
|
|
||||||
%make
|
|
||||||
|
|
||||||
%install
|
|
||||||
%makeinstall --directory=src
|
|
||||||
|
|
||||||
|
|
||||||
# Create the menu directory
|
|
||||||
install -d %{buildroot}%{_menudir}
|
|
||||||
|
|
||||||
# Build the Menu
|
|
||||||
#<package> <section> <file_in> <file_out> [requires] [title]
|
|
||||||
kdedesktop2mdkmenu.pl %{name} "%{group}" %{buildroot}%{_datadir}/applications/qBittorrent.desktop %{buildroot}%{_menudir}/%{name}
|
|
||||||
|
|
||||||
%clean
|
|
||||||
%{__rm} -rf %{buildroot}
|
|
||||||
|
|
||||||
%post
|
|
||||||
/sbin/ldconfig
|
|
||||||
%{update_menus}
|
|
||||||
|
|
||||||
%postun
|
|
||||||
/sbin/ldconfig
|
|
||||||
%{clean_menus}
|
|
||||||
|
|
||||||
|
|
||||||
%files
|
|
||||||
%defattr(-,root,root)
|
|
||||||
%doc README INSTALL NEWS COPYING AUTHORS TODO Changelog
|
|
||||||
%doc %{_mandir}/man1/*.bz2
|
|
||||||
|
|
||||||
|
|
||||||
# The binaries
|
|
||||||
%_bindir/*
|
|
||||||
|
|
||||||
|
|
||||||
# Icon files
|
|
||||||
# Hi and Lo colour icons various sizes
|
|
||||||
%_iconsdir/hicolor/128x128/apps/qbittorrent.png
|
|
||||||
%_iconsdir/hicolor/16x16/apps/qbittorrent.png
|
|
||||||
%_iconsdir/hicolor/192x192/apps/qbittorrent.png
|
|
||||||
%_iconsdir/hicolor/22x22/apps/qbittorrent.png
|
|
||||||
%_iconsdir/hicolor/24x24/apps/qbittorrent.png
|
|
||||||
%_iconsdir/hicolor/32x32/apps/qbittorrent.png
|
|
||||||
%_iconsdir/hicolor/36x36/apps/qbittorrent.png
|
|
||||||
%_iconsdir/hicolor/48x48/apps/qbittorrent.png
|
|
||||||
%_iconsdir/hicolor/64x64/apps/qbittorrent.png
|
|
||||||
%_iconsdir/hicolor/72x72/apps/qbittorrent.png
|
|
||||||
%_iconsdir/hicolor/96x96/apps/qbittorrent.png
|
|
||||||
## %_iconsdir/hicolor/scalable/apps/qbittorrent.svgz
|
|
||||||
|
|
||||||
|
|
||||||
# Desktop Link
|
|
||||||
%_datadir/applications/qBittorrent.desktop
|
|
||||||
|
|
||||||
# The qbittorrent Menu directory
|
|
||||||
%dir %{_menudir}
|
|
||||||
%{_menudir}/%{name}
|
|
||||||
|
|
||||||
|
|
||||||
%changelog
|
|
||||||
|
|
||||||
* Wed Aug 23 2006 - Christophe Dumez <chris@qbittorrent.org> - 0.6.0-0.1.2006mdk
|
|
||||||
- FEATURE: Rewritten the download list from scratch (more flexible)
|
|
||||||
- FEATURE: Rewritten the search results list from scratch (more flexible)
|
|
||||||
- FEATURE: Rewritten the torrent properties list from scratch (more flexible)
|
|
||||||
- FEATURE: Improved and cleaned up search engine code
|
|
||||||
- FEATURE: Search results are now displayed in real time (not sequentially)
|
|
||||||
- FEATURE: Added two command lines parameters (--version, --help)
|
|
||||||
- FEATURE: Added a popup menu for download list
|
|
||||||
- FEATURE: Double-click on an item now toggles the paused state of a download
|
|
||||||
- FEATURE: Improved code to be more portable (Windows & MacOS versions should arrive soon)
|
|
||||||
- FEATURE: Allow to toggle selected state of a file within a torrent using double-click
|
|
||||||
- FEATURE: Remember columns width in download and search results lists
|
|
||||||
- BUGFIX: Don't use pkg-config for libcurl anymore (easier to compile)
|
|
||||||
- BUGFIX: Fixed ETA calculation when downloading while connecting
|
|
||||||
- BUGFIX: Download progress is now displayed correctly during first seconds of execution (was 0% before)
|
|
||||||
- BUGFIX: Code cleanup & optimization
|
|
||||||
- BUGFIX: Fixed sorting in download list
|
|
||||||
- BUGFIX: Fixed sorting in search results list
|
|
||||||
- BUGFIX: Fixed Parameters passing between instances
|
|
||||||
- BUGFIX: Fixed missing icon for clear action in infoBar popup menu
|
|
||||||
- BUGFIX: Fixed truncated lines in search results
|
|
||||||
- BUGFIX: Don't refresh download list when user is in search tab (save CPU)
|
|
||||||
- BUGFIX: Don't update Progress/DL Speed/ETA for finished downloads (save CPU)
|
|
||||||
- BUGFIX: Save selected search engines only when they have changed (faster program exit)
|
|
||||||
- COSMETIC: Increased icon size in toolbar from 24px to 32px
|
|
||||||
- COSMETIC: Display a progress bar to visualize each download progress
|
|
||||||
- COSMETIC: Size of each result in search are displayed in user friendly units
|
|
||||||
- COSMETIC: Display a progress bar to visualize each file progress within a torrent
|
|
||||||
- COSMETIC: Renamed 'ratio' to 'Session ratio' (makes more sense)
|
|
||||||
- COSMETIC: Improved layout of torrent properties window when maximized
|
|
||||||
- COSMETIC: Now number of search results is updated in real time
|
|
||||||
- COSMETIC: Remember last window size
|
|
||||||
- COSMETIC: Improved splash screen look
|
|
||||||
- COSMETIC: Improved default width of columns in download and search results lists
|
|
||||||
|
|
||||||
* Tue Aug 08 2006 - Christophe Dumez <chris@qbittorrent.org> - 0.5.0-0.1.20060mdk
|
|
||||||
- FEATURE: Improved "Download from url" feature (now supports https, ftp & redirections)
|
|
||||||
- FEATURE: Added a torrent creation tool
|
|
||||||
- FEATURE: Display progress for each file within a torrent
|
|
||||||
- FEATURE: Based on new libtorrent v0.10 (lot of improvements)
|
|
||||||
- FEATURE: Now possible to clear log textbox (popup menu)
|
|
||||||
- FEATURE: Added two search engines (isohunt, torrentreactor)
|
|
||||||
- FEATURE: Now Display share ratio on main window
|
|
||||||
- FEATURE: Use OSD (On Screen Display) when a download or a search is finished
|
|
||||||
- FEATURE: Allow only one instance of qBittorrent (and add new parameters to download list)
|
|
||||||
- FEATURE: Remember last selected search engines in search tab
|
|
||||||
- FEATURE: Improved search engines status output (Aborted, timed out, finished, no results)
|
|
||||||
- FEATURE: qBittorrent can now update search plugin from qbittorrent.org
|
|
||||||
- I18N: Added Slovak, Italian, Portuguese, Romanian and Traditional Chinese languages
|
|
||||||
- BUGFIX: Fixed ThePirateBay parser for search engine (website had changed)
|
|
||||||
- BUGFIX: Fixed filenames for results from ThePirateBay search engine
|
|
||||||
- BUGFIX: Fixed unicode support for ThePirateBay search engine
|
|
||||||
- BUGFIX: Now search results are sorted by seeds
|
|
||||||
- BUGFIX: Overwrite nova.py search plugin only if it is outdated
|
|
||||||
- BUGFIX: Fixed possible division by 0 in ETA calculation
|
|
||||||
- BUGFIX: Improved ETA calculation precision
|
|
||||||
- BUGFIX: Fixed default tab in options
|
|
||||||
- BUGFIX: When saving options, reconnect only when listening ports changed
|
|
||||||
- COSMETIC: qBittorrent has now its own new logo
|
|
||||||
- COSMETIC: Display status "downloading" if DL Speed > 0 (even when tracker is down)
|
|
||||||
- COSMETIC: Added a splashscreen
|
|
||||||
- COSMETIC: qBittorrent has new cute icons
|
|
||||||
- COSMETIC: Display number of results in search tab
|
|
||||||
- COSMETIC: Added icons for each item in download list according to its state
|
|
||||||
- COSMETIC: Redesigned Locale settings
|
|
||||||
- COSMETIC: Fixed search engines names width (were cut on the right)
|
|
||||||
- COSMETIC: Moved search engines to the left of the window (better ui)
|
|
||||||
|
|
||||||
* Fri Jun 23 2006 - Christophe Dumez <chris@qbittorrent.org> - 0.4.1-0.1.20060mdk
|
|
||||||
- Not counting "protocol chatter" in UP/DL speed anymore
|
|
||||||
- Download speed is now 0 when download is finished
|
|
||||||
- Paused torrents remain paused when qbittorrent is re-started
|
|
||||||
- Added option "go to systray when minimizing"
|
|
||||||
- Added option "Clear finished downloads on exit"
|
|
||||||
- Added option "Ask user for confirmation on exit"
|
|
||||||
- Added "Stalled" status for downloads (colored in orange, paused are in red and finished in green)
|
|
||||||
- Fixed Search window layout on maximizing
|
|
||||||
- Fixed a bug that caused upload limit not to be always applied
|
|
||||||
- Added Bulgarian translation
|
|
||||||
- Updated Translations
|
|
||||||
- Code optimization
|
|
||||||
|
|
||||||
* Tue Jun 13 2006 - Christophe Dumez <chris@qbittorrent.org> - 0.4.0-0.1.20060mdk
|
|
||||||
- Added a search engine (supports Mininova & thepiratebay websites)
|
|
||||||
- Fixed critical bug: some options were not applied correctly to BT session
|
|
||||||
- Possibility to download a torrent file from an URL
|
|
||||||
- Added confirmation dialog on qbittorrent exit
|
|
||||||
- Enabled sorting in Download list
|
|
||||||
- Added Ukrainian translation
|
|
||||||
- Support urls as program parameters
|
|
||||||
- Added more actions to trayicon menu
|
|
||||||
- Fixed exception catching when retrieving fastresume data
|
|
||||||
- use Binary prefix standards from IEC 60027-2 for units (B, KiB, MiB, GiB, TiB)
|
|
||||||
- Iconification to systray when minimizing
|
|
||||||
- Code Cleanup & optimization
|
|
||||||
|
|
||||||
* Tue Jun 06 2006 - Christophe Dumez <chris@qbittorrent.org> - 0.3.1-0.1.20060mdk
|
|
||||||
- Fixed toolbar layout (spacing)
|
|
||||||
- Added Russian translation
|
|
||||||
- Resume also finished files on startup (for seeding)
|
|
||||||
- Added colors corresponding to download state
|
|
||||||
- Fixed a segfault when deleting a download (if no scan dir is set)
|
|
||||||
|
|
||||||
* Mon Jun 05 2006 - Christophe Dumez <chris@qbittorrent.org> - 0.3-0.1.20060mdk
|
|
||||||
- Fixed auto-resume (worked only once)
|
|
||||||
- Fixed BT_Backup dir creation on first startup (thanks Peter)
|
|
||||||
- Now min port and max port are inverted if (min port > max port)
|
|
||||||
- Fixed memory leaks
|
|
||||||
- Added qbittorrent man page
|
|
||||||
- Allow to disable max connections limit (default is disabled)
|
|
||||||
- Disable upload limit by default
|
|
||||||
- Added Menu Entry with icon (thanks Peter)
|
|
||||||
- Restructured directory, now Makefile is in main directory (not src/)
|
|
||||||
- Updated README / INSTALL
|
|
||||||
|
|
||||||
* Fri Jun 02 2006 - Christophe Dumez <chris@qbittorrent.org> 0.2.3-0.1.20060mdk
|
|
||||||
- Fixed ports checking function (user couldn't type the value he wanted)
|
|
||||||
- Check tracker errors list size and clear it if it becomes too big.
|
|
||||||
- qBittorrent does not remove .torrent file from scanned directory anymore
|
|
||||||
- Small cosmetic change
|
|
||||||
|
|
||||||
* Wed May 31 2006 Christophe Dumez <chris@qbittorrent.org> 0.2.2-0.1.20060mdk
|
|
||||||
- Fixed missing icons
|
|
||||||
|
|
||||||
* Sat May 27 2006 Jeffery Fernandez <developer@jefferyfernandez.id.au> 0.2.1-0.1.20060mdk
|
|
||||||
- Initial Build for Mandriva Linux
|
|
||||||
|
|
||||||
* Thu May 25 2006 Christophe Dumez <chris@qbittorrent.org>
|
|
||||||
- Fixed "make install" rule
|
|
||||||
- Disabled debug mode
|
|
||||||
|
|
||||||
* Thu May 25 2006 Christophe Dumez <chris@qbittorrent.org> - v0.2
|
|
||||||
- Fixed a compatibility problem with some versions of qmake
|
|
||||||
- Added translations : Greek, Swedish
|
|
||||||
- Fixed Polish translation selection
|
|
||||||
- Fixed come warning because of two unexisting slots
|
|
||||||
- Improved "Apply" button behaviour in options
|
|
||||||
- Windows are now resizable
|
|
||||||
|
|
||||||
* Tue May 16 2006 Christophe Dumez <chris@qbittorrent.org> - v0.1
|
|
||||||
- Initial release (lack features & still need a lot of improvements)
|
|
||||||
|
|
||||||
@@ -1,147 +0,0 @@
|
|||||||
|
|
||||||
%define package_name rb_libtorrent
|
|
||||||
%define orig_name libtorrent
|
|
||||||
%define major 0
|
|
||||||
%define minor .10
|
|
||||||
%define patch .1
|
|
||||||
%define version %{major}%{minor}
|
|
||||||
%define candidate -rc1
|
|
||||||
%define lib_name %mklibname %{package_name} %{major}
|
|
||||||
%define release %mkrel 4
|
|
||||||
|
|
||||||
Summary : libtorrent is a C++ bittorrent library.
|
|
||||||
Name : %{package_name}
|
|
||||||
Version : %{version}
|
|
||||||
Release : %{release}
|
|
||||||
License : GPL
|
|
||||||
Group : Development/C++
|
|
||||||
Source0 : http://www.rasterbar.com/products/libtorrent/libtorrent-%{version}.tar.gz
|
|
||||||
URL : http://www.rasterbar.com
|
|
||||||
BuildRequires : boost >= 1.33.1
|
|
||||||
BuildRoot : %{_tmppath}/%{orig_name}-%{version}-%{release}-root
|
|
||||||
Patch0 : file_progress_arvid.patch.bz2
|
|
||||||
|
|
||||||
%description
|
|
||||||
libtorrent is a C++ library that aims to be a good alternative
|
|
||||||
to all the other bittorrent implementations around.
|
|
||||||
|
|
||||||
|
|
||||||
%package -n %{package_name}-devel
|
|
||||||
Group : Development/C++
|
|
||||||
Summary : Development files for %{package_name}
|
|
||||||
Conflicts : libtorrent7-devel
|
|
||||||
|
|
||||||
%description -n %{package_name}-devel
|
|
||||||
Development files for %{package_name}
|
|
||||||
|
|
||||||
%package -n %{lib_name}
|
|
||||||
Group : Development/C++
|
|
||||||
Summary : Library files for %{package_name}
|
|
||||||
Conflicts : libtorrent7
|
|
||||||
|
|
||||||
%description -n %{lib_name}
|
|
||||||
Library files for %{package_name}
|
|
||||||
|
|
||||||
%prep
|
|
||||||
%setup -n %{orig_name}-%{version}
|
|
||||||
|
|
||||||
%build
|
|
||||||
%configure --prefix=%{_prefix}
|
|
||||||
%make
|
|
||||||
|
|
||||||
|
|
||||||
%install
|
|
||||||
%makeinstall
|
|
||||||
|
|
||||||
# Create directories for the package
|
|
||||||
install -d %{buildroot}%{_includedir}/%{orig_name}
|
|
||||||
install -d %{buildroot}%{_libdir}/pkgconfig
|
|
||||||
|
|
||||||
%clean
|
|
||||||
rm -rf %{buildroot}
|
|
||||||
|
|
||||||
# The binaries
|
|
||||||
%files %(orig_name)
|
|
||||||
%defattr(0644, root, root, 0755)
|
|
||||||
%{_bindir}/*
|
|
||||||
|
|
||||||
# Documentation
|
|
||||||
%defattr(-, root, root)
|
|
||||||
%doc README AUTHORS INSTALL COPYING ChangeLog NEWS
|
|
||||||
%doc docs/*
|
|
||||||
|
|
||||||
|
|
||||||
# Devel Package
|
|
||||||
%files -n %{package_name}-devel
|
|
||||||
%defattr(-,root,root,-)
|
|
||||||
%dir %{_includedir}/%{orig_name}/
|
|
||||||
%dir %{_includedir}/%{orig_name}/asio/
|
|
||||||
%dir %{_includedir}/%{orig_name}/asio/detail/
|
|
||||||
%dir %{_includedir}/%{orig_name}/asio/impl/
|
|
||||||
%dir %{_includedir}/%{orig_name}/asio/ip/
|
|
||||||
%dir %{_includedir}/%{orig_name}/asio/ip/detail/
|
|
||||||
%dir %{_includedir}/%{orig_name}/asio/ssl/
|
|
||||||
%dir %{_includedir}/%{orig_name}/asio/ssl/detail/
|
|
||||||
%{_includedir}/%{orig_name}/*.hpp
|
|
||||||
%{_includedir}/%{orig_name}/asio/*.hpp
|
|
||||||
%{_includedir}/%{orig_name}/asio/detail/*.hpp
|
|
||||||
%{_includedir}/%{orig_name}/asio/impl/*.ipp
|
|
||||||
%{_includedir}/%{orig_name}/asio/ip/*.hpp
|
|
||||||
%{_includedir}/%{orig_name}/asio/ip/detail/*.hpp
|
|
||||||
%{_includedir}/%{orig_name}/asio/ssl/*.hpp
|
|
||||||
%{_includedir}/%{orig_name}/asio/ssl/detail/*.hpp
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
%{_libdir}/%{orig_name}.a
|
|
||||||
%{_libdir}/%{orig_name}.la
|
|
||||||
%{_libdir}/%{orig_name}.so
|
|
||||||
%{_libdir}/pkgconfig/libtorrent.pc
|
|
||||||
|
|
||||||
|
|
||||||
# Library Package
|
|
||||||
%files -n %{lib_name}
|
|
||||||
%defattr(-,root,root,-)
|
|
||||||
%_libdir/%{orig_name}.so.*
|
|
||||||
|
|
||||||
|
|
||||||
%changelog
|
|
||||||
|
|
||||||
* Wed Aug 23 2006 Christophe Dumez <chris@qbittorrent.org> 10.0.1-2006mdk
|
|
||||||
- Added patch for Torrent Properties crash fix
|
|
||||||
|
|
||||||
* Sat Jul 1 2006 %{packager} %{version}-%{release}
|
|
||||||
- fixed a bug where the requested number of peers in a tracker request could
|
|
||||||
be too big.
|
|
||||||
- fixed a bug where empty files were not created in full allocation mode.
|
|
||||||
- fixed a bug in storage that would, in rare cases, fail to do a
|
|
||||||
complete check.
|
|
||||||
- exposed more settings for tweaking parameters in the piece-picker,
|
|
||||||
downloader and uploader (http_settings replaced by session_settings).
|
|
||||||
- tweaked default settings to improve high bandwidth transfers.
|
|
||||||
- improved the piece picker performance and made it possible to download
|
|
||||||
popular pieces in sequence to improve disk performance.
|
|
||||||
- added the possibility to control upload and download limits per peer.
|
|
||||||
- fixed problem with re-requesting skipped pieces when peer was sending pieces
|
|
||||||
out of fifo-order.
|
|
||||||
- added support for http seeding (the GetRight protocol)
|
|
||||||
- renamed identifiers called 'id' in the public interface to support linking
|
|
||||||
with Objective.C++
|
|
||||||
- changed the extensions protocol to use the new one, which is also
|
|
||||||
implemented by uTorrent.
|
|
||||||
- factorized the peer_connection and added web_peer_connection which is
|
|
||||||
able to download from http-sources.
|
|
||||||
- converted the network code to use asio (resulted in slight api changes
|
|
||||||
dealing with network addresses).
|
|
||||||
- made libtorrent build in vc7 (patches from Allen Zhao)
|
|
||||||
- fixed bug caused when binding outgoing connections to a non-local interface.
|
|
||||||
- add_torrent() will now throw if called while the session object is
|
|
||||||
being closed.
|
|
||||||
- added the ability to limit the number of simultaneous half-open
|
|
||||||
TCP connections. Flags in peer_info has been added.
|
|
||||||
|
|
||||||
|
|
||||||
* Thu Jun 1 2006 %{packager} %{version}-%{release}
|
|
||||||
- Initial Build for Mandriva Linux
|
|
||||||
@@ -1,134 +0,0 @@
|
|||||||
qbittorrent (0.6.1-0ubuntu2) dapper; urgency=low
|
|
||||||
|
|
||||||
* Disabled debug mode
|
|
||||||
|
|
||||||
-- Christophe Dumez <chris@qbittorrent.org> Mon, 28 Aug 2006 19:29:17 +0000
|
|
||||||
|
|
||||||
qbittorrent (0.6.1-0ubuntu1) dapper; urgency=low
|
|
||||||
* BUGFIX: Fixed possible segfaults when using context menus
|
|
||||||
* BUGFIX: Cleanup up context menus code
|
|
||||||
* BUGFIX: Used best gzip compressing for manpage
|
|
||||||
|
|
||||||
-- Christophe Dumez <chris@qbittorrent.org> Thu, 24 Aug 2006 19:53:32 +0200
|
|
||||||
|
|
||||||
qbittorrent (0.6.0) dapper; urgency=low
|
|
||||||
* FEATURE: Rewritten the download list from scratch (more flexible)
|
|
||||||
* FEATURE: Rewritten the search results list from scratch (more flexible)
|
|
||||||
* FEATURE: Rewritten the torrent properties list from scratch (more flexible)
|
|
||||||
* FEATURE: Improved and cleaned up search engine code
|
|
||||||
* FEATURE: Search results are now displayed in real time (not sequentially)
|
|
||||||
* FEATURE: Added two command lines parameters (--version, --help)
|
|
||||||
* FEATURE: Added a popup menu for download list
|
|
||||||
* FEATURE: Double-click on an item now toggles the paused state of a download
|
|
||||||
* FEATURE: Improved code to be more portable (Windows & MacOS versions should arrive soon)
|
|
||||||
* FEATURE: Allow to toggle selected state of a file within a torrent using double-click
|
|
||||||
* FEATURE: Remember columns width in download and search results lists
|
|
||||||
* BUGFIX: Don't use pkg-config for libcurl anymore (easier to compile)
|
|
||||||
* BUGFIX: Fixed ETA calculation when downloading while connecting
|
|
||||||
* BUGFIX: Download progress is now displayed correctly during first seconds of execution (was 0% before)
|
|
||||||
* BUGFIX: Code cleanup & optimization
|
|
||||||
* BUGFIX: Fixed sorting in download list
|
|
||||||
* BUGFIX: Fixed sorting in search results list
|
|
||||||
* BUGFIX: Fixed Parameters passing between instances
|
|
||||||
* BUGFIX: Fixed missing icon for clear action in infoBar popup menu
|
|
||||||
* BUGFIX: Fixed truncated lines in search results
|
|
||||||
* BUGFIX: Don't refresh download list when user is in search tab (save CPU)
|
|
||||||
* BUGFIX: Don't update Progress/DL Speed/ETA for finished downloads (save CPU)
|
|
||||||
* BUGFIX: Save selected search engines only when they have changed (faster program exit)
|
|
||||||
* COSMETIC: Increased icon size in toolbar from 24px to 32px
|
|
||||||
* COSMETIC: Display a progress bar to visualize each download progress
|
|
||||||
* COSMETIC: Size of each result in search are displayed in user friendly units
|
|
||||||
* COSMETIC: Display a progress bar to visualize each file progress within a torrent
|
|
||||||
* COSMETIC: Renamed 'ratio' to 'Session ratio' (makes more sense)
|
|
||||||
* COSMETIC: Improved layout of torrent properties window when maximized
|
|
||||||
* COSMETIC: Now number of search results is updated in real time
|
|
||||||
* COSMETIC: Remember last window size
|
|
||||||
* COSMETIC: Improved splash screen look
|
|
||||||
* COSMETIC: Improved default width of columns in download and search results lists
|
|
||||||
|
|
||||||
-- Christophe Dumez <chris@qbittorrent.org> Wed, 22 Aug 2006 10:42:37 +0200
|
|
||||||
|
|
||||||
qbittorrent (0.5.0) dapper; urgency=low
|
|
||||||
* Improved "Download from url" feature (now supports https, ftp & redirections)
|
|
||||||
* Added a torrent creation tool
|
|
||||||
* Display progress for each file within a torrent
|
|
||||||
* Based on new libtorrent v0.10 (lot of improvements)
|
|
||||||
* Now possible to clear log textbox (popup menu)
|
|
||||||
* Added two search engines (isohunt, torrentreactor)
|
|
||||||
* Now Display share ratio on main window
|
|
||||||
* Use OSD (On Screen Display) when a download or a search is finished
|
|
||||||
* Allow only one instance of qBittorrent (and add new parameters to download list)
|
|
||||||
* Remember last selected search engines in search tab
|
|
||||||
* Improved search engines status output (Aborted, timed out, finished, no results)
|
|
||||||
* qBittorrent can now update search plugin from qbittorrent.org
|
|
||||||
* Added Slovak, Italian, Portuguese, Romanian and Traditional Chinese languages
|
|
||||||
* Fixed ThePirateBay parser for search engine (website had changed)
|
|
||||||
* Fixed filenames for results from ThePirateBay search engine
|
|
||||||
* Fixed unicode support for ThePirateBay search engine
|
|
||||||
* Now search results are sorted by seeds
|
|
||||||
* Overwrite nova.py search plugin only if it is outdated
|
|
||||||
* Fixed possible division by 0 in ETA calculation
|
|
||||||
* Improved ETA calculation precision
|
|
||||||
* Fixed default tab in options
|
|
||||||
* When saving options, reconnect only when listening ports changed
|
|
||||||
* qBittorrent has now its own new logo
|
|
||||||
* Display status "downloading" if DL Speed > 0 (even when tracker is down)
|
|
||||||
* Added a splashscreen
|
|
||||||
* qBittorrent has new cute icons
|
|
||||||
* Display number of results in search tab
|
|
||||||
* Added icons for each item in download list according to its state
|
|
||||||
* Redesigned Locale settings
|
|
||||||
* Fixed search engines names width (were cut on the right)
|
|
||||||
* Moved search engines to the left of the window (better ui)
|
|
||||||
|
|
||||||
-- Christophe Dumez <chris@qbittorrent.org> Wed, 2 Aug 2006 19:46:32 +0200
|
|
||||||
|
|
||||||
qbittorrent (0.4.1) dapper; urgency=low
|
|
||||||
* Not counting "protocol chatter" in UP/DL speed anymore
|
|
||||||
* Download speed is now 0 when download is finished
|
|
||||||
* Paused torrents remain paused when qbittorrent is re-started
|
|
||||||
* Added option "go to systray when minimizing"
|
|
||||||
* Added option "Clear finished downloads on exit"
|
|
||||||
* Added option "Ask user for confirmation on exit"
|
|
||||||
* Added "Stalled" status for downloads (colored in orange, paused are in red and finished in green)
|
|
||||||
* Fixed Search window layout on maximizing
|
|
||||||
* Fixed a bug that caused upload limit not to be always applied
|
|
||||||
* Added Bulgarian translation
|
|
||||||
* Updated Translations
|
|
||||||
* Code optimization
|
|
||||||
|
|
||||||
-- Christophe Dumez <chris@qbittorrent.org> Thu, 22 Jun 2006 20:14:27 +0200
|
|
||||||
|
|
||||||
qbittorrent (0.4.0) dapper; urgency=low
|
|
||||||
|
|
||||||
* Added a search engine (supports Mininova & thepiratebay websites)
|
|
||||||
* Fixed critical bug: some options were not applied correctly to BT session
|
|
||||||
* Possibility to download a torrent file from an URL
|
|
||||||
* Added confirmation dialog on qbittorrent exit
|
|
||||||
* Enabled sorting in Download list
|
|
||||||
* Added Ukrainian translation
|
|
||||||
* Support urls as program parameters
|
|
||||||
* Added more actions to trayicon menu
|
|
||||||
* Fixed exception catching when retrieving fastresume data
|
|
||||||
* use Binary prefix standards from IEC 60027-2 for units (B, KiB, MiB, GiB, TiB)
|
|
||||||
* Iconification to systray when minimizing
|
|
||||||
* Code Cleanup & optimization
|
|
||||||
|
|
||||||
-- Christophe Dumez <chris@qbittorrent.org> Wed, 14 Jun 2006 14:47:27 +0200
|
|
||||||
|
|
||||||
qbittorrent (0.3.1) dapper; urgency=low
|
|
||||||
|
|
||||||
* Fixed toolbar layout (spacing).
|
|
||||||
* Added Russian translation.
|
|
||||||
* Resume also finished files on startup (for seeding).
|
|
||||||
* Added colors corresponding to download state.
|
|
||||||
* Fixed a segfault when deleting a download (if no scan dir is set).
|
|
||||||
|
|
||||||
-- Christophe Dumez <chris@qbittorrent.org> Sat, 6 Jun 2006 21:36:27 +0200
|
|
||||||
|
|
||||||
|
|
||||||
qbittorrent (0.3) dapper; urgency=low
|
|
||||||
|
|
||||||
* Initial Release.
|
|
||||||
|
|
||||||
-- Christophe Dumez <chris@qbittorrent.org> Sat, 3 Jun 2006 21:57:27 +0200
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
4
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
Source: qbittorrent
|
|
||||||
Section: net
|
|
||||||
Priority: optional
|
|
||||||
Maintainer: Christophe Dumez <chris@qbittorrent.org>
|
|
||||||
Build-Depends: debhelper (>= 4.0.0), autotools-dev, libqt4-core (>= 4.1.0), libqt4-dev (>= 4.1.0), libqt4-gui (>= 4.1.0), rb-libtorrent (>= 0.10), libcurl3-dev
|
|
||||||
Standards-Version: 3.6.2
|
|
||||||
|
|
||||||
Package: qbittorrent
|
|
||||||
Architecture: any
|
|
||||||
Depends: ${shlibs:Depends}, ${misc:Depends}, rb-libtorrent (>= 0.10), python (>= 2.3)
|
|
||||||
Description: Bittorrent client in Qt4.1 / C++
|
|
||||||
qBittorrent is a bittorrent client programmed in C++ / Qt4.1
|
|
||||||
using rb_libtorrent by Arvid Norberg. It aims to be a good
|
|
||||||
alternative to other bittorrent client out there. It is fast,
|
|
||||||
stable and provides unicode support.
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
This is qbittorrent, written and maintained by Christophe Dumez <chris@qbittorrent.org>
|
|
||||||
on Sat, 3 Jun 2006 21:57:27 +0200.
|
|
||||||
|
|
||||||
The original source can always be found at:
|
|
||||||
ftp://ftp.debian.org/dists/unstable/main/source/
|
|
||||||
|
|
||||||
Copyright (C) 2006 Christophe Dumez
|
|
||||||
|
|
||||||
License:
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this package; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
On Debian systems, the complete text of the GNU General
|
|
||||||
Public License can be found in `/usr/share/common-licenses/GPL'.
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
usr/bin
|
|
||||||
usr/sbin
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
NEWS
|
|
||||||
README
|
|
||||||
TODO
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
qbittorrent_0.6.1-0ubuntu2_i386.deb net optional
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
shlibs:Depends=libboost-date-time1.33.1, libboost-filesystem1.33.1, libboost-thread1.33.1, libc6 (>= 2.3.4-1), libcurl3 (>= 7.15.0-1), libgcc1 (>= 1:4.0.2), libqt4-core (>= 4.1.2), libqt4-gui (>= 4.1.2), libstdc++6 (>= 4.0.2-4), libx11-6, libxext6, zlib1g (>= 1:1.2.1)
|
|
||||||
@@ -1,107 +0,0 @@
|
|||||||
#!/usr/bin/make -f
|
|
||||||
# -*- makefile -*-
|
|
||||||
# Sample debian/rules that uses debhelper.
|
|
||||||
# This file was originally written by Joey Hess and Craig Small.
|
|
||||||
# As a special exception, when this file is copied by dh-make into a
|
|
||||||
# dh-make output file, you may use that output file without restriction.
|
|
||||||
# This special exception was added by Craig Small in version 0.37 of dh-make.
|
|
||||||
|
|
||||||
# Uncomment this to turn on verbose mode.
|
|
||||||
#export DH_VERBOSE=1
|
|
||||||
|
|
||||||
|
|
||||||
# These are used for cross-compiling and for saving the configure script
|
|
||||||
# from having to guess our platform (since we know it already)
|
|
||||||
DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
|
|
||||||
DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
|
|
||||||
|
|
||||||
|
|
||||||
CFLAGS = -Wall
|
|
||||||
|
|
||||||
ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
|
|
||||||
CFLAGS += -O0
|
|
||||||
else
|
|
||||||
CFLAGS += -O2
|
|
||||||
endif
|
|
||||||
|
|
||||||
config.status: configure
|
|
||||||
dh_testdir
|
|
||||||
# Add here commands to configure the package.
|
|
||||||
CFLAGS="$(CFLAGS) -Wl,-z,defs" ./configure --prefix=/usr
|
|
||||||
|
|
||||||
|
|
||||||
build: build-stamp
|
|
||||||
|
|
||||||
build-stamp: config.status
|
|
||||||
dh_testdir
|
|
||||||
|
|
||||||
# Add here commands to compile the package.
|
|
||||||
$(MAKE)
|
|
||||||
#docbook-to-man debian/qbittorrent.sgml > qbittorrent.1
|
|
||||||
|
|
||||||
touch build-stamp
|
|
||||||
|
|
||||||
clean:
|
|
||||||
dh_testdir
|
|
||||||
dh_testroot
|
|
||||||
rm -f build-stamp
|
|
||||||
|
|
||||||
# Add here commands to clean up after the build process.
|
|
||||||
-$(MAKE) distclean
|
|
||||||
ifneq "$(wildcard /usr/share/misc/config.sub)" ""
|
|
||||||
cp -f /usr/share/misc/config.sub config.sub
|
|
||||||
endif
|
|
||||||
ifneq "$(wildcard /usr/share/misc/config.guess)" ""
|
|
||||||
cp -f /usr/share/misc/config.guess config.guess
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
dh_clean
|
|
||||||
|
|
||||||
install: build
|
|
||||||
dh_testdir
|
|
||||||
dh_testroot
|
|
||||||
dh_clean -k
|
|
||||||
dh_installdirs
|
|
||||||
|
|
||||||
# Add here commands to install the package into debian/qbittorrent.
|
|
||||||
$(MAKE) install INSTALL_ROOT=$(CURDIR)/debian/qbittorrent
|
|
||||||
|
|
||||||
|
|
||||||
# Build architecture-independent files here.
|
|
||||||
binary-indep: build install
|
|
||||||
# We have nothing to do by default.
|
|
||||||
|
|
||||||
# Build architecture-dependent files here.
|
|
||||||
binary-arch: build install
|
|
||||||
dh_testdir
|
|
||||||
dh_testroot
|
|
||||||
dh_installchangelogs Changelog
|
|
||||||
dh_installdocs
|
|
||||||
dh_installexamples
|
|
||||||
# dh_install
|
|
||||||
# dh_installmenu
|
|
||||||
# dh_installdebconf
|
|
||||||
# dh_installlogrotate
|
|
||||||
# dh_installemacsen
|
|
||||||
# dh_installpam
|
|
||||||
# dh_installmime
|
|
||||||
# dh_installinit
|
|
||||||
# dh_installcron
|
|
||||||
# dh_installinfo
|
|
||||||
dh_installman
|
|
||||||
dh_link
|
|
||||||
dh_strip
|
|
||||||
dh_compress
|
|
||||||
dh_fixperms
|
|
||||||
# dh_perl
|
|
||||||
# dh_python
|
|
||||||
# dh_makeshlibs
|
|
||||||
dh_installdeb
|
|
||||||
dh_shlibdeps
|
|
||||||
dh_gencontrol
|
|
||||||
dh_md5sums
|
|
||||||
dh_builddeb
|
|
||||||
|
|
||||||
binary: binary-indep binary-arch
|
|
||||||
.PHONY: build clean binary-indep binary-arch binary install
|
|
||||||
@@ -1,134 +0,0 @@
|
|||||||
qbittorrent (0.6.1-0ubuntu2) edgy; urgency=low
|
|
||||||
|
|
||||||
* Disabled debug mode
|
|
||||||
|
|
||||||
-- Christophe Dumez <chris@qbittorrent.org> Mon, 28 Aug 2006 21:22:48 +0200
|
|
||||||
|
|
||||||
qbittorrent (0.6.1-0ubuntu1) edgy; urgency=low
|
|
||||||
* BUGFIX: Fixed possible segfaults when using context menus
|
|
||||||
* BUGFIX: Cleanup up context menus code
|
|
||||||
* BUGFIX: Used best gzip compressing for manpage
|
|
||||||
|
|
||||||
-- Christophe Dumez <chris@qbittorrent.org> Thu, 24 Aug 2006 19:53:32 +0200
|
|
||||||
|
|
||||||
qbittorrent (0.6.0) edgy; urgency=low
|
|
||||||
* FEATURE: Rewritten the download list from scratch (more flexible)
|
|
||||||
* FEATURE: Rewritten the search results list from scratch (more flexible)
|
|
||||||
* FEATURE: Rewritten the torrent properties list from scratch (more flexible)
|
|
||||||
* FEATURE: Improved and cleaned up search engine code
|
|
||||||
* FEATURE: Search results are now displayed in real time (not sequentially)
|
|
||||||
* FEATURE: Added two command lines parameters (--version, --help)
|
|
||||||
* FEATURE: Added a popup menu for download list
|
|
||||||
* FEATURE: Double-click on an item now toggles the paused state of a download
|
|
||||||
* FEATURE: Improved code to be more portable (Windows & MacOS versions should arrive soon)
|
|
||||||
* FEATURE: Allow to toggle selected state of a file within a torrent using double-click
|
|
||||||
* FEATURE: Remember columns width in download and search results lists
|
|
||||||
* BUGFIX: Don't use pkg-config for libcurl anymore (easier to compile)
|
|
||||||
* BUGFIX: Fixed ETA calculation when downloading while connecting
|
|
||||||
* BUGFIX: Download progress is now displayed correctly during first seconds of execution (was 0% before)
|
|
||||||
* BUGFIX: Code cleanup & optimization
|
|
||||||
* BUGFIX: Fixed sorting in download list
|
|
||||||
* BUGFIX: Fixed sorting in search results list
|
|
||||||
* BUGFIX: Fixed Parameters passing between instances
|
|
||||||
* BUGFIX: Fixed missing icon for clear action in infoBar popup menu
|
|
||||||
* BUGFIX: Fixed truncated lines in search results
|
|
||||||
* BUGFIX: Don't refresh download list when user is in search tab (save CPU)
|
|
||||||
* BUGFIX: Don't update Progress/DL Speed/ETA for finished downloads (save CPU)
|
|
||||||
* BUGFIX: Save selected search engines only when they have changed (faster program exit)
|
|
||||||
* COSMETIC: Increased icon size in toolbar from 24px to 32px
|
|
||||||
* COSMETIC: Display a progress bar to visualize each download progress
|
|
||||||
* COSMETIC: Size of each result in search are displayed in user friendly units
|
|
||||||
* COSMETIC: Display a progress bar to visualize each file progress within a torrent
|
|
||||||
* COSMETIC: Renamed 'ratio' to 'Session ratio' (makes more sense)
|
|
||||||
* COSMETIC: Improved layout of torrent properties window when maximized
|
|
||||||
* COSMETIC: Now number of search results is updated in real time
|
|
||||||
* COSMETIC: Remember last window size
|
|
||||||
* COSMETIC: Improved splash screen look
|
|
||||||
* COSMETIC: Improved default width of columns in download and search results lists
|
|
||||||
|
|
||||||
-- Christophe Dumez <chris@qbittorrent.org> Wed, 22 Aug 2006 10:42:37 +0200
|
|
||||||
|
|
||||||
qbittorrent (0.5.0) edgy; urgency=low
|
|
||||||
* Improved "Download from url" feature (now supports https, ftp & redirections)
|
|
||||||
* Added a torrent creation tool
|
|
||||||
* Display progress for each file within a torrent
|
|
||||||
* Based on new libtorrent v0.10 (lot of improvements)
|
|
||||||
* Now possible to clear log textbox (popup menu)
|
|
||||||
* Added two search engines (isohunt, torrentreactor)
|
|
||||||
* Now Display share ratio on main window
|
|
||||||
* Use OSD (On Screen Display) when a download or a search is finished
|
|
||||||
* Allow only one instance of qBittorrent (and add new parameters to download list)
|
|
||||||
* Remember last selected search engines in search tab
|
|
||||||
* Improved search engines status output (Aborted, timed out, finished, no results)
|
|
||||||
* qBittorrent can now update search plugin from qbittorrent.org
|
|
||||||
* Added Slovak, Italian, Portuguese, Romanian and Traditional Chinese languages
|
|
||||||
* Fixed ThePirateBay parser for search engine (website had changed)
|
|
||||||
* Fixed filenames for results from ThePirateBay search engine
|
|
||||||
* Fixed unicode support for ThePirateBay search engine
|
|
||||||
* Now search results are sorted by seeds
|
|
||||||
* Overwrite nova.py search plugin only if it is outdated
|
|
||||||
* Fixed possible division by 0 in ETA calculation
|
|
||||||
* Improved ETA calculation precision
|
|
||||||
* Fixed default tab in options
|
|
||||||
* When saving options, reconnect only when listening ports changed
|
|
||||||
* qBittorrent has now its own new logo
|
|
||||||
* Display status "downloading" if DL Speed > 0 (even when tracker is down)
|
|
||||||
* Added a splashscreen
|
|
||||||
* qBittorrent has new cute icons
|
|
||||||
* Display number of results in search tab
|
|
||||||
* Added icons for each item in download list according to its state
|
|
||||||
* Redesigned Locale settings
|
|
||||||
* Fixed search engines names width (were cut on the right)
|
|
||||||
* Moved search engines to the left of the window (better ui)
|
|
||||||
|
|
||||||
-- Christophe Dumez <chris@qbittorrent.org> Wed, 2 Aug 2006 19:46:32 +0200
|
|
||||||
|
|
||||||
qbittorrent (0.4.1) edgy; urgency=low
|
|
||||||
* Not counting "protocol chatter" in UP/DL speed anymore
|
|
||||||
* Download speed is now 0 when download is finished
|
|
||||||
* Paused torrents remain paused when qbittorrent is re-started
|
|
||||||
* Added option "go to systray when minimizing"
|
|
||||||
* Added option "Clear finished downloads on exit"
|
|
||||||
* Added option "Ask user for confirmation on exit"
|
|
||||||
* Added "Stalled" status for downloads (colored in orange, paused are in red and finished in green)
|
|
||||||
* Fixed Search window layout on maximizing
|
|
||||||
* Fixed a bug that caused upload limit not to be always applied
|
|
||||||
* Added Bulgarian translation
|
|
||||||
* Updated Translations
|
|
||||||
* Code optimization
|
|
||||||
|
|
||||||
-- Christophe Dumez <chris@qbittorrent.org> Thu, 22 Jun 2006 20:14:27 +0200
|
|
||||||
|
|
||||||
qbittorrent (0.4.0) edgy; urgency=low
|
|
||||||
|
|
||||||
* Added a search engine (supports Mininova & thepiratebay websites)
|
|
||||||
* Fixed critical bug: some options were not applied correctly to BT session
|
|
||||||
* Possibility to download a torrent file from an URL
|
|
||||||
* Added confirmation dialog on qbittorrent exit
|
|
||||||
* Enabled sorting in Download list
|
|
||||||
* Added Ukrainian translation
|
|
||||||
* Support urls as program parameters
|
|
||||||
* Added more actions to trayicon menu
|
|
||||||
* Fixed exception catching when retrieving fastresume data
|
|
||||||
* use Binary prefix standards from IEC 60027-2 for units (B, KiB, MiB, GiB, TiB)
|
|
||||||
* Iconification to systray when minimizing
|
|
||||||
* Code Cleanup & optimization
|
|
||||||
|
|
||||||
-- Christophe Dumez <chris@qbittorrent.org> Wed, 14 Jun 2006 14:47:27 +0200
|
|
||||||
|
|
||||||
qbittorrent (0.3.1) edgy; urgency=low
|
|
||||||
|
|
||||||
* Fixed toolbar layout (spacing).
|
|
||||||
* Added Russian translation.
|
|
||||||
* Resume also finished files on startup (for seeding).
|
|
||||||
* Added colors corresponding to download state.
|
|
||||||
* Fixed a segfault when deleting a download (if no scan dir is set).
|
|
||||||
|
|
||||||
-- Christophe Dumez <chris@qbittorrent.org> Sat, 6 Jun 2006 21:36:27 +0200
|
|
||||||
|
|
||||||
|
|
||||||
qbittorrent (0.3) edgy; urgency=low
|
|
||||||
|
|
||||||
* Initial Release.
|
|
||||||
|
|
||||||
-- Christophe Dumez <chris@qbittorrent.org> Sat, 3 Jun 2006 21:57:27 +0200
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
4
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
Source: qbittorrent
|
|
||||||
Section: net
|
|
||||||
Priority: optional
|
|
||||||
Maintainer: Christophe Dumez <chris@qbittorrent.org>
|
|
||||||
Build-Depends: debhelper (>= 4.0.0), autotools-dev, libqt4-core (>= 4.1.0), libqt4-dev (>= 4.1.0), libqt4-gui (>= 4.1.0), rb-libtorrent (>= 0.10), libcurl3-dev
|
|
||||||
Standards-Version: 3.6.2
|
|
||||||
|
|
||||||
Package: qbittorrent
|
|
||||||
Architecture: any
|
|
||||||
Depends: ${shlibs:Depends}, ${misc:Depends}, rb-libtorrent (>= 0.10), python (>= 2.3)
|
|
||||||
Description: Bittorrent client in Qt4.1 / C++
|
|
||||||
qBittorrent is a bittorrent client programmed in C++ / Qt4.1
|
|
||||||
using rb_libtorrent by Arvid Norberg. It aims to be a good
|
|
||||||
alternative to other bittorrent client out there. It is fast,
|
|
||||||
stable and provides unicode support.
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
This is qbittorrent, written and maintained by Christophe Dumez <chris@qbittorrent.org>
|
|
||||||
on Sat, 3 Jun 2006 21:57:27 +0200.
|
|
||||||
|
|
||||||
The original source can always be found at:
|
|
||||||
ftp://ftp.debian.org/dists/unstable/main/source/
|
|
||||||
|
|
||||||
Copyright (C) 2006 Christophe Dumez
|
|
||||||
|
|
||||||
License:
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this package; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
On Debian systems, the complete text of the GNU General
|
|
||||||
Public License can be found in `/usr/share/common-licenses/GPL'.
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
usr/bin
|
|
||||||
usr/sbin
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
NEWS
|
|
||||||
README
|
|
||||||
TODO
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
qbittorrent_0.6.1-0ubuntu2_i386.deb net optional
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
shlibs:Depends=libboost-date-time1.33.1, libboost-filesystem1.33.1, libboost-thread1.33.1, libc6 (>= 2.4-1), libcurl3 (>= 7.15.4-1), libgcc1 (>= 1:4.1.1-11ubuntu1), libqt4-core (>= 4.1.4), libqt4-gui (>= 4.1.4), libstdc++6 (>= 4.1.1-11ubuntu1), libx11-6, libxext6, zlib1g (>= 1:1.2.1)
|
|
||||||
@@ -1,107 +0,0 @@
|
|||||||
#!/usr/bin/make -f
|
|
||||||
# -*- makefile -*-
|
|
||||||
# Sample debian/rules that uses debhelper.
|
|
||||||
# This file was originally written by Joey Hess and Craig Small.
|
|
||||||
# As a special exception, when this file is copied by dh-make into a
|
|
||||||
# dh-make output file, you may use that output file without restriction.
|
|
||||||
# This special exception was added by Craig Small in version 0.37 of dh-make.
|
|
||||||
|
|
||||||
# Uncomment this to turn on verbose mode.
|
|
||||||
#export DH_VERBOSE=1
|
|
||||||
|
|
||||||
|
|
||||||
# These are used for cross-compiling and for saving the configure script
|
|
||||||
# from having to guess our platform (since we know it already)
|
|
||||||
DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
|
|
||||||
DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
|
|
||||||
|
|
||||||
|
|
||||||
CFLAGS = -Wall
|
|
||||||
|
|
||||||
ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
|
|
||||||
CFLAGS += -O0
|
|
||||||
else
|
|
||||||
CFLAGS += -O2
|
|
||||||
endif
|
|
||||||
|
|
||||||
config.status: configure
|
|
||||||
dh_testdir
|
|
||||||
# Add here commands to configure the package.
|
|
||||||
CFLAGS="$(CFLAGS) -Wl,-z,defs" ./configure --prefix=/usr
|
|
||||||
|
|
||||||
|
|
||||||
build: build-stamp
|
|
||||||
|
|
||||||
build-stamp: config.status
|
|
||||||
dh_testdir
|
|
||||||
|
|
||||||
# Add here commands to compile the package.
|
|
||||||
$(MAKE)
|
|
||||||
#docbook-to-man debian/qbittorrent.sgml > qbittorrent.1
|
|
||||||
|
|
||||||
touch build-stamp
|
|
||||||
|
|
||||||
clean:
|
|
||||||
dh_testdir
|
|
||||||
dh_testroot
|
|
||||||
rm -f build-stamp
|
|
||||||
|
|
||||||
# Add here commands to clean up after the build process.
|
|
||||||
-$(MAKE) distclean
|
|
||||||
ifneq "$(wildcard /usr/share/misc/config.sub)" ""
|
|
||||||
cp -f /usr/share/misc/config.sub config.sub
|
|
||||||
endif
|
|
||||||
ifneq "$(wildcard /usr/share/misc/config.guess)" ""
|
|
||||||
cp -f /usr/share/misc/config.guess config.guess
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
dh_clean
|
|
||||||
|
|
||||||
install: build
|
|
||||||
dh_testdir
|
|
||||||
dh_testroot
|
|
||||||
dh_clean -k
|
|
||||||
dh_installdirs
|
|
||||||
|
|
||||||
# Add here commands to install the package into debian/qbittorrent.
|
|
||||||
$(MAKE) install INSTALL_ROOT=$(CURDIR)/debian/qbittorrent
|
|
||||||
|
|
||||||
|
|
||||||
# Build architecture-independent files here.
|
|
||||||
binary-indep: build install
|
|
||||||
# We have nothing to do by default.
|
|
||||||
|
|
||||||
# Build architecture-dependent files here.
|
|
||||||
binary-arch: build install
|
|
||||||
dh_testdir
|
|
||||||
dh_testroot
|
|
||||||
dh_installchangelogs Changelog
|
|
||||||
dh_installdocs
|
|
||||||
dh_installexamples
|
|
||||||
# dh_install
|
|
||||||
# dh_installmenu
|
|
||||||
# dh_installdebconf
|
|
||||||
# dh_installlogrotate
|
|
||||||
# dh_installemacsen
|
|
||||||
# dh_installpam
|
|
||||||
# dh_installmime
|
|
||||||
# dh_installinit
|
|
||||||
# dh_installcron
|
|
||||||
# dh_installinfo
|
|
||||||
dh_installman
|
|
||||||
dh_link
|
|
||||||
dh_strip
|
|
||||||
dh_compress
|
|
||||||
dh_fixperms
|
|
||||||
# dh_perl
|
|
||||||
# dh_python
|
|
||||||
# dh_makeshlibs
|
|
||||||
dh_installdeb
|
|
||||||
dh_shlibdeps
|
|
||||||
dh_gencontrol
|
|
||||||
dh_md5sums
|
|
||||||
dh_builddeb
|
|
||||||
|
|
||||||
binary: binary-indep binary-arch
|
|
||||||
.PHONY: build clean binary-indep binary-arch binary install
|
|
||||||
199
qBittorrent.kdevelop
Normal file
@@ -0,0 +1,199 @@
|
|||||||
|
<?xml version = '1.0'?>
|
||||||
|
<kdevelop>
|
||||||
|
<general>
|
||||||
|
<author>Christophe Dumez</author>
|
||||||
|
<email>chris@qbittorrent.org</email>
|
||||||
|
<version>1.0.0</version>
|
||||||
|
<projectmanagement>KDevTrollProject</projectmanagement>
|
||||||
|
<primarylanguage>C++</primarylanguage>
|
||||||
|
<keywords>
|
||||||
|
<keyword>Qt</keyword>
|
||||||
|
</keywords>
|
||||||
|
<projectname>qBittorrent</projectname>
|
||||||
|
<ignoreparts/>
|
||||||
|
<projectdirectory>.</projectdirectory>
|
||||||
|
<absoluteprojectpath>false</absoluteprojectpath>
|
||||||
|
<description/>
|
||||||
|
<defaultencoding/>
|
||||||
|
<versioncontrol>kdevsubversion</versioncontrol>
|
||||||
|
</general>
|
||||||
|
<kdevfileview>
|
||||||
|
<groups>
|
||||||
|
<group pattern="*.cpp;*.cxx;*.h" name="Sources" />
|
||||||
|
<group pattern="*.ui" name="User Interface" />
|
||||||
|
<group pattern="*.png" name="Icons" />
|
||||||
|
<group pattern="*" name="Others" />
|
||||||
|
<hidenonprojectfiles>false</hidenonprojectfiles>
|
||||||
|
<hidenonlocation>false</hidenonlocation>
|
||||||
|
</groups>
|
||||||
|
<tree>
|
||||||
|
<hidepatterns>*.o,*.lo,CVS</hidepatterns>
|
||||||
|
<hidenonprojectfiles>false</hidenonprojectfiles>
|
||||||
|
<showvcsfields>false</showvcsfields>
|
||||||
|
</tree>
|
||||||
|
</kdevfileview>
|
||||||
|
<kdevdoctreeview>
|
||||||
|
<ignoretocs>
|
||||||
|
<toc>bash</toc>
|
||||||
|
<toc>bash_bugs</toc>
|
||||||
|
<toc>clanlib</toc>
|
||||||
|
<toc>w3c-dom-level2-html</toc>
|
||||||
|
<toc>fortran_bugs_gcc</toc>
|
||||||
|
<toc>gnome1</toc>
|
||||||
|
<toc>gnustep</toc>
|
||||||
|
<toc>gtk</toc>
|
||||||
|
<toc>gtk_bugs</toc>
|
||||||
|
<toc>haskell</toc>
|
||||||
|
<toc>haskell_bugs_ghc</toc>
|
||||||
|
<toc>java_bugs_gcc</toc>
|
||||||
|
<toc>java_bugs_sun</toc>
|
||||||
|
<toc>kde2book</toc>
|
||||||
|
<toc>opengl</toc>
|
||||||
|
<toc>pascal_bugs_fp</toc>
|
||||||
|
<toc>php</toc>
|
||||||
|
<toc>php_bugs</toc>
|
||||||
|
<toc>perl</toc>
|
||||||
|
<toc>perl_bugs</toc>
|
||||||
|
<toc>python</toc>
|
||||||
|
<toc>python_bugs</toc>
|
||||||
|
<toc>qt-kdev3</toc>
|
||||||
|
<toc>ruby</toc>
|
||||||
|
<toc>ruby_bugs</toc>
|
||||||
|
<toc>sdl</toc>
|
||||||
|
<toc>stl</toc>
|
||||||
|
<toc>w3c-svg</toc>
|
||||||
|
<toc>sw</toc>
|
||||||
|
<toc>w3c-uaag10</toc>
|
||||||
|
<toc>wxwidgets_bugs</toc>
|
||||||
|
</ignoretocs>
|
||||||
|
<ignoredoxygen>
|
||||||
|
<toc>KDE Libraries (Doxygen)</toc>
|
||||||
|
</ignoredoxygen>
|
||||||
|
</kdevdoctreeview>
|
||||||
|
<kdevdebugger>
|
||||||
|
<general>
|
||||||
|
<dbgshell/>
|
||||||
|
<gdbpath/>
|
||||||
|
<configGdbScript/>
|
||||||
|
<runShellScript/>
|
||||||
|
<runGdbScript/>
|
||||||
|
<breakonloadinglibs>true</breakonloadinglibs>
|
||||||
|
<separatetty>false</separatetty>
|
||||||
|
<floatingtoolbar>false</floatingtoolbar>
|
||||||
|
</general>
|
||||||
|
<display>
|
||||||
|
<staticmembers>false</staticmembers>
|
||||||
|
<demanglenames>true</demanglenames>
|
||||||
|
<outputradix>10</outputradix>
|
||||||
|
</display>
|
||||||
|
</kdevdebugger>
|
||||||
|
<kdevcppsupport>
|
||||||
|
<qt>
|
||||||
|
<version>4</version>
|
||||||
|
<used>true</used>
|
||||||
|
<includestyle>4</includestyle>
|
||||||
|
<designerintegration>ExternalDesigner</designerintegration>
|
||||||
|
<root>/usr/lib/qt4</root>
|
||||||
|
<qmake>/usr/bin/qmake</qmake>
|
||||||
|
<designer>/usr/bin/designer</designer>
|
||||||
|
<designerpluginpaths/>
|
||||||
|
</qt>
|
||||||
|
<references>
|
||||||
|
<pcs>automatic_%2Fhome%2Fishanarora%2Fprojects%2Fqbittorrent</pcs>
|
||||||
|
</references>
|
||||||
|
<codecompletion>
|
||||||
|
<automaticCodeCompletion>true</automaticCodeCompletion>
|
||||||
|
<automaticArgumentsHint>true</automaticArgumentsHint>
|
||||||
|
<automaticHeaderCompletion>true</automaticHeaderCompletion>
|
||||||
|
<codeCompletionDelay>250</codeCompletionDelay>
|
||||||
|
<argumentsHintDelay>400</argumentsHintDelay>
|
||||||
|
<headerCompletionDelay>250</headerCompletionDelay>
|
||||||
|
<showOnlyAccessibleItems>false</showOnlyAccessibleItems>
|
||||||
|
<completionBoxItemOrder>0</completionBoxItemOrder>
|
||||||
|
<howEvaluationContextMenu>true</howEvaluationContextMenu>
|
||||||
|
<showCommentWithArgumentHint>true</showCommentWithArgumentHint>
|
||||||
|
<statusBarTypeEvaluation>false</statusBarTypeEvaluation>
|
||||||
|
<namespaceAliases>std=_GLIBCXX_STD;__gnu_cxx=std</namespaceAliases>
|
||||||
|
<processPrimaryTypes>true</processPrimaryTypes>
|
||||||
|
<processFunctionArguments>true</processFunctionArguments>
|
||||||
|
<preProcessAllHeaders>true</preProcessAllHeaders>
|
||||||
|
<parseMissingHeadersExperimental>true</parseMissingHeadersExperimental>
|
||||||
|
<resolveIncludePathsUsingMakeExperimental>true</resolveIncludePathsUsingMakeExperimental>
|
||||||
|
<alwaysParseInBackground>true</alwaysParseInBackground>
|
||||||
|
<usePermanentCaching>true</usePermanentCaching>
|
||||||
|
<alwaysIncludeNamespaces>false</alwaysIncludeNamespaces>
|
||||||
|
<includePaths>.;</includePaths>
|
||||||
|
</codecompletion>
|
||||||
|
<creategettersetter>
|
||||||
|
<prefixGet>get</prefixGet>
|
||||||
|
<prefixSet>set</prefixSet>
|
||||||
|
<prefixVariable>m_,_</prefixVariable>
|
||||||
|
<parameterName>theValue</parameterName>
|
||||||
|
<inlineGet>true</inlineGet>
|
||||||
|
<inlineSet>true</inlineSet>
|
||||||
|
</creategettersetter>
|
||||||
|
<splitheadersource>
|
||||||
|
<enabled>false</enabled>
|
||||||
|
<synchronize>true</synchronize>
|
||||||
|
<orientation>Vertical</orientation>
|
||||||
|
</splitheadersource>
|
||||||
|
</kdevcppsupport>
|
||||||
|
<kdevfilecreate>
|
||||||
|
<filetypes/>
|
||||||
|
<useglobaltypes>
|
||||||
|
<type ext="ui" />
|
||||||
|
<type ext="cpp" />
|
||||||
|
<type ext="h" />
|
||||||
|
</useglobaltypes>
|
||||||
|
</kdevfilecreate>
|
||||||
|
<kdevtrollproject>
|
||||||
|
<general>
|
||||||
|
<activedir>src</activedir>
|
||||||
|
</general>
|
||||||
|
<run>
|
||||||
|
<directoryradio>executable</directoryradio>
|
||||||
|
<mainprogram>/home/ishanarora/projects/qbittorrent/src/qbittorrent</mainprogram>
|
||||||
|
<programargs/>
|
||||||
|
<globaldebugarguments/>
|
||||||
|
<globalcwd>/home/ishanarora/projects/qbittorrent</globalcwd>
|
||||||
|
<useglobalprogram>true</useglobalprogram>
|
||||||
|
<terminal>false</terminal>
|
||||||
|
<autocompile>true</autocompile>
|
||||||
|
<autoinstall>false</autoinstall>
|
||||||
|
<autokdesu>false</autokdesu>
|
||||||
|
<envvars/>
|
||||||
|
</run>
|
||||||
|
<make>
|
||||||
|
<abortonerror>true</abortonerror>
|
||||||
|
<runmultiplejobs>false</runmultiplejobs>
|
||||||
|
<numberofjobs>1</numberofjobs>
|
||||||
|
<dontact>false</dontact>
|
||||||
|
<makebin/>
|
||||||
|
<prio>0</prio>
|
||||||
|
<envvars/>
|
||||||
|
</make>
|
||||||
|
<qmake>
|
||||||
|
<savebehaviour>2</savebehaviour>
|
||||||
|
<replacePaths>false</replacePaths>
|
||||||
|
<disableDefaultOpts>true</disableDefaultOpts>
|
||||||
|
</qmake>
|
||||||
|
</kdevtrollproject>
|
||||||
|
<cppsupportpart>
|
||||||
|
<filetemplates>
|
||||||
|
<interfacesuffix>.h</interfacesuffix>
|
||||||
|
<implementationsuffix>.cpp</implementationsuffix>
|
||||||
|
</filetemplates>
|
||||||
|
</cppsupportpart>
|
||||||
|
<ctagspart>
|
||||||
|
<customArguments/>
|
||||||
|
<customTagfilePath>/home/ishanarora/projects/qbittorrent/tags</customTagfilePath>
|
||||||
|
<activeTagsFiles/>
|
||||||
|
</ctagspart>
|
||||||
|
<kdevdocumentation>
|
||||||
|
<projectdoc>
|
||||||
|
<docsystem/>
|
||||||
|
<docurl/>
|
||||||
|
<usermanualurl/>
|
||||||
|
</projectdoc>
|
||||||
|
</kdevdocumentation>
|
||||||
|
</kdevelop>
|
||||||
@@ -2,10 +2,11 @@
|
|||||||
<name>qbittorrent</name>
|
<name>qbittorrent</name>
|
||||||
<profile>qbittorrent.pro</profile>
|
<profile>qbittorrent.pro</profile>
|
||||||
<moddir>qcm</moddir>
|
<moddir>qcm</moddir>
|
||||||
<dep type='qt42'>
|
<datadir/>
|
||||||
|
<dep type='qt4'>
|
||||||
<required/>
|
<required/>
|
||||||
</dep>
|
</dep>
|
||||||
<dep type='libtorrent'>
|
<dep type='libtorrent-rasterbar'>
|
||||||
<required/>
|
<required/>
|
||||||
</dep>
|
</dep>
|
||||||
<dep type='libboost'>
|
<dep type='libboost'>
|
||||||
@@ -14,7 +15,5 @@
|
|||||||
<dep type='libcurl'>
|
<dep type='libcurl'>
|
||||||
<required/>
|
<required/>
|
||||||
</dep>
|
</dep>
|
||||||
<dep type='python'>
|
<dep type='libzzip'/>
|
||||||
<required/>
|
|
||||||
</dep>
|
|
||||||
</qconf>
|
</qconf>
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
-----BEGIN QCMOD-----
|
-----BEGIN QCMOD-----
|
||||||
name: libboost
|
name: libboost
|
||||||
|
arg: with-libboost-inc=[path], Path to libboost include files
|
||||||
-----END QCMOD-----
|
-----END QCMOD-----
|
||||||
*/
|
*/
|
||||||
class qc_libboost : public ConfObj
|
class qc_libboost : public ConfObj
|
||||||
@@ -10,31 +11,46 @@ public:
|
|||||||
QString name() const { return "libboost"; }
|
QString name() const { return "libboost"; }
|
||||||
QString shortname() const { return "libboost"; }
|
QString shortname() const { return "libboost"; }
|
||||||
bool exec(){
|
bool exec(){
|
||||||
QString s;
|
QString s;
|
||||||
QStringList sl;
|
s = conf->getenv("QC_WITH_LIBBOOST_INC");
|
||||||
sl += "/usr/include";
|
if(!s.isEmpty()) {
|
||||||
sl += "/usr/local/include";
|
if(!conf->checkHeader(s, "boost/format.hpp")) {
|
||||||
sl += "/sw/include";
|
return false;
|
||||||
if(!conf->findHeader("boost/format.hpp", sl, &s)) {
|
}
|
||||||
qWarning("libboost includes not found!");
|
if(!conf->checkHeader(s, "boost/date_time/posix_time/posix_time.hpp")) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
conf->addIncludePath(s);
|
if(!conf->checkHeader(s, "boost/filesystem/path.hpp")) {
|
||||||
if(!conf->findHeader("boost/date_time/posix_time/posix_time.hpp", sl, &s)) {
|
return false;
|
||||||
qWarning("libboost-date-time includes not found!");
|
}
|
||||||
return false;
|
if(!conf->checkHeader(s, "boost/thread.hpp")) {
|
||||||
}
|
return false;
|
||||||
conf->addIncludePath(s);
|
}
|
||||||
if(!conf->findHeader("boost/filesystem/path.hpp", sl, &s)) {
|
}else{
|
||||||
qWarning("libboost-filesystem includes not found!");
|
QStringList sl;
|
||||||
return false;
|
sl << "/usr/include";
|
||||||
}
|
sl << "/usr/local/include";
|
||||||
if(!conf->findHeader("boost/thread.hpp", sl, &s)) {
|
bool found = false;
|
||||||
qWarning("libboost-thread includes not found!");
|
foreach(s, sl){
|
||||||
return false;
|
if(conf->checkHeader(s, "boost/format.hpp")){
|
||||||
}
|
found = true;
|
||||||
conf->addIncludePath(s);
|
break;
|
||||||
|
}
|
||||||
return true;
|
}
|
||||||
|
if(!found) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(!conf->checkHeader(s, "boost/date_time/posix_time/posix_time.hpp")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(!conf->checkHeader(s, "boost/filesystem/path.hpp")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(!conf->checkHeader(s, "boost/thread.hpp")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
conf->addIncludePath(s);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
-----BEGIN QCMOD-----
|
-----BEGIN QCMOD-----
|
||||||
name: libcurl
|
name: libcommoncpp2
|
||||||
arg: with-libcurl-inc=[path], Path to libcurl include files
|
arg: with-libcurl-inc=[path], Path to libcurl include files
|
||||||
arg: with-libcurl-lib=[path], Path to libcurl library files
|
arg: with-libcurl-lib=[path], Path to libcurl library files
|
||||||
-----END QCMOD-----
|
-----END QCMOD-----
|
||||||
@@ -12,43 +12,50 @@ public:
|
|||||||
QString name() const { return "libcurl"; }
|
QString name() const { return "libcurl"; }
|
||||||
QString shortname() const { return "libcurl"; }
|
QString shortname() const { return "libcurl"; }
|
||||||
bool exec(){
|
bool exec(){
|
||||||
QString s;
|
QString s;
|
||||||
s = conf->getenv("QC_WITH_LIBCURL_INC");
|
s = conf->getenv("QC_WITH_LIBCURL_INC");
|
||||||
if(!s.isEmpty()) {
|
if(!s.isEmpty()) {
|
||||||
if(!conf->checkHeader(s, "curl/curl.h")) {
|
if(!conf->checkHeader(s, "curl/curl.h")) {
|
||||||
qWarning("libcurl includes not found!");
|
return false;
|
||||||
return false;
|
}
|
||||||
}
|
}else{
|
||||||
conf->addIncludePath(s);
|
QStringList sl;
|
||||||
}else{
|
sl << "/usr/include";
|
||||||
QStringList sl;
|
sl << "/usr/local/include";
|
||||||
sl += "/usr/include";
|
bool found = false;
|
||||||
sl += "/usr/local/include";
|
foreach(s, sl){
|
||||||
if(!conf->findHeader("curl/curl.h", sl, &s)) {
|
if(conf->checkHeader(s, "curl/curl.h")){
|
||||||
qWarning("libcurl includes not found!");
|
found = true;
|
||||||
return false;
|
break;
|
||||||
}
|
}
|
||||||
conf->addIncludePath(s);
|
}
|
||||||
}
|
if(!found) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
conf->addIncludePath(s);
|
||||||
|
|
||||||
s = conf->getenv("QC_WITH_LIBCURL_LIB");
|
s = conf->getenv("QC_WITH_LIBCURL_LIB");
|
||||||
if(!s.isEmpty()) {
|
if(!s.isEmpty()) {
|
||||||
if(!conf->checkLibrary(s, "curl")) {
|
if(!QFile::exists(s+QString("/libcurl.so")))
|
||||||
qWarning("libcurl library not found!");
|
return false;
|
||||||
return false;
|
conf->addLib(QString("-L") + s);
|
||||||
}
|
}else{
|
||||||
conf->addLib(QString("-L") + s);
|
QStringList sl;
|
||||||
}else{
|
sl << "/usr/lib/";
|
||||||
if(!conf->findLibrary("curl", &s)) {
|
sl << "/usr/lib64/";
|
||||||
qWarning("libcurl library not found!");
|
sl << "/usr/local/lib/";
|
||||||
return false;
|
sl << "/usr/local/lib64/";
|
||||||
}
|
bool found = false;
|
||||||
if (!s.isEmpty())
|
foreach(s, sl){
|
||||||
conf->addLib(QString("-L") + s);
|
if(QFile::exists(s+QString("libcurl.so"))){
|
||||||
}
|
found = true;
|
||||||
|
break;
|
||||||
conf->addLib("-lcurl");
|
}
|
||||||
|
}
|
||||||
return true;
|
if(!found) return false;
|
||||||
|
conf->addLib(QString("-L") + s);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
76
qcm/libmagick.qcm
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
-----BEGIN QCMOD-----
|
||||||
|
name: libmagick
|
||||||
|
arg: with-libmagick-inc=[path], Path to libmagick++ include files
|
||||||
|
arg: with-libmagick-lib=[path], Path to libmagick++ library files
|
||||||
|
-----END QCMOD-----
|
||||||
|
*/
|
||||||
|
#include <QProcess>
|
||||||
|
class qc_libmagick : public ConfObj
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
qc_libmagick(Conf *c) : ConfObj(c) {}
|
||||||
|
QString name() const { return "ImageMagick library (libmagick++)"; }
|
||||||
|
QString shortname() const { return "libmagick++"; }
|
||||||
|
QString checkString() const {
|
||||||
|
if(!conf->getenv("QC_DISABLE_libmagick").isEmpty())
|
||||||
|
return "";
|
||||||
|
return ConfObj::checkString();
|
||||||
|
}
|
||||||
|
bool exec(){
|
||||||
|
if(!conf->getenv("QC_DISABLE_libmagick").isEmpty())
|
||||||
|
return false;
|
||||||
|
QString s;
|
||||||
|
s = conf->getenv("QC_WITH_LIBMAGICK_INC");
|
||||||
|
if(!s.isEmpty()) {
|
||||||
|
if(!conf->checkHeader(s, "Magick++.h")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
QStringList sl;
|
||||||
|
sl << "/usr/include";
|
||||||
|
sl << "/usr/local/include";
|
||||||
|
bool found = false;
|
||||||
|
foreach(s, sl){
|
||||||
|
if(conf->checkHeader(s, "Magick++.h")){
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!found)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
conf->addIncludePath(s);
|
||||||
|
|
||||||
|
s = conf->getenv("QC_WITH_LIBMAGICK_LIB");
|
||||||
|
if(!s.isEmpty()) {
|
||||||
|
if(!conf->checkLibrary(s, "Magick++")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
QStringList sl;
|
||||||
|
sl << "/usr/lib/";
|
||||||
|
sl << "/usr/lib64/";
|
||||||
|
sl << "/usr/local/lib/";
|
||||||
|
sl << "/usr/local/lib64/";
|
||||||
|
bool found = false;
|
||||||
|
foreach(s, sl){
|
||||||
|
if(conf->checkLibrary(s, "Magick++")) {
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!found)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
conf->addLib(QString("-L") + s);
|
||||||
|
QString out = "";
|
||||||
|
QStringList params;
|
||||||
|
params << "--libs";
|
||||||
|
qconf->doCommand("Magick++-config", params, &out);
|
||||||
|
out = out.replace("\n", "");
|
||||||
|
conf->addLib(result.data());
|
||||||
|
conf->addDefine("HAVE_MAGICK");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
29
qcm/libtorrent-rasterbar.qcm
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
-----BEGIN QCMOD-----
|
||||||
|
name: libtorrent-rasterbar
|
||||||
|
-----END QCMOD-----
|
||||||
|
*/
|
||||||
|
// see Conf::findPkgConfig
|
||||||
|
class qc_libtorrent_rasterbar : public ConfObj
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {}
|
||||||
|
QString name() const { return "libtorrent-rasterbar >= 0.14.0 (>= 0.14.4 advised)"; }
|
||||||
|
QString shortname() const { return "libtorrent-rasterbar"; }
|
||||||
|
bool exec(){
|
||||||
|
QStringList incs;
|
||||||
|
QString req_ver = "0.14.0";
|
||||||
|
QString adv_ver = "0.14.4";
|
||||||
|
QString version, libs, other;
|
||||||
|
VersionMode mode = VersionMin;
|
||||||
|
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, req_ver, &version, &incs, &libs, &other))
|
||||||
|
return false;
|
||||||
|
for(int n = 0; n < incs.count(); ++n)
|
||||||
|
conf->addIncludePath(incs[n]);
|
||||||
|
if(!libs.isEmpty())
|
||||||
|
conf->addLib(libs);
|
||||||
|
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, adv_ver, &version, &incs, &libs, &other))
|
||||||
|
printf("\nWarning: libtorrent-rasterbar v%s was detected. Although it will compile and run, you will probably experience some bugs. Please consider updating to v%s!\n", version.toLocal8Bit().data(), adv_ver.toUtf8().data());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
/*
|
|
||||||
-----BEGIN QCMOD-----
|
|
||||||
name: libtorrent
|
|
||||||
arg: with-libtorrent-inc=[path], Path to libtorrent include files
|
|
||||||
arg: with-libtorrent-lib=[path], Path to libtorrent library files
|
|
||||||
-----END QCMOD-----
|
|
||||||
*/
|
|
||||||
class qc_libtorrent : public ConfObj
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
qc_libtorrent(Conf *c) : ConfObj(c) {}
|
|
||||||
QString name() const { return "libtorrent >= 0.12"; }
|
|
||||||
QString shortname() const { return "libtorrent"; }
|
|
||||||
bool exec(){
|
|
||||||
QString s;
|
|
||||||
s = conf->getenv("QC_WITH_LIBTORRENT_INC");
|
|
||||||
if(!s.isEmpty()) {
|
|
||||||
if(!conf->checkHeader(s, "libtorrent/extensions/ut_pex.hpp")) {
|
|
||||||
qWarning("libtorrent v0.12 includes not found!\nYou can download it at http://www.libtorrent.net");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
conf->addIncludePath(s);
|
|
||||||
}else{
|
|
||||||
QStringList sl;
|
|
||||||
sl << "/usr/include/";
|
|
||||||
sl << "/usr/local/include";
|
|
||||||
if(!conf->findHeader("libtorrent/extensions/ut_pex.hpp", sl, &s)) {
|
|
||||||
qWarning("libtorrent v0.12 includes not found!\nYou can download it at http://www.libtorrent.net");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
conf->addIncludePath(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
s = conf->getenv("QC_WITH_LIBTORRENT_LIB");
|
|
||||||
if(!s.isEmpty()) {
|
|
||||||
if(!conf->checkLibrary(s, "torrent")) {
|
|
||||||
qWarning("libtorrent library not found!");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
conf->addLib(QString("-L") + s);
|
|
||||||
}else{
|
|
||||||
if(!conf->findLibrary("torrent", &s)) {
|
|
||||||
qWarning("libtorrent library not found!");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!s.isEmpty())
|
|
||||||
conf->addLib(QString("-L") + s);
|
|
||||||
}
|
|
||||||
|
|
||||||
conf->addLib("-ltorrent");
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
71
qcm/libzzip.qcm
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
-----BEGIN QCMOD-----
|
||||||
|
name: libzzip
|
||||||
|
arg: with-libzzip-inc=[path], Path to libzzip++ include files
|
||||||
|
arg: with-libzzip-lib=[path], Path to libzzip++ library files
|
||||||
|
-----END QCMOD-----
|
||||||
|
*/
|
||||||
|
#include <QProcess>
|
||||||
|
class qc_libzzip : public ConfObj
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
qc_libzzip(Conf *c) : ConfObj(c) {}
|
||||||
|
QString name() const { return "Zzip library (libzzip)"; }
|
||||||
|
QString shortname() const { return "libzzip"; }
|
||||||
|
QString checkString() const {
|
||||||
|
if(!conf->getenv("QC_DISABLE_LIBZZIP").isEmpty())
|
||||||
|
return "";
|
||||||
|
return ConfObj::checkString();
|
||||||
|
}
|
||||||
|
bool exec(){
|
||||||
|
if(!conf->getenv("QC_DISABLE_LIBZZIP").isEmpty())
|
||||||
|
return false;
|
||||||
|
QString s;
|
||||||
|
s = conf->getenv("QC_WITH_LIBZZIP_INC");
|
||||||
|
if(!s.isEmpty()) {
|
||||||
|
if(!conf->checkHeader(s, "zzip/zzip.h")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
QStringList sl;
|
||||||
|
sl << "/usr/include";
|
||||||
|
sl << "/usr/local/include";
|
||||||
|
bool found = false;
|
||||||
|
foreach(s, sl){
|
||||||
|
if(conf->checkHeader(s, "zzip/zzip.h")){
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!found)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
conf->addIncludePath(s);
|
||||||
|
|
||||||
|
s = conf->getenv("QC_WITH_LIBZZIP_LIB");
|
||||||
|
if(!s.isEmpty()) {
|
||||||
|
if(!QFile::exists(s+QString("/libzzip.so"))){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
QStringList sl;
|
||||||
|
sl << "/usr/lib/";
|
||||||
|
sl << "/usr/lib64/";
|
||||||
|
sl << "/usr/local/lib/";
|
||||||
|
sl << "/usr/local/lib64/";
|
||||||
|
bool found = false;
|
||||||
|
foreach(s, sl){
|
||||||
|
if(QFile::exists(s+QString("libzzip.so"))){
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!found)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
conf->addLib(QString("-L") + s);
|
||||||
|
conf->addLib("-lzzip");
|
||||||
|
conf->addDefine("HAVE_ZZIP");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
/*
|
|
||||||
-----BEGIN QCMOD-----
|
|
||||||
name: python
|
|
||||||
-----END QCMOD-----
|
|
||||||
*/
|
|
||||||
class qc_python : public ConfObj
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
qc_python(Conf *c) : ConfObj(c) {}
|
|
||||||
QString name() const { return "python >= 2.3"; }
|
|
||||||
QString shortname() const { return "python"; }
|
|
||||||
bool exec(){
|
|
||||||
int r = conf->doCommand("python testpython.py");
|
|
||||||
if(r == 0)
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
20
qcm/qt4.qcm
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
-----BEGIN QCMOD-----
|
||||||
|
name: Qt >= 4.3
|
||||||
|
-----END QCMOD-----
|
||||||
|
*/
|
||||||
|
class qc_qt4 : public ConfObj
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
qc_qt4(Conf *c) : ConfObj(c) {}
|
||||||
|
QString name() const { return "Qt >= 4.3"; }
|
||||||
|
QString shortname() const { return "Qt 4.3"; }
|
||||||
|
bool exec()
|
||||||
|
{
|
||||||
|
if(QT_VERSION >= 0x040400) {
|
||||||
|
conf->addDefine("QT_4_4");
|
||||||
|
}
|
||||||
|
return(QT_VERSION >= 0x040300);
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
16
qcm/qt42.qcm
@@ -1,16 +0,0 @@
|
|||||||
/*
|
|
||||||
-----BEGIN QCMOD-----
|
|
||||||
name: Qt >= 4.2
|
|
||||||
-----END QCMOD-----
|
|
||||||
*/
|
|
||||||
class qc_qt42 : public ConfObj
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
qc_qt42(Conf *c) : ConfObj(c) {}
|
|
||||||
QString name() const { return "Qt >= 4.2"; }
|
|
||||||
QString shortname() const { return "qt42"; }
|
|
||||||
bool exec()
|
|
||||||
{
|
|
||||||
return(QT_VERSION >= 0x040200);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -16,16 +16,26 @@
|
|||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
*
|
*
|
||||||
|
* In addition, as a special exception, the copyright holders give permission to
|
||||||
|
* link this program with the OpenSSL project's "OpenSSL" library (or with
|
||||||
|
* modified versions of it that use the same license as the "OpenSSL" library),
|
||||||
|
* and distribute the linked executables. You must obey the GNU General Public
|
||||||
|
* License in all respects for all of the code used other than "OpenSSL". If you
|
||||||
|
* modify file(s), you may extend this exception to your version of the file(s),
|
||||||
|
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||||
|
* exception statement from your version.
|
||||||
|
*
|
||||||
* Contact : chris@qbittorrent.org
|
* Contact : chris@qbittorrent.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef DLLISTDELEGATE_H
|
#ifndef DLLISTDELEGATE_H
|
||||||
#define DLLISTDELEGATE_H
|
#define DLLISTDELEGATE_H
|
||||||
|
|
||||||
#include <QAbstractItemDelegate>
|
#include <QItemDelegate>
|
||||||
#include <QModelIndex>
|
#include <QModelIndex>
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
#include <QStyleOptionProgressBarV2>
|
#include <QStyleOptionProgressBarV2>
|
||||||
|
#include <QStyleOptionViewItemV2>
|
||||||
#include <QProgressBar>
|
#include <QProgressBar>
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
@@ -37,128 +47,70 @@
|
|||||||
#define DLSPEED 3
|
#define DLSPEED 3
|
||||||
#define UPSPEED 4
|
#define UPSPEED 4
|
||||||
#define SEEDSLEECH 5
|
#define SEEDSLEECH 5
|
||||||
#define STATUS 6
|
#define RATIO 6
|
||||||
#define ETA 7
|
#define ETA 7
|
||||||
#define HASH 8
|
#define PRIORITY 8
|
||||||
|
#define HASH 9
|
||||||
|
|
||||||
class DLListDelegate: public QAbstractItemDelegate {
|
class DLListDelegate: public QItemDelegate {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
DLListDelegate(QObject *parent=0) : QAbstractItemDelegate(parent){}
|
DLListDelegate(QObject *parent) : QItemDelegate(parent){}
|
||||||
|
|
||||||
~DLListDelegate(){}
|
~DLListDelegate(){}
|
||||||
|
|
||||||
void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const{
|
void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const{
|
||||||
QStyleOptionViewItem opt = option;
|
QStyleOptionViewItemV2 opt = QItemDelegate::setOptions(index, option);
|
||||||
char tmp[MAX_CHAR_TMP];
|
|
||||||
// set text color
|
|
||||||
QVariant value = index.data(Qt::TextColorRole);
|
|
||||||
if (value.isValid() && qvariant_cast<QColor>(value).isValid()){
|
|
||||||
opt.palette.setColor(QPalette::Text, qvariant_cast<QColor>(value));
|
|
||||||
}
|
|
||||||
QPalette::ColorGroup cg = option.state & QStyle::State_Enabled
|
|
||||||
? QPalette::Normal : QPalette::Disabled;
|
|
||||||
if (option.state & QStyle::State_Selected){
|
|
||||||
painter->setPen(opt.palette.color(cg, QPalette::HighlightedText));
|
|
||||||
}else{
|
|
||||||
painter->setPen(opt.palette.color(cg, QPalette::Text));
|
|
||||||
}
|
|
||||||
// draw the background color
|
|
||||||
if(index.column() != PROGRESS){
|
|
||||||
if (option.showDecorationSelected && (option.state & QStyle::State_Selected)){
|
|
||||||
if (cg == QPalette::Normal && !(option.state & QStyle::State_Active)){
|
|
||||||
cg = QPalette::Inactive;
|
|
||||||
}
|
|
||||||
painter->fillRect(option.rect, option.palette.brush(cg, QPalette::Highlight));
|
|
||||||
}else{
|
|
||||||
value = index.data(Qt::BackgroundColorRole);
|
|
||||||
if (value.isValid() && qvariant_cast<QColor>(value).isValid()){
|
|
||||||
painter->fillRect(option.rect, qvariant_cast<QColor>(value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
switch(index.column()){
|
switch(index.column()){
|
||||||
case SIZE:
|
case SIZE:
|
||||||
painter->drawText(option.rect, Qt::AlignCenter, misc::friendlyUnit(index.data().toLongLong()));
|
QItemDelegate::drawBackground(painter, opt, index);
|
||||||
|
QItemDelegate::drawDisplay(painter, opt, option.rect, misc::friendlyUnit(index.data().toLongLong()));
|
||||||
break;
|
break;
|
||||||
case ETA:
|
case ETA:
|
||||||
painter->drawText(option.rect, Qt::AlignCenter, misc::userFriendlyDuration(index.data().toLongLong()));
|
QItemDelegate::drawBackground(painter, opt, index);
|
||||||
|
QItemDelegate::drawDisplay(painter, opt, option.rect, misc::userFriendlyDuration(index.data().toLongLong()));
|
||||||
break;
|
break;
|
||||||
case UPSPEED:
|
case UPSPEED:
|
||||||
case DLSPEED:{
|
case DLSPEED:{
|
||||||
float speed = index.data().toDouble();
|
QItemDelegate::drawBackground(painter, opt, index);
|
||||||
snprintf(tmp, MAX_CHAR_TMP, "%.1f", speed/1024.);
|
double speed = index.data().toDouble();
|
||||||
painter->drawText(option.rect, Qt::AlignCenter, QString(tmp)+" "+tr("KiB/s"));
|
QItemDelegate::drawDisplay(painter, opt, opt.rect, QString(QByteArray::number(speed/1024., 'f', 1))+QString::fromUtf8(" ")+tr("KiB/s"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case RATIO:{
|
||||||
|
QItemDelegate::drawBackground(painter, opt, index);
|
||||||
|
double ratio = index.data().toDouble();
|
||||||
|
if(ratio > 100.)
|
||||||
|
QItemDelegate::drawDisplay(painter, opt, opt.rect, QString::fromUtf8("∞"));
|
||||||
|
else
|
||||||
|
QItemDelegate::drawDisplay(painter, opt, opt.rect, QString(QByteArray::number(ratio, 'f', 1)));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PROGRESS:{
|
case PROGRESS:{
|
||||||
QStyleOptionProgressBarV2 newopt;
|
QStyleOptionProgressBarV2 newopt;
|
||||||
float progress;
|
double progress = index.data().toDouble()*100.;
|
||||||
progress = index.data().toDouble()*100.;
|
|
||||||
snprintf(tmp, MAX_CHAR_TMP, "%.1f", progress);
|
|
||||||
newopt.rect = opt.rect;
|
newopt.rect = opt.rect;
|
||||||
newopt.text = QString(tmp)+"%";
|
newopt.text = QString(QByteArray::number(progress, 'f', 1))+QString::fromUtf8("%");
|
||||||
newopt.progress = (int)progress;
|
newopt.progress = (int)progress;
|
||||||
newopt.maximum = 100;
|
newopt.maximum = 100;
|
||||||
newopt.minimum = 0;
|
newopt.minimum = 0;
|
||||||
newopt.state |= QStyle::State_Enabled;
|
newopt.state |= QStyle::State_Enabled;
|
||||||
newopt.textVisible = false;
|
newopt.textVisible = true;
|
||||||
QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt,
|
QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt,
|
||||||
painter);
|
painter);
|
||||||
//We prefer to display text manually to control color/font/boldness
|
|
||||||
if (option.state & QStyle::State_Selected){
|
|
||||||
opt.palette.setColor(QPalette::Text, QColor("grey"));
|
|
||||||
painter->setPen(opt.palette.color(cg, QPalette::Text));
|
|
||||||
}
|
|
||||||
painter->drawText(option.rect, Qt::AlignCenter, newopt.text);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case NAME:{
|
|
||||||
// decoration
|
|
||||||
value = index.data(Qt::DecorationRole);
|
|
||||||
QPixmap pixmap = qvariant_cast<QIcon>(value).pixmap(option.decorationSize, option.state & QStyle::State_Enabled ? QIcon::Normal : QIcon::Disabled, option.state & QStyle::State_Open ? QIcon::On : QIcon::Off);
|
|
||||||
QRect pixmapRect = (pixmap.isNull() ? QRect(0, 0, 0, 0): QRect(QPoint(0, 0), option.decorationSize));
|
|
||||||
if (pixmapRect.isValid()){
|
|
||||||
QPoint p = QStyle::alignedRect(option.direction, Qt::AlignLeft, pixmap.size(), option.rect).topLeft();
|
|
||||||
painter->drawPixmap(p, pixmap);
|
|
||||||
}
|
|
||||||
painter->drawText(option.rect.translated(pixmap.size().width(), 0), Qt::AlignLeft, index.data().toString());
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
painter->drawText(option.rect, Qt::AlignCenter, index.data().toString());
|
QItemDelegate::paint(painter, option, index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const{
|
QWidget* createEditor(QWidget*, const QStyleOptionViewItem &, const QModelIndex &) const {
|
||||||
QVariant value = index.data(Qt::FontRole);
|
// No editor here
|
||||||
QFont fnt = value.isValid() ? qvariant_cast<QFont>(value) : option.font;
|
return 0;
|
||||||
QFontMetrics fontMetrics(fnt);
|
|
||||||
const QString text = index.data(Qt::DisplayRole).toString();
|
|
||||||
QRect textRect = QRect(0, 0, 0, fontMetrics.lineSpacing() * (text.count(QLatin1Char('\n')) + 1));
|
|
||||||
return textRect.size();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// QWidget* createEditor(QWidget * parent, const QStyleOptionViewItem& /*option*/, const QModelIndex & index) const{
|
|
||||||
// if(index.column() == PROGRESS){
|
|
||||||
// QProgressBar *progressBar = new QProgressBar(parent);
|
|
||||||
// progressBar->setRange(0,100);
|
|
||||||
// progressBar->installEventFilter(const_cast<DLListDelegate*>(this));
|
|
||||||
// return progressBar;
|
|
||||||
// }
|
|
||||||
// return 0;
|
|
||||||
// }
|
|
||||||
// void setEditorData(QWidget *editor, const QModelIndex &index) const{
|
|
||||||
// QProgressBar *progressBar = static_cast<QProgressBar*>(editor);
|
|
||||||
// float progress = index.data().toDouble();
|
|
||||||
// progressBar->setValue((int)(progress*100.));
|
|
||||||
// }
|
|
||||||
// void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex & index) const{
|
|
||||||
// if(index.column() == PROGRESS){
|
|
||||||
// editor->setGeometry(option.rect);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
480
src/FeedDownloader.h
Normal file
@@ -0,0 +1,480 @@
|
|||||||
|
/*
|
||||||
|
* Bittorrent Client using Qt4 and libtorrent.
|
||||||
|
* Copyright (C) 2006 Christophe Dumez
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* In addition, as a special exception, the copyright holders give permission to
|
||||||
|
* link this program with the OpenSSL project's "OpenSSL" library (or with
|
||||||
|
* modified versions of it that use the same license as the "OpenSSL" library),
|
||||||
|
* and distribute the linked executables. You must obey the GNU General Public
|
||||||
|
* License in all respects for all of the code used other than "OpenSSL". If you
|
||||||
|
* modify file(s), you may extend this exception to your version of the file(s),
|
||||||
|
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||||
|
* exception statement from your version.
|
||||||
|
*
|
||||||
|
* Contact : chris@qbittorrent.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FEEDDOWNLOADER_H
|
||||||
|
#define FEEDDOWNLOADER_H
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
#include <QHash>
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QListWidget>
|
||||||
|
#include <QListWidgetItem>
|
||||||
|
#include <QInputDialog>
|
||||||
|
#include <QMessageBox>
|
||||||
|
#include <QRegExp>
|
||||||
|
#include <QMenu>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QDataStream>
|
||||||
|
#include <QFileDialog>
|
||||||
|
|
||||||
|
#include "bittorrent.h"
|
||||||
|
#include "ui_FeedDownloader.h"
|
||||||
|
|
||||||
|
class FeedFilter: public QHash<QString, QVariant> {
|
||||||
|
private:
|
||||||
|
bool valid;
|
||||||
|
public:
|
||||||
|
FeedFilter():valid(true) {}
|
||||||
|
FeedFilter(bool valid): valid(valid) {}
|
||||||
|
FeedFilter(QHash<QString, QVariant> filter): QHash<QString, QVariant>(filter), valid(true) {}
|
||||||
|
|
||||||
|
bool matches(QString s) {
|
||||||
|
QStringList match_tokens = getMatchingTokens();
|
||||||
|
foreach(const QString& token, match_tokens) {
|
||||||
|
if(token.isEmpty() || token == "")
|
||||||
|
continue;
|
||||||
|
QRegExp reg(token, Qt::CaseInsensitive);
|
||||||
|
if(reg.indexIn(s) < 0) return false;
|
||||||
|
}
|
||||||
|
// Checking not matching
|
||||||
|
QStringList notmatch_tokens = getNotMatchingTokens();
|
||||||
|
foreach(const QString& token, notmatch_tokens) {
|
||||||
|
if(token.isEmpty()) continue;
|
||||||
|
QRegExp reg(token, Qt::CaseInsensitive);
|
||||||
|
if(reg.indexIn(s) > -1) return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isValid() const {
|
||||||
|
return valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList getMatchingTokens() const {
|
||||||
|
QString matches = this->value("matches", "").toString();
|
||||||
|
return matches.split(" ");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString getMatchingTokens_str() const {
|
||||||
|
return this->value("matches", "").toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
void setMatchingTokens(QString tokens) {
|
||||||
|
tokens = tokens.trimmed();
|
||||||
|
if(tokens.isEmpty())
|
||||||
|
(*this)["matches"] = "";
|
||||||
|
else
|
||||||
|
(*this)["matches"] = tokens;
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList getNotMatchingTokens() const {
|
||||||
|
QString notmatching = this->value("not", "").toString();
|
||||||
|
return notmatching.split(" ");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString getNotMatchingTokens_str() const {
|
||||||
|
return this->value("not", "").toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
void setNotMatchingTokens(QString tokens) {
|
||||||
|
(*this)["not"] = tokens.trimmed();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString getSavePath() const {
|
||||||
|
return this->value("save_path", "").toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
void setSavePath(QString save_path) {
|
||||||
|
(*this)["save_path"] = save_path;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class FeedFilters : public QHash<QString, QVariant> {
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString feed_url;
|
||||||
|
|
||||||
|
public:
|
||||||
|
FeedFilters() {}
|
||||||
|
FeedFilters(QString feed_url, QHash<QString, QVariant> filters): QHash<QString, QVariant>(filters), feed_url(feed_url) {}
|
||||||
|
|
||||||
|
bool hasFilter(QString name) const {
|
||||||
|
return this->contains(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
FeedFilter* matches(QString s) {
|
||||||
|
if(!isDownloadingEnabled()) return 0;
|
||||||
|
if(this->size() == 0) return new FeedFilter(false);
|
||||||
|
foreach(QVariant var_hash_filter, this->values()) {
|
||||||
|
QHash<QString, QVariant> hash_filter = var_hash_filter.toHash();
|
||||||
|
FeedFilter *filter = new FeedFilter(hash_filter);
|
||||||
|
if(filter->matches(s))
|
||||||
|
return filter;
|
||||||
|
else
|
||||||
|
delete filter;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList names() const {
|
||||||
|
return this->keys();
|
||||||
|
}
|
||||||
|
|
||||||
|
FeedFilter getFilter(QString name) const {
|
||||||
|
if(this->contains(name))
|
||||||
|
return FeedFilter(this->value(name).toHash());
|
||||||
|
return FeedFilter();
|
||||||
|
}
|
||||||
|
|
||||||
|
void setFilter(QString name, FeedFilter f) {
|
||||||
|
(*this)[name] = f;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isDownloadingEnabled() const {
|
||||||
|
QSettings qBTRSS("qBittorrent", "qBittorrent-rss");
|
||||||
|
QHash<QString, QVariant> feeds_w_downloader = qBTRSS.value("downloader_on", QHash<QString, QVariant>()).toHash();
|
||||||
|
return feeds_w_downloader.value(feed_url, false).toBool();
|
||||||
|
}
|
||||||
|
|
||||||
|
void setDownloadingEnabled(bool enabled) {
|
||||||
|
QSettings qBTRSS("qBittorrent", "qBittorrent-rss");
|
||||||
|
QHash<QString, QVariant> feeds_w_downloader = qBTRSS.value("downloader_on", QHash<QString, QVariant>()).toHash();
|
||||||
|
feeds_w_downloader[feed_url] = enabled;
|
||||||
|
qBTRSS.setValue("downloader_on", feeds_w_downloader);
|
||||||
|
}
|
||||||
|
|
||||||
|
static FeedFilters getFeedFilters(QString url) {
|
||||||
|
QSettings qBTRSS("qBittorrent", "qBittorrent-rss");
|
||||||
|
QHash<QString, QVariant> all_feeds_filters = qBTRSS.value("feed_filters", QHash<QString, QVariant>()).toHash();
|
||||||
|
return FeedFilters(url, all_feeds_filters.value(url, QHash<QString, QVariant>()).toHash());
|
||||||
|
}
|
||||||
|
|
||||||
|
void rename(QString old_name, QString new_name) {
|
||||||
|
Q_ASSERT(this->contains(old_name));
|
||||||
|
(*this)[new_name] = this->take(old_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool serialize(QString path) {
|
||||||
|
QFile f(path);
|
||||||
|
if(f.open(QIODevice::WriteOnly)) {
|
||||||
|
QDataStream out(&f);
|
||||||
|
out.setVersion(QDataStream::Qt_4_3);
|
||||||
|
out << (QHash<QString, QVariant>)(*this);
|
||||||
|
f.close();
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool unserialize(QString path) {
|
||||||
|
QFile f(path);
|
||||||
|
if(f.open(QIODevice::ReadOnly)) {
|
||||||
|
QDataStream in(&f);
|
||||||
|
in.setVersion(QDataStream::Qt_4_3);
|
||||||
|
QHash<QString, QVariant> tmp;
|
||||||
|
in >> tmp;
|
||||||
|
qDebug("Unserialized %d filters", tmp.size());
|
||||||
|
foreach(const QString& key, tmp.keys()) {
|
||||||
|
(*this)[key] = tmp[key];
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void save() {
|
||||||
|
QSettings qBTRSS("qBittorrent", "qBittorrent-rss");
|
||||||
|
QHash<QString, QVariant> all_feeds_filters = qBTRSS.value("feed_filters", QHash<QString, QVariant>()).toHash();
|
||||||
|
qDebug("Saving filters for feed: %s (%d filters)", feed_url.toLocal8Bit().data(), (*this).size());
|
||||||
|
all_feeds_filters[feed_url] = *this;
|
||||||
|
qBTRSS.setValue("feed_filters", all_feeds_filters);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class FeedDownloaderDlg : public QDialog, private Ui_FeedDownloader{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString feed_url;
|
||||||
|
QString feed_name;
|
||||||
|
FeedFilters filters;
|
||||||
|
bittorrent *BTSession;
|
||||||
|
QString selected_filter; // name
|
||||||
|
|
||||||
|
public:
|
||||||
|
FeedDownloaderDlg(QWidget *parent, QString feed_url, QString feed_name, bittorrent* BTSession): QDialog(parent), feed_url(feed_url), feed_name(feed_name), BTSession(BTSession), selected_filter(QString::null){
|
||||||
|
setupUi(this);
|
||||||
|
setAttribute(Qt::WA_DeleteOnClose);
|
||||||
|
Q_ASSERT(!feed_name.isEmpty());
|
||||||
|
rssfeed_lbl->setText(feed_name);
|
||||||
|
filters = FeedFilters::getFeedFilters(feed_url);
|
||||||
|
// Connect Signals/Slots
|
||||||
|
connect(filtersList, SIGNAL(currentItemChanged(QListWidgetItem* , QListWidgetItem *)), this, SLOT(showFilterSettings(QListWidgetItem *)));
|
||||||
|
connect(filtersList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFiltersListMenu(const QPoint&)));
|
||||||
|
connect(actionAdd_filter, SIGNAL(triggered()), this, SLOT(addFilter()));
|
||||||
|
connect(actionRemove_filter, SIGNAL(triggered()), this, SLOT(deleteFilter()));
|
||||||
|
connect(actionRename_filter, SIGNAL(triggered()), this, SLOT(renameFilter()));
|
||||||
|
connect(del_button, SIGNAL(clicked(bool)), this, SLOT(deleteFilter()));
|
||||||
|
connect(add_button, SIGNAL(clicked(bool)), this, SLOT(addFilter()));
|
||||||
|
connect(enableDl_cb, SIGNAL(stateChanged(int)), this, SLOT(enableFilterBox(int)));
|
||||||
|
// Restore saved info
|
||||||
|
enableDl_cb->setChecked(filters.isDownloadingEnabled());
|
||||||
|
fillFiltersList();
|
||||||
|
if(filters.size() > 0) {
|
||||||
|
// Select first filter
|
||||||
|
filtersList->setCurrentItem(filtersList->item(0));
|
||||||
|
//showFilterSettings(filtersList->item(0));
|
||||||
|
}
|
||||||
|
// Show
|
||||||
|
show();
|
||||||
|
}
|
||||||
|
|
||||||
|
~FeedDownloaderDlg() {
|
||||||
|
// Make sure we save everything
|
||||||
|
saveCurrentFilterSettings();
|
||||||
|
filters.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected slots:
|
||||||
|
void saveCurrentFilterSettings() {
|
||||||
|
if(!selected_filter.isEmpty()) {
|
||||||
|
FeedFilter filter = filters.getFilter(selected_filter);
|
||||||
|
filter.setMatchingTokens(match_line->text());
|
||||||
|
filter.setNotMatchingTokens(notmatch_line->text());
|
||||||
|
QString save_path = savepath_line->text().trimmed();
|
||||||
|
if(save_path.isEmpty())
|
||||||
|
save_path = BTSession->getDefaultSavePath();
|
||||||
|
filter.setSavePath(save_path);
|
||||||
|
// Save updated filter
|
||||||
|
filters.setFilter(selected_filter, filter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void fillFiltersList() {
|
||||||
|
// Fill filter list
|
||||||
|
foreach(QString filter_name, filters.names()) {
|
||||||
|
new QListWidgetItem(filter_name, filtersList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayFiltersListMenu(const QPoint&) {
|
||||||
|
QMenu myFiltersListMenu(this);
|
||||||
|
if(filtersList->selectedItems().size() > 0) {
|
||||||
|
myFiltersListMenu.addAction(actionRename_filter);
|
||||||
|
myFiltersListMenu.addAction(actionRemove_filter);
|
||||||
|
} else {
|
||||||
|
myFiltersListMenu.addAction(actionAdd_filter);
|
||||||
|
}
|
||||||
|
// Call menu
|
||||||
|
myFiltersListMenu.exec(QCursor::pos());
|
||||||
|
}
|
||||||
|
|
||||||
|
void showFilterSettings(QListWidgetItem *item) {
|
||||||
|
// First, save current filter settings
|
||||||
|
saveCurrentFilterSettings();
|
||||||
|
// Clear all fields
|
||||||
|
clearFields();
|
||||||
|
if(!item) {
|
||||||
|
qDebug("No new selected item");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Actually show filter settings
|
||||||
|
QString filter_name = item->text();
|
||||||
|
FeedFilter filter = filters.getFilter(filter_name);
|
||||||
|
filterSettingsBox->setEnabled(true);
|
||||||
|
match_line->setText(filter.getMatchingTokens_str());
|
||||||
|
if(match_line->text().trimmed().isEmpty()) {
|
||||||
|
match_line->setText(filter_name);
|
||||||
|
}
|
||||||
|
notmatch_line->setText(filter.getNotMatchingTokens_str());
|
||||||
|
QString save_path = filter.getSavePath();
|
||||||
|
if(save_path.isEmpty())
|
||||||
|
save_path = BTSession->getDefaultSavePath();
|
||||||
|
savepath_line->setText(save_path);
|
||||||
|
// Update selected filter
|
||||||
|
selected_filter = filter_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
void deleteFilter() {
|
||||||
|
QList<QListWidgetItem *> items = filtersList->selectedItems();
|
||||||
|
if(items.size() == 1) {
|
||||||
|
QListWidgetItem * item = items.first();
|
||||||
|
filters.remove(item->text());
|
||||||
|
selected_filter = QString::null;
|
||||||
|
delete item;
|
||||||
|
// Reset Filter settings view
|
||||||
|
if(filters.size() == 0) {
|
||||||
|
clearFields();
|
||||||
|
filterSettingsBox->setEnabled(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void renameFilter() {
|
||||||
|
QList<QListWidgetItem *> items = filtersList->selectedItems();
|
||||||
|
if(items.size() == 1) {
|
||||||
|
QListWidgetItem *item = items.first();
|
||||||
|
QString current_name = item->text();
|
||||||
|
QString new_name;
|
||||||
|
bool validated = false;
|
||||||
|
do {
|
||||||
|
new_name = askFilterName(current_name);
|
||||||
|
if(new_name.isNull() || new_name == current_name) return;
|
||||||
|
if(!filters.hasFilter(new_name)) {
|
||||||
|
validated = true;
|
||||||
|
} else {
|
||||||
|
QMessageBox::warning(0, tr("Invalid filter name"), tr("This filter name is already in use."));
|
||||||
|
}
|
||||||
|
}while(!validated);
|
||||||
|
// Rename the filter
|
||||||
|
filters.rename(current_name, new_name);
|
||||||
|
if(selected_filter == current_name)
|
||||||
|
selected_filter = new_name;
|
||||||
|
item->setText(new_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void enableFilterBox(int state) {
|
||||||
|
if(state == Qt::Checked) {
|
||||||
|
filtersBox->setEnabled(true);
|
||||||
|
filters.setDownloadingEnabled(true);
|
||||||
|
} else {
|
||||||
|
filtersBox->setEnabled(false);
|
||||||
|
filters.setDownloadingEnabled(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QString askFilterName(QString name=QString::null) {
|
||||||
|
QString name_prop;
|
||||||
|
if(name.isEmpty())
|
||||||
|
name_prop = tr("New filter");
|
||||||
|
else
|
||||||
|
name_prop = name;
|
||||||
|
QString new_name;
|
||||||
|
bool validated = false;
|
||||||
|
do {
|
||||||
|
bool ok;
|
||||||
|
new_name = QInputDialog::getText(this, tr("Please choose a name for this filter"), tr("Filter name:"), QLineEdit::Normal, name_prop, &ok);
|
||||||
|
if(!ok) {
|
||||||
|
return QString::null;
|
||||||
|
}
|
||||||
|
// Validate filter name
|
||||||
|
new_name = new_name.trimmed();
|
||||||
|
if(new_name.isEmpty()) {
|
||||||
|
// Cannot be left empty
|
||||||
|
QMessageBox::warning(0, tr("Invalid filter name"), tr("The filter name cannot be left empty."));
|
||||||
|
} else {
|
||||||
|
validated = true;
|
||||||
|
}
|
||||||
|
} while(!validated);
|
||||||
|
return new_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
void addFilter() {
|
||||||
|
QString filter_name = QString::null;
|
||||||
|
bool validated = false;
|
||||||
|
do {
|
||||||
|
filter_name = askFilterName();
|
||||||
|
if(filter_name.isNull()) return;
|
||||||
|
if(filters.hasFilter(filter_name)) {
|
||||||
|
// Filter alread exists
|
||||||
|
QMessageBox::warning(0, tr("Invalid filter name"), tr("This filter name is already in use."));
|
||||||
|
} else {
|
||||||
|
validated = true;
|
||||||
|
}
|
||||||
|
}while(!validated);
|
||||||
|
QListWidgetItem *it = new QListWidgetItem(filter_name, filtersList);
|
||||||
|
filtersList->setCurrentItem(it);
|
||||||
|
//showFilterSettings(it);
|
||||||
|
}
|
||||||
|
|
||||||
|
void clearFields() {
|
||||||
|
match_line->clear();
|
||||||
|
notmatch_line->clear();
|
||||||
|
savepath_line->clear();
|
||||||
|
test_res_lbl->setText("");
|
||||||
|
test_line->clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void on_testButton_clicked(bool) {
|
||||||
|
if(selected_filter.isEmpty()) return;
|
||||||
|
QString s = test_line->text().trimmed();
|
||||||
|
if(s.isEmpty()) {
|
||||||
|
QMessageBox::warning(0, tr("Filter testing error"), tr("Please specify a test torrent name."));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Get current filter
|
||||||
|
saveCurrentFilterSettings();
|
||||||
|
FeedFilter f = filters.getFilter(selected_filter);
|
||||||
|
if(f.matches(s))
|
||||||
|
test_res_lbl->setText("<b><font color=\"green\">"+tr("matches")+"</font></b>");
|
||||||
|
else
|
||||||
|
test_res_lbl->setText("<b><font color=\"red\">"+tr("does not match")+"</font></b>");
|
||||||
|
}
|
||||||
|
|
||||||
|
void on_importButton_clicked(bool) {
|
||||||
|
QString source = QFileDialog::getOpenFileName(0, tr("Select file to import"), QDir::homePath(), tr("Filters Files")+QString::fromUtf8(" (*.filters)"));
|
||||||
|
if(source.isEmpty()) return;
|
||||||
|
if(filters.unserialize(source)) {
|
||||||
|
// Clean up first
|
||||||
|
clearFields();
|
||||||
|
filtersList->clear();
|
||||||
|
selected_filter = QString::null;
|
||||||
|
fillFiltersList();
|
||||||
|
if(filters.size() > 0)
|
||||||
|
filtersList->setCurrentItem(filtersList->item(0));
|
||||||
|
QMessageBox::information(0, tr("Import successful"), tr("Filters import was successful."));
|
||||||
|
} else {
|
||||||
|
QMessageBox::warning(0, tr("Import failure"), tr("Filters could not be imported due to an I/O error."));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void on_exportButton_clicked(bool) {
|
||||||
|
QString destination = QFileDialog::getSaveFileName(this, tr("Select destination file"), QDir::homePath(), tr("Filters Files")+QString::fromUtf8(" (*.filters)"));
|
||||||
|
if(destination.isEmpty()) return;
|
||||||
|
// Append file extension
|
||||||
|
if(!destination.endsWith(".filters"))
|
||||||
|
destination += ".filters";
|
||||||
|
if(QFile::exists(destination)) {
|
||||||
|
int ret = QMessageBox::question(0, tr("Overwriting confirmation"), tr("Are you sure you want to overwrite existing file?"), QMessageBox::Yes|QMessageBox::No);
|
||||||
|
if(ret != QMessageBox::Yes) return;
|
||||||
|
}
|
||||||
|
if(filters.serialize(destination))
|
||||||
|
QMessageBox::information(0, tr("Export successful"), tr("Filters export was successful."));
|
||||||
|
else
|
||||||
|
QMessageBox::warning(0, tr("Export failure"), tr("Filters could not be exported due to an I/O error."));
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // FEEDDOWNLOADER_H
|
||||||
546
src/FeedDownloader.ui
Normal file
@@ -0,0 +1,546 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>FeedDownloader</class>
|
||||||
|
<widget class="QDialog" name="FeedDownloader">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>737</width>
|
||||||
|
<height>415</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>RSS Feed downloader</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_7">
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_2">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>16</pointsize>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>RSS feed:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="rssfeed_lbl">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>16</pointsize>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Feed name</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_5">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="enableDl_cb">
|
||||||
|
<property name="text">
|
||||||
|
<string>Automatically download torrents from this feed</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="filtersBox">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="title">
|
||||||
|
<string>Download filters</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_6">
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Filters:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QListWidget" name="filtersList">
|
||||||
|
<property name="contextMenuPolicy">
|
||||||
|
<enum>Qt::CustomContextMenu</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_5">
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_2">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="del_button">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="icons.qrc">
|
||||||
|
<normaloff>:/Icons/oxygen/list-remove.png</normaloff>:/Icons/oxygen/list-remove.png</iconset>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_4">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeType">
|
||||||
|
<enum>QSizePolicy::Fixed</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>10</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="add_button">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="icons.qrc">
|
||||||
|
<normaloff>:/Icons/oxygen/list-add.png</normaloff>:/Icons/oxygen/list-add.png</iconset>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_3">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="filterSettingsBox">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="autoFillBackground">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="title">
|
||||||
|
<string>Filter settings</string>
|
||||||
|
</property>
|
||||||
|
<property name="flat">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_9">
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_3">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>50</weight>
|
||||||
|
<bold>false</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Matches:</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_4">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>50</weight>
|
||||||
|
<bold>false</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Does not match:</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_5">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>50</weight>
|
||||||
|
<bold>false</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Destination folder:</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="match_line">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="notmatch_line"/>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="savepath_line">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>300</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QToolButton" name="browse_button">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>50</weight>
|
||||||
|
<bold>false</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>...</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="testerBox">
|
||||||
|
<property name="title">
|
||||||
|
<string>Filter testing</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_8">
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_9">
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_5">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_6">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>28</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>50</weight>
|
||||||
|
<bold>false</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Torrent title:</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_7">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>50</weight>
|
||||||
|
<bold>false</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Result:</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_6">
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_8">
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="test_line"/>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="testButton">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>50</weight>
|
||||||
|
<bold>false</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Test</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_7">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="test_res_lbl">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>50</weight>
|
||||||
|
<bold>false</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string> </string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_6">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>9</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_10">
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="importButton">
|
||||||
|
<property name="text">
|
||||||
|
<string>Import...</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="exportButton">
|
||||||
|
<property name="text">
|
||||||
|
<string>Export...</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QDialogButtonBox" name="buttonBox">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="standardButtons">
|
||||||
|
<set>QDialogButtonBox::Close</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
<action name="actionRename_filter">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="icons.qrc">
|
||||||
|
<normaloff>:/Icons/oxygen/edit_clear.png</normaloff>:/Icons/oxygen/edit_clear.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Rename filter</string>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Rename filter</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionRemove_filter">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="icons.qrc">
|
||||||
|
<normaloff>:/Icons/oxygen/list-remove.png</normaloff>:/Icons/oxygen/list-remove.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Remove filter</string>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Remove filter</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionAdd_filter">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="icons.qrc">
|
||||||
|
<normaloff>:/Icons/oxygen/list-add.png</normaloff>:/Icons/oxygen/list-add.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Add filter</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
</widget>
|
||||||
|
<resources>
|
||||||
|
<include location="icons.qrc"/>
|
||||||
|
</resources>
|
||||||
|
<connections>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonBox</sender>
|
||||||
|
<signal>accepted()</signal>
|
||||||
|
<receiver>FeedDownloader</receiver>
|
||||||
|
<slot>accept()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>248</x>
|
||||||
|
<y>254</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>157</x>
|
||||||
|
<y>274</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonBox</sender>
|
||||||
|
<signal>rejected()</signal>
|
||||||
|
<receiver>FeedDownloader</receiver>
|
||||||
|
<slot>reject()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>316</x>
|
||||||
|
<y>260</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>286</x>
|
||||||
|
<y>274</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
</connections>
|
||||||
|
</ui>
|
||||||
98
src/FinishedListDelegate.h
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
* Bittorrent Client using Qt4 and libtorrent.
|
||||||
|
* Copyright (C) 2006 Christophe Dumez
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* In addition, as a special exception, the copyright holders give permission to
|
||||||
|
* link this program with the OpenSSL project's "OpenSSL" library (or with
|
||||||
|
* modified versions of it that use the same license as the "OpenSSL" library),
|
||||||
|
* and distribute the linked executables. You must obey the GNU General Public
|
||||||
|
* License in all respects for all of the code used other than "OpenSSL". If you
|
||||||
|
* modify file(s), you may extend this exception to your version of the file(s),
|
||||||
|
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||||
|
* exception statement from your version.
|
||||||
|
*
|
||||||
|
* Contact : chris@qbittorrent.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FINISHEDLISTDELEGATE_H
|
||||||
|
#define FINISHEDLISTDELEGATE_H
|
||||||
|
|
||||||
|
#include <QItemDelegate>
|
||||||
|
#include <QModelIndex>
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QStyleOptionProgressBarV2>
|
||||||
|
#include <QStyleOptionViewItemV2>
|
||||||
|
#include <QProgressBar>
|
||||||
|
#include <QApplication>
|
||||||
|
#include "misc.h"
|
||||||
|
|
||||||
|
// Defines for download list list columns
|
||||||
|
#define F_NAME 0
|
||||||
|
#define F_SIZE 1
|
||||||
|
#define F_UPSPEED 2
|
||||||
|
#define F_SWARM 3
|
||||||
|
#define F_PEERS 4
|
||||||
|
#define F_UPLOAD 5
|
||||||
|
#define F_RATIO 6
|
||||||
|
#define F_HASH 7
|
||||||
|
|
||||||
|
#define MAX_RATIO 100.
|
||||||
|
|
||||||
|
class FinishedListDelegate: public QItemDelegate {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
FinishedListDelegate(QObject *parent) : QItemDelegate(parent){}
|
||||||
|
|
||||||
|
~FinishedListDelegate(){}
|
||||||
|
|
||||||
|
void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const{
|
||||||
|
QStyleOptionViewItemV2 opt = QItemDelegate::setOptions(index, option);
|
||||||
|
switch(index.column()){
|
||||||
|
case F_SIZE:
|
||||||
|
case F_UPLOAD:
|
||||||
|
QItemDelegate::drawBackground(painter, opt, index);
|
||||||
|
QItemDelegate::drawDisplay(painter, opt, option.rect, misc::friendlyUnit(index.data().toLongLong()));
|
||||||
|
break;
|
||||||
|
case F_UPSPEED:{
|
||||||
|
QItemDelegate::drawBackground(painter, opt, index);
|
||||||
|
double speed = index.data().toDouble();
|
||||||
|
QItemDelegate::drawDisplay(painter, opt, opt.rect, QString(QByteArray::number(speed/1024., 'f', 1))+QString::fromUtf8(" ")+tr("KiB/s"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case F_RATIO:{
|
||||||
|
QItemDelegate::drawBackground(painter, opt, index);
|
||||||
|
double ratio = index.data().toDouble();
|
||||||
|
if(ratio > MAX_RATIO)
|
||||||
|
QItemDelegate::drawDisplay(painter, opt, opt.rect, QString::fromUtf8("∞"));
|
||||||
|
else
|
||||||
|
QItemDelegate::drawDisplay(painter, opt, opt.rect, QString(QByteArray::number(ratio, 'f', 1)));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
QItemDelegate::paint(painter, option, index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QWidget* createEditor(QWidget*, const QStyleOptionViewItem &, const QModelIndex &) const {
|
||||||
|
// No editor here
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
626
src/FinishedTorrents.cpp
Normal file
@@ -0,0 +1,626 @@
|
|||||||
|
/*
|
||||||
|
* Bittorrent Client using Qt4 and libtorrent.
|
||||||
|
* Copyright (C) 2006 Christophe Dumez
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* In addition, as a special exception, the copyright holders give permission to
|
||||||
|
* link this program with the OpenSSL project's "OpenSSL" library (or with
|
||||||
|
* modified versions of it that use the same license as the "OpenSSL" library),
|
||||||
|
* and distribute the linked executables. You must obey the GNU General Public
|
||||||
|
* License in all respects for all of the code used other than "OpenSSL". If you
|
||||||
|
* modify file(s), you may extend this exception to your version of the file(s),
|
||||||
|
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||||
|
* exception statement from your version.
|
||||||
|
*
|
||||||
|
* Contact : chris@qbittorrent.org
|
||||||
|
*/
|
||||||
|
#include "FinishedTorrents.h"
|
||||||
|
#include "misc.h"
|
||||||
|
#include "properties_imp.h"
|
||||||
|
#include "bittorrent.h"
|
||||||
|
#include "allocationDlg.h"
|
||||||
|
#include "FinishedListDelegate.h"
|
||||||
|
#include "GUI.h"
|
||||||
|
|
||||||
|
#include <QFile>
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QStandardItemModel>
|
||||||
|
#include <QSortFilterProxyModel>
|
||||||
|
#include <QHeaderView>
|
||||||
|
#include <QMenu>
|
||||||
|
#include <QMessageBox>
|
||||||
|
|
||||||
|
FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : parent(parent), BTSession(BTSession), nbFinished(0){
|
||||||
|
setupUi(this);
|
||||||
|
actionStart->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/play.png")));
|
||||||
|
actionPause->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/pause.png")));
|
||||||
|
finishedListModel = new QStandardItemModel(0,8);
|
||||||
|
finishedListModel->setHeaderData(F_NAME, Qt::Horizontal, tr("Name", "i.e: file name"));
|
||||||
|
finishedListModel->setHeaderData(F_SIZE, Qt::Horizontal, tr("Size", "i.e: file size"));
|
||||||
|
finishedListModel->setHeaderData(F_UPSPEED, Qt::Horizontal, tr("UP Speed", "i.e: Upload speed"));
|
||||||
|
finishedListModel->setHeaderData(F_SWARM, Qt::Horizontal, tr("Seeds / Leechers"));
|
||||||
|
finishedListModel->setHeaderData(F_PEERS, Qt::Horizontal, tr("Connected peers"));
|
||||||
|
finishedListModel->setHeaderData(F_UPLOAD, Qt::Horizontal, tr("Total uploaded", "i.e: Total amount of uploaded data"));
|
||||||
|
finishedListModel->setHeaderData(F_RATIO, Qt::Horizontal, tr("Ratio"));
|
||||||
|
|
||||||
|
proxyModel = new QSortFilterProxyModel();
|
||||||
|
proxyModel->setDynamicSortFilter(true);
|
||||||
|
proxyModel->setSourceModel(finishedListModel);
|
||||||
|
finishedList->setModel(proxyModel);
|
||||||
|
|
||||||
|
finishedList->setRootIsDecorated(false);
|
||||||
|
finishedList->setAllColumnsShowFocus(true);
|
||||||
|
finishedList->setSortingEnabled(true);
|
||||||
|
|
||||||
|
loadHiddenColumns();
|
||||||
|
// Hide hash column
|
||||||
|
finishedList->hideColumn(F_HASH);
|
||||||
|
// Load last columns width for download list
|
||||||
|
if(!loadColWidthFinishedList()){
|
||||||
|
finishedList->header()->resizeSection(0, 200);
|
||||||
|
}
|
||||||
|
// Connect BTSession signals
|
||||||
|
connect(BTSession, SIGNAL(metadataReceived(QTorrentHandle&)), this, SLOT(updateMetadata(QTorrentHandle&)));
|
||||||
|
// Make download list header clickable for sorting
|
||||||
|
finishedList->header()->setClickable(true);
|
||||||
|
finishedList->header()->setSortIndicatorShown(true);
|
||||||
|
finishedListDelegate = new FinishedListDelegate(finishedList);
|
||||||
|
finishedList->setItemDelegate(finishedListDelegate);
|
||||||
|
connect(finishedList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFinishedListMenu(const QPoint&)));
|
||||||
|
finishedList->header()->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||||
|
connect(finishedList->header(), SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFinishedHoSMenu(const QPoint&)));
|
||||||
|
connect(finishedList, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(notifyTorrentDoubleClicked(const QModelIndex&)));
|
||||||
|
actionDelete->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete.png")));
|
||||||
|
actionPreview_file->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/preview.png")));
|
||||||
|
actionDelete_Permanently->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete_perm.png")));
|
||||||
|
actionTorrent_Properties->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/properties.png")));
|
||||||
|
actionSet_upload_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png")));
|
||||||
|
actionCopy_magnet_link->setIcon(QIcon(QString::fromUtf8(":/Icons/magnet.png")));
|
||||||
|
|
||||||
|
connect(actionPause, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionPause_triggered()));
|
||||||
|
connect(actionStart, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionStart_triggered()));
|
||||||
|
connect(actionDelete, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDelete_triggered()));
|
||||||
|
connect(actionPreview_file, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionPreview_file_triggered()));
|
||||||
|
connect(actionDelete_Permanently, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDelete_Permanently_triggered()));
|
||||||
|
connect(actionOpen_destination_folder, SIGNAL(triggered()), (GUI*)parent, SLOT(openDestinationFolder()));
|
||||||
|
connect(actionBuy_it, SIGNAL(triggered()), (GUI*)parent, SLOT(goBuyPage()));
|
||||||
|
connect(actionTorrent_Properties, SIGNAL(triggered()), this, SLOT(propertiesSelection()));
|
||||||
|
connect(actionForce_recheck, SIGNAL(triggered()), this, SLOT(forceRecheck()));
|
||||||
|
connect(actionCopy_magnet_link, SIGNAL(triggered()), (GUI*)parent, SLOT(copyMagnetURI()));
|
||||||
|
|
||||||
|
connect(actionHOSColName, SIGNAL(triggered()), this, SLOT(hideOrShowColumnName()));
|
||||||
|
connect(actionHOSColSize, SIGNAL(triggered()), this, SLOT(hideOrShowColumnSize()));
|
||||||
|
connect(actionHOSColUpSpeed, SIGNAL(triggered()), this, SLOT(hideOrShowColumnUpSpeed()));
|
||||||
|
connect(actionHOSColSwarm, SIGNAL(triggered()), this, SLOT(hideOrShowColumnSwarm()));
|
||||||
|
connect(actionHOSColPeers, SIGNAL(triggered()), this, SLOT(hideOrShowColumnPeers()));
|
||||||
|
connect(actionHOSColUpload, SIGNAL(triggered()), this, SLOT(hideOrShowColumnUpload()));
|
||||||
|
connect(actionHOSColRatio, SIGNAL(triggered()), this, SLOT(hideOrShowColumnRatio()));
|
||||||
|
}
|
||||||
|
|
||||||
|
FinishedTorrents::~FinishedTorrents(){
|
||||||
|
saveLastSortedColumn();
|
||||||
|
saveColWidthFinishedList();
|
||||||
|
saveHiddenColumns();
|
||||||
|
delete finishedListDelegate;
|
||||||
|
delete proxyModel;
|
||||||
|
delete finishedListModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FinishedTorrents::notifyTorrentDoubleClicked(const QModelIndex& index) {
|
||||||
|
unsigned int row = index.row();
|
||||||
|
QString hash = getHashFromRow(row);
|
||||||
|
emit torrentDoubleClicked(hash, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FinishedTorrents::addTorrent(QString hash){
|
||||||
|
int row = getRowFromHash(hash);
|
||||||
|
if(row != -1) return;
|
||||||
|
row = finishedListModel->rowCount();
|
||||||
|
QTorrentHandle h = BTSession->getTorrentHandle(hash);
|
||||||
|
// Adding torrent to download list
|
||||||
|
finishedListModel->insertRow(row);
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(h.name()));
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_SIZE), QVariant((qlonglong)h.actual_size()));
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), QVariant((double)0.));
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_SWARM), QVariant("-1/-1"));
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_PEERS), QVariant("0"));
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_UPLOAD), QVariant((qlonglong)h.all_time_upload()));
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_RATIO), QVariant(QString::fromUtf8(misc::toString(BTSession->getRealRatio(hash)).c_str())));
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_HASH), QVariant(hash));
|
||||||
|
if(h.is_paused()) {
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_NAME), QIcon(":/Icons/skin/paused.png"), Qt::DecorationRole);
|
||||||
|
setRowColor(row, "red");
|
||||||
|
}else{
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(":/Icons/skin/seeding.png")), Qt::DecorationRole);
|
||||||
|
setRowColor(row, "orange");
|
||||||
|
}
|
||||||
|
// Update the number of finished torrents
|
||||||
|
++nbFinished;
|
||||||
|
emit finishedTorrentsNumberChanged(nbFinished);
|
||||||
|
|
||||||
|
loadLastSortedColumn();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the color of a row in data model
|
||||||
|
void FinishedTorrents::setRowColor(int row, QString color){
|
||||||
|
unsigned int nbColumns = finishedListModel->columnCount()-1;
|
||||||
|
for(unsigned int i=0; i<nbColumns; ++i){
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, i), QVariant(QColor(color)), Qt::ForegroundRole);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList FinishedTorrents::getSelectedTorrents(bool only_one) const{
|
||||||
|
QStringList res;
|
||||||
|
QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes();
|
||||||
|
foreach(const QModelIndex &index, selectedIndexes) {
|
||||||
|
if(index.column() == F_NAME) {
|
||||||
|
// Get the file hash
|
||||||
|
QString hash = getHashFromRow(index.row());
|
||||||
|
res << hash;
|
||||||
|
if(only_one) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int FinishedTorrents::getNbTorrentsInList() const {
|
||||||
|
return nbFinished;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load columns width in a file that were saved previously
|
||||||
|
// (finished list)
|
||||||
|
bool FinishedTorrents::loadColWidthFinishedList(){
|
||||||
|
qDebug("Loading columns width for finished list");
|
||||||
|
QSettings settings("qBittorrent", "qBittorrent");
|
||||||
|
QString line = settings.value("FinishedListColsWidth", QString()).toString();
|
||||||
|
if(line.isEmpty())
|
||||||
|
return false;
|
||||||
|
QStringList width_list = line.split(' ');
|
||||||
|
if(width_list.size() < finishedListModel->columnCount()-1)
|
||||||
|
return false;
|
||||||
|
unsigned int listSize = width_list.size();
|
||||||
|
for(unsigned int i=0; i<listSize; ++i){
|
||||||
|
finishedList->header()->resizeSection(i, width_list.at(i).toInt());
|
||||||
|
}
|
||||||
|
loadLastSortedColumn();
|
||||||
|
QVariantList visualIndexes = settings.value(QString::fromUtf8("FinishedListVisualIndexes"), QVariantList()).toList();
|
||||||
|
if(visualIndexes.size() != finishedListModel->columnCount()-1) {
|
||||||
|
qDebug("Corrupted values for download list columns sizes");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
bool change = false;
|
||||||
|
do {
|
||||||
|
change = false;
|
||||||
|
for(int i=0;i<visualIndexes.size(); ++i) {
|
||||||
|
int new_visual_index = visualIndexes.at(finishedList->header()->logicalIndex(i)).toInt();
|
||||||
|
if(i != new_visual_index) {
|
||||||
|
qDebug("Moving column from %d to %d", finishedList->header()->logicalIndex(i), new_visual_index);
|
||||||
|
finishedList->header()->moveSection(i, new_visual_index);
|
||||||
|
change = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}while(change);
|
||||||
|
qDebug("Finished list columns width loaded");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FinishedTorrents::saveLastSortedColumn() {
|
||||||
|
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||||
|
Qt::SortOrder sortOrder = finishedList->header()->sortIndicatorOrder();
|
||||||
|
QString sortOrderLetter;
|
||||||
|
if(sortOrder == Qt::AscendingOrder)
|
||||||
|
sortOrderLetter = QString::fromUtf8("a");
|
||||||
|
else
|
||||||
|
sortOrderLetter = QString::fromUtf8("d");
|
||||||
|
int index = finishedList->header()->sortIndicatorSection();
|
||||||
|
settings.setValue(QString::fromUtf8("FinishedListSortedCol"), misc::toQString(index)+sortOrderLetter);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FinishedTorrents::loadLastSortedColumn() {
|
||||||
|
// Loading last sorted column
|
||||||
|
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||||
|
QString sortedCol = settings.value(QString::fromUtf8("FinishedListSortedCol"), QString()).toString();
|
||||||
|
if(!sortedCol.isEmpty()) {
|
||||||
|
Qt::SortOrder sortOrder;
|
||||||
|
if(sortedCol.endsWith(QString::fromUtf8("d")))
|
||||||
|
sortOrder = Qt::DescendingOrder;
|
||||||
|
else
|
||||||
|
sortOrder = Qt::AscendingOrder;
|
||||||
|
sortedCol = sortedCol.left(sortedCol.size()-1);
|
||||||
|
int index = sortedCol.toInt();
|
||||||
|
finishedList->sortByColumn(index, sortOrder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save columns width in a file to remember them
|
||||||
|
// (finished list)
|
||||||
|
void FinishedTorrents::saveColWidthFinishedList() const{
|
||||||
|
qDebug("Saving columns width in finished list");
|
||||||
|
QSettings settings("qBittorrent", "qBittorrent");
|
||||||
|
QStringList width_list;
|
||||||
|
QStringList new_width_list;
|
||||||
|
short nbColumns = finishedListModel->columnCount()-1;
|
||||||
|
|
||||||
|
QString line = settings.value("FinishedListColsWidth", QString()).toString();
|
||||||
|
if(!line.isEmpty()) {
|
||||||
|
width_list = line.split(' ');
|
||||||
|
}
|
||||||
|
for(short i=0; i<nbColumns; ++i){
|
||||||
|
if(finishedList->columnWidth(i)<1 && width_list.size() == nbColumns && width_list.at(i).toInt()>=1) {
|
||||||
|
// load the former width
|
||||||
|
new_width_list << width_list.at(i);
|
||||||
|
} else if(finishedList->columnWidth(i)>=1) {
|
||||||
|
// usual case, save the current width
|
||||||
|
new_width_list << QString::fromUtf8(misc::toString(finishedList->columnWidth(i)).c_str());
|
||||||
|
} else {
|
||||||
|
// default width
|
||||||
|
finishedList->resizeColumnToContents(i);
|
||||||
|
new_width_list << QString::fromUtf8(misc::toString(finishedList->columnWidth(i)).c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
settings.setValue("FinishedListColsWidth", new_width_list.join(" "));
|
||||||
|
QVariantList visualIndexes;
|
||||||
|
for(int i=0; i<nbColumns; ++i) {
|
||||||
|
visualIndexes.append(finishedList->header()->visualIndex(i));
|
||||||
|
}
|
||||||
|
settings.setValue(QString::fromUtf8("FinishedListVisualIndexes"), visualIndexes);
|
||||||
|
qDebug("Finished list columns width saved");
|
||||||
|
}
|
||||||
|
|
||||||
|
void FinishedTorrents::on_actionSet_upload_limit_triggered(){
|
||||||
|
QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes();
|
||||||
|
QStringList hashes;
|
||||||
|
foreach(const QModelIndex &index, selectedIndexes){
|
||||||
|
if(index.column() == F_NAME){
|
||||||
|
// Get the file hash
|
||||||
|
hashes << getHashFromRow(index.row());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
new BandwidthAllocationDialog(this, true, BTSession, hashes);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FinishedTorrents::updateMetadata(QTorrentHandle &h) {
|
||||||
|
QString hash = h.hash();
|
||||||
|
int row = getRowFromHash(hash);
|
||||||
|
if(row != -1) {
|
||||||
|
qDebug("Updating torrent metadata in download list");
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(h.name()));
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_SIZE), QVariant((qlonglong)h.actual_size()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FinishedTorrents::updateTorrent(QTorrentHandle h) {
|
||||||
|
if(!h.is_valid()) return;
|
||||||
|
QString hash = h.hash();
|
||||||
|
int row = getRowFromHash(hash);
|
||||||
|
if(row == -1){
|
||||||
|
qDebug("Cannot find torrent in finished list, adding it");
|
||||||
|
addTorrent(hash);
|
||||||
|
row = getRowFromHash(hash);
|
||||||
|
}
|
||||||
|
Q_ASSERT(row != -1);
|
||||||
|
if(!finishedList->isColumnHidden(F_SWARM)) {
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_SWARM), misc::toQString(h.num_complete())+QString("/")+misc::toQString(h.num_incomplete()));
|
||||||
|
}
|
||||||
|
if(h.is_paused()) return;
|
||||||
|
// Update queued torrent
|
||||||
|
if(BTSession->isQueueingEnabled() && h.is_queued()) {
|
||||||
|
if(h.state() == torrent_status::checking_files || h.state() == torrent_status::queued_for_checking){
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/time.png"))), Qt::DecorationRole);
|
||||||
|
} else {
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/queued.png"))), Qt::DecorationRole);
|
||||||
|
}
|
||||||
|
// Reset upload speed and seeds/leech
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), 0.);
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_PEERS), "0");
|
||||||
|
setRowColor(row, QString::fromUtf8("grey"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(h.state() == torrent_status::checking_files || h.state() == torrent_status::queued_for_checking){
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/time.png"))), Qt::DecorationRole);
|
||||||
|
setRowColor(row, QString::fromUtf8("grey"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setRowColor(row, QString::fromUtf8("orange"));
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png"))), Qt::DecorationRole);
|
||||||
|
if(!finishedList->isColumnHidden(F_UPSPEED)) {
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), QVariant((double)h.upload_payload_rate()));
|
||||||
|
}
|
||||||
|
if(!finishedList->isColumnHidden(F_PEERS)) {
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_PEERS), misc::toQString(h.num_peers() - h.num_seeds(), true));
|
||||||
|
}
|
||||||
|
if(!finishedList->isColumnHidden(F_UPLOAD)) {
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_UPLOAD), QVariant((double)h.all_time_upload()));
|
||||||
|
}
|
||||||
|
if(!finishedList->isColumnHidden(F_RATIO)) {
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_RATIO), QVariant(misc::toQString(BTSession->getRealRatio(hash))));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int FinishedTorrents::getRowFromHash(QString hash) const{
|
||||||
|
unsigned int nbRows = finishedListModel->rowCount();
|
||||||
|
for(unsigned int i=0; i<nbRows; ++i){
|
||||||
|
if(finishedListModel->data(finishedListModel->index(i, F_HASH)) == hash){
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note: does not actually pause the torrent in BT Session
|
||||||
|
void FinishedTorrents::pauseTorrent(QString hash) {
|
||||||
|
int row = getRowFromHash(hash);
|
||||||
|
if(row == -1)
|
||||||
|
return;
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), QVariant((double)0.0));
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_NAME), QIcon(QString::fromUtf8(":/Icons/skin/paused.png")), Qt::DecorationRole);
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_PEERS), QVariant(QString::fromUtf8("0")));
|
||||||
|
setRowColor(row, QString::fromUtf8("red"));
|
||||||
|
}
|
||||||
|
|
||||||
|
QString FinishedTorrents::getHashFromRow(unsigned int row) const {
|
||||||
|
Q_ASSERT(row < (unsigned int)proxyModel->rowCount());
|
||||||
|
return proxyModel->data(proxyModel->index(row, F_HASH)).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Will move it to download tab
|
||||||
|
void FinishedTorrents::deleteTorrent(QString hash){
|
||||||
|
int row = getRowFromHash(hash);
|
||||||
|
if(row == -1){
|
||||||
|
qDebug("Torrent is not in finished list, nothing to delete");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
finishedListModel->removeRow(row);
|
||||||
|
--nbFinished;
|
||||||
|
emit finishedTorrentsNumberChanged(nbFinished);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show torrent properties dialog
|
||||||
|
void FinishedTorrents::showProperties(const QModelIndex &index){
|
||||||
|
showPropertiesFromHash(getHashFromRow(index.row()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void FinishedTorrents::showPropertiesFromHash(QString hash){
|
||||||
|
QTorrentHandle h = BTSession->getTorrentHandle(hash);
|
||||||
|
properties *prop = new properties(this, BTSession, h);
|
||||||
|
connect(prop, SIGNAL(filteredFilesChanged(QString)), this, SLOT(updateFileSize(QString)));
|
||||||
|
connect(prop, SIGNAL(trackersChanged(QString)), BTSession, SLOT(saveTrackerFile(QString)));
|
||||||
|
prop->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FinishedTorrents::updateFileSize(QString hash){
|
||||||
|
int row = getRowFromHash(hash);
|
||||||
|
QTorrentHandle h = BTSession->getTorrentHandle(hash);
|
||||||
|
finishedListModel->setData(finishedListModel->index(row, F_SIZE), QVariant((qlonglong)h.actual_size()));
|
||||||
|
}
|
||||||
|
|
||||||
|
// display properties of selected items
|
||||||
|
void FinishedTorrents::propertiesSelection(){
|
||||||
|
QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes();
|
||||||
|
foreach(const QModelIndex &index, selectedIndexes){
|
||||||
|
if(index.column() == F_NAME){
|
||||||
|
showProperties(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FinishedTorrents::forceRecheck(){
|
||||||
|
QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes();
|
||||||
|
foreach(const QModelIndex &index, selectedIndexes){
|
||||||
|
if(index.column() == F_NAME){
|
||||||
|
QString hash = getHashFromRow(index.row());
|
||||||
|
QTorrentHandle h = BTSession->getTorrentHandle(hash);
|
||||||
|
qDebug("Forcing recheck for torrent %s", hash.toLocal8Bit().data());
|
||||||
|
h.force_recheck();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FinishedTorrents::displayFinishedListMenu(const QPoint&){
|
||||||
|
QMenu myFinishedListMenu(this);
|
||||||
|
// Enable/disable pause/start action given the DL state
|
||||||
|
QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes();
|
||||||
|
bool has_pause = false, has_start = false, has_preview = false;
|
||||||
|
foreach(const QModelIndex &index, selectedIndexes) {
|
||||||
|
if(index.column() == F_NAME) {
|
||||||
|
// Get the file name
|
||||||
|
QString hash = getHashFromRow(index.row());
|
||||||
|
// Get handle and pause the torrent
|
||||||
|
QTorrentHandle h = BTSession->getTorrentHandle(hash);
|
||||||
|
if(!h.is_valid()) continue;
|
||||||
|
if(h.is_paused()) {
|
||||||
|
if(!has_start) {
|
||||||
|
myFinishedListMenu.addAction(actionStart);
|
||||||
|
has_start = true;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
if(!has_pause) {
|
||||||
|
myFinishedListMenu.addAction(actionPause);
|
||||||
|
has_pause = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(BTSession->isFilePreviewPossible(hash) && !has_preview) {
|
||||||
|
myFinishedListMenu.addAction(actionPreview_file);
|
||||||
|
has_preview = true;
|
||||||
|
}
|
||||||
|
if(has_pause && has_start && has_preview) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
myFinishedListMenu.addSeparator();
|
||||||
|
myFinishedListMenu.addAction(actionDelete);
|
||||||
|
myFinishedListMenu.addAction(actionDelete_Permanently);
|
||||||
|
myFinishedListMenu.addSeparator();
|
||||||
|
myFinishedListMenu.addAction(actionSet_upload_limit);
|
||||||
|
myFinishedListMenu.addSeparator();
|
||||||
|
myFinishedListMenu.addAction(actionForce_recheck);
|
||||||
|
myFinishedListMenu.addSeparator();
|
||||||
|
myFinishedListMenu.addAction(actionOpen_destination_folder);
|
||||||
|
myFinishedListMenu.addAction(actionTorrent_Properties);
|
||||||
|
myFinishedListMenu.addSeparator();
|
||||||
|
myFinishedListMenu.addAction(actionCopy_magnet_link);
|
||||||
|
myFinishedListMenu.addAction(actionBuy_it);
|
||||||
|
|
||||||
|
// Call menu
|
||||||
|
myFinishedListMenu.exec(QCursor::pos());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Hiding Columns functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
// hide/show columns menu
|
||||||
|
void FinishedTorrents::displayFinishedHoSMenu(const QPoint&){
|
||||||
|
QMenu hideshowColumn(this);
|
||||||
|
hideshowColumn.setTitle(tr("Hide or Show Column"));
|
||||||
|
int lastCol = F_RATIO;
|
||||||
|
for(int i=0; i<=lastCol; i++) {
|
||||||
|
hideshowColumn.addAction(getActionHoSCol(i));
|
||||||
|
}
|
||||||
|
// Call menu
|
||||||
|
hideshowColumn.exec(QCursor::pos());
|
||||||
|
}
|
||||||
|
|
||||||
|
// toggle hide/show a column
|
||||||
|
void FinishedTorrents::hideOrShowColumn(int index) {
|
||||||
|
unsigned int nbVisibleColumns = 0;
|
||||||
|
unsigned int nbCols = finishedListModel->columnCount();
|
||||||
|
// Count visible columns
|
||||||
|
for(unsigned int i=0; i<nbCols; ++i) {
|
||||||
|
if(!finishedList->isColumnHidden(i))
|
||||||
|
++nbVisibleColumns;
|
||||||
|
}
|
||||||
|
if(!finishedList->isColumnHidden(index)) {
|
||||||
|
// User wants to hide the column
|
||||||
|
// Is there at least one other visible column?
|
||||||
|
if(nbVisibleColumns <= 1) return;
|
||||||
|
// User can hide the column, do it.
|
||||||
|
finishedList->setColumnHidden(index, true);
|
||||||
|
getActionHoSCol(index)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_cancel.png")));
|
||||||
|
--nbVisibleColumns;
|
||||||
|
} else {
|
||||||
|
// User want to display the column
|
||||||
|
finishedList->setColumnHidden(index, false);
|
||||||
|
getActionHoSCol(index)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_ok.png")));
|
||||||
|
++nbVisibleColumns;
|
||||||
|
}
|
||||||
|
//resize all others non-hidden columns
|
||||||
|
for(unsigned int i=0; i<nbCols; ++i) {
|
||||||
|
if(!finishedList->isColumnHidden(i)) {
|
||||||
|
finishedList->setColumnWidth(i, (int)ceil(finishedList->columnWidth(i)+(finishedList->columnWidth(index)/nbVisibleColumns)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FinishedTorrents::hideOrShowColumnName() {
|
||||||
|
hideOrShowColumn(F_NAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FinishedTorrents::hideOrShowColumnSize() {
|
||||||
|
hideOrShowColumn(F_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FinishedTorrents::hideOrShowColumnUpSpeed() {
|
||||||
|
hideOrShowColumn(F_UPSPEED);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FinishedTorrents::hideOrShowColumnSwarm() {
|
||||||
|
hideOrShowColumn(F_SWARM);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FinishedTorrents::hideOrShowColumnPeers() {
|
||||||
|
hideOrShowColumn(F_PEERS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FinishedTorrents::hideOrShowColumnUpload() {
|
||||||
|
hideOrShowColumn(F_UPLOAD);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FinishedTorrents::hideOrShowColumnRatio() {
|
||||||
|
hideOrShowColumn(F_RATIO);
|
||||||
|
}
|
||||||
|
|
||||||
|
// load the previous settings, and hide the columns
|
||||||
|
bool FinishedTorrents::loadHiddenColumns() {
|
||||||
|
bool loaded = false;
|
||||||
|
QSettings settings("qBittorrent", "qBittorrent");
|
||||||
|
QString line = settings.value("FinishedListColsHoS", QString()).toString();
|
||||||
|
QStringList ishidden_list;
|
||||||
|
if(!line.isEmpty()) {
|
||||||
|
ishidden_list = line.split(' ');
|
||||||
|
if(ishidden_list.size() == finishedListModel->columnCount()-1) {
|
||||||
|
unsigned int listSize = ishidden_list.size();
|
||||||
|
for(unsigned int i=0; i<listSize; ++i){
|
||||||
|
finishedList->header()->resizeSection(i, ishidden_list.at(i).toInt());
|
||||||
|
}
|
||||||
|
loaded = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(int i=0; i<finishedListModel->columnCount()-1; i++) {
|
||||||
|
if(loaded && ishidden_list.at(i) == "0") {
|
||||||
|
finishedList->setColumnHidden(i, true);
|
||||||
|
getActionHoSCol(i)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_cancel.png")));
|
||||||
|
} else {
|
||||||
|
getActionHoSCol(i)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_ok.png")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return loaded;
|
||||||
|
}
|
||||||
|
|
||||||
|
// save the hidden columns in settings
|
||||||
|
void FinishedTorrents::saveHiddenColumns() {
|
||||||
|
QSettings settings("qBittorrent", "qBittorrent");
|
||||||
|
QStringList ishidden_list;
|
||||||
|
short nbColumns = finishedListModel->columnCount()-1;
|
||||||
|
|
||||||
|
for(short i=0; i<nbColumns; ++i){
|
||||||
|
if(finishedList->isColumnHidden(i)) {
|
||||||
|
ishidden_list << QString::fromUtf8(misc::toString(0).c_str());
|
||||||
|
} else {
|
||||||
|
ishidden_list << QString::fromUtf8(misc::toString(1).c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
settings.setValue("FinishedListColsHoS", ishidden_list.join(" "));
|
||||||
|
}
|
||||||
|
|
||||||
|
// getter, return the action hide or show whose id is index
|
||||||
|
QAction* FinishedTorrents::getActionHoSCol(int index) {
|
||||||
|
switch(index) {
|
||||||
|
case F_NAME :
|
||||||
|
return actionHOSColName;
|
||||||
|
break;
|
||||||
|
case F_SIZE :
|
||||||
|
return actionHOSColSize;
|
||||||
|
break;
|
||||||
|
case F_UPSPEED :
|
||||||
|
return actionHOSColUpSpeed;
|
||||||
|
break;
|
||||||
|
case F_SWARM :
|
||||||
|
return actionHOSColSwarm;
|
||||||
|
break;
|
||||||
|
case F_PEERS :
|
||||||
|
return actionHOSColPeers;
|
||||||
|
break;
|
||||||
|
case F_UPLOAD :
|
||||||
|
return actionHOSColUpload;
|
||||||
|
break;
|
||||||
|
case F_RATIO :
|
||||||
|
return actionHOSColRatio;
|
||||||
|
break;
|
||||||
|
default :
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
104
src/FinishedTorrents.h
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
/*
|
||||||
|
* Bittorrent Client using Qt4 and libtorrent.
|
||||||
|
* Copyright (C) 2006 Christophe Dumez
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* In addition, as a special exception, the copyright holders give permission to
|
||||||
|
* link this program with the OpenSSL project's "OpenSSL" library (or with
|
||||||
|
* modified versions of it that use the same license as the "OpenSSL" library),
|
||||||
|
* and distribute the linked executables. You must obey the GNU General Public
|
||||||
|
* License in all respects for all of the code used other than "OpenSSL". If you
|
||||||
|
* modify file(s), you may extend this exception to your version of the file(s),
|
||||||
|
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||||
|
* exception statement from your version.
|
||||||
|
*
|
||||||
|
* Contact : chris@qbittorrent.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SEEDING_H
|
||||||
|
#define SEEDING_H
|
||||||
|
|
||||||
|
#include "ui_seeding.h"
|
||||||
|
#include "qtorrenthandle.h"
|
||||||
|
|
||||||
|
class QStandardItemModel;
|
||||||
|
class QSortFilterProxyModel;
|
||||||
|
class bittorrent;
|
||||||
|
class FinishedListDelegate;
|
||||||
|
|
||||||
|
using namespace libtorrent;
|
||||||
|
|
||||||
|
class FinishedTorrents : public QWidget, public Ui::seeding {
|
||||||
|
Q_OBJECT
|
||||||
|
private:
|
||||||
|
QObject *parent;
|
||||||
|
bittorrent *BTSession;
|
||||||
|
FinishedListDelegate *finishedListDelegate;
|
||||||
|
QStandardItemModel *finishedListModel;
|
||||||
|
QSortFilterProxyModel *proxyModel;
|
||||||
|
unsigned int nbFinished;
|
||||||
|
void hideOrShowColumn(int index);
|
||||||
|
bool loadHiddenColumns();
|
||||||
|
void saveHiddenColumns();
|
||||||
|
QAction* getActionHoSCol(int index);
|
||||||
|
|
||||||
|
public:
|
||||||
|
FinishedTorrents(QObject *parent, bittorrent *BTSession);
|
||||||
|
~FinishedTorrents();
|
||||||
|
// Methods
|
||||||
|
bool loadColWidthFinishedList();
|
||||||
|
int getRowFromHash(QString hash) const;
|
||||||
|
QStringList getSelectedTorrents(bool only_one=false) const;
|
||||||
|
unsigned int getNbTorrentsInList() const;
|
||||||
|
QString getHashFromRow(unsigned int row) const;
|
||||||
|
|
||||||
|
protected slots:
|
||||||
|
void showProperties(const QModelIndex &index);
|
||||||
|
void displayFinishedListMenu(const QPoint&);
|
||||||
|
void displayFinishedHoSMenu(const QPoint&);
|
||||||
|
void setRowColor(int row, QString color);
|
||||||
|
void saveColWidthFinishedList() const;
|
||||||
|
void updateFileSize(QString hash);
|
||||||
|
void on_actionSet_upload_limit_triggered();
|
||||||
|
void notifyTorrentDoubleClicked(const QModelIndex& index);
|
||||||
|
void hideOrShowColumnName();
|
||||||
|
void hideOrShowColumnSize();
|
||||||
|
void hideOrShowColumnUpSpeed();
|
||||||
|
void hideOrShowColumnSwarm();
|
||||||
|
void hideOrShowColumnPeers();
|
||||||
|
void hideOrShowColumnUpload();
|
||||||
|
void hideOrShowColumnRatio();
|
||||||
|
void forceRecheck();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void addTorrent(QString hash);
|
||||||
|
void updateTorrent(QTorrentHandle h);
|
||||||
|
void pauseTorrent(QString hash);
|
||||||
|
void propertiesSelection();
|
||||||
|
void deleteTorrent(QString hash);
|
||||||
|
void showPropertiesFromHash(QString hash);
|
||||||
|
void loadLastSortedColumn();
|
||||||
|
void saveLastSortedColumn();
|
||||||
|
void updateMetadata(QTorrentHandle &h);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void torrentMovedFromFinishedList(QString);
|
||||||
|
void torrentDoubleClicked(QString hash, bool finished);
|
||||||
|
void finishedTorrentsNumberChanged(unsigned int);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
3230
src/GUI.cpp
266
src/GUI.h
@@ -16,188 +16,198 @@
|
|||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
*
|
*
|
||||||
|
* In addition, as a special exception, the copyright holders give permission to
|
||||||
|
* link this program with the OpenSSL project's "OpenSSL" library (or with
|
||||||
|
* modified versions of it that use the same license as the "OpenSSL" library),
|
||||||
|
* and distribute the linked executables. You must obey the GNU General Public
|
||||||
|
* License in all respects for all of the code used other than "OpenSSL". If you
|
||||||
|
* modify file(s), you may extend this exception to your version of the file(s),
|
||||||
|
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||||
|
* exception statement from your version.
|
||||||
|
*
|
||||||
* Contact : chris@qbittorrent.org
|
* Contact : chris@qbittorrent.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef GUI_H
|
#ifndef GUI_H
|
||||||
#define GUI_H
|
#define GUI_H
|
||||||
|
|
||||||
#include <QMainWindow>
|
|
||||||
#include <QHash>
|
|
||||||
#include <QProcess>
|
#include <QProcess>
|
||||||
#include <QTcpServer>
|
|
||||||
#include <QTcpSocket>
|
|
||||||
#include <QCloseEvent>
|
|
||||||
#include <QSystemTrayIcon>
|
#include <QSystemTrayIcon>
|
||||||
|
#include <QPointer>
|
||||||
#include <libtorrent/entry.hpp>
|
|
||||||
#include <libtorrent/bencode.hpp>
|
|
||||||
#include <libtorrent/session.hpp>
|
|
||||||
#include <libtorrent/fingerprint.hpp>
|
|
||||||
#include <libtorrent/session_settings.hpp>
|
|
||||||
#include <libtorrent/identify_client.hpp>
|
|
||||||
#include <libtorrent/alert_types.hpp>
|
|
||||||
|
|
||||||
#include "ui_MainWindow.h"
|
#include "ui_MainWindow.h"
|
||||||
#include "options_imp.h"
|
#include "qtorrenthandle.h"
|
||||||
#include "about_imp.h"
|
|
||||||
#include "previewSelect.h"
|
|
||||||
#include "trackerLogin.h"
|
|
||||||
#include "bittorrent.h"
|
|
||||||
|
|
||||||
|
|
||||||
#define TIME_TRAY_BALLOON 5000
|
|
||||||
|
|
||||||
|
class bittorrent;
|
||||||
class createtorrent;
|
class createtorrent;
|
||||||
class QTimer;
|
class QTimer;
|
||||||
class QCompleter;
|
class DownloadingTorrents;
|
||||||
class DLListDelegate;
|
class FinishedTorrents;
|
||||||
class SearchListDelegate;
|
|
||||||
class downloadThread;
|
|
||||||
class downloadFromURL;
|
class downloadFromURL;
|
||||||
|
class SearchEngine;
|
||||||
using namespace libtorrent;
|
#ifdef QT_4_4
|
||||||
namespace fs = boost::filesystem;
|
class QLocalServer;
|
||||||
|
class QLocalSocket;
|
||||||
|
#else
|
||||||
|
class QTcpServer;
|
||||||
|
class QTcpSocket;
|
||||||
|
#endif
|
||||||
|
class QCloseEvent;
|
||||||
|
class RSSImp;
|
||||||
|
class QShortcut;
|
||||||
|
class about;
|
||||||
|
class previewSelect;
|
||||||
|
class options_imp;
|
||||||
|
class QTabWidget;
|
||||||
|
class QLabel;
|
||||||
|
class QModelIndex;
|
||||||
|
class HttpServer;
|
||||||
|
class QFrame;
|
||||||
|
|
||||||
class GUI : public QMainWindow, private Ui::MainWindow{
|
class GUI : public QMainWindow, private Ui::MainWindow{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Bittorrent
|
// Bittorrent
|
||||||
bittorrent BTSession;
|
bittorrent *BTSession;
|
||||||
QTimer *checkConnect;
|
QTimer *checkConnect;
|
||||||
QHash<QString, QStringList> trackerErrors;
|
QTimer *scrapeTimer;
|
||||||
QList<QPair<torrent_handle,std::string> > unauthenticated_trackers;
|
QList<QPair<QTorrentHandle,QString> > unauthenticated_trackers;
|
||||||
downloadFromURL *downloadFromURLDialog;
|
|
||||||
// GUI related
|
// GUI related
|
||||||
options_imp *options;
|
QTabWidget *tabs;
|
||||||
createtorrent *createWindow;
|
QPointer<options_imp> options;
|
||||||
QTimer *refresher;
|
|
||||||
QSystemTrayIcon *myTrayIcon;
|
QSystemTrayIcon *myTrayIcon;
|
||||||
|
QPointer<QTimer> systrayCreator;
|
||||||
QMenu *myTrayIconMenu;
|
QMenu *myTrayIconMenu;
|
||||||
about *aboutdlg;
|
DownloadingTorrents *downloadingTorrentTab;
|
||||||
QStandardItemModel *DLListModel;
|
FinishedTorrents *finishedTorrentTab;
|
||||||
DLListDelegate *DLDelegate;
|
|
||||||
QStandardItemModel *SearchListModel;
|
|
||||||
SearchListDelegate *SearchDelegate;
|
|
||||||
unsigned int nbTorrents;
|
|
||||||
QLabel *connecStatusLblIcon;
|
QLabel *connecStatusLblIcon;
|
||||||
// Preview
|
bool systrayIntegration;
|
||||||
previewSelect *previewSelection;
|
bool displaySpeedInTitle;
|
||||||
QProcess *previewProcess;
|
bool force_exit;
|
||||||
// Search related
|
unsigned int refreshInterval;
|
||||||
QHash<QString, QString> searchResultsUrls;
|
QTimer *refresher;
|
||||||
QProcess *searchProcess;
|
QLabel *dlSpeedLbl;
|
||||||
bool search_stopped;
|
QLabel *upSpeedLbl;
|
||||||
bool no_search_results;
|
QLabel *ratioLbl;
|
||||||
QByteArray search_result_line_truncated;
|
QLabel *DHTLbl;
|
||||||
unsigned long nb_search_results;
|
QFrame *statusSep1;
|
||||||
QTcpServer tcpServer;
|
QFrame *statusSep2;
|
||||||
|
QFrame *statusSep3;
|
||||||
|
QFrame *statusSep4;
|
||||||
|
// Keyboard shortcuts
|
||||||
|
QShortcut *switchSearchShortcut;
|
||||||
|
QShortcut *switchSearchShortcut2;
|
||||||
|
QShortcut *switchDownShortcut;
|
||||||
|
QShortcut *switchUpShortcut;
|
||||||
|
QShortcut *switchRSSShortcut;
|
||||||
|
QAction *prioSeparator;
|
||||||
|
QAction *prioSeparator2;
|
||||||
|
// Search
|
||||||
|
SearchEngine *searchEngine;
|
||||||
|
// RSS
|
||||||
|
RSSImp *rssWidget;
|
||||||
|
// Web UI
|
||||||
|
QPointer<HttpServer> httpServer;
|
||||||
|
// Misc
|
||||||
|
#ifdef QT_4_4
|
||||||
|
QLocalServer *localServer;
|
||||||
|
QLocalSocket *clientConnection;
|
||||||
|
#else
|
||||||
|
QTcpServer *localServer;
|
||||||
QTcpSocket *clientConnection;
|
QTcpSocket *clientConnection;
|
||||||
QCompleter *searchCompleter;
|
#endif
|
||||||
QStringList searchHistory;
|
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
// GUI related slots
|
// GUI related slots
|
||||||
void dropEvent(QDropEvent *event);
|
void dropEvent(QDropEvent *event);
|
||||||
void dragEnterEvent(QDragEnterEvent *event);
|
void dragEnterEvent(QDragEnterEvent *event);
|
||||||
void toggleVisibility(QSystemTrayIcon::ActivationReason e);
|
void toggleVisibility(QSystemTrayIcon::ActivationReason e);
|
||||||
void showAbout();
|
void on_actionAbout_triggered();
|
||||||
void setInfoBar(const QString& info, const QString& color="black");
|
void on_actionCreate_torrent_triggered();
|
||||||
void updateDlList(bool force=false);
|
void on_actionWebsite_triggered() const;
|
||||||
void showCreateWindow();
|
void on_actionBugReport_triggered() const;
|
||||||
void clearLog();
|
void on_actionShow_console_triggered();
|
||||||
void openqBTHomepage();
|
|
||||||
void openqBTBugTracker();
|
|
||||||
void readParamsOnSocket();
|
void readParamsOnSocket();
|
||||||
void acceptConnection();
|
void acceptConnection();
|
||||||
void saveCheckedSearchEngines(int) const;
|
void togglePausedState(QString hash);
|
||||||
void saveColWidthDLList() const;
|
void torrentDoubleClicked(QString hash, bool finished);
|
||||||
void saveColWidthSearchList() const;
|
void on_actionPreview_file_triggered();
|
||||||
void loadCheckedSearchEngines();
|
void previewFile(QString filePath);
|
||||||
bool loadColWidthDLList();
|
|
||||||
bool loadColWidthSearchList();
|
|
||||||
void sortDownloadList(int index);
|
|
||||||
void sortDownloadListFloat(int index, Qt::SortOrder sortOrder);
|
|
||||||
void sortDownloadListString(int index, Qt::SortOrder sortOrder);
|
|
||||||
void sortSearchList(int index);
|
|
||||||
void sortSearchListInt(int index, Qt::SortOrder sortOrder);
|
|
||||||
void sortSearchListString(int index, Qt::SortOrder sortOrder);
|
|
||||||
void displayDLListMenu(const QPoint& pos);
|
|
||||||
void selectGivenRow(const QModelIndex& index);
|
|
||||||
void togglePausedState(const QModelIndex& index);
|
|
||||||
void displayInfoBarMenu(const QPoint& pos);
|
|
||||||
void displayGUIMenu(const QPoint& pos);
|
|
||||||
void previewFileSelection();
|
|
||||||
void previewFile(const QString& filePath);
|
|
||||||
void cleanTempPreviewFile(int, QProcess::ExitStatus);
|
|
||||||
void balloonClicked();
|
void balloonClicked();
|
||||||
void writeSettings();
|
void writeSettings();
|
||||||
void readSettings();
|
void readSettings();
|
||||||
void forceExit();
|
void on_actionExit_triggered();
|
||||||
|
void createTrayIcon();
|
||||||
|
void updateUnfinishedTorrentNumber(unsigned int nb);
|
||||||
|
void updateFinishedTorrentNumber(unsigned int nb);
|
||||||
|
void fullDiskError(QTorrentHandle& h, QString msg) const;
|
||||||
|
void handleDownloadFromUrlFailure(QString, QString) const;
|
||||||
|
void createSystrayDelayed();
|
||||||
|
void setPaused(QTorrentHandle &h) const;
|
||||||
|
// Keyboard shortcuts
|
||||||
|
void createKeyboardShortcuts();
|
||||||
|
void displayDownTab() const;
|
||||||
|
void displayUpTab() const;
|
||||||
|
void displaySearchTab() const;
|
||||||
|
void displayRSSTab() const;
|
||||||
// Torrent actions
|
// Torrent actions
|
||||||
void showProperties(const QModelIndex &index);
|
void on_actionTorrent_Properties_triggered();
|
||||||
void propertiesSelection();
|
void on_actionPause_triggered();
|
||||||
void pauseSelection();
|
void on_actionPause_All_triggered();
|
||||||
void pauseAll();
|
void on_actionStart_triggered();
|
||||||
void startSelection();
|
void on_actionStart_All_triggered();
|
||||||
void resumeAll();
|
void on_actionOpen_triggered();
|
||||||
void askForTorrents();
|
void on_actionDelete_Permanently_triggered();
|
||||||
void deletePermanently();
|
void on_actionDelete_triggered();
|
||||||
void deleteSelection();
|
void on_actionSet_global_upload_limit_triggered();
|
||||||
|
void on_actionSet_global_download_limit_triggered();
|
||||||
|
void on_actionDocumentation_triggered() const;
|
||||||
void checkConnectionStatus();
|
void checkConnectionStatus();
|
||||||
void configureSession(bool deleteOptions);
|
void configureSession(bool deleteOptions);
|
||||||
void processParams(const QStringList& params);
|
void processParams(const QStringList& params);
|
||||||
void addUnauthenticatedTracker(QPair<torrent_handle,std::string> tracker);
|
void addTorrent(QString path);
|
||||||
void processScannedFiles(const QStringList& params);
|
void addUnauthenticatedTracker(QPair<QTorrentHandle,QString> tracker);
|
||||||
void processDownloadedFiles(const QString& path, const QString& url);
|
void processDownloadedFiles(QString path, QString url);
|
||||||
void downloadFromURLList(const QStringList& urls);
|
void downloadFromURLList(const QStringList& urls);
|
||||||
void displayDownloadingUrlInfos(const QString& url);
|
void deleteTorrent(QString hash);
|
||||||
// Search slots
|
void finishedTorrent(QTorrentHandle& h) const;
|
||||||
void on_search_button_clicked();
|
void addedTorrent(QTorrentHandle& h) const;
|
||||||
void on_stop_search_button_clicked();
|
void checkedTorrent(QTorrentHandle& h) const;
|
||||||
void on_clear_button_clicked();
|
void pausedTorrent(QTorrentHandle& h) const;
|
||||||
void on_download_button_clicked();
|
void resumedTorrent(QTorrentHandle& h) const;
|
||||||
void on_update_nova_button_clicked();
|
void updateLists(bool force=false);
|
||||||
void appendSearchResult(const QString& line);
|
bool initWebUi(QString username, QString password, int port);
|
||||||
void searchFinished(int exitcode,QProcess::ExitStatus);
|
void on_actionIncreasePriority_triggered();
|
||||||
void readSearchOutput();
|
void on_actionDecreasePriority_triggered();
|
||||||
void searchStarted();
|
void scrapeTrackers();
|
||||||
void downloadSelectedItem(const QModelIndex& index);
|
|
||||||
void startSearchHistory();
|
|
||||||
void saveSearchHistory();
|
|
||||||
// Utils slots
|
|
||||||
void setRowColor(int row, const QString& color, bool inDLList=true);
|
|
||||||
// Options slots
|
// Options slots
|
||||||
void showOptions();
|
void on_actionOptions_triggered();
|
||||||
void OptionsSaved(const QString& info, bool deleteOptions);
|
void OptionsSaved(bool deleteOptions);
|
||||||
// HTTP slots
|
// HTTP slots
|
||||||
void askForTorrentUrl();
|
void on_actionDownload_from_URL_triggered();
|
||||||
|
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void torrentAdded(const QString& path, torrent_handle& h, bool fastResume);
|
void trackerAuthenticationRequired(QTorrentHandle& h);
|
||||||
void torrentDuplicate(const QString& path);
|
void setTabText(int index, QString text) const;
|
||||||
void torrentCorrupted(const QString& path);
|
void openDestinationFolder() const;
|
||||||
void finishedTorrent(torrent_handle& h);
|
void goBuyPage() const;
|
||||||
void fullDiskError(torrent_handle& h);
|
void copyMagnetURI() const;
|
||||||
void portListeningFailure();
|
void updateRatio();
|
||||||
void trackerError(const QString& hash, const QString& time, const QString& msg);
|
|
||||||
void trackerAuthenticationRequired(torrent_handle& h);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void closeEvent(QCloseEvent *);
|
void closeEvent(QCloseEvent *);
|
||||||
void hideEvent(QHideEvent *);
|
void showEvent(QShowEvent *);
|
||||||
|
bool event(QEvent * event);
|
||||||
|
void displayRSSTab(bool enable);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Construct / Destruct
|
// Construct / Destruct
|
||||||
GUI(QWidget *parent=0, QStringList torrentCmdLine=QStringList());
|
GUI(QWidget *parent=0, QStringList torrentCmdLine=QStringList());
|
||||||
~GUI();
|
~GUI();
|
||||||
// Methods
|
// Methods
|
||||||
int getRowFromHash(const QString& name) const;
|
int getCurrentTabIndex() const;
|
||||||
float getNovaVersion(const QString& novaPath) const;
|
QPoint screenCenter() const;
|
||||||
QByteArray getNovaChangelog(const QString& novaPath) const;
|
|
||||||
void updateNova() const;
|
|
||||||
QPoint screenCenter();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
BIN
src/Icons/downarrow.png
Normal file
|
After Width: | Height: | Size: 722 B |
|
Before Width: | Height: | Size: 1.1 KiB |
BIN
src/Icons/flags/brazil.png
Normal file
|
After Width: | Height: | Size: 799 B |
|
Before Width: | Height: | Size: 558 B |
BIN
src/Icons/flags/czech.png
Normal file
|
After Width: | Height: | Size: 455 B |
BIN
src/Icons/flags/denmark.png
Normal file
|
After Width: | Height: | Size: 270 B |
BIN
src/Icons/flags/hungary.png
Normal file
|
After Width: | Height: | Size: 172 B |
BIN
src/Icons/flags/japan.png
Normal file
|
After Width: | Height: | Size: 324 B |
BIN
src/Icons/flags/taiwan.png
Normal file
|
After Width: | Height: | Size: 333 B |
|
Before Width: | Height: | Size: 1.2 KiB |
BIN
src/Icons/loading.png
Normal file
|
After Width: | Height: | Size: 248 B |
|
Before Width: | Height: | Size: 846 B |
BIN
src/Icons/magnet.png
Normal file
|
After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
BIN
src/Icons/oxygen/application-x-kgetlist-no.png
Normal file
|
After Width: | Height: | Size: 743 B |
BIN
src/Icons/oxygen/application-x-kgetlist.png
Normal file
|
After Width: | Height: | Size: 659 B |
BIN
src/Icons/oxygen/browse.png
Normal file
|
After Width: | Height: | Size: 796 B |
BIN
src/Icons/oxygen/bt_settings.png
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
BIN
src/Icons/oxygen/bug.png
Normal file
|
After Width: | Height: | Size: 733 B |
BIN
src/Icons/oxygen/button_cancel.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
src/Icons/oxygen/button_ok.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
src/Icons/oxygen/connection.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
src/Icons/oxygen/document-new.png
Normal file
|
After Width: | Height: | Size: 873 B |
BIN
src/Icons/oxygen/download.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
src/Icons/oxygen/edit-clear.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
src/Icons/oxygen/edit-copy.png
Normal file
|
After Width: | Height: | Size: 860 B |
BIN
src/Icons/oxygen/edit-cut.png
Normal file
|
After Width: | Height: | Size: 892 B |
BIN
src/Icons/oxygen/edit-find.png
Normal file
|
After Width: | Height: | Size: 627 B |
BIN
src/Icons/oxygen/edit-paste.png
Normal file
|
After Width: | Height: | Size: 937 B |
BIN
src/Icons/oxygen/edit_clear.png
Normal file
|
After Width: | Height: | Size: 575 B |
|
Before Width: | Height: | Size: 750 B After Width: | Height: | Size: 750 B |
BIN
src/Icons/oxygen/file.png
Normal file
|
After Width: | Height: | Size: 704 B |
BIN
src/Icons/oxygen/filter.png
Normal file
|
After Width: | Height: | Size: 885 B |
BIN
src/Icons/oxygen/folder-new.png
Normal file
|
After Width: | Height: | Size: 923 B |
BIN
src/Icons/oxygen/folder.png
Normal file
|
After Width: | Height: | Size: 449 B |
BIN
src/Icons/oxygen/gear.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
src/Icons/oxygen/list-add.png
Normal file
|
After Width: | Height: | Size: 907 B |
BIN
src/Icons/oxygen/list-remove.png
Normal file
|
After Width: | Height: | Size: 498 B |
BIN
src/Icons/oxygen/log.png
Normal file
|
After Width: | Height: | Size: 541 B |
BIN
src/Icons/oxygen/mail-folder-inbox.png
Normal file
|
After Width: | Height: | Size: 739 B |
BIN
src/Icons/oxygen/preferences-desktop.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
src/Icons/oxygen/proxy.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
src/Icons/oxygen/remove.png
Executable file
|
After Width: | Height: | Size: 1.2 KiB |