Compare commits
769 Commits
release-2.
...
release-2.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b496cf600b | ||
|
|
797a4608bf | ||
|
|
abb8554c51 | ||
|
|
258a3ea3b0 | ||
|
|
6d1ad28d8c | ||
|
|
38aca6af6f | ||
|
|
0fd8ecd9ee | ||
|
|
f24224649d | ||
|
|
b41aa38f39 | ||
|
|
b267ac169d | ||
|
|
1c0f1b91e7 | ||
|
|
9bf673210f | ||
|
|
42f5cbf2a6 | ||
|
|
45f0383ee2 | ||
|
|
a39c7f52cf | ||
|
|
f1ca4f40af | ||
|
|
62503fb663 | ||
|
|
0853ae4691 | ||
|
|
bb19cfce1f | ||
|
|
287cdc43c1 | ||
|
|
79e595c195 | ||
|
|
d198451bb0 | ||
|
|
ebf252ce86 | ||
|
|
f9ece8b447 | ||
|
|
efe5ca6242 | ||
|
|
0dbcf5653d | ||
|
|
20a201703c | ||
|
|
bfaa6c69fd | ||
|
|
6744ee8a4d | ||
|
|
20630e91ec | ||
|
|
cec74eb080 | ||
|
|
4e51393dd2 | ||
|
|
5d86930c80 | ||
|
|
cc1b812232 | ||
|
|
0fcbcd0dcd | ||
|
|
dd9e290a60 | ||
|
|
61a05c7e5b | ||
|
|
1c27e2bd35 | ||
|
|
68f66579ea | ||
|
|
e5eaea8949 | ||
|
|
ed491cf7cb | ||
|
|
3b3642bbba | ||
|
|
28eddb74ed | ||
|
|
401693dccd | ||
|
|
826e137aa5 | ||
|
|
7d4805988e | ||
|
|
bc2694bb88 | ||
|
|
19db0d471f | ||
|
|
2f337f9191 | ||
|
|
e05536a115 | ||
|
|
7364815ef3 | ||
|
|
bcc6597e93 | ||
|
|
661e2cb6fc | ||
|
|
8a5dc1f239 | ||
|
|
61208fce13 | ||
|
|
71c4f6e7e3 | ||
|
|
b169083fe2 | ||
|
|
efe5e7b068 | ||
|
|
ee3d4ce8f1 | ||
|
|
2707bf6349 | ||
|
|
a4b6228542 | ||
|
|
d49164b362 | ||
|
|
906b0755eb | ||
|
|
52f81a8066 | ||
|
|
d8af5d681c | ||
|
|
d05c725253 | ||
|
|
5fc3aa17b9 | ||
|
|
e15ac643de | ||
|
|
0b9f9aa0d7 | ||
|
|
549fcf8b4c | ||
|
|
19b11b8fa8 | ||
|
|
ba83354f32 | ||
|
|
a63eecc86a | ||
|
|
1ad80a8e2b | ||
|
|
b7ae2eabc7 | ||
|
|
c9ff34af8d | ||
|
|
8a1e79d22f | ||
|
|
1ca084038c | ||
|
|
c77eb35f5b | ||
|
|
f5cf5c2176 | ||
|
|
2b4043dc43 | ||
|
|
a3db4790a7 | ||
|
|
299b0f90bc | ||
|
|
a58d5c0f32 | ||
|
|
ea631f6675 | ||
|
|
7a5f9195fc | ||
|
|
6629c39f01 | ||
|
|
29e465d2f6 | ||
|
|
8c33daa369 | ||
|
|
147060fdee | ||
|
|
1fd326aa15 | ||
|
|
e5032a52c4 | ||
|
|
a640b08414 | ||
|
|
3144bfebc7 | ||
|
|
df04427c6a | ||
|
|
6a689e83c4 | ||
|
|
9fe64982bb | ||
|
|
5cd376d2c3 | ||
|
|
1d795d85d2 | ||
|
|
d5898f024d | ||
|
|
2de4c50d4f | ||
|
|
e57f8b6204 | ||
|
|
9c67aaf641 | ||
|
|
af562ecf89 | ||
|
|
d76877b1a2 | ||
|
|
01cc4452b2 | ||
|
|
1cb30d77fd | ||
|
|
126e2e7c75 | ||
|
|
9c13ed2635 | ||
|
|
e11545c8a3 | ||
|
|
ad087d7e88 | ||
|
|
c387c15eb0 | ||
|
|
345222cf42 | ||
|
|
adffd7df74 | ||
|
|
4de980c1a1 | ||
|
|
578a5c9551 | ||
|
|
c47dbfb1f5 | ||
|
|
cb0942b388 | ||
|
|
1904bc1abb | ||
|
|
5a02c56865 | ||
|
|
d7b0299416 | ||
|
|
265ab7bef2 | ||
|
|
e824bc8bb1 | ||
|
|
046ebb5a8f | ||
|
|
8b83d60732 | ||
|
|
d2754fb242 | ||
|
|
30ba1a428e | ||
|
|
0553668da8 | ||
|
|
ff63d75532 | ||
|
|
b7ec18e4f1 | ||
|
|
9c9944715a | ||
|
|
ea1a54c5f1 | ||
|
|
34cb5efb72 | ||
|
|
8597689a52 | ||
|
|
41a61ced89 | ||
|
|
da95d5e0df | ||
|
|
8276c301c2 | ||
|
|
75ff9984fa | ||
|
|
cda77d1724 | ||
|
|
583b8c60bb | ||
|
|
5c2b57052b | ||
|
|
9cf79a4a76 | ||
|
|
c4968edb79 | ||
|
|
a859a6d179 | ||
|
|
e2c75b5a11 | ||
|
|
12195b186b | ||
|
|
658d876ff7 | ||
|
|
390508e7db | ||
|
|
0a2efaf5fc | ||
|
|
6b7af5b464 | ||
|
|
a2c19302cb | ||
|
|
1638554944 | ||
|
|
1d1b49205d | ||
|
|
0ca7100168 | ||
|
|
26c680ae1f | ||
|
|
6c1eda8755 | ||
|
|
0374f9d0a8 | ||
|
|
080a36de5f | ||
|
|
071801fee7 | ||
|
|
bee507cb45 | ||
|
|
7d6df2a3c2 | ||
|
|
a2ffecd6bd | ||
|
|
1532b24448 | ||
|
|
c4dae02ef6 | ||
|
|
846962aab1 | ||
|
|
35e98b6cbb | ||
|
|
ecfc3d0118 | ||
|
|
3ecc8c8d67 | ||
|
|
a83fbf5a98 | ||
|
|
328e4fd860 | ||
|
|
b98d0282ce | ||
|
|
166dad51d5 | ||
|
|
e3ccea3b17 | ||
|
|
8a64a6441e | ||
|
|
c34000ab17 | ||
|
|
90dd337069 | ||
|
|
31e4b8dc31 | ||
|
|
5145abe5c8 | ||
|
|
7ec842929a | ||
|
|
39778baaf5 | ||
|
|
0a510db95e | ||
|
|
c73243b0d2 | ||
|
|
46b75b760f | ||
|
|
fc3ae51122 | ||
|
|
05d9f28f8b | ||
|
|
b1b2a2c775 | ||
|
|
105de3161a | ||
|
|
354d968a94 | ||
|
|
f617b74bac | ||
|
|
3664134e02 | ||
|
|
1875846326 | ||
|
|
64f0adc813 | ||
|
|
a9d4b38bd3 | ||
|
|
44fa7388d5 | ||
|
|
24df142b02 | ||
|
|
958b73f2cb | ||
|
|
1962898e24 | ||
|
|
56b88661bc | ||
|
|
5b47a762ac | ||
|
|
a5c6bcceea | ||
|
|
290932e128 | ||
|
|
f53fe96191 | ||
|
|
fc8a822dac | ||
|
|
b7a3ae2b4c | ||
|
|
26d19b33e6 | ||
|
|
4ba9dc1fed | ||
|
|
2c3f99692d | ||
|
|
a27d2dcac2 | ||
|
|
f7cb6a7da5 | ||
|
|
6855edf649 | ||
|
|
aff27558dd | ||
|
|
f6172f8c77 | ||
|
|
1562088bc8 | ||
|
|
67973515d5 | ||
|
|
7867cf68f9 | ||
|
|
1eb26bd78b | ||
|
|
a8d635f7ac | ||
|
|
289ad37f06 | ||
|
|
94de42bf2e | ||
|
|
ca9f40eb7f | ||
|
|
4013f9fefd | ||
|
|
ccf0002c0f | ||
|
|
86fb4a323a | ||
|
|
38c56a2b5f | ||
|
|
2d1286158a | ||
|
|
6e7309316c | ||
|
|
593fdad426 | ||
|
|
933a831eb1 | ||
|
|
7c55082464 | ||
|
|
fa3e70316e | ||
|
|
c9c2ab320d | ||
|
|
53d9817d8a | ||
|
|
828ecb6b3c | ||
|
|
af61ed7c72 | ||
|
|
1e86ea8c0a | ||
|
|
129bfac549 | ||
|
|
4815bb9f11 | ||
|
|
81eb8b1341 | ||
|
|
1596dc5206 | ||
|
|
76a22fabcd | ||
|
|
3d7bf26f85 | ||
|
|
69661406a0 | ||
|
|
74fba0fb7e | ||
|
|
d56fc9fcd4 | ||
|
|
124dcee7b8 | ||
|
|
b5b06ce36d | ||
|
|
ef01088411 | ||
|
|
bc87c1c409 | ||
|
|
bbe4328c06 | ||
|
|
d557410156 | ||
|
|
a150e24ce4 | ||
|
|
261d02863c | ||
|
|
c64f02c9bf | ||
|
|
790db14b51 | ||
|
|
2500ac2cb7 | ||
|
|
cd8a7cf0e0 | ||
|
|
b3be32126d | ||
|
|
643bc5516c | ||
|
|
eb94c59892 | ||
|
|
72f4c81f4c | ||
|
|
9543bd63f9 | ||
|
|
7ae7a71782 | ||
|
|
8994ca6dd5 | ||
|
|
354dceeaf0 | ||
|
|
50c7225c1e | ||
|
|
44d945b5c0 | ||
|
|
4ff6104601 | ||
|
|
80760dd7af | ||
|
|
7835a13573 | ||
|
|
9b26fd50b2 | ||
|
|
eb54d81c5e | ||
|
|
431d2f082c | ||
|
|
a0ff0cdc7e | ||
|
|
fb91558261 | ||
|
|
fc2a47ca31 | ||
|
|
dcccbaad59 | ||
|
|
99d040de3f | ||
|
|
ee30a75b57 | ||
|
|
8c001aa478 | ||
|
|
849bc11a01 | ||
|
|
5024e0b092 | ||
|
|
d93447489b | ||
|
|
33988e70ab | ||
|
|
d2b41d70c8 | ||
|
|
8e1e51d268 | ||
|
|
53500ea005 | ||
|
|
e048389dea | ||
|
|
fa7b1a205d | ||
|
|
7dd6b7e9bb | ||
|
|
78b96accda | ||
|
|
73d0e2568a | ||
|
|
92fc212a0e | ||
|
|
6f4d7b7c1b | ||
|
|
63ee1c36e8 | ||
|
|
7d07debcb5 | ||
|
|
dd67e1ee9d | ||
|
|
493efdbf10 | ||
|
|
e323175275 | ||
|
|
c1fa7f8645 | ||
|
|
275b962363 | ||
|
|
3847c33017 | ||
|
|
9e21f52213 | ||
|
|
25cf9b33ec | ||
|
|
c7a2d3589f | ||
|
|
d8dd3834c3 | ||
|
|
ee01c2c745 | ||
|
|
e7e5a2b4e9 | ||
|
|
ff16f59be1 | ||
|
|
2cd4937ddc | ||
|
|
0e9abc1762 | ||
|
|
e24ce87946 | ||
|
|
308e358d3f | ||
|
|
d15e6a4847 | ||
|
|
e311239a28 | ||
|
|
df677789d2 | ||
|
|
0af44eadb6 | ||
|
|
85cafe530e | ||
|
|
7609db28f1 | ||
|
|
fefda39284 | ||
|
|
b2f98bd059 | ||
|
|
26c69fe6d4 | ||
|
|
bf4f1a7c37 | ||
|
|
9b0dd39d9d | ||
|
|
66d4cc2ab8 | ||
|
|
0bcbaf6521 | ||
|
|
e074872b24 | ||
|
|
63ec1e618e | ||
|
|
331c15b76c | ||
|
|
d2089c9aad | ||
|
|
3c8326d3b6 | ||
|
|
2d0713ca1d | ||
|
|
afaca423cc | ||
|
|
ff08abe177 | ||
|
|
159be479cc | ||
|
|
f3066b07b5 | ||
|
|
aa58636832 | ||
|
|
5d1a584eac | ||
|
|
7ee9abd646 | ||
|
|
4d977a8d46 | ||
|
|
5c891724c4 | ||
|
|
185af18790 | ||
|
|
fa6da97cf9 | ||
|
|
9503d9b024 | ||
|
|
de7b6ca553 | ||
|
|
1788078594 | ||
|
|
3caf473424 | ||
|
|
5435bd2354 | ||
|
|
1cdb22a7e3 | ||
|
|
95a9424ae7 | ||
|
|
902196a176 | ||
|
|
dbfef8665b | ||
|
|
b3d8f2400f | ||
|
|
c12ae58868 | ||
|
|
4b77bb57ad | ||
|
|
a6b1d308c2 | ||
|
|
b483f09d11 | ||
|
|
bbb5ad31c4 | ||
|
|
3d4c1fe7da | ||
|
|
7a2c0d5d5a | ||
|
|
39d86c5f61 | ||
|
|
e2cdbbb184 | ||
|
|
e83f9245a9 | ||
|
|
52f25c44eb | ||
|
|
1ed565d8e5 | ||
|
|
10801f111b | ||
|
|
efe1655834 | ||
|
|
7f71e3981e | ||
|
|
8113f8df63 | ||
|
|
62f579fdbe | ||
|
|
1d4454c6eb | ||
|
|
310433fb54 | ||
|
|
c0520146e9 | ||
|
|
35f6675d86 | ||
|
|
9494b15bd5 | ||
|
|
3b82120923 | ||
|
|
b9a0adc311 | ||
|
|
1e21ac3d79 | ||
|
|
864bb8285e | ||
|
|
208e988c70 | ||
|
|
5cbcfb8efb | ||
|
|
107b833703 | ||
|
|
e2208a484e | ||
|
|
5ab7c91d49 | ||
|
|
a91ad3c9c7 | ||
|
|
385f950c2b | ||
|
|
4667a84939 | ||
|
|
5af0cacf0c | ||
|
|
bceb00d35f | ||
|
|
51068294f1 | ||
|
|
bcdf4e42fa | ||
|
|
214bb13843 | ||
|
|
7998395532 | ||
|
|
35aee18112 | ||
|
|
8ddbdd34ed | ||
|
|
66a5e479c7 | ||
|
|
8f5bd2bc9f | ||
|
|
5be2624cb1 | ||
|
|
f9684d662d | ||
|
|
9373796dd5 | ||
|
|
2634517cdb | ||
|
|
121a636b4e | ||
|
|
aad42d4a57 | ||
|
|
c8b8518608 | ||
|
|
0c40a8ab05 | ||
|
|
b9241ad5ad | ||
|
|
d354d7133e | ||
|
|
a1157c78b2 | ||
|
|
fb8d52e6e0 | ||
|
|
80c42cae1a | ||
|
|
f242fce5fd | ||
|
|
6223514704 | ||
|
|
8fb7445e20 | ||
|
|
3172c6859d | ||
|
|
58be573d02 | ||
|
|
82f7bdb9cc | ||
|
|
b41c39b7ce | ||
|
|
9e4958e96a | ||
|
|
65091f7cb9 | ||
|
|
75b758bb1f | ||
|
|
5028ff3ddd | ||
|
|
a246f76ec3 | ||
|
|
eeec067481 | ||
|
|
3ee44ad0c2 | ||
|
|
c38ff5b0b7 | ||
|
|
e51dc6758c | ||
|
|
7bb32643fa | ||
|
|
3172e1f530 | ||
|
|
7778877fa7 | ||
|
|
b4f6745251 | ||
|
|
4fd7f16911 | ||
|
|
ca29b5d7fc | ||
|
|
79d5a635a4 | ||
|
|
7f615c580e | ||
|
|
967dbbda89 | ||
|
|
452c0411d2 | ||
|
|
32d3ed2144 | ||
|
|
4efae21f1d | ||
|
|
c43efd7fb3 | ||
|
|
93b1dbd931 | ||
|
|
571896b888 | ||
|
|
9f5d31b2b1 | ||
|
|
c01f7102e6 | ||
|
|
df39e46c84 | ||
|
|
7f12bb5dfb | ||
|
|
ca762139f6 | ||
|
|
67f41ad991 | ||
|
|
621ec11ae3 | ||
|
|
de3135c43b | ||
|
|
faed0ba45a | ||
|
|
2104e4e2ce | ||
|
|
907a17a73b | ||
|
|
a1a9f8bc7e | ||
|
|
a9a3bb74e7 | ||
|
|
b7de3fcebd | ||
|
|
0b70b857b9 | ||
|
|
9c8a957dd7 | ||
|
|
cf65e4d77d | ||
|
|
762962270c | ||
|
|
a2067af4ea | ||
|
|
2f4f06ca8b | ||
|
|
56dba2cb10 | ||
|
|
f824357358 | ||
|
|
778cfff4b3 | ||
|
|
8ee762695b | ||
|
|
7dd9680e26 | ||
|
|
92661e1d53 | ||
|
|
09d5665ff9 | ||
|
|
c5dfe623c8 | ||
|
|
2665e2ef39 | ||
|
|
dfecdb1956 | ||
|
|
5a82aee76b | ||
|
|
4f07426010 | ||
|
|
9e575e45b7 | ||
|
|
39b32bf1cd | ||
|
|
54131001b0 | ||
|
|
f8134b1a62 | ||
|
|
13927599c8 | ||
|
|
0d85d0a777 | ||
|
|
0da83694e0 | ||
|
|
9bdac4d1e3 | ||
|
|
00c92d6d61 | ||
|
|
9628a9e156 | ||
|
|
f1bfcb4822 | ||
|
|
87879b6738 | ||
|
|
a4ff7047d1 | ||
|
|
da599da36d | ||
|
|
335e7366fd | ||
|
|
a993b2b3f1 | ||
|
|
b81c8d29ba | ||
|
|
08a08e4b24 | ||
|
|
8b5886cc6e | ||
|
|
22b3d8d594 | ||
|
|
17efa04257 | ||
|
|
e71f144c40 | ||
|
|
5e7cafb8c0 | ||
|
|
d01385a7ac | ||
|
|
ac80dd78a8 | ||
|
|
061f1000cf | ||
|
|
c36fed3081 | ||
|
|
75002906aa | ||
|
|
a451cf2d5f | ||
|
|
ca10c0ab09 | ||
|
|
80d76ae038 | ||
|
|
f699ee1363 | ||
|
|
bd97a4bd7c | ||
|
|
ec3b749ef6 | ||
|
|
44fc86e7da | ||
|
|
2cd940e7c7 | ||
|
|
cc6d371667 | ||
|
|
8fcc33b375 | ||
|
|
e44b570c3d | ||
|
|
8576847a99 | ||
|
|
c9fc9373e5 | ||
|
|
ae46d449e5 | ||
|
|
fe57cef756 | ||
|
|
3affb38ba2 | ||
|
|
a0dc6aa173 | ||
|
|
a357a690ce | ||
|
|
bce7959332 | ||
|
|
eef6f600c9 | ||
|
|
a3822c5aa8 | ||
|
|
eeaa1e83a9 | ||
|
|
387fb93b5b | ||
|
|
d470059c56 | ||
|
|
2e382fa88c | ||
|
|
e1e7e782d5 | ||
|
|
6f314502f6 | ||
|
|
3284d7a8e6 | ||
|
|
609ea7b4c2 | ||
|
|
7e8d21145e | ||
|
|
c31b5f1f97 | ||
|
|
11fe685a6b | ||
|
|
1127947f52 | ||
|
|
789b2cf326 | ||
|
|
b9394f2ba2 | ||
|
|
7ab206ebac | ||
|
|
0beb9fff73 | ||
|
|
65b8d0c24d | ||
|
|
715fe46f45 | ||
|
|
8209f341fb | ||
|
|
0d4b55ca32 | ||
|
|
ae7362706f | ||
|
|
4ca648a79b | ||
|
|
4ca0b14300 | ||
|
|
4386b6c2c4 | ||
|
|
61246f81c7 | ||
|
|
70f2bfdd9a | ||
|
|
5f23cbc470 | ||
|
|
2e0c8f848f | ||
|
|
f8add0ee04 | ||
|
|
f23051c1fd | ||
|
|
60636af544 | ||
|
|
2e685ea851 | ||
|
|
b61a06350f | ||
|
|
c9ece4695e | ||
|
|
4805690dbe | ||
|
|
8ec1621334 | ||
|
|
682377ff66 | ||
|
|
656beed82b | ||
|
|
ba4a0fac77 | ||
|
|
b719bfaecb | ||
|
|
4e1366bf0d | ||
|
|
b67938aa3f | ||
|
|
f4c29c07bf | ||
|
|
63a0f4bf11 | ||
|
|
a8a2ba188d | ||
|
|
a0d685bfe2 | ||
|
|
a3041b7f9f | ||
|
|
83a2ae7ad3 | ||
|
|
830a6250c6 | ||
|
|
f0e23ab1fc | ||
|
|
5b07c488b0 | ||
|
|
f61bccf700 | ||
|
|
4fd10bc5f5 | ||
|
|
c1a72f075d | ||
|
|
5c4450f3cd | ||
|
|
bb606e0b2f | ||
|
|
eed86aa9e1 | ||
|
|
338d4fd31e | ||
|
|
58a36f7cfd | ||
|
|
8b436f70d6 | ||
|
|
223fd4f0ba | ||
|
|
2e51e69cc9 | ||
|
|
bbac79c030 | ||
|
|
607bba4625 | ||
|
|
1a0cc3215c | ||
|
|
f0981c81c8 | ||
|
|
472604d1b0 | ||
|
|
781d33b869 | ||
|
|
8db8841c9c | ||
|
|
6e3b570be4 | ||
|
|
defd77b94c | ||
|
|
c09294df2f | ||
|
|
cc97ee86df | ||
|
|
10d6dd5a23 | ||
|
|
29e79dc54d | ||
|
|
982390f074 | ||
|
|
963d73af4e | ||
|
|
bdd8cbb1d8 | ||
|
|
80bd232054 | ||
|
|
c2da227254 | ||
|
|
e846c67bfa | ||
|
|
475c7094ab | ||
|
|
4434566d85 | ||
|
|
6bd557d22c | ||
|
|
4832a24ac5 | ||
|
|
b9a3890dd5 | ||
|
|
4cf9de6515 | ||
|
|
994c798264 | ||
|
|
119bda1595 | ||
|
|
bf73c47bc5 | ||
|
|
ea99f44893 | ||
|
|
4ec1fd3968 | ||
|
|
0b9e25ee65 | ||
|
|
73a9985599 | ||
|
|
a65f7bfa65 | ||
|
|
72cc1eb4d4 | ||
|
|
ed7ae32a69 | ||
|
|
54b53f3aba | ||
|
|
2f7728f987 | ||
|
|
f3a93af242 | ||
|
|
5a4ad2f822 | ||
|
|
c669240037 | ||
|
|
ce4fd8429e | ||
|
|
cc532d95da | ||
|
|
c800a0a6b5 | ||
|
|
5675c045ae | ||
|
|
e16ca862f4 | ||
|
|
29e757bb3a | ||
|
|
822f1a9557 | ||
|
|
7acfb27a1f | ||
|
|
83d6731fa9 | ||
|
|
de4f0272c1 | ||
|
|
df50a875df | ||
|
|
5f814f23b4 | ||
|
|
98ec373f8c | ||
|
|
0bbeab9ad2 | ||
|
|
ed4c711ef5 | ||
|
|
fc33702b81 | ||
|
|
70c79f31c3 | ||
|
|
82dc2103b5 | ||
|
|
529ab304b4 | ||
|
|
53919446d4 | ||
|
|
1052cd019b | ||
|
|
4f87819abf | ||
|
|
b94ecb2383 | ||
|
|
c00d83dee9 | ||
|
|
34052ce8f9 | ||
|
|
0a0c8948ee | ||
|
|
0cc9283275 | ||
|
|
6b2e9f057b | ||
|
|
3a1fc9ec77 | ||
|
|
e4399412b6 | ||
|
|
37650d8156 | ||
|
|
b4fa164dc3 | ||
|
|
6148e6b192 | ||
|
|
057743a779 | ||
|
|
530ba2a0bd | ||
|
|
977b2bda7c | ||
|
|
76eb93ba1a | ||
|
|
ae3c50c074 | ||
|
|
31017602fc | ||
|
|
ef7e2abdaf | ||
|
|
a6abedd67d | ||
|
|
9824d86a3c | ||
|
|
1eac3d1700 | ||
|
|
48585bb049 | ||
|
|
843e49a5a8 | ||
|
|
db01276f1d | ||
|
|
772028106e | ||
|
|
0cd5253857 | ||
|
|
eaf321facb | ||
|
|
81ecb5c7c8 | ||
|
|
3b3a452df6 | ||
|
|
65b1e29414 | ||
|
|
a6e3b9afac | ||
|
|
a7792701a2 | ||
|
|
846372e48b | ||
|
|
1597007ea1 | ||
|
|
dbceed21f5 | ||
|
|
3254dae59f | ||
|
|
12881dd4c4 | ||
|
|
35ec93ccb1 | ||
|
|
cb159ed00d | ||
|
|
e5b8b41373 | ||
|
|
492814a56e | ||
|
|
d639712303 | ||
|
|
f5d1c8a679 | ||
|
|
aea3d4be7a | ||
|
|
8d1fd7ee8e | ||
|
|
a98a002d57 | ||
|
|
fb874695c9 | ||
|
|
63457c034f | ||
|
|
daff6dce4c | ||
|
|
94c7c5cebe | ||
|
|
f2c4901dd0 | ||
|
|
95d8eb9714 | ||
|
|
62165445fe | ||
|
|
6b12371f50 | ||
|
|
38cb4ccbd3 | ||
|
|
8ccaaae085 | ||
|
|
6f7ae4770a | ||
|
|
5aa348a574 | ||
|
|
7b8fa49482 | ||
|
|
789cf654d0 | ||
|
|
a300a6094e | ||
|
|
37b09e70b0 | ||
|
|
530fbfc9b4 | ||
|
|
73c312ec1a | ||
|
|
318a959470 | ||
|
|
f9cc98791a | ||
|
|
263eb3c632 | ||
|
|
52b3926f92 | ||
|
|
af3755bf91 | ||
|
|
419d719ab8 | ||
|
|
3877cf9ab8 | ||
|
|
912056a364 | ||
|
|
165b33a94e | ||
|
|
12fff1b966 | ||
|
|
128eba7ec3 | ||
|
|
5bb370df0e | ||
|
|
6431343ad7 | ||
|
|
bd292076e3 | ||
|
|
ce0ddbe517 | ||
|
|
5451bb185e | ||
|
|
057cf3648e | ||
|
|
80d5c5d85c | ||
|
|
671a997092 | ||
|
|
f2fbfdf017 | ||
|
|
1ea7340111 | ||
|
|
7b38ea4151 | ||
|
|
c4ed12bbd1 | ||
|
|
c32b352ec1 | ||
|
|
9b2565dff9 | ||
|
|
f833f26212 | ||
|
|
66a7082b5c | ||
|
|
cc3a6350a5 | ||
|
|
9202ce8757 | ||
|
|
c0e4f126de | ||
|
|
44ca0a4904 | ||
|
|
64ddf393aa | ||
|
|
a60615a2d8 | ||
|
|
d9fa9c3566 | ||
|
|
5115b8739e | ||
|
|
854fb4acc0 | ||
|
|
07ef81fd95 | ||
|
|
17e39f56dd | ||
|
|
040e94cab7 | ||
|
|
93563365ac | ||
|
|
c287879e55 | ||
|
|
537c73d548 | ||
|
|
ad3f5f6e20 | ||
|
|
a468404ab5 | ||
|
|
6d7fba1a6c | ||
|
|
5c734a80f8 | ||
|
|
edfee5193c | ||
|
|
9900651c55 | ||
|
|
948adbe350 | ||
|
|
ade0ba794c | ||
|
|
5494c33a89 | ||
|
|
c8f5cab636 | ||
|
|
4a8a40a6f2 | ||
|
|
70d41cdc79 | ||
|
|
aec99ed14f | ||
|
|
9a645b4b19 | ||
|
|
bea3c33a46 | ||
|
|
e082c02630 | ||
|
|
291b94bef0 | ||
|
|
f119be3ed5 |
21
AUTHORS
@@ -3,12 +3,19 @@ Author:
|
||||
|
||||
Contributors:
|
||||
* Stefanos Antaris <santaris@csd.auth.gr>
|
||||
* Mohammad Dib <mdib@qbittorrent.org>
|
||||
* Mirco Chinelli <infinity89@fastwebmail.it>
|
||||
* Ishan Arora <ishan@qbittorrent.org>
|
||||
* Arnaud Demaizière <arnaud@qbittorrent.org>
|
||||
* Grigis Gaëtan <cipher16@gmail.com>
|
||||
* Christian Kandeler <zambesi@users.sourceforge.net>
|
||||
* Silvan Scherrer <silvan.scherrer@aroa.ch>
|
||||
|
||||
Code from other projects:
|
||||
* files src/qtsingleapp/* src/lineedit/*
|
||||
copyright: Nokia Corporation
|
||||
license: LGPL
|
||||
|
||||
* files src/ico.cpp src/ico.h
|
||||
copyright: Malte Starostik <malte@kde.org>
|
||||
license: LGPL
|
||||
@@ -29,9 +36,9 @@ Images Authors:
|
||||
url: http://www.oxygen-icons.org
|
||||
|
||||
* files: src/Icons/flags/*.png
|
||||
copyright: Open Clip Art Library
|
||||
license: Creative Commons Public Domain Dedication
|
||||
url: http://www.openclipart.org
|
||||
copyright: Mark James <mjames@gmail.com>
|
||||
license: Public Domain
|
||||
url: http://www.famfamfam.com
|
||||
|
||||
* files: src/Icons/skin/*.png
|
||||
files: src/menuicons/YYxYY/*.png
|
||||
@@ -60,21 +67,23 @@ Images Authors:
|
||||
Translations authors:
|
||||
* files: src/lang/*.ts
|
||||
copyright:
|
||||
- Arabic: SDERAWI (abz8868@msn.com) and sn51234 (nesseyan@gmail.com)
|
||||
- Brazilian: Nick Marinho (nickmarinho@gmail.com)
|
||||
- Bulgarian: Tsvetan & Boiko Bankov (emerge_life@users.sourceforge.net)
|
||||
- Bulgarian: Tsvetan & Boyko Bankoff (emerge_life@users.sourceforge.net)
|
||||
- Catalan: Francisco Luque Contreras (frannoe@ya.com)
|
||||
- Chinese (Simplified): Guo Yue (yue.guo0418@gmail.com)
|
||||
- Chinese (Traditional): Yi-Shun Wang (dnextstep@gmail.com)
|
||||
- Croatian: Oliver Mucafir (oliver.untwist@gmail.com)
|
||||
- Czech: Jirka Vilim (web@tets.cz)
|
||||
- Danish: Mathias Nielsen (comoneo@gmail.com)
|
||||
- Dutch: Joost Schipper (heavyjoost@users.sourceforge.net)
|
||||
- Dutch: Pieter Heyvaert (pieter_heyvaert@hotmail.com)
|
||||
- English: Christophe Dumez (chris@qbittorrent.org)
|
||||
- Finnish: Niklas Laxström (nikerabbit@users.sourceforge.net)
|
||||
- French: Christophe Dumez (chris@qbittorrent.org)
|
||||
- German: Niels Hoffmann (zentralmaschine@users.sourceforge.net)
|
||||
- Greek: Tsvetan Bankov (emerge_life@users.sourceforge.net) and Stephanos Antaris (santaris@csd.auth.gr)
|
||||
- Hungarian: Majoros Péter (majoros.j.p@t-online.hu)
|
||||
- Italian: Mirko Ferrari (mirkoferrari@gmail.com) and Ferraro Luciano (luciano.ferraro@gmail.com)
|
||||
- Italian: Matteo Sechi (bu17714@gmail.com)
|
||||
- Japanese: Nardog (alphisation@gmail.com)
|
||||
- Korean: Jin Woo Sin (jin828sin@users.sourceforge.net)
|
||||
- Norwegian: Lars-Erik Labori (hamil@users.sourceforge.net)
|
||||
|
||||
73
Changelog
@@ -1,4 +1,72 @@
|
||||
* Unreleased - Christophe Dumez <chris@qbittorrent.org> - v2.2.0
|
||||
* Sun Dec 5 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.5.0
|
||||
- FEATURE: qBittorrent can now act as a tracker
|
||||
- FEATURE: New and improved RSS feed automated downloader
|
||||
- FEATURE: Added feature to shutdown qbittorrent on torrents completion
|
||||
- FEATURE: Added a torrent import assistant to seed or keep downloading outside torrents
|
||||
- FEATURE: qBittorrent can update itself from Sourceforge (Windows/Mac OS X only)
|
||||
- FEATURE: Added a transfer list column to display the current tracker
|
||||
- FEATURE: Remember the last trackers used in the torrent creation tool
|
||||
- FEATURE: The optimal piece size is now automatically computed in the torrent creation tool
|
||||
- FEATURE: Bring up the connection settings when clicking on the connection status icon
|
||||
- FEATURE: Major code refactoring and optimization
|
||||
- FEATURE: Added "Amount downloaded/left" columns to transfer list
|
||||
- FEATURE: Simplified proxy settings
|
||||
- FEATURE: Optimized and improved the peer country resolution code
|
||||
- FEATURE: Download first/last pieces first when sequential download is
|
||||
enabled (Thanks Ahmad)
|
||||
- FEATURE: Download first/last pieces first now applies to all media files
|
||||
in the torrent (Thanks Ahmad)
|
||||
- BUGFIX: Fix SOCKS5 proxy authentication in search engine(closes #680072)
|
||||
- BUGFIX: Fix two advanced settings (ignore limits on LAN and protocol
|
||||
overhead inclusion in rate limiter)
|
||||
- BUGFIX: Fix strict super seeding (was not working)
|
||||
- BUGFIX: Improve magnet save path handling (closes #683395)
|
||||
- BUGFIX: Disable overwrite confirmation in torrent addition dialog (closes # 685269)
|
||||
- COSMETIC: Replaced message box by on-screen notification for download errors
|
||||
- COSMETIC: Improved the torrent creation tool appearance
|
||||
- COSMETIC: Use country flags by Mark James (Thanks to Dmytro Pukha)
|
||||
- COSMETIC: Use bigger alternative speed icon
|
||||
- OTHERS: Dropped support for Qt <= 4.4
|
||||
|
||||
* Tue Aug 24 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.0
|
||||
- FEATURE: Added actions to "Move to top/bottom" of priority queue
|
||||
- FEATURE: Auto-Shutdown on downloads completion
|
||||
- FEATURE: Email notification on download completion
|
||||
- FEATURE: Added button to password-lock the UI
|
||||
- FEATURE: Added label-level Pause/Resume/Delete actions
|
||||
- FEATURE: Torrents can now be filtered by name
|
||||
- FEATURE: Run external program on torrent completion
|
||||
- FEATURE: Detect executable updates in order to advise the user to restart
|
||||
|
||||
* Tue Jul 27 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.3.0
|
||||
- FEATURE: Simplified torrent root folder renaming/truncating (< v2.3.0 is no longer forward compatible)
|
||||
- FEATURE: Remember previous save paths in torrent addition dialog
|
||||
- FEATURE: Max number of half-open connections can now be edited
|
||||
- FEATURE: Added support for strict super seeding
|
||||
- FEATURE: The user can force listening on a particular network interface
|
||||
- FEATURE: Added cookie support for RSS feeds
|
||||
- FEATURE: User can force tracker reannounce
|
||||
- FEATURE: Added "No action" setting for double-click action
|
||||
- FEATURE: Several torrents can be moved at once
|
||||
- FEATURE: Added error state for torrents (error is displayed in a tooltip)
|
||||
- FEATURE: Added filter for paused/error torrents
|
||||
- FEATURE: Add Check/Uncheck all feature in Web UI
|
||||
- FEATURE: Search engine can now be disabled
|
||||
- FEATURE: Torrents can be automatically paused once they reach a given ratio
|
||||
- FEATURE: Several files can now be disabled at once
|
||||
- FEATURE: Added "Select All/None" buttons to files list
|
||||
- FEATURE: Added support for BitComet links (bc://bt/...)
|
||||
- BUGFIX: Hide seeding torrents files priorities in Web UI
|
||||
- BUGFIX: The user can disable permanently recursive torrent download
|
||||
- BUGFIX: Peer Exchange status is now correctly reported
|
||||
- BUGFIX: Use an INI file instead of the registry on Windows (More reliable)
|
||||
- BUGFIX: Removed client spoofing feature to avoid tracker blacklisting
|
||||
- COSMETIC: Display peers country name in tooltip
|
||||
- COSMETIC: Display number of torrents in transfers tab label
|
||||
- COSMETIC: Simplified program preferences
|
||||
- COSMETIC: Fix naming of actions opening new dialogs (use Name...)
|
||||
|
||||
* Sun Mar 14 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.2.0
|
||||
- FEATURE: User can set alternative speed limits for fast toggling
|
||||
- FEATURE: Bandwidth scheduler (automatically use alternative speed limits for a given period)
|
||||
- FEATURE: Added "Added/Completed On" columns to transfer list
|
||||
@@ -15,6 +83,9 @@
|
||||
- FEATURE: Support for multiple scan folders (Patch by Christian Kandeler)
|
||||
- BUGFIX: Only one log window can be opened at a time
|
||||
- BUGFIX: Optimized RSS module memory usage
|
||||
- BUGFIX: Consider HTTP downloads >1MB as invalid .torrent files and abort
|
||||
- BUGFIX: Fix Web UI authentication with some browsers
|
||||
- BUGFIX: Set Web UI ban period to 1 hour
|
||||
- COSMETIC: Improved style management
|
||||
|
||||
* Mon Jan 18 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.1.0
|
||||
|
||||
8
INSTALL
@@ -10,15 +10,17 @@ qBittorrent - A BitTorrent client in C++ / Qt4
|
||||
will install and execute qBittorrent hopefully without any problems.
|
||||
|
||||
Dependencies:
|
||||
- Qt >= 4.4.0 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml)
|
||||
- Qt >= 4.5.0 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml)
|
||||
|
||||
- pkg-config executable
|
||||
|
||||
- libtorrent-rasterbar by Arvid Norberg (>= 0.14.4 REQUIRED, >= v0.15.0 ADVISED)
|
||||
- libtorrent-rasterbar by Arvid Norberg (>= 0.14.4 REQUIRED, compatible with v0.15.x)
|
||||
-> http://www.libtorrent.net
|
||||
Be careful: another library (the one used by rTorrent) uses a similar name.
|
||||
|
||||
- libboost: libboost-filesystem, libboost-date-time, libboost-thread, libboost-serialization
|
||||
- libboost 1.34.x (libboost-filesystem, libboost-thread, libboost-date-time) + libasio
|
||||
or
|
||||
- libboost >= 1.35.x (libboost-system, libboost-filesystem, libboost-thread, libboost-date-time)
|
||||
|
||||
- python >= 2.3 (needed by search engine)
|
||||
* Run time only dependency
|
||||
|
||||
62
README.os2
Normal file
@@ -0,0 +1,62 @@
|
||||
qBittorrent - A BitTorrent client in Qt4
|
||||
------------------------------------------
|
||||
|
||||
This is the eComStation (OS/2) qBittorrent part of the readme. See also README for more general information.
|
||||
|
||||
|
||||
Building qBittorrent
|
||||
********************
|
||||
|
||||
|
||||
Requirements
|
||||
============
|
||||
|
||||
- gcc based build env (recommended gcc v4.4.2 or greater)
|
||||
|
||||
- Qt4 for eCS (OS/2) dev package (see http://svn.netlabs.org/qt4 for more information)
|
||||
|
||||
- libtorrent-rasterbar for eCS (OS/2) port (see http://svn.netlabs.org/ports for more information)
|
||||
|
||||
- boost for eCS (OS/2) port (see http://svn.netlabs.org/ports for more information)
|
||||
|
||||
|
||||
How to build
|
||||
============
|
||||
|
||||
First you need to create the conf.pri file in the same dir as this readme.os2 is.
|
||||
the conf.pri file has the following content:
|
||||
|
||||
##### conf.pri content beginn #####
|
||||
PREFIX = .
|
||||
BINDIR = ./bin
|
||||
INCDIR = ./include
|
||||
LIBDIR = ./lib
|
||||
DATADIR = ./share
|
||||
|
||||
CONFIG += staticlib
|
||||
INCLUDEPATH += x:/trees/libtorrent/trunk/include
|
||||
LIBS += -Lx:/trees/libtorrent/trunk/src/.libs \
|
||||
-Lx:/trees/boost/trunk/stage/lib \
|
||||
-Lx:/trees/openssl \
|
||||
-Lx:/extras/lib
|
||||
##### conf.pri content end #####
|
||||
|
||||
Of course all the above path references have to be adjusted to your build env.
|
||||
|
||||
It should now be easy to build qBittorrent:
|
||||
|
||||
Simply type:
|
||||
$ qmake
|
||||
|
||||
Followed by:
|
||||
$ make
|
||||
|
||||
If all works fine you should get a working qbittorrent executable.
|
||||
|
||||
If you have any question regarding the eCS (OS/2) port of qBittorrent you can meet me (_diver) on IRC:
|
||||
#netlabs on irc.freenode.net
|
||||
|
||||
------------------------------------------
|
||||
Silvan Scherrer <silvan.scherrer@aroa.ch>
|
||||
|
||||
|
||||
182
configure
vendored
@@ -18,14 +18,24 @@ Main options:
|
||||
--help This help text.
|
||||
|
||||
Dependency options:
|
||||
--disable-gui Disable qBittorrent Graphical user
|
||||
interface for headless running
|
||||
--with-libboost-inc=[path] Path to libboost include files
|
||||
--disable-libnotify Disable use of libnotify
|
||||
--disable-geoip-database Disable use of geoip-database
|
||||
--with-geoip-database-embedded Geoip Database will be embedded in
|
||||
qBittorrent executable (please follow
|
||||
instructions in src/geoip/README)
|
||||
--disable-gui Disable qBittorrent
|
||||
Graphical user interface for
|
||||
headless running
|
||||
--with-libboost-inc=[path] Path to libboost include
|
||||
files
|
||||
--with-libboost-lib=[path] Path to libboost library
|
||||
files
|
||||
--disable-libnotify Disable use of libnotify
|
||||
--disable-geoip-database Disable use of geoip-database
|
||||
--with-geoip-database-embedded Geoip Database will be
|
||||
embedded in qBittorrent
|
||||
executable (please follow
|
||||
instructions in
|
||||
src/geoip/README)
|
||||
--disable-qtsingleapplication Disable use of libboost
|
||||
--with-qtsingleapplication=[system|shipped] Use the shipped
|
||||
qtsingleapplication library
|
||||
or the system one
|
||||
|
||||
EOT
|
||||
}
|
||||
@@ -152,6 +162,11 @@ while [ $# -gt 0 ]; do
|
||||
shift
|
||||
;;
|
||||
|
||||
--with-libboost-lib=*)
|
||||
QC_WITH_LIBBOOST_LIB=$optarg
|
||||
shift
|
||||
;;
|
||||
|
||||
--disable-libnotify)
|
||||
QC_DISABLE_libnotify="Y"
|
||||
shift
|
||||
@@ -167,6 +182,16 @@ while [ $# -gt 0 ]; do
|
||||
shift
|
||||
;;
|
||||
|
||||
--disable-qtsingleapplication)
|
||||
QC_DISABLE_qtsingleapplication="Y"
|
||||
shift
|
||||
;;
|
||||
|
||||
--with-qtsingleapplication=*)
|
||||
QC_WITH_QTSINGLEAPPLICATION=$optarg
|
||||
shift
|
||||
;;
|
||||
|
||||
--verbose)
|
||||
QC_VERBOSE="Y"
|
||||
shift
|
||||
@@ -190,9 +215,12 @@ echo DATADIR=$DATADIR
|
||||
echo EX_QTDIR=$EX_QTDIR
|
||||
echo QC_DISABLE_GUI=$QC_DISABLE_GUI
|
||||
echo QC_WITH_LIBBOOST_INC=$QC_WITH_LIBBOOST_INC
|
||||
echo QC_WITH_LIBBOOST_LIB=$QC_WITH_LIBBOOST_LIB
|
||||
echo QC_DISABLE_libnotify=$QC_DISABLE_libnotify
|
||||
echo QC_DISABLE_geoip_database=$QC_DISABLE_geoip_database
|
||||
echo QC_WITH_GEOIP_DATABASE_EMBEDDED=$QC_WITH_GEOIP_DATABASE_EMBEDDED
|
||||
echo QC_DISABLE_qtsingleapplication=$QC_DISABLE_qtsingleapplication
|
||||
echo QC_WITH_QTSINGLEAPPLICATION=$QC_WITH_QTSINGLEAPPLICATION
|
||||
echo
|
||||
fi
|
||||
|
||||
@@ -297,7 +325,7 @@ cat >$1/modules.cpp <<EOT
|
||||
#line 1 "qt4.qcm"
|
||||
/*
|
||||
-----BEGIN QCMOD-----
|
||||
name: Qt >= 4.4
|
||||
name: Qt >= 4.5
|
||||
arg: disable-gui, Disable qBittorrent Graphical user interface for headless running
|
||||
-----END QCMOD-----
|
||||
*/
|
||||
@@ -305,18 +333,14 @@ class qc_qt4 : public ConfObj
|
||||
{
|
||||
public:
|
||||
qc_qt4(Conf *c) : ConfObj(c) {}
|
||||
QString name() const { return "Qt >= 4.4"; }
|
||||
QString shortname() const { return "Qt 4.4"; }
|
||||
QString name() const { return "Qt >= 4.5"; }
|
||||
QString shortname() const { return "Qt 4.5"; }
|
||||
bool exec()
|
||||
{
|
||||
if(!conf->getenv("QC_DISABLE_GUI").isEmpty()) {
|
||||
conf->addDefine("DISABLE_GUI");
|
||||
conf->addExtra("CONFIG += nox");
|
||||
}
|
||||
if(QT_VERSION >= 0x040500) {
|
||||
conf->addDefine("QT_4_5");
|
||||
}
|
||||
return(QT_VERSION >= 0x040400);
|
||||
|
||||
return(QT_VERSION >= 0x040500);
|
||||
}
|
||||
};
|
||||
#line 1 "pkg-config.qcm"
|
||||
@@ -352,25 +376,15 @@ public:
|
||||
bool exec(){
|
||||
QStringList incs;
|
||||
QString req_ver = "0.14.4";
|
||||
QString adv_ver = "0.15.0";
|
||||
QString version, libs, other;
|
||||
VersionMode mode = VersionMin;
|
||||
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, req_ver, &version, &incs, &libs, &other))
|
||||
return false;
|
||||
for(int n = 0; n < incs.count(); ++n)
|
||||
conf->addIncludePath(incs[n]);
|
||||
//if(!libs.isEmpty())
|
||||
// conf->addLib(libs);
|
||||
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, adv_ver, &version, &incs, &libs, &other))
|
||||
printf("\nWarning: libtorrent-rasterbar v%s was detected. Some feature will be disabled because they require v%s.\n", version.toLocal8Bit().data(), adv_ver.toUtf8().data());
|
||||
else
|
||||
conf->addDefine("LIBTORRENT_0_15");
|
||||
// Get linking parameters
|
||||
QStringList params;
|
||||
QByteArray staticlibs;
|
||||
params << "--static" << "--libs" << "libtorrent-rasterbar";
|
||||
conf->doCommand("pkg-config", params, &staticlibs);
|
||||
conf->addLib(staticlibs.trimmed());
|
||||
if(conf->getenv("QC_DISABLE_GUI").isEmpty()) {
|
||||
conf->addLib("-lcrypto");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
@@ -379,14 +393,39 @@ public:
|
||||
-----BEGIN QCMOD-----
|
||||
name: libboost
|
||||
arg: with-libboost-inc=[path], Path to libboost include files
|
||||
arg: with-libboost-lib=[path], Path to libboost library files
|
||||
-----END QCMOD-----
|
||||
*/
|
||||
#include <boost/version.hpp>
|
||||
class qc_libboost : public ConfObj
|
||||
{
|
||||
public:
|
||||
qc_libboost(Conf *c) : ConfObj(c) {}
|
||||
QString name() const { return "libboost"; }
|
||||
QString shortname() const { return "libboost"; }
|
||||
QString findBoostLib(QString path, QString lib) const {
|
||||
QString name;
|
||||
QDir libDir(path);
|
||||
QStringList filters;
|
||||
filters << "libboost_"+lib+"*-mt*.so";
|
||||
QStringList result = libDir.entryList(filters, QDir::Files);
|
||||
if(!result.empty()) {
|
||||
name = result.first().mid(3);
|
||||
// Remove .so
|
||||
name.chop(3);
|
||||
} else {
|
||||
// Fall back to non -mt boost lib
|
||||
filters.clear();
|
||||
filters << "libboost_"+lib+"*.so";
|
||||
result = libDir.entryList(filters, QDir::Files);
|
||||
if(!result.empty()) {
|
||||
name = result.first().mid(3);
|
||||
// Remove .so
|
||||
name.chop(3);
|
||||
}
|
||||
}
|
||||
return name;
|
||||
}
|
||||
bool exec(){
|
||||
QString s;
|
||||
s = conf->getenv("QC_WITH_LIBBOOST_INC");
|
||||
@@ -428,6 +467,43 @@ public:
|
||||
}
|
||||
}
|
||||
conf->addIncludePath(s);
|
||||
// Find library
|
||||
s = conf->getenv("QC_WITH_LIBBOOST_LIB");
|
||||
QStringList required_libs;
|
||||
#if BOOST_VERSION >= 103500
|
||||
required_libs << "system";
|
||||
#endif
|
||||
if(conf->getenv("QC_DISABLE_GUI").isEmpty()) {
|
||||
// Not required by nox
|
||||
required_libs << "filesystem" << "thread";
|
||||
}
|
||||
QStringList libDirs;
|
||||
libDirs << "/usr/lib/" << "/usr/lib64/" << "/usr/local/lib/" << "/usr/local/lib64/";
|
||||
foreach(const QString& lib, required_libs) {
|
||||
if(!s.isEmpty()) {
|
||||
QString detected_name = findBoostLib(s, lib);
|
||||
if(detected_name.isEmpty()) {
|
||||
printf("Could not find boost %s library!\n", qPrintable(lib));
|
||||
return false;
|
||||
} else {
|
||||
conf->addLib("-l"+detected_name);
|
||||
}
|
||||
} else {
|
||||
bool found = false;
|
||||
foreach(const QString& libDir, libDirs) {
|
||||
QString detected_name = findBoostLib(libDir, lib);
|
||||
if(!detected_name.isEmpty()) {
|
||||
conf->addLib("-l"+detected_name);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!found) {
|
||||
printf("Could not find boost %s library!\n", qPrintable(lib));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
@@ -458,7 +534,7 @@ public:
|
||||
QString version, libs, other;
|
||||
VersionMode mode = VersionMin;
|
||||
if(conf->findPkgConfig("libnotify", mode, req_ver, &version, &incs, &libs, &other)) {
|
||||
conf->addDefine("WITH_LIBNOTIFY");
|
||||
conf->addExtra("CONFIG += libnotify");
|
||||
for(int n = 0; n < incs.count(); ++n)
|
||||
conf->addIncludePath(incs[n]);
|
||||
if(!libs.isEmpty())
|
||||
@@ -474,6 +550,17 @@ public:
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
QStringList incs3;
|
||||
QString req_ver3 = "2.0";
|
||||
QString version3, libs3, other3;
|
||||
if(conf->findPkgConfig("gtk+-2.0", mode, req_ver3, &version3, &incs3, &libs3, &other3)) {
|
||||
for(int n = 0; n < incs3.count(); ++n)
|
||||
conf->addIncludePath(incs3[n]);
|
||||
if(!libs3.isEmpty())
|
||||
conf->addLib(libs3);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
@@ -519,6 +606,33 @@ public:
|
||||
#endif
|
||||
}
|
||||
};
|
||||
#line 1 "qtsingleapplication.qcm"
|
||||
/*
|
||||
-----BEGIN QCMOD-----
|
||||
name: libboost
|
||||
arg: with-qtsingleapplication=[system|shipped], Use the shipped qtsingleapplication library or the system one
|
||||
-----END QCMOD-----
|
||||
*/
|
||||
class qc_qtsingleapplication : public ConfObj
|
||||
{
|
||||
public:
|
||||
qc_qtsingleapplication(Conf *c) : ConfObj(c) {}
|
||||
QString name() const { return "qtsingleapplication library"; }
|
||||
QString shortname() const { return "qtsingleapplication"; }
|
||||
|
||||
bool exec(){
|
||||
QString s;
|
||||
s = conf->getenv("QC_WITH_QTSINGLEAPPLICATION");
|
||||
if(s.compare("system", Qt::CaseInsensitive) == 0) {
|
||||
// System
|
||||
conf->addExtra("CONFIG += usesystemqtsingleapplication");
|
||||
printf(" [system] ");
|
||||
} else {
|
||||
printf(" [shipped] ");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
EOT
|
||||
cat >$1/modules_new.cpp <<EOT
|
||||
@@ -540,6 +654,9 @@ cat >$1/modules_new.cpp <<EOT
|
||||
o = new qc_geoip_database(conf);
|
||||
o->required = false;
|
||||
o->disabled = false;
|
||||
o = new qc_qtsingleapplication(conf);
|
||||
o->required = false;
|
||||
o->disabled = false;
|
||||
|
||||
EOT
|
||||
cat >$1/conf4.h <<EOT
|
||||
@@ -1487,9 +1604,12 @@ export DATADIR
|
||||
export EX_QTDIR
|
||||
export QC_DISABLE_GUI
|
||||
export QC_WITH_LIBBOOST_INC
|
||||
export QC_WITH_LIBBOOST_LIB
|
||||
export QC_DISABLE_libnotify
|
||||
export QC_DISABLE_geoip_database
|
||||
export QC_WITH_GEOIP_DATABASE_EMBEDDED
|
||||
export QC_DISABLE_qtsingleapplication
|
||||
export QC_WITH_QTSINGLEAPPLICATION
|
||||
export QC_VERBOSE
|
||||
rm -rf .qconftemp
|
||||
(
|
||||
|
||||
16
macxconf.pri
Normal file
@@ -0,0 +1,16 @@
|
||||
PREFIX = /usr/local
|
||||
BINDIR = /usr/local/bin
|
||||
DATADIR = /usr/local/share
|
||||
|
||||
INCLUDEPATH += /usr/local/include/libtorrent /usr/include/openssl /usr/include /opt/local/include/boost /opt/local/include
|
||||
LIBS += -ltorrent-rasterbar -lcrypto -L/opt/local/lib -lboost_system-mt -lboost_filesystem-mt -lboost_thread-mt -framework Cocoa -framework Carbon
|
||||
|
||||
document_icon.path = Contents/Resources
|
||||
document_icon.files = Icons/qBitTorrentDocument.icns
|
||||
|
||||
QMAKE_BUNDLE_DATA += document_icon
|
||||
ICON = Icons/qbittorrent_mac.icns
|
||||
QMAKE_INFO_PLIST = Info.plist
|
||||
|
||||
DEFINES += WITH_GEOIP_EMBEDDED
|
||||
message("On Mac OS X, GeoIP database must be embedded.")
|
||||
10
os2conf.pri
Normal file
@@ -0,0 +1,10 @@
|
||||
LIBS += -ltorrent-rasterbar \
|
||||
-lboost_thread \
|
||||
-lboost_system \
|
||||
-lboost_filesystem \
|
||||
-lssl -lcrypto -lidn -lpthread
|
||||
|
||||
RC_FILE = qbittorrent_os2.rc
|
||||
|
||||
DEFINES += WITH_GEOIP_EMBEDDED
|
||||
message("On eCS(OS/2), GeoIP database must be embedded.")
|
||||
@@ -1,199 +0,0 @@
|
||||
<?xml version = '1.0'?>
|
||||
<kdevelop>
|
||||
<general>
|
||||
<author>Christophe Dumez</author>
|
||||
<email>chris@qbittorrent.org</email>
|
||||
<version>1.0.0</version>
|
||||
<projectmanagement>KDevTrollProject</projectmanagement>
|
||||
<primarylanguage>C++</primarylanguage>
|
||||
<keywords>
|
||||
<keyword>Qt</keyword>
|
||||
</keywords>
|
||||
<projectname>qBittorrent</projectname>
|
||||
<ignoreparts/>
|
||||
<projectdirectory>.</projectdirectory>
|
||||
<absoluteprojectpath>false</absoluteprojectpath>
|
||||
<description/>
|
||||
<defaultencoding/>
|
||||
<versioncontrol>kdevsubversion</versioncontrol>
|
||||
</general>
|
||||
<kdevfileview>
|
||||
<groups>
|
||||
<group pattern="*.cpp;*.cxx;*.h" name="Sources" />
|
||||
<group pattern="*.ui" name="User Interface" />
|
||||
<group pattern="*.png" name="Icons" />
|
||||
<group pattern="*" name="Others" />
|
||||
<hidenonprojectfiles>false</hidenonprojectfiles>
|
||||
<hidenonlocation>false</hidenonlocation>
|
||||
</groups>
|
||||
<tree>
|
||||
<hidepatterns>*.o,*.lo,CVS</hidepatterns>
|
||||
<hidenonprojectfiles>false</hidenonprojectfiles>
|
||||
<showvcsfields>false</showvcsfields>
|
||||
</tree>
|
||||
</kdevfileview>
|
||||
<kdevdoctreeview>
|
||||
<ignoretocs>
|
||||
<toc>bash</toc>
|
||||
<toc>bash_bugs</toc>
|
||||
<toc>clanlib</toc>
|
||||
<toc>w3c-dom-level2-html</toc>
|
||||
<toc>fortran_bugs_gcc</toc>
|
||||
<toc>gnome1</toc>
|
||||
<toc>gnustep</toc>
|
||||
<toc>gtk</toc>
|
||||
<toc>gtk_bugs</toc>
|
||||
<toc>haskell</toc>
|
||||
<toc>haskell_bugs_ghc</toc>
|
||||
<toc>java_bugs_gcc</toc>
|
||||
<toc>java_bugs_sun</toc>
|
||||
<toc>kde2book</toc>
|
||||
<toc>opengl</toc>
|
||||
<toc>pascal_bugs_fp</toc>
|
||||
<toc>php</toc>
|
||||
<toc>php_bugs</toc>
|
||||
<toc>perl</toc>
|
||||
<toc>perl_bugs</toc>
|
||||
<toc>python</toc>
|
||||
<toc>python_bugs</toc>
|
||||
<toc>qt-kdev3</toc>
|
||||
<toc>ruby</toc>
|
||||
<toc>ruby_bugs</toc>
|
||||
<toc>sdl</toc>
|
||||
<toc>stl</toc>
|
||||
<toc>w3c-svg</toc>
|
||||
<toc>sw</toc>
|
||||
<toc>w3c-uaag10</toc>
|
||||
<toc>wxwidgets_bugs</toc>
|
||||
</ignoretocs>
|
||||
<ignoredoxygen>
|
||||
<toc>KDE Libraries (Doxygen)</toc>
|
||||
</ignoredoxygen>
|
||||
</kdevdoctreeview>
|
||||
<kdevdebugger>
|
||||
<general>
|
||||
<dbgshell/>
|
||||
<gdbpath/>
|
||||
<configGdbScript/>
|
||||
<runShellScript/>
|
||||
<runGdbScript/>
|
||||
<breakonloadinglibs>true</breakonloadinglibs>
|
||||
<separatetty>false</separatetty>
|
||||
<floatingtoolbar>false</floatingtoolbar>
|
||||
</general>
|
||||
<display>
|
||||
<staticmembers>false</staticmembers>
|
||||
<demanglenames>true</demanglenames>
|
||||
<outputradix>10</outputradix>
|
||||
</display>
|
||||
</kdevdebugger>
|
||||
<kdevcppsupport>
|
||||
<qt>
|
||||
<version>4</version>
|
||||
<used>true</used>
|
||||
<includestyle>4</includestyle>
|
||||
<designerintegration>ExternalDesigner</designerintegration>
|
||||
<root>/usr/lib/qt4</root>
|
||||
<qmake>/usr/bin/qmake</qmake>
|
||||
<designer>/usr/bin/designer</designer>
|
||||
<designerpluginpaths/>
|
||||
</qt>
|
||||
<references>
|
||||
<pcs>automatic_%2Fhome%2Fishanarora%2Fprojects%2Fqbittorrent</pcs>
|
||||
</references>
|
||||
<codecompletion>
|
||||
<automaticCodeCompletion>true</automaticCodeCompletion>
|
||||
<automaticArgumentsHint>true</automaticArgumentsHint>
|
||||
<automaticHeaderCompletion>true</automaticHeaderCompletion>
|
||||
<codeCompletionDelay>250</codeCompletionDelay>
|
||||
<argumentsHintDelay>400</argumentsHintDelay>
|
||||
<headerCompletionDelay>250</headerCompletionDelay>
|
||||
<showOnlyAccessibleItems>false</showOnlyAccessibleItems>
|
||||
<completionBoxItemOrder>0</completionBoxItemOrder>
|
||||
<howEvaluationContextMenu>true</howEvaluationContextMenu>
|
||||
<showCommentWithArgumentHint>true</showCommentWithArgumentHint>
|
||||
<statusBarTypeEvaluation>false</statusBarTypeEvaluation>
|
||||
<namespaceAliases>std=_GLIBCXX_STD;__gnu_cxx=std</namespaceAliases>
|
||||
<processPrimaryTypes>true</processPrimaryTypes>
|
||||
<processFunctionArguments>true</processFunctionArguments>
|
||||
<preProcessAllHeaders>true</preProcessAllHeaders>
|
||||
<parseMissingHeadersExperimental>true</parseMissingHeadersExperimental>
|
||||
<resolveIncludePathsUsingMakeExperimental>true</resolveIncludePathsUsingMakeExperimental>
|
||||
<alwaysParseInBackground>true</alwaysParseInBackground>
|
||||
<usePermanentCaching>true</usePermanentCaching>
|
||||
<alwaysIncludeNamespaces>false</alwaysIncludeNamespaces>
|
||||
<includePaths>.;</includePaths>
|
||||
</codecompletion>
|
||||
<creategettersetter>
|
||||
<prefixGet>get</prefixGet>
|
||||
<prefixSet>set</prefixSet>
|
||||
<prefixVariable>m_,_</prefixVariable>
|
||||
<parameterName>theValue</parameterName>
|
||||
<inlineGet>true</inlineGet>
|
||||
<inlineSet>true</inlineSet>
|
||||
</creategettersetter>
|
||||
<splitheadersource>
|
||||
<enabled>false</enabled>
|
||||
<synchronize>true</synchronize>
|
||||
<orientation>Vertical</orientation>
|
||||
</splitheadersource>
|
||||
</kdevcppsupport>
|
||||
<kdevfilecreate>
|
||||
<filetypes/>
|
||||
<useglobaltypes>
|
||||
<type ext="ui" />
|
||||
<type ext="cpp" />
|
||||
<type ext="h" />
|
||||
</useglobaltypes>
|
||||
</kdevfilecreate>
|
||||
<kdevtrollproject>
|
||||
<general>
|
||||
<activedir>src</activedir>
|
||||
</general>
|
||||
<run>
|
||||
<directoryradio>executable</directoryradio>
|
||||
<mainprogram>/home/ishanarora/projects/qbittorrent/src/qbittorrent</mainprogram>
|
||||
<programargs/>
|
||||
<globaldebugarguments/>
|
||||
<globalcwd>/home/ishanarora/projects/qbittorrent</globalcwd>
|
||||
<useglobalprogram>true</useglobalprogram>
|
||||
<terminal>false</terminal>
|
||||
<autocompile>true</autocompile>
|
||||
<autoinstall>false</autoinstall>
|
||||
<autokdesu>false</autokdesu>
|
||||
<envvars/>
|
||||
</run>
|
||||
<make>
|
||||
<abortonerror>true</abortonerror>
|
||||
<runmultiplejobs>false</runmultiplejobs>
|
||||
<numberofjobs>1</numberofjobs>
|
||||
<dontact>false</dontact>
|
||||
<makebin/>
|
||||
<prio>0</prio>
|
||||
<envvars/>
|
||||
</make>
|
||||
<qmake>
|
||||
<savebehaviour>2</savebehaviour>
|
||||
<replacePaths>false</replacePaths>
|
||||
<disableDefaultOpts>true</disableDefaultOpts>
|
||||
</qmake>
|
||||
</kdevtrollproject>
|
||||
<cppsupportpart>
|
||||
<filetemplates>
|
||||
<interfacesuffix>.h</interfacesuffix>
|
||||
<implementationsuffix>.cpp</implementationsuffix>
|
||||
</filetemplates>
|
||||
</cppsupportpart>
|
||||
<ctagspart>
|
||||
<customArguments/>
|
||||
<customTagfilePath>/home/ishanarora/projects/qbittorrent/tags</customTagfilePath>
|
||||
<activeTagsFiles/>
|
||||
</ctagspart>
|
||||
<kdevdocumentation>
|
||||
<projectdoc>
|
||||
<docsystem/>
|
||||
<docurl/>
|
||||
<usermanualurl/>
|
||||
</projectdoc>
|
||||
</kdevdocumentation>
|
||||
</kdevelop>
|
||||
@@ -19,4 +19,6 @@
|
||||
</dep>
|
||||
<dep type='geoip-database'>
|
||||
</dep>
|
||||
<dep type='qtsingleapplication'>
|
||||
</dep>
|
||||
</qconf>
|
||||
|
||||
@@ -2,14 +2,39 @@
|
||||
-----BEGIN QCMOD-----
|
||||
name: libboost
|
||||
arg: with-libboost-inc=[path], Path to libboost include files
|
||||
arg: with-libboost-lib=[path], Path to libboost library files
|
||||
-----END QCMOD-----
|
||||
*/
|
||||
#include <boost/version.hpp>
|
||||
class qc_libboost : public ConfObj
|
||||
{
|
||||
public:
|
||||
qc_libboost(Conf *c) : ConfObj(c) {}
|
||||
QString name() const { return "libboost"; }
|
||||
QString shortname() const { return "libboost"; }
|
||||
QString findBoostLib(QString path, QString lib) const {
|
||||
QString name;
|
||||
QDir libDir(path);
|
||||
QStringList filters;
|
||||
filters << "libboost_"+lib+"*-mt*.so";
|
||||
QStringList result = libDir.entryList(filters, QDir::Files);
|
||||
if(!result.empty()) {
|
||||
name = result.first().mid(3);
|
||||
// Remove .so
|
||||
name.chop(3);
|
||||
} else {
|
||||
// Fall back to non -mt boost lib
|
||||
filters.clear();
|
||||
filters << "libboost_"+lib+"*.so";
|
||||
result = libDir.entryList(filters, QDir::Files);
|
||||
if(!result.empty()) {
|
||||
name = result.first().mid(3);
|
||||
// Remove .so
|
||||
name.chop(3);
|
||||
}
|
||||
}
|
||||
return name;
|
||||
}
|
||||
bool exec(){
|
||||
QString s;
|
||||
s = conf->getenv("QC_WITH_LIBBOOST_INC");
|
||||
@@ -51,6 +76,43 @@ public:
|
||||
}
|
||||
}
|
||||
conf->addIncludePath(s);
|
||||
// Find library
|
||||
s = conf->getenv("QC_WITH_LIBBOOST_LIB");
|
||||
QStringList required_libs;
|
||||
#if BOOST_VERSION >= 103500
|
||||
required_libs << "system";
|
||||
#endif
|
||||
if(conf->getenv("QC_DISABLE_GUI").isEmpty()) {
|
||||
// Not required by nox
|
||||
required_libs << "filesystem" << "thread";
|
||||
}
|
||||
QStringList libDirs;
|
||||
libDirs << "/usr/lib/" << "/usr/lib64/" << "/usr/local/lib/" << "/usr/local/lib64/";
|
||||
foreach(const QString& lib, required_libs) {
|
||||
if(!s.isEmpty()) {
|
||||
QString detected_name = findBoostLib(s, lib);
|
||||
if(detected_name.isEmpty()) {
|
||||
printf("Could not find boost %s library!\n", qPrintable(lib));
|
||||
return false;
|
||||
} else {
|
||||
conf->addLib("-l"+detected_name);
|
||||
}
|
||||
} else {
|
||||
bool found = false;
|
||||
foreach(const QString& libDir, libDirs) {
|
||||
QString detected_name = findBoostLib(libDir, lib);
|
||||
if(!detected_name.isEmpty()) {
|
||||
conf->addLib("-l"+detected_name);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!found) {
|
||||
printf("Could not find boost %s library!\n", qPrintable(lib));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -24,7 +24,7 @@ public:
|
||||
QString version, libs, other;
|
||||
VersionMode mode = VersionMin;
|
||||
if(conf->findPkgConfig("libnotify", mode, req_ver, &version, &incs, &libs, &other)) {
|
||||
conf->addDefine("WITH_LIBNOTIFY");
|
||||
conf->addExtra("CONFIG += libnotify");
|
||||
for(int n = 0; n < incs.count(); ++n)
|
||||
conf->addIncludePath(incs[n]);
|
||||
if(!libs.isEmpty())
|
||||
@@ -40,6 +40,17 @@ public:
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
QStringList incs3;
|
||||
QString req_ver3 = "2.0";
|
||||
QString version3, libs3, other3;
|
||||
if(conf->findPkgConfig("gtk+-2.0", mode, req_ver3, &version3, &incs3, &libs3, &other3)) {
|
||||
for(int n = 0; n < incs3.count(); ++n)
|
||||
conf->addIncludePath(incs3[n]);
|
||||
if(!libs3.isEmpty())
|
||||
conf->addLib(libs3);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -13,25 +13,15 @@ public:
|
||||
bool exec(){
|
||||
QStringList incs;
|
||||
QString req_ver = "0.14.4";
|
||||
QString adv_ver = "0.15.0";
|
||||
QString version, libs, other;
|
||||
VersionMode mode = VersionMin;
|
||||
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, req_ver, &version, &incs, &libs, &other))
|
||||
return false;
|
||||
for(int n = 0; n < incs.count(); ++n)
|
||||
conf->addIncludePath(incs[n]);
|
||||
//if(!libs.isEmpty())
|
||||
// conf->addLib(libs);
|
||||
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, adv_ver, &version, &incs, &libs, &other))
|
||||
printf("\nWarning: libtorrent-rasterbar v%s was detected. Some feature will be disabled because they require v%s.\n", version.toLocal8Bit().data(), adv_ver.toUtf8().data());
|
||||
else
|
||||
conf->addDefine("LIBTORRENT_0_15");
|
||||
// Get linking parameters
|
||||
QStringList params;
|
||||
QByteArray staticlibs;
|
||||
params << "--static" << "--libs" << "libtorrent-rasterbar";
|
||||
conf->doCommand("pkg-config", params, &staticlibs);
|
||||
conf->addLib(staticlibs.trimmed());
|
||||
if(conf->getenv("QC_DISABLE_GUI").isEmpty()) {
|
||||
conf->addLib("-lcrypto");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
14
qcm/qt4.qcm
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
-----BEGIN QCMOD-----
|
||||
name: Qt >= 4.4
|
||||
name: Qt >= 4.5
|
||||
arg: disable-gui, Disable qBittorrent Graphical user interface for headless running
|
||||
-----END QCMOD-----
|
||||
*/
|
||||
@@ -8,17 +8,13 @@ class qc_qt4 : public ConfObj
|
||||
{
|
||||
public:
|
||||
qc_qt4(Conf *c) : ConfObj(c) {}
|
||||
QString name() const { return "Qt >= 4.4"; }
|
||||
QString shortname() const { return "Qt 4.4"; }
|
||||
QString name() const { return "Qt >= 4.5"; }
|
||||
QString shortname() const { return "Qt 4.5"; }
|
||||
bool exec()
|
||||
{
|
||||
if(!conf->getenv("QC_DISABLE_GUI").isEmpty()) {
|
||||
conf->addDefine("DISABLE_GUI");
|
||||
conf->addExtra("CONFIG += nox");
|
||||
}
|
||||
if(QT_VERSION >= 0x040500) {
|
||||
conf->addDefine("QT_4_5");
|
||||
}
|
||||
return(QT_VERSION >= 0x040400);
|
||||
|
||||
return(QT_VERSION >= 0x040500);
|
||||
}
|
||||
};
|
||||
|
||||
26
qcm/qtsingleapplication.qcm
Normal file
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
-----BEGIN QCMOD-----
|
||||
name: libboost
|
||||
arg: with-qtsingleapplication=[system|shipped], Use the shipped qtsingleapplication library or the system one
|
||||
-----END QCMOD-----
|
||||
*/
|
||||
class qc_qtsingleapplication : public ConfObj
|
||||
{
|
||||
public:
|
||||
qc_qtsingleapplication(Conf *c) : ConfObj(c) {}
|
||||
QString name() const { return "qtsingleapplication library"; }
|
||||
QString shortname() const { return "qtsingleapplication"; }
|
||||
|
||||
bool exec(){
|
||||
QString s;
|
||||
s = conf->getenv("QC_WITH_QTSINGLEAPPLICATION");
|
||||
if(s.compare("system", Qt::CaseInsensitive) == 0) {
|
||||
// System
|
||||
conf->addExtra("CONFIG += usesystemqtsingleapplication");
|
||||
printf(" [system] ");
|
||||
} else {
|
||||
printf(" [shipped] ");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
960
src/GUI.cpp
@@ -1,960 +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.
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
#ifdef WITH_LIBNOTIFY
|
||||
#include <glib.h>
|
||||
#include <unistd.h>
|
||||
#include <libnotify/notify.h>
|
||||
#endif
|
||||
|
||||
#include <QFileDialog>
|
||||
#include <QMessageBox>
|
||||
#include <QTimer>
|
||||
#include <QDesktopServices>
|
||||
#include <QStatusBar>
|
||||
#include <QClipboard>
|
||||
#include <QLocalServer>
|
||||
#include <QLocalSocket>
|
||||
#include <QCloseEvent>
|
||||
#include <QShortcut>
|
||||
|
||||
#include "GUI.h"
|
||||
#include "transferlistwidget.h"
|
||||
#include "misc.h"
|
||||
#include "createtorrent_imp.h"
|
||||
#include "downloadfromurldlg.h"
|
||||
#include "torrentadditiondlg.h"
|
||||
#include "searchengine.h"
|
||||
#include "rss_imp.h"
|
||||
#include "bittorrent.h"
|
||||
#include "about_imp.h"
|
||||
#include "trackerlogin.h"
|
||||
#include "options_imp.h"
|
||||
#include "speedlimitdlg.h"
|
||||
#include "preferences.h"
|
||||
#include "console_imp.h"
|
||||
#include "trackerlist.h"
|
||||
#include "peerlistwidget.h"
|
||||
#include "torrentpersistentdata.h"
|
||||
#include "transferlistfilterswidget.h"
|
||||
#include "propertieswidget.h"
|
||||
#include "statusbar.h"
|
||||
|
||||
using namespace libtorrent;
|
||||
|
||||
#define TIME_TRAY_BALLOON 5000
|
||||
|
||||
/*****************************************************
|
||||
* *
|
||||
* GUI *
|
||||
* *
|
||||
*****************************************************/
|
||||
|
||||
// Constructor
|
||||
GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), displaySpeedInTitle(false), force_exit(false) {
|
||||
setupUi(this);
|
||||
|
||||
setWindowTitle(tr("qBittorrent %1", "e.g: qBittorrent v0.x").arg(QString::fromUtf8(VERSION)));
|
||||
// Setting icons
|
||||
this->setWindowIcon(QIcon(QString::fromUtf8(":/Icons/skin/qbittorrent32.png")));
|
||||
actionOpen->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/open.png")));
|
||||
actionExit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/exit.png")));
|
||||
actionDownload_from_URL->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/url.png")));
|
||||
actionOptions->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/settings.png")));
|
||||
actionAbout->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/info.png")));
|
||||
actionWebsite->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/qbittorrent32.png")));
|
||||
actionBugReport->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/bug.png")));
|
||||
actionStart->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/play.png")));
|
||||
actionPause->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/pause.png")));
|
||||
actionDelete->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete.png")));
|
||||
actionPause_All->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/pause_all.png")));
|
||||
actionStart_All->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/play_all.png")));
|
||||
actionClearLog->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete.png")));
|
||||
actionPreview_file->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/preview.png")));
|
||||
actionSet_upload_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png")));
|
||||
actionSet_download_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/download.png")));
|
||||
actionSet_global_upload_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png")));
|
||||
actionSet_global_download_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/download.png")));
|
||||
actionDocumentation->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/qb_question.png")));
|
||||
prioSeparator = toolBar->insertSeparator(actionDecreasePriority);
|
||||
prioSeparator2 = menu_Edit->insertSeparator(actionDecreasePriority);
|
||||
prioSeparator->setVisible(false);
|
||||
prioSeparator2->setVisible(false);
|
||||
actionCreate_torrent->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/new.png")));
|
||||
// Fix Tool bar layout
|
||||
toolBar->layout()->setSpacing(7);
|
||||
// Creating Bittorrent session
|
||||
BTSession = new Bittorrent();
|
||||
connect(BTSession, SIGNAL(fullDiskError(QTorrentHandle&, QString)), this, SLOT(fullDiskError(QTorrentHandle&, QString)));
|
||||
connect(BTSession, SIGNAL(finishedTorrent(QTorrentHandle&)), this, SLOT(finishedTorrent(QTorrentHandle&)));
|
||||
connect(BTSession, SIGNAL(trackerAuthenticationRequired(QTorrentHandle&)), this, SLOT(trackerAuthenticationRequired(QTorrentHandle&)));
|
||||
connect(BTSession, SIGNAL(newDownloadedTorrent(QString, QString)), this, SLOT(processDownloadedFiles(QString, QString)));
|
||||
connect(BTSession, SIGNAL(downloadFromUrlFailure(QString, QString)), this, SLOT(handleDownloadFromUrlFailure(QString, QString)));
|
||||
connect(BTSession, SIGNAL(alternativeSpeedsModeChanged(bool)), this, SLOT(updateAltSpeedsBtn(bool)));
|
||||
|
||||
qDebug("create tabWidget");
|
||||
tabs = new QTabWidget();
|
||||
connect(tabs, SIGNAL(currentChanged(int)), this, SLOT(tab_changed(int)));
|
||||
vSplitter = new QSplitter(Qt::Horizontal);
|
||||
//vSplitter->setChildrenCollapsible(false);
|
||||
hSplitter = new QSplitter(Qt::Vertical);
|
||||
hSplitter->setChildrenCollapsible(false);
|
||||
|
||||
// Transfer List tab
|
||||
transferList = new TransferListWidget(hSplitter, this, BTSession);
|
||||
properties = new PropertiesWidget(hSplitter, this, transferList, BTSession);
|
||||
transferListFilters = new TransferListFiltersWidget(vSplitter, transferList);
|
||||
hSplitter->addWidget(transferList);
|
||||
hSplitter->addWidget(properties);
|
||||
vSplitter->addWidget(transferListFilters);
|
||||
vSplitter->addWidget(hSplitter);
|
||||
vSplitter->setCollapsible(0, true);
|
||||
vSplitter->setCollapsible(1, false);
|
||||
tabs->addTab(vSplitter, QIcon(QString::fromUtf8(":/Icons/oxygen/folder-remote.png")), tr("Transfers"));
|
||||
vboxLayout->addWidget(tabs);
|
||||
|
||||
// Transfer list slots
|
||||
connect(actionStart, SIGNAL(triggered()), transferList, SLOT(startSelectedTorrents()));
|
||||
connect(actionStart_All, SIGNAL(triggered()), transferList, SLOT(startAllTorrents()));
|
||||
connect(actionPause, SIGNAL(triggered()), transferList, SLOT(pauseSelectedTorrents()));
|
||||
connect(actionPause_All, SIGNAL(triggered()), transferList, SLOT(pauseAllTorrents()));
|
||||
connect(actionDelete, SIGNAL(triggered()), transferList, SLOT(deleteSelectedTorrents()));
|
||||
connect(actionIncreasePriority, SIGNAL(triggered()), transferList, SLOT(increasePrioSelectedTorrents()));
|
||||
connect(actionDecreasePriority, SIGNAL(triggered()), transferList, SLOT(decreasePrioSelectedTorrents()));
|
||||
|
||||
// Search engine tab
|
||||
searchEngine = new SearchEngine(this, BTSession);
|
||||
tabs->addTab(searchEngine, QIcon(QString::fromUtf8(":/Icons/oxygen/edit-find.png")), tr("Search"));
|
||||
|
||||
// Configure BT session according to options
|
||||
loadPreferences(false);
|
||||
// Resume unfinished torrents
|
||||
BTSession->startUpTorrents();
|
||||
// Add torrent given on command line
|
||||
processParams(torrentCmdLine);
|
||||
// Use a tcp server to allow only one instance of qBittorrent
|
||||
localServer = new QLocalServer();
|
||||
QString uid = QString::number(getuid());
|
||||
#ifdef Q_WS_X11
|
||||
if(QFile::exists(QDir::tempPath()+QDir::separator()+QString("qBittorrent-")+uid)) {
|
||||
// Socket was not closed cleanly
|
||||
std::cerr << "Warning: Local domain socket was not closed cleanly, deleting file...\n";
|
||||
QFile::remove(QDir::tempPath()+QDir::separator()+QString("qBittorrent-")+uid);
|
||||
}
|
||||
#endif
|
||||
if (!localServer->listen("qBittorrent-"+uid)) {
|
||||
std::cerr << "Couldn't create socket, single instance mode won't work...\n";
|
||||
}
|
||||
connect(localServer, SIGNAL(newConnection()), this, SLOT(acceptConnection()));
|
||||
// Start connection checking timer
|
||||
guiUpdater = new QTimer(this);
|
||||
connect(guiUpdater, SIGNAL(timeout()), this, SLOT(updateGUI()));
|
||||
guiUpdater->start(2000);
|
||||
// Accept drag 'n drops
|
||||
setAcceptDrops(true);
|
||||
createKeyboardShortcuts();
|
||||
// Create status bar
|
||||
status_bar = new StatusBar(QMainWindow::statusBar(), BTSession);
|
||||
connect(actionUse_alternative_speed_limits, SIGNAL(triggered()), status_bar, SLOT(toggleAlternativeSpeeds()));
|
||||
|
||||
show();
|
||||
|
||||
// Load Window state and sizes
|
||||
readSettings();
|
||||
properties->readSettings();
|
||||
|
||||
// Limit status filters list height
|
||||
int cur_height = 80;
|
||||
do {
|
||||
transferListFilters->getStatusFilters()->setFixedHeight(cur_height);
|
||||
cur_height += 10;
|
||||
transferListFilters->getStatusFilters()->scrollToBottom();
|
||||
}while(transferListFilters->getStatusFilters()->verticalScrollBar()->sliderPosition() > 0);
|
||||
transferListFilters->getStatusFilters()->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
|
||||
if(Preferences::startMinimized()) {
|
||||
setWindowState(Qt::WindowMinimized);
|
||||
}
|
||||
|
||||
qDebug("GUI Built");
|
||||
}
|
||||
|
||||
// Destructor
|
||||
GUI::~GUI() {
|
||||
qDebug("GUI destruction");
|
||||
hide();
|
||||
// Async deletion of Bittorrent session as early as possible
|
||||
// in order to speed up exit
|
||||
session_proxy sp = BTSession->asyncDeletion();
|
||||
// Some saving
|
||||
properties->saveSettings();
|
||||
disconnect(tabs, SIGNAL(currentChanged(int)), this, SLOT(tab_changed(int)));
|
||||
// Delete other GUI objects
|
||||
delete status_bar;
|
||||
delete transferList;
|
||||
delete guiUpdater;
|
||||
if(createTorrentDlg)
|
||||
delete createTorrentDlg;
|
||||
if(console)
|
||||
delete console;
|
||||
if(aboutDlg)
|
||||
delete aboutDlg;
|
||||
if(options)
|
||||
delete options;
|
||||
if(rssWidget)
|
||||
delete rssWidget;
|
||||
delete searchEngine;
|
||||
delete transferListFilters;
|
||||
delete properties;
|
||||
delete hSplitter;
|
||||
delete vSplitter;
|
||||
if(systrayCreator) {
|
||||
delete systrayCreator;
|
||||
}
|
||||
if(systrayIcon) {
|
||||
delete systrayIcon;
|
||||
delete myTrayIconMenu;
|
||||
}
|
||||
localServer->close();
|
||||
delete localServer;
|
||||
delete tabs;
|
||||
// Keyboard shortcuts
|
||||
delete switchSearchShortcut;
|
||||
delete switchSearchShortcut2;
|
||||
delete switchTransferShortcut;
|
||||
delete switchRSSShortcut;
|
||||
// Delete BTSession objects
|
||||
delete BTSession;
|
||||
// May freeze for a few seconds after the next line
|
||||
// because the Bittorrent session proxy will
|
||||
// actually be deleted now and destruction
|
||||
// becomes synchronous
|
||||
qDebug("Exiting GUI destructor...");
|
||||
}
|
||||
|
||||
void GUI::displayRSSTab(bool enable) {
|
||||
if(enable) {
|
||||
// RSS tab
|
||||
if(!rssWidget) {
|
||||
rssWidget = new RSSImp(BTSession);
|
||||
int index_tab = tabs->addTab(rssWidget, tr("RSS"));
|
||||
tabs->setTabIcon(index_tab, QIcon(QString::fromUtf8(":/Icons/rss32.png")));
|
||||
}
|
||||
} else {
|
||||
if(rssWidget) {
|
||||
delete rssWidget;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void GUI::on_actionWebsite_triggered() const {
|
||||
QDesktopServices::openUrl(QUrl(QString::fromUtf8("http://www.qbittorrent.org")));
|
||||
}
|
||||
|
||||
void GUI::on_actionDocumentation_triggered() const {
|
||||
QDesktopServices::openUrl(QUrl(QString::fromUtf8("http://doc.qbittorrent.org")));
|
||||
}
|
||||
|
||||
void GUI::on_actionBugReport_triggered() const {
|
||||
QDesktopServices::openUrl(QUrl(QString::fromUtf8("http://bugs.qbittorrent.org")));
|
||||
}
|
||||
|
||||
void GUI::tab_changed(int new_tab) {
|
||||
if(new_tab == TAB_TRANSFER) {
|
||||
qDebug("Changed tab to transfer list, refreshing the list");
|
||||
transferList->refreshList();
|
||||
properties->loadDynamicData();
|
||||
}
|
||||
}
|
||||
|
||||
void GUI::writeSettings() {
|
||||
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||
settings.beginGroup(QString::fromUtf8("MainWindow"));
|
||||
settings.setValue(QString::fromUtf8("size"), size());
|
||||
settings.setValue(QString::fromUtf8("pos"), pos());
|
||||
// Splitter size
|
||||
QStringList sizes_str;
|
||||
sizes_str << QString::number(vSplitter->sizes().first());
|
||||
sizes_str << QString::number(vSplitter->sizes().last());
|
||||
settings.setValue(QString::fromUtf8("vSplitterSizes"), sizes_str);
|
||||
settings.endGroup();
|
||||
}
|
||||
|
||||
// called when a torrent has finished
|
||||
void GUI::finishedTorrent(QTorrentHandle& h) const {
|
||||
if(!TorrentPersistentData::isSeed(h.hash()))
|
||||
showNotificationBaloon(tr("Download completion"), tr("%1 has finished downloading.", "e.g: xxx.avi has finished downloading.").arg(h.name()));
|
||||
}
|
||||
|
||||
// Notification when disk is full
|
||||
void GUI::fullDiskError(QTorrentHandle& h, QString msg) const {
|
||||
if(!h.is_valid()) return;
|
||||
showNotificationBaloon(tr("I/O Error", "i.e: Input/Output Error"), tr("An I/O error occured for torrent %1.\n Reason: %2", "e.g: An error occured for torrent xxx.avi.\n Reason: disk is full.").arg(h.name()).arg(msg));
|
||||
}
|
||||
|
||||
void GUI::createKeyboardShortcuts() {
|
||||
actionCreate_torrent->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+N")));
|
||||
actionOpen->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+O")));
|
||||
actionExit->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+Q")));
|
||||
switchTransferShortcut = new QShortcut(QKeySequence(tr("Alt+1", "shortcut to switch to first tab")), this);
|
||||
connect(switchTransferShortcut, SIGNAL(activated()), this, SLOT(displayTransferTab()));
|
||||
switchSearchShortcut = new QShortcut(QKeySequence(tr("Alt+2", "shortcut to switch to third tab")), this);
|
||||
connect(switchSearchShortcut, SIGNAL(activated()), this, SLOT(displaySearchTab()));
|
||||
switchSearchShortcut2 = new QShortcut(QKeySequence(tr("Ctrl+F", "shortcut to switch to search tab")), this);
|
||||
connect(switchSearchShortcut2, SIGNAL(activated()), this, SLOT(displaySearchTab()));
|
||||
switchRSSShortcut = new QShortcut(QKeySequence(tr("Alt+3", "shortcut to switch to fourth tab")), this);
|
||||
connect(switchRSSShortcut, SIGNAL(activated()), this, SLOT(displayRSSTab()));
|
||||
actionDocumentation->setShortcut(QKeySequence("F1"));
|
||||
actionOptions->setShortcut(QKeySequence(QString::fromUtf8("Alt+O")));
|
||||
actionDelete->setShortcut(QKeySequence(QString::fromUtf8("Del")));
|
||||
actionStart->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+S")));
|
||||
actionStart_All->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+Shift+S")));
|
||||
actionPause->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+P")));
|
||||
actionPause_All->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+Shift+P")));
|
||||
actionDecreasePriority->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+-")));
|
||||
actionIncreasePriority->setShortcut(QKeySequence(QString::fromUtf8("Ctrl++")));
|
||||
}
|
||||
|
||||
// Keyboard shortcuts slots
|
||||
void GUI::displayTransferTab() const {
|
||||
tabs->setCurrentIndex(TAB_TRANSFER);
|
||||
}
|
||||
|
||||
void GUI::displaySearchTab() const {
|
||||
tabs->setCurrentIndex(TAB_SEARCH);
|
||||
}
|
||||
|
||||
void GUI::displayRSSTab() const {
|
||||
tabs->setCurrentIndex(TAB_RSS);
|
||||
}
|
||||
|
||||
// End of keyboard shortcuts slots
|
||||
|
||||
void GUI::readSettings() {
|
||||
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||
settings.beginGroup(QString::fromUtf8("MainWindow"));
|
||||
resize(settings.value(QString::fromUtf8("size"), size()).toSize());
|
||||
move(settings.value(QString::fromUtf8("pos"), misc::screenCenter(this)).toPoint());
|
||||
const QStringList &sizes_str = settings.value("vSplitterSizes", QStringList()).toStringList();
|
||||
// Splitter size
|
||||
QList<int> sizes;
|
||||
if(sizes_str.size() == 2) {
|
||||
sizes << sizes_str.first().toInt();
|
||||
sizes << sizes_str.last().toInt();
|
||||
} else {
|
||||
qDebug("Default splitter size");
|
||||
sizes << 120;
|
||||
sizes << vSplitter->width()-120;
|
||||
}
|
||||
vSplitter->setSizes(sizes);
|
||||
settings.endGroup();
|
||||
}
|
||||
|
||||
void GUI::balloonClicked() {
|
||||
if(isHidden()) {
|
||||
show();
|
||||
if(isMinimized()) {
|
||||
showNormal();
|
||||
}
|
||||
raise();
|
||||
activateWindow();
|
||||
}
|
||||
}
|
||||
|
||||
void GUI::acceptConnection() {
|
||||
QLocalSocket *clientConnection = localServer->nextPendingConnection();
|
||||
connect(clientConnection, SIGNAL(disconnected()), this, SLOT(readParamsOnSocket()));
|
||||
qDebug("accepted connection from another instance");
|
||||
}
|
||||
|
||||
void GUI::readParamsOnSocket() {
|
||||
QLocalSocket *clientConnection = static_cast<QLocalSocket*>(sender());
|
||||
if(clientConnection) {
|
||||
const QByteArray ¶ms = clientConnection->readAll();
|
||||
if(!params.isEmpty()) {
|
||||
processParams(QString::fromLocal8Bit(params.constData()).split("\n"));
|
||||
qDebug("Received parameters from another instance");
|
||||
}
|
||||
clientConnection->deleteLater();
|
||||
}
|
||||
}
|
||||
|
||||
void GUI::handleDownloadFromUrlFailure(QString url, QString reason) const{
|
||||
// Display a message box
|
||||
QMessageBox::critical(0, tr("Url download error"), tr("Couldn't download file at url: %1, reason: %2.").arg(url).arg(reason));
|
||||
}
|
||||
|
||||
void GUI::on_actionSet_global_upload_limit_triggered() {
|
||||
qDebug("actionSet_global_upload_limit_triggered");
|
||||
bool ok;
|
||||
const long new_limit = SpeedLimitDialog::askSpeedLimit(&ok, tr("Global Upload Speed Limit"), BTSession->getSession()->upload_rate_limit());
|
||||
if(ok) {
|
||||
qDebug("Setting global upload rate limit to %.1fKb/s", new_limit/1024.);
|
||||
BTSession->getSession()->set_upload_rate_limit(new_limit);
|
||||
if(new_limit <= 0)
|
||||
Preferences::setGlobalUploadLimit(-1);
|
||||
else
|
||||
Preferences::setGlobalUploadLimit(new_limit/1024.);
|
||||
}
|
||||
}
|
||||
|
||||
void GUI::on_actionShow_console_triggered() {
|
||||
if(!console) {
|
||||
console = new consoleDlg(this, BTSession);
|
||||
} else {
|
||||
console->setFocus();
|
||||
}
|
||||
}
|
||||
|
||||
void GUI::on_actionSet_global_download_limit_triggered() {
|
||||
qDebug("actionSet_global_download_limit_triggered");
|
||||
bool ok;
|
||||
const long new_limit = SpeedLimitDialog::askSpeedLimit(&ok, tr("Global Download Speed Limit"), BTSession->getSession()->download_rate_limit());
|
||||
if(ok) {
|
||||
qDebug("Setting global download rate limit to %.1fKb/s", new_limit/1024.);
|
||||
BTSession->getSession()->set_download_rate_limit(new_limit);
|
||||
if(new_limit <= 0)
|
||||
Preferences::setGlobalDownloadLimit(-1);
|
||||
else
|
||||
Preferences::setGlobalDownloadLimit(new_limit/1024.);
|
||||
}
|
||||
}
|
||||
|
||||
// Necessary if we want to close the window
|
||||
// in one time if "close to systray" is enabled
|
||||
void GUI::on_actionExit_triggered() {
|
||||
force_exit = true;
|
||||
close();
|
||||
}
|
||||
|
||||
int GUI::getCurrentTabIndex() const {
|
||||
if(isMinimized() || !isVisible())
|
||||
return -1;
|
||||
return tabs->currentIndex();
|
||||
}
|
||||
|
||||
void GUI::setTabText(int index, QString text) const {
|
||||
tabs->setTabText(index, text);
|
||||
}
|
||||
|
||||
// Toggle Main window visibility
|
||||
void GUI::toggleVisibility(QSystemTrayIcon::ActivationReason e) {
|
||||
if(e == QSystemTrayIcon::Trigger || e == QSystemTrayIcon::DoubleClick) {
|
||||
if(isHidden()) {
|
||||
show();
|
||||
if(isMinimized()) {
|
||||
if(isMaximized()) {
|
||||
showMaximized();
|
||||
}else{
|
||||
showNormal();
|
||||
}
|
||||
}
|
||||
raise();
|
||||
activateWindow();
|
||||
}else{
|
||||
hide();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Display About Dialog
|
||||
void GUI::on_actionAbout_triggered() {
|
||||
//About dialog
|
||||
if(aboutDlg) {
|
||||
aboutDlg->setFocus();
|
||||
} else {
|
||||
aboutDlg = new about(this);
|
||||
}
|
||||
}
|
||||
|
||||
void GUI::showEvent(QShowEvent *e) {
|
||||
qDebug("** Show Event **");
|
||||
if(getCurrentTabIndex() == TAB_TRANSFER) {
|
||||
qDebug("-> Refreshing transfer list");
|
||||
transferList->refreshList();
|
||||
properties->loadDynamicData();
|
||||
}
|
||||
e->accept();
|
||||
}
|
||||
|
||||
// Called when we close the program
|
||||
void GUI::closeEvent(QCloseEvent *e) {
|
||||
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||
const bool goToSystrayOnExit = settings.value(QString::fromUtf8("Preferences/General/CloseToTray"), false).toBool();
|
||||
if(!force_exit && systrayIcon && goToSystrayOnExit && !this->isHidden()) {
|
||||
hide();
|
||||
//e->ignore();
|
||||
e->accept();
|
||||
return;
|
||||
}
|
||||
if(settings.value(QString::fromUtf8("Preferences/General/ExitConfirm"), true).toBool() && BTSession->hasActiveTorrents()) {
|
||||
show();
|
||||
if(!isMaximized())
|
||||
showNormal();
|
||||
if(e->spontaneous() || force_exit) {
|
||||
if(QMessageBox::question(this,
|
||||
tr("Are you sure you want to quit?")+QString::fromUtf8(" -- ")+tr("qBittorrent"),
|
||||
tr("Some files are currently transferring.\nAre you sure you want to quit qBittorrent?"),
|
||||
tr("&Yes"), tr("&No"),
|
||||
QString(), 0, 1)) {
|
||||
e->ignore();
|
||||
force_exit = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
hide();
|
||||
if(systrayIcon) {
|
||||
// Hide tray icon
|
||||
systrayIcon->hide();
|
||||
}
|
||||
// Save window size, columns size
|
||||
writeSettings();
|
||||
// Accept exit
|
||||
e->accept();
|
||||
qApp->exit();
|
||||
}
|
||||
|
||||
|
||||
// Display window to create a torrent
|
||||
void GUI::on_actionCreate_torrent_triggered() {
|
||||
if(createTorrentDlg) {
|
||||
createTorrentDlg->setFocus();
|
||||
} else {
|
||||
createTorrentDlg = new createtorrent(this);
|
||||
connect(createTorrentDlg, SIGNAL(torrent_to_seed(QString)), this, SLOT(addTorrent(QString)));
|
||||
}
|
||||
}
|
||||
|
||||
bool GUI::event(QEvent * e) {
|
||||
if(e->type() == QEvent::WindowStateChange) {
|
||||
//Now check to see if the window is minimised
|
||||
if(isMinimized()) {
|
||||
qDebug("minimisation");
|
||||
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||
if(systrayIcon && settings.value(QString::fromUtf8("Preferences/General/MinimizeToTray"), false).toBool()) {
|
||||
hide();
|
||||
}
|
||||
}
|
||||
}
|
||||
return QMainWindow::event(e);
|
||||
}
|
||||
|
||||
// Action executed when a file is dropped
|
||||
void GUI::dropEvent(QDropEvent *event) {
|
||||
event->acceptProposedAction();
|
||||
QStringList files;
|
||||
if(event->mimeData()->hasUrls()) {
|
||||
const QList<QUrl> &urls = event->mimeData()->urls();
|
||||
foreach(const QUrl &url, urls) {
|
||||
const QString tmp = url.toString().trimmed();
|
||||
if(!tmp.isEmpty())
|
||||
files << url.toString();
|
||||
}
|
||||
} else {
|
||||
files = event->mimeData()->text().split(QString::fromUtf8("\n"));
|
||||
}
|
||||
// Add file to download list
|
||||
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||
const bool useTorrentAdditionDialog = settings.value(QString::fromUtf8("Preferences/Downloads/AdditionDialog"), true).toBool();
|
||||
foreach(QString file, files) {
|
||||
file = file.trimmed().replace(QString::fromUtf8("file://"), QString::fromUtf8(""), Qt::CaseInsensitive);
|
||||
qDebug("Dropped file %s on download list", file.toLocal8Bit().data());
|
||||
if(file.startsWith(QString::fromUtf8("http://"), Qt::CaseInsensitive) || file.startsWith(QString::fromUtf8("ftp://"), Qt::CaseInsensitive) || file.startsWith(QString::fromUtf8("https://"), Qt::CaseInsensitive)) {
|
||||
BTSession->downloadFromUrl(file);
|
||||
continue;
|
||||
}
|
||||
if(file.startsWith("magnet:", Qt::CaseInsensitive)) {
|
||||
// FIXME: Possibly skipped torrent addition dialog
|
||||
BTSession->addMagnetUri(file);
|
||||
continue;
|
||||
}
|
||||
if(useTorrentAdditionDialog) {
|
||||
torrentAdditionDialog *dialog = new torrentAdditionDialog(this, BTSession);
|
||||
dialog->showLoad(file);
|
||||
}else{
|
||||
BTSession->addTorrent(file);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Decode if we accept drag 'n drop or not
|
||||
void GUI::dragEnterEvent(QDragEnterEvent *event) {
|
||||
foreach(const QString &mime, event->mimeData()->formats()){
|
||||
qDebug("mimeData: %s", mime.toLocal8Bit().data());
|
||||
}
|
||||
if (event->mimeData()->hasFormat(QString::fromUtf8("text/plain")) || event->mimeData()->hasFormat(QString::fromUtf8("text/uri-list"))) {
|
||||
event->acceptProposedAction();
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************
|
||||
* *
|
||||
* Torrent *
|
||||
* *
|
||||
*****************************************************/
|
||||
|
||||
// Display a dialog to allow user to add
|
||||
// torrents to download list
|
||||
void GUI::on_actionOpen_triggered() {
|
||||
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||
// Open File Open Dialog
|
||||
// Note: it is possible to select more than one file
|
||||
const QStringList &pathsList = QFileDialog::getOpenFileNames(0,
|
||||
tr("Open Torrent Files"), settings.value(QString::fromUtf8("MainWindowLastDir"), QDir::homePath()).toString(),
|
||||
tr("Torrent Files")+QString::fromUtf8(" (*.torrent)"));
|
||||
if(!pathsList.empty()) {
|
||||
const bool useTorrentAdditionDialog = settings.value(QString::fromUtf8("Preferences/Downloads/AdditionDialog"), true).toBool();
|
||||
const uint listSize = pathsList.size();
|
||||
for(uint i=0; i<listSize; ++i) {
|
||||
if(useTorrentAdditionDialog) {
|
||||
torrentAdditionDialog *dialog = new torrentAdditionDialog(this, BTSession);
|
||||
dialog->showLoad(pathsList.at(i));
|
||||
}else{
|
||||
BTSession->addTorrent(pathsList.at(i));
|
||||
}
|
||||
}
|
||||
// Save last dir to remember it
|
||||
QStringList top_dir = pathsList.at(0).split(QDir::separator());
|
||||
top_dir.removeLast();
|
||||
settings.setValue(QString::fromUtf8("MainWindowLastDir"), top_dir.join(QDir::separator()));
|
||||
}
|
||||
}
|
||||
|
||||
// As program parameters, we can get paths or urls.
|
||||
// This function parse the parameters and call
|
||||
// the right addTorrent function, considering
|
||||
// the parameter type.
|
||||
void GUI::processParams(const QStringList& params) {
|
||||
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||
const bool useTorrentAdditionDialog = settings.value(QString::fromUtf8("Preferences/Downloads/AdditionDialog"), true).toBool();
|
||||
foreach(QString param, params) {
|
||||
param = param.trimmed();
|
||||
if(param.startsWith("--")) continue;
|
||||
if(param.startsWith(QString::fromUtf8("http://"), Qt::CaseInsensitive) || param.startsWith(QString::fromUtf8("ftp://"), Qt::CaseInsensitive) || param.startsWith(QString::fromUtf8("https://"), Qt::CaseInsensitive)) {
|
||||
BTSession->downloadFromUrl(param);
|
||||
}else{
|
||||
if(param.startsWith("magnet:", Qt::CaseInsensitive)) {
|
||||
if(useTorrentAdditionDialog) {
|
||||
torrentAdditionDialog *dialog = new torrentAdditionDialog(this, BTSession);
|
||||
dialog->showLoadMagnetURI(param);
|
||||
} else {
|
||||
BTSession->addMagnetUri(param);
|
||||
}
|
||||
} else {
|
||||
if(useTorrentAdditionDialog) {
|
||||
torrentAdditionDialog *dialog = new torrentAdditionDialog(this, BTSession);
|
||||
dialog->showLoad(param);
|
||||
}else{
|
||||
BTSession->addTorrent(param);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void GUI::addTorrent(QString path) {
|
||||
BTSession->addTorrent(path);
|
||||
}
|
||||
|
||||
void GUI::processDownloadedFiles(QString path, QString url) {
|
||||
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||
const bool useTorrentAdditionDialog = settings.value(QString::fromUtf8("Preferences/Downloads/AdditionDialog"), true).toBool();
|
||||
if(useTorrentAdditionDialog) {
|
||||
torrentAdditionDialog *dialog = new torrentAdditionDialog(this, BTSession);
|
||||
dialog->showLoad(path, url);
|
||||
}else{
|
||||
BTSession->addTorrent(path, false, url);
|
||||
}
|
||||
}
|
||||
|
||||
void GUI::optionsSaved() {
|
||||
loadPreferences();
|
||||
}
|
||||
|
||||
// Load program preferences
|
||||
void GUI::loadPreferences(bool configure_session) {
|
||||
BTSession->addConsoleMessage(tr("Options were saved successfully."));
|
||||
const bool newSystrayIntegration = Preferences::systrayIntegration();
|
||||
if(newSystrayIntegration != (systrayIcon!=0)) {
|
||||
if(newSystrayIntegration) {
|
||||
// create the trayicon
|
||||
if(!QSystemTrayIcon::isSystemTrayAvailable()) {
|
||||
if(!configure_session) { // Program startup
|
||||
systrayCreator = new QTimer(this);
|
||||
connect(systrayCreator, SIGNAL(timeout()), this, SLOT(createSystrayDelayed()));
|
||||
systrayCreator->setSingleShot(true);
|
||||
systrayCreator->start(2000);
|
||||
qDebug("Info: System tray is unavailable, trying again later.");
|
||||
} else {
|
||||
qDebug("Warning: System tray is unavailable.");
|
||||
}
|
||||
} else {
|
||||
createTrayIcon();
|
||||
}
|
||||
} else {
|
||||
// Destroy trayicon
|
||||
delete systrayIcon;
|
||||
delete myTrayIconMenu;
|
||||
}
|
||||
}
|
||||
// General
|
||||
const bool new_displaySpeedInTitle = Preferences::speedInTitleBar();
|
||||
if(!new_displaySpeedInTitle && new_displaySpeedInTitle != displaySpeedInTitle) {
|
||||
// Reset title
|
||||
setWindowTitle(tr("qBittorrent %1", "e.g: qBittorrent vx.x").arg(QString::fromUtf8(VERSION)));
|
||||
}
|
||||
displaySpeedInTitle = new_displaySpeedInTitle;
|
||||
if(Preferences::isToolbarDisplayed()) {
|
||||
toolBar->setVisible(true);
|
||||
toolBar->layout()->setSpacing(7);
|
||||
} else {
|
||||
toolBar->setVisible(false);
|
||||
}
|
||||
const uint new_refreshInterval = Preferences::getRefreshInterval();
|
||||
transferList->setRefreshInterval(new_refreshInterval);
|
||||
transferList->setAlternatingRowColors(Preferences::useAlternatingRowColors());
|
||||
properties->getFilesList()->setAlternatingRowColors(Preferences::useAlternatingRowColors());
|
||||
properties->getTrackerList()->setAlternatingRowColors(Preferences::useAlternatingRowColors());
|
||||
properties->getPeerList()->setAlternatingRowColors(Preferences::useAlternatingRowColors());
|
||||
// Queueing System
|
||||
if(Preferences::isQueueingSystemEnabled()) {
|
||||
if(!configure_session || !BTSession->isQueueingEnabled()) {
|
||||
transferList->hidePriorityColumn(false);
|
||||
actionDecreasePriority->setVisible(true);
|
||||
actionIncreasePriority->setVisible(true);
|
||||
prioSeparator->setVisible(true);
|
||||
prioSeparator2->setVisible(true);
|
||||
toolBar->layout()->setSpacing(7);
|
||||
}
|
||||
} else {
|
||||
if(BTSession->isQueueingEnabled()) {
|
||||
transferList->hidePriorityColumn(true);
|
||||
actionDecreasePriority->setVisible(false);
|
||||
actionIncreasePriority->setVisible(false);
|
||||
prioSeparator->setVisible(false);
|
||||
prioSeparator2->setVisible(false);
|
||||
toolBar->layout()->setSpacing(7);
|
||||
}
|
||||
}
|
||||
|
||||
// RSS
|
||||
if(Preferences::isRSSEnabled()) {
|
||||
displayRSSTab(true);
|
||||
rssWidget->updateRefreshInterval(Preferences::getRSSRefreshInterval());
|
||||
} else {
|
||||
displayRSSTab(false);
|
||||
}
|
||||
|
||||
// Torrent properties
|
||||
properties->reloadPreferences();
|
||||
|
||||
if(configure_session)
|
||||
BTSession->configureSession();
|
||||
|
||||
qDebug("GUI settings loaded");
|
||||
}
|
||||
|
||||
void GUI::addUnauthenticatedTracker(const QPair<QTorrentHandle,QString> &tracker) {
|
||||
// Trackers whose authentication was cancelled
|
||||
if(unauthenticated_trackers.indexOf(tracker) < 0) {
|
||||
unauthenticated_trackers << tracker;
|
||||
}
|
||||
}
|
||||
|
||||
// Called when a tracker requires authentication
|
||||
void GUI::trackerAuthenticationRequired(QTorrentHandle& h) {
|
||||
if(unauthenticated_trackers.indexOf(QPair<QTorrentHandle,QString>(h, h.current_tracker())) < 0) {
|
||||
// Tracker login
|
||||
new trackerLogin(this, h);
|
||||
}
|
||||
}
|
||||
|
||||
// Check connection status and display right icon
|
||||
void GUI::updateGUI() {
|
||||
// update global informations
|
||||
if(systrayIcon) {
|
||||
#ifdef Q_WS_WIN
|
||||
// Windows does not support html here
|
||||
QString html =tr("DL speed: %1 KiB/s", "e.g: Download speed: 10 KiB/s").arg(QString::number(BTSession->getPayloadDownloadRate()/1024., 'f', 1));
|
||||
html += "\n";
|
||||
html += tr("UP speed: %1 KiB/s", "e.g: Upload speed: 10 KiB/s").arg(QString::number(BTSession->getPayloadUploadRate()/1024., 'f', 1));
|
||||
#else
|
||||
QString html = "<div style='background-color: #678db2; color: #fff;height: 18px; font-weight: bold; margin-bottom: 5px;'>";
|
||||
html += tr("qBittorrent");
|
||||
html += "</div>";
|
||||
html += "<div style='vertical-align: baseline; height: 18px;'>";
|
||||
html += "<img src=':/Icons/skin/download.png'/> "+tr("DL speed: %1 KiB/s", "e.g: Download speed: 10 KiB/s").arg(QString::number(BTSession->getPayloadDownloadRate()/1024., 'f', 1));
|
||||
html += "</div>";
|
||||
html += "<div style='vertical-align: baseline; height: 18px;'>";
|
||||
html += "<img src=':/Icons/skin/seeding.png'/> "+tr("UP speed: %1 KiB/s", "e.g: Upload speed: 10 KiB/s").arg(QString::number(BTSession->getPayloadUploadRate()/1024., 'f', 1));
|
||||
html += "</div>";
|
||||
#endif
|
||||
systrayIcon->setToolTip(html); // tray icon
|
||||
}
|
||||
if(displaySpeedInTitle) {
|
||||
setWindowTitle(tr("qBittorrent %1 (Down: %2/s, Up: %3/s)", "%1 is qBittorrent version").arg(QString::fromUtf8(VERSION)).arg(misc::friendlyUnit(BTSession->getSessionStatus().payload_download_rate)).arg(misc::friendlyUnit(BTSession->getSessionStatus().payload_upload_rate)));
|
||||
}
|
||||
}
|
||||
|
||||
void GUI::showNotificationBaloon(QString title, QString msg) const {
|
||||
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||
if(settings.value(QString::fromUtf8("Preferences/General/NotificationBaloons"), true).toBool()) {
|
||||
#ifdef WITH_LIBNOTIFY
|
||||
if (notify_init ("summary-body")) {
|
||||
NotifyNotification* notification;
|
||||
notification = notify_notification_new (title.toLocal8Bit().data(), msg.toLocal8Bit().data(), "qbittorrent", 0);
|
||||
gboolean success = notify_notification_show (notification, NULL);
|
||||
g_object_unref(G_OBJECT(notification));
|
||||
notify_uninit ();
|
||||
if(success) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if(systrayIcon)
|
||||
systrayIcon->showMessage(title, msg, QSystemTrayIcon::Information, TIME_TRAY_BALLOON);
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************
|
||||
* *
|
||||
* Utils *
|
||||
* *
|
||||
*****************************************************/
|
||||
|
||||
void GUI::downloadFromURLList(const QStringList& url_list) {
|
||||
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||
const bool useTorrentAdditionDialog = settings.value(QString::fromUtf8("Preferences/Downloads/AdditionDialog"), true).toBool();
|
||||
foreach(const QString& url, url_list) {
|
||||
if(url.startsWith("magnet:", Qt::CaseInsensitive)) {
|
||||
if(useTorrentAdditionDialog) {
|
||||
torrentAdditionDialog *dialog = new torrentAdditionDialog(this, BTSession);
|
||||
dialog->showLoadMagnetURI(url);
|
||||
} else {
|
||||
BTSession->addMagnetUri(url);
|
||||
}
|
||||
} else {
|
||||
BTSession->downloadFromUrl(url);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************
|
||||
* *
|
||||
* Options *
|
||||
* *
|
||||
*****************************************************/
|
||||
|
||||
void GUI::createSystrayDelayed() {
|
||||
static int timeout = 20;
|
||||
if(QSystemTrayIcon::isSystemTrayAvailable()) {
|
||||
// Ok, systray integration is now supported
|
||||
// Create systray icon
|
||||
createTrayIcon();
|
||||
delete systrayCreator;
|
||||
} else {
|
||||
if(timeout) {
|
||||
// Retry a bit later
|
||||
systrayCreator->start(2000);
|
||||
--timeout;
|
||||
} else {
|
||||
// Timed out, apparently system really does not
|
||||
// support systray icon
|
||||
delete systrayCreator;
|
||||
// Disable it in program preferences to
|
||||
// avoid trying at earch startup
|
||||
Preferences::setSystrayIntegration(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void GUI::updateAltSpeedsBtn(bool alternative) {
|
||||
if(alternative) {
|
||||
actionUse_alternative_speed_limits->setIcon(QIcon(":/Icons/slow.png"));
|
||||
actionUse_alternative_speed_limits->setText(tr("Use normal speed limits"));
|
||||
} else {
|
||||
actionUse_alternative_speed_limits->setIcon(QIcon(":/Icons/slow_off.png"));
|
||||
actionUse_alternative_speed_limits->setText(tr("Use alternative speed limits"));
|
||||
}
|
||||
}
|
||||
|
||||
void GUI::createTrayIcon() {
|
||||
// Tray icon
|
||||
#ifdef Q_WS_WIN
|
||||
systrayIcon = new QSystemTrayIcon(QIcon(QString::fromUtf8(":/Icons/skin/qbittorrent16.png")), this);
|
||||
#endif
|
||||
#ifndef Q_WS_WIN
|
||||
systrayIcon = new QSystemTrayIcon(QIcon(QString::fromUtf8(":/Icons/skin/qbittorrent22.png")), this);
|
||||
#endif
|
||||
// Tray icon Menu
|
||||
myTrayIconMenu = new QMenu(this);
|
||||
myTrayIconMenu->addAction(actionOpen);
|
||||
myTrayIconMenu->addAction(actionDownload_from_URL);
|
||||
myTrayIconMenu->addSeparator();
|
||||
updateAltSpeedsBtn(Preferences::isAltBandwidthEnabled());
|
||||
myTrayIconMenu->addAction(actionUse_alternative_speed_limits);
|
||||
myTrayIconMenu->addAction(actionSet_global_download_limit);
|
||||
myTrayIconMenu->addAction(actionSet_global_upload_limit);
|
||||
myTrayIconMenu->addSeparator();
|
||||
myTrayIconMenu->addAction(actionStart_All);
|
||||
myTrayIconMenu->addAction(actionPause_All);
|
||||
myTrayIconMenu->addSeparator();
|
||||
myTrayIconMenu->addAction(actionExit);
|
||||
systrayIcon->setContextMenu(myTrayIconMenu);
|
||||
connect(systrayIcon, SIGNAL(messageClicked()), this, SLOT(balloonClicked()));
|
||||
// End of Icon Menu
|
||||
connect(systrayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(toggleVisibility(QSystemTrayIcon::ActivationReason)));
|
||||
systrayIcon->show();
|
||||
}
|
||||
|
||||
// Display Program Options
|
||||
void GUI::on_actionOptions_triggered() {
|
||||
if(options) {
|
||||
// Get focus
|
||||
options->setFocus();
|
||||
} else {
|
||||
options = new options_imp(this);
|
||||
connect(options, SIGNAL(status_changed()), this, SLOT(optionsSaved()));
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************
|
||||
* *
|
||||
* HTTP Downloader *
|
||||
* *
|
||||
*****************************************************/
|
||||
|
||||
// Display an input dialog to prompt user for
|
||||
// an url
|
||||
void GUI::on_actionDownload_from_URL_triggered() {
|
||||
downloadFromURL *downloadFromURLDialog = new downloadFromURL(this);
|
||||
connect(downloadFromURLDialog, SIGNAL(urlsReadyToBeDownloaded(const QStringList&)), this, SLOT(downloadFromURLList(const QStringList&)));
|
||||
}
|
||||
|
||||
BIN
src/Icons/3-state-checkbox.gif
Normal file
|
After Width: | Height: | Size: 322 B |
BIN
src/Icons/L.gif
Normal file
|
After Width: | Height: | Size: 66 B |
BIN
src/Icons/flags/ad.png
Executable file
|
After Width: | Height: | Size: 643 B |
BIN
src/Icons/flags/ae.png
Executable file
|
After Width: | Height: | Size: 408 B |
BIN
src/Icons/flags/af.png
Executable file
|
After Width: | Height: | Size: 604 B |
BIN
src/Icons/flags/ag.png
Executable file
|
After Width: | Height: | Size: 591 B |
BIN
src/Icons/flags/ai.png
Executable file
|
After Width: | Height: | Size: 643 B |
BIN
src/Icons/flags/al.png
Executable file
|
After Width: | Height: | Size: 600 B |
|
Before Width: | Height: | Size: 473 B |
BIN
src/Icons/flags/am.png
Executable file
|
After Width: | Height: | Size: 497 B |
BIN
src/Icons/flags/an.png
Executable file
|
After Width: | Height: | Size: 488 B |
BIN
src/Icons/flags/ao.png
Normal file
|
After Width: | Height: | Size: 428 B |
BIN
src/Icons/flags/ar.png
Executable file
|
After Width: | Height: | Size: 506 B |
|
Before Width: | Height: | Size: 308 B |
BIN
src/Icons/flags/as.png
Executable file
|
After Width: | Height: | Size: 647 B |
BIN
src/Icons/flags/at.png
Executable file
|
After Width: | Height: | Size: 403 B |
BIN
src/Icons/flags/au.png
Executable file
|
After Width: | Height: | Size: 673 B |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 285 B |
BIN
src/Icons/flags/aw.png
Executable file
|
After Width: | Height: | Size: 524 B |
BIN
src/Icons/flags/ax.png
Executable file
|
After Width: | Height: | Size: 663 B |
BIN
src/Icons/flags/az.png
Executable file
|
After Width: | Height: | Size: 589 B |
BIN
src/Icons/flags/ba.png
Executable file
|
After Width: | Height: | Size: 593 B |
BIN
src/Icons/flags/bb.png
Executable file
|
After Width: | Height: | Size: 585 B |
BIN
src/Icons/flags/bd.png
Executable file
|
After Width: | Height: | Size: 504 B |
BIN
src/Icons/flags/be.png
Executable file
|
After Width: | Height: | Size: 449 B |
|
Before Width: | Height: | Size: 373 B |
|
Before Width: | Height: | Size: 173 B |
BIN
src/Icons/flags/bf.png
Executable file
|
After Width: | Height: | Size: 497 B |
BIN
src/Icons/flags/bg.png
Executable file
|
After Width: | Height: | Size: 462 B |
BIN
src/Icons/flags/bh.png
Executable file
|
After Width: | Height: | Size: 457 B |
BIN
src/Icons/flags/bi.png
Executable file
|
After Width: | Height: | Size: 675 B |
BIN
src/Icons/flags/bj.png
Executable file
|
After Width: | Height: | Size: 486 B |
BIN
src/Icons/flags/bm.png
Executable file
|
After Width: | Height: | Size: 611 B |
BIN
src/Icons/flags/bn.png
Executable file
|
After Width: | Height: | Size: 639 B |
BIN
src/Icons/flags/bo.png
Executable file
|
After Width: | Height: | Size: 500 B |
|
Before Width: | Height: | Size: 583 B |
BIN
src/Icons/flags/br.png
Executable file
|
After Width: | Height: | Size: 593 B |
|
Before Width: | Height: | Size: 799 B |
BIN
src/Icons/flags/bs.png
Executable file
|
After Width: | Height: | Size: 526 B |
BIN
src/Icons/flags/bt.png
Executable file
|
After Width: | Height: | Size: 631 B |
|
Before Width: | Height: | Size: 200 B |
BIN
src/Icons/flags/bv.png
Executable file
|
After Width: | Height: | Size: 512 B |
BIN
src/Icons/flags/bw.png
Executable file
|
After Width: | Height: | Size: 443 B |
BIN
src/Icons/flags/by.png
Executable file
|
After Width: | Height: | Size: 514 B |
BIN
src/Icons/flags/bz.png
Executable file
|
After Width: | Height: | Size: 600 B |
BIN
src/Icons/flags/ca.png
Executable file
|
After Width: | Height: | Size: 628 B |
|
Before Width: | Height: | Size: 686 B |
BIN
src/Icons/flags/cc.png
Executable file
|
After Width: | Height: | Size: 625 B |
BIN
src/Icons/flags/cd.png
Normal file
|
After Width: | Height: | Size: 528 B |
BIN
src/Icons/flags/cf.png
Executable file
|
After Width: | Height: | Size: 614 B |
BIN
src/Icons/flags/cg.png
Executable file
|
After Width: | Height: | Size: 521 B |
BIN
src/Icons/flags/ch.png
Executable file
|
After Width: | Height: | Size: 367 B |
|
Before Width: | Height: | Size: 329 B |
BIN
src/Icons/flags/ci.png
Executable file
|
After Width: | Height: | Size: 453 B |
BIN
src/Icons/flags/ck.png
Executable file
|
After Width: | Height: | Size: 586 B |
BIN
src/Icons/flags/cl.png
Executable file
|
After Width: | Height: | Size: 450 B |
BIN
src/Icons/flags/cm.png
Executable file
|
After Width: | Height: | Size: 525 B |
BIN
src/Icons/flags/cn.png
Executable file
|
After Width: | Height: | Size: 472 B |
BIN
src/Icons/flags/co.png
Executable file
|
After Width: | Height: | Size: 483 B |
|
Before Width: | Height: | Size: 203 B |
BIN
src/Icons/flags/cr.png
Executable file
|
After Width: | Height: | Size: 477 B |
|
Before Width: | Height: | Size: 479 B |
BIN
src/Icons/flags/cs.png
Executable file
|
After Width: | Height: | Size: 423 B |
BIN
src/Icons/flags/cu.png
Executable file
|
After Width: | Height: | Size: 563 B |
BIN
src/Icons/flags/cv.png
Executable file
|
After Width: | Height: | Size: 529 B |
BIN
src/Icons/flags/cx.png
Executable file
|
After Width: | Height: | Size: 608 B |
BIN
src/Icons/flags/cy.png
Executable file
|
After Width: | Height: | Size: 428 B |
BIN
src/Icons/flags/cz.png
Executable file
|
After Width: | Height: | Size: 476 B |
|
Before Width: | Height: | Size: 455 B |
BIN
src/Icons/flags/de.png
Executable file
|
After Width: | Height: | Size: 545 B |
|
Before Width: | Height: | Size: 270 B |
BIN
src/Icons/flags/dj.png
Executable file
|
After Width: | Height: | Size: 572 B |
BIN
src/Icons/flags/dk.png
Executable file
|
After Width: | Height: | Size: 495 B |
BIN
src/Icons/flags/dm.png
Executable file
|
After Width: | Height: | Size: 620 B |
BIN
src/Icons/flags/do.png
Executable file
|
After Width: | Height: | Size: 508 B |
BIN
src/Icons/flags/dz.png
Executable file
|
After Width: | Height: | Size: 582 B |
BIN
src/Icons/flags/ec.png
Executable file
|
After Width: | Height: | Size: 500 B |
BIN
src/Icons/flags/ee.png
Executable file
|
After Width: | Height: | Size: 429 B |
BIN
src/Icons/flags/eg.png
Executable file
|
After Width: | Height: | Size: 465 B |
|
Before Width: | Height: | Size: 314 B |
BIN
src/Icons/flags/eh.png
Executable file
|
After Width: | Height: | Size: 508 B |
BIN
src/Icons/flags/er.png
Executable file
|
After Width: | Height: | Size: 653 B |
BIN
src/Icons/flags/es.png
Executable file
|
After Width: | Height: | Size: 469 B |
BIN
src/Icons/flags/et.png
Executable file
|
After Width: | Height: | Size: 592 B |