Compare commits
452 Commits
release-1.
...
release-1.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5fea0e451d | ||
|
|
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 |
23
AUTHORS
@@ -6,24 +6,35 @@ Contributors:
|
|||||||
* Ishan Arora <ishan@qbittorrent.org>
|
* Ishan Arora <ishan@qbittorrent.org>
|
||||||
* Grigis Gaëtan <cipher16@gmail.com>
|
* 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:
|
Images Authors:
|
||||||
* files: src/Icons/*.png
|
* files: src/Icons/*.png
|
||||||
copyright: Gnome Icon Theme
|
copyright: Gnome Icon Theme
|
||||||
license: GPLv2
|
license: GPLv2
|
||||||
url: http://ftp.acc.umu.se/pub/GNOME/sources/gnome-icon-theme
|
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
|
* files: src/Icons/flags/*.png
|
||||||
copyright: Open Clip Art Library
|
copyright: Open Clip Art Library
|
||||||
license: Creative Commons Public Domain Dedication
|
license: Creative Commons Public Domain Dedication
|
||||||
url: http://www.openclipart.org
|
url: http://www.openclipart.org
|
||||||
|
|
||||||
* files: src/Icons/skins/*.png
|
* files: src/Icons/skin/*.png
|
||||||
|
files: src/menuicons/YYxYY/*.png
|
||||||
copyright: Mateusz Tobola <tobejodok@qbittorrent.org>
|
copyright: Mateusz Tobola <tobejodok@qbittorrent.org>
|
||||||
license: GPLv2
|
license: GPLv2
|
||||||
|
|
||||||
* files: src/menuicons/YYxYY/*.png
|
* file: src/Icons/skin/tabs.gif
|
||||||
copyright: Mateusz Tobola <tobejodok@qbittorrent.org>
|
copyright: Greg Houston <gregory.houston@gmail.com>
|
||||||
license: GPLv2
|
license: MIT
|
||||||
|
|
||||||
* file: src/search_engine/engines/btjunkie.png
|
* file: src/search_engine/engines/btjunkie.png
|
||||||
copyright: Downloaded from btjunkie.org
|
copyright: Downloaded from btjunkie.org
|
||||||
@@ -46,7 +57,9 @@ Translations authors:
|
|||||||
- Brazilian: Nick Marinho (nickmarinho@gmail.com)
|
- Brazilian: Nick Marinho (nickmarinho@gmail.com)
|
||||||
- Bulgarian: Tsvetan & Boiko Bankov (emerge_life@users.sourceforge.net)
|
- Bulgarian: Tsvetan & Boiko Bankov (emerge_life@users.sourceforge.net)
|
||||||
- Catalan: Gekko Dam Beer (gekko04@users.sourceforge.net)
|
- Catalan: Gekko Dam Beer (gekko04@users.sourceforge.net)
|
||||||
- Chinese (Simplified): Guo Yue (guoyue0418@hotmail.com)
|
- 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)
|
- Danish: Mathias Nielsen (comoneo@gmail.com)
|
||||||
- Dutch: Joost Schipper (heavyjoost@users.sourceforge.net)
|
- Dutch: Joost Schipper (heavyjoost@users.sourceforge.net)
|
||||||
- English: Christophe Dumez (chris@qbittorrent.org)
|
- English: Christophe Dumez (chris@qbittorrent.org)
|
||||||
|
|||||||
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
|
||||||
|
|
||||||
|
|||||||
122
Changelog
@@ -1,3 +1,125 @@
|
|||||||
|
* Unknown - 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
|
||||||
|
- 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
|
||||||
|
|
||||||
|
* 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
|
* Fri Aug 01 2008 - Christophe Dumez <chris@qbittorrent.org> - v1.1.1
|
||||||
- BUGFIX: Fixed bad resource file for icons
|
- BUGFIX: Fixed bad resource file for icons
|
||||||
|
|
||||||
|
|||||||
3
INSTALL
@@ -17,7 +17,8 @@ Dependencies:
|
|||||||
- Qt >= 4.3.0 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml)
|
- Qt >= 4.3.0 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml)
|
||||||
Qt >= 4.4.0 is advised
|
Qt >= 4.4.0 is advised
|
||||||
|
|
||||||
- libtorrent-rasterbar by Arvid Norberg (>= v0.13.1 REQUIRED)
|
- libtorrent-rasterbar by Arvid Norberg (>= v0.14.0 REQUIRED)
|
||||||
|
-> http://www.qbittorrent.org/download.php (advised)
|
||||||
-> http://www.libtorrent.net
|
-> http://www.libtorrent.net
|
||||||
Be careful: another library (the one used by rTorrent) uses a similar name.
|
Be careful: another library (the one used by rTorrent) uses a similar name.
|
||||||
|
|
||||||
|
|||||||
20
TODO
@@ -1,22 +1,2 @@
|
|||||||
See https://blueprints.launchpad.net/qbittorrent/
|
See https://blueprints.launchpad.net/qbittorrent/
|
||||||
|
|
||||||
Translations updated in v1.1.0:
|
|
||||||
- French
|
|
||||||
- Chinese
|
|
||||||
- Polish
|
|
||||||
- Portuguese
|
|
||||||
- Brazilian
|
|
||||||
- Slovak
|
|
||||||
- Swedish
|
|
||||||
- Romanian
|
|
||||||
- Finnish
|
|
||||||
- Italian
|
|
||||||
- Turkish
|
|
||||||
- Korean
|
|
||||||
- Hungarian
|
|
||||||
- German
|
|
||||||
- Spanish
|
|
||||||
- Russian
|
|
||||||
- Dutch
|
|
||||||
- Bulgarian
|
|
||||||
- Greek
|
|
||||||
|
|||||||
216
configure
vendored
@@ -18,20 +18,12 @@ Main options:
|
|||||||
--help This help text.
|
--help This help text.
|
||||||
|
|
||||||
Dependency options:
|
Dependency options:
|
||||||
--with-libtorrent-inc=[path] Path to libtorrent-rasterbar include
|
--with-libboost-inc=[path] Path to libboost include files
|
||||||
files
|
--with-libcurl-inc=[path] Path to libcurl include files
|
||||||
--with-libtorrent-lib=[path] Path to libtorrent-rasterbar library
|
--with-libcurl-lib=[path] Path to libcurl library files
|
||||||
files
|
--disable-libzzip Disable use of libzzip
|
||||||
--with-libtorrent-static-lib=[path] Path to libtorrent-rasterbar .a file
|
--with-libzzip-inc=[path] Path to libzzip++ include files
|
||||||
--with-libboost-inc=[path] Path to libboost include files
|
--with-libzzip-lib=[path] Path to libzzip++ library files
|
||||||
--with-libcurl-inc=[path] Path to libcurl include files
|
|
||||||
--with-libcurl-lib=[path] Path to libcurl library files
|
|
||||||
--disable-libmagick Disable use of libmagick
|
|
||||||
--with-libmagick-inc=[path] Path to libmagick++ include files
|
|
||||||
--with-libmagick-lib=[path] Path to libmagick++ 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
|
||||||
}
|
}
|
||||||
@@ -148,21 +140,6 @@ while [ $# -gt 0 ]; do
|
|||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
|
|
||||||
--with-libtorrent-inc=*)
|
|
||||||
QC_WITH_LIBTORRENT_INC=$optarg
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
|
|
||||||
--with-libtorrent-lib=*)
|
|
||||||
QC_WITH_LIBTORRENT_LIB=$optarg
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
|
|
||||||
--with-libtorrent-static-lib=*)
|
|
||||||
QC_WITH_LIBTORRENT_STATIC_LIB=$optarg
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
|
|
||||||
--with-libboost-inc=*)
|
--with-libboost-inc=*)
|
||||||
QC_WITH_LIBBOOST_INC=$optarg
|
QC_WITH_LIBBOOST_INC=$optarg
|
||||||
shift
|
shift
|
||||||
@@ -178,21 +155,6 @@ while [ $# -gt 0 ]; do
|
|||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
|
|
||||||
--disable-libmagick)
|
|
||||||
QC_DISABLE_libmagick="Y"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
|
|
||||||
--with-libmagick-inc=*)
|
|
||||||
QC_WITH_LIBMAGICK_INC=$optarg
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
|
|
||||||
--with-libmagick-lib=*)
|
|
||||||
QC_WITH_LIBMAGICK_LIB=$optarg
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
|
|
||||||
--disable-libzzip)
|
--disable-libzzip)
|
||||||
QC_DISABLE_libzzip="Y"
|
QC_DISABLE_libzzip="Y"
|
||||||
shift
|
shift
|
||||||
@@ -229,15 +191,9 @@ 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_LIBTORRENT_LIB=$QC_WITH_LIBTORRENT_LIB
|
|
||||||
echo QC_WITH_LIBTORRENT_STATIC_LIB=$QC_WITH_LIBTORRENT_STATIC_LIB
|
|
||||||
echo QC_WITH_LIBBOOST_INC=$QC_WITH_LIBBOOST_INC
|
echo QC_WITH_LIBBOOST_INC=$QC_WITH_LIBBOOST_INC
|
||||||
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_libmagick=$QC_DISABLE_libmagick
|
|
||||||
echo QC_WITH_LIBMAGICK_INC=$QC_WITH_LIBMAGICK_INC
|
|
||||||
echo QC_WITH_LIBMAGICK_LIB=$QC_WITH_LIBMAGICK_LIB
|
|
||||||
echo QC_DISABLE_libzzip=$QC_DISABLE_libzzip
|
echo QC_DISABLE_libzzip=$QC_DISABLE_libzzip
|
||||||
echo QC_WITH_LIBZZIP_INC=$QC_WITH_LIBZZIP_INC
|
echo QC_WITH_LIBZZIP_INC=$QC_WITH_LIBZZIP_INC
|
||||||
echo QC_WITH_LIBZZIP_LIB=$QC_WITH_LIBZZIP_LIB
|
echo QC_WITH_LIBZZIP_LIB=$QC_WITH_LIBZZIP_LIB
|
||||||
@@ -367,70 +323,29 @@ public:
|
|||||||
/*
|
/*
|
||||||
-----BEGIN QCMOD-----
|
-----BEGIN QCMOD-----
|
||||||
name: libtorrent-rasterbar
|
name: libtorrent-rasterbar
|
||||||
arg: with-libtorrent-inc=[path], Path to libtorrent-rasterbar include files
|
|
||||||
arg: with-libtorrent-lib=[path], Path to libtorrent-rasterbar library files
|
|
||||||
arg: with-libtorrent-static-lib=[path], Path to libtorrent-rasterbar .a file
|
|
||||||
-----END QCMOD-----
|
-----END QCMOD-----
|
||||||
*/
|
*/
|
||||||
|
// see Conf::findPkgConfig
|
||||||
class qc_libtorrent_rasterbar : public ConfObj
|
class qc_libtorrent_rasterbar : public ConfObj
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {}
|
qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "libtorrent-rasterbar >= 0.13"; }
|
QString name() const { return "libtorrent-rasterbar >= 0.14.0 (>= 0.14.4 advised)"; }
|
||||||
QString shortname() const { return "libtorrent-rasterbar"; }
|
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/lsd.hpp")) {
|
QString version, libs, other;
|
||||||
return false;
|
VersionMode mode = VersionMin;
|
||||||
}
|
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, req_ver, &version, &incs, &libs, &other))
|
||||||
}else{
|
return false;
|
||||||
QStringList sl;
|
for(int n = 0; n < incs.count(); ++n)
|
||||||
sl << "/usr/include";
|
conf->addIncludePath(incs[n]);
|
||||||
sl << "/usr/local/include";
|
if(!libs.isEmpty())
|
||||||
bool found = false;
|
conf->addLib(libs);
|
||||||
foreach(s, sl){
|
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, adv_ver, &version, &incs, &libs, &other))
|
||||||
if(conf->checkHeader(s, "libtorrent/lsd.hpp")){
|
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());
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!found) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
conf->addIncludePath(s);
|
|
||||||
conf->addIncludePath(s+QDir::separator()+"libtorrent");
|
|
||||||
|
|
||||||
s = conf->getenv("QC_WITH_LIBTORRENT_STATIC_LIB");
|
|
||||||
if(!s.isEmpty() && QFile::exists(s) && s.endsWith(".a")){
|
|
||||||
conf->addLib(s);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
s = conf->getenv("QC_WITH_LIBTORRENT_LIB");
|
|
||||||
if(!s.isEmpty()) {
|
|
||||||
if(!conf->checkLibrary(s, "torrent-rasterbar")) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
conf->addLib(QString("-L") + s);
|
|
||||||
}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, "torrent-rasterbar")){
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!found) return false;
|
|
||||||
conf->addLib(QString("-L") + s);
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -553,86 +468,6 @@ public:
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#line 1 "libmagick.qcm"
|
|
||||||
/*
|
|
||||||
-----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);
|
|
||||||
QProcess magickConfig;
|
|
||||||
QStringList params;
|
|
||||||
params << "--libs";
|
|
||||||
magickConfig.start("Magick++-config", params, QIODevice::ReadOnly);
|
|
||||||
magickConfig.waitForStarted();
|
|
||||||
magickConfig.waitForFinished();
|
|
||||||
QByteArray result = magickConfig.readAll();
|
|
||||||
result = result.replace("\n", "");
|
|
||||||
conf->addLib(result.data());
|
|
||||||
conf->addDefine("HAVE_MAGICK");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
#line 1 "libzzip.qcm"
|
#line 1 "libzzip.qcm"
|
||||||
/*
|
/*
|
||||||
-----BEGIN QCMOD-----
|
-----BEGIN QCMOD-----
|
||||||
@@ -720,9 +555,6 @@ 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_libmagick(conf);
|
|
||||||
o->required = false;
|
|
||||||
o->disabled = false;
|
|
||||||
o = new qc_libzzip(conf);
|
o = new qc_libzzip(conf);
|
||||||
o->required = false;
|
o->required = false;
|
||||||
o->disabled = false;
|
o->disabled = false;
|
||||||
@@ -1671,15 +1503,9 @@ export PREFIX
|
|||||||
export BINDIR
|
export BINDIR
|
||||||
export DATADIR
|
export DATADIR
|
||||||
export EX_QTDIR
|
export EX_QTDIR
|
||||||
export QC_WITH_LIBTORRENT_INC
|
|
||||||
export QC_WITH_LIBTORRENT_LIB
|
|
||||||
export QC_WITH_LIBTORRENT_STATIC_LIB
|
|
||||||
export QC_WITH_LIBBOOST_INC
|
export QC_WITH_LIBBOOST_INC
|
||||||
export QC_WITH_LIBCURL_INC
|
export QC_WITH_LIBCURL_INC
|
||||||
export QC_WITH_LIBCURL_LIB
|
export QC_WITH_LIBCURL_LIB
|
||||||
export QC_DISABLE_libmagick
|
|
||||||
export QC_WITH_LIBMAGICK_INC
|
|
||||||
export QC_WITH_LIBMAGICK_LIB
|
|
||||||
export QC_DISABLE_libzzip
|
export QC_DISABLE_libzzip
|
||||||
export QC_WITH_LIBZZIP_INC
|
export QC_WITH_LIBZZIP_INC
|
||||||
export QC_WITH_LIBZZIP_LIB
|
export QC_WITH_LIBZZIP_LIB
|
||||||
|
|||||||
@@ -15,6 +15,5 @@
|
|||||||
<dep type='libcurl'>
|
<dep type='libcurl'>
|
||||||
<required/>
|
<required/>
|
||||||
</dep>
|
</dep>
|
||||||
<dep type='libmagick'/>
|
|
||||||
<dep type='libzzip'/>
|
<dep type='libzzip'/>
|
||||||
</qconf>
|
</qconf>
|
||||||
|
|||||||
@@ -1,65 +0,0 @@
|
|||||||
/*
|
|
||||||
-----BEGIN QCMOD-----
|
|
||||||
name: libcommoncpp2
|
|
||||||
arg: with-libcommoncpp2-inc=[path], Path to libcommoncpp2 include files
|
|
||||||
arg: with-libcommoncpp2-lib=[path], Path to libcommoncpp2 library files
|
|
||||||
-----END QCMOD-----
|
|
||||||
*/
|
|
||||||
class qc_libcommoncpp2 : public ConfObj
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
qc_libcommoncpp2(Conf *c) : ConfObj(c) {}
|
|
||||||
QString name() const { return "GNU Common C++ library (libcommoncpp2)"; }
|
|
||||||
QString shortname() const { return "libcommoncpp2"; }
|
|
||||||
bool exec(){
|
|
||||||
QString s;
|
|
||||||
s = conf->getenv("QC_WITH_LIBCOMMONCPP2_INC");
|
|
||||||
if(!s.isEmpty()) {
|
|
||||||
if(!conf->checkHeader(s, "cc++/url.h")) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
QStringList sl;
|
|
||||||
sl << "/usr/include";
|
|
||||||
sl << "/usr/local/include";
|
|
||||||
bool found = false;
|
|
||||||
foreach(s, sl){
|
|
||||||
if(conf->checkHeader(s, "cc++/url.h")){
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!found) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
conf->addIncludePath(s);
|
|
||||||
|
|
||||||
s = conf->getenv("QC_WITH_LIBCOMMONCPP2_LIB");
|
|
||||||
if(!s.isEmpty()) {
|
|
||||||
if(!QFile::exists(s+QString("/libccext2.so")))
|
|
||||||
return false;
|
|
||||||
if(!QFile::exists(s+QString("/libccgnu2.so")))
|
|
||||||
return false;
|
|
||||||
conf->addLib(QString("-L") + s);
|
|
||||||
}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("libccext2.so"))){
|
|
||||||
if(QFile::exists(s+QString("libccgnu2.so"))){
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!found) return false;
|
|
||||||
conf->addLib(QString("-L") + s);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -64,14 +64,11 @@ public:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
conf->addLib(QString("-L") + s);
|
conf->addLib(QString("-L") + s);
|
||||||
QProcess magickConfig;
|
QString out = "";
|
||||||
QStringList params;
|
QStringList params;
|
||||||
params << "--libs";
|
params << "--libs";
|
||||||
magickConfig.start("Magick++-config", params, QIODevice::ReadOnly);
|
qconf->doCommand("Magick++-config", params, &out);
|
||||||
magickConfig.waitForStarted();
|
out = out.replace("\n", "");
|
||||||
magickConfig.waitForFinished();
|
|
||||||
QByteArray result = magickConfig.readAll();
|
|
||||||
result = result.replace("\n", "");
|
|
||||||
conf->addLib(result.data());
|
conf->addLib(result.data());
|
||||||
conf->addDefine("HAVE_MAGICK");
|
conf->addDefine("HAVE_MAGICK");
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -1,70 +1,29 @@
|
|||||||
/*
|
/*
|
||||||
-----BEGIN QCMOD-----
|
-----BEGIN QCMOD-----
|
||||||
name: libtorrent-rasterbar
|
name: libtorrent-rasterbar
|
||||||
arg: with-libtorrent-inc=[path], Path to libtorrent-rasterbar include files
|
|
||||||
arg: with-libtorrent-lib=[path], Path to libtorrent-rasterbar library files
|
|
||||||
arg: with-libtorrent-static-lib=[path], Path to libtorrent-rasterbar .a file
|
|
||||||
-----END QCMOD-----
|
-----END QCMOD-----
|
||||||
*/
|
*/
|
||||||
|
// see Conf::findPkgConfig
|
||||||
class qc_libtorrent_rasterbar : public ConfObj
|
class qc_libtorrent_rasterbar : public ConfObj
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {}
|
qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "libtorrent-rasterbar >= 0.13"; }
|
QString name() const { return "libtorrent-rasterbar >= 0.14.0 (>= 0.14.4 advised)"; }
|
||||||
QString shortname() const { return "libtorrent-rasterbar"; }
|
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/lsd.hpp")) {
|
QString version, libs, other;
|
||||||
return false;
|
VersionMode mode = VersionMin;
|
||||||
}
|
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, req_ver, &version, &incs, &libs, &other))
|
||||||
}else{
|
return false;
|
||||||
QStringList sl;
|
for(int n = 0; n < incs.count(); ++n)
|
||||||
sl << "/usr/include";
|
conf->addIncludePath(incs[n]);
|
||||||
sl << "/usr/local/include";
|
if(!libs.isEmpty())
|
||||||
bool found = false;
|
conf->addLib(libs);
|
||||||
foreach(s, sl){
|
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, adv_ver, &version, &incs, &libs, &other))
|
||||||
if(conf->checkHeader(s, "libtorrent/lsd.hpp")){
|
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());
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!found) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
conf->addIncludePath(s);
|
|
||||||
conf->addIncludePath(s+QDir::separator()+"libtorrent");
|
|
||||||
|
|
||||||
s = conf->getenv("QC_WITH_LIBTORRENT_STATIC_LIB");
|
|
||||||
if(!s.isEmpty() && QFile::exists(s) && s.endsWith(".a")){
|
|
||||||
conf->addLib(s);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
s = conf->getenv("QC_WITH_LIBTORRENT_LIB");
|
|
||||||
if(!s.isEmpty()) {
|
|
||||||
if(!conf->checkLibrary(s, "torrent-rasterbar")) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
conf->addLib(QString("-L") + s);
|
|
||||||
}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, "torrent-rasterbar")){
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!found) return false;
|
|
||||||
conf->addLib(QString("-L") + s);
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -16,6 +16,15 @@
|
|||||||
* 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
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -40,7 +49,8 @@
|
|||||||
#define SEEDSLEECH 5
|
#define SEEDSLEECH 5
|
||||||
#define RATIO 6
|
#define RATIO 6
|
||||||
#define ETA 7
|
#define ETA 7
|
||||||
#define HASH 8
|
#define PRIORITY 8
|
||||||
|
#define HASH 9
|
||||||
|
|
||||||
class DLListDelegate: public QItemDelegate {
|
class DLListDelegate: public QItemDelegate {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@@ -71,7 +81,10 @@ class DLListDelegate: public QItemDelegate {
|
|||||||
case RATIO:{
|
case RATIO:{
|
||||||
QItemDelegate::drawBackground(painter, opt, index);
|
QItemDelegate::drawBackground(painter, opt, index);
|
||||||
double ratio = index.data().toDouble();
|
double ratio = index.data().toDouble();
|
||||||
QItemDelegate::drawDisplay(painter, opt, opt.rect, QString(QByteArray::number(ratio, 'f', 1)));
|
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:{
|
||||||
|
|||||||
@@ -16,6 +16,15 @@
|
|||||||
* 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
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -35,9 +44,13 @@
|
|||||||
#define F_NAME 0
|
#define F_NAME 0
|
||||||
#define F_SIZE 1
|
#define F_SIZE 1
|
||||||
#define F_UPSPEED 2
|
#define F_UPSPEED 2
|
||||||
#define F_LEECH 3
|
#define F_SWARM 3
|
||||||
#define F_RATIO 4
|
#define F_PEERS 4
|
||||||
#define F_HASH 5
|
#define F_UPLOAD 5
|
||||||
|
#define F_RATIO 6
|
||||||
|
#define F_HASH 7
|
||||||
|
|
||||||
|
#define MAX_RATIO 100.
|
||||||
|
|
||||||
class FinishedListDelegate: public QItemDelegate {
|
class FinishedListDelegate: public QItemDelegate {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@@ -51,6 +64,7 @@ class FinishedListDelegate: public QItemDelegate {
|
|||||||
QStyleOptionViewItemV2 opt = QItemDelegate::setOptions(index, option);
|
QStyleOptionViewItemV2 opt = QItemDelegate::setOptions(index, option);
|
||||||
switch(index.column()){
|
switch(index.column()){
|
||||||
case F_SIZE:
|
case F_SIZE:
|
||||||
|
case F_UPLOAD:
|
||||||
QItemDelegate::drawBackground(painter, opt, index);
|
QItemDelegate::drawBackground(painter, opt, index);
|
||||||
QItemDelegate::drawDisplay(painter, opt, option.rect, misc::friendlyUnit(index.data().toLongLong()));
|
QItemDelegate::drawDisplay(painter, opt, option.rect, misc::friendlyUnit(index.data().toLongLong()));
|
||||||
break;
|
break;
|
||||||
@@ -63,7 +77,10 @@ class FinishedListDelegate: public QItemDelegate {
|
|||||||
case F_RATIO:{
|
case F_RATIO:{
|
||||||
QItemDelegate::drawBackground(painter, opt, index);
|
QItemDelegate::drawBackground(painter, opt, index);
|
||||||
double ratio = index.data().toDouble();
|
double ratio = index.data().toDouble();
|
||||||
QItemDelegate::drawDisplay(painter, opt, opt.rect, QString(QByteArray::number(ratio, 'f', 1)));
|
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;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -16,6 +16,15 @@
|
|||||||
* 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
|
||||||
*/
|
*/
|
||||||
#include "FinishedTorrents.h"
|
#include "FinishedTorrents.h"
|
||||||
@@ -37,14 +46,17 @@ FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : par
|
|||||||
setupUi(this);
|
setupUi(this);
|
||||||
actionStart->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/play.png")));
|
actionStart->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/play.png")));
|
||||||
actionPause->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/pause.png")));
|
actionPause->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/pause.png")));
|
||||||
connect(BTSession, SIGNAL(addedTorrent(QString, QTorrentHandle&, bool)), this, SLOT(torrentAdded(QString, QTorrentHandle&, bool)));
|
finishedListModel = new QStandardItemModel(0,8);
|
||||||
finishedListModel = new QStandardItemModel(0,6);
|
|
||||||
finishedListModel->setHeaderData(F_NAME, Qt::Horizontal, tr("Name", "i.e: file name"));
|
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_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_UPSPEED, Qt::Horizontal, tr("UP Speed", "i.e: Upload speed"));
|
||||||
finishedListModel->setHeaderData(F_LEECH, Qt::Horizontal, tr("Leechers", "i.e: full/partial sources"));
|
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"));
|
finishedListModel->setHeaderData(F_RATIO, Qt::Horizontal, tr("Ratio"));
|
||||||
finishedList->setModel(finishedListModel);
|
finishedList->setModel(finishedListModel);
|
||||||
|
finishedList->setRootIsDecorated(false);
|
||||||
|
finishedList->setAllColumnsShowFocus(true);
|
||||||
loadHiddenColumns();
|
loadHiddenColumns();
|
||||||
// Hide hash column
|
// Hide hash column
|
||||||
finishedList->hideColumn(F_HASH);
|
finishedList->hideColumn(F_HASH);
|
||||||
@@ -55,13 +67,12 @@ FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : par
|
|||||||
// Make download list header clickable for sorting
|
// Make download list header clickable for sorting
|
||||||
finishedList->header()->setClickable(true);
|
finishedList->header()->setClickable(true);
|
||||||
finishedList->header()->setSortIndicatorShown(true);
|
finishedList->header()->setSortIndicatorShown(true);
|
||||||
connect(finishedList->header(), SIGNAL(sectionPressed(int)), this, SLOT(sortFinishedList(int)));
|
connect(finishedList->header(), SIGNAL(sectionPressed(int)), this, SLOT(toggleFinishedListSortOrder(int)));
|
||||||
finishedListDelegate = new FinishedListDelegate(finishedList);
|
finishedListDelegate = new FinishedListDelegate(finishedList);
|
||||||
finishedList->setItemDelegate(finishedListDelegate);
|
finishedList->setItemDelegate(finishedListDelegate);
|
||||||
connect(finishedList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFinishedListMenu(const QPoint&)));
|
connect(finishedList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFinishedListMenu(const QPoint&)));
|
||||||
finishedList->header()->setContextMenuPolicy(Qt::CustomContextMenu);
|
finishedList->header()->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||||
connect(finishedList->header(), SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFinishedHoSMenu(const QPoint&)));
|
connect(finishedList->header(), SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFinishedHoSMenu(const QPoint&)));
|
||||||
|
|
||||||
connect(finishedList, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(notifyTorrentDoubleClicked(const QModelIndex&)));
|
connect(finishedList, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(notifyTorrentDoubleClicked(const QModelIndex&)));
|
||||||
actionDelete->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete.png")));
|
actionDelete->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete.png")));
|
||||||
actionPreview_file->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/preview.png")));
|
actionPreview_file->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/preview.png")));
|
||||||
@@ -76,11 +87,14 @@ FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : par
|
|||||||
connect(actionOpen_destination_folder, SIGNAL(triggered()), (GUI*)parent, SLOT(openDestinationFolder()));
|
connect(actionOpen_destination_folder, SIGNAL(triggered()), (GUI*)parent, SLOT(openDestinationFolder()));
|
||||||
connect(actionBuy_it, SIGNAL(triggered()), (GUI*)parent, SLOT(goBuyPage()));
|
connect(actionBuy_it, SIGNAL(triggered()), (GUI*)parent, SLOT(goBuyPage()));
|
||||||
connect(actionTorrent_Properties, SIGNAL(triggered()), this, SLOT(propertiesSelection()));
|
connect(actionTorrent_Properties, SIGNAL(triggered()), this, SLOT(propertiesSelection()));
|
||||||
|
connect(actionForce_recheck, SIGNAL(triggered()), this, SLOT(forceRecheck()));
|
||||||
|
|
||||||
connect(actionHOSColName, SIGNAL(triggered()), this, SLOT(hideOrShowColumnName()));
|
connect(actionHOSColName, SIGNAL(triggered()), this, SLOT(hideOrShowColumnName()));
|
||||||
connect(actionHOSColSize, SIGNAL(triggered()), this, SLOT(hideOrShowColumnSize()));
|
connect(actionHOSColSize, SIGNAL(triggered()), this, SLOT(hideOrShowColumnSize()));
|
||||||
connect(actionHOSColUpSpeed, SIGNAL(triggered()), this, SLOT(hideOrShowColumnUpSpeed()));
|
connect(actionHOSColUpSpeed, SIGNAL(triggered()), this, SLOT(hideOrShowColumnUpSpeed()));
|
||||||
connect(actionHOSColLeechers, SIGNAL(triggered()), this, SLOT(hideOrShowColumnLeechers()));
|
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()));
|
connect(actionHOSColRatio, SIGNAL(triggered()), this, SLOT(hideOrShowColumnRatio()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,9 +112,6 @@ void FinishedTorrents::notifyTorrentDoubleClicked(const QModelIndex& index) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void FinishedTorrents::addTorrent(QString hash){
|
void FinishedTorrents::addTorrent(QString hash){
|
||||||
if(!BTSession->isFinished(hash)){
|
|
||||||
BTSession->setFinishedTorrent(hash);
|
|
||||||
}
|
|
||||||
int row = getRowFromHash(hash);
|
int row = getRowFromHash(hash);
|
||||||
if(row != -1) return;
|
if(row != -1) return;
|
||||||
row = finishedListModel->rowCount();
|
row = finishedListModel->rowCount();
|
||||||
@@ -110,7 +121,9 @@ void FinishedTorrents::addTorrent(QString hash){
|
|||||||
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(h.name()));
|
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_SIZE), QVariant((qlonglong)h.actual_size()));
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), QVariant((double)0.));
|
finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), QVariant((double)0.));
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_LEECH), QVariant("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_RATIO), QVariant(QString::fromUtf8(misc::toString(BTSession->getRealRatio(hash)).c_str())));
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_HASH), QVariant(hash));
|
finishedListModel->setData(finishedListModel->index(row, F_HASH), QVariant(hash));
|
||||||
if(h.is_paused()) {
|
if(h.is_paused()) {
|
||||||
@@ -123,13 +136,8 @@ void FinishedTorrents::addTorrent(QString hash){
|
|||||||
// Update the number of finished torrents
|
// Update the number of finished torrents
|
||||||
++nbFinished;
|
++nbFinished;
|
||||||
emit finishedTorrentsNumberChanged(nbFinished);
|
emit finishedTorrentsNumberChanged(nbFinished);
|
||||||
}
|
// Sort List
|
||||||
|
sortFinishedList();
|
||||||
void FinishedTorrents::torrentAdded(QString, QTorrentHandle& h, bool) {
|
|
||||||
QString hash = h.hash();
|
|
||||||
if(BTSession->isFinished(hash)) {
|
|
||||||
addTorrent(hash);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the color of a row in data model
|
// Set the color of a row in data model
|
||||||
@@ -142,9 +150,8 @@ void FinishedTorrents::setRowColor(int row, QString color){
|
|||||||
|
|
||||||
QStringList FinishedTorrents::getSelectedTorrents(bool only_one) const{
|
QStringList FinishedTorrents::getSelectedTorrents(bool only_one) const{
|
||||||
QStringList res;
|
QStringList res;
|
||||||
QModelIndex index;
|
|
||||||
QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes();
|
QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes();
|
||||||
foreach(index, selectedIndexes) {
|
foreach(const QModelIndex &index, selectedIndexes) {
|
||||||
if(index.column() == F_NAME) {
|
if(index.column() == F_NAME) {
|
||||||
// Get the file hash
|
// Get the file hash
|
||||||
QString hash = finishedListModel->data(finishedListModel->index(index.row(), F_HASH)).toString();
|
QString hash = finishedListModel->data(finishedListModel->index(index.row(), F_HASH)).toString();
|
||||||
@@ -174,10 +181,44 @@ bool FinishedTorrents::loadColWidthFinishedList(){
|
|||||||
for(unsigned int i=0; i<listSize; ++i){
|
for(unsigned int i=0; i<listSize; ++i){
|
||||||
finishedList->header()->resizeSection(i, width_list.at(i).toInt());
|
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");
|
qDebug("Finished list columns width loaded");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
sortFinishedList(index, sortOrder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Save columns width in a file to remember them
|
// Save columns width in a file to remember them
|
||||||
// (finished list)
|
// (finished list)
|
||||||
void FinishedTorrents::saveColWidthFinishedList() const{
|
void FinishedTorrents::saveColWidthFinishedList() const{
|
||||||
@@ -192,7 +233,7 @@ void FinishedTorrents::saveColWidthFinishedList() const{
|
|||||||
width_list = line.split(' ');
|
width_list = line.split(' ');
|
||||||
}
|
}
|
||||||
for(short i=0; i<nbColumns; ++i){
|
for(short i=0; i<nbColumns; ++i){
|
||||||
if(finishedList->columnWidth(i)<1 && width_list.size() == finishedListModel->columnCount()-1 && width_list.at(i).toInt()>=1) {
|
if(finishedList->columnWidth(i)<1 && width_list.size() == nbColumns && width_list.at(i).toInt()>=1) {
|
||||||
// load the former width
|
// load the former width
|
||||||
new_width_list << width_list.at(i);
|
new_width_list << width_list.at(i);
|
||||||
} else if(finishedList->columnWidth(i)>=1) {
|
} else if(finishedList->columnWidth(i)>=1) {
|
||||||
@@ -205,14 +246,18 @@ void FinishedTorrents::saveColWidthFinishedList() const{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
settings.setValue("FinishedListColsWidth", new_width_list.join(" "));
|
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");
|
qDebug("Finished list columns width saved");
|
||||||
}
|
}
|
||||||
|
|
||||||
void FinishedTorrents::on_actionSet_upload_limit_triggered(){
|
void FinishedTorrents::on_actionSet_upload_limit_triggered(){
|
||||||
QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes();
|
QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes();
|
||||||
QModelIndex index;
|
|
||||||
QStringList hashes;
|
QStringList hashes;
|
||||||
foreach(index, selectedIndexes){
|
foreach(const QModelIndex &index, selectedIndexes){
|
||||||
if(index.column() == F_NAME){
|
if(index.column() == F_NAME){
|
||||||
// Get the file hash
|
// Get the file hash
|
||||||
hashes << finishedListModel->data(finishedListModel->index(index.row(), F_HASH)).toString();
|
hashes << finishedListModel->data(finishedListModel->index(index.row(), F_HASH)).toString();
|
||||||
@@ -221,15 +266,8 @@ void FinishedTorrents::on_actionSet_upload_limit_triggered(){
|
|||||||
new BandwidthAllocationDialog(this, true, BTSession, hashes);
|
new BandwidthAllocationDialog(this, true, BTSession, hashes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FinishedTorrents::updateFinishedList(){
|
void FinishedTorrents::updateTorrent(QTorrentHandle h) {
|
||||||
QString hash;
|
QString hash = h.hash();
|
||||||
QStringList finishedSHAs = BTSession->getFinishedTorrents();
|
|
||||||
foreach(hash, finishedSHAs){
|
|
||||||
QTorrentHandle h = BTSession->getTorrentHandle(hash);
|
|
||||||
if(!h.is_valid()){
|
|
||||||
qDebug("Problem: This torrent is not valid in finished list");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
int row = getRowFromHash(hash);
|
int row = getRowFromHash(hash);
|
||||||
if(row == -1){
|
if(row == -1){
|
||||||
qDebug("Cannot find torrent in finished list, adding it");
|
qDebug("Cannot find torrent in finished list, adding it");
|
||||||
@@ -237,42 +275,42 @@ void FinishedTorrents::updateFinishedList(){
|
|||||||
row = getRowFromHash(hash);
|
row = getRowFromHash(hash);
|
||||||
}
|
}
|
||||||
Q_ASSERT(row != -1);
|
Q_ASSERT(row != -1);
|
||||||
if(h.is_paused()) continue;
|
if(!finishedList->isColumnHidden(F_SWARM)) {
|
||||||
if(BTSession->getTorrentsToPauseAfterChecking().indexOf(hash) != -1) {
|
finishedListModel->setData(finishedListModel->index(row, F_SWARM), misc::toQString(h.num_complete())+QString("/")+misc::toQString(h.num_incomplete()));
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
if(h.state() == torrent_status::downloading || (h.state() != torrent_status::checking_files && h.state() != torrent_status::queued_for_checking && h.progress() < 1.)) {
|
if(h.is_paused()) return;
|
||||||
// What are you doing here? go back to download tab!
|
// Update queued torrent
|
||||||
int reponse = QMessageBox::question(this, tr("Incomplete torrent in seeding list"), tr("It appears that the state of '%1' torrent changed from 'seeding' to 'downloading'. Would you like to move it back to download list? (otherwise the torrent will simply be deleted)").arg(h.name()), QMessageBox::Yes | QMessageBox::No);
|
if(BTSession->isQueueingEnabled() && h.is_queued()) {
|
||||||
if (reponse == QMessageBox::Yes) {
|
if(h.state() == torrent_status::checking_files || h.state() == torrent_status::queued_for_checking){
|
||||||
qDebug("Info: a torrent was moved from finished to download tab");
|
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/time.png"))), Qt::DecorationRole);
|
||||||
deleteTorrent(hash);
|
} else {
|
||||||
BTSession->setFinishedTorrent(hash);
|
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/queued.png"))), Qt::DecorationRole);
|
||||||
emit torrentMovedFromFinishedList(hash);
|
}
|
||||||
}
|
// Reset upload speed and seeds/leech
|
||||||
else if (reponse == QMessageBox::No) {
|
finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), 0.);
|
||||||
qDebug("Deleted from the finished");
|
finishedListModel->setData(finishedListModel->index(row, F_PEERS), "0");
|
||||||
BTSession->deleteTorrent(hash, true);
|
setRowColor(row, QString::fromUtf8("grey"));
|
||||||
}
|
return;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
if(h.state() == torrent_status::checking_files){
|
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/time.png"))), Qt::DecorationRole);
|
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/time.png"))), Qt::DecorationRole);
|
||||||
setRowColor(row, QString::fromUtf8("grey"));
|
setRowColor(row, QString::fromUtf8("grey"));
|
||||||
continue;
|
return;
|
||||||
}
|
}
|
||||||
setRowColor(row, QString::fromUtf8("orange"));
|
setRowColor(row, QString::fromUtf8("orange"));
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png"))), Qt::DecorationRole);
|
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png"))), Qt::DecorationRole);
|
||||||
if(!finishedList->isColumnHidden(F_UPSPEED)) {
|
if(!finishedList->isColumnHidden(F_UPSPEED)) {
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), QVariant((double)h.upload_payload_rate()));
|
finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), QVariant((double)h.upload_payload_rate()));
|
||||||
}
|
}
|
||||||
if(!finishedList->isColumnHidden(F_LEECH)) {
|
if(!finishedList->isColumnHidden(F_PEERS)) {
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_LEECH), misc::toQString(h.num_peers() - h.num_seeds(), true));
|
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)) {
|
if(!finishedList->isColumnHidden(F_RATIO)) {
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_RATIO), QVariant(misc::toQString(BTSession->getRealRatio(hash))));
|
finishedListModel->setData(finishedListModel->index(row, F_RATIO), QVariant(misc::toQString(BTSession->getRealRatio(hash))));
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int FinishedTorrents::getRowFromHash(QString hash) const{
|
int FinishedTorrents::getRowFromHash(QString hash) const{
|
||||||
@@ -292,17 +330,10 @@ void FinishedTorrents::pauseTorrent(QString hash) {
|
|||||||
return;
|
return;
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), QVariant((double)0.0));
|
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_NAME), QIcon(QString::fromUtf8(":/Icons/skin/paused.png")), Qt::DecorationRole);
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_LEECH), QVariant(QString::fromUtf8("0")));
|
finishedListModel->setData(finishedListModel->index(row, F_PEERS), QVariant(QString::fromUtf8("0")));
|
||||||
setRowColor(row, QString::fromUtf8("red"));
|
setRowColor(row, QString::fromUtf8("red"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void FinishedTorrents::resumeTorrent(QString hash) {
|
|
||||||
int row = getRowFromHash(hash);
|
|
||||||
Q_ASSERT(row != -1);
|
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png"))), Qt::DecorationRole);
|
|
||||||
setRowColor(row, QString::fromUtf8("orange"));
|
|
||||||
}
|
|
||||||
|
|
||||||
QString FinishedTorrents::getHashFromRow(unsigned int row) const {
|
QString FinishedTorrents::getHashFromRow(unsigned int row) const {
|
||||||
Q_ASSERT(row < (unsigned int)finishedListModel->rowCount());
|
Q_ASSERT(row < (unsigned int)finishedListModel->rowCount());
|
||||||
return finishedListModel->data(finishedListModel->index(row, F_HASH)).toString();
|
return finishedListModel->data(finishedListModel->index(row, F_HASH)).toString();
|
||||||
@@ -342,21 +373,31 @@ void FinishedTorrents::updateFileSize(QString hash){
|
|||||||
// display properties of selected items
|
// display properties of selected items
|
||||||
void FinishedTorrents::propertiesSelection(){
|
void FinishedTorrents::propertiesSelection(){
|
||||||
QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes();
|
QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes();
|
||||||
QModelIndex index;
|
foreach(const QModelIndex &index, selectedIndexes){
|
||||||
foreach(index, selectedIndexes){
|
|
||||||
if(index.column() == F_NAME){
|
if(index.column() == F_NAME){
|
||||||
showProperties(index);
|
showProperties(index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FinishedTorrents::displayFinishedListMenu(const QPoint& pos){
|
void FinishedTorrents::forceRecheck(){
|
||||||
|
QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes();
|
||||||
|
foreach(const QModelIndex &index, selectedIndexes){
|
||||||
|
if(index.column() == F_NAME){
|
||||||
|
QString hash = finishedListModel->data(finishedListModel->index(index.row(), F_HASH)).toString();
|
||||||
|
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);
|
QMenu myFinishedListMenu(this);
|
||||||
QModelIndex index;
|
|
||||||
// Enable/disable pause/start action given the DL state
|
// Enable/disable pause/start action given the DL state
|
||||||
QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes();
|
QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes();
|
||||||
bool has_pause = false, has_start = false, has_preview = false;
|
bool has_pause = false, has_start = false, has_preview = false;
|
||||||
foreach(index, selectedIndexes) {
|
foreach(const QModelIndex &index, selectedIndexes) {
|
||||||
if(index.column() == F_NAME) {
|
if(index.column() == F_NAME) {
|
||||||
// Get the file name
|
// Get the file name
|
||||||
QString hash = finishedListModel->data(finishedListModel->index(index.row(), F_HASH)).toString();
|
QString hash = finishedListModel->data(finishedListModel->index(index.row(), F_HASH)).toString();
|
||||||
@@ -387,14 +428,15 @@ void FinishedTorrents::displayFinishedListMenu(const QPoint& pos){
|
|||||||
myFinishedListMenu.addSeparator();
|
myFinishedListMenu.addSeparator();
|
||||||
myFinishedListMenu.addAction(actionSet_upload_limit);
|
myFinishedListMenu.addAction(actionSet_upload_limit);
|
||||||
myFinishedListMenu.addSeparator();
|
myFinishedListMenu.addSeparator();
|
||||||
|
myFinishedListMenu.addAction(actionForce_recheck);
|
||||||
|
myFinishedListMenu.addSeparator();
|
||||||
myFinishedListMenu.addAction(actionOpen_destination_folder);
|
myFinishedListMenu.addAction(actionOpen_destination_folder);
|
||||||
myFinishedListMenu.addAction(actionTorrent_Properties);
|
myFinishedListMenu.addAction(actionTorrent_Properties);
|
||||||
myFinishedListMenu.addSeparator();
|
myFinishedListMenu.addSeparator();
|
||||||
myFinishedListMenu.addAction(actionBuy_it);
|
myFinishedListMenu.addAction(actionBuy_it);
|
||||||
|
|
||||||
// Call menu
|
// Call menu
|
||||||
// XXX: why mapToGlobal() is not enough?
|
myFinishedListMenu.exec(QCursor::pos());
|
||||||
myFinishedListMenu.exec(mapToGlobal(pos)+QPoint(10,59));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -406,11 +448,12 @@ void FinishedTorrents::displayFinishedListMenu(const QPoint& pos){
|
|||||||
void FinishedTorrents::displayFinishedHoSMenu(const QPoint& pos){
|
void FinishedTorrents::displayFinishedHoSMenu(const QPoint& pos){
|
||||||
QMenu hideshowColumn(this);
|
QMenu hideshowColumn(this);
|
||||||
hideshowColumn.setTitle(tr("Hide or Show Column"));
|
hideshowColumn.setTitle(tr("Hide or Show Column"));
|
||||||
for(int i=0; i<=F_RATIO; i++) {
|
int lastCol = F_RATIO;
|
||||||
|
for(int i=0; i<=lastCol; i++) {
|
||||||
hideshowColumn.addAction(getActionHoSCol(i));
|
hideshowColumn.addAction(getActionHoSCol(i));
|
||||||
}
|
}
|
||||||
// Call menu
|
// Call menu
|
||||||
hideshowColumn.exec(mapToGlobal(pos)+QPoint(10,32));
|
hideshowColumn.exec(mapToGlobal(pos)+QPoint(10,34));
|
||||||
}
|
}
|
||||||
|
|
||||||
// toggle hide/show a column
|
// toggle hide/show a column
|
||||||
@@ -428,12 +471,12 @@ void FinishedTorrents::hideOrShowColumn(int index) {
|
|||||||
if(nbVisibleColumns <= 1) return;
|
if(nbVisibleColumns <= 1) return;
|
||||||
// User can hide the column, do it.
|
// User can hide the column, do it.
|
||||||
finishedList->setColumnHidden(index, true);
|
finishedList->setColumnHidden(index, true);
|
||||||
getActionHoSCol(index)->setIcon(QIcon(QString::fromUtf8(":/Icons/button_cancel.png")));
|
getActionHoSCol(index)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_cancel.png")));
|
||||||
--nbVisibleColumns;
|
--nbVisibleColumns;
|
||||||
} else {
|
} else {
|
||||||
// User want to display the column
|
// User want to display the column
|
||||||
finishedList->setColumnHidden(index, false);
|
finishedList->setColumnHidden(index, false);
|
||||||
getActionHoSCol(index)->setIcon(QIcon(QString::fromUtf8(":/Icons/button_ok.png")));
|
getActionHoSCol(index)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_ok.png")));
|
||||||
++nbVisibleColumns;
|
++nbVisibleColumns;
|
||||||
}
|
}
|
||||||
//resize all others non-hidden columns
|
//resize all others non-hidden columns
|
||||||
@@ -456,8 +499,16 @@ void FinishedTorrents::hideOrShowColumnUpSpeed() {
|
|||||||
hideOrShowColumn(F_UPSPEED);
|
hideOrShowColumn(F_UPSPEED);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FinishedTorrents::hideOrShowColumnLeechers() {
|
void FinishedTorrents::hideOrShowColumnSwarm() {
|
||||||
hideOrShowColumn(F_LEECH);
|
hideOrShowColumn(F_SWARM);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FinishedTorrents::hideOrShowColumnPeers() {
|
||||||
|
hideOrShowColumn(F_PEERS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FinishedTorrents::hideOrShowColumnUpload() {
|
||||||
|
hideOrShowColumn(F_UPLOAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FinishedTorrents::hideOrShowColumnRatio() {
|
void FinishedTorrents::hideOrShowColumnRatio() {
|
||||||
@@ -483,9 +534,9 @@ bool FinishedTorrents::loadHiddenColumns() {
|
|||||||
for(int i=0; i<finishedListModel->columnCount()-1; i++) {
|
for(int i=0; i<finishedListModel->columnCount()-1; i++) {
|
||||||
if(loaded && ishidden_list.at(i) == "0") {
|
if(loaded && ishidden_list.at(i) == "0") {
|
||||||
finishedList->setColumnHidden(i, true);
|
finishedList->setColumnHidden(i, true);
|
||||||
getActionHoSCol(i)->setIcon(QIcon(QString::fromUtf8(":/Icons/button_cancel.png")));
|
getActionHoSCol(i)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_cancel.png")));
|
||||||
} else {
|
} else {
|
||||||
getActionHoSCol(i)->setIcon(QIcon(QString::fromUtf8(":/Icons/button_ok.png")));
|
getActionHoSCol(i)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_ok.png")));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return loaded;
|
return loaded;
|
||||||
@@ -519,8 +570,14 @@ QAction* FinishedTorrents::getActionHoSCol(int index) {
|
|||||||
case F_UPSPEED :
|
case F_UPSPEED :
|
||||||
return actionHOSColUpSpeed;
|
return actionHOSColUpSpeed;
|
||||||
break;
|
break;
|
||||||
case F_LEECH :
|
case F_SWARM :
|
||||||
return actionHOSColLeechers;
|
return actionHOSColSwarm;
|
||||||
|
break;
|
||||||
|
case F_PEERS :
|
||||||
|
return actionHOSColPeers;
|
||||||
|
break;
|
||||||
|
case F_UPLOAD :
|
||||||
|
return actionHOSColUpload;
|
||||||
break;
|
break;
|
||||||
case F_RATIO :
|
case F_RATIO :
|
||||||
return actionHOSColRatio;
|
return actionHOSColRatio;
|
||||||
@@ -535,19 +592,42 @@ QAction* FinishedTorrents::getActionHoSCol(int index) {
|
|||||||
* Sorting functions
|
* Sorting functions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void FinishedTorrents::sortFinishedList(int index){
|
void FinishedTorrents::toggleFinishedListSortOrder(int index) {
|
||||||
static Qt::SortOrder sortOrder = Qt::AscendingOrder;
|
Qt::SortOrder sortOrder = Qt::AscendingOrder;
|
||||||
if(finishedList->header()->sortIndicatorSection() == index){
|
if(finishedList->header()->sortIndicatorSection() == index){
|
||||||
if(sortOrder == Qt::AscendingOrder){
|
sortOrder = (Qt::SortOrder)!(bool)finishedList->header()->sortIndicatorOrder();
|
||||||
sortOrder = Qt::DescendingOrder;
|
|
||||||
}else{
|
|
||||||
sortOrder = Qt::AscendingOrder;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
finishedList->header()->setSortIndicator(index, sortOrder);
|
switch(index) {
|
||||||
switch(index){
|
|
||||||
case F_SIZE:
|
case F_SIZE:
|
||||||
case F_UPSPEED:
|
case F_UPSPEED:
|
||||||
|
case F_RATIO:
|
||||||
|
case F_UPLOAD:
|
||||||
|
sortFinishedListFloat(index, sortOrder);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sortFinishedListString(index, sortOrder);
|
||||||
|
}
|
||||||
|
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||||
|
QString sortOrderLetter;
|
||||||
|
if(sortOrder == Qt::AscendingOrder)
|
||||||
|
sortOrderLetter = QString::fromUtf8("a");
|
||||||
|
else
|
||||||
|
sortOrderLetter = QString::fromUtf8("d");
|
||||||
|
settings.setValue(QString::fromUtf8("FinishedListSortedCol"), misc::toQString(index)+sortOrderLetter);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FinishedTorrents::sortFinishedList(int index, Qt::SortOrder sortOrder){
|
||||||
|
if(index == -1) {
|
||||||
|
index = finishedList->header()->sortIndicatorSection();
|
||||||
|
sortOrder = finishedList->header()->sortIndicatorOrder();
|
||||||
|
} else {
|
||||||
|
finishedList->header()->setSortIndicator(index, sortOrder);
|
||||||
|
}
|
||||||
|
switch(index) {
|
||||||
|
case F_SIZE:
|
||||||
|
case F_UPSPEED:
|
||||||
|
case F_UPLOAD:
|
||||||
|
case F_RATIO:
|
||||||
sortFinishedListFloat(index, sortOrder);
|
sortFinishedListFloat(index, sortOrder);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -16,6 +16,15 @@
|
|||||||
* 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
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -60,27 +69,30 @@ class FinishedTorrents : public QWidget, public Ui::seeding {
|
|||||||
void displayFinishedHoSMenu(const QPoint&);
|
void displayFinishedHoSMenu(const QPoint&);
|
||||||
void setRowColor(int row, QString color);
|
void setRowColor(int row, QString color);
|
||||||
void saveColWidthFinishedList() const;
|
void saveColWidthFinishedList() const;
|
||||||
void sortFinishedList(int index);
|
void toggleFinishedListSortOrder(int index);
|
||||||
|
void sortFinishedList(int index=-1, Qt::SortOrder sortOrder=Qt::AscendingOrder);
|
||||||
void sortFinishedListFloat(int index, Qt::SortOrder sortOrder);
|
void sortFinishedListFloat(int index, Qt::SortOrder sortOrder);
|
||||||
void sortFinishedListString(int index, Qt::SortOrder sortOrder);
|
void sortFinishedListString(int index, Qt::SortOrder sortOrder);
|
||||||
void updateFileSize(QString hash);
|
void updateFileSize(QString hash);
|
||||||
void torrentAdded(QString path, QTorrentHandle& h, bool fastResume);
|
|
||||||
void on_actionSet_upload_limit_triggered();
|
void on_actionSet_upload_limit_triggered();
|
||||||
void notifyTorrentDoubleClicked(const QModelIndex& index);
|
void notifyTorrentDoubleClicked(const QModelIndex& index);
|
||||||
void hideOrShowColumnName();
|
void hideOrShowColumnName();
|
||||||
void hideOrShowColumnSize();
|
void hideOrShowColumnSize();
|
||||||
void hideOrShowColumnUpSpeed();
|
void hideOrShowColumnUpSpeed();
|
||||||
void hideOrShowColumnLeechers();
|
void hideOrShowColumnSwarm();
|
||||||
|
void hideOrShowColumnPeers();
|
||||||
|
void hideOrShowColumnUpload();
|
||||||
void hideOrShowColumnRatio();
|
void hideOrShowColumnRatio();
|
||||||
|
void forceRecheck();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void addTorrent(QString hash);
|
void addTorrent(QString hash);
|
||||||
void updateFinishedList();
|
void updateTorrent(QTorrentHandle h);
|
||||||
void pauseTorrent(QString hash);
|
void pauseTorrent(QString hash);
|
||||||
void resumeTorrent(QString hash);
|
|
||||||
void propertiesSelection();
|
void propertiesSelection();
|
||||||
void deleteTorrent(QString hash);
|
void deleteTorrent(QString hash);
|
||||||
void showPropertiesFromHash(QString hash);
|
void showPropertiesFromHash(QString hash);
|
||||||
|
void loadLastSortedColumn();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void torrentMovedFromFinishedList(QString);
|
void torrentMovedFromFinishedList(QString);
|
||||||
|
|||||||
795
src/GUI.cpp
51
src/GUI.h
@@ -16,6 +16,15 @@
|
|||||||
* 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
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -24,7 +33,7 @@
|
|||||||
|
|
||||||
#include <QProcess>
|
#include <QProcess>
|
||||||
#include <QSystemTrayIcon>
|
#include <QSystemTrayIcon>
|
||||||
|
#include <QPointer>
|
||||||
#include "ui_MainWindow.h"
|
#include "ui_MainWindow.h"
|
||||||
#include "qtorrenthandle.h"
|
#include "qtorrenthandle.h"
|
||||||
|
|
||||||
@@ -52,6 +61,7 @@ class QTabWidget;
|
|||||||
class QLabel;
|
class QLabel;
|
||||||
class QModelIndex;
|
class QModelIndex;
|
||||||
class HttpServer;
|
class HttpServer;
|
||||||
|
class QFrame;
|
||||||
|
|
||||||
class GUI : public QMainWindow, private Ui::MainWindow{
|
class GUI : public QMainWindow, private Ui::MainWindow{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@@ -60,12 +70,13 @@ class GUI : public QMainWindow, private Ui::MainWindow{
|
|||||||
// Bittorrent
|
// Bittorrent
|
||||||
bittorrent *BTSession;
|
bittorrent *BTSession;
|
||||||
QTimer *checkConnect;
|
QTimer *checkConnect;
|
||||||
|
QTimer *scrapeTimer;
|
||||||
QList<QPair<QTorrentHandle,QString> > unauthenticated_trackers;
|
QList<QPair<QTorrentHandle,QString> > unauthenticated_trackers;
|
||||||
// GUI related
|
// GUI related
|
||||||
QTabWidget *tabs;
|
QTabWidget *tabs;
|
||||||
options_imp *options;
|
QPointer<options_imp> options;
|
||||||
QSystemTrayIcon *myTrayIcon;
|
QSystemTrayIcon *myTrayIcon;
|
||||||
QTimer *systrayCreator;
|
QPointer<QTimer> systrayCreator;
|
||||||
QMenu *myTrayIconMenu;
|
QMenu *myTrayIconMenu;
|
||||||
DownloadingTorrents *downloadingTorrentTab;
|
DownloadingTorrents *downloadingTorrentTab;
|
||||||
FinishedTorrents *finishedTorrentTab;
|
FinishedTorrents *finishedTorrentTab;
|
||||||
@@ -75,18 +86,28 @@ class GUI : public QMainWindow, private Ui::MainWindow{
|
|||||||
bool force_exit;
|
bool force_exit;
|
||||||
unsigned int refreshInterval;
|
unsigned int refreshInterval;
|
||||||
QTimer *refresher;
|
QTimer *refresher;
|
||||||
|
QLabel *dlSpeedLbl;
|
||||||
|
QLabel *upSpeedLbl;
|
||||||
|
QLabel *ratioLbl;
|
||||||
|
QLabel *DHTLbl;
|
||||||
|
QFrame *statusSep1;
|
||||||
|
QFrame *statusSep2;
|
||||||
|
QFrame *statusSep3;
|
||||||
|
QFrame *statusSep4;
|
||||||
// Keyboard shortcuts
|
// Keyboard shortcuts
|
||||||
QShortcut *switchSearchShortcut;
|
QShortcut *switchSearchShortcut;
|
||||||
QShortcut *switchSearchShortcut2;
|
QShortcut *switchSearchShortcut2;
|
||||||
QShortcut *switchDownShortcut;
|
QShortcut *switchDownShortcut;
|
||||||
QShortcut *switchUpShortcut;
|
QShortcut *switchUpShortcut;
|
||||||
QShortcut *switchRSSShortcut;
|
QShortcut *switchRSSShortcut;
|
||||||
|
QAction *prioSeparator;
|
||||||
|
QAction *prioSeparator2;
|
||||||
// Search
|
// Search
|
||||||
SearchEngine *searchEngine;
|
SearchEngine *searchEngine;
|
||||||
// RSS
|
// RSS
|
||||||
RSSImp *rssWidget;
|
RSSImp *rssWidget;
|
||||||
// Web UI
|
// Web UI
|
||||||
HttpServer *httpServer;
|
QPointer<HttpServer> httpServer;
|
||||||
// Misc
|
// Misc
|
||||||
#ifdef QT_4_4
|
#ifdef QT_4_4
|
||||||
QLocalServer *localServer;
|
QLocalServer *localServer;
|
||||||
@@ -105,6 +126,7 @@ class GUI : public QMainWindow, private Ui::MainWindow{
|
|||||||
void on_actionCreate_torrent_triggered();
|
void on_actionCreate_torrent_triggered();
|
||||||
void on_actionWebsite_triggered() const;
|
void on_actionWebsite_triggered() const;
|
||||||
void on_actionBugReport_triggered() const;
|
void on_actionBugReport_triggered() const;
|
||||||
|
void on_actionShow_console_triggered();
|
||||||
void readParamsOnSocket();
|
void readParamsOnSocket();
|
||||||
void acceptConnection();
|
void acceptConnection();
|
||||||
void togglePausedState(QString hash);
|
void togglePausedState(QString hash);
|
||||||
@@ -118,7 +140,7 @@ class GUI : public QMainWindow, private Ui::MainWindow{
|
|||||||
void createTrayIcon();
|
void createTrayIcon();
|
||||||
void updateUnfinishedTorrentNumber(unsigned int nb);
|
void updateUnfinishedTorrentNumber(unsigned int nb);
|
||||||
void updateFinishedTorrentNumber(unsigned int nb);
|
void updateFinishedTorrentNumber(unsigned int nb);
|
||||||
void fullDiskError(QTorrentHandle& h) const;
|
void fullDiskError(QTorrentHandle& h, QString msg) const;
|
||||||
void handleDownloadFromUrlFailure(QString, QString) const;
|
void handleDownloadFromUrlFailure(QString, QString) const;
|
||||||
void createSystrayDelayed();
|
void createSystrayDelayed();
|
||||||
// Keyboard shortcuts
|
// Keyboard shortcuts
|
||||||
@@ -144,19 +166,22 @@ class GUI : public QMainWindow, private Ui::MainWindow{
|
|||||||
void processParams(const QStringList& params);
|
void processParams(const QStringList& params);
|
||||||
void addTorrent(QString path);
|
void addTorrent(QString path);
|
||||||
void addUnauthenticatedTracker(QPair<QTorrentHandle,QString> tracker);
|
void addUnauthenticatedTracker(QPair<QTorrentHandle,QString> tracker);
|
||||||
void processScannedFiles(const QStringList& params);
|
|
||||||
void processDownloadedFiles(QString path, QString url);
|
void processDownloadedFiles(QString path, QString url);
|
||||||
void downloadFromURLList(const QStringList& urls);
|
void downloadFromURLList(const QStringList& urls);
|
||||||
void deleteTorrent(QString hash);
|
void deleteTorrent(QString hash);
|
||||||
void deleteRatioTorrent(QString fileName);
|
|
||||||
void finishedTorrent(QTorrentHandle& h) const;
|
void finishedTorrent(QTorrentHandle& h) const;
|
||||||
void torrentChecked(QString hash) const;
|
void addedTorrent(QTorrentHandle& h) const;
|
||||||
void updateLists();
|
void checkedTorrent(QTorrentHandle& h) const;
|
||||||
|
void pausedTorrent(QTorrentHandle& h) const;
|
||||||
|
void resumedTorrent(QTorrentHandle& h) const;
|
||||||
|
void updateLists(bool force=false);
|
||||||
bool initWebUi(QString username, QString password, int port);
|
bool initWebUi(QString username, QString password, int port);
|
||||||
void pauseTorrent(QString hash);
|
void on_actionIncreasePriority_triggered();
|
||||||
|
void on_actionDecreasePriority_triggered();
|
||||||
|
void scrapeTrackers();
|
||||||
// Options slots
|
// Options slots
|
||||||
void on_actionOptions_triggered();
|
void on_actionOptions_triggered();
|
||||||
void OptionsSaved(QString info, bool deleteOptions);
|
void OptionsSaved(bool deleteOptions);
|
||||||
// HTTP slots
|
// HTTP slots
|
||||||
void on_actionDownload_from_URL_triggered();
|
void on_actionDownload_from_URL_triggered();
|
||||||
|
|
||||||
@@ -170,7 +195,9 @@ class GUI : public QMainWindow, private Ui::MainWindow{
|
|||||||
|
|
||||||
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
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 820 B |
|
Before Width: | Height: | Size: 821 B |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 998 B |
BIN
src/Icons/flags/czech.png
Normal file
|
After Width: | Height: | Size: 455 B |
BIN
src/Icons/flags/taiwan.png
Normal file
|
After Width: | Height: | Size: 333 B |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 846 B |
|
Before Width: | Height: | Size: 532 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/configure.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
src/Icons/oxygen/connection.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
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-paste.png
Normal file
|
After Width: | Height: | Size: 937 B |
|
Before Width: | Height: | Size: 575 B After Width: | Height: | Size: 575 B |
|
Before Width: | Height: | Size: 750 B After Width: | Height: | Size: 750 B |
|
Before Width: | Height: | Size: 704 B After Width: | Height: | Size: 704 B |
BIN
src/Icons/oxygen/filter.png
Normal file
|
After Width: | Height: | Size: 885 B |
|
Before Width: | Height: | Size: 449 B 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/log.png
Normal file
|
After Width: | Height: | Size: 541 B |
BIN
src/Icons/oxygen/proxy.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 739 B After Width: | Height: | Size: 739 B |
|
Before Width: | Height: | Size: 856 B After Width: | Height: | Size: 856 B |
BIN
src/Icons/oxygen/unavailable.png
Normal file
|
After Width: | Height: | Size: 813 B |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 765 B After Width: | Height: | Size: 765 B |
BIN
src/Icons/oxygen/webui.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
@@ -1,6 +1,6 @@
|
|||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
Categories=Qt;Network;P2P
|
Categories=Qt;Network;P2P
|
||||||
Comment=V1.1.1
|
Comment=V1.4.0
|
||||||
Exec=qbittorrent %f
|
Exec=qbittorrent %f
|
||||||
GenericName=Bittorrent client
|
GenericName=Bittorrent client
|
||||||
GenericName[bg]=Торент клиент
|
GenericName[bg]=Торент клиент
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 576 B |
BIN
src/Icons/skin/decrease.png
Normal file
|
After Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 1.5 KiB |
BIN
src/Icons/skin/increase.png
Normal file
|
After Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 965 B After Width: | Height: | Size: 965 B |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
BIN
src/Icons/skin/queued.png
Normal file
|
After Width: | Height: | Size: 493 B |
|
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 76 KiB |
BIN
src/Icons/skin/tabs.gif
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 888 B |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
@@ -1,426 +1,275 @@
|
|||||||
<ui version="4.0" >
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
<class>MainWindow</class>
|
<class>MainWindow</class>
|
||||||
<widget class="QMainWindow" name="MainWindow" >
|
<widget class="QMainWindow" name="MainWindow">
|
||||||
<property name="geometry" >
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>849</width>
|
<width>914</width>
|
||||||
<height>563</height>
|
<height>563</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="contextMenuPolicy" >
|
<property name="contextMenuPolicy">
|
||||||
<enum>Qt::CustomContextMenu</enum>
|
<enum>Qt::CustomContextMenu</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle" >
|
<property name="windowTitle">
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="centralwidget" >
|
<widget class="QWidget" name="centralwidget">
|
||||||
<property name="geometry" >
|
<layout class="QVBoxLayout"/>
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>58</y>
|
|
||||||
<width>849</width>
|
|
||||||
<height>505</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="vboxLayout" >
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="_3" >
|
|
||||||
<property name="spacing" >
|
|
||||||
<number>6</number>
|
|
||||||
</property>
|
|
||||||
<property name="margin" >
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<spacer>
|
|
||||||
<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="QLabel" name="lbl_DLSpeed_2" >
|
|
||||||
<property name="text" >
|
|
||||||
<string>Total DL Speed:</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment" >
|
|
||||||
<set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLCDNumber" name="LCD_DownSpeed" >
|
|
||||||
<property name="autoFillBackground" >
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="frameShadow" >
|
|
||||||
<enum>QFrame::Raised</enum>
|
|
||||||
</property>
|
|
||||||
<property name="smallDecimalPoint" >
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="numDigits" >
|
|
||||||
<number>6</number>
|
|
||||||
</property>
|
|
||||||
<property name="segmentStyle" >
|
|
||||||
<enum>QLCDNumber::Flat</enum>
|
|
||||||
</property>
|
|
||||||
<property name="value" stdset="0" >
|
|
||||||
<double>0.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="intValue" stdset="0" >
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="unitDL_2" >
|
|
||||||
<property name="text" >
|
|
||||||
<string>KiB/s</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment" >
|
|
||||||
<set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer>
|
|
||||||
<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="QLabel" name="label_2" >
|
|
||||||
<property name="text" >
|
|
||||||
<string>Session ratio: </string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment" >
|
|
||||||
<set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLCDNumber" name="LCD_Ratio" >
|
|
||||||
<property name="autoFillBackground" >
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="numDigits" >
|
|
||||||
<number>4</number>
|
|
||||||
</property>
|
|
||||||
<property name="segmentStyle" >
|
|
||||||
<enum>QLCDNumber::Flat</enum>
|
|
||||||
</property>
|
|
||||||
<property name="value" stdset="0" >
|
|
||||||
<double>1.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="lbl_ratio_icon" >
|
|
||||||
<property name="text" >
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer>
|
|
||||||
<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="QLabel" name="lbl_UPSpeed_2" >
|
|
||||||
<property name="text" >
|
|
||||||
<string>Total UP Speed:</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment" >
|
|
||||||
<set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLCDNumber" name="LCD_UpSpeed" >
|
|
||||||
<property name="autoFillBackground" >
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="smallDecimalPoint" >
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="numDigits" >
|
|
||||||
<number>6</number>
|
|
||||||
</property>
|
|
||||||
<property name="segmentStyle" >
|
|
||||||
<enum>QLCDNumber::Flat</enum>
|
|
||||||
</property>
|
|
||||||
<property name="value" stdset="0" >
|
|
||||||
<double>0.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="unitUP_2" >
|
|
||||||
<property name="text" >
|
|
||||||
<string>KiB/s</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment" >
|
|
||||||
<set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer>
|
|
||||||
<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>
|
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenuBar" name="menubar" >
|
<widget class="QMenuBar" name="menubar">
|
||||||
<property name="geometry" >
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>849</width>
|
<width>914</width>
|
||||||
<height>26</height>
|
<height>23</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QMenu" name="menu_Edit" >
|
<widget class="QMenu" name="menu_Edit">
|
||||||
<property name="title" >
|
<property name="title">
|
||||||
<string>&Edit</string>
|
<string>&Edit</string>
|
||||||
</property>
|
</property>
|
||||||
<addaction name="actionStart_All" />
|
<addaction name="actionStart_All"/>
|
||||||
<addaction name="actionPause_All" />
|
<addaction name="actionPause_All"/>
|
||||||
<addaction name="separator" />
|
<addaction name="separator"/>
|
||||||
<addaction name="actionStart" />
|
<addaction name="actionStart"/>
|
||||||
<addaction name="actionPause" />
|
<addaction name="actionPause"/>
|
||||||
<addaction name="separator" />
|
<addaction name="separator"/>
|
||||||
<addaction name="actionTorrent_Properties" />
|
<addaction name="actionTorrent_Properties"/>
|
||||||
<addaction name="separator" />
|
<addaction name="separator"/>
|
||||||
<addaction name="actionDelete" />
|
<addaction name="actionDelete"/>
|
||||||
<addaction name="actionDelete_Permanently" />
|
<addaction name="actionDelete_Permanently"/>
|
||||||
|
<addaction name="actionDecreasePriority"/>
|
||||||
|
<addaction name="actionIncreasePriority"/>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenu" name="menu_Help" >
|
<widget class="QMenu" name="menu_Help">
|
||||||
<property name="title" >
|
<property name="title">
|
||||||
<string>&Help</string>
|
<string>&Help</string>
|
||||||
</property>
|
</property>
|
||||||
<addaction name="actionBugReport" />
|
<addaction name="actionBugReport"/>
|
||||||
<addaction name="actionWebsite" />
|
<addaction name="actionWebsite"/>
|
||||||
<addaction name="actionDocumentation" />
|
<addaction name="actionDocumentation"/>
|
||||||
<addaction name="actionAbout" />
|
<addaction name="actionAbout"/>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenu" name="menu_Options" >
|
<widget class="QMenu" name="menu_Options">
|
||||||
<property name="title" >
|
<property name="title">
|
||||||
<string>Options</string>
|
<string>Options</string>
|
||||||
</property>
|
</property>
|
||||||
<addaction name="actionOptions" />
|
<addaction name="actionOptions"/>
|
||||||
|
<addaction name="actionShow_console"/>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenu" name="menu_File" >
|
<widget class="QMenu" name="menu_File">
|
||||||
<property name="title" >
|
<property name="title">
|
||||||
<string>&File</string>
|
<string>&File</string>
|
||||||
</property>
|
</property>
|
||||||
<addaction name="actionOpen" />
|
<addaction name="actionOpen"/>
|
||||||
<addaction name="actionDownload_from_URL" />
|
<addaction name="actionDownload_from_URL"/>
|
||||||
<addaction name="actionCreate_torrent" />
|
<addaction name="actionCreate_torrent"/>
|
||||||
<addaction name="actionExit" />
|
<addaction name="actionExit"/>
|
||||||
</widget>
|
</widget>
|
||||||
<addaction name="menu_File" />
|
<addaction name="menu_File"/>
|
||||||
<addaction name="menu_Edit" />
|
<addaction name="menu_Edit"/>
|
||||||
<addaction name="menu_Options" />
|
<addaction name="menu_Options"/>
|
||||||
<addaction name="menu_Help" />
|
<addaction name="menu_Help"/>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QToolBar" name="toolBar" >
|
<widget class="QToolBar" name="toolBar">
|
||||||
<property name="enabled" >
|
<property name="enabled">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="geometry" >
|
<property name="contextMenuPolicy">
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>26</y>
|
|
||||||
<width>849</width>
|
|
||||||
<height>32</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="contextMenuPolicy" >
|
|
||||||
<enum>Qt::NoContextMenu</enum>
|
<enum>Qt::NoContextMenu</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="movable" >
|
<property name="movable">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="orientation" >
|
<property name="orientation">
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="iconSize" >
|
<property name="iconSize">
|
||||||
<size>
|
<size>
|
||||||
<width>32</width>
|
<width>32</width>
|
||||||
<height>32</height>
|
<height>32</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<attribute name="toolBarArea" >
|
<property name="floatable">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<attribute name="toolBarArea">
|
||||||
<enum>TopToolBarArea</enum>
|
<enum>TopToolBarArea</enum>
|
||||||
</attribute>
|
</attribute>
|
||||||
<attribute name="toolBarBreak" >
|
<attribute name="toolBarBreak">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</attribute>
|
</attribute>
|
||||||
<addaction name="actionOpen" />
|
<addaction name="actionOpen"/>
|
||||||
<addaction name="actionDownload_from_URL" />
|
<addaction name="actionDownload_from_URL"/>
|
||||||
<addaction name="separator" />
|
<addaction name="separator"/>
|
||||||
<addaction name="actionDelete" />
|
<addaction name="actionDelete"/>
|
||||||
<addaction name="actionDelete_Permanently" />
|
<addaction name="actionDelete_Permanently"/>
|
||||||
<addaction name="separator" />
|
<addaction name="separator"/>
|
||||||
<addaction name="actionTorrent_Properties" />
|
<addaction name="actionTorrent_Properties"/>
|
||||||
<addaction name="separator" />
|
<addaction name="separator"/>
|
||||||
<addaction name="actionStart" />
|
<addaction name="actionStart"/>
|
||||||
<addaction name="actionPause" />
|
<addaction name="actionPause"/>
|
||||||
<addaction name="separator" />
|
<addaction name="separator"/>
|
||||||
<addaction name="actionStart_All" />
|
<addaction name="actionStart_All"/>
|
||||||
<addaction name="actionPause_All" />
|
<addaction name="actionPause_All"/>
|
||||||
<addaction name="separator" />
|
<addaction name="separator"/>
|
||||||
<addaction name="actionOptions" />
|
<addaction name="actionOptions"/>
|
||||||
<addaction name="actionExit" />
|
<addaction name="actionDecreasePriority"/>
|
||||||
<addaction name="separator" />
|
<addaction name="actionIncreasePriority"/>
|
||||||
|
<addaction name="separator"/>
|
||||||
|
<addaction name="actionExit"/>
|
||||||
</widget>
|
</widget>
|
||||||
<action name="actionOpen" >
|
<widget class="QStatusBar" name="statusBar"/>
|
||||||
<property name="text" >
|
<action name="actionOpen">
|
||||||
|
<property name="text">
|
||||||
<string>Open</string>
|
<string>Open</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionExit" >
|
<action name="actionExit">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Exit</string>
|
<string>Exit</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionOptions" >
|
<action name="actionOptions">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Preferences</string>
|
<string>Preferences</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionAbout" >
|
<action name="actionAbout">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>About</string>
|
<string>About</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionStart" >
|
<action name="actionStart">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Start</string>
|
<string>Start</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionPause" >
|
<action name="actionPause">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Pause</string>
|
<string>Pause</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionDelete" >
|
<action name="actionDelete">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Delete</string>
|
<string>Delete</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionPause_All" >
|
<action name="actionPause_All">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Pause All</string>
|
<string>Pause All</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionStart_All" >
|
<action name="actionStart_All">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Start All</string>
|
<string>Start All</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionWebsite" >
|
<action name="actionWebsite">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Visit website</string>
|
<string>Visit website</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionDelete_Permanently" >
|
<action name="actionDelete_Permanently">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Delete Permanently</string>
|
<string>Delete Permanently</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionTorrent_Properties" >
|
<action name="actionTorrent_Properties">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Torrent Properties</string>
|
<string>Torrent Properties</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionDownload_from_URL" >
|
<action name="actionDownload_from_URL">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Download from URL</string>
|
<string>Download from URL</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionCreate_torrent" >
|
<action name="actionCreate_torrent">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Create torrent</string>
|
<string>Create torrent</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionPreview_file" >
|
<action name="actionPreview_file">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Preview file</string>
|
<string>Preview file</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionClearLog" >
|
<action name="actionClearLog">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Clear log</string>
|
<string>Clear log</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionBugReport" >
|
<action name="actionBugReport">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Report a bug</string>
|
<string>Report a bug</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionSet_upload_limit" >
|
<action name="actionSet_upload_limit">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Set upload limit</string>
|
<string>Set upload limit</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionSet_download_limit" >
|
<action name="actionSet_download_limit">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Set download limit</string>
|
<string>Set download limit</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionDocumentation" >
|
<action name="actionDocumentation">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Documentation</string>
|
<string>Documentation</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionSet_global_download_limit" >
|
<action name="actionSet_global_download_limit">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Set global download limit</string>
|
<string>Set global download limit</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionSet_global_upload_limit" >
|
<action name="actionSet_global_upload_limit">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Set global upload limit</string>
|
<string>Set global upload limit</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="actionDecreasePriority">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="icons.qrc">
|
||||||
|
<normaloff>:/Icons/skin/decrease.png</normaloff>:/Icons/skin/decrease.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Decrease priority</string>
|
||||||
|
</property>
|
||||||
|
<property name="visible">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionIncreasePriority">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="icons.qrc">
|
||||||
|
<normaloff>:/Icons/skin/increase.png</normaloff>:/Icons/skin/increase.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Increase priority</string>
|
||||||
|
</property>
|
||||||
|
<property name="visible">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionShow_console">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="icons.qrc">
|
||||||
|
<normaloff>:/Icons/oxygen/log.png</normaloff>:/Icons/oxygen/log.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Console</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
<resources/>
|
<resources>
|
||||||
|
<include location="icons.qrc"/>
|
||||||
|
</resources>
|
||||||
<connections/>
|
<connections/>
|
||||||
</ui>
|
</ui>
|
||||||
|
|||||||
@@ -16,6 +16,15 @@
|
|||||||
* 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
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,15 @@
|
|||||||
* 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
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,15 @@
|
|||||||
* 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
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,15 @@
|
|||||||
* 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
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -47,13 +56,14 @@ SearchTab::SearchTab(SearchEngine *parent) : QWidget()
|
|||||||
|
|
||||||
setLayout(box);
|
setLayout(box);
|
||||||
// Set Search results list model
|
// Set Search results list model
|
||||||
SearchListModel = new QStandardItemModel(0,5);
|
SearchListModel = new QStandardItemModel(0,6);
|
||||||
SearchListModel->setHeaderData(SEARCH_NAME, Qt::Horizontal, tr("Name", "i.e: file name"));
|
SearchListModel->setHeaderData(SEARCH_NAME, Qt::Horizontal, tr("Name", "i.e: file name"));
|
||||||
SearchListModel->setHeaderData(SEARCH_SIZE, Qt::Horizontal, tr("Size", "i.e: file size"));
|
SearchListModel->setHeaderData(SEARCH_SIZE, Qt::Horizontal, tr("Size", "i.e: file size"));
|
||||||
SearchListModel->setHeaderData(SEARCH_SEEDERS, Qt::Horizontal, tr("Seeders", "i.e: Number of full sources"));
|
SearchListModel->setHeaderData(SEARCH_SEEDERS, Qt::Horizontal, tr("Seeders", "i.e: Number of full sources"));
|
||||||
SearchListModel->setHeaderData(SEARCH_LEECHERS, Qt::Horizontal, tr("Leechers", "i.e: Number of partial sources"));
|
SearchListModel->setHeaderData(SEARCH_LEECHERS, Qt::Horizontal, tr("Leechers", "i.e: Number of partial sources"));
|
||||||
SearchListModel->setHeaderData(SEARCH_ENGINE, Qt::Horizontal, tr("Search engine"));
|
SearchListModel->setHeaderData(SEARCH_ENGINE, Qt::Horizontal, tr("Search engine"));
|
||||||
resultsBrowser->setModel(SearchListModel);
|
resultsBrowser->setModel(SearchListModel);
|
||||||
|
resultsBrowser->hideColumn(URL_COLUMN); // Hide url column
|
||||||
SearchDelegate = new SearchListDelegate();
|
SearchDelegate = new SearchListDelegate();
|
||||||
resultsBrowser->setItemDelegate(SearchDelegate);
|
resultsBrowser->setItemDelegate(SearchDelegate);
|
||||||
// Make search list header clickable for sorting
|
// Make search list header clickable for sorting
|
||||||
@@ -65,19 +75,36 @@ SearchTab::SearchTab(SearchEngine *parent) : QWidget()
|
|||||||
connect(resultsBrowser->header(), SIGNAL(sectionPressed(int)), this, SLOT(sortSearchList(int)));
|
connect(resultsBrowser->header(), SIGNAL(sectionPressed(int)), this, SLOT(sortSearchList(int)));
|
||||||
|
|
||||||
// Load last columns width for search results list
|
// Load last columns width for search results list
|
||||||
if(!loadColWidthSearchList()){
|
if(!loadColWidthResultsList()){
|
||||||
resultsBrowser->header()->resizeSection(0, 275);
|
resultsBrowser->header()->resizeSection(0, 275);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SearchTab::~SearchTab()
|
SearchTab::~SearchTab() {
|
||||||
{
|
|
||||||
saveColWidthSearchList();
|
|
||||||
delete resultsBrowser;
|
delete resultsBrowser;
|
||||||
delete SearchListModel;
|
delete SearchListModel;
|
||||||
delete SearchDelegate;
|
delete SearchDelegate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QHeaderView* SearchTab::header() const {
|
||||||
|
return resultsBrowser->header();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SearchTab::loadColWidthResultsList() {
|
||||||
|
QSettings settings("qBittorrent", "qBittorrent");
|
||||||
|
QString line = settings.value("SearchResultsColsWidth", QString()).toString();
|
||||||
|
if(line.isEmpty())
|
||||||
|
return false;
|
||||||
|
QStringList width_list = line.split(' ');
|
||||||
|
if(width_list.size() < SearchListModel->columnCount())
|
||||||
|
return false;
|
||||||
|
unsigned int listSize = width_list.size();
|
||||||
|
for(unsigned int i=0; i<listSize; ++i){
|
||||||
|
resultsBrowser->header()->resizeSection(i, width_list.at(i).toInt());
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
QLabel* SearchTab::getCurrentLabel()
|
QLabel* SearchTab::getCurrentLabel()
|
||||||
{
|
{
|
||||||
return results_lbl;
|
return results_lbl;
|
||||||
@@ -128,7 +155,7 @@ void SearchTab::sortSearchListInt(int index, Qt::SortOrder sortOrder){
|
|||||||
for(int row=0; row<lines.size(); ++row){
|
for(int row=0; row<lines.size(); ++row){
|
||||||
SearchListModel->insertRow(SearchListModel->rowCount());
|
SearchListModel->insertRow(SearchListModel->rowCount());
|
||||||
int sourceRow = lines[row].first;
|
int sourceRow = lines[row].first;
|
||||||
for(int col=0; col<5; ++col){
|
for(int col=0; col<6; ++col){
|
||||||
SearchListModel->setData(SearchListModel->index(nbRows_old+row, col), SearchListModel->data(SearchListModel->index(sourceRow, col)));
|
SearchListModel->setData(SearchListModel->index(nbRows_old+row, col), SearchListModel->data(SearchListModel->index(sourceRow, col)));
|
||||||
SearchListModel->setData(SearchListModel->index(nbRows_old+row, col), SearchListModel->data(SearchListModel->index(sourceRow, col), Qt::ForegroundRole), Qt::ForegroundRole);
|
SearchListModel->setData(SearchListModel->index(nbRows_old+row, col), SearchListModel->data(SearchListModel->index(sourceRow, col), Qt::ForegroundRole), Qt::ForegroundRole);
|
||||||
}
|
}
|
||||||
@@ -148,7 +175,7 @@ void SearchTab::sortSearchListString(int index, Qt::SortOrder sortOrder){
|
|||||||
for(int row=0; row<nbRows_old; ++row){
|
for(int row=0; row<nbRows_old; ++row){
|
||||||
SearchListModel->insertRow(SearchListModel->rowCount());
|
SearchListModel->insertRow(SearchListModel->rowCount());
|
||||||
int sourceRow = lines[row].first;
|
int sourceRow = lines[row].first;
|
||||||
for(int col=0; col<5; ++col){
|
for(int col=0; col<6; ++col){
|
||||||
SearchListModel->setData(SearchListModel->index(nbRows_old+row, col), SearchListModel->data(SearchListModel->index(sourceRow, col)));
|
SearchListModel->setData(SearchListModel->index(nbRows_old+row, col), SearchListModel->data(SearchListModel->index(sourceRow, col)));
|
||||||
SearchListModel->setData(SearchListModel->index(nbRows_old+row, col), SearchListModel->data(SearchListModel->index(sourceRow, col), Qt::ForegroundRole), Qt::ForegroundRole);
|
SearchListModel->setData(SearchListModel->index(nbRows_old+row, col), SearchListModel->data(SearchListModel->index(sourceRow, col), Qt::ForegroundRole), Qt::ForegroundRole);
|
||||||
}
|
}
|
||||||
@@ -157,34 +184,3 @@ void SearchTab::sortSearchListString(int index, Qt::SortOrder sortOrder){
|
|||||||
SearchListModel->removeRows(0, nbRows_old);
|
SearchListModel->removeRows(0, nbRows_old);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Save columns width in a file to remember them
|
|
||||||
// (download list)
|
|
||||||
void SearchTab::saveColWidthSearchList() const{
|
|
||||||
qDebug("Saving columns width in search list");
|
|
||||||
QSettings settings("qBittorrent", "qBittorrent");
|
|
||||||
QStringList width_list;
|
|
||||||
for(int i=0; i<SearchListModel->columnCount(); ++i){
|
|
||||||
width_list << misc::toQString(resultsBrowser->columnWidth(i));
|
|
||||||
}
|
|
||||||
settings.setValue("SearchListColsWidth", width_list.join(" "));
|
|
||||||
qDebug("Search list columns width saved");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load columns width in a file that were saved previously
|
|
||||||
// (search list)
|
|
||||||
bool SearchTab::loadColWidthSearchList(){
|
|
||||||
qDebug("Loading columns width for search list");
|
|
||||||
QSettings settings("qBittorrent", "qBittorrent");
|
|
||||||
QString line = settings.value("SearchListColsWidth", QString()).toString();
|
|
||||||
if(line.isEmpty())
|
|
||||||
return false;
|
|
||||||
QStringList width_list = line.split(' ');
|
|
||||||
if(width_list.size() != SearchListModel->columnCount())
|
|
||||||
return false;
|
|
||||||
for(int i=0; i<width_list.size(); ++i){
|
|
||||||
resultsBrowser->header()->resizeSection(i, width_list.at(i).toInt());
|
|
||||||
}
|
|
||||||
qDebug("Search list columns width loaded");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,15 @@
|
|||||||
* 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
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -24,9 +33,13 @@
|
|||||||
|
|
||||||
#include "ui_search.h"
|
#include "ui_search.h"
|
||||||
|
|
||||||
|
#define ENGINE_URL_COLUMN 4
|
||||||
|
#define URL_COLUMN 5
|
||||||
|
|
||||||
class SearchListDelegate;
|
class SearchListDelegate;
|
||||||
class SearchEngine;
|
class SearchEngine;
|
||||||
class QTreeView;
|
class QTreeView;
|
||||||
|
class QHeaderView;
|
||||||
class QStandardItemModel;
|
class QStandardItemModel;
|
||||||
|
|
||||||
class SearchTab : public QWidget, public Ui::search_engine
|
class SearchTab : public QWidget, public Ui::search_engine
|
||||||
@@ -42,16 +55,17 @@ class SearchTab : public QWidget, public Ui::search_engine
|
|||||||
public:
|
public:
|
||||||
SearchTab(SearchEngine *parent);
|
SearchTab(SearchEngine *parent);
|
||||||
~SearchTab();
|
~SearchTab();
|
||||||
bool loadColWidthSearchList();
|
bool loadColWidthResultsList();
|
||||||
QLabel * getCurrentLabel();
|
QLabel * getCurrentLabel();
|
||||||
QStandardItemModel * getCurrentSearchListModel();
|
QStandardItemModel * getCurrentSearchListModel();
|
||||||
QTreeView * getCurrentTreeView();
|
QTreeView * getCurrentTreeView();
|
||||||
void setRowColor(int row, QString color);
|
void setRowColor(int row, QString color);
|
||||||
|
QHeaderView* header() const;
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
void sortSearchList(int index);
|
void sortSearchList(int index);
|
||||||
void sortSearchListInt(int index, Qt::SortOrder sortOrder);
|
void sortSearchListInt(int index, Qt::SortOrder sortOrder);
|
||||||
void sortSearchListString(int index, Qt::SortOrder sortOrder);
|
void sortSearchListString(int index, Qt::SortOrder sortOrder);
|
||||||
void saveColWidthSearchList() const;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,15 @@
|
|||||||
* 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
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
224
src/about.ui
@@ -1,8 +1,9 @@
|
|||||||
<ui version="4.0" >
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
<author>Christophe Dumez</author>
|
<author>Christophe Dumez</author>
|
||||||
<class>AboutDlg</class>
|
<class>AboutDlg</class>
|
||||||
<widget class="QDialog" name="AboutDlg" >
|
<widget class="QDialog" name="AboutDlg">
|
||||||
<property name="geometry" >
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
@@ -10,65 +11,65 @@
|
|||||||
<height>320</height>
|
<height>320</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="minimumSize" >
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>504</width>
|
<width>504</width>
|
||||||
<height>320</height>
|
<height>320</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximumSize" >
|
<property name="maximumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>504</width>
|
<width>504</width>
|
||||||
<height>320</height>
|
<height>320</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle" >
|
<property name="windowTitle">
|
||||||
<string>About qBittorrent</string>
|
<string>About qBittorrent</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" >
|
<layout class="QVBoxLayout">
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" >
|
<layout class="QHBoxLayout">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="logo" >
|
<widget class="QLabel" name="logo">
|
||||||
<property name="minimumSize" >
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>22</width>
|
<width>22</width>
|
||||||
<height>22</height>
|
<height>22</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximumSize" >
|
<property name="maximumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>22</width>
|
<width>22</width>
|
||||||
<height>22</height>
|
<height>22</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="lb_name" >
|
<widget class="QLabel" name="lb_name">
|
||||||
<property name="sizePolicy" >
|
<property name="sizePolicy">
|
||||||
<sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string><h3><b>qBittorrent</b></h3></string>
|
<string><h3><b>qBittorrent</b></h3></string>
|
||||||
</property>
|
</property>
|
||||||
<property name="textFormat" >
|
<property name="textFormat">
|
||||||
<enum>Qt::RichText</enum>
|
<enum>Qt::RichText</enum>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<spacer>
|
<spacer>
|
||||||
<property name="orientation" >
|
<property name="orientation">
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeHint" >
|
<property name="sizeHint" stdset="0">
|
||||||
<size>
|
<size>
|
||||||
<width>40</width>
|
<width>40</width>
|
||||||
<height>20</height>
|
<height>20</height>
|
||||||
@@ -79,79 +80,90 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QTabWidget" name="tw_tabs" >
|
<widget class="QTabWidget" name="tw_tabs">
|
||||||
<property name="currentIndex" >
|
<property name="currentIndex">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="tab2" >
|
<widget class="QWidget" name="tab2">
|
||||||
<attribute name="title" >
|
<attribute name="title">
|
||||||
<string>About</string>
|
<string>About</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
<widget class="QLabel" name="mascot_lbl" >
|
<widget class="QLabel" name="mascot_lbl">
|
||||||
<property name="geometry" >
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>380</x>
|
<x>380</x>
|
||||||
<y>50</y>
|
<y>70</y>
|
||||||
<width>94</width>
|
<width>94</width>
|
||||||
<height>162</height>
|
<height>162</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QLabel" name="lb_about" >
|
<widget class="QLabel" name="lb_about">
|
||||||
<property name="geometry" >
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>40</y>
|
<y>30</y>
|
||||||
<width>481</width>
|
<width>481</width>
|
||||||
<height>102</height>
|
<height>102</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizePolicy" >
|
<property name="sizePolicy">
|
||||||
<sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>A bittorrent client using Qt4 and libtorrent, programmed in C++.<br>
|
<string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||||
<br>
|
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
||||||
Copyright © 2006 by Christophe Dumez<br>
|
p, li { white-space: pre-wrap; }
|
||||||
<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br></string>
|
</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;">
|
||||||
|
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p>
|
||||||
|
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
<property name="textFormat" >
|
<property name="textFormat">
|
||||||
<enum>Qt::RichText</enum>
|
<enum>Qt::RichText</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="alignment" >
|
<property name="scaledContents">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
<set>Qt::AlignCenter</set>
|
<set>Qt::AlignCenter</set>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="openExternalLinks">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="tab3" >
|
<widget class="QWidget" name="tab3">
|
||||||
<attribute name="title" >
|
<attribute name="title">
|
||||||
<string>Author</string>
|
<string>Author</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
<layout class="QVBoxLayout" >
|
<layout class="QVBoxLayout">
|
||||||
<property name="spacing" >
|
<property name="spacing">
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QFrame" name="te_authors" >
|
<widget class="QFrame" name="te_authors">
|
||||||
<layout class="QHBoxLayout" >
|
<layout class="QHBoxLayout">
|
||||||
<property name="spacing" >
|
<property name="spacing">
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<spacer>
|
<spacer>
|
||||||
<property name="orientation" >
|
<property name="orientation">
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeType" >
|
<property name="sizeType">
|
||||||
<enum>QSizePolicy::Preferred</enum>
|
<enum>QSizePolicy::Preferred</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeHint" >
|
<property name="sizeHint" stdset="0">
|
||||||
<size>
|
<size>
|
||||||
<width>20</width>
|
<width>20</width>
|
||||||
<height>20</height>
|
<height>20</height>
|
||||||
@@ -160,13 +172,13 @@ Copyright © 2006 by Christophe Dumez<br>
|
|||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QVBoxLayout" >
|
<layout class="QVBoxLayout">
|
||||||
<property name="spacing" >
|
<property name="spacing">
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_3" >
|
<widget class="QLabel" name="label_3">
|
||||||
<property name="font" >
|
<property name="font">
|
||||||
<font>
|
<font>
|
||||||
<family>Sans Serif</family>
|
<family>Sans Serif</family>
|
||||||
<pointsize>9</pointsize>
|
<pointsize>9</pointsize>
|
||||||
@@ -177,14 +189,14 @@ Copyright © 2006 by Christophe Dumez<br>
|
|||||||
<strikeout>false</strikeout>
|
<strikeout>false</strikeout>
|
||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Name:</string>
|
<string>Name:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_4" >
|
<widget class="QLabel" name="label_4">
|
||||||
<property name="font" >
|
<property name="font">
|
||||||
<font>
|
<font>
|
||||||
<family>Sans Serif</family>
|
<family>Sans Serif</family>
|
||||||
<pointsize>9</pointsize>
|
<pointsize>9</pointsize>
|
||||||
@@ -195,14 +207,14 @@ Copyright © 2006 by Christophe Dumez<br>
|
|||||||
<strikeout>false</strikeout>
|
<strikeout>false</strikeout>
|
||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Country:</string>
|
<string>Country:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="lbl_birthday" >
|
<widget class="QLabel" name="lbl_birthday">
|
||||||
<property name="font" >
|
<property name="font">
|
||||||
<font>
|
<font>
|
||||||
<family>Sans Serif</family>
|
<family>Sans Serif</family>
|
||||||
<pointsize>9</pointsize>
|
<pointsize>9</pointsize>
|
||||||
@@ -213,14 +225,14 @@ Copyright © 2006 by Christophe Dumez<br>
|
|||||||
<strikeout>false</strikeout>
|
<strikeout>false</strikeout>
|
||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Birthday:</string>
|
<string>Birthday:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="lbl_occupation" >
|
<widget class="QLabel" name="lbl_occupation">
|
||||||
<property name="font" >
|
<property name="font">
|
||||||
<font>
|
<font>
|
||||||
<family>Sans Serif</family>
|
<family>Sans Serif</family>
|
||||||
<pointsize>9</pointsize>
|
<pointsize>9</pointsize>
|
||||||
@@ -231,14 +243,14 @@ Copyright © 2006 by Christophe Dumez<br>
|
|||||||
<strikeout>false</strikeout>
|
<strikeout>false</strikeout>
|
||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Occupation:</string>
|
<string>Occupation:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_5" >
|
<widget class="QLabel" name="label_5">
|
||||||
<property name="font" >
|
<property name="font">
|
||||||
<font>
|
<font>
|
||||||
<family>Sans Serif</family>
|
<family>Sans Serif</family>
|
||||||
<pointsize>9</pointsize>
|
<pointsize>9</pointsize>
|
||||||
@@ -249,14 +261,14 @@ Copyright © 2006 by Christophe Dumez<br>
|
|||||||
<strikeout>false</strikeout>
|
<strikeout>false</strikeout>
|
||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>E-mail:</string>
|
<string>E-mail:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_8" >
|
<widget class="QLabel" name="label_8">
|
||||||
<property name="font" >
|
<property name="font">
|
||||||
<font>
|
<font>
|
||||||
<family>Sans Serif</family>
|
<family>Sans Serif</family>
|
||||||
<pointsize>9</pointsize>
|
<pointsize>9</pointsize>
|
||||||
@@ -267,7 +279,7 @@ Copyright © 2006 by Christophe Dumez<br>
|
|||||||
<strikeout>false</strikeout>
|
<strikeout>false</strikeout>
|
||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Home page:</string>
|
<string>Home page:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
@@ -276,13 +288,13 @@ Copyright © 2006 by Christophe Dumez<br>
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<spacer>
|
<spacer>
|
||||||
<property name="orientation" >
|
<property name="orientation">
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeType" >
|
<property name="sizeType">
|
||||||
<enum>QSizePolicy::Preferred</enum>
|
<enum>QSizePolicy::Preferred</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeHint" >
|
<property name="sizeHint" stdset="0">
|
||||||
<size>
|
<size>
|
||||||
<width>20</width>
|
<width>20</width>
|
||||||
<height>20</height>
|
<height>20</height>
|
||||||
@@ -291,48 +303,48 @@ Copyright © 2006 by Christophe Dumez<br>
|
|||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QVBoxLayout" >
|
<layout class="QVBoxLayout">
|
||||||
<property name="spacing" >
|
<property name="spacing">
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_2" >
|
<widget class="QLabel" name="label_2">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Christophe Dumez</string>
|
<string>Christophe Dumez</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_7" >
|
<widget class="QLabel" name="label_7">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>France</string>
|
<string>France</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_11" >
|
<widget class="QLabel" name="label_11">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>03/05/1985</string>
|
<string>03/05/1985</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_10" >
|
<widget class="QLabel" name="label_10">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Student in computer science</string>
|
<string>Student in computer science</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_6" >
|
<widget class="QLabel" name="label_6">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>chris@qbittorrent.org</string>
|
<string>chris@qbittorrent.org</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_9" >
|
<widget class="QLabel" name="label_9">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>http://www.dchris.eu</string>
|
<string>http://www.dchris.eu</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
@@ -341,10 +353,10 @@ Copyright © 2006 by Christophe Dumez<br>
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<spacer>
|
<spacer>
|
||||||
<property name="orientation" >
|
<property name="orientation">
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeHint" >
|
<property name="sizeHint" stdset="0">
|
||||||
<size>
|
<size>
|
||||||
<width>40</width>
|
<width>40</width>
|
||||||
<height>20</height>
|
<height>20</height>
|
||||||
@@ -357,46 +369,46 @@ Copyright © 2006 by Christophe Dumez<br>
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="tab4" >
|
<widget class="QWidget" name="tab4">
|
||||||
<attribute name="title" >
|
<attribute name="title">
|
||||||
<string>Thanks to</string>
|
<string>Thanks to</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
<layout class="QVBoxLayout" >
|
<layout class="QVBoxLayout">
|
||||||
<property name="spacing" >
|
<property name="spacing">
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QTextBrowser" name="te_thanks" />
|
<widget class="QTextBrowser" name="te_thanks"/>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="tab5" >
|
<widget class="QWidget" name="tab5">
|
||||||
<attribute name="title" >
|
<attribute name="title">
|
||||||
<string>Translation</string>
|
<string>Translation</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
<layout class="QVBoxLayout" >
|
<layout class="QVBoxLayout">
|
||||||
<property name="spacing" >
|
<property name="spacing">
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QTextBrowser" name="te_translation" >
|
<widget class="QTextBrowser" name="te_translation">
|
||||||
<property name="lineWrapMode" >
|
<property name="lineWrapMode">
|
||||||
<enum>QTextEdit::NoWrap</enum>
|
<enum>QTextEdit::NoWrap</enum>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="tab1" >
|
<widget class="QWidget" name="tab1">
|
||||||
<attribute name="title" >
|
<attribute name="title">
|
||||||
<string>License</string>
|
<string>License</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
<layout class="QVBoxLayout" >
|
<layout class="QVBoxLayout">
|
||||||
<property name="spacing" >
|
<property name="spacing">
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QTextBrowser" name="te_license" />
|
<widget class="QTextBrowser" name="te_license"/>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
@@ -404,7 +416,7 @@ Copyright © 2006 by Christophe Dumez<br>
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<layoutdefault spacing="6" margin="11" />
|
<layoutdefault spacing="6" margin="11"/>
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections/>
|
<connections/>
|
||||||
</ui>
|
</ui>
|
||||||
|
|||||||
@@ -16,6 +16,15 @@
|
|||||||
* 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
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -37,8 +46,8 @@ class about : public QDialog, private Ui::AboutDlg{
|
|||||||
setupUi(this);
|
setupUi(this);
|
||||||
setAttribute(Qt::WA_DeleteOnClose);
|
setAttribute(Qt::WA_DeleteOnClose);
|
||||||
// Set icons
|
// Set icons
|
||||||
logo->setPixmap(QPixmap(QString::fromUtf8(":/Icons/qbittorrent22.png")));
|
logo->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/qbittorrent22.png")));
|
||||||
mascot_lbl->setPixmap(QPixmap(QString::fromUtf8(":/Icons/mascot.png")));
|
mascot_lbl->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/mascot.png")));
|
||||||
//Title
|
//Title
|
||||||
lb_name->setText(QString::fromUtf8("<b><h1>")+tr("qBittorrent")+QString::fromUtf8(" "VERSION"</h1></b>"));
|
lb_name->setText(QString::fromUtf8("<b><h1>")+tr("qBittorrent")+QString::fromUtf8(" "VERSION"</h1></b>"));
|
||||||
// Thanks
|
// Thanks
|
||||||
@@ -56,10 +65,12 @@ class about : public QDialog, private Ui::AboutDlg{
|
|||||||
"<i>- <u>Brazilian:</u> Nick Marinho (nickmarinho@gmail.com)<br>\
|
"<i>- <u>Brazilian:</u> Nick Marinho (nickmarinho@gmail.com)<br>\
|
||||||
- <u>Bulgarian:</u> Tsvetan & Boiko Bankov (emerge_life@users.sourceforge.net)<br>\
|
- <u>Bulgarian:</u> Tsvetan & Boiko Bankov (emerge_life@users.sourceforge.net)<br>\
|
||||||
- <u>Catalan:</u> Gekko Dam Beer (gekko04@users.sourceforge.net)<br>\
|
- <u>Catalan:</u> Gekko Dam Beer (gekko04@users.sourceforge.net)<br>\
|
||||||
- <u>Chinese (Simplified):</u> Guo Yue (guoyue0418@hotmail.com)<br>\
|
- <u>Chinese (Simplified):</u> Guo Yue (yue.guo0418@gmail.com)<br>\
|
||||||
|
- <u>Chinese (Traditional):</u> Yi-Shun Wang (dnextstep@gmail.com)<br>\
|
||||||
|
- <u>Czech:</u> Jirka Vilim (web@tets.cz)<br>\
|
||||||
- <u>Danish:</u> Mathias Nielsen (comoneo@gmail.com)<br>\
|
- <u>Danish:</u> Mathias Nielsen (comoneo@gmail.com)<br>\
|
||||||
- <u>Dutch:</u> Joost Schipper (heavyjoost@users.sourceforge.net) and Peter Koeleman (peter@peerweb.nl)<br>\
|
- <u>Dutch:</u> Joost Schipper (heavyjoost@users.sourceforge.net) and Peter Koeleman (peter@peerweb.nl)<br>\
|
||||||
- <u>Finnish:</u> Niklas Laxström (nikerabbit@users.sourceforge.net)<br>\
|
- <u>Finnish:</u> Niklas Laxström (nikerabbit@users.sourceforge.net) and Pekka Niemi (pekka.niemi@iki.fi)<br>\
|
||||||
- <u>German:</u> Niels Hoffmann (zentralmaschine@users.sourceforge.net)<br>\
|
- <u>German:</u> Niels Hoffmann (zentralmaschine@users.sourceforge.net)<br>\
|
||||||
- <u>Greek:</u> Tsvetan Bankov (emerge_life@users.sourceforge.net)<br>\
|
- <u>Greek:</u> Tsvetan Bankov (emerge_life@users.sourceforge.net)<br>\
|
||||||
- <u>Hungarian:</u> Majoros Péter (majoros.peterj@gmail.com)<br>\
|
- <u>Hungarian:</u> Majoros Péter (majoros.peterj@gmail.com)<br>\
|
||||||
@@ -74,13 +85,25 @@ class about : public QDialog, private Ui::AboutDlg{
|
|||||||
- <u>Slovak:</u> helix84<br>\
|
- <u>Slovak:</u> helix84<br>\
|
||||||
- <u>Spanish:</u> Vicente Raul Plata Fonseca (silverxnt@users.sourceforge.net) and Gabriel de Oliveira (deadloop@hotmail.com)<br>\
|
- <u>Spanish:</u> Vicente Raul Plata Fonseca (silverxnt@users.sourceforge.net) and Gabriel de Oliveira (deadloop@hotmail.com)<br>\
|
||||||
- <u>Swedish:</u> Daniel Nylander (po@danielnylander.se)<br>\
|
- <u>Swedish:</u> Daniel Nylander (po@danielnylander.se)<br>\
|
||||||
- <u>Turkish:</u> Erdem Bingöl (erdem84@gmail.com)<br>\
|
- <u>Turkish:</u> Hasan YILMAZ (iletisim@hedefturkce.com) and Erdem Bingöl (erdem84@gmail.com)<br>\
|
||||||
- <u>Ukrainian:</u> Andrey Shpachenko (masterfix@users.sourceforge.net)<br><br>"));
|
- <u>Ukrainian:</u> Andrey Shpachenko (masterfix@users.sourceforge.net)<br><br>"));
|
||||||
te_translation->append(tr("Please contact me if you would like to translate qBittorrent into your own language."));
|
te_translation->append(tr("Please contact me if you would like to translate qBittorrent into your own language."));
|
||||||
te_translation->scrollToAnchor(QString::fromUtf8("top"));
|
te_translation->scrollToAnchor(QString::fromUtf8("top"));
|
||||||
// License
|
// License
|
||||||
te_license->append(QString::fromUtf8("<a name='top'></a>"));
|
te_license->append(QString::fromUtf8("<a name='top'></a>"));
|
||||||
te_license->append(QString::fromUtf8("<center><b>GNU GENERAL PUBLIC LICENSE</b></center><br>\
|
te_license->append(QString::fromUtf8("qBittorrent is licensed under the GNU General Public License version 2 with the\
|
||||||
|
addition of the following special exception:\
|
||||||
|
<br><br>\
|
||||||
|
<i>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.</i>\
|
||||||
|
<br><br>\
|
||||||
|
<center><b>GNU GENERAL PUBLIC LICENSE</b></center><br>\
|
||||||
<center>Version 2, June 1991</center><br>\
|
<center>Version 2, June 1991</center><br>\
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.<br>\
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.<br>\
|
||||||
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA<br>\
|
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA<br>\
|
||||||
|
|||||||
@@ -13,21 +13,6 @@
|
|||||||
<string>Torrent addition dialog</string>
|
<string>Torrent addition dialog</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" >
|
<layout class="QVBoxLayout" >
|
||||||
<property name="spacing" >
|
|
||||||
<number>6</number>
|
|
||||||
</property>
|
|
||||||
<property name="leftMargin" >
|
|
||||||
<number>9</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin" >
|
|
||||||
<number>9</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin" >
|
|
||||||
<number>9</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin" >
|
|
||||||
<number>9</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="fileNameLbl" >
|
<widget class="QLabel" name="fileNameLbl" >
|
||||||
<property name="text" >
|
<property name="text" >
|
||||||
@@ -110,6 +95,50 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="collapseAllButton" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Collapse all</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="expandAllButton" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Expand all</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QCheckBox" name="checkIncrementalDL" >
|
<widget class="QCheckBox" name="checkIncrementalDL" >
|
||||||
<property name="text" >
|
<property name="text" >
|
||||||
|
|||||||
@@ -16,6 +16,15 @@
|
|||||||
* 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
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,15 @@
|
|||||||
* 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
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -32,7 +41,7 @@ class torrent_file {
|
|||||||
torrent_file *parent;
|
torrent_file *parent;
|
||||||
bool is_dir;
|
bool is_dir;
|
||||||
QString rel_path;
|
QString rel_path;
|
||||||
QList<torrent_file*> children;
|
QList<const torrent_file*> children;
|
||||||
size_type size;
|
size_type size;
|
||||||
float progress;
|
float progress;
|
||||||
int priority;
|
int priority;
|
||||||
@@ -42,6 +51,8 @@ class torrent_file {
|
|||||||
torrent_file(torrent_file *parent, QString path, bool dir, size_type size=0, int index=-1, float progress=0., int priority=1): parent(parent), is_dir(dir), size(size), progress(progress), priority(priority), index(index){
|
torrent_file(torrent_file *parent, QString path, bool dir, size_type size=0, int index=-1, float progress=0., int priority=1): parent(parent), is_dir(dir), size(size), progress(progress), priority(priority), index(index){
|
||||||
qDebug("created a file with index %d", index);
|
qDebug("created a file with index %d", index);
|
||||||
rel_path = QDir::cleanPath(path);
|
rel_path = QDir::cleanPath(path);
|
||||||
|
Q_ASSERT(progress >= 0.);
|
||||||
|
Q_ASSERT(progress <= 1.);
|
||||||
if(parent) {
|
if(parent) {
|
||||||
parent->updateProgress();
|
parent->updateProgress();
|
||||||
parent->updatePriority(priority);
|
parent->updatePriority(priority);
|
||||||
@@ -66,10 +77,9 @@ class torrent_file {
|
|||||||
progress = 0.;
|
progress = 0.;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
float wanted = 0.;
|
double wanted = 0.;
|
||||||
float done = 0.;
|
double done = 0.;
|
||||||
torrent_file *child;
|
foreach(const torrent_file *child, children) {
|
||||||
foreach(child, children) {
|
|
||||||
wanted += child->getSize();
|
wanted += child->getSize();
|
||||||
done += child->getSize()*child->getProgress();
|
done += child->getSize()*child->getProgress();
|
||||||
}
|
}
|
||||||
@@ -80,8 +90,7 @@ class torrent_file {
|
|||||||
|
|
||||||
void updatePriority(int prio) {
|
void updatePriority(int prio) {
|
||||||
Q_ASSERT(is_dir);
|
Q_ASSERT(is_dir);
|
||||||
torrent_file *child;
|
foreach(const torrent_file *child, children) {
|
||||||
foreach(child, children) {
|
|
||||||
if(child->getPriority() != prio) return;
|
if(child->getPriority() != prio) return;
|
||||||
}
|
}
|
||||||
priority = prio;
|
priority = prio;
|
||||||
@@ -111,14 +120,13 @@ class torrent_file {
|
|||||||
return (!children.isEmpty());
|
return (!children.isEmpty());
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<torrent_file*> getChildren() const {
|
QList<const torrent_file*> getChildren() const {
|
||||||
return children;
|
return children;
|
||||||
}
|
}
|
||||||
|
|
||||||
torrent_file* getChild(QString fileName) const {
|
const torrent_file* getChild(QString fileName) const {
|
||||||
Q_ASSERT(is_dir);
|
Q_ASSERT(is_dir);
|
||||||
torrent_file* f;
|
foreach(const torrent_file *f, children) {
|
||||||
foreach(f, children) {
|
|
||||||
if(f->name() == fileName) return f;
|
if(f->name() == fileName) return f;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@@ -141,25 +149,24 @@ class torrent_file {
|
|||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool removeFromFS(QString saveDir) {
|
bool removeFromFS(QString saveDir) const {
|
||||||
QString full_path = saveDir + QDir::separator() + rel_path;
|
QString full_path = saveDir + QDir::separator() + rel_path;
|
||||||
if(!QFile::exists(full_path)) {
|
if(!QFile::exists(full_path)) {
|
||||||
qDebug("%s does not exist, no need to remove it", full_path.toUtf8().data());
|
qDebug("%s does not exist, no need to remove it", full_path.toLocal8Bit().data());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool success = true;
|
bool success = true;
|
||||||
torrent_file *f;
|
|
||||||
qDebug("We have %d children", children.size());
|
qDebug("We have %d children", children.size());
|
||||||
foreach(f, children) {
|
foreach(const torrent_file *f, children) {
|
||||||
bool s = f->removeFromFS(saveDir);
|
bool s = f->removeFromFS(saveDir);
|
||||||
success = s && success;
|
success = s && success;
|
||||||
}
|
}
|
||||||
if(is_dir) {
|
if(is_dir) {
|
||||||
qDebug("trying to remove directory: %s", full_path.toUtf8().data());
|
qDebug("trying to remove directory: %s", full_path.toLocal8Bit().data());
|
||||||
QDir dir(full_path);
|
QDir dir(full_path);
|
||||||
dir.rmdir(full_path);
|
dir.rmdir(full_path);
|
||||||
} else {
|
} else {
|
||||||
qDebug("trying to remove file: %s", full_path.toUtf8().data());
|
qDebug("trying to remove file: %s", full_path.toLocal8Bit().data());
|
||||||
bool s = QFile::remove(full_path);
|
bool s = QFile::remove(full_path);
|
||||||
success = s && success;
|
success = s && success;
|
||||||
}
|
}
|
||||||
@@ -172,27 +179,27 @@ class arborescence {
|
|||||||
torrent_file *root;
|
torrent_file *root;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
arborescence(torrent_info t) {
|
arborescence(boost::intrusive_ptr<torrent_info> t) {
|
||||||
torrent_info::file_iterator fi = t.begin_files();
|
torrent_info::file_iterator fi = t->begin_files();
|
||||||
if(t.num_files() > 1) {
|
if(t->num_files() > 1) {
|
||||||
root = new torrent_file(0, misc::toQString(t.name()), true);
|
root = new torrent_file(0, misc::toQString(t->name()), true);
|
||||||
} else {
|
} else {
|
||||||
// XXX: Will crash if there is no file in torrent
|
// XXX: Will crash if there is no file in torrent
|
||||||
root = new torrent_file(0, misc::toQString(t.name()), false, fi->size, 0);
|
root = new torrent_file(0, misc::toQString(t->name()), false, fi->size, 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while(fi != t.end_files()) {
|
while(fi != t->end_files()) {
|
||||||
QString path = QDir::cleanPath(misc::toQString(fi->path.string()));
|
QString path = QDir::cleanPath(misc::toQString(fi->path.string()));
|
||||||
addFile(path, fi->size, i);
|
addFile(path, fi->size, i);
|
||||||
fi++;
|
fi++;
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
qDebug("real size: %ld, tree size: %ld", (long)t.total_size(), (long)root->getSize());
|
qDebug("real size: %ld, tree size: %ld", (long)t->total_size(), (long)root->getSize());
|
||||||
Q_ASSERT(root->getSize() == t.total_size());
|
Q_ASSERT(root->getSize() == t->total_size());
|
||||||
}
|
}
|
||||||
|
|
||||||
arborescence(torrent_info t, std::vector<float> fp, int *prioritiesTab) {
|
arborescence(torrent_info const& t, std::vector<size_type> fp, int *prioritiesTab) {
|
||||||
torrent_info::file_iterator fi = t.begin_files();
|
torrent_info::file_iterator fi = t.begin_files();
|
||||||
if(t.num_files() > 1) {
|
if(t.num_files() > 1) {
|
||||||
qDebug("More than one file in the torrent, setting a folder as root");
|
qDebug("More than one file in the torrent, setting a folder as root");
|
||||||
@@ -200,13 +207,13 @@ class arborescence {
|
|||||||
} else {
|
} else {
|
||||||
// XXX: Will crash if there is no file in torrent
|
// XXX: Will crash if there is no file in torrent
|
||||||
qDebug("one file in the torrent, setting it as root with index 0");
|
qDebug("one file in the torrent, setting it as root with index 0");
|
||||||
root = new torrent_file(0, misc::toQString(t.name()), false, fi->size, 0, fp[0], prioritiesTab[0]);
|
root = new torrent_file(0, misc::toQString(t.name()), false, fi->size, 0, ((double)fp[0])/t.file_at(0).size, prioritiesTab[0]);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while(fi != t.end_files()) {
|
while(fi != t.end_files()) {
|
||||||
QString path = QDir::cleanPath(misc::toQString(fi->path.string()));
|
QString path = QDir::cleanPath(misc::toQString(fi->path.string()));
|
||||||
addFile(path, fi->size, i, fp[i], prioritiesTab[i]);
|
addFile(path, fi->size, i, ((double)fp[i])/t.file_at(i).size, prioritiesTab[i]);
|
||||||
fi++;
|
fi++;
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
@@ -239,14 +246,13 @@ class arborescence {
|
|||||||
if(relative_path.at(0) ==QDir::separator())
|
if(relative_path.at(0) ==QDir::separator())
|
||||||
relative_path.remove(0, 1);
|
relative_path.remove(0, 1);
|
||||||
QStringList fileNames = relative_path.split(QDir::separator());
|
QStringList fileNames = relative_path.split(QDir::separator());
|
||||||
QString fileName;
|
|
||||||
torrent_file *dad = root;
|
torrent_file *dad = root;
|
||||||
unsigned int nb_i = 0;
|
unsigned int nb_i = 0;
|
||||||
unsigned int size = fileNames.size();
|
unsigned int size = fileNames.size();
|
||||||
foreach(fileName, fileNames) {
|
foreach(const QString &fileName, fileNames) {
|
||||||
++nb_i;
|
++nb_i;
|
||||||
if(fileName == ".") continue;
|
if(fileName == ".") continue;
|
||||||
torrent_file* child = dad->getChild(fileName);
|
const torrent_file* child = dad->getChild(fileName);
|
||||||
if(!child) {
|
if(!child) {
|
||||||
if(nb_i != size) {
|
if(nb_i != size) {
|
||||||
// Folder
|
// Folder
|
||||||
@@ -256,7 +262,7 @@ class arborescence {
|
|||||||
child = dad->addChild(fileName, false, file_size, index, progress, priority);
|
child = dad->addChild(fileName, false, file_size, index, progress, priority);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dad = child;
|
dad = (torrent_file*)child;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
1305
src/bittorrent.cpp
117
src/bittorrent.h
@@ -16,16 +16,25 @@
|
|||||||
* 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 __BITTORRENT_H__
|
#ifndef __BITTORRENT_H__
|
||||||
#define __BITTORRENT_H__
|
#define __BITTORRENT_H__
|
||||||
|
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
#include <QList>
|
|
||||||
#include <QPair>
|
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
#include <QDateTime>
|
#include <QApplication>
|
||||||
|
#include <QPalette>
|
||||||
|
#include <QPointer>
|
||||||
|
|
||||||
#include <libtorrent/session.hpp>
|
#include <libtorrent/session.hpp>
|
||||||
#include <libtorrent/ip_filter.hpp>
|
#include <libtorrent/ip_filter.hpp>
|
||||||
@@ -34,42 +43,39 @@
|
|||||||
using namespace libtorrent;
|
using namespace libtorrent;
|
||||||
|
|
||||||
class downloadThread;
|
class downloadThread;
|
||||||
class deleteThread;
|
|
||||||
class QTimer;
|
class QTimer;
|
||||||
|
class QFileSystemWatcher;
|
||||||
|
class QMutex;
|
||||||
class FilterParserThread;
|
class FilterParserThread;
|
||||||
|
|
||||||
class bittorrent : public QObject{
|
class bittorrent : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
private:
|
private:
|
||||||
session *s;
|
session *s;
|
||||||
QString scan_dir;
|
QPointer<QFileSystemWatcher> FSWatcher;
|
||||||
QTimer *timerScan;
|
QMutex* FSMutex;
|
||||||
QTimer *timerAlerts;
|
QPointer<QTimer> timerAlerts;
|
||||||
QTimer *fastResumeSaver;
|
QPointer<QTimer> BigRatioTimer;
|
||||||
QTimer *BigRatioTimer;
|
|
||||||
bool DHTEnabled;
|
bool DHTEnabled;
|
||||||
downloadThread *downloader;
|
QPointer<downloadThread> downloader;
|
||||||
QString defaultSavePath;
|
QString defaultSavePath;
|
||||||
QStringList torrentsToPauseAfterChecking;
|
QString defaultTempPath;
|
||||||
QHash<QString, QDateTime> TorrentsStartTime;
|
|
||||||
QHash<QString, size_type> TorrentsStartData;
|
|
||||||
QHash<QString, QPair<size_type,size_type> > ratioData;
|
|
||||||
QHash<QString, QHash<QString, QString> > trackersErrors;
|
QHash<QString, QHash<QString, QString> > trackersErrors;
|
||||||
deleteThread *deleter;
|
QStringList consoleMessages;
|
||||||
QStringList finishedTorrents;
|
QStringList peerBanMessages;
|
||||||
QStringList unfinishedTorrents;
|
|
||||||
bool preAllocateAll;
|
bool preAllocateAll;
|
||||||
bool addInPause;
|
bool addInPause;
|
||||||
int maxConnecsPerTorrent;
|
int maxConnecsPerTorrent;
|
||||||
int maxUploadsPerTorrent;
|
int maxUploadsPerTorrent;
|
||||||
float max_ratio;
|
float ratio_limit;
|
||||||
bool UPnPEnabled;
|
bool UPnPEnabled;
|
||||||
bool NATPMPEnabled;
|
bool NATPMPEnabled;
|
||||||
bool LSDEnabled;
|
bool LSDEnabled;
|
||||||
FilterParserThread *filterParser;
|
QPointer<FilterParserThread> filterParser;
|
||||||
QString filterPath;
|
QString filterPath;
|
||||||
int folderScanInterval; // in seconds
|
bool queueingEnabled;
|
||||||
|
QStringList url_skippingDlg;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
QString getSavePath(QString hash);
|
QString getSavePath(QString hash);
|
||||||
@@ -79,50 +85,59 @@ class bittorrent : public QObject{
|
|||||||
bittorrent();
|
bittorrent();
|
||||||
~bittorrent();
|
~bittorrent();
|
||||||
QTorrentHandle getTorrentHandle(QString hash) const;
|
QTorrentHandle getTorrentHandle(QString hash) const;
|
||||||
bool isPaused(QString hash) const;
|
std::vector<torrent_handle> getTorrents() const;
|
||||||
bool isFilePreviewPossible(QString fileHash) const;
|
bool isFilePreviewPossible(QString fileHash) const;
|
||||||
bool isDHTEnabled() const;
|
bool isDHTEnabled() const;
|
||||||
float getPayloadDownloadRate() const;
|
float getPayloadDownloadRate() const;
|
||||||
float getPayloadUploadRate() const;
|
float getPayloadUploadRate() const;
|
||||||
session_status getSessionStatus() const;
|
session_status getSessionStatus() const;
|
||||||
int getListenPort() const;
|
int getListenPort() const;
|
||||||
QStringList getTorrentsToPauseAfterChecking() const;
|
|
||||||
qlonglong getETA(QString hash) const;
|
|
||||||
float getRealRatio(QString hash) const;
|
float getRealRatio(QString hash) const;
|
||||||
session* getSession() const;
|
session* getSession() const;
|
||||||
QHash<QString, QString> getTrackersErrors(QString hash) const;
|
QHash<QString, QString> getTrackersErrors(QString hash) const;
|
||||||
QStringList getFinishedTorrents() const;
|
|
||||||
QStringList getUnfinishedTorrents() const;
|
|
||||||
bool isFinished(QString hash) const;
|
|
||||||
bool has_filtered_files(QString hash) const;
|
bool has_filtered_files(QString hash) const;
|
||||||
unsigned int getFinishedPausedTorrentsNb() const;
|
unsigned int getFinishedPausedTorrentsNb() const;
|
||||||
unsigned int getUnfinishedPausedTorrentsNb() const;
|
unsigned int getUnfinishedPausedTorrentsNb() const;
|
||||||
|
bool isQueueingEnabled() const;
|
||||||
|
int getDlTorrentPriority(QString hash) const;
|
||||||
|
int getUpTorrentPriority(QString hash) const;
|
||||||
|
int getMaximumActiveDownloads() const;
|
||||||
|
int getMaximumActiveTorrents() const;
|
||||||
|
int loadTorrentPriority(QString hash);
|
||||||
|
QStringList getConsoleMessages() const;
|
||||||
|
QStringList getPeerBanMessages() const;
|
||||||
|
qlonglong getETA(QString hash) const;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void addTorrent(QString path, bool fromScanDir = false, QString from_url = QString(), bool resumed = false);
|
QTorrentHandle addTorrent(QString path, bool fromScanDir = false, QString from_url = QString(), bool resumed = false);
|
||||||
|
void loadSessionState();
|
||||||
|
void saveSessionState();
|
||||||
void downloadFromUrl(QString url);
|
void downloadFromUrl(QString url);
|
||||||
void downloadFromURLList(const QStringList& url_list);
|
void downloadFromURLList(const QStringList& url_list);
|
||||||
void deleteTorrent(QString hash, bool permanent = false);
|
void deleteTorrent(QString hash, bool permanent = false);
|
||||||
bool pauseTorrent(QString hash);
|
/* Needed by Web UI */
|
||||||
bool resumeTorrent(QString hash);
|
|
||||||
void pauseAllTorrents();
|
void pauseAllTorrents();
|
||||||
void resumeAllTorrents();
|
void resumeAllTorrents();
|
||||||
|
void pauseTorrent(QString hash);
|
||||||
|
void resumeTorrent(QString hash);
|
||||||
|
/* End Web UI */
|
||||||
void saveDHTEntry();
|
void saveDHTEntry();
|
||||||
void preAllocateAllFiles(bool b);
|
void preAllocateAllFiles(bool b);
|
||||||
void saveFastResumeAndRatioData();
|
void saveFastResumeData();
|
||||||
void saveFastResumeAndRatioData(QString hash);
|
|
||||||
void enableDirectoryScanning(QString scan_dir);
|
void enableDirectoryScanning(QString scan_dir);
|
||||||
void disableDirectoryScanning();
|
void disableDirectoryScanning();
|
||||||
void enablePeerExchange();
|
|
||||||
void enableIPFilter(QString filter);
|
void enableIPFilter(QString filter);
|
||||||
void disableIPFilter();
|
void disableIPFilter();
|
||||||
|
void setQueueingEnabled(bool enable);
|
||||||
void resumeUnfinishedTorrents();
|
void resumeUnfinishedTorrents();
|
||||||
|
void saveTorrentPriority(QString hash, int prio);
|
||||||
void saveTorrentSpeedLimits(QString hash);
|
void saveTorrentSpeedLimits(QString hash);
|
||||||
void loadTorrentSpeedLimits(QString hash);
|
void loadTorrentSpeedLimits(QString hash);
|
||||||
void saveDownloadUploadForTorrent(QString hash);
|
|
||||||
void loadDownloadUploadForTorrent(QString hash);
|
|
||||||
void handleDownloadFailure(QString url, QString reason);
|
void handleDownloadFailure(QString url, QString reason);
|
||||||
void loadWebSeeds(QString fileHash);
|
void loadWebSeeds(QString fileHash);
|
||||||
|
void increaseDlTorrentPriority(QString hash);
|
||||||
|
void decreaseDlTorrentPriority(QString hash);
|
||||||
|
void downloadUrlAndSkipDialog(QString);
|
||||||
// Session configuration - Setters
|
// Session configuration - Setters
|
||||||
void setListeningPortsRange(std::pair<unsigned short, unsigned short> ports);
|
void setListeningPortsRange(std::pair<unsigned short, unsigned short> ports);
|
||||||
void setMaxConnections(int maxConnec);
|
void setMaxConnections(int maxConnec);
|
||||||
@@ -137,51 +152,39 @@ class bittorrent : public QObject{
|
|||||||
void setSessionSettings(session_settings sessionSettings);
|
void setSessionSettings(session_settings sessionSettings);
|
||||||
void startTorrentsInPause(bool b);
|
void startTorrentsInPause(bool b);
|
||||||
void setDefaultSavePath(QString savepath);
|
void setDefaultSavePath(QString savepath);
|
||||||
|
void setDefaultTempPath(QString temppath);
|
||||||
void applyEncryptionSettings(pe_settings se);
|
void applyEncryptionSettings(pe_settings se);
|
||||||
void loadFilesPriorities(QTorrentHandle& h);
|
void loadFilesPriorities(QTorrentHandle& h);
|
||||||
void setDownloadLimit(QString hash, long val);
|
void setDownloadLimit(QString hash, long val);
|
||||||
void setUploadLimit(QString hash, long val);
|
void setUploadLimit(QString hash, long val);
|
||||||
void setUnfinishedTorrent(QString hash);
|
|
||||||
void setFinishedTorrent(QString hash);
|
|
||||||
void enableUPnP(bool b);
|
void enableUPnP(bool b);
|
||||||
void enableNATPMP(bool b);
|
void enableNATPMP(bool b);
|
||||||
void enableLSD(bool b);
|
void enableLSD(bool b);
|
||||||
bool enableDHT(bool b);
|
bool enableDHT(bool b);
|
||||||
void reloadTorrent(const QTorrentHandle &h, bool full_alloc);
|
void addConsoleMessage(QString msg, QColor color=QApplication::palette().color(QPalette::WindowText));
|
||||||
void setTimerScanInterval(int secs);
|
void addPeerBanMessage(QString msg, bool from_ipfilter);
|
||||||
|
void processDownloadedFile(QString, QString);
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
void scanDirectory();
|
void scanDirectory(QString);
|
||||||
void readAlerts();
|
void readAlerts();
|
||||||
void processDownloadedFile(QString, QString);
|
|
||||||
bool loadTrackerFile(QString hash);
|
bool loadTrackerFile(QString hash);
|
||||||
void saveTrackerFile(QString hash);
|
void saveTrackerFile(QString hash);
|
||||||
void deleteBigRatios();
|
void deleteBigRatios();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void invalidTorrent(QString path);
|
void addedTorrent(QTorrentHandle& h);
|
||||||
void duplicateTorrent(QString path);
|
|
||||||
void addedTorrent(QString path, QTorrentHandle& h, bool fastResume);
|
|
||||||
void deletedTorrent(QString hash);
|
void deletedTorrent(QString hash);
|
||||||
void pausedTorrent(QString hash);
|
void pausedTorrent(QTorrentHandle& h);
|
||||||
void resumedTorrent(QString hash);
|
void resumedTorrent(QTorrentHandle& h);
|
||||||
void finishedTorrent(QTorrentHandle& h);
|
void finishedTorrent(QTorrentHandle& h);
|
||||||
void fullDiskError(QTorrentHandle& h);
|
void fullDiskError(QTorrentHandle& h, QString msg);
|
||||||
void trackerError(QString hash, QString time, QString msg);
|
void trackerError(QString hash, QString time, QString msg);
|
||||||
void portListeningFailure();
|
|
||||||
void trackerAuthenticationRequired(QTorrentHandle& h);
|
void trackerAuthenticationRequired(QTorrentHandle& h);
|
||||||
void scanDirFoundTorrents(const QStringList& pathList);
|
|
||||||
void newDownloadedTorrent(QString path, QString url);
|
void newDownloadedTorrent(QString path, QString url);
|
||||||
void aboutToDownloadFromUrl(QString url);
|
|
||||||
void updateFileSize(QString hash);
|
void updateFileSize(QString hash);
|
||||||
void peerBlocked(QString);
|
|
||||||
void downloadFromUrlFailure(QString url, QString reason);
|
void downloadFromUrlFailure(QString url, QString reason);
|
||||||
void fastResumeDataRejected(QString name);
|
void torrentFinishedChecking(QTorrentHandle& h);
|
||||||
void urlSeedProblem(QString url, QString msg);
|
|
||||||
void torrentFinishedChecking(QString hash);
|
|
||||||
void torrent_ratio_deleted(QString fileName);
|
|
||||||
void UPnPError(QString msg);
|
|
||||||
void UPnPSuccess(QString msg);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
58
src/console.ui
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
<ui version="4.0" >
|
||||||
|
<class>ConsoleDlg</class>
|
||||||
|
<widget class="QDialog" name="ConsoleDlg" >
|
||||||
|
<property name="geometry" >
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>512</width>
|
||||||
|
<height>497</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle" >
|
||||||
|
<string>qBittorrent console</string>
|
||||||
|
</property>
|
||||||
|
<property name="windowIcon" >
|
||||||
|
<iconset resource="icons.qrc" >:/Icons/oxygen/log.png</iconset>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QTabWidget" name="tabConsole" >
|
||||||
|
<property name="currentIndex" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="tab" >
|
||||||
|
<attribute name="title" >
|
||||||
|
<string>General</string>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="icon" >
|
||||||
|
<iconset resource="icons.qrc" >:/Icons/oxygen/log.png</iconset>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QVBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QTextBrowser" name="textConsole" />
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="tab_2" >
|
||||||
|
<attribute name="title" >
|
||||||
|
<string>Blocked IPs</string>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="icon" >
|
||||||
|
<iconset resource="icons.qrc" >:/Icons/filter.png</iconset>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QVBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QTextBrowser" name="textBannedPeers" />
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources>
|
||||||
|
<include location="icons.qrc" />
|
||||||
|
</resources>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
||||||
59
src/console_imp.h
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* 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 CONSOLE_H
|
||||||
|
#define CONSOLE_H
|
||||||
|
|
||||||
|
#include "bittorrent.h"
|
||||||
|
#include "ui_console.h"
|
||||||
|
|
||||||
|
using namespace libtorrent;
|
||||||
|
|
||||||
|
class consoleDlg : public QDialog, private Ui_ConsoleDlg{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
private:
|
||||||
|
bittorrent *BTSession;
|
||||||
|
|
||||||
|
public:
|
||||||
|
consoleDlg(QWidget *parent, bittorrent* _BTSession) : QDialog(parent) {
|
||||||
|
setupUi(this);
|
||||||
|
setAttribute(Qt::WA_DeleteOnClose);
|
||||||
|
BTSession = _BTSession;
|
||||||
|
textConsole->setHtml(BTSession->getConsoleMessages().join("<br>"));
|
||||||
|
textBannedPeers->setHtml(BTSession->getPeerBanMessages().join("<br>"));
|
||||||
|
show();
|
||||||
|
}
|
||||||
|
|
||||||
|
~consoleDlg() {}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -16,6 +16,15 @@
|
|||||||
* 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
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -26,6 +35,7 @@
|
|||||||
#include <boost/filesystem/operations.hpp>
|
#include <boost/filesystem/operations.hpp>
|
||||||
#include <boost/filesystem/path.hpp>
|
#include <boost/filesystem/path.hpp>
|
||||||
#include <boost/filesystem/fstream.hpp>
|
#include <boost/filesystem/fstream.hpp>
|
||||||
|
#include <boost/bind.hpp>
|
||||||
|
|
||||||
#include <libtorrent/entry.hpp>
|
#include <libtorrent/entry.hpp>
|
||||||
#include <libtorrent/bencode.hpp>
|
#include <libtorrent/bencode.hpp>
|
||||||
@@ -34,6 +44,7 @@
|
|||||||
#include <libtorrent/storage.hpp>
|
#include <libtorrent/storage.hpp>
|
||||||
#include <libtorrent/hasher.hpp>
|
#include <libtorrent/hasher.hpp>
|
||||||
#include <libtorrent/file_pool.hpp>
|
#include <libtorrent/file_pool.hpp>
|
||||||
|
#include <libtorrent/create_torrent.hpp>
|
||||||
|
|
||||||
#include "createtorrent_imp.h"
|
#include "createtorrent_imp.h"
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
@@ -41,13 +52,23 @@
|
|||||||
using namespace libtorrent;
|
using namespace libtorrent;
|
||||||
using namespace boost::filesystem;
|
using namespace boost::filesystem;
|
||||||
|
|
||||||
|
// do not include files and folders whose
|
||||||
|
// name starts with a .
|
||||||
|
bool file_filter(boost::filesystem::path const& filename)
|
||||||
|
{
|
||||||
|
if (filename.leaf()[0] == '.') return false;
|
||||||
|
std::cerr << filename << std::endl;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
createtorrent::createtorrent(QWidget *parent): QDialog(parent){
|
createtorrent::createtorrent(QWidget *parent): QDialog(parent){
|
||||||
setupUi(this);
|
setupUi(this);
|
||||||
setAttribute(Qt::WA_DeleteOnClose);
|
setAttribute(Qt::WA_DeleteOnClose);
|
||||||
creatorThread = new torrentCreatorThread();
|
creatorThread = new torrentCreatorThread(this);
|
||||||
connect(creatorThread, SIGNAL(creationSuccess(QString)), this, SLOT(handleCreationSucess(QString)));
|
connect(creatorThread, SIGNAL(creationSuccess(QString, const char*)), this, SLOT(handleCreationSuccess(QString, const char*)));
|
||||||
connect(creatorThread, SIGNAL(creationFailure(QString)), this, SLOT(handleCreationFailure(QString)));
|
connect(creatorThread, SIGNAL(creationFailure(QString)), this, SLOT(handleCreationFailure(QString)));
|
||||||
connect(creatorThread, SIGNAL(updateProgress(int)), this, SLOT(updateProgressBar(int)));
|
connect(creatorThread, SIGNAL(updateProgress(int)), this, SLOT(updateProgressBar(int)));
|
||||||
|
path::default_name_check(no_check);
|
||||||
show();
|
show();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -126,20 +147,6 @@ void createtorrent::on_addURLSeed_button_clicked(){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Subfunction to add files to a torrent_info structure
|
|
||||||
// Written by Arvid Norberg (libtorrent Author)
|
|
||||||
void add_files(torrent_info& t, path const& p, path const& l){
|
|
||||||
qDebug("p: %s, l: %s, l.leaf(): %s", p.string().c_str(), l.string().c_str(), l.leaf().c_str());
|
|
||||||
path f(p / l);
|
|
||||||
if (is_directory(f)){
|
|
||||||
for (directory_iterator i(f), end; i != end; ++i)
|
|
||||||
add_files(t, p, l / i->leaf());
|
|
||||||
}else{
|
|
||||||
qDebug("Adding %s", l.string().c_str());
|
|
||||||
t.add_file(l, file_size(f));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QStringList createtorrent::allItems(QListWidget *list){
|
QStringList createtorrent::allItems(QListWidget *list){
|
||||||
QStringList res;
|
QStringList res;
|
||||||
unsigned int nbItems = list->count();
|
unsigned int nbItems = list->count();
|
||||||
@@ -177,20 +184,27 @@ void createtorrent::on_createButton_clicked(){
|
|||||||
|
|
||||||
void createtorrent::handleCreationFailure(QString msg) {
|
void createtorrent::handleCreationFailure(QString msg) {
|
||||||
QMessageBox::information(0, tr("Torrent creation"), tr("Torrent creation was unsuccessful, reason: %1").arg(msg));
|
QMessageBox::information(0, tr("Torrent creation"), tr("Torrent creation was unsuccessful, reason: %1").arg(msg));
|
||||||
hide();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void createtorrent::handleCreationSuccess(QString path, const char* branch_path, QString hash) {
|
void createtorrent::handleCreationSuccess(QString path, const char* branch_path) {
|
||||||
if(checkStartSeeding->isChecked()) {
|
if(checkStartSeeding->isChecked()) {
|
||||||
// Create save path file
|
// Create save path file
|
||||||
QFile savepath_file(misc::qBittorrentPath()+QString::fromUtf8("BT_backup")+QDir::separator()+hash+QString::fromUtf8(".savepath"));
|
boost::intrusive_ptr<torrent_info> t;
|
||||||
savepath_file.open(QIODevice::WriteOnly | QIODevice::Text);
|
try {
|
||||||
savepath_file.write(branch_path);
|
t = new torrent_info(path.toLocal8Bit().data());
|
||||||
savepath_file.close();
|
} catch(std::exception&) {
|
||||||
emit torrent_to_seed(path);
|
QMessageBox::critical(0, tr("Torrent creation"), tr("Created torrent file is invalid. It won't be added to download list."));
|
||||||
}
|
return;
|
||||||
QMessageBox::information(0, tr("Torrent creation"), tr("Torrent was created successfully:")+" "+path);
|
}
|
||||||
hide();
|
QString hash = misc::toQString(t->info_hash());
|
||||||
|
QFile savepath_file(misc::qBittorrentPath()+QString::fromUtf8("BT_backup")+QDir::separator()+hash+QString::fromUtf8(".savepath"));
|
||||||
|
savepath_file.open(QIODevice::WriteOnly | QIODevice::Text);
|
||||||
|
savepath_file.write(branch_path);
|
||||||
|
savepath_file.close();
|
||||||
|
emit torrent_to_seed(path);
|
||||||
|
}
|
||||||
|
QMessageBox::information(0, tr("Torrent creation"), tr("Torrent was created successfully:")+" "+path);
|
||||||
|
close();
|
||||||
}
|
}
|
||||||
|
|
||||||
void createtorrent::updateProgressBar(int progress) {
|
void createtorrent::updateProgressBar(int progress) {
|
||||||
@@ -213,54 +227,49 @@ void torrentCreatorThread::create(QString _input_path, QString _save_path, QStri
|
|||||||
start();
|
start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sendProgressUpdateSignal(int i, int num, torrentCreatorThread *parent){
|
||||||
|
parent->sendProgressSignal((int)(i*100./(float)num));
|
||||||
|
}
|
||||||
|
|
||||||
|
void torrentCreatorThread::sendProgressSignal(int progress) {
|
||||||
|
emit updateProgress(progress);
|
||||||
|
}
|
||||||
|
|
||||||
void torrentCreatorThread::run() {
|
void torrentCreatorThread::run() {
|
||||||
emit updateProgress(0);
|
emit updateProgress(0);
|
||||||
char const* creator_str = "qBittorrent "VERSION;
|
char const* creator_str = "qBittorrent "VERSION;
|
||||||
try {
|
try {
|
||||||
boost::intrusive_ptr<torrent_info> t(new torrent_info);
|
file_storage fs;
|
||||||
ofstream out(complete(path((const char*)save_path.toUtf8())), std::ios_base::binary);
|
file_pool fp;
|
||||||
|
path full_path = complete(path(input_path.toLocal8Bit().data()));
|
||||||
// Adding files to the torrent
|
// Adding files to the torrent
|
||||||
path full_path = complete(path(input_path.toUtf8().data()));
|
add_files(fs, full_path, file_filter);
|
||||||
add_files(*t, full_path.branch_path(), full_path.leaf());
|
|
||||||
if(abort) return;
|
if(abort) return;
|
||||||
// Set piece size
|
create_torrent t(fs, piece_size);
|
||||||
t->set_piece_size(piece_size);
|
|
||||||
// Add url seeds
|
// Add url seeds
|
||||||
QString seed;
|
QString seed;
|
||||||
foreach(seed, url_seeds){
|
foreach(seed, url_seeds){
|
||||||
t->add_url_seed(seed.toUtf8().data());
|
t.add_url_seed(seed.toLocal8Bit().data());
|
||||||
}
|
}
|
||||||
for(int i=0; i<trackers.size(); ++i){
|
for(int i=0; i<trackers.size(); ++i){
|
||||||
t->add_tracker(trackers.at(i).toUtf8().data());
|
t.add_tracker(trackers.at(i).toLocal8Bit().data());
|
||||||
}
|
}
|
||||||
if(abort) return;
|
if(abort) return;
|
||||||
// calculate the hash for all pieces
|
// calculate the hash for all pieces
|
||||||
file_pool fp;
|
set_piece_hashes(t, full_path.branch_path(), boost::bind<void>(&sendProgressUpdateSignal, _1, t.num_pieces(), this));
|
||||||
boost::scoped_ptr<storage_interface> st(default_storage_constructor(t, full_path.branch_path(), fp));
|
|
||||||
int num = t->num_pieces();
|
|
||||||
std::vector<char> buf(piece_size);
|
|
||||||
for (int i = 0; i < num; ++i) {
|
|
||||||
st->read(&buf[0], i, 0, t->piece_size(i));
|
|
||||||
hasher h(&buf[0], t->piece_size(i));
|
|
||||||
t->set_hash(i, h.final());
|
|
||||||
emit updateProgress((int)(i*100./(float)num));
|
|
||||||
if(abort) return;
|
|
||||||
}
|
|
||||||
// Set qBittorrent as creator and add user comment to
|
// Set qBittorrent as creator and add user comment to
|
||||||
// torrent_info structure
|
// torrent_info structure
|
||||||
t->set_creator(creator_str);
|
t.set_creator(creator_str);
|
||||||
t->set_comment((const char*)comment.toUtf8());
|
t.set_comment((const char*)comment.toLocal8Bit());
|
||||||
// Is private ?
|
// Is private ?
|
||||||
if(is_private){
|
t.set_priv(is_private);
|
||||||
t->set_priv(true);
|
|
||||||
}
|
|
||||||
if(abort) return;
|
if(abort) return;
|
||||||
// create the torrent and print it to out
|
// create the torrent and print it to out
|
||||||
entry e = t->create_torrent();
|
ofstream out(complete(path((const char*)save_path.toLocal8Bit())), std::ios_base::binary);
|
||||||
libtorrent::bencode(std::ostream_iterator<char>(out), e);
|
bencode(std::ostream_iterator<char>(out), t.generate());
|
||||||
out.flush();
|
|
||||||
emit updateProgress(100);
|
emit updateProgress(100);
|
||||||
emit creationSuccess(save_path, full_path.branch_path().string().c_str(), misc::toQString(t->info_hash()));
|
emit creationSuccess(save_path, full_path.branch_path().string().c_str());
|
||||||
}
|
}
|
||||||
catch (std::exception& e){
|
catch (std::exception& e){
|
||||||
emit creationFailure(QString::fromUtf8(e.what()));
|
emit creationFailure(QString::fromUtf8(e.what()));
|
||||||
|
|||||||
@@ -16,6 +16,15 @@
|
|||||||
* 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
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -37,21 +46,27 @@ class torrentCreatorThread : public QThread {
|
|||||||
bool is_private;
|
bool is_private;
|
||||||
int piece_size;
|
int piece_size;
|
||||||
bool abort;
|
bool abort;
|
||||||
|
QDialog *parent;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
torrentCreatorThread() {}
|
torrentCreatorThread(QDialog *_parent) {
|
||||||
|
parent = _parent;
|
||||||
|
}
|
||||||
~torrentCreatorThread() {
|
~torrentCreatorThread() {
|
||||||
abort = true;
|
abort = true;
|
||||||
wait();
|
wait();
|
||||||
}
|
}
|
||||||
void create(QString _input_path, QString _save_path, QStringList _trackers, QStringList _url_seeds, QString _comment, bool _is_private, int _piece_size);
|
void create(QString _input_path, QString _save_path, QStringList _trackers, QStringList _url_seeds, QString _comment, bool _is_private, int _piece_size);
|
||||||
|
void sendProgressSignal(int progress);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void run();
|
void run();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void creationFailure(QString msg);
|
void creationFailure(QString msg);
|
||||||
void creationSuccess(QString path, const char* branch_path, QString hash);
|
void creationSuccess(QString path, const char* branch_path);
|
||||||
|
|
||||||
|
signals:
|
||||||
void updateProgress(int progress);
|
void updateProgress(int progress);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -70,6 +85,9 @@ class createtorrent : public QDialog, private Ui::createTorrentDialog{
|
|||||||
signals:
|
signals:
|
||||||
void torrent_to_seed(QString path);
|
void torrent_to_seed(QString path);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void updateProgressBar(int progress);
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
void on_createButton_clicked();
|
void on_createButton_clicked();
|
||||||
void on_addFile_button_clicked();
|
void on_addFile_button_clicked();
|
||||||
@@ -79,8 +97,7 @@ class createtorrent : public QDialog, private Ui::createTorrentDialog{
|
|||||||
void on_addURLSeed_button_clicked();
|
void on_addURLSeed_button_clicked();
|
||||||
void on_removeURLSeed_button_clicked();
|
void on_removeURLSeed_button_clicked();
|
||||||
void handleCreationFailure(QString msg);
|
void handleCreationFailure(QString msg);
|
||||||
void handleCreationSuccess(QString path, const char* branch_path, QString hash);
|
void handleCreationSuccess(QString path, const char* branch_path);
|
||||||
void updateProgressBar(int progress);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,125 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Contact : chris@qbittorrent.org
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef DELETETHREAD_H
|
|
||||||
#define DELETETHREAD_H
|
|
||||||
|
|
||||||
#include <QThread>
|
|
||||||
#include <QMutex>
|
|
||||||
#include <QWaitCondition>
|
|
||||||
#include <QMutexLocker>
|
|
||||||
#include <QPair>
|
|
||||||
|
|
||||||
#include "arborescence.h"
|
|
||||||
|
|
||||||
class subDeleteThread : public QThread {
|
|
||||||
Q_OBJECT
|
|
||||||
private:
|
|
||||||
QString save_path;
|
|
||||||
arborescence *arb;
|
|
||||||
bool abort;
|
|
||||||
|
|
||||||
public:
|
|
||||||
subDeleteThread(QObject *parent, QString saveDir, arborescence *arb) : QThread(parent), save_path(saveDir), arb(arb), abort(false){}
|
|
||||||
|
|
||||||
~subDeleteThread(){
|
|
||||||
abort = true;
|
|
||||||
wait();
|
|
||||||
}
|
|
||||||
|
|
||||||
signals:
|
|
||||||
// For subthreads
|
|
||||||
void deletionSuccessST(subDeleteThread* st);
|
|
||||||
void deletionFailureST(subDeleteThread* st);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void run(){
|
|
||||||
if(arb->removeFromFS(save_path))
|
|
||||||
emit deletionSuccessST(this);
|
|
||||||
else
|
|
||||||
emit deletionFailureST(this);
|
|
||||||
delete arb;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class deleteThread : public QThread {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
private:
|
|
||||||
QList<QPair<QString, arborescence*> > torrents_list;
|
|
||||||
QMutex mutex;
|
|
||||||
QWaitCondition condition;
|
|
||||||
bool abort;
|
|
||||||
QList<subDeleteThread*> subThreads;
|
|
||||||
|
|
||||||
public:
|
|
||||||
deleteThread(QObject* parent) : QThread(parent), abort(false){}
|
|
||||||
|
|
||||||
~deleteThread(){
|
|
||||||
mutex.lock();
|
|
||||||
abort = true;
|
|
||||||
condition.wakeOne();
|
|
||||||
mutex.unlock();
|
|
||||||
qDeleteAll(subThreads);
|
|
||||||
wait();
|
|
||||||
}
|
|
||||||
|
|
||||||
void deleteTorrent(QString saveDir, arborescence *arb){
|
|
||||||
qDebug("deleteThread called");
|
|
||||||
QMutexLocker locker(&mutex);
|
|
||||||
torrents_list << QPair<QString, arborescence*>(saveDir, arb);
|
|
||||||
if(!isRunning()){
|
|
||||||
start();
|
|
||||||
}else{
|
|
||||||
condition.wakeOne();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void run(){
|
|
||||||
forever{
|
|
||||||
if(abort)
|
|
||||||
return;
|
|
||||||
mutex.lock();
|
|
||||||
if(torrents_list.size() != 0){
|
|
||||||
QPair<QString, arborescence *> torrent = torrents_list.takeFirst();
|
|
||||||
mutex.unlock();
|
|
||||||
subDeleteThread *st = new subDeleteThread(0, torrent.first, torrent.second);
|
|
||||||
subThreads << st;
|
|
||||||
connect(st, SIGNAL(deletionSuccessST(subDeleteThread*)), this, SLOT(deleteSubThread(subDeleteThread*)));
|
|
||||||
connect(st, SIGNAL(deletionFailureST(subDeleteThread*)), this, SLOT(deleteSubThread(subDeleteThread*)));
|
|
||||||
st->start();
|
|
||||||
}else{
|
|
||||||
condition.wait(&mutex);
|
|
||||||
mutex.unlock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
protected slots:
|
|
||||||
void deleteSubThread(subDeleteThread* st){
|
|
||||||
int index = subThreads.indexOf(st);
|
|
||||||
Q_ASSERT(index != -1);
|
|
||||||
subThreads.removeAt(index);
|
|
||||||
delete st;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||